PageSourceSearch

https://www.meru-projekt.de/typo3temp/assets/compressed/main.conca…fb5129cfe7341291ddfd2ed73250e.js?1790947209

js meru-projekt.de collected 2026-10-08 07:26:42 UTC 775,859 bytes, 22,833 lines download raw bytes

vendor: 4,203 bytes, lines 1-137
1/*!
2 * jQuery JavaScript Library v3.5.1
3 * https://jquery.com/
4 *
5 * Includes Sizzle.js
6 * https://sizzlejs.com/
7 *
8 * Copyright JS Foundation and other contributors
9 * Released under the MIT license
10 * https://jquery.org/license
11 *
12 * Date: 2020-05-04T22:49Z
13 */
14( function( global, factory ) {
15
16    "use strict";
17
18    if ( typeof module === "object" && typeof module.exports === "object" ) {
19
20        // For CommonJS and CommonJS-like environments where a proper `window`
21        // is present, execute the factory and get jQuery.
22        // For environments that do not have a `window` with a `document`
23        // (such as Node.js), expose a factory as module.exports.
24        // This accentuates the need for the creation of a real `window`.
25        // e.g. var jQuery = require("jquery")(window);
26        // See ticket #14549 for more info.
27        module.exports = global.document ?
28            factory( global, true ) :
29            function( w ) {
30                if ( !w.document ) {
31                    throw new Error( "jQuery requires a window with a document" );
32                }
33                return factory( w );
34            };
35    } else {
36        factory( global );
37    }
38
39// Pass this if window is not defined yet
40} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
41
42// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
43// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
44// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
45// enough that all such attempts are guarded in a try block.
46    "use strict";
47
48    var arr = [];
49
50    var getProto = Object.getPrototypeOf;
51
52    var slice = arr.slice;
53
54    var flat = arr.flat ? function( array ) {
55        return arr.flat.call( array );
56    } : function( array ) {
57        return arr.concat.apply( [], array );
58    };
59
60
61    var push = arr.push;
62
63    var indexOf = arr.indexOf;
64
65    var class2type = {};
66
67    var toString = class2type.toString;
68
69    var hasOwn = class2type.hasOwnProperty;
70
71    var fnToString = hasOwn.toString;
72
73    var ObjectFunctionString = fnToString.call( Object );
74
75    var support = {};
76
77    var isFunction = function isFunction( obj ) {
78
79        // Support: Chrome <=57, Firefox <=52
80        // In some browsers, typeof returns "function" for HTML <object> elements
81        // (i.e., `typeof document.createElement( "object" ) === "function"`).
82        // We don't want to classify *any* DOM node as a function.
83        return typeof obj === "function" && typeof obj.nodeType !== "number";
84    };
85
86
87    var isWindow = function isWindow( obj ) {
88        return obj != null && obj === obj.window;
89    };
90
91
92    var document = window.document;
93
94
95
96    var preservedScriptAttributes = {
97        type: true,
98        src: true,
99        nonce: true,
100        noModule: true
101    };
102
103    function DOMEval( code, node, doc ) {
104        doc = doc || document;
105
106        var i, val,
107            script = doc.createElement( "script" );
108
109        script.text = code;
110        if ( node ) {
111            for ( i in preservedScriptAttributes ) {
112
113                // Support: Firefox 64+, Edge 18+
114                // Some browsers don't support the "nonce" property on scripts.
115                // On the other hand, just using `getAttribute` is not enough as
116                // the `nonce` attribute is reset to an empty string whenever it
117                // becomes browsing-context connected.
118                // See https://github.com/whatwg/html/issues/2369
119                // See https://html.spec.whatwg.org/#nonce-attributes
120                // The `node.getAttribute` check was added for the sake of
121                // `jQuery.globalEval` so that it can fake a nonce-containing node
122                // via an object.
123                val = node[ i ] || node.getAttribute && node.getAttribute( i );
124                if ( val ) {
125                    script.setAttribute( i, val );
126                }
127            }
128        }
129        doc.head.appendChild( script ).parentNode.removeChild( script );
130    }
131
132
133    function toType( obj ) {
134        if ( obj == null ) {
135            return obj + "";
136        }
137
vendor: 4,621 bytes, lines 138-290
138        // Support: Android <=2.3 only (functionish RegExp)
139        return typeof obj === "object" || typeof obj === "function" ?
140            class2type[ toString.call( obj ) ] || "object" :
141            typeof obj;
142    }
143    /* global Symbol */
144// Defining this global in .eslintrc.json would create a danger of using the global
145// unguarded in another place, it seems safer to define global only for this module
146
147
148
149    var
150        version = "3.5.1",
151
152        // Define a local copy of jQuery
153        jQuery = function( selector, context ) {
154
155            // The jQuery object is actually just the init constructor 'enhanced'
156            // Need init if jQuery is called (just allow error to be thrown if not included)
157            return new jQuery.fn.init( selector, context );
158        };
159
160    jQuery.fn = jQuery.prototype = {
161
162        // The current version of jQuery being used
163        jquery: version,
164
165        constructor: jQuery,
166
167        // The default length of a jQuery object is 0
168        length: 0,
169
170        toArray: function() {
171            return slice.call( this );
172        },
173
174        // Get the Nth element in the matched element set OR
175        // Get the whole matched element set as a clean array
176        get: function( num ) {
177
178            // Return all the elements in a clean array
179            if ( num == null ) {
180                return slice.call( this );
181            }
182
183            // Return just the one element from the set
184            return num < 0 ? this[ num + this.length ] : this[ num ];
185        },
186
187        // Take an array of elements and push it onto the stack
188        // (returning the new matched element set)
189        pushStack: function( elems ) {
190
191            // Build a new jQuery matched element set
192            var ret = jQuery.merge( this.constructor(), elems );
193
194            // Add the old object onto the stack (as a reference)
195            ret.prevObject = this;
196
197            // Return the newly-formed element set
198            return ret;
199        },
200
201        // Execute a callback for every element in the matched set.
202        each: function( callback ) {
203            return jQuery.each( this, callback );
204        },
205
206        map: function( callback ) {
207            return this.pushStack( jQuery.map( this, function( elem, i ) {
208                return callback.call( elem, i, elem );
209            } ) );
210        },
211
212        slice: function() {
213            return this.pushStack( slice.apply( this, arguments ) );
214        },
215
216        first: function() {
217            return this.eq( 0 );
218        },
219
220        last: function() {
221            return this.eq( -1 );
222        },
223
224        even: function() {
225            return this.pushStack( jQuery.grep( this, function( _elem, i ) {
226                return ( i + 1 ) % 2;
227            } ) );
228        },
229
230        odd: function() {
231            return this.pushStack( jQuery.grep( this, function( _elem, i ) {
232                return i % 2;
233            } ) );
234        },
235
236        eq: function( i ) {
237            var len = this.length,
238                j = +i + ( i < 0 ? len : 0 );
239            return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
240        },
241
242        end: function() {
243            return this.prevObject || this.constructor();
244        },
245
246        // For internal use only.
247        // Behaves like an Array's method, not like a jQuery method.
248        push: push,
249        sort: arr.sort,
250        splice: arr.splice
251    };
252
253    jQuery.extend = jQuery.fn.extend = function() {
254        var options, name, src, copy, copyIsArray, clone,
255            target = arguments[ 0 ] || {},
256            i = 1,
257            length = arguments.length,
258            deep = false;
259
260        // Handle a deep copy situation
261        if ( typeof target === "boolean" ) {
262            deep = target;
263
264            // Skip the boolean and the target
265            target = arguments[ i ] || {};
266            i++;
267        }
268
269        // Handle case when target is a string or something (possible in deep copy)
270        if ( typeof target !== "object" && !isFunction( target ) ) {
271            target = {};
272        }
273
274        // Extend jQuery itself if only one argument is passed
275        if ( i === length ) {
276            target = this;
277            i--;
278        }
279
280        for ( ; i < length; i++ ) {
281
282            // Only deal with non-null/undefined values
283            if ( ( options = arguments[ i ] ) != null ) {
284
285                // Extend the base object
286                for ( name in options ) {
287                    copy = options[ name ];
288
289                    // Prevent Object.prototype pollution
290                    // Prevent never-ending loop
vendor: 5,588 bytes, lines 291-465
291                    if ( name === "__proto__" || target === copy ) {
292                        continue;
293                    }
294
295                    // Recurse if we're merging plain objects or arrays
296                    if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
297                        ( copyIsArray = Array.isArray( copy ) ) ) ) {
298                        src = target[ name ];
299
300                        // Ensure proper type for the source value
301                        if ( copyIsArray && !Array.isArray( src ) ) {
302                            clone = [];
303                        } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
304                            clone = {};
305                        } else {
306                            clone = src;
307                        }
308                        copyIsArray = false;
309
310                        // Never move original objects, clone them
311                        target[ name ] = jQuery.extend( deep, clone, copy );
312
313                        // Don't bring in undefined values
314                    } else if ( copy !== undefined ) {
315                        target[ name ] = copy;
316                    }
317                }
318            }
319        }
320
321        // Return the modified object
322        return target;
323    };
324
325    jQuery.extend( {
326
327        // Unique for each copy of jQuery on the page
328        expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
329
330        // Assume jQuery is ready without the ready module
331        isReady: true,
332
333        error: function( msg ) {
334            throw new Error( msg );
335        },
336
337        noop: function() {},
338
339        isPlainObject: function( obj ) {
340            var proto, Ctor;
341
342            // Detect obvious negatives
343            // Use toString instead of jQuery.type to catch host objects
344            if ( !obj || toString.call( obj ) !== "[object Object]" ) {
345                return false;
346            }
347
348            proto = getProto( obj );
349
350            // Objects with no prototype (e.g., `Object.create( null )`) are plain
351            if ( !proto ) {
352                return true;
353            }
354
355            // Objects with prototype are plain iff they were constructed by a global Object function
356            Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
357            return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
358        },
359
360        isEmptyObject: function( obj ) {
361            var name;
362
363            for ( name in obj ) {
364                return false;
365            }
366            return true;
367        },
368
369        // Evaluates a script in a provided context; falls back to the global one
370        // if not specified.
371        globalEval: function( code, options, doc ) {
372            DOMEval( code, { nonce: options && options.nonce }, doc );
373        },
374
375        each: function( obj, callback ) {
376            var length, i = 0;
377
378            if ( isArrayLike( obj ) ) {
379                length = obj.length;
380                for ( ; i < length; i++ ) {
381                    if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
382                        break;
383                    }
384                }
385            } else {
386                for ( i in obj ) {
387                    if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
388                        break;
389                    }
390                }
391            }
392
393            return obj;
394        },
395
396        // results is for internal usage only
397        makeArray: function( arr, results ) {
398            var ret = results || [];
399
400            if ( arr != null ) {
401                if ( isArrayLike( Object( arr ) ) ) {
402                    jQuery.merge( ret,
403                        typeof arr === "string" ?
404                            [ arr ] : arr
405                    );
406                } else {
407                    push.call( ret, arr );
408                }
409            }
410
411            return ret;
412        },
413
414        inArray: function( elem, arr, i ) {
415            return arr == null ? -1 : indexOf.call( arr, elem, i );
416        },
417
418        // Support: Android <=4.0 only, PhantomJS 1 only
419        // push.apply(_, arraylike) throws on ancient WebKit
420        merge: function( first, second ) {
421            var len = +second.length,
422                j = 0,
423                i = first.length;
424
425            for ( ; j < len; j++ ) {
426                first[ i++ ] = second[ j ];
427            }
428
429            first.length = i;
430
431            return first;
432        },
433
434        grep: function( elems, callback, invert ) {
435            var callbackInverse,
436                matches = [],
437                i = 0,
438                length = elems.length,
439                callbackExpect = !invert;
440
441            // Go through the array, only saving the items
442            // that pass the validator function
443            for ( ; i < length; i++ ) {
444                callbackInverse = !callback( elems[ i ], i );
445                if ( callbackInverse !== callbackExpect ) {
446                    matches.push( elems[ i ] );
447                }
448            }
449
450            return matches;
451        },
452
453        // arg is for internal usage only
454        map: function( elems, callback, arg ) {
455            var length, value,
456                i = 0,
457                ret = [];
458
459            // Go through the array, translating each of the items to their new values
460            if ( isArrayLike( elems ) ) {
461                length = elems.length;
462                for ( ; i < length; i++ ) {
463                    value = callback( elems[ i ], i, arg );
464
465                    if ( value != null ) {
vendor: 20,078 bytes, lines 466-938
466                        ret.push( value );
467                    }
468                }
469
470                // Go through every key on the object,
471            } else {
472                for ( i in elems ) {
473                    value = callback( elems[ i ], i, arg );
474
475                    if ( value != null ) {
476                        ret.push( value );
477                    }
478                }
479            }
480
481            // Flatten any nested arrays
482            return flat( ret );
483        },
484
485        // A global GUID counter for objects
486        guid: 1,
487
488        // jQuery.support is not used in Core but other projects attach their
489        // properties to it so it needs to exist.
490        support: support
491    } );
492
493    if ( typeof Symbol === "function" ) {
494        jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
495    }
496
497// Populate the class2type map
498    jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
499        function( _i, name ) {
500            class2type[ "[object " + name + "]" ] = name.toLowerCase();
501        } );
502
503    function isArrayLike( obj ) {
504
505        // Support: real iOS 8.2 only (not reproducible in simulator)
506        // `in` check used to prevent JIT error (gh-2145)
507        // hasOwn isn't used here due to false negatives
508        // regarding Nodelist length in IE
509        var length = !!obj && "length" in obj && obj.length,
510            type = toType( obj );
511
512        if ( isFunction( obj ) || isWindow( obj ) ) {
513            return false;
514        }
515
516        return type === "array" || length === 0 ||
517            typeof length === "number" && length > 0 && ( length - 1 ) in obj;
518    }
519    var Sizzle =
520        /*!
521 * Sizzle CSS Selector Engine v2.3.5
522 * https://sizzlejs.com/
523 *
524 * Copyright JS Foundation and other contributors
525 * Released under the MIT license
526 * https://js.foundation/
527 *
528 * Date: 2020-03-14
529 */
530        ( function( window ) {
531            var i,
532                support,
533                Expr,
534                getText,
535                isXML,
536                tokenize,
537                compile,
538                select,
539                outermostContext,
540                sortInput,
541                hasDuplicate,
542
543                // Local document vars
544                setDocument,
545                document,
546                docElem,
547                documentIsHTML,
548                rbuggyQSA,
549                rbuggyMatches,
550                matches,
551                contains,
552
553                // Instance-specific data
554                expando = "sizzle" + 1 * new Date(),
555                preferredDoc = window.document,
556                dirruns = 0,
557                done = 0,
558                classCache = createCache(),
559                tokenCache = createCache(),
560                compilerCache = createCache(),
561                nonnativeSelectorCache = createCache(),
562                sortOrder = function( a, b ) {
563                    if ( a === b ) {
564                        hasDuplicate = true;
565                    }
566                    return 0;
567                },
568
569                // Instance methods
570                hasOwn = ( {} ).hasOwnProperty,
571                arr = [],
572                pop = arr.pop,
573                pushNative = arr.push,
574                push = arr.push,
575                slice = arr.slice,
576
577                // Use a stripped-down indexOf as it's faster than native
578                // https://jsperf.com/thor-indexof-vs-for/5
579                indexOf = function( list, elem ) {
580                    var i = 0,
581                        len = list.length;
582                    for ( ; i < len; i++ ) {
583                        if ( list[ i ] === elem ) {
584                            return i;
585                        }
586                    }
587                    return -1;
588                },
589
590                booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
591                    "ismap|loop|multiple|open|readonly|required|scoped",
592
593                // Regular expressions
594
595                // http://www.w3.org/TR/css3-selectors/#whitespace
596                whitespace = "[\\x20\\t\\r\\n\\f]",
597
598                // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
599                identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
600                    "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
601
602                // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
603                attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
604
605                    // Operator (capture 2)
606                    "*([*^$|!~]?=)" + whitespace +
607
608                    // "Attribute values must be CSS identifiers [capture 5]
609                    // or strings [capture 3 or capture 4]"
610                    "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
611                    whitespace + "*\\]",
612
613                pseudos = ":(" + identifier + ")(?:\\((" +
614
615                    // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
616                    // 1. quoted (capture 3; capture 4 or capture 5)
617                    "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
618
619                    // 2. simple (capture 6)
620                    "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
621
622                    // 3. anything else (capture 2)
623                    ".*" +
624                    ")\\)|)",
625
626                // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
627                rwhitespace = new RegExp( whitespace + "+", "g" ),
628                rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
629                    whitespace + "+$", "g" ),
630
631                rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
632                rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
633                    "*" ),
634                rdescend = new RegExp( whitespace + "|>" ),
635
636                rpseudo = new RegExp( pseudos ),
637                ridentifier = new RegExp( "^" + identifier + "$" ),
638
639                matchExpr = {
640                    "ID": new RegExp( "^#(" + identifier + ")" ),
641                    "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
642                    "TAG": new RegExp( "^(" + identifier + "|[*])" ),
643                    "ATTR": new RegExp( "^" + attributes ),
644                    "PSEUDO": new RegExp( "^" + pseudos ),
645                    "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
646                        whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
647                        whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
648                    "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
649
650                    // For use in libraries implementing .is()
651                    // We use this for POS matching in `select`
652                    "needsContext": new RegExp( "^" + whitespace +
653                        "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
654                        "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
655                },
656
657                rhtml = /HTML$/i,
658                rinputs = /^(?:input|select|textarea|button)$/i,
659                rheader = /^h\d$/i,
660
661                rnative = /^[^{]+\{\s*\[native \w/,
662
663                // Easily-parseable/retrievable ID or TAG or CLASS selectors
664                rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
665
666                rsibling = /[+~]/,
667
668                // CSS escapes
669                // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
670                runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
671                funescape = function( escape, nonHex ) {
672                    var high = "0x" + escape.slice( 1 ) - 0x10000;
673
674                    return nonHex ?
675
676                        // Strip the backslash prefix from a non-hex escape sequence
677                        nonHex :
678
679                        // Replace a hexadecimal escape sequence with the encoded Unicode code point
680                        // Support: IE <=11+
681                        // For values outside the Basic Multilingual Plane (BMP), manually construct a
682                        // surrogate pair
683                        high < 0 ?
684                            String.fromCharCode( high + 0x10000 ) :
685                            String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
686                },
687
688                // CSS string/identifier serialization
689                // https://drafts.csswg.org/cssom/#common-serializing-idioms
690                rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
691                fcssescape = function( ch, asCodePoint ) {
692                    if ( asCodePoint ) {
693
694                        // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
695                        if ( ch === "\0" ) {
696                            return "\uFFFD";
697                        }
698
699                        // Control characters and (dependent upon position) numbers get escaped as code points
700                        return ch.slice( 0, -1 ) + "\\" +
701                            ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
702                    }
703
704                    // Other potentially-special ASCII characters get backslash-escaped
705                    return "\\" + ch;
706                },
707
708                // Used for iframes
709                // See setDocument()
710                // Removing the function wrapper causes a "Permission Denied"
711                // error in IE
712                unloadHandler = function() {
713                    setDocument();
714                },
715
716                inDisabledFieldset = addCombinator(
717                    function( elem ) {
718                        return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
719                    },
720                    { dir: "parentNode", next: "legend" }
721                );
722
723// Optimize for push.apply( _, NodeList )
724            try {
725                push.apply(
726                    ( arr = slice.call( preferredDoc.childNodes ) ),
727                    preferredDoc.childNodes
728                );
729
730                // Support: Android<4.0
731                // Detect silently failing push.apply
732                // eslint-disable-next-line no-unused-expressions
733                arr[ preferredDoc.childNodes.length ].nodeType;
734            } catch ( e ) {
735                push = { apply: arr.length ?
736
737                        // Leverage slice if possible
738                        function( target, els ) {
739                            pushNative.apply( target, slice.call( els ) );
740                        } :
741
742                        // Support: IE<9
743                        // Otherwise append directly
744                        function( target, els ) {
745                            var j = target.length,
746                                i = 0;
747
748                            // Can't trust NodeList.length
749                            while ( ( target[ j++ ] = els[ i++ ] ) ) {}
750                            target.length = j - 1;
751                        }
752                };
753            }
754
755            function Sizzle( selector, context, results, seed ) {
756                var m, i, elem, nid, match, groups, newSelector,
757                    newContext = context && context.ownerDocument,
758
759                    // nodeType defaults to 9, since context defaults to document
760                    nodeType = context ? context.nodeType : 9;
761
762                results = results || [];
763
764                // Return early from calls with invalid selector or context
765                if ( typeof selector !== "string" || !selector ||
766                    nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
767
768                    return results;
769                }
770
771                // Try to shortcut find operations (as opposed to filters) in HTML documents
772                if ( !seed ) {
773                    setDocument( context );
774                    context = context || document;
775
776                    if ( documentIsHTML ) {
777
778                        // If the selector is sufficiently simple, try using a "get*By*" DOM method
779                        // (excepting DocumentFragment context, where the methods don't exist)
780                        if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
781
782                            // ID selector
783                            if ( ( m = match[ 1 ] ) ) {
784
785                                // Document context
786                                if ( nodeType === 9 ) {
787                                    if ( ( elem = context.getElementById( m ) ) ) {
788
789                                        // Support: IE, Opera, Webkit
790                                        // TODO: identify versions
791                                        // getElementById can match elements by name instead of ID
792                                        if ( elem.id === m ) {
793                                            results.push( elem );
794                                            return results;
795                                        }
796                                    } else {
797                                        return results;
798                                    }
799
800                                    // Element context
801                                } else {
802
803                                    // Support: IE, Opera, Webkit
804                                    // TODO: identify versions
805                                    // getElementById can match elements by name instead of ID
806                                    if ( newContext && ( elem = newContext.getElementById( m ) ) &&
807                                        contains( context, elem ) &&
808                                        elem.id === m ) {
809
810                                        results.push( elem );
811                                        return results;
812                                    }
813                                }
814
815                                // Type selector
816                            } else if ( match[ 2 ] ) {
817                                push.apply( results, context.getElementsByTagName( selector ) );
818                                return results;
819
820                                // Class selector
821                            } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
822                                context.getElementsByClassName ) {
823
824                                push.apply( results, context.getElementsByClassName( m ) );
825                                return results;
826                            }
827                        }
828
829                        // Take advantage of querySelectorAll
830                        if ( support.qsa &&
831                            !nonnativeSelectorCache[ selector + " " ] &&
832                            ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
833
834                            // Support: IE 8 only
835                            // Exclude object elements
836                            ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
837
838                            newSelector = selector;
839                            newContext = context;
840
841                            // qSA considers elements outside a scoping root when evaluating child or
842                            // descendant combinators, which is not what we want.
843                            // In such cases, we work around the behavior by prefixing every selector in the
844                            // list with an ID selector referencing the scope context.
845                            // The technique has to be used as well when a leading combinator is used
846                            // as such selectors are not recognized by querySelectorAll.
847                            // Thanks to Andrew Dupont for this technique.
848                            if ( nodeType === 1 &&
849                                ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
850
851                                // Expand context for sibling selectors
852                                newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
853                                    context;
854
855                                // We can use :scope instead of the ID hack if the browser
856                                // supports it & if we're not changing the context.
857                                if ( newContext !== context || !support.scope ) {
858
859                                    // Capture the context ID, setting it first if necessary
860                                    if ( ( nid = context.getAttribute( "id" ) ) ) {
861                                        nid = nid.replace( rcssescape, fcssescape );
862                                    } else {
863                                        context.setAttribute( "id", ( nid = expando ) );
864                                    }
865                                }
866
867                                // Prefix every selector in the list
868                                groups = tokenize( selector );
869                                i = groups.length;
870                                while ( i-- ) {
871                                    groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
872                                        toSelector( groups[ i ] );
873                                }
874                                newSelector = groups.join( "," );
875                            }
876
877                            try {
878                                push.apply( results,
879                                    newContext.querySelectorAll( newSelector )
880                                );
881                                return results;
882                            } catch ( qsaError ) {
883                                nonnativeSelectorCache( selector, true );
884                            } finally {
885                                if ( nid === expando ) {
886                                    context.removeAttribute( "id" );
887                                }
888                            }
889                        }
890                    }
891                }
892
893                // All others
894                return select( selector.replace( rtrim, "$1" ), context, results, seed );
895            }
896
897            /**
898             * Create key-value caches of limited size
899             * @returns {function(string, object)} Returns the Object data after storing it on itself with
900             *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
901             *	deleting the oldest entry
902             */
903            function createCache() {
904                var keys = [];
905
906                function cache( key, value ) {
907
908                    // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
909                    if ( keys.push( key + " " ) > Expr.cacheLength ) {
910
911                        // Only keep the most recent entries
912                        delete cache[ keys.shift() ];
913                    }
914                    return ( cache[ key + " " ] = value );
915                }
916                return cache;
917            }
918
919            /**
920             * Mark a function for special use by Sizzle
921             * @param {Function} fn The function to mark
922             */
923            function markFunction( fn ) {
924                fn[ expando ] = true;
925                return fn;
926            }
927
928            /**
929             * Support testing using an element
930             * @param {Function} fn Passed the created element and returns a boolean result
931             */
932            function assert( fn ) {
933                var el = document.createElement( "fieldset" );
934
935                try {
936                    return !!fn( el );
937                } catch ( e ) {
938                    return false;
vendor: 4,414 bytes, lines 939-1046
939                } finally {
940
941                    // Remove from its parent by default
942                    if ( el.parentNode ) {
943                        el.parentNode.removeChild( el );
944                    }
945
946                    // release memory in IE
947                    el = null;
948                }
949            }
950
951            /**
952             * Adds the same handler for all of the specified attrs
953             * @param {String} attrs Pipe-separated list of attributes
954             * @param {Function} handler The method that will be applied
955             */
956            function addHandle( attrs, handler ) {
957                var arr = attrs.split( "|" ),
958                    i = arr.length;
959
960                while ( i-- ) {
961                    Expr.attrHandle[ arr[ i ] ] = handler;
962                }
963            }
964
965            /**
966             * Checks document order of two siblings
967             * @param {Element} a
968             * @param {Element} b
969             * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
970             */
971            function siblingCheck( a, b ) {
972                var cur = b && a,
973                    diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
974                        a.sourceIndex - b.sourceIndex;
975
976                // Use IE sourceIndex if available on both nodes
977                if ( diff ) {
978                    return diff;
979                }
980
981                // Check if b follows a
982                if ( cur ) {
983                    while ( ( cur = cur.nextSibling ) ) {
984                        if ( cur === b ) {
985                            return -1;
986                        }
987                    }
988                }
989
990                return a ? 1 : -1;
991            }
992
993            /**
994             * Returns a function to use in pseudos for input types
995             * @param {String} type
996             */
997            function createInputPseudo( type ) {
998                return function( elem ) {
999                    var name = elem.nodeName.toLowerCase();
1000                    return name === "input" && elem.type === type;
1001                };
1002            }
1003
1004            /**
1005             * Returns a function to use in pseudos for buttons
1006             * @param {String} type
1007             */
1008            function createButtonPseudo( type ) {
1009                return function( elem ) {
1010                    var name = elem.nodeName.toLowerCase();
1011                    return ( name === "input" || name === "button" ) && elem.type === type;
1012                };
1013            }
1014
1015            /**
1016             * Returns a function to use in pseudos for :enabled/:disabled
1017             * @param {Boolean} disabled true for :disabled; false for :enabled
1018             */
1019            function createDisabledPseudo( disabled ) {
1020
1021                // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1022                return function( elem ) {
1023
1024                    // Only certain elements can match :enabled or :disabled
1025                    // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1026                    // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1027                    if ( "form" in elem ) {
1028
1029                        // Check for inherited disabledness on relevant non-disabled elements:
1030                        // * listed form-associated elements in a disabled fieldset
1031                        //   https://html.spec.whatwg.org/multipage/forms.html#category-listed
1032                        //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1033                        // * option elements in a disabled optgroup
1034                        //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1035                        // All such elements have a "form" property.
1036                        if ( elem.parentNode && elem.disabled === false ) {
1037
1038                            // Option elements defer to a parent optgroup if present
1039                            if ( "label" in elem ) {
1040                                if ( "label" in elem.parentNode ) {
1041                                    return elem.parentNode.disabled === disabled;
1042                                } else {
1043                                    return elem.disabled === disabled;
1044                                }
1045                            }
1046
vendor: 32,601 bytes, lines 1047-1747
1047                            // Support: IE 6 - 11
1048                            // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1049                            return elem.isDisabled === disabled ||
1050
1051                                // Where there is no isDisabled, check manually
1052                                /* jshint -W018 */
1053                                elem.isDisabled !== !disabled &&
1054                                inDisabledFieldset( elem ) === disabled;
1055                        }
1056
1057                        return elem.disabled === disabled;
1058
1059                        // Try to winnow out elements that can't be disabled before trusting the disabled property.
1060                        // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1061                        // even exist on them, let alone have a boolean value.
1062                    } else if ( "label" in elem ) {
1063                        return elem.disabled === disabled;
1064                    }
1065
1066                    // Remaining elements are neither :enabled nor :disabled
1067                    return false;
1068                };
1069            }
1070
1071            /**
1072             * Returns a function to use in pseudos for positionals
1073             * @param {Function} fn
1074             */
1075            function createPositionalPseudo( fn ) {
1076                return markFunction( function( argument ) {
1077                    argument = +argument;
1078                    return markFunction( function( seed, matches ) {
1079                        var j,
1080                            matchIndexes = fn( [], seed.length, argument ),
1081                            i = matchIndexes.length;
1082
1083                        // Match elements found at the specified indexes
1084                        while ( i-- ) {
1085                            if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1086                                seed[ j ] = !( matches[ j ] = seed[ j ] );
1087                            }
1088                        }
1089                    } );
1090                } );
1091            }
1092
1093            /**
1094             * Checks a node for validity as a Sizzle context
1095             * @param {Element|Object=} context
1096             * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1097             */
1098            function testContext( context ) {
1099                return context && typeof context.getElementsByTagName !== "undefined" && context;
1100            }
1101
1102// Expose support vars for convenience
1103            support = Sizzle.support = {};
1104
1105            /**
1106             * Detects XML nodes
1107             * @param {Element|Object} elem An element or a document
1108             * @returns {Boolean} True iff elem is a non-HTML XML node
1109             */
1110            isXML = Sizzle.isXML = function( elem ) {
1111                var namespace = elem.namespaceURI,
1112                    docElem = ( elem.ownerDocument || elem ).documentElement;
1113
1114                // Support: IE <=8
1115                // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1116                // https://bugs.jquery.com/ticket/4833
1117                return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1118            };
1119
1120            /**
1121             * Sets document-related variables once based on the current document
1122             * @param {Element|Object} [doc] An element or document object to use to set the document
1123             * @returns {Object} Returns the current document
1124             */
1125            setDocument = Sizzle.setDocument = function( node ) {
1126                var hasCompare, subWindow,
1127                    doc = node ? node.ownerDocument || node : preferredDoc;
1128
1129                // Return early if doc is invalid or already selected
1130                // Support: IE 11+, Edge 17 - 18+
1131                // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1132                // two documents; shallow comparisons work.
1133                // eslint-disable-next-line eqeqeq
1134                if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1135                    return document;
1136                }
1137
1138                // Update global variables
1139                document = doc;
1140                docElem = document.documentElement;
1141                documentIsHTML = !isXML( document );
1142
1143                // Support: IE 9 - 11+, Edge 12 - 18+
1144                // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1145                // Support: IE 11+, Edge 17 - 18+
1146                // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1147                // two documents; shallow comparisons work.
1148                // eslint-disable-next-line eqeqeq
1149                if ( preferredDoc != document &&
1150                    ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1151
1152                    // Support: IE 11, Edge
1153                    if ( subWindow.addEventListener ) {
1154                        subWindow.addEventListener( "unload", unloadHandler, false );
1155
1156                        // Support: IE 9 - 10 only
1157                    } else if ( subWindow.attachEvent ) {
1158                        subWindow.attachEvent( "onunload", unloadHandler );
1159                    }
1160                }
1161
1162                // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
1163                // Safari 4 - 5 only, Opera <=11.6 - 12.x only
1164                // IE/Edge & older browsers don't support the :scope pseudo-class.
1165                // Support: Safari 6.0 only
1166                // Safari 6.0 supports :scope but it's an alias of :root there.
1167                support.scope = assert( function( el ) {
1168                    docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
1169                    return typeof el.querySelectorAll !== "undefined" &&
1170                        !el.querySelectorAll( ":scope fieldset div" ).length;
1171                } );
1172
1173                /* Attributes
1174	---------------------------------------------------------------------- */
1175
1176                // Support: IE<8
1177                // Verify that getAttribute really returns attributes and not properties
1178                // (excepting IE8 booleans)
1179                support.attributes = assert( function( el ) {
1180                    el.className = "i";
1181                    return !el.getAttribute( "className" );
1182                } );
1183
1184                /* getElement(s)By*
1185	---------------------------------------------------------------------- */
1186
1187                // Check if getElementsByTagName("*") returns only elements
1188                support.getElementsByTagName = assert( function( el ) {
1189                    el.appendChild( document.createComment( "" ) );
1190                    return !el.getElementsByTagName( "*" ).length;
1191                } );
1192
1193                // Support: IE<9
1194                support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1195
1196                // Support: IE<10
1197                // Check if getElementById returns elements by name
1198                // The broken getElementById methods don't pick up programmatically-set names,
1199                // so use a roundabout getElementsByName test
1200                support.getById = assert( function( el ) {
1201                    docElem.appendChild( el ).id = expando;
1202                    return !document.getElementsByName || !document.getElementsByName( expando ).length;
1203                } );
1204
1205                // ID filter and find
1206                if ( support.getById ) {
1207                    Expr.filter[ "ID" ] = function( id ) {
1208                        var attrId = id.replace( runescape, funescape );
1209                        return function( elem ) {
1210                            return elem.getAttribute( "id" ) === attrId;
1211                        };
1212                    };
1213                    Expr.find[ "ID" ] = function( id, context ) {
1214                        if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1215                            var elem = context.getElementById( id );
1216                            return elem ? [ elem ] : [];
1217                        }
1218                    };
1219                } else {
1220                    Expr.filter[ "ID" ] =  function( id ) {
1221                        var attrId = id.replace( runescape, funescape );
1222                        return function( elem ) {
1223                            var node = typeof elem.getAttributeNode !== "undefined" &&
1224                                elem.getAttributeNode( "id" );
1225                            return node && node.value === attrId;
1226                        };
1227                    };
1228
1229                    // Support: IE 6 - 7 only
1230                    // getElementById is not reliable as a find shortcut
1231                    Expr.find[ "ID" ] = function( id, context ) {
1232                        if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1233                            var node, i, elems,
1234                                elem = context.getElementById( id );
1235
1236                            if ( elem ) {
1237
1238                                // Verify the id attribute
1239                                node = elem.getAttributeNode( "id" );
1240                                if ( node && node.value === id ) {
1241                                    return [ elem ];
1242                                }
1243
1244                                // Fall back on getElementsByName
1245                                elems = context.getElementsByName( id );
1246                                i = 0;
1247                                while ( ( elem = elems[ i++ ] ) ) {
1248                                    node = elem.getAttributeNode( "id" );
1249                                    if ( node && node.value === id ) {
1250                                        return [ elem ];
1251                                    }
1252                                }
1253                            }
1254
1255                            return [];
1256                        }
1257                    };
1258                }
1259
1260                // Tag
1261                Expr.find[ "TAG" ] = support.getElementsByTagName ?
1262                    function( tag, context ) {
1263                        if ( typeof context.getElementsByTagName !== "undefined" ) {
1264                            return context.getElementsByTagName( tag );
1265
1266                            // DocumentFragment nodes don't have gEBTN
1267                        } else if ( support.qsa ) {
1268                            return context.querySelectorAll( tag );
1269                        }
1270                    } :
1271
1272                    function( tag, context ) {
1273                        var elem,
1274                            tmp = [],
1275                            i = 0,
1276
1277                            // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1278                            results = context.getElementsByTagName( tag );
1279
1280                        // Filter out possible comments
1281                        if ( tag === "*" ) {
1282                            while ( ( elem = results[ i++ ] ) ) {
1283                                if ( elem.nodeType === 1 ) {
1284                                    tmp.push( elem );
1285                                }
1286                            }
1287
1288                            return tmp;
1289                        }
1290                        return results;
1291                    };
1292
1293                // Class
1294                Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
1295                    if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1296                        return context.getElementsByClassName( className );
1297                    }
1298                };
1299
1300                /* QSA/matchesSelector
1301	---------------------------------------------------------------------- */
1302
1303                // QSA and matchesSelector support
1304
1305                // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1306                rbuggyMatches = [];
1307
1308                // qSa(:focus) reports false when true (Chrome 21)
1309                // We allow this because of a bug in IE8/9 that throws an error
1310                // whenever `document.activeElement` is accessed on an iframe
1311                // So, we allow :focus to pass through QSA all the time to avoid the IE error
1312                // See https://bugs.jquery.com/ticket/13378
1313                rbuggyQSA = [];
1314
1315                if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
1316
1317                    // Build QSA regex
1318                    // Regex strategy adopted from Diego Perini
1319                    assert( function( el ) {
1320
1321                        var input;
1322
1323                        // Select is set to empty string on purpose
1324                        // This is to test IE's treatment of not explicitly
1325                        // setting a boolean content attribute,
1326                        // since its presence should be enough
1327                        // https://bugs.jquery.com/ticket/12359
1328                        docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1329                            "<select id='" + expando + "-\r\\' msallowcapture=''>" +
1330                            "<option selected=''></option></select>";
1331
1332                        // Support: IE8, Opera 11-12.16
1333                        // Nothing should be selected when empty strings follow ^= or $= or *=
1334                        // The test attribute must be unknown in Opera but "safe" for WinRT
1335                        // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1336                        if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
1337                            rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1338                        }
1339
1340                        // Support: IE8
1341                        // Boolean attributes and "value" are not treated correctly
1342                        if ( !el.querySelectorAll( "[selected]" ).length ) {
1343                            rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1344                        }
1345
1346                        // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1347                        if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1348                            rbuggyQSA.push( "~=" );
1349                        }
1350
1351                        // Support: IE 11+, Edge 15 - 18+
1352                        // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1353                        // Adding a temporary attribute to the document before the selection works
1354                        // around the issue.
1355                        // Interestingly, IE 10 & older don't seem to have the issue.
1356                        input = document.createElement( "input" );
1357                        input.setAttribute( "name", "" );
1358                        el.appendChild( input );
1359                        if ( !el.querySelectorAll( "[name='']" ).length ) {
1360                            rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1361                                whitespace + "*(?:''|\"\")" );
1362                        }
1363
1364                        // Webkit/Opera - :checked should return selected option elements
1365                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1366                        // IE8 throws error here and will not see later tests
1367                        if ( !el.querySelectorAll( ":checked" ).length ) {
1368                            rbuggyQSA.push( ":checked" );
1369                        }
1370
1371                        // Support: Safari 8+, iOS 8+
1372                        // https://bugs.webkit.org/show_bug.cgi?id=136851
1373                        // In-page `selector#id sibling-combinator selector` fails
1374                        if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1375                            rbuggyQSA.push( ".#.+[+~]" );
1376                        }
1377
1378                        // Support: Firefox <=3.6 - 5 only
1379                        // Old Firefox doesn't throw on a badly-escaped identifier.
1380                        el.querySelectorAll( "\\\f" );
1381                        rbuggyQSA.push( "[\\r\\n\\f]" );
1382                    } );
1383
1384                    assert( function( el ) {
1385                        el.innerHTML = "<a href='' disabled='disabled'></a>" +
1386                            "<select disabled='disabled'><option/></select>";
1387
1388                        // Support: Windows 8 Native Apps
1389                        // The type and name attributes are restricted during .innerHTML assignment
1390                        var input = document.createElement( "input" );
1391                        input.setAttribute( "type", "hidden" );
1392                        el.appendChild( input ).setAttribute( "name", "D" );
1393
1394                        // Support: IE8
1395                        // Enforce case-sensitivity of name attribute
1396                        if ( el.querySelectorAll( "[name=d]" ).length ) {
1397                            rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1398                        }
1399
1400                        // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1401                        // IE8 throws error here and will not see later tests
1402                        if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
1403                            rbuggyQSA.push( ":enabled", ":disabled" );
1404                        }
1405
1406                        // Support: IE9-11+
1407                        // IE's :disabled selector does not pick up the children of disabled fieldsets
1408                        docElem.appendChild( el ).disabled = true;
1409                        if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1410                            rbuggyQSA.push( ":enabled", ":disabled" );
1411                        }
1412
1413                        // Support: Opera 10 - 11 only
1414                        // Opera 10-11 does not throw on post-comma invalid pseudos
1415                        el.querySelectorAll( "*,:x" );
1416                        rbuggyQSA.push( ",.*:" );
1417                    } );
1418                }
1419
1420                if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
1421                    docElem.webkitMatchesSelector ||
1422                    docElem.mozMatchesSelector ||
1423                    docElem.oMatchesSelector ||
1424                    docElem.msMatchesSelector ) ) ) ) {
1425
1426                    assert( function( el ) {
1427
1428                        // Check to see if it's possible to do matchesSelector
1429                        // on a disconnected node (IE 9)
1430                        support.disconnectedMatch = matches.call( el, "*" );
1431
1432                        // This should fail with an exception
1433                        // Gecko does not error, returns false instead
1434                        matches.call( el, "[s!='']:x" );
1435                        rbuggyMatches.push( "!=", pseudos );
1436                    } );
1437                }
1438
1439                rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1440                rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
1441
1442                /* Contains
1443	---------------------------------------------------------------------- */
1444                hasCompare = rnative.test( docElem.compareDocumentPosition );
1445
1446                // Element contains another
1447                // Purposefully self-exclusive
1448                // As in, an element does not contain itself
1449                contains = hasCompare || rnative.test( docElem.contains ) ?
1450                    function( a, b ) {
1451                        var adown = a.nodeType === 9 ? a.documentElement : a,
1452                            bup = b && b.parentNode;
1453                        return a === bup || !!( bup && bup.nodeType === 1 && (
1454                            adown.contains ?
1455                                adown.contains( bup ) :
1456                                a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1457                        ) );
1458                    } :
1459                    function( a, b ) {
1460                        if ( b ) {
1461                            while ( ( b = b.parentNode ) ) {
1462                                if ( b === a ) {
1463                                    return true;
1464                                }
1465                            }
1466                        }
1467                        return false;
1468                    };
1469
1470                /* Sorting
1471	---------------------------------------------------------------------- */
1472
1473                // Document order sorting
1474                sortOrder = hasCompare ?
1475                    function( a, b ) {
1476
1477                        // Flag for duplicate removal
1478                        if ( a === b ) {
1479                            hasDuplicate = true;
1480                            return 0;
1481                        }
1482
1483                        // Sort on method existence if only one input has compareDocumentPosition
1484                        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1485                        if ( compare ) {
1486                            return compare;
1487                        }
1488
1489                        // Calculate position if both inputs belong to the same document
1490                        // Support: IE 11+, Edge 17 - 18+
1491                        // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1492                        // two documents; shallow comparisons work.
1493                        // eslint-disable-next-line eqeqeq
1494                        compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1495                            a.compareDocumentPosition( b ) :
1496
1497                            // Otherwise we know they are disconnected
1498                            1;
1499
1500                        // Disconnected nodes
1501                        if ( compare & 1 ||
1502                            ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
1503
1504                            // Choose the first element that is related to our preferred document
1505                            // Support: IE 11+, Edge 17 - 18+
1506                            // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1507                            // two documents; shallow comparisons work.
1508                            // eslint-disable-next-line eqeqeq
1509                            if ( a == document || a.ownerDocument == preferredDoc &&
1510                                contains( preferredDoc, a ) ) {
1511                                return -1;
1512                            }
1513
1514                            // Support: IE 11+, Edge 17 - 18+
1515                            // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1516                            // two documents; shallow comparisons work.
1517                            // eslint-disable-next-line eqeqeq
1518                            if ( b == document || b.ownerDocument == preferredDoc &&
1519                                contains( preferredDoc, b ) ) {
1520                                return 1;
1521                            }
1522
1523                            // Maintain original order
1524                            return sortInput ?
1525                                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1526                                0;
1527                        }
1528
1529                        return compare & 4 ? -1 : 1;
1530                    } :
1531                    function( a, b ) {
1532
1533                        // Exit early if the nodes are identical
1534                        if ( a === b ) {
1535                            hasDuplicate = true;
1536                            return 0;
1537                        }
1538
1539                        var cur,
1540                            i = 0,
1541                            aup = a.parentNode,
1542                            bup = b.parentNode,
1543                            ap = [ a ],
1544                            bp = [ b ];
1545
1546                        // Parentless nodes are either documents or disconnected
1547                        if ( !aup || !bup ) {
1548
1549                            // Support: IE 11+, Edge 17 - 18+
1550                            // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1551                            // two documents; shallow comparisons work.
1552                            /* eslint-disable eqeqeq */
1553                            return a == document ? -1 :
1554                                b == document ? 1 :
1555                                    /* eslint-enable eqeqeq */
1556                                    aup ? -1 :
1557                                        bup ? 1 :
1558                                            sortInput ?
1559                                                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1560                                                0;
1561
1562                            // If the nodes are siblings, we can do a quick check
1563                        } else if ( aup === bup ) {
1564                            return siblingCheck( a, b );
1565                        }
1566
1567                        // Otherwise we need full lists of their ancestors for comparison
1568                        cur = a;
1569                        while ( ( cur = cur.parentNode ) ) {
1570                            ap.unshift( cur );
1571                        }
1572                        cur = b;
1573                        while ( ( cur = cur.parentNode ) ) {
1574                            bp.unshift( cur );
1575                        }
1576
1577                        // Walk down the tree looking for a discrepancy
1578                        while ( ap[ i ] === bp[ i ] ) {
1579                            i++;
1580                        }
1581
1582                        return i ?
1583
1584                            // Do a sibling check if the nodes have a common ancestor
1585                            siblingCheck( ap[ i ], bp[ i ] ) :
1586
1587                            // Otherwise nodes in our document sort first
1588                            // Support: IE 11+, Edge 17 - 18+
1589                            // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1590                            // two documents; shallow comparisons work.
1591                            /* eslint-disable eqeqeq */
1592                            ap[ i ] == preferredDoc ? -1 :
1593                                bp[ i ] == preferredDoc ? 1 :
1594                                    /* eslint-enable eqeqeq */
1595                                    0;
1596                    };
1597
1598                return document;
1599            };
1600
1601            Sizzle.matches = function( expr, elements ) {
1602                return Sizzle( expr, null, null, elements );
1603            };
1604
1605            Sizzle.matchesSelector = function( elem, expr ) {
1606                setDocument( elem );
1607
1608                if ( support.matchesSelector && documentIsHTML &&
1609                    !nonnativeSelectorCache[ expr + " " ] &&
1610                    ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1611                    ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1612
1613                    try {
1614                        var ret = matches.call( elem, expr );
1615
1616                        // IE 9's matchesSelector returns false on disconnected nodes
1617                        if ( ret || support.disconnectedMatch ||
1618
1619                            // As well, disconnected nodes are said to be in a document
1620                            // fragment in IE 9
1621                            elem.document && elem.document.nodeType !== 11 ) {
1622                            return ret;
1623                        }
1624                    } catch ( e ) {
1625                        nonnativeSelectorCache( expr, true );
1626                    }
1627                }
1628
1629                return Sizzle( expr, document, null, [ elem ] ).length > 0;
1630            };
1631
1632            Sizzle.contains = function( context, elem ) {
1633
1634                // Set document vars if needed
1635                // Support: IE 11+, Edge 17 - 18+
1636                // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1637                // two documents; shallow comparisons work.
1638                // eslint-disable-next-line eqeqeq
1639                if ( ( context.ownerDocument || context ) != document ) {
1640                    setDocument( context );
1641                }
1642                return contains( context, elem );
1643            };
1644
1645            Sizzle.attr = function( elem, name ) {
1646
1647                // Set document vars if needed
1648                // Support: IE 11+, Edge 17 - 18+
1649                // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1650                // two documents; shallow comparisons work.
1651                // eslint-disable-next-line eqeqeq
1652                if ( ( elem.ownerDocument || elem ) != document ) {
1653                    setDocument( elem );
1654                }
1655
1656                var fn = Expr.attrHandle[ name.toLowerCase() ],
1657
1658                    // Don't get fooled by Object.prototype properties (jQuery #13807)
1659                    val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1660                        fn( elem, name, !documentIsHTML ) :
1661                        undefined;
1662
1663                return val !== undefined ?
1664                    val :
1665                    support.attributes || !documentIsHTML ?
1666                        elem.getAttribute( name ) :
1667                        ( val = elem.getAttributeNode( name ) ) && val.specified ?
1668                            val.value :
1669                            null;
1670            };
1671
1672            Sizzle.escape = function( sel ) {
1673                return ( sel + "" ).replace( rcssescape, fcssescape );
1674            };
1675
1676            Sizzle.error = function( msg ) {
1677                throw new Error( "Syntax error, unrecognized expression: " + msg );
1678            };
1679
1680            /**
1681             * Document sorting and removing duplicates
1682             * @param {ArrayLike} results
1683             */
1684            Sizzle.uniqueSort = function( results ) {
1685                var elem,
1686                    duplicates = [],
1687                    j = 0,
1688                    i = 0;
1689
1690                // Unless we *know* we can detect duplicates, assume their presence
1691                hasDuplicate = !support.detectDuplicates;
1692                sortInput = !support.sortStable && results.slice( 0 );
1693                results.sort( sortOrder );
1694
1695                if ( hasDuplicate ) {
1696                    while ( ( elem = results[ i++ ] ) ) {
1697                        if ( elem === results[ i ] ) {
1698                            j = duplicates.push( i );
1699                        }
1700                    }
1701                    while ( j-- ) {
1702                        results.splice( duplicates[ j ], 1 );
1703                    }
1704                }
1705
1706                // Clear input after sorting to release objects
1707                // See https://github.com/jquery/sizzle/pull/225
1708                sortInput = null;
1709
1710                return results;
1711            };
1712
1713            /**
1714             * Utility function for retrieving the text value of an array of DOM nodes
1715             * @param {Array|Element} elem
1716             */
1717            getText = Sizzle.getText = function( elem ) {
1718                var node,
1719                    ret = "",
1720                    i = 0,
1721                    nodeType = elem.nodeType;
1722
1723                if ( !nodeType ) {
1724
1725                    // If no nodeType, this is expected to be an array
1726                    while ( ( node = elem[ i++ ] ) ) {
1727
1728                        // Do not traverse comment nodes
1729                        ret += getText( node );
1730                    }
1731                } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1732
1733                    // Use textContent for elements
1734                    // innerText usage removed for consistency of new lines (jQuery #11153)
1735                    if ( typeof elem.textContent === "string" ) {
1736                        return elem.textContent;
1737                    } else {
1738
1739                        // Traverse its children
1740                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1741                            ret += getText( elem );
1742                        }
1743                    }
1744                } else if ( nodeType === 3 || nodeType === 4 ) {
1745                    return elem.nodeValue;
1746                }
1747
vendor: 13,229 bytes, lines 1748-2022
1748                // Do not include comment or processing instruction nodes
1749
1750                return ret;
1751            };
1752
1753            Expr = Sizzle.selectors = {
1754
1755                // Can be adjusted by the user
1756                cacheLength: 50,
1757
1758                createPseudo: markFunction,
1759
1760                match: matchExpr,
1761
1762                attrHandle: {},
1763
1764                find: {},
1765
1766                relative: {
1767                    ">": { dir: "parentNode", first: true },
1768                    " ": { dir: "parentNode" },
1769                    "+": { dir: "previousSibling", first: true },
1770                    "~": { dir: "previousSibling" }
1771                },
1772
1773                preFilter: {
1774                    "ATTR": function( match ) {
1775                        match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1776
1777                        // Move the given value to match[3] whether quoted or unquoted
1778                        match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
1779                            match[ 5 ] || "" ).replace( runescape, funescape );
1780
1781                        if ( match[ 2 ] === "~=" ) {
1782                            match[ 3 ] = " " + match[ 3 ] + " ";
1783                        }
1784
1785                        return match.slice( 0, 4 );
1786                    },
1787
1788                    "CHILD": function( match ) {
1789
1790                        /* matches from matchExpr["CHILD"]
1791				1 type (only|nth|...)
1792				2 what (child|of-type)
1793				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1794				4 xn-component of xn+y argument ([+-]?\d*n|)
1795				5 sign of xn-component
1796				6 x of xn-component
1797				7 sign of y-component
1798				8 y of y-component
1799			*/
1800                        match[ 1 ] = match[ 1 ].toLowerCase();
1801
1802                        if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1803
1804                            // nth-* requires argument
1805                            if ( !match[ 3 ] ) {
1806                                Sizzle.error( match[ 0 ] );
1807                            }
1808
1809                            // numeric x and y parameters for Expr.filter.CHILD
1810                            // remember that false/true cast respectively to 0/1
1811                            match[ 4 ] = +( match[ 4 ] ?
1812                                match[ 5 ] + ( match[ 6 ] || 1 ) :
1813                                2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
1814                            match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1815
1816                            // other types prohibit arguments
1817                        } else if ( match[ 3 ] ) {
1818                            Sizzle.error( match[ 0 ] );
1819                        }
1820
1821                        return match;
1822                    },
1823
1824                    "PSEUDO": function( match ) {
1825                        var excess,
1826                            unquoted = !match[ 6 ] && match[ 2 ];
1827
1828                        if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
1829                            return null;
1830                        }
1831
1832                        // Accept quoted arguments as-is
1833                        if ( match[ 3 ] ) {
1834                            match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
1835
1836                            // Strip excess characters from unquoted arguments
1837                        } else if ( unquoted && rpseudo.test( unquoted ) &&
1838
1839                            // Get excess from tokenize (recursively)
1840                            ( excess = tokenize( unquoted, true ) ) &&
1841
1842                            // advance to the next closing parenthesis
1843                            ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1844
1845                            // excess is a negative index
1846                            match[ 0 ] = match[ 0 ].slice( 0, excess );
1847                            match[ 2 ] = unquoted.slice( 0, excess );
1848                        }
1849
1850                        // Return only captures needed by the pseudo filter method (type and argument)
1851                        return match.slice( 0, 3 );
1852                    }
1853                },
1854
1855                filter: {
1856
1857                    "TAG": function( nodeNameSelector ) {
1858                        var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1859                        return nodeNameSelector === "*" ?
1860                            function() {
1861                                return true;
1862                            } :
1863                            function( elem ) {
1864                                return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1865                            };
1866                    },
1867
1868                    "CLASS": function( className ) {
1869                        var pattern = classCache[ className + " " ];
1870
1871                        return pattern ||
1872                            ( pattern = new RegExp( "(^|" + whitespace +
1873                                ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
1874                                className, function( elem ) {
1875                                    return pattern.test(
1876                                        typeof elem.className === "string" && elem.className ||
1877                                        typeof elem.getAttribute !== "undefined" &&
1878                                        elem.getAttribute( "class" ) ||
1879                                        ""
1880                                    );
1881                                } );
1882                    },
1883
1884                    "ATTR": function( name, operator, check ) {
1885                        return function( elem ) {
1886                            var result = Sizzle.attr( elem, name );
1887
1888                            if ( result == null ) {
1889                                return operator === "!=";
1890                            }
1891                            if ( !operator ) {
1892                                return true;
1893                            }
1894
1895                            result += "";
1896
1897                            /* eslint-disable max-len */
1898
1899                            return operator === "=" ? result === check :
1900                                operator === "!=" ? result !== check :
1901                                    operator === "^=" ? check && result.indexOf( check ) === 0 :
1902                                        operator === "*=" ? check && result.indexOf( check ) > -1 :
1903                                            operator === "$=" ? check && result.slice( -check.length ) === check :
1904                                                operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1905                                                    operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1906                                                        false;
1907                            /* eslint-enable max-len */
1908
1909                        };
1910                    },
1911
1912                    "CHILD": function( type, what, _argument, first, last ) {
1913                        var simple = type.slice( 0, 3 ) !== "nth",
1914                            forward = type.slice( -4 ) !== "last",
1915                            ofType = what === "of-type";
1916
1917                        return first === 1 && last === 0 ?
1918
1919                            // Shortcut for :nth-*(n)
1920                            function( elem ) {
1921                                return !!elem.parentNode;
1922                            } :
1923
1924                            function( elem, _context, xml ) {
1925                                var cache, uniqueCache, outerCache, node, nodeIndex, start,
1926                                    dir = simple !== forward ? "nextSibling" : "previousSibling",
1927                                    parent = elem.parentNode,
1928                                    name = ofType && elem.nodeName.toLowerCase(),
1929                                    useCache = !xml && !ofType,
1930                                    diff = false;
1931
1932                                if ( parent ) {
1933
1934                                    // :(first|last|only)-(child|of-type)
1935                                    if ( simple ) {
1936                                        while ( dir ) {
1937                                            node = elem;
1938                                            while ( ( node = node[ dir ] ) ) {
1939                                                if ( ofType ?
1940                                                    node.nodeName.toLowerCase() === name :
1941                                                    node.nodeType === 1 ) {
1942
1943                                                    return false;
1944                                                }
1945                                            }
1946
1947                                            // Reverse direction for :only-* (if we haven't yet done so)
1948                                            start = dir = type === "only" && !start && "nextSibling";
1949                                        }
1950                                        return true;
1951                                    }
1952
1953                                    start = [ forward ? parent.firstChild : parent.lastChild ];
1954
1955                                    // non-xml :nth-child(...) stores cache data on `parent`
1956                                    if ( forward && useCache ) {
1957
1958                                        // Seek `elem` from a previously-cached index
1959
1960                                        // ...in a gzip-friendly way
1961                                        node = parent;
1962                                        outerCache = node[ expando ] || ( node[ expando ] = {} );
1963
1964                                        // Support: IE <9 only
1965                                        // Defend against cloned attroperties (jQuery gh-1709)
1966                                        uniqueCache = outerCache[ node.uniqueID ] ||
1967                                            ( outerCache[ node.uniqueID ] = {} );
1968
1969                                        cache = uniqueCache[ type ] || [];
1970                                        nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1971                                        diff = nodeIndex && cache[ 2 ];
1972                                        node = nodeIndex && parent.childNodes[ nodeIndex ];
1973
1974                                        while ( ( node = ++nodeIndex && node && node[ dir ] ||
1975
1976                                            // Fallback to seeking `elem` from the start
1977                                            ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1978
1979                                            // When found, cache indexes on `parent` and break
1980                                            if ( node.nodeType === 1 && ++diff && node === elem ) {
1981                                                uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1982                                                break;
1983                                            }
1984                                        }
1985
1986                                    } else {
1987
1988                                        // Use previously-cached element index if available
1989                                        if ( useCache ) {
1990
1991                                            // ...in a gzip-friendly way
1992                                            node = elem;
1993                                            outerCache = node[ expando ] || ( node[ expando ] = {} );
1994
1995                                            // Support: IE <9 only
1996                                            // Defend against cloned attroperties (jQuery gh-1709)
1997                                            uniqueCache = outerCache[ node.uniqueID ] ||
1998                                                ( outerCache[ node.uniqueID ] = {} );
1999
2000                                            cache = uniqueCache[ type ] || [];
2001                                            nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2002                                            diff = nodeIndex;
2003                                        }
2004
2005                                        // xml :nth-child(...)
2006                                        // or :nth-last-child(...) or :nth(-last)?-of-type(...)
2007                                        if ( diff === false ) {
2008
2009                                            // Use the same loop as above to seek `elem` from the start
2010                                            while ( ( node = ++nodeIndex && node && node[ dir ] ||
2011                                                ( diff = nodeIndex = 0 ) || start.pop() ) ) {
2012
2013                                                if ( ( ofType ?
2014                                                    node.nodeName.toLowerCase() === name :
2015                                                    node.nodeType === 1 ) &&
2016                                                    ++diff ) {
2017
2018                                                    // Cache the index of each encountered element
2019                                                    if ( useCache ) {
2020                                                        outerCache = node[ expando ] ||
2021                                                            ( node[ expando ] = {} );
2022
vendor: 14,491 bytes, lines 2023-2338
2023                                                        // Support: IE <9 only
2024                                                        // Defend against cloned attroperties (jQuery gh-1709)
2025                                                        uniqueCache = outerCache[ node.uniqueID ] ||
2026                                                            ( outerCache[ node.uniqueID ] = {} );
2027
2028                                                        uniqueCache[ type ] = [ dirruns, diff ];
2029                                                    }
2030
2031                                                    if ( node === elem ) {
2032                                                        break;
2033                                                    }
2034                                                }
2035                                            }
2036                                        }
2037                                    }
2038
2039                                    // Incorporate the offset, then check against cycle size
2040                                    diff -= last;
2041                                    return diff === first || ( diff % first === 0 && diff / first >= 0 );
2042                                }
2043                            };
2044                    },
2045
2046                    "PSEUDO": function( pseudo, argument ) {
2047
2048                        // pseudo-class names are case-insensitive
2049                        // http://www.w3.org/TR/selectors/#pseudo-classes
2050                        // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2051                        // Remember that setFilters inherits from pseudos
2052                        var args,
2053                            fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2054                                Sizzle.error( "unsupported pseudo: " + pseudo );
2055
2056                        // The user may use createPseudo to indicate that
2057                        // arguments are needed to create the filter function
2058                        // just as Sizzle does
2059                        if ( fn[ expando ] ) {
2060                            return fn( argument );
2061                        }
2062
2063                        // But maintain support for old signatures
2064                        if ( fn.length > 1 ) {
2065                            args = [ pseudo, pseudo, "", argument ];
2066                            return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2067                                markFunction( function( seed, matches ) {
2068                                    var idx,
2069                                        matched = fn( seed, argument ),
2070                                        i = matched.length;
2071                                    while ( i-- ) {
2072                                        idx = indexOf( seed, matched[ i ] );
2073                                        seed[ idx ] = !( matches[ idx ] = matched[ i ] );
2074                                    }
2075                                } ) :
2076                                function( elem ) {
2077                                    return fn( elem, 0, args );
2078                                };
2079                        }
2080
2081                        return fn;
2082                    }
2083                },
2084
2085                pseudos: {
2086
2087                    // Potentially complex pseudos
2088                    "not": markFunction( function( selector ) {
2089
2090                        // Trim the selector passed to compile
2091                        // to avoid treating leading and trailing
2092                        // spaces as combinators
2093                        var input = [],
2094                            results = [],
2095                            matcher = compile( selector.replace( rtrim, "$1" ) );
2096
2097                        return matcher[ expando ] ?
2098                            markFunction( function( seed, matches, _context, xml ) {
2099                                var elem,
2100                                    unmatched = matcher( seed, null, xml, [] ),
2101                                    i = seed.length;
2102
2103                                // Match elements unmatched by `matcher`
2104                                while ( i-- ) {
2105                                    if ( ( elem = unmatched[ i ] ) ) {
2106                                        seed[ i ] = !( matches[ i ] = elem );
2107                                    }
2108                                }
2109                            } ) :
2110                            function( elem, _context, xml ) {
2111                                input[ 0 ] = elem;
2112                                matcher( input, null, xml, results );
2113
2114                                // Don't keep the element (issue #299)
2115                                input[ 0 ] = null;
2116                                return !results.pop();
2117                            };
2118                    } ),
2119
2120                    "has": markFunction( function( selector ) {
2121                        return function( elem ) {
2122                            return Sizzle( selector, elem ).length > 0;
2123                        };
2124                    } ),
2125
2126                    "contains": markFunction( function( text ) {
2127                        text = text.replace( runescape, funescape );
2128                        return function( elem ) {
2129                            return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
2130                        };
2131                    } ),
2132
2133                    // "Whether an element is represented by a :lang() selector
2134                    // is based solely on the element's language value
2135                    // being equal to the identifier C,
2136                    // or beginning with the identifier C immediately followed by "-".
2137                    // The matching of C against the element's language value is performed case-insensitively.
2138                    // The identifier C does not have to be a valid language name."
2139                    // http://www.w3.org/TR/selectors/#lang-pseudo
2140                    "lang": markFunction( function( lang ) {
2141
2142                        // lang value must be a valid identifier
2143                        if ( !ridentifier.test( lang || "" ) ) {
2144                            Sizzle.error( "unsupported lang: " + lang );
2145                        }
2146                        lang = lang.replace( runescape, funescape ).toLowerCase();
2147                        return function( elem ) {
2148                            var elemLang;
2149                            do {
2150                                if ( ( elemLang = documentIsHTML ?
2151                                    elem.lang :
2152                                    elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
2153
2154                                    elemLang = elemLang.toLowerCase();
2155                                    return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2156                                }
2157                            } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
2158                            return false;
2159                        };
2160                    } ),
2161
2162                    // Miscellaneous
2163                    "target": function( elem ) {
2164                        var hash = window.location && window.location.hash;
2165                        return hash && hash.slice( 1 ) === elem.id;
2166                    },
2167
2168                    "root": function( elem ) {
2169                        return elem === docElem;
2170                    },
2171
2172                    "focus": function( elem ) {
2173                        return elem === document.activeElement &&
2174                            ( !document.hasFocus || document.hasFocus() ) &&
2175                            !!( elem.type || elem.href || ~elem.tabIndex );
2176                    },
2177
2178                    // Boolean properties
2179                    "enabled": createDisabledPseudo( false ),
2180                    "disabled": createDisabledPseudo( true ),
2181
2182                    "checked": function( elem ) {
2183
2184                        // In CSS3, :checked should return both checked and selected elements
2185                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2186                        var nodeName = elem.nodeName.toLowerCase();
2187                        return ( nodeName === "input" && !!elem.checked ) ||
2188                            ( nodeName === "option" && !!elem.selected );
2189                    },
2190
2191                    "selected": function( elem ) {
2192
2193                        // Accessing this property makes selected-by-default
2194                        // options in Safari work properly
2195                        if ( elem.parentNode ) {
2196                            // eslint-disable-next-line no-unused-expressions
2197                            elem.parentNode.selectedIndex;
2198                        }
2199
2200                        return elem.selected === true;
2201                    },
2202
2203                    // Contents
2204                    "empty": function( elem ) {
2205
2206                        // http://www.w3.org/TR/selectors/#empty-pseudo
2207                        // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2208                        //   but not by others (comment: 8; processing instruction: 7; etc.)
2209                        // nodeType < 6 works because attributes (2) do not appear as children
2210                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2211                            if ( elem.nodeType < 6 ) {
2212                                return false;
2213                            }
2214                        }
2215                        return true;
2216                    },
2217
2218                    "parent": function( elem ) {
2219                        return !Expr.pseudos[ "empty" ]( elem );
2220                    },
2221
2222                    // Element/input types
2223                    "header": function( elem ) {
2224                        return rheader.test( elem.nodeName );
2225                    },
2226
2227                    "input": function( elem ) {
2228                        return rinputs.test( elem.nodeName );
2229                    },
2230
2231                    "button": function( elem ) {
2232                        var name = elem.nodeName.toLowerCase();
2233                        return name === "input" && elem.type === "button" || name === "button";
2234                    },
2235
2236                    "text": function( elem ) {
2237                        var attr;
2238                        return elem.nodeName.toLowerCase() === "input" &&
2239                            elem.type === "text" &&
2240
2241                            // Support: IE<8
2242                            // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2243                            ( ( attr = elem.getAttribute( "type" ) ) == null ||
2244                                attr.toLowerCase() === "text" );
2245                    },
2246
2247                    // Position-in-collection
2248                    "first": createPositionalPseudo( function() {
2249                        return [ 0 ];
2250                    } ),
2251
2252                    "last": createPositionalPseudo( function( _matchIndexes, length ) {
2253                        return [ length - 1 ];
2254                    } ),
2255
2256                    "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
2257                        return [ argument < 0 ? argument + length : argument ];
2258                    } ),
2259
2260                    "even": createPositionalPseudo( function( matchIndexes, length ) {
2261                        var i = 0;
2262                        for ( ; i < length; i += 2 ) {
2263                            matchIndexes.push( i );
2264                        }
2265                        return matchIndexes;
2266                    } ),
2267
2268                    "odd": createPositionalPseudo( function( matchIndexes, length ) {
2269                        var i = 1;
2270                        for ( ; i < length; i += 2 ) {
2271                            matchIndexes.push( i );
2272                        }
2273                        return matchIndexes;
2274                    } ),
2275
2276                    "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2277                        var i = argument < 0 ?
2278                            argument + length :
2279                            argument > length ?
2280                                length :
2281                                argument;
2282                        for ( ; --i >= 0; ) {
2283                            matchIndexes.push( i );
2284                        }
2285                        return matchIndexes;
2286                    } ),
2287
2288                    "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2289                        var i = argument < 0 ? argument + length : argument;
2290                        for ( ; ++i < length; ) {
2291                            matchIndexes.push( i );
2292                        }
2293                        return matchIndexes;
2294                    } )
2295                }
2296            };
2297
2298            Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
2299
2300// Add button/input type pseudos
2301            for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2302                Expr.pseudos[ i ] = createInputPseudo( i );
2303            }
2304            for ( i in { submit: true, reset: true } ) {
2305                Expr.pseudos[ i ] = createButtonPseudo( i );
2306            }
2307
2308// Easy API for creating new setFilters
2309            function setFilters() {}
2310            setFilters.prototype = Expr.filters = Expr.pseudos;
2311            Expr.setFilters = new setFilters();
2312
2313            tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2314                var matched, match, tokens, type,
2315                    soFar, groups, preFilters,
2316                    cached = tokenCache[ selector + " " ];
2317
2318                if ( cached ) {
2319                    return parseOnly ? 0 : cached.slice( 0 );
2320                }
2321
2322                soFar = selector;
2323                groups = [];
2324                preFilters = Expr.preFilter;
2325
2326                while ( soFar ) {
2327
2328                    // Comma and first run
2329                    if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2330                        if ( match ) {
2331
2332                            // Don't consume trailing commas as valid
2333                            soFar = soFar.slice( match[ 0 ].length ) || soFar;
2334                        }
2335                        groups.push( ( tokens = [] ) );
2336                    }
2337
2338                    matched = false;
vendor: 5,359 bytes, lines 2339-2456
2339
2340                    // Combinators
2341                    if ( ( match = rcombinators.exec( soFar ) ) ) {
2342                        matched = match.shift();
2343                        tokens.push( {
2344                            value: matched,
2345
2346                            // Cast descendant combinators to space
2347                            type: match[ 0 ].replace( rtrim, " " )
2348                        } );
2349                        soFar = soFar.slice( matched.length );
2350                    }
2351
2352                    // Filters
2353                    for ( type in Expr.filter ) {
2354                        if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2355                            ( match = preFilters[ type ]( match ) ) ) ) {
2356                            matched = match.shift();
2357                            tokens.push( {
2358                                value: matched,
2359                                type: type,
2360                                matches: match
2361                            } );
2362                            soFar = soFar.slice( matched.length );
2363                        }
2364                    }
2365
2366                    if ( !matched ) {
2367                        break;
2368                    }
2369                }
2370
2371                // Return the length of the invalid excess
2372                // if we're just parsing
2373                // Otherwise, throw an error or return tokens
2374                return parseOnly ?
2375                    soFar.length :
2376                    soFar ?
2377                        Sizzle.error( selector ) :
2378
2379                        // Cache the tokens
2380                        tokenCache( selector, groups ).slice( 0 );
2381            };
2382
2383            function toSelector( tokens ) {
2384                var i = 0,
2385                    len = tokens.length,
2386                    selector = "";
2387                for ( ; i < len; i++ ) {
2388                    selector += tokens[ i ].value;
2389                }
2390                return selector;
2391            }
2392
2393            function addCombinator( matcher, combinator, base ) {
2394                var dir = combinator.dir,
2395                    skip = combinator.next,
2396                    key = skip || dir,
2397                    checkNonElements = base && key === "parentNode",
2398                    doneName = done++;
2399
2400                return combinator.first ?
2401
2402                    // Check against closest ancestor/preceding element
2403                    function( elem, context, xml ) {
2404                        while ( ( elem = elem[ dir ] ) ) {
2405                            if ( elem.nodeType === 1 || checkNonElements ) {
2406                                return matcher( elem, context, xml );
2407                            }
2408                        }
2409                        return false;
2410                    } :
2411
2412                    // Check against all ancestor/preceding elements
2413                    function( elem, context, xml ) {
2414                        var oldCache, uniqueCache, outerCache,
2415                            newCache = [ dirruns, doneName ];
2416
2417                        // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2418                        if ( xml ) {
2419                            while ( ( elem = elem[ dir ] ) ) {
2420                                if ( elem.nodeType === 1 || checkNonElements ) {
2421                                    if ( matcher( elem, context, xml ) ) {
2422                                        return true;
2423                                    }
2424                                }
2425                            }
2426                        } else {
2427                            while ( ( elem = elem[ dir ] ) ) {
2428                                if ( elem.nodeType === 1 || checkNonElements ) {
2429                                    outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2430
2431                                    // Support: IE <9 only
2432                                    // Defend against cloned attroperties (jQuery gh-1709)
2433                                    uniqueCache = outerCache[ elem.uniqueID ] ||
2434                                        ( outerCache[ elem.uniqueID ] = {} );
2435
2436                                    if ( skip && skip === elem.nodeName.toLowerCase() ) {
2437                                        elem = elem[ dir ] || elem;
2438                                    } else if ( ( oldCache = uniqueCache[ key ] ) &&
2439                                        oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2440
2441                                        // Assign to newCache so results back-propagate to previous elements
2442                                        return ( newCache[ 2 ] = oldCache[ 2 ] );
2443                                    } else {
2444
2445                                        // Reuse newcache so results back-propagate to previous elements
2446                                        uniqueCache[ key ] = newCache;
2447
2448                                        // A match means we're done; a fail means we have to keep checking
2449                                        if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2450                                            return true;
2451                                        }
2452                                    }
2453                                }
2454                            }
2455                        }
2456                        return false;
vendor: 8,930 bytes, lines 2457-2653
2457                    };
2458            }
2459
2460            function elementMatcher( matchers ) {
2461                return matchers.length > 1 ?
2462                    function( elem, context, xml ) {
2463                        var i = matchers.length;
2464                        while ( i-- ) {
2465                            if ( !matchers[ i ]( elem, context, xml ) ) {
2466                                return false;
2467                            }
2468                        }
2469                        return true;
2470                    } :
2471                    matchers[ 0 ];
2472            }
2473
2474            function multipleContexts( selector, contexts, results ) {
2475                var i = 0,
2476                    len = contexts.length;
2477                for ( ; i < len; i++ ) {
2478                    Sizzle( selector, contexts[ i ], results );
2479                }
2480                return results;
2481            }
2482
2483            function condense( unmatched, map, filter, context, xml ) {
2484                var elem,
2485                    newUnmatched = [],
2486                    i = 0,
2487                    len = unmatched.length,
2488                    mapped = map != null;
2489
2490                for ( ; i < len; i++ ) {
2491                    if ( ( elem = unmatched[ i ] ) ) {
2492                        if ( !filter || filter( elem, context, xml ) ) {
2493                            newUnmatched.push( elem );
2494                            if ( mapped ) {
2495                                map.push( i );
2496                            }
2497                        }
2498                    }
2499                }
2500
2501                return newUnmatched;
2502            }
2503
2504            function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2505                if ( postFilter && !postFilter[ expando ] ) {
2506                    postFilter = setMatcher( postFilter );
2507                }
2508                if ( postFinder && !postFinder[ expando ] ) {
2509                    postFinder = setMatcher( postFinder, postSelector );
2510                }
2511                return markFunction( function( seed, results, context, xml ) {
2512                    var temp, i, elem,
2513                        preMap = [],
2514                        postMap = [],
2515                        preexisting = results.length,
2516
2517                        // Get initial elements from seed or context
2518                        elems = seed || multipleContexts(
2519                            selector || "*",
2520                            context.nodeType ? [ context ] : context,
2521                            []
2522                        ),
2523
2524                        // Prefilter to get matcher input, preserving a map for seed-results synchronization
2525                        matcherIn = preFilter && ( seed || !selector ) ?
2526                            condense( elems, preMap, preFilter, context, xml ) :
2527                            elems,
2528
2529                        matcherOut = matcher ?
2530
2531                            // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2532                            postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2533
2534                                // ...intermediate processing is necessary
2535                                [] :
2536
2537                                // ...otherwise use results directly
2538                                results :
2539                            matcherIn;
2540
2541                    // Find primary matches
2542                    if ( matcher ) {
2543                        matcher( matcherIn, matcherOut, context, xml );
2544                    }
2545
2546                    // Apply postFilter
2547                    if ( postFilter ) {
2548                        temp = condense( matcherOut, postMap );
2549                        postFilter( temp, [], context, xml );
2550
2551                        // Un-match failing elements by moving them back to matcherIn
2552                        i = temp.length;
2553                        while ( i-- ) {
2554                            if ( ( elem = temp[ i ] ) ) {
2555                                matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2556                            }
2557                        }
2558                    }
2559
2560                    if ( seed ) {
2561                        if ( postFinder || preFilter ) {
2562                            if ( postFinder ) {
2563
2564                                // Get the final matcherOut by condensing this intermediate into postFinder contexts
2565                                temp = [];
2566                                i = matcherOut.length;
2567                                while ( i-- ) {
2568                                    if ( ( elem = matcherOut[ i ] ) ) {
2569
2570                                        // Restore matcherIn since elem is not yet a final match
2571                                        temp.push( ( matcherIn[ i ] = elem ) );
2572                                    }
2573                                }
2574                                postFinder( null, ( matcherOut = [] ), temp, xml );
2575                            }
2576
2577                            // Move matched elements from seed to results to keep them synchronized
2578                            i = matcherOut.length;
2579                            while ( i-- ) {
2580                                if ( ( elem = matcherOut[ i ] ) &&
2581                                    ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
2582
2583                                    seed[ temp ] = !( results[ temp ] = elem );
2584                                }
2585                            }
2586                        }
2587
2588                        // Add elements to results, through postFinder if defined
2589                    } else {
2590                        matcherOut = condense(
2591                            matcherOut === results ?
2592                                matcherOut.splice( preexisting, matcherOut.length ) :
2593                                matcherOut
2594                        );
2595                        if ( postFinder ) {
2596                            postFinder( null, results, matcherOut, xml );
2597                        } else {
2598                            push.apply( results, matcherOut );
2599                        }
2600                    }
2601                } );
2602            }
2603
2604            function matcherFromTokens( tokens ) {
2605                var checkContext, matcher, j,
2606                    len = tokens.length,
2607                    leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2608                    implicitRelative = leadingRelative || Expr.relative[ " " ],
2609                    i = leadingRelative ? 1 : 0,
2610
2611                    // The foundational matcher ensures that elements are reachable from top-level context(s)
2612                    matchContext = addCombinator( function( elem ) {
2613                        return elem === checkContext;
2614                    }, implicitRelative, true ),
2615                    matchAnyContext = addCombinator( function( elem ) {
2616                        return indexOf( checkContext, elem ) > -1;
2617                    }, implicitRelative, true ),
2618                    matchers = [ function( elem, context, xml ) {
2619                        var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2620                            ( checkContext = context ).nodeType ?
2621                                matchContext( elem, context, xml ) :
2622                                matchAnyContext( elem, context, xml ) );
2623
2624                        // Avoid hanging onto element (issue #299)
2625                        checkContext = null;
2626                        return ret;
2627                    } ];
2628
2629                for ( ; i < len; i++ ) {
2630                    if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2631                        matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
2632                    } else {
2633                        matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
2634
2635                        // Return special upon seeing a positional matcher
2636                        if ( matcher[ expando ] ) {
2637
2638                            // Find the next relative operator (if any) for proper handling
2639                            j = ++i;
2640                            for ( ; j < len; j++ ) {
2641                                if ( Expr.relative[ tokens[ j ].type ] ) {
2642                                    break;
2643                                }
2644                            }
2645                            return setMatcher(
2646                                i > 1 && elementMatcher( matchers ),
2647                                i > 1 && toSelector(
2648
2649                                // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2650                                tokens
2651                                    .slice( 0, i - 1 )
2652                                    .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2653                                ).replace( rtrim, "$1" ),
vendor: 10,913 bytes, lines 2654-2878
2654                                matcher,
2655                                i < j && matcherFromTokens( tokens.slice( i, j ) ),
2656                                j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2657                                j < len && toSelector( tokens )
2658                            );
2659                        }
2660                        matchers.push( matcher );
2661                    }
2662                }
2663
2664                return elementMatcher( matchers );
2665            }
2666
2667            function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2668                var bySet = setMatchers.length > 0,
2669                    byElement = elementMatchers.length > 0,
2670                    superMatcher = function( seed, context, xml, results, outermost ) {
2671                        var elem, j, matcher,
2672                            matchedCount = 0,
2673                            i = "0",
2674                            unmatched = seed && [],
2675                            setMatched = [],
2676                            contextBackup = outermostContext,
2677
2678                            // We must always have either seed elements or outermost context
2679                            elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
2680
2681                            // Use integer dirruns iff this is the outermost matcher
2682                            dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2683                            len = elems.length;
2684
2685                        if ( outermost ) {
2686
2687                            // Support: IE 11+, Edge 17 - 18+
2688                            // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2689                            // two documents; shallow comparisons work.
2690                            // eslint-disable-next-line eqeqeq
2691                            outermostContext = context == document || context || outermost;
2692                        }
2693
2694                        // Add elements passing elementMatchers directly to results
2695                        // Support: IE<9, Safari
2696                        // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2697                        for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2698                            if ( byElement && elem ) {
2699                                j = 0;
2700
2701                                // Support: IE 11+, Edge 17 - 18+
2702                                // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2703                                // two documents; shallow comparisons work.
2704                                // eslint-disable-next-line eqeqeq
2705                                if ( !context && elem.ownerDocument != document ) {
2706                                    setDocument( elem );
2707                                    xml = !documentIsHTML;
2708                                }
2709                                while ( ( matcher = elementMatchers[ j++ ] ) ) {
2710                                    if ( matcher( elem, context || document, xml ) ) {
2711                                        results.push( elem );
2712                                        break;
2713                                    }
2714                                }
2715                                if ( outermost ) {
2716                                    dirruns = dirrunsUnique;
2717                                }
2718                            }
2719
2720                            // Track unmatched elements for set filters
2721                            if ( bySet ) {
2722
2723                                // They will have gone through all possible matchers
2724                                if ( ( elem = !matcher && elem ) ) {
2725                                    matchedCount--;
2726                                }
2727
2728                                // Lengthen the array for every element, matched or not
2729                                if ( seed ) {
2730                                    unmatched.push( elem );
2731                                }
2732                            }
2733                        }
2734
2735                        // `i` is now the count of elements visited above, and adding it to `matchedCount`
2736                        // makes the latter nonnegative.
2737                        matchedCount += i;
2738
2739                        // Apply set filters to unmatched elements
2740                        // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2741                        // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2742                        // no element matchers and no seed.
2743                        // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2744                        // case, which will result in a "00" `matchedCount` that differs from `i` but is also
2745                        // numerically zero.
2746                        if ( bySet && i !== matchedCount ) {
2747                            j = 0;
2748                            while ( ( matcher = setMatchers[ j++ ] ) ) {
2749                                matcher( unmatched, setMatched, context, xml );
2750                            }
2751
2752                            if ( seed ) {
2753
2754                                // Reintegrate element matches to eliminate the need for sorting
2755                                if ( matchedCount > 0 ) {
2756                                    while ( i-- ) {
2757                                        if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2758                                            setMatched[ i ] = pop.call( results );
2759                                        }
2760                                    }
2761                                }
2762
2763                                // Discard index placeholder values to get only actual matches
2764                                setMatched = condense( setMatched );
2765                            }
2766
2767                            // Add matches to results
2768                            push.apply( results, setMatched );
2769
2770                            // Seedless set matches succeeding multiple successful matchers stipulate sorting
2771                            if ( outermost && !seed && setMatched.length > 0 &&
2772                                ( matchedCount + setMatchers.length ) > 1 ) {
2773
2774                                Sizzle.uniqueSort( results );
2775                            }
2776                        }
2777
2778                        // Override manipulation of globals by nested matchers
2779                        if ( outermost ) {
2780                            dirruns = dirrunsUnique;
2781                            outermostContext = contextBackup;
2782                        }
2783
2784                        return unmatched;
2785                    };
2786
2787                return bySet ?
2788                    markFunction( superMatcher ) :
2789                    superMatcher;
2790            }
2791
2792            compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2793                var i,
2794                    setMatchers = [],
2795                    elementMatchers = [],
2796                    cached = compilerCache[ selector + " " ];
2797
2798                if ( !cached ) {
2799
2800                    // Generate a function of recursive functions that can be used to check each element
2801                    if ( !match ) {
2802                        match = tokenize( selector );
2803                    }
2804                    i = match.length;
2805                    while ( i-- ) {
2806                        cached = matcherFromTokens( match[ i ] );
2807                        if ( cached[ expando ] ) {
2808                            setMatchers.push( cached );
2809                        } else {
2810                            elementMatchers.push( cached );
2811                        }
2812                    }
2813
2814                    // Cache the compiled function
2815                    cached = compilerCache(
2816                        selector,
2817                        matcherFromGroupMatchers( elementMatchers, setMatchers )
2818                    );
2819
2820                    // Save selector and tokenization
2821                    cached.selector = selector;
2822                }
2823                return cached;
2824            };
2825
2826            /**
2827             * A low-level selection function that works with Sizzle's compiled
2828             *  selector functions
2829             * @param {String|Function} selector A selector or a pre-compiled
2830             *  selector function built with Sizzle.compile
2831             * @param {Element} context
2832             * @param {Array} [results]
2833             * @param {Array} [seed] A set of elements to match against
2834             */
2835            select = Sizzle.select = function( selector, context, results, seed ) {
2836                var i, tokens, token, type, find,
2837                    compiled = typeof selector === "function" && selector,
2838                    match = !seed && tokenize( ( selector = compiled.selector || selector ) );
2839
2840                results = results || [];
2841
2842                // Try to minimize operations if there is only one selector in the list and no seed
2843                // (the latter of which guarantees us context)
2844                if ( match.length === 1 ) {
2845
2846                    // Reduce context if the leading compound selector is an ID
2847                    tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2848                    if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2849                        context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2850
2851                        context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
2852                            .replace( runescape, funescape ), context ) || [] )[ 0 ];
2853                        if ( !context ) {
2854                            return results;
2855
2856                            // Precompiled matchers will still verify ancestry, so step up a level
2857                        } else if ( compiled ) {
2858                            context = context.parentNode;
2859                        }
2860
2861                        selector = selector.slice( tokens.shift().value.length );
2862                    }
2863
2864                    // Fetch a seed set for right-to-left matching
2865                    i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
2866                    while ( i-- ) {
2867                        token = tokens[ i ];
2868
2869                        // Abort if we hit a combinator
2870                        if ( Expr.relative[ ( type = token.type ) ] ) {
2871                            break;
2872                        }
2873                        if ( ( find = Expr.find[ type ] ) ) {
2874
2875                            // Search, expanding context for leading sibling combinators
2876                            if ( ( seed = find(
2877                                token.matches[ 0 ].replace( runescape, funescape ),
2878                                rsibling.test( tokens[ 0 ].type ) && testC
vendor: 6,676 bytes, lines 2878-3082
2878ontext( context.parentNode ) ||
2879                                context
2880                            ) ) ) {
2881
2882                                // If seed is empty or no tokens remain, we can return early
2883                                tokens.splice( i, 1 );
2884                                selector = seed.length && toSelector( tokens );
2885                                if ( !selector ) {
2886                                    push.apply( results, seed );
2887                                    return results;
2888                                }
2889
2890                                break;
2891                            }
2892                        }
2893                    }
2894                }
2895
2896                // Compile and execute a filtering function if one is not provided
2897                // Provide `match` to avoid retokenization if we modified the selector above
2898                ( compiled || compile( selector, match ) )(
2899                    seed,
2900                    context,
2901                    !documentIsHTML,
2902                    results,
2903                    !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2904                );
2905                return results;
2906            };
2907
2908// One-time assignments
2909
2910// Sort stability
2911            support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2912
2913// Support: Chrome 14-35+
2914// Always assume duplicates if they aren't passed to the comparison function
2915            support.detectDuplicates = !!hasDuplicate;
2916
2917// Initialize against the default document
2918            setDocument();
2919
2920// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2921// Detached nodes confoundingly follow *each other*
2922            support.sortDetached = assert( function( el ) {
2923
2924                // Should return 1, but returns 4 (following)
2925                return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2926            } );
2927
2928// Support: IE<8
2929// Prevent attribute/property "interpolation"
2930// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2931            if ( !assert( function( el ) {
2932                el.innerHTML = "<a href='#'></a>";
2933                return el.firstChild.getAttribute( "href" ) === "#";
2934            } ) ) {
2935                addHandle( "type|href|height|width", function( elem, name, isXML ) {
2936                    if ( !isXML ) {
2937                        return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2938                    }
2939                } );
2940            }
2941
2942// Support: IE<9
2943// Use defaultValue in place of getAttribute("value")
2944            if ( !support.attributes || !assert( function( el ) {
2945                el.innerHTML = "<input/>";
2946                el.firstChild.setAttribute( "value", "" );
2947                return el.firstChild.getAttribute( "value" ) === "";
2948            } ) ) {
2949                addHandle( "value", function( elem, _name, isXML ) {
2950                    if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2951                        return elem.defaultValue;
2952                    }
2953                } );
2954            }
2955
2956// Support: IE<9
2957// Use getAttributeNode to fetch booleans when getAttribute lies
2958            if ( !assert( function( el ) {
2959                return el.getAttribute( "disabled" ) == null;
2960            } ) ) {
2961                addHandle( booleans, function( elem, name, isXML ) {
2962                    var val;
2963                    if ( !isXML ) {
2964                        return elem[ name ] === true ? name.toLowerCase() :
2965                            ( val = elem.getAttributeNode( name ) ) && val.specified ?
2966                                val.value :
2967                                null;
2968                    }
2969                } );
2970            }
2971
2972            return Sizzle;
2973
2974        } )( window );
2975
2976
2977
2978    jQuery.find = Sizzle;
2979    jQuery.expr = Sizzle.selectors;
2980
2981// Deprecated
2982    jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2983    jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2984    jQuery.text = Sizzle.getText;
2985    jQuery.isXMLDoc = Sizzle.isXML;
2986    jQuery.contains = Sizzle.contains;
2987    jQuery.escapeSelector = Sizzle.escape;
2988
2989
2990
2991
2992    var dir = function( elem, dir, until ) {
2993        var matched = [],
2994            truncate = until !== undefined;
2995
2996        while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2997            if ( elem.nodeType === 1 ) {
2998                if ( truncate && jQuery( elem ).is( until ) ) {
2999                    break;
3000                }
3001                matched.push( elem );
3002            }
3003        }
3004        return matched;
3005    };
3006
3007
3008    var siblings = function( n, elem ) {
3009        var matched = [];
3010
3011        for ( ; n; n = n.nextSibling ) {
3012            if ( n.nodeType === 1 && n !== elem ) {
3013                matched.push( n );
3014            }
3015        }
3016
3017        return matched;
3018    };
3019
3020
3021    var rneedsContext = jQuery.expr.match.needsContext;
3022
3023
3024
3025    function nodeName( elem, name ) {
3026
3027        return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
3028
3029    };
3030    var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
3031
3032
3033
3034// Implement the identical functionality for filter and not
3035    function winnow( elements, qualifier, not ) {
3036        if ( isFunction( qualifier ) ) {
3037            return jQuery.grep( elements, function( elem, i ) {
3038                return !!qualifier.call( elem, i, elem ) !== not;
3039            } );
3040        }
3041
3042        // Single element
3043        if ( qualifier.nodeType ) {
3044            return jQuery.grep( elements, function( elem ) {
3045                return ( elem === qualifier ) !== not;
3046            } );
3047        }
3048
3049        // Arraylike of elements (jQuery, arguments, Array)
3050        if ( typeof qualifier !== "string" ) {
3051            return jQuery.grep( elements, function( elem ) {
3052                return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
3053            } );
3054        }
3055
3056        // Filtered directly for both simple and complex selectors
3057        return jQuery.filter( qualifier, elements, not );
3058    }
3059
3060    jQuery.filter = function( expr, elems, not ) {
3061        var elem = elems[ 0 ];
3062
3063        if ( not ) {
3064            expr = ":not(" + expr + ")";
3065        }
3066
3067        if ( elems.length === 1 && elem.nodeType === 1 ) {
3068            return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
3069        }
3070
3071        return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
3072            return elem.nodeType === 1;
3073        } ) );
3074    };
3075
3076    jQuery.fn.extend( {
3077        find: function( selector ) {
3078            var i, ret,
3079                len = this.length,
3080                self = this;
3081
3082            if ( typeof selector !== "string" ) {
vendor: 6,677 bytes, lines 3083-3269
3083                return this.pushStack( jQuery( selector ).filter( function() {
3084                    for ( i = 0; i < len; i++ ) {
3085                        if ( jQuery.contains( self[ i ], this ) ) {
3086                            return true;
3087                        }
3088                    }
3089                } ) );
3090            }
3091
3092            ret = this.pushStack( [] );
3093
3094            for ( i = 0; i < len; i++ ) {
3095                jQuery.find( selector, self[ i ], ret );
3096            }
3097
3098            return len > 1 ? jQuery.uniqueSort( ret ) : ret;
3099        },
3100        filter: function( selector ) {
3101            return this.pushStack( winnow( this, selector || [], false ) );
3102        },
3103        not: function( selector ) {
3104            return this.pushStack( winnow( this, selector || [], true ) );
3105        },
3106        is: function( selector ) {
3107            return !!winnow(
3108                this,
3109
3110                // If this is a positional/relative selector, check membership in the returned set
3111                // so $("p:first").is("p:last") won't return true for a doc with two "p".
3112                typeof selector === "string" && rneedsContext.test( selector ) ?
3113                    jQuery( selector ) :
3114                    selector || [],
3115                false
3116            ).length;
3117        }
3118    } );
3119
3120
3121// Initialize a jQuery object
3122
3123
3124// A central reference to the root jQuery(document)
3125    var rootjQuery,
3126
3127        // A simple way to check for HTML strings
3128        // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
3129        // Strict HTML recognition (#11290: must start with <)
3130        // Shortcut simple #id case for speed
3131        rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
3132
3133        init = jQuery.fn.init = function( selector, context, root ) {
3134            var match, elem;
3135
3136            // HANDLE: $(""), $(null), $(undefined), $(false)
3137            if ( !selector ) {
3138                return this;
3139            }
3140
3141            // Method init() accepts an alternate rootjQuery
3142            // so migrate can support jQuery.sub (gh-2101)
3143            root = root || rootjQuery;
3144
3145            // Handle HTML strings
3146            if ( typeof selector === "string" ) {
3147                if ( selector[ 0 ] === "<" &&
3148                    selector[ selector.length - 1 ] === ">" &&
3149                    selector.length >= 3 ) {
3150
3151                    // Assume that strings that start and end with <> are HTML and skip the regex check
3152                    match = [ null, selector, null ];
3153
3154                } else {
3155                    match = rquickExpr.exec( selector );
3156                }
3157
3158                // Match html or make sure no context is specified for #id
3159                if ( match && ( match[ 1 ] || !context ) ) {
3160
3161                    // HANDLE: $(html) -> $(array)
3162                    if ( match[ 1 ] ) {
3163                        context = context instanceof jQuery ? context[ 0 ] : context;
3164
3165                        // Option to run scripts is true for back-compat
3166                        // Intentionally let the error be thrown if parseHTML is not present
3167                        jQuery.merge( this, jQuery.parseHTML(
3168                            match[ 1 ],
3169                            context && context.nodeType ? context.ownerDocument || context : document,
3170                            true
3171                        ) );
3172
3173                        // HANDLE: $(html, props)
3174                        if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
3175                            for ( match in context ) {
3176
3177                                // Properties of context are called as methods if possible
3178                                if ( isFunction( this[ match ] ) ) {
3179                                    this[ match ]( context[ match ] );
3180
3181                                    // ...and otherwise set as attributes
3182                                } else {
3183                                    this.attr( match, context[ match ] );
3184                                }
3185                            }
3186                        }
3187
3188                        return this;
3189
3190                        // HANDLE: $(#id)
3191                    } else {
3192                        elem = document.getElementById( match[ 2 ] );
3193
3194                        if ( elem ) {
3195
3196                            // Inject the element directly into the jQuery object
3197                            this[ 0 ] = elem;
3198                            this.length = 1;
3199                        }
3200                        return this;
3201                    }
3202
3203                    // HANDLE: $(expr, $(...))
3204                } else if ( !context || context.jquery ) {
3205                    return ( context || root ).find( selector );
3206
3207                    // HANDLE: $(expr, context)
3208                    // (which is just equivalent to: $(context).find(expr)
3209                } else {
3210                    return this.constructor( context ).find( selector );
3211                }
3212
3213                // HANDLE: $(DOMElement)
3214            } else if ( selector.nodeType ) {
3215                this[ 0 ] = selector;
3216                this.length = 1;
3217                return this;
3218
3219                // HANDLE: $(function)
3220                // Shortcut for document ready
3221            } else if ( isFunction( selector ) ) {
3222                return root.ready !== undefined ?
3223                    root.ready( selector ) :
3224
3225                    // Execute immediately if ready is not present
3226                    selector( jQuery );
3227            }
3228
3229            return jQuery.makeArray( selector, this );
3230        };
3231
3232// Give the init function the jQuery prototype for later instantiation
3233    init.prototype = jQuery.fn;
3234
3235// Initialize central reference
3236    rootjQuery = jQuery( document );
3237
3238
3239    var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3240
3241        // Methods guaranteed to produce a unique set when starting from a unique set
3242        guaranteedUnique = {
3243            children: true,
3244            contents: true,
3245            next: true,
3246            prev: true
3247        };
3248
3249    jQuery.fn.extend( {
3250        has: function( target ) {
3251            var targets = jQuery( target, this ),
3252                l = targets.length;
3253
3254            return this.filter( function() {
3255                var i = 0;
3256                for ( ; i < l; i++ ) {
3257                    if ( jQuery.contains( this, targets[ i ] ) ) {
3258                        return true;
3259                    }
3260                }
3261            } );
3262        },
3263
3264        closest: function( selectors, context ) {
3265            var cur,
3266                i = 0,
3267                l = this.length,
3268                matched = [],
3269                targets = typeof selectors !== "string" && jQuery( 
vendor: 4,293 bytes, lines 3269-3393
3269selectors );
3270
3271            // Positional selectors never match, since there's no _selection_ context
3272            if ( !rneedsContext.test( selectors ) ) {
3273                for ( ; i < l; i++ ) {
3274                    for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3275
3276                        // Always skip document fragments
3277                        if ( cur.nodeType < 11 && ( targets ?
3278                            targets.index( cur ) > -1 :
3279
3280                            // Don't pass non-elements to Sizzle
3281                            cur.nodeType === 1 &&
3282                            jQuery.find.matchesSelector( cur, selectors ) ) ) {
3283
3284                            matched.push( cur );
3285                            break;
3286                        }
3287                    }
3288                }
3289            }
3290
3291            return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3292        },
3293
3294        // Determine the position of an element within the set
3295        index: function( elem ) {
3296
3297            // No argument, return index in parent
3298            if ( !elem ) {
3299                return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3300            }
3301
3302            // Index in selector
3303            if ( typeof elem === "string" ) {
3304                return indexOf.call( jQuery( elem ), this[ 0 ] );
3305            }
3306
3307            // Locate the position of the desired element
3308            return indexOf.call( this,
3309
3310                // If it receives a jQuery object, the first element is used
3311                elem.jquery ? elem[ 0 ] : elem
3312            );
3313        },
3314
3315        add: function( selector, context ) {
3316            return this.pushStack(
3317                jQuery.uniqueSort(
3318                    jQuery.merge( this.get(), jQuery( selector, context ) )
3319                )
3320            );
3321        },
3322
3323        addBack: function( selector ) {
3324            return this.add( selector == null ?
3325                this.prevObject : this.prevObject.filter( selector )
3326            );
3327        }
3328    } );
3329
3330    function sibling( cur, dir ) {
3331        while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3332        return cur;
3333    }
3334
3335    jQuery.each( {
3336        parent: function( elem ) {
3337            var parent = elem.parentNode;
3338            return parent && parent.nodeType !== 11 ? parent : null;
3339        },
3340        parents: function( elem ) {
3341            return dir( elem, "parentNode" );
3342        },
3343        parentsUntil: function( elem, _i, until ) {
3344            return dir( elem, "parentNode", until );
3345        },
3346        next: function( elem ) {
3347            return sibling( elem, "nextSibling" );
3348        },
3349        prev: function( elem ) {
3350            return sibling( elem, "previousSibling" );
3351        },
3352        nextAll: function( elem ) {
3353            return dir( elem, "nextSibling" );
3354        },
3355        prevAll: function( elem ) {
3356            return dir( elem, "previousSibling" );
3357        },
3358        nextUntil: function( elem, _i, until ) {
3359            return dir( elem, "nextSibling", until );
3360        },
3361        prevUntil: function( elem, _i, until ) {
3362            return dir( elem, "previousSibling", until );
3363        },
3364        siblings: function( elem ) {
3365            return siblings( ( elem.parentNode || {} ).firstChild, elem );
3366        },
3367        children: function( elem ) {
3368            return siblings( elem.firstChild );
3369        },
3370        contents: function( elem ) {
3371            if ( elem.contentDocument != null &&
3372
3373                // Support: IE 11+
3374                // <object> elements with no `data` attribute has an object
3375                // `contentDocument` with a `null` prototype.
3376                getProto( elem.contentDocument ) ) {
3377
3378                return elem.contentDocument;
3379            }
3380
3381            // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3382            // Treat the template element as a regular one in browsers that
3383            // don't support it.
3384            if ( nodeName( elem, "template" ) ) {
3385                elem = elem.content || elem;
3386            }
3387
3388            return jQuery.merge( [], elem.childNodes );
3389        }
3390    }, function( name, fn ) {
3391        jQuery.fn[ name ] = function( until, selector ) {
3392            var matched = jQuery.map( this, fn, until );
3393
vendor: 35,395 bytes, lines 3394-4325
3394            if ( name.slice( -5 ) !== "Until" ) {
3395                selector = until;
3396            }
3397
3398            if ( selector && typeof selector === "string" ) {
3399                matched = jQuery.filter( selector, matched );
3400            }
3401
3402            if ( this.length > 1 ) {
3403
3404                // Remove duplicates
3405                if ( !guaranteedUnique[ name ] ) {
3406                    jQuery.uniqueSort( matched );
3407                }
3408
3409                // Reverse order for parents* and prev-derivatives
3410                if ( rparentsprev.test( name ) ) {
3411                    matched.reverse();
3412                }
3413            }
3414
3415            return this.pushStack( matched );
3416        };
3417    } );
3418    var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3419
3420
3421
3422// Convert String-formatted options into Object-formatted ones
3423    function createOptions( options ) {
3424        var object = {};
3425        jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3426            object[ flag ] = true;
3427        } );
3428        return object;
3429    }
3430
3431    /*
3432 * Create a callback list using the following parameters:
3433 *
3434 *	options: an optional list of space-separated options that will change how
3435 *			the callback list behaves or a more traditional option object
3436 *
3437 * By default a callback list will act like an event callback list and can be
3438 * "fired" multiple times.
3439 *
3440 * Possible options:
3441 *
3442 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3443 *
3444 *	memory:			will keep track of previous values and will call any callback added
3445 *					after the list has been fired right away with the latest "memorized"
3446 *					values (like a Deferred)
3447 *
3448 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3449 *
3450 *	stopOnFalse:	interrupt callings when a callback returns false
3451 *
3452 */
3453    jQuery.Callbacks = function( options ) {
3454
3455        // Convert options from String-formatted to Object-formatted if needed
3456        // (we check in cache first)
3457        options = typeof options === "string" ?
3458            createOptions( options ) :
3459            jQuery.extend( {}, options );
3460
3461        var // Flag to know if list is currently firing
3462            firing,
3463
3464            // Last fire value for non-forgettable lists
3465            memory,
3466
3467            // Flag to know if list was already fired
3468            fired,
3469
3470            // Flag to prevent firing
3471            locked,
3472
3473            // Actual callback list
3474            list = [],
3475
3476            // Queue of execution data for repeatable lists
3477            queue = [],
3478
3479            // Index of currently firing callback (modified by add/remove as needed)
3480            firingIndex = -1,
3481
3482            // Fire callbacks
3483            fire = function() {
3484
3485                // Enforce single-firing
3486                locked = locked || options.once;
3487
3488                // Execute callbacks for all pending executions,
3489                // respecting firingIndex overrides and runtime changes
3490                fired = firing = true;
3491                for ( ; queue.length; firingIndex = -1 ) {
3492                    memory = queue.shift();
3493                    while ( ++firingIndex < list.length ) {
3494
3495                        // Run callback and check for early termination
3496                        if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3497                            options.stopOnFalse ) {
3498
3499                            // Jump to end and forget the data so .add doesn't re-fire
3500                            firingIndex = list.length;
3501                            memory = false;
3502                        }
3503                    }
3504                }
3505
3506                // Forget the data if we're done with it
3507                if ( !options.memory ) {
3508                    memory = false;
3509                }
3510
3511                firing = false;
3512
3513                // Clean up if we're done firing for good
3514                if ( locked ) {
3515
3516                    // Keep an empty list if we have data for future add calls
3517                    if ( memory ) {
3518                        list = [];
3519
3520                        // Otherwise, this object is spent
3521                    } else {
3522                        list = "";
3523                    }
3524                }
3525            },
3526
3527            // Actual Callbacks object
3528            self = {
3529
3530                // Add a callback or a collection of callbacks to the list
3531                add: function() {
3532                    if ( list ) {
3533
3534                        // If we have memory from a past run, we should fire after adding
3535                        if ( memory && !firing ) {
3536                            firingIndex = list.length - 1;
3537                            queue.push( memory );
3538                        }
3539
3540                        ( function add( args ) {
3541                            jQuery.each( args, function( _, arg ) {
3542                                if ( isFunction( arg ) ) {
3543                                    if ( !options.unique || !self.has( arg ) ) {
3544                                        list.push( arg );
3545                                    }
3546                                } else if ( arg && arg.length && toType( arg ) !== "string" ) {
3547
3548                                    // Inspect recursively
3549                                    add( arg );
3550                                }
3551                            } );
3552                        } )( arguments );
3553
3554                        if ( memory && !firing ) {
3555                            fire();
3556                        }
3557                    }
3558                    return this;
3559                },
3560
3561                // Remove a callback from the list
3562                remove: function() {
3563                    jQuery.each( arguments, function( _, arg ) {
3564                        var index;
3565                        while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3566                            list.splice( index, 1 );
3567
3568                            // Handle firing indexes
3569                            if ( index <= firingIndex ) {
3570                                firingIndex--;
3571                            }
3572                        }
3573                    } );
3574                    return this;
3575                },
3576
3577                // Check if a given callback is in the list.
3578                // If no argument is given, return whether or not list has callbacks attached.
3579                has: function( fn ) {
3580                    return fn ?
3581                        jQuery.inArray( fn, list ) > -1 :
3582                        list.length > 0;
3583                },
3584
3585                // Remove all callbacks from the list
3586                empty: function() {
3587                    if ( list ) {
3588                        list = [];
3589                    }
3590                    return this;
3591                },
3592
3593                // Disable .fire and .add
3594                // Abort any current/pending executions
3595                // Clear all callbacks and values
3596                disable: function() {
3597                    locked = queue = [];
3598                    list = memory = "";
3599                    return this;
3600                },
3601                disabled: function() {
3602                    return !list;
3603                },
3604
3605                // Disable .fire
3606                // Also disable .add unless we have memory (since it would have no effect)
3607                // Abort any pending executions
3608                lock: function() {
3609                    locked = queue = [];
3610                    if ( !memory && !firing ) {
3611                        list = memory = "";
3612                    }
3613                    return this;
3614                },
3615                locked: function() {
3616                    return !!locked;
3617                },
3618
3619                // Call all callbacks with the given context and arguments
3620                fireWith: function( context, args ) {
3621                    if ( !locked ) {
3622                        args = args || [];
3623                        args = [ context, args.slice ? args.slice() : args ];
3624                        queue.push( args );
3625                        if ( !firing ) {
3626                            fire();
3627                        }
3628                    }
3629                    return this;
3630                },
3631
3632                // Call all the callbacks with the given arguments
3633                fire: function() {
3634                    self.fireWith( this, arguments );
3635                    return this;
3636                },
3637
3638                // To know if the callbacks have already been called at least once
3639                fired: function() {
3640                    return !!fired;
3641                }
3642            };
3643
3644        return self;
3645    };
3646
3647
3648    function Identity( v ) {
3649        return v;
3650    }
3651    function Thrower( ex ) {
3652        throw ex;
3653    }
3654
3655    function adoptValue( value, resolve, reject, noValue ) {
3656        var method;
3657
3658        try {
3659
3660            // Check for promise aspect first to privilege synchronous behavior
3661            if ( value && isFunction( ( method = value.promise ) ) ) {
3662                method.call( value ).done( resolve ).fail( reject );
3663
3664                // Other thenables
3665            } else if ( value && isFunction( ( method = value.then ) ) ) {
3666                method.call( value, resolve, reject );
3667
3668                // Other non-thenables
3669            } else {
3670
3671                // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3672                // * false: [ value ].slice( 0 ) => resolve( value )
3673                // * true: [ value ].slice( 1 ) => resolve()
3674                resolve.apply( undefined, [ value ].slice( noValue ) );
3675            }
3676
3677            // For Promises/A+, convert exceptions into rejections
3678            // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3679            // Deferred#then to conditionally suppress rejection.
3680        } catch ( value ) {
3681
3682            // Support: Android 4.0 only
3683            // Strict mode functions invoked without .call/.apply get global-object context
3684            reject.apply( undefined, [ value ] );
3685        }
3686    }
3687
3688    jQuery.extend( {
3689
3690        Deferred: function( func ) {
3691            var tuples = [
3692
3693                    // action, add listener, callbacks,
3694                    // ... .then handlers, argument index, [final state]
3695                    [ "notify", "progress", jQuery.Callbacks( "memory" ),
3696                        jQuery.Callbacks( "memory" ), 2 ],
3697                    [ "resolve", "done", jQuery.Callbacks( "once memory" ),
3698                        jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3699                    [ "reject", "fail", jQuery.Callbacks( "once memory" ),
3700                        jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3701                ],
3702                state = "pending",
3703                promise = {
3704                    state: function() {
3705                        return state;
3706                    },
3707                    always: function() {
3708                        deferred.done( arguments ).fail( arguments );
3709                        return this;
3710                    },
3711                    "catch": function( fn ) {
3712                        return promise.then( null, fn );
3713                    },
3714
3715                    // Keep pipe for back-compat
3716                    pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3717                        var fns = arguments;
3718
3719                        return jQuery.Deferred( function( newDefer ) {
3720                            jQuery.each( tuples, function( _i, tuple ) {
3721
3722                                // Map tuples (progress, done, fail) to arguments (done, fail, progress)
3723                                var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3724
3725                                // deferred.progress(function() { bind to newDefer or newDefer.notify })
3726                                // deferred.done(function() { bind to newDefer or newDefer.resolve })
3727                                // deferred.fail(function() { bind to newDefer or newDefer.reject })
3728                                deferred[ tuple[ 1 ] ]( function() {
3729                                    var returned = fn && fn.apply( this, arguments );
3730                                    if ( returned && isFunction( returned.promise ) ) {
3731                                        returned.promise()
3732                                            .progress( newDefer.notify )
3733                                            .done( newDefer.resolve )
3734                                            .fail( newDefer.reject );
3735                                    } else {
3736                                        newDefer[ tuple[ 0 ] + "With" ](
3737                                            this,
3738                                            fn ? [ returned ] : arguments
3739                                        );
3740                                    }
3741                                } );
3742                            } );
3743                            fns = null;
3744                        } ).promise();
3745                    },
3746                    then: function( onFulfilled, onRejected, onProgress ) {
3747                        var maxDepth = 0;
3748                        function resolve( depth, deferred, handler, special ) {
3749                            return function() {
3750                                var that = this,
3751                                    args = arguments,
3752                                    mightThrow = function() {
3753                                        var returned, then;
3754
3755                                        // Support: Promises/A+ section 2.3.3.3.3
3756                                        // https://promisesaplus.com/#point-59
3757                                        // Ignore double-resolution attempts
3758                                        if ( depth < maxDepth ) {
3759                                            return;
3760                                        }
3761
3762                                        returned = handler.apply( that, args );
3763
3764                                        // Support: Promises/A+ section 2.3.1
3765                                        // https://promisesaplus.com/#point-48
3766                                        if ( returned === deferred.promise() ) {
3767                                            throw new TypeError( "Thenable self-resolution" );
3768                                        }
3769
3770                                        // Support: Promises/A+ sections 2.3.3.1, 3.5
3771                                        // https://promisesaplus.com/#point-54
3772                                        // https://promisesaplus.com/#point-75
3773                                        // Retrieve `then` only once
3774                                        then = returned &&
3775
3776                                            // Support: Promises/A+ section 2.3.4
3777                                            // https://promisesaplus.com/#point-64
3778                                            // Only check objects and functions for thenability
3779                                            ( typeof returned === "object" ||
3780                                                typeof returned === "function" ) &&
3781                                            returned.then;
3782
3783                                        // Handle a returned thenable
3784                                        if ( isFunction( then ) ) {
3785
3786                                            // Special processors (notify) just wait for resolution
3787                                            if ( special ) {
3788                                                then.call(
3789                                                    returned,
3790                                                    resolve( maxDepth, deferred, Identity, special ),
3791                                                    resolve( maxDepth, deferred, Thrower, special )
3792                                                );
3793
3794                                                // Normal processors (resolve) also hook into progress
3795                                            } else {
3796
3797                                                // ...and disregard older resolution values
3798                                                maxDepth++;
3799
3800                                                then.call(
3801                                                    returned,
3802                                                    resolve( maxDepth, deferred, Identity, special ),
3803                                                    resolve( maxDepth, deferred, Thrower, special ),
3804                                                    resolve( maxDepth, deferred, Identity,
3805                                                        deferred.notifyWith )
3806                                                );
3807                                            }
3808
3809                                            // Handle all other returned values
3810                                        } else {
3811
3812                                            // Only substitute handlers pass on context
3813                                            // and multiple values (non-spec behavior)
3814                                            if ( handler !== Identity ) {
3815                                                that = undefined;
3816                                                args = [ returned ];
3817                                            }
3818
3819                                            // Process the value(s)
3820                                            // Default process is resolve
3821                                            ( special || deferred.resolveWith )( that, args );
3822                                        }
3823                                    },
3824
3825                                    // Only normal processors (resolve) catch and reject exceptions
3826                                    process = special ?
3827                                        mightThrow :
3828                                        function() {
3829                                            try {
3830                                                mightThrow();
3831                                            } catch ( e ) {
3832
3833                                                if ( jQuery.Deferred.exceptionHook ) {
3834                                                    jQuery.Deferred.exceptionHook( e,
3835                                                        process.stackTrace );
3836                                                }
3837
3838                                                // Support: Promises/A+ section 2.3.3.3.4.1
3839                                                // https://promisesaplus.com/#point-61
3840                                                // Ignore post-resolution exceptions
3841                                                if ( depth + 1 >= maxDepth ) {
3842
3843                                                    // Only substitute handlers pass on context
3844                                                    // and multiple values (non-spec behavior)
3845                                                    if ( handler !== Thrower ) {
3846                                                        that = undefined;
3847                                                        args = [ e ];
3848                                                    }
3849
3850                                                    deferred.rejectWith( that, args );
3851                                                }
3852                                            }
3853                                        };
3854
3855                                // Support: Promises/A+ section 2.3.3.3.1
3856                                // https://promisesaplus.com/#point-57
3857                                // Re-resolve promises immediately to dodge false rejection from
3858                                // subsequent errors
3859                                if ( depth ) {
3860                                    process();
3861                                } else {
3862
3863                                    // Call an optional hook to record the stack, in case of exception
3864                                    // since it's otherwise lost when execution goes async
3865                                    if ( jQuery.Deferred.getStackHook ) {
3866                                        process.stackTrace = jQuery.Deferred.getStackHook();
3867                                    }
3868                                    window.setTimeout( process );
3869                                }
3870                            };
3871                        }
3872
3873                        return jQuery.Deferred( function( newDefer ) {
3874
3875                            // progress_handlers.add( ... )
3876                            tuples[ 0 ][ 3 ].add(
3877                                resolve(
3878                                    0,
3879                                    newDefer,
3880                                    isFunction( onProgress ) ?
3881                                        onProgress :
3882                                        Identity,
3883                                    newDefer.notifyWith
3884                                )
3885                            );
3886
3887                            // fulfilled_handlers.add( ... )
3888                            tuples[ 1 ][ 3 ].add(
3889                                resolve(
3890                                    0,
3891                                    newDefer,
3892                                    isFunction( onFulfilled ) ?
3893                                        onFulfilled :
3894                                        Identity
3895                                )
3896                            );
3897
3898                            // rejected_handlers.add( ... )
3899                            tuples[ 2 ][ 3 ].add(
3900                                resolve(
3901                                    0,
3902                                    newDefer,
3903                                    isFunction( onRejected ) ?
3904                                        onRejected :
3905                                        Thrower
3906                                )
3907                            );
3908                        } ).promise();
3909                    },
3910
3911                    // Get a promise for this deferred
3912                    // If obj is provided, the promise aspect is added to the object
3913                    promise: function( obj ) {
3914                        return obj != null ? jQuery.extend( obj, promise ) : promise;
3915                    }
3916                },
3917                deferred = {};
3918
3919            // Add list-specific methods
3920            jQuery.each( tuples, function( i, tuple ) {
3921                var list = tuple[ 2 ],
3922                    stateString = tuple[ 5 ];
3923
3924                // promise.progress = list.add
3925                // promise.done = list.add
3926                // promise.fail = list.add
3927                promise[ tuple[ 1 ] ] = list.add;
3928
3929                // Handle state
3930                if ( stateString ) {
3931                    list.add(
3932                        function() {
3933
3934                            // state = "resolved" (i.e., fulfilled)
3935                            // state = "rejected"
3936                            state = stateString;
3937                        },
3938
3939                        // rejected_callbacks.disable
3940                        // fulfilled_callbacks.disable
3941                        tuples[ 3 - i ][ 2 ].disable,
3942
3943                        // rejected_handlers.disable
3944                        // fulfilled_handlers.disable
3945                        tuples[ 3 - i ][ 3 ].disable,
3946
3947                        // progress_callbacks.lock
3948                        tuples[ 0 ][ 2 ].lock,
3949
3950                        // progress_handlers.lock
3951                        tuples[ 0 ][ 3 ].lock
3952                    );
3953                }
3954
3955                // progress_handlers.fire
3956                // fulfilled_handlers.fire
3957                // rejected_handlers.fire
3958                list.add( tuple[ 3 ].fire );
3959
3960                // deferred.notify = function() { deferred.notifyWith(...) }
3961                // deferred.resolve = function() { deferred.resolveWith(...) }
3962                // deferred.reject = function() { deferred.rejectWith(...) }
3963                deferred[ tuple[ 0 ] ] = function() {
3964                    deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3965                    return this;
3966                };
3967
3968                // deferred.notifyWith = list.fireWith
3969                // deferred.resolveWith = list.fireWith
3970                // deferred.rejectWith = list.fireWith
3971                deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3972            } );
3973
3974            // Make the deferred a promise
3975            promise.promise( deferred );
3976
3977            // Call given func if any
3978            if ( func ) {
3979                func.call( deferred, deferred );
3980            }
3981
3982            // All done!
3983            return deferred;
3984        },
3985
3986        // Deferred helper
3987        when: function( singleValue ) {
3988            var
3989
3990                // count of uncompleted subordinates
3991                remaining = arguments.length,
3992
3993                // count of unprocessed arguments
3994                i = remaining,
3995
3996                // subordinate fulfillment data
3997                resolveContexts = Array( i ),
3998                resolveValues = slice.call( arguments ),
3999
4000                // the master Deferred
4001                master = jQuery.Deferred(),
4002
4003                // subordinate callback factory
4004                updateFunc = function( i ) {
4005                    return function( value ) {
4006                        resolveContexts[ i ] = this;
4007                        resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
4008                        if ( !( --remaining ) ) {
4009                            master.resolveWith( resolveContexts, resolveValues );
4010                        }
4011                    };
4012                };
4013
4014            // Single- and empty arguments are adopted like Promise.resolve
4015            if ( remaining <= 1 ) {
4016                adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
4017                    !remaining );
4018
4019                // Use .then() to unwrap secondary thenables (cf. gh-3000)
4020                if ( master.state() === "pending" ||
4021                    isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4022
4023                    return master.then();
4024                }
4025            }
4026
4027            // Multiple arguments are aggregated like Promise.all array elements
4028            while ( i-- ) {
4029                adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
4030            }
4031
4032            return master.promise();
4033        }
4034    } );
4035
4036
4037// These usually indicate a programmer mistake during development,
4038// warn about them ASAP rather than swallowing them by default.
4039    var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
4040
4041    jQuery.Deferred.exceptionHook = function( error, stack ) {
4042
4043        // Support: IE 8 - 9 only
4044        // Console exists when dev tools are open, which can happen at any time
4045        if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
4046            window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
4047        }
4048    };
4049
4050
4051
4052
4053    jQuery.readyException = function( error ) {
4054        window.setTimeout( function() {
4055            throw error;
4056        } );
4057    };
4058
4059
4060
4061
4062// The deferred used on DOM ready
4063    var readyList = jQuery.Deferred();
4064
4065    jQuery.fn.ready = function( fn ) {
4066
4067        readyList
4068            .then( fn )
4069
4070            // Wrap jQuery.readyException in a function so that the lookup
4071            // happens at the time of error handling instead of callback
4072            // registration.
4073            .catch( function( error ) {
4074                jQuery.readyException( error );
4075            } );
4076
4077        return this;
4078    };
4079
4080    jQuery.extend( {
4081
4082        // Is the DOM ready to be used? Set to true once it occurs.
4083        isReady: false,
4084
4085        // A counter to track how many items to wait for before
4086        // the ready event fires. See #6781
4087        readyWait: 1,
4088
4089        // Handle when the DOM is ready
4090        ready: function( wait ) {
4091
4092            // Abort if there are pending holds or we're already ready
4093            if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
4094                return;
4095            }
4096
4097            // Remember that the DOM is ready
4098            jQuery.isReady = true;
4099
4100            // If a normal DOM Ready event fired, decrement, and wait if need be
4101            if ( wait !== true && --jQuery.readyWait > 0 ) {
4102                return;
4103            }
4104
4105            // If there are functions bound, to execute
4106            readyList.resolveWith( document, [ jQuery ] );
4107        }
4108    } );
4109
4110    jQuery.ready.then = readyList.then;
4111
4112// The ready event handler and self cleanup method
4113    function completed() {
4114        document.removeEventListener( "DOMContentLoaded", completed );
4115        window.removeEventListener( "load", completed );
4116        jQuery.ready();
4117    }
4118
4119// Catch cases where $(document).ready() is called
4120// after the browser event has already occurred.
4121// Support: IE <=9 - 10 only
4122// Older IE sometimes signals "interactive" too soon
4123    if ( document.readyState === "complete" ||
4124        ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
4125
4126        // Handle it asynchronously to allow scripts the opportunity to delay ready
4127        window.setTimeout( jQuery.ready );
4128
4129    } else {
4130
4131        // Use the handy event callback
4132        document.addEventListener( "DOMContentLoaded", completed );
4133
4134        // A fallback to window.onload, that will always work
4135        window.addEventListener( "load", completed );
4136    }
4137
4138
4139
4140
4141// Multifunctional method to get and set values of a collection
4142// The value/s can optionally be executed if it's a function
4143    var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4144        var i = 0,
4145            len = elems.length,
4146            bulk = key == null;
4147
4148        // Sets many values
4149        if ( toType( key ) === "object" ) {
4150            chainable = true;
4151            for ( i in key ) {
4152                access( elems, fn, i, key[ i ], true, emptyGet, raw );
4153            }
4154
4155            // Sets one value
4156        } else if ( value !== undefined ) {
4157            chainable = true;
4158
4159            if ( !isFunction( value ) ) {
4160                raw = true;
4161            }
4162
4163            if ( bulk ) {
4164
4165                // Bulk operations run against the entire set
4166                if ( raw ) {
4167                    fn.call( elems, value );
4168                    fn = null;
4169
4170                    // ...except when executing function values
4171                } else {
4172                    bulk = fn;
4173                    fn = function( elem, _key, value ) {
4174                        return bulk.call( jQuery( elem ), value );
4175                    };
4176                }
4177            }
4178
4179            if ( fn ) {
4180                for ( ; i < len; i++ ) {
4181                    fn(
4182                        elems[ i ], key, raw ?
4183                            value :
4184                            value.call( elems[ i ], i, fn( elems[ i ], key ) )
4185                    );
4186                }
4187            }
4188        }
4189
4190        if ( chainable ) {
4191            return elems;
4192        }
4193
4194        // Gets
4195        if ( bulk ) {
4196            return fn.call( elems );
4197        }
4198
4199        return len ? fn( elems[ 0 ], key ) : emptyGet;
4200    };
4201
4202
4203// Matches dashed string for camelizing
4204    var rmsPrefix = /^-ms-/,
4205        rdashAlpha = /-([a-z])/g;
4206
4207// Used by camelCase as callback to replace()
4208    function fcamelCase( _all, letter ) {
4209        return letter.toUpperCase();
4210    }
4211
4212// Convert dashed to camelCase; used by the css and data modules
4213// Support: IE <=9 - 11, Edge 12 - 15
4214// Microsoft forgot to hump their vendor prefix (#9572)
4215    function camelCase( string ) {
4216        return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4217    }
4218    var acceptData = function( owner ) {
4219
4220        // Accepts only:
4221        //  - Node
4222        //    - Node.ELEMENT_NODE
4223        //    - Node.DOCUMENT_NODE
4224        //  - Object
4225        //    - Any
4226        return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4227    };
4228
4229
4230
4231
4232    function Data() {
4233        this.expando = jQuery.expando + Data.uid++;
4234    }
4235
4236    Data.uid = 1;
4237
4238    Data.prototype = {
4239
4240        cache: function( owner ) {
4241
4242            // Check if the owner object already has a cache
4243            var value = owner[ this.expando ];
4244
4245            // If not, create one
4246            if ( !value ) {
4247                value = {};
4248
4249                // We can accept data for non-element nodes in modern browsers,
4250                // but we should not, see #8335.
4251                // Always return an empty object.
4252                if ( acceptData( owner ) ) {
4253
4254                    // If it is a node unlikely to be stringify-ed or looped over
4255                    // use plain assignment
4256                    if ( owner.nodeType ) {
4257                        owner[ this.expando ] = value;
4258
4259                        // Otherwise secure it in a non-enumerable property
4260                        // configurable must be true to allow the property to be
4261                        // deleted when data is removed
4262                    } else {
4263                        Object.defineProperty( owner, this.expando, {
4264                            value: value,
4265                            configurable: true
4266                        } );
4267                    }
4268                }
4269            }
4270
4271            return value;
4272        },
4273        set: function( owner, data, value ) {
4274            var prop,
4275                cache = this.cache( owner );
4276
4277            // Handle: [ owner, key, value ] args
4278            // Always use camelCase key (gh-2257)
4279            if ( typeof data === "string" ) {
4280                cache[ camelCase( data ) ] = value;
4281
4282                // Handle: [ owner, { properties } ] args
4283            } else {
4284
4285                // Copy the properties one-by-one to the cache object
4286                for ( prop in data ) {
4287                    cache[ camelCase( prop ) ] = data[ prop ];
4288                }
4289            }
4290            return cache;
4291        },
4292        get: function( owner, key ) {
4293            return key === undefined ?
4294                this.cache( owner ) :
4295
4296                // Always use camelCase key (gh-2257)
4297                owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4298        },
4299        access: function( owner, key, value ) {
4300
4301            // In cases where either:
4302            //
4303            //   1. No key was specified
4304            //   2. A string key was specified, but no value provided
4305            //
4306            // Take the "read" path and allow the get method to determine
4307            // which value to return, respectively either:
4308            //
4309            //   1. The entire cache object
4310            //   2. The data stored at the key
4311            //
4312            if ( key === undefined ||
4313                ( ( key && typeof key === "string" ) && value === undefined ) ) {
4314
4315                return this.get( owner, key );
4316            }
4317
4318            // When the key is not a string, or both a key and value
4319            // are specified, set or extend (existing objects) with either:
4320            //
4321            //   1. An object of properties
4322            //   2. A key and value
4323            //
4324            this.set( owner, key, value );
4325
vendor: 9,776 bytes, lines 4326-4616
4326            // Since the "set" path can have two possible entry points
4327            // return the expected data based on which path was taken[*]
4328            return value !== undefined ? value : key;
4329        },
4330        remove: function( owner, key ) {
4331            var i,
4332                cache = owner[ this.expando ];
4333
4334            if ( cache === undefined ) {
4335                return;
4336            }
4337
4338            if ( key !== undefined ) {
4339
4340                // Support array or space separated string of keys
4341                if ( Array.isArray( key ) ) {
4342
4343                    // If key is an array of keys...
4344                    // We always set camelCase keys, so remove that.
4345                    key = key.map( camelCase );
4346                } else {
4347                    key = camelCase( key );
4348
4349                    // If a key with the spaces exists, use it.
4350                    // Otherwise, create an array by matching non-whitespace
4351                    key = key in cache ?
4352                        [ key ] :
4353                        ( key.match( rnothtmlwhite ) || [] );
4354                }
4355
4356                i = key.length;
4357
4358                while ( i-- ) {
4359                    delete cache[ key[ i ] ];
4360                }
4361            }
4362
4363            // Remove the expando if there's no more data
4364            if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4365
4366                // Support: Chrome <=35 - 45
4367                // Webkit & Blink performance suffers when deleting properties
4368                // from DOM nodes, so set to undefined instead
4369                // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4370                if ( owner.nodeType ) {
4371                    owner[ this.expando ] = undefined;
4372                } else {
4373                    delete owner[ this.expando ];
4374                }
4375            }
4376        },
4377        hasData: function( owner ) {
4378            var cache = owner[ this.expando ];
4379            return cache !== undefined && !jQuery.isEmptyObject( cache );
4380        }
4381    };
4382    var dataPriv = new Data();
4383
4384    var dataUser = new Data();
4385
4386
4387
4388//	Implementation Summary
4389//
4390//	1. Enforce API surface and semantic compatibility with 1.9.x branch
4391//	2. Improve the module's maintainability by reducing the storage
4392//		paths to a single mechanism.
4393//	3. Use the same single mechanism to support "private" and "user" data.
4394//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4395//	5. Avoid exposing implementation details on user objects (eg. expando properties)
4396//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
4397
4398    var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4399        rmultiDash = /[A-Z]/g;
4400
4401    function getData( data ) {
4402        if ( data === "true" ) {
4403            return true;
4404        }
4405
4406        if ( data === "false" ) {
4407            return false;
4408        }
4409
4410        if ( data === "null" ) {
4411            return null;
4412        }
4413
4414        // Only convert to a number if it doesn't change the string
4415        if ( data === +data + "" ) {
4416            return +data;
4417        }
4418
4419        if ( rbrace.test( data ) ) {
4420            return JSON.parse( data );
4421        }
4422
4423        return data;
4424    }
4425
4426    function dataAttr( elem, key, data ) {
4427        var name;
4428
4429        // If nothing was found internally, try to fetch any
4430        // data from the HTML5 data-* attribute
4431        if ( data === undefined && elem.nodeType === 1 ) {
4432            name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4433            data = elem.getAttribute( name );
4434
4435            if ( typeof data === "string" ) {
4436                try {
4437                    data = getData( data );
4438                } catch ( e ) {}
4439
4440                // Make sure we set the data so it isn't changed later
4441                dataUser.set( elem, key, data );
4442            } else {
4443                data = undefined;
4444            }
4445        }
4446        return data;
4447    }
4448
4449    jQuery.extend( {
4450        hasData: function( elem ) {
4451            return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4452        },
4453
4454        data: function( elem, name, data ) {
4455            return dataUser.access( elem, name, data );
4456        },
4457
4458        removeData: function( elem, name ) {
4459            dataUser.remove( elem, name );
4460        },
4461
4462        // TODO: Now that all calls to _data and _removeData have been replaced
4463        // with direct calls to dataPriv methods, these can be deprecated.
4464        _data: function( elem, name, data ) {
4465            return dataPriv.access( elem, name, data );
4466        },
4467
4468        _removeData: function( elem, name ) {
4469            dataPriv.remove( elem, name );
4470        }
4471    } );
4472
4473    jQuery.fn.extend( {
4474        data: function( key, value ) {
4475            var i, name, data,
4476                elem = this[ 0 ],
4477                attrs = elem && elem.attributes;
4478
4479            // Gets all values
4480            if ( key === undefined ) {
4481                if ( this.length ) {
4482                    data = dataUser.get( elem );
4483
4484                    if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4485                        i = attrs.length;
4486                        while ( i-- ) {
4487
4488                            // Support: IE 11 only
4489                            // The attrs elements can be null (#14894)
4490                            if ( attrs[ i ] ) {
4491                                name = attrs[ i ].name;
4492                                if ( name.indexOf( "data-" ) === 0 ) {
4493                                    name = camelCase( name.slice( 5 ) );
4494                                    dataAttr( elem, name, data[ name ] );
4495                                }
4496                            }
4497                        }
4498                        dataPriv.set( elem, "hasDataAttrs", true );
4499                    }
4500                }
4501
4502                return data;
4503            }
4504
4505            // Sets multiple values
4506            if ( typeof key === "object" ) {
4507                return this.each( function() {
4508                    dataUser.set( this, key );
4509                } );
4510            }
4511
4512            return access( this, function( value ) {
4513                var data;
4514
4515                // The calling jQuery object (element matches) is not empty
4516                // (and therefore has an element appears at this[ 0 ]) and the
4517                // `value` parameter was not undefined. An empty jQuery object
4518                // will result in `undefined` for elem = this[ 0 ] which will
4519                // throw an exception if an attempt to read a data cache is made.
4520                if ( elem && value === undefined ) {
4521
4522                    // Attempt to get data from the cache
4523                    // The key will always be camelCased in Data
4524                    data = dataUser.get( elem, key );
4525                    if ( data !== undefined ) {
4526                        return data;
4527                    }
4528
4529                    // Attempt to "discover" the data in
4530                    // HTML5 custom data-* attrs
4531                    data = dataAttr( elem, key );
4532                    if ( data !== undefined ) {
4533                        return data;
4534                    }
4535
4536                    // We tried really hard, but the data doesn't exist.
4537                    return;
4538                }
4539
4540                // Set the data...
4541                this.each( function() {
4542
4543                    // We always store the camelCased key
4544                    dataUser.set( this, key, value );
4545                } );
4546            }, null, value, arguments.length > 1, null, true );
4547        },
4548
4549        removeData: function( key ) {
4550            return this.each( function() {
4551                dataUser.remove( this, key );
4552            } );
4553        }
4554    } );
4555
4556
4557    jQuery.extend( {
4558        queue: function( elem, type, data ) {
4559            var queue;
4560
4561            if ( elem ) {
4562                type = ( type || "fx" ) + "queue";
4563                queue = dataPriv.get( elem, type );
4564
4565                // Speed up dequeue by getting out quickly if this is just a lookup
4566                if ( data ) {
4567                    if ( !queue || Array.isArray( data ) ) {
4568                        queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4569                    } else {
4570                        queue.push( data );
4571                    }
4572                }
4573                return queue || [];
4574            }
4575        },
4576
4577        dequeue: function( elem, type ) {
4578            type = type || "fx";
4579
4580            var queue = jQuery.queue( elem, type ),
4581                startLength = queue.length,
4582                fn = queue.shift(),
4583                hooks = jQuery._queueHooks( elem, type ),
4584                next = function() {
4585                    jQuery.dequeue( elem, type );
4586                };
4587
4588            // If the fx queue is dequeued, always remove the progress sentinel
4589            if ( fn === "inprogress" ) {
4590                fn = queue.shift();
4591                startLength--;
4592            }
4593
4594            if ( fn ) {
4595
4596                // Add a progress sentinel to prevent the fx queue from being
4597                // automatically dequeued
4598                if ( type === "fx" ) {
4599                    queue.unshift( "inprogress" );
4600                }
4601
4602                // Clear up the last queue stop function
4603                delete hooks.stop;
4604                fn.call( elem, next, hooks );
4605            }
4606
4607            if ( !startLength && hooks ) {
4608                hooks.empty.fire();
4609            }
4610        },
4611
4612        // Not public - generate a queueHooks object, or return the current one
4613        _queueHooks: function( elem, type ) {
4614            var key = type + "queueHooks";
4615            return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4616                empty: jQuery.Callbacks( "once memory" ).add( function() {
vendor: 14,054 bytes, lines 4617-5039
4617                    dataPriv.remove( elem, [ type + "queue", key ] );
4618                } )
4619            } );
4620        }
4621    } );
4622
4623    jQuery.fn.extend( {
4624        queue: function( type, data ) {
4625            var setter = 2;
4626
4627            if ( typeof type !== "string" ) {
4628                data = type;
4629                type = "fx";
4630                setter--;
4631            }
4632
4633            if ( arguments.length < setter ) {
4634                return jQuery.queue( this[ 0 ], type );
4635            }
4636
4637            return data === undefined ?
4638                this :
4639                this.each( function() {
4640                    var queue = jQuery.queue( this, type, data );
4641
4642                    // Ensure a hooks for this queue
4643                    jQuery._queueHooks( this, type );
4644
4645                    if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4646                        jQuery.dequeue( this, type );
4647                    }
4648                } );
4649        },
4650        dequeue: function( type ) {
4651            return this.each( function() {
4652                jQuery.dequeue( this, type );
4653            } );
4654        },
4655        clearQueue: function( type ) {
4656            return this.queue( type || "fx", [] );
4657        },
4658
4659        // Get a promise resolved when queues of a certain type
4660        // are emptied (fx is the type by default)
4661        promise: function( type, obj ) {
4662            var tmp,
4663                count = 1,
4664                defer = jQuery.Deferred(),
4665                elements = this,
4666                i = this.length,
4667                resolve = function() {
4668                    if ( !( --count ) ) {
4669                        defer.resolveWith( elements, [ elements ] );
4670                    }
4671                };
4672
4673            if ( typeof type !== "string" ) {
4674                obj = type;
4675                type = undefined;
4676            }
4677            type = type || "fx";
4678
4679            while ( i-- ) {
4680                tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4681                if ( tmp && tmp.empty ) {
4682                    count++;
4683                    tmp.empty.add( resolve );
4684                }
4685            }
4686            resolve();
4687            return defer.promise( obj );
4688        }
4689    } );
4690    var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4691
4692    var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4693
4694
4695    var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4696
4697    var documentElement = document.documentElement;
4698
4699
4700
4701    var isAttached = function( elem ) {
4702            return jQuery.contains( elem.ownerDocument, elem );
4703        },
4704        composed = { composed: true };
4705
4706    // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4707    // Check attachment across shadow DOM boundaries when possible (gh-3504)
4708    // Support: iOS 10.0-10.2 only
4709    // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4710    // leading to errors. We need to check for `getRootNode`.
4711    if ( documentElement.getRootNode ) {
4712        isAttached = function( elem ) {
4713            return jQuery.contains( elem.ownerDocument, elem ) ||
4714                elem.getRootNode( composed ) === elem.ownerDocument;
4715        };
4716    }
4717    var isHiddenWithinTree = function( elem, el ) {
4718
4719        // isHiddenWithinTree might be called from jQuery#filter function;
4720        // in that case, element will be second argument
4721        elem = el || elem;
4722
4723        // Inline style trumps all
4724        return elem.style.display === "none" ||
4725            elem.style.display === "" &&
4726
4727            // Otherwise, check computed style
4728            // Support: Firefox <=43 - 45
4729            // Disconnected elements can have computed display: none, so first confirm that elem is
4730            // in the document.
4731            isAttached( elem ) &&
4732
4733            jQuery.css( elem, "display" ) === "none";
4734    };
4735
4736
4737
4738    function adjustCSS( elem, prop, valueParts, tween ) {
4739        var adjusted, scale,
4740            maxIterations = 20,
4741            currentValue = tween ?
4742                function() {
4743                    return tween.cur();
4744                } :
4745                function() {
4746                    return jQuery.css( elem, prop, "" );
4747                },
4748            initial = currentValue(),
4749            unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4750
4751            // Starting value computation is required for potential unit mismatches
4752            initialInUnit = elem.nodeType &&
4753                ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4754                rcssNum.exec( jQuery.css( elem, prop ) );
4755
4756        if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4757
4758            // Support: Firefox <=54
4759            // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4760            initial = initial / 2;
4761
4762            // Trust units reported by jQuery.css
4763            unit = unit || initialInUnit[ 3 ];
4764
4765            // Iteratively approximate from a nonzero starting point
4766            initialInUnit = +initial || 1;
4767
4768            while ( maxIterations-- ) {
4769
4770                // Evaluate and update our best guess (doubling guesses that zero out).
4771                // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4772                jQuery.style( elem, prop, initialInUnit + unit );
4773                if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4774                    maxIterations = 0;
4775                }
4776                initialInUnit = initialInUnit / scale;
4777
4778            }
4779
4780            initialInUnit = initialInUnit * 2;
4781            jQuery.style( elem, prop, initialInUnit + unit );
4782
4783            // Make sure we update the tween properties later on
4784            valueParts = valueParts || [];
4785        }
4786
4787        if ( valueParts ) {
4788            initialInUnit = +initialInUnit || +initial || 0;
4789
4790            // Apply relative offset (+=/-=) if specified
4791            adjusted = valueParts[ 1 ] ?
4792                initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4793                +valueParts[ 2 ];
4794            if ( tween ) {
4795                tween.unit = unit;
4796                tween.start = initialInUnit;
4797                tween.end = adjusted;
4798            }
4799        }
4800        return adjusted;
4801    }
4802
4803
4804    var defaultDisplayMap = {};
4805
4806    function getDefaultDisplay( elem ) {
4807        var temp,
4808            doc = elem.ownerDocument,
4809            nodeName = elem.nodeName,
4810            display = defaultDisplayMap[ nodeName ];
4811
4812        if ( display ) {
4813            return display;
4814        }
4815
4816        temp = doc.body.appendChild( doc.createElement( nodeName ) );
4817        display = jQuery.css( temp, "display" );
4818
4819        temp.parentNode.removeChild( temp );
4820
4821        if ( display === "none" ) {
4822            display = "block";
4823        }
4824        defaultDisplayMap[ nodeName ] = display;
4825
4826        return display;
4827    }
4828
4829    function showHide( elements, show ) {
4830        var display, elem,
4831            values = [],
4832            index = 0,
4833            length = elements.length;
4834
4835        // Determine new display value for elements that need to change
4836        for ( ; index < length; index++ ) {
4837            elem = elements[ index ];
4838            if ( !elem.style ) {
4839                continue;
4840            }
4841
4842            display = elem.style.display;
4843            if ( show ) {
4844
4845                // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4846                // check is required in this first loop unless we have a nonempty display value (either
4847                // inline or about-to-be-restored)
4848                if ( display === "none" ) {
4849                    values[ index ] = dataPriv.get( elem, "display" ) || null;
4850                    if ( !values[ index ] ) {
4851                        elem.style.display = "";
4852                    }
4853                }
4854                if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4855                    values[ index ] = getDefaultDisplay( elem );
4856                }
4857            } else {
4858                if ( display !== "none" ) {
4859                    values[ index ] = "none";
4860
4861                    // Remember what we're overwriting
4862                    dataPriv.set( elem, "display", display );
4863                }
4864            }
4865        }
4866
4867        // Set the display of the elements in a second loop to avoid constant reflow
4868        for ( index = 0; index < length; index++ ) {
4869            if ( values[ index ] != null ) {
4870                elements[ index ].style.display = values[ index ];
4871            }
4872        }
4873
4874        return elements;
4875    }
4876
4877    jQuery.fn.extend( {
4878        show: function() {
4879            return showHide( this, true );
4880        },
4881        hide: function() {
4882            return showHide( this );
4883        },
4884        toggle: function( state ) {
4885            if ( typeof state === "boolean" ) {
4886                return state ? this.show() : this.hide();
4887            }
4888
4889            return this.each( function() {
4890                if ( isHiddenWithinTree( this ) ) {
4891                    jQuery( this ).show();
4892                } else {
4893                    jQuery( this ).hide();
4894                }
4895            } );
4896        }
4897    } );
4898    var rcheckableType = ( /^(?:checkbox|radio)$/i );
4899
4900    var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4901
4902    var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4903
4904
4905
4906    ( function() {
4907        var fragment = document.createDocumentFragment(),
4908            div = fragment.appendChild( document.createElement( "div" ) ),
4909            input = document.createElement( "input" );
4910
4911        // Support: Android 4.0 - 4.3 only
4912        // Check state lost if the name is set (#11217)
4913        // Support: Windows Web Apps (WWA)
4914        // `name` and `type` must use .setAttribute for WWA (#14901)
4915        input.setAttribute( "type", "radio" );
4916        input.setAttribute( "checked", "checked" );
4917        input.setAttribute( "name", "t" );
4918
4919        div.appendChild( input );
4920
4921        // Support: Android <=4.1 only
4922        // Older WebKit doesn't clone checked state correctly in fragments
4923        support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4924
4925        // Support: IE <=11 only
4926        // Make sure textarea (and checkbox) defaultValue is properly cloned
4927        div.innerHTML = "<textarea>x</textarea>";
4928        support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4929
4930        // Support: IE <=9 only
4931        // IE <=9 replaces <option> tags with their contents when inserted outside of
4932        // the select element.
4933        div.innerHTML = "<option></option>";
4934        support.option = !!div.lastChild;
4935    } )();
4936
4937
4938// We have to close these tags to support XHTML (#13200)
4939    var wrapMap = {
4940
4941        // XHTML parsers do not magically insert elements in the
4942        // same way that tag soup parsers do. So we cannot shorten
4943        // this by omitting <tbody> or other required elements.
4944        thead: [ 1, "<table>", "</table>" ],
4945        col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4946        tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4947        td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4948
4949        _default: [ 0, "", "" ]
4950    };
4951
4952    wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4953    wrapMap.th = wrapMap.td;
4954
4955// Support: IE <=9 only
4956    if ( !support.option ) {
4957        wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4958    }
4959
4960
4961    function getAll( context, tag ) {
4962
4963        // Support: IE <=9 - 11 only
4964        // Use typeof to avoid zero-argument method invocation on host objects (#15151)
4965        var ret;
4966
4967        if ( typeof context.getElementsByTagName !== "undefined" ) {
4968            ret = context.getElementsByTagName( tag || "*" );
4969
4970        } else if ( typeof context.querySelectorAll !== "undefined" ) {
4971            ret = context.querySelectorAll( tag || "*" );
4972
4973        } else {
4974            ret = [];
4975        }
4976
4977        if ( tag === undefined || tag && nodeName( context, tag ) ) {
4978            return jQuery.merge( [ context ], ret );
4979        }
4980
4981        return ret;
4982    }
4983
4984
4985// Mark scripts as having already been evaluated
4986    function setGlobalEval( elems, refElements ) {
4987        var i = 0,
4988            l = elems.length;
4989
4990        for ( ; i < l; i++ ) {
4991            dataPriv.set(
4992                elems[ i ],
4993                "globalEval",
4994                !refElements || dataPriv.get( refElements[ i ], "globalEval" )
4995            );
4996        }
4997    }
4998
4999
5000    var rhtml = /<|&#?\w+;/;
5001
5002    function buildFragment( elems, context, scripts, selection, ignored ) {
5003        var elem, tmp, tag, wrap, attached, j,
5004            fragment = context.createDocumentFragment(),
5005            nodes = [],
5006            i = 0,
5007            l = elems.length;
5008
5009        for ( ; i < l; i++ ) {
5010            elem = elems[ i ];
5011
5012            if ( elem || elem === 0 ) {
5013
5014                // Add nodes directly
5015                if ( toType( elem ) === "object" ) {
5016
5017                    // Support: Android <=4.0 only, PhantomJS 1 only
5018                    // push.apply(_, arraylike) throws on ancient WebKit
5019                    jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5020
5021                    // Convert non-html into a text node
5022                } else if ( !rhtml.test( elem ) ) {
5023                    nodes.push( context.createTextNode( elem ) );
5024
5025                    // Convert html into DOM nodes
5026                } else {
5027                    tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
5028
5029                    // Deserialize a standard representation
5030                    tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
5031                    wrap = wrapMap[ tag ] || wrapMap._default;
5032                    tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
5033
5034                    // Descend through wrappers to the right content
5035                    j = wrap[ 0 ];
5036                    while ( j-- ) {
5037                        tmp = tmp.lastChild;
5038                    }
5039
vendor: 9,610 bytes, lines 5040-5318
5040                    // Support: Android <=4.0 only, PhantomJS 1 only
5041                    // push.apply(_, arraylike) throws on ancient WebKit
5042                    jQuery.merge( nodes, tmp.childNodes );
5043
5044                    // Remember the top-level container
5045                    tmp = fragment.firstChild;
5046
5047                    // Ensure the created nodes are orphaned (#12392)
5048                    tmp.textContent = "";
5049                }
5050            }
5051        }
5052
5053        // Remove wrapper from fragment
5054        fragment.textContent = "";
5055
5056        i = 0;
5057        while ( ( elem = nodes[ i++ ] ) ) {
5058
5059            // Skip elements already in the context collection (trac-4087)
5060            if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
5061                if ( ignored ) {
5062                    ignored.push( elem );
5063                }
5064                continue;
5065            }
5066
5067            attached = isAttached( elem );
5068
5069            // Append to fragment
5070            tmp = getAll( fragment.appendChild( elem ), "script" );
5071
5072            // Preserve script evaluation history
5073            if ( attached ) {
5074                setGlobalEval( tmp );
5075            }
5076
5077            // Capture executables
5078            if ( scripts ) {
5079                j = 0;
5080                while ( ( elem = tmp[ j++ ] ) ) {
5081                    if ( rscriptType.test( elem.type || "" ) ) {
5082                        scripts.push( elem );
5083                    }
5084                }
5085            }
5086        }
5087
5088        return fragment;
5089    }
5090
5091
5092    var
5093        rkeyEvent = /^key/,
5094        rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
5095        rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
5096
5097    function returnTrue() {
5098        return true;
5099    }
5100
5101    function returnFalse() {
5102        return false;
5103    }
5104
5105// Support: IE <=9 - 11+
5106// focus() and blur() are asynchronous, except when they are no-op.
5107// So expect focus to be synchronous when the element is already active,
5108// and blur to be synchronous when the element is not already active.
5109// (focus and blur are always synchronous in other supported browsers,
5110// this just defines when we can count on it).
5111    function expectSync( elem, type ) {
5112        return ( elem === safeActiveElement() ) === ( type === "focus" );
5113    }
5114
5115// Support: IE <=9 only
5116// Accessing document.activeElement can throw unexpectedly
5117// https://bugs.jquery.com/ticket/13393
5118    function safeActiveElement() {
5119        try {
5120            return document.activeElement;
5121        } catch ( err ) { }
5122    }
5123
5124    function on( elem, types, selector, data, fn, one ) {
5125        var origFn, type;
5126
5127        // Types can be a map of types/handlers
5128        if ( typeof types === "object" ) {
5129
5130            // ( types-Object, selector, data )
5131            if ( typeof selector !== "string" ) {
5132
5133                // ( types-Object, data )
5134                data = data || selector;
5135                selector = undefined;
5136            }
5137            for ( type in types ) {
5138                on( elem, type, selector, data, types[ type ], one );
5139            }
5140            return elem;
5141        }
5142
5143        if ( data == null && fn == null ) {
5144
5145            // ( types, fn )
5146            fn = selector;
5147            data = selector = undefined;
5148        } else if ( fn == null ) {
5149            if ( typeof selector === "string" ) {
5150
5151                // ( types, selector, fn )
5152                fn = data;
5153                data = undefined;
5154            } else {
5155
5156                // ( types, data, fn )
5157                fn = data;
5158                data = selector;
5159                selector = undefined;
5160            }
5161        }
5162        if ( fn === false ) {
5163            fn = returnFalse;
5164        } else if ( !fn ) {
5165            return elem;
5166        }
5167
5168        if ( one === 1 ) {
5169            origFn = fn;
5170            fn = function( event ) {
5171
5172                // Can use an empty set, since event contains the info
5173                jQuery().off( event );
5174                return origFn.apply( this, arguments );
5175            };
5176
5177            // Use same guid so caller can remove using origFn
5178            fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5179        }
5180        return elem.each( function() {
5181            jQuery.event.add( this, types, fn, data, selector );
5182        } );
5183    }
5184
5185    /*
5186 * Helper functions for managing events -- not part of the public interface.
5187 * Props to Dean Edwards' addEvent library for many of the ideas.
5188 */
5189    jQuery.event = {
5190
5191        global: {},
5192
5193        add: function( elem, types, handler, data, selector ) {
5194
5195            var handleObjIn, eventHandle, tmp,
5196                events, t, handleObj,
5197                special, handlers, type, namespaces, origType,
5198                elemData = dataPriv.get( elem );
5199
5200            // Only attach events to objects that accept data
5201            if ( !acceptData( elem ) ) {
5202                return;
5203            }
5204
5205            // Caller can pass in an object of custom data in lieu of the handler
5206            if ( handler.handler ) {
5207                handleObjIn = handler;
5208                handler = handleObjIn.handler;
5209                selector = handleObjIn.selector;
5210            }
5211
5212            // Ensure that invalid selectors throw exceptions at attach time
5213            // Evaluate against documentElement in case elem is a non-element node (e.g., document)
5214            if ( selector ) {
5215                jQuery.find.matchesSelector( documentElement, selector );
5216            }
5217
5218            // Make sure that the handler has a unique ID, used to find/remove it later
5219            if ( !handler.guid ) {
5220                handler.guid = jQuery.guid++;
5221            }
5222
5223            // Init the element's event structure and main handler, if this is the first
5224            if ( !( events = elemData.events ) ) {
5225                events = elemData.events = Object.create( null );
5226            }
5227            if ( !( eventHandle = elemData.handle ) ) {
5228                eventHandle = elemData.handle = function( e ) {
5229
5230                    // Discard the second event of a jQuery.event.trigger() and
5231                    // when an event is called after a page has unloaded
5232                    return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5233                        jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5234                };
5235            }
5236
5237            // Handle multiple events separated by a space
5238            types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5239            t = types.length;
5240            while ( t-- ) {
5241                tmp = rtypenamespace.exec( types[ t ] ) || [];
5242                type = origType = tmp[ 1 ];
5243                namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5244
5245                // There *must* be a type, no attaching namespace-only handlers
5246                if ( !type ) {
5247                    continue;
5248                }
5249
5250                // If event changes its type, use the special event handlers for the changed type
5251                special = jQuery.event.special[ type ] || {};
5252
5253                // If selector defined, determine special event api type, otherwise given type
5254                type = ( selector ? special.delegateType : special.bindType ) || type;
5255
5256                // Update special based on newly reset type
5257                special = jQuery.event.special[ type ] || {};
5258
5259                // handleObj is passed to all event handlers
5260                handleObj = jQuery.extend( {
5261                    type: type,
5262                    origType: origType,
5263                    data: data,
5264                    handler: handler,
5265                    guid: handler.guid,
5266                    selector: selector,
5267                    needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5268                    namespace: namespaces.join( "." )
5269                }, handleObjIn );
5270
5271                // Init the event handler queue if we're the first
5272                if ( !( handlers = events[ type ] ) ) {
5273                    handlers = events[ type ] = [];
5274                    handlers.delegateCount = 0;
5275
5276                    // Only use addEventListener if the special events handler returns false
5277                    if ( !special.setup ||
5278                        special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5279
5280                        if ( elem.addEventListener ) {
5281                            elem.addEventListener( type, eventHandle );
5282                        }
5283                    }
5284                }
5285
5286                if ( special.add ) {
5287                    special.add.call( elem, handleObj );
5288
5289                    if ( !handleObj.handler.guid ) {
5290                        handleObj.handler.guid = handler.guid;
5291                    }
5292                }
5293
5294                // Add to the element's handler list, delegates in front
5295                if ( selector ) {
5296                    handlers.splice( handlers.delegateCount++, 0, handleObj );
5297                } else {
5298                    handlers.push( handleObj );
5299                }
5300
5301                // Keep track of which events have ever been used, for event optimization
5302                jQuery.event.global[ type ] = true;
5303            }
5304
5305        },
5306
5307        // Detach an event or set of events from an element
5308        remove: function( elem, types, handler, selector, mappedTypes ) {
5309
5310            var j, origCount, tmp,
5311                events, t, handleObj,
5312                special, handlers, type, namespaces, origType,
5313                elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5314
5315            if ( !elemData || !( events = elemData.events ) ) {
5316                return;
5317            }
5318
vendor: 4,497 bytes, lines 5319-5422
5319            // Once for each type.namespace in types; type may be omitted
5320            types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5321            t = types.length;
5322            while ( t-- ) {
5323                tmp = rtypenamespace.exec( types[ t ] ) || [];
5324                type = origType = tmp[ 1 ];
5325                namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5326
5327                // Unbind all events (on this namespace, if provided) for the element
5328                if ( !type ) {
5329                    for ( type in events ) {
5330                        jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5331                    }
5332                    continue;
5333                }
5334
5335                special = jQuery.event.special[ type ] || {};
5336                type = ( selector ? special.delegateType : special.bindType ) || type;
5337                handlers = events[ type ] || [];
5338                tmp = tmp[ 2 ] &&
5339                    new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5340
5341                // Remove matching events
5342                origCount = j = handlers.length;
5343                while ( j-- ) {
5344                    handleObj = handlers[ j ];
5345
5346                    if ( ( mappedTypes || origType === handleObj.origType ) &&
5347                        ( !handler || handler.guid === handleObj.guid ) &&
5348                        ( !tmp || tmp.test( handleObj.namespace ) ) &&
5349                        ( !selector || selector === handleObj.selector ||
5350                            selector === "**" && handleObj.selector ) ) {
5351                        handlers.splice( j, 1 );
5352
5353                        if ( handleObj.selector ) {
5354                            handlers.delegateCount--;
5355                        }
5356                        if ( special.remove ) {
5357                            special.remove.call( elem, handleObj );
5358                        }
5359                    }
5360                }
5361
5362                // Remove generic event handler if we removed something and no more handlers exist
5363                // (avoids potential for endless recursion during removal of special event handlers)
5364                if ( origCount && !handlers.length ) {
5365                    if ( !special.teardown ||
5366                        special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5367
5368                        jQuery.removeEvent( elem, type, elemData.handle );
5369                    }
5370
5371                    delete events[ type ];
5372                }
5373            }
5374
5375            // Remove data and the expando if it's no longer used
5376            if ( jQuery.isEmptyObject( events ) ) {
5377                dataPriv.remove( elem, "handle events" );
5378            }
5379        },
5380
5381        dispatch: function( nativeEvent ) {
5382
5383            var i, j, ret, matched, handleObj, handlerQueue,
5384                args = new Array( arguments.length ),
5385
5386                // Make a writable jQuery.Event from the native event object
5387                event = jQuery.event.fix( nativeEvent ),
5388
5389                handlers = (
5390                    dataPriv.get( this, "events" ) || Object.create( null )
5391                )[ event.type ] || [],
5392                special = jQuery.event.special[ event.type ] || {};
5393
5394            // Use the fix-ed jQuery.Event rather than the (read-only) native event
5395            args[ 0 ] = event;
5396
5397            for ( i = 1; i < arguments.length; i++ ) {
5398                args[ i ] = arguments[ i ];
5399            }
5400
5401            event.delegateTarget = this;
5402
5403            // Call the preDispatch hook for the mapped type, and let it bail if desired
5404            if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5405                return;
5406            }
5407
5408            // Determine handlers
5409            handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5410
5411            // Run delegates first; they may want to stop propagation beneath us
5412            i = 0;
5413            while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5414                event.currentTarget = matched.elem;
5415
5416                j = 0;
5417                while ( ( handleObj = matched.handlers[ j++ ] ) &&
5418                !event.isImmediatePropagationStopped() ) {
5419
5420                    // If the event is namespaced, then each handler is only invoked if it is
5421                    // specially universal or its namespaces are a superset of the event's.
5422                    if ( !event.rnamespace || handleObj.namespace === false ||
vendor: 11,072 bytes, lines 5423-5679
5423                        event.rnamespace.test( handleObj.namespace ) ) {
5424
5425                        event.handleObj = handleObj;
5426                        event.data = handleObj.data;
5427
5428                        ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5429                            handleObj.handler ).apply( matched.elem, args );
5430
5431                        if ( ret !== undefined ) {
5432                            if ( ( event.result = ret ) === false ) {
5433                                event.preventDefault();
5434                                event.stopPropagation();
5435                            }
5436                        }
5437                    }
5438                }
5439            }
5440
5441            // Call the postDispatch hook for the mapped type
5442            if ( special.postDispatch ) {
5443                special.postDispatch.call( this, event );
5444            }
5445
5446            return event.result;
5447        },
5448
5449        handlers: function( event, handlers ) {
5450            var i, handleObj, sel, matchedHandlers, matchedSelectors,
5451                handlerQueue = [],
5452                delegateCount = handlers.delegateCount,
5453                cur = event.target;
5454
5455            // Find delegate handlers
5456            if ( delegateCount &&
5457
5458                // Support: IE <=9
5459                // Black-hole SVG <use> instance trees (trac-13180)
5460                cur.nodeType &&
5461
5462                // Support: Firefox <=42
5463                // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5464                // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5465                // Support: IE 11 only
5466                // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5467                !( event.type === "click" && event.button >= 1 ) ) {
5468
5469                for ( ; cur !== this; cur = cur.parentNode || this ) {
5470
5471                    // Don't check non-elements (#13208)
5472                    // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5473                    if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5474                        matchedHandlers = [];
5475                        matchedSelectors = {};
5476                        for ( i = 0; i < delegateCount; i++ ) {
5477                            handleObj = handlers[ i ];
5478
5479                            // Don't conflict with Object.prototype properties (#13203)
5480                            sel = handleObj.selector + " ";
5481
5482                            if ( matchedSelectors[ sel ] === undefined ) {
5483                                matchedSelectors[ sel ] = handleObj.needsContext ?
5484                                    jQuery( sel, this ).index( cur ) > -1 :
5485                                    jQuery.find( sel, this, null, [ cur ] ).length;
5486                            }
5487                            if ( matchedSelectors[ sel ] ) {
5488                                matchedHandlers.push( handleObj );
5489                            }
5490                        }
5491                        if ( matchedHandlers.length ) {
5492                            handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5493                        }
5494                    }
5495                }
5496            }
5497
5498            // Add the remaining (directly-bound) handlers
5499            cur = this;
5500            if ( delegateCount < handlers.length ) {
5501                handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5502            }
5503
5504            return handlerQueue;
5505        },
5506
5507        addProp: function( name, hook ) {
5508            Object.defineProperty( jQuery.Event.prototype, name, {
5509                enumerable: true,
5510                configurable: true,
5511
5512                get: isFunction( hook ) ?
5513                    function() {
5514                        if ( this.originalEvent ) {
5515                            return hook( this.originalEvent );
5516                        }
5517                    } :
5518                    function() {
5519                        if ( this.originalEvent ) {
5520                            return this.originalEvent[ name ];
5521                        }
5522                    },
5523
5524                set: function( value ) {
5525                    Object.defineProperty( this, name, {
5526                        enumerable: true,
5527                        configurable: true,
5528                        writable: true,
5529                        value: value
5530                    } );
5531                }
5532            } );
5533        },
5534
5535        fix: function( originalEvent ) {
5536            return originalEvent[ jQuery.expando ] ?
5537                originalEvent :
5538                new jQuery.Event( originalEvent );
5539        },
5540
5541        special: {
5542            load: {
5543
5544                // Prevent triggered image.load events from bubbling to window.load
5545                noBubble: true
5546            },
5547            click: {
5548
5549                // Utilize native event to ensure correct state for checkable inputs
5550                setup: function( data ) {
5551
5552                    // For mutual compressibility with _default, replace `this` access with a local var.
5553                    // `|| data` is dead code meant only to preserve the variable through minification.
5554                    var el = this || data;
5555
5556                    // Claim the first handler
5557                    if ( rcheckableType.test( el.type ) &&
5558                        el.click && nodeName( el, "input" ) ) {
5559
5560                        // dataPriv.set( el, "click", ... )
5561                        leverageNative( el, "click", returnTrue );
5562                    }
5563
5564                    // Return false to allow normal processing in the caller
5565                    return false;
5566                },
5567                trigger: function( data ) {
5568
5569                    // For mutual compressibility with _default, replace `this` access with a local var.
5570                    // `|| data` is dead code meant only to preserve the variable through minification.
5571                    var el = this || data;
5572
5573                    // Force setup before triggering a click
5574                    if ( rcheckableType.test( el.type ) &&
5575                        el.click && nodeName( el, "input" ) ) {
5576
5577                        leverageNative( el, "click" );
5578                    }
5579
5580                    // Return non-false to allow normal event-path propagation
5581                    return true;
5582                },
5583
5584                // For cross-browser consistency, suppress native .click() on links
5585                // Also prevent it if we're currently inside a leveraged native-event stack
5586                _default: function( event ) {
5587                    var target = event.target;
5588                    return rcheckableType.test( target.type ) &&
5589                        target.click && nodeName( target, "input" ) &&
5590                        dataPriv.get( target, "click" ) ||
5591                        nodeName( target, "a" );
5592                }
5593            },
5594
5595            beforeunload: {
5596                postDispatch: function( event ) {
5597
5598                    // Support: Firefox 20+
5599                    // Firefox doesn't alert if the returnValue field is not set.
5600                    if ( event.result !== undefined && event.originalEvent ) {
5601                        event.originalEvent.returnValue = event.result;
5602                    }
5603                }
5604            }
5605        }
5606    };
5607
5608// Ensure the presence of an event listener that handles manually-triggered
5609// synthetic events by interrupting progress until reinvoked in response to
5610// *native* events that it fires directly, ensuring that state changes have
5611// already occurred before other listeners are invoked.
5612    function leverageNative( el, type, expectSync ) {
5613
5614        // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5615        if ( !expectSync ) {
5616            if ( dataPriv.get( el, type ) === undefined ) {
5617                jQuery.event.add( el, type, returnTrue );
5618            }
5619            return;
5620        }
5621
5622        // Register the controller as a special universal handler for all event namespaces
5623        dataPriv.set( el, type, false );
5624        jQuery.event.add( el, type, {
5625            namespace: false,
5626            handler: function( event ) {
5627                var notAsync, result,
5628                    saved = dataPriv.get( this, type );
5629
5630                if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5631
5632                    // Interrupt processing of the outer synthetic .trigger()ed event
5633                    // Saved data should be false in such cases, but might be a leftover capture object
5634                    // from an async native handler (gh-4350)
5635                    if ( !saved.length ) {
5636
5637                        // Store arguments for use when handling the inner native event
5638                        // There will always be at least one argument (an event object), so this array
5639                        // will not be confused with a leftover capture object.
5640                        saved = slice.call( arguments );
5641                        dataPriv.set( this, type, saved );
5642
5643                        // Trigger the native event and capture its result
5644                        // Support: IE <=9 - 11+
5645                        // focus() and blur() are asynchronous
5646                        notAsync = expectSync( this, type );
5647                        this[ type ]();
5648                        result = dataPriv.get( this, type );
5649                        if ( saved !== result || notAsync ) {
5650                            dataPriv.set( this, type, false );
5651                        } else {
5652                            result = {};
5653                        }
5654                        if ( saved !== result ) {
5655
5656                            // Cancel the outer synthetic event
5657                            event.stopImmediatePropagation();
5658                            event.preventDefault();
5659                            return result.value;
5660                        }
5661
5662                        // If this is an inner synthetic event for an event with a bubbling surrogate
5663                        // (focus or blur), assume that the surrogate already propagated from triggering the
5664                        // native event and prevent that from happening again here.
5665                        // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5666                        // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5667                        // less bad than duplication.
5668                    } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5669                        event.stopPropagation();
5670                    }
5671
5672                    // If this is a native event triggered above, everything is now in order
5673                    // Fire an inner synthetic event with the original arguments
5674                } else if ( saved.length ) {
5675
5676                    // ...and capture the result
5677                    dataPriv.set( this, type, {
5678                        value: jQuery.event.trigger(
5679
vendor: 5,702 bytes, lines 5680-5866
5680                            // Support: IE <=9 - 11+
5681                            // Extend with the prototype to reset the above stopImmediatePropagation()
5682                            jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5683                            saved.slice( 1 ),
5684                            this
5685                        )
5686                    } );
5687
5688                    // Abort handling of the native event
5689                    event.stopImmediatePropagation();
5690                }
5691            }
5692        } );
5693    }
5694
5695    jQuery.removeEvent = function( elem, type, handle ) {
5696
5697        // This "if" is needed for plain objects
5698        if ( elem.removeEventListener ) {
5699            elem.removeEventListener( type, handle );
5700        }
5701    };
5702
5703    jQuery.Event = function( src, props ) {
5704
5705        // Allow instantiation without the 'new' keyword
5706        if ( !( this instanceof jQuery.Event ) ) {
5707            return new jQuery.Event( src, props );
5708        }
5709
5710        // Event object
5711        if ( src && src.type ) {
5712            this.originalEvent = src;
5713            this.type = src.type;
5714
5715            // Events bubbling up the document may have been marked as prevented
5716            // by a handler lower down the tree; reflect the correct value.
5717            this.isDefaultPrevented = src.defaultPrevented ||
5718            src.defaultPrevented === undefined &&
5719
5720            // Support: Android <=2.3 only
5721            src.returnValue === false ?
5722                returnTrue :
5723                returnFalse;
5724
5725            // Create target properties
5726            // Support: Safari <=6 - 7 only
5727            // Target should not be a text node (#504, #13143)
5728            this.target = ( src.target && src.target.nodeType === 3 ) ?
5729                src.target.parentNode :
5730                src.target;
5731
5732            this.currentTarget = src.currentTarget;
5733            this.relatedTarget = src.relatedTarget;
5734
5735            // Event type
5736        } else {
5737            this.type = src;
5738        }
5739
5740        // Put explicitly provided properties onto the event object
5741        if ( props ) {
5742            jQuery.extend( this, props );
5743        }
5744
5745        // Create a timestamp if incoming event doesn't have one
5746        this.timeStamp = src && src.timeStamp || Date.now();
5747
5748        // Mark it as fixed
5749        this[ jQuery.expando ] = true;
5750    };
5751
5752// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5753// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5754    jQuery.Event.prototype = {
5755        constructor: jQuery.Event,
5756        isDefaultPrevented: returnFalse,
5757        isPropagationStopped: returnFalse,
5758        isImmediatePropagationStopped: returnFalse,
5759        isSimulated: false,
5760
5761        preventDefault: function() {
5762            var e = this.originalEvent;
5763
5764            this.isDefaultPrevented = returnTrue;
5765
5766            if ( e && !this.isSimulated ) {
5767                e.preventDefault();
5768            }
5769        },
5770        stopPropagation: function() {
5771            var e = this.originalEvent;
5772
5773            this.isPropagationStopped = returnTrue;
5774
5775            if ( e && !this.isSimulated ) {
5776                e.stopPropagation();
5777            }
5778        },
5779        stopImmediatePropagation: function() {
5780            var e = this.originalEvent;
5781
5782            this.isImmediatePropagationStopped = returnTrue;
5783
5784            if ( e && !this.isSimulated ) {
5785                e.stopImmediatePropagation();
5786            }
5787
5788            this.stopPropagation();
5789        }
5790    };
5791
5792// Includes all common event props including KeyEvent and MouseEvent specific props
5793    jQuery.each( {
5794        altKey: true,
5795        bubbles: true,
5796        cancelable: true,
5797        changedTouches: true,
5798        ctrlKey: true,
5799        detail: true,
5800        eventPhase: true,
5801        metaKey: true,
5802        pageX: true,
5803        pageY: true,
5804        shiftKey: true,
5805        view: true,
5806        "char": true,
5807        code: true,
5808        charCode: true,
5809        key: true,
5810        keyCode: true,
5811        button: true,
5812        buttons: true,
5813        clientX: true,
5814        clientY: true,
5815        offsetX: true,
5816        offsetY: true,
5817        pointerId: true,
5818        pointerType: true,
5819        screenX: true,
5820        screenY: true,
5821        targetTouches: true,
5822        toElement: true,
5823        touches: true,
5824
5825        which: function( event ) {
5826            var button = event.button;
5827
5828            // Add which for key events
5829            if ( event.which == null && rkeyEvent.test( event.type ) ) {
5830                return event.charCode != null ? event.charCode : event.keyCode;
5831            }
5832
5833            // Add which for click: 1 === left; 2 === middle; 3 === right
5834            if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5835                if ( button & 1 ) {
5836                    return 1;
5837                }
5838
5839                if ( button & 2 ) {
5840                    return 3;
5841                }
5842
5843                if ( button & 4 ) {
5844                    return 2;
5845                }
5846
5847                return 0;
5848            }
5849
5850            return event.which;
5851        }
5852    }, jQuery.event.addProp );
5853
5854    jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5855        jQuery.event.special[ type ] = {
5856
5857            // Utilize native event if possible so blur/focus sequence is correct
5858            setup: function() {
5859
5860                // Claim the first handler
5861                // dataPriv.set( this, "focus", ... )
5862                // dataPriv.set( this, "blur", ... )
5863                leverageNative( this, type, expectSync );
5864
5865                // Return false to allow normal processing in the caller
5866                return false;
vendor: 4,646 bytes, lines 5867-6003
5867            },
5868            trigger: function() {
5869
5870                // Force setup before trigger
5871                leverageNative( this, type );
5872
5873                // Return non-false to allow normal event-path propagation
5874                return true;
5875            },
5876
5877            delegateType: delegateType
5878        };
5879    } );
5880
5881// Create mouseenter/leave events using mouseover/out and event-time checks
5882// so that event delegation works in jQuery.
5883// Do the same for pointerenter/pointerleave and pointerover/pointerout
5884//
5885// Support: Safari 7 only
5886// Safari sends mouseenter too often; see:
5887// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5888// for the description of the bug (it existed in older Chrome versions as well).
5889    jQuery.each( {
5890        mouseenter: "mouseover",
5891        mouseleave: "mouseout",
5892        pointerenter: "pointerover",
5893        pointerleave: "pointerout"
5894    }, function( orig, fix ) {
5895        jQuery.event.special[ orig ] = {
5896            delegateType: fix,
5897            bindType: fix,
5898
5899            handle: function( event ) {
5900                var ret,
5901                    target = this,
5902                    related = event.relatedTarget,
5903                    handleObj = event.handleObj;
5904
5905                // For mouseenter/leave call the handler if related is outside the target.
5906                // NB: No relatedTarget if the mouse left/entered the browser window
5907                if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5908                    event.type = handleObj.origType;
5909                    ret = handleObj.handler.apply( this, arguments );
5910                    event.type = fix;
5911                }
5912                return ret;
5913            }
5914        };
5915    } );
5916
5917    jQuery.fn.extend( {
5918
5919        on: function( types, selector, data, fn ) {
5920            return on( this, types, selector, data, fn );
5921        },
5922        one: function( types, selector, data, fn ) {
5923            return on( this, types, selector, data, fn, 1 );
5924        },
5925        off: function( types, selector, fn ) {
5926            var handleObj, type;
5927            if ( types && types.preventDefault && types.handleObj ) {
5928
5929                // ( event )  dispatched jQuery.Event
5930                handleObj = types.handleObj;
5931                jQuery( types.delegateTarget ).off(
5932                    handleObj.namespace ?
5933                        handleObj.origType + "." + handleObj.namespace :
5934                        handleObj.origType,
5935                    handleObj.selector,
5936                    handleObj.handler
5937                );
5938                return this;
5939            }
5940            if ( typeof types === "object" ) {
5941
5942                // ( types-object [, selector] )
5943                for ( type in types ) {
5944                    this.off( type, selector, types[ type ] );
5945                }
5946                return this;
5947            }
5948            if ( selector === false || typeof selector === "function" ) {
5949
5950                // ( types [, fn] )
5951                fn = selector;
5952                selector = undefined;
5953            }
5954            if ( fn === false ) {
5955                fn = returnFalse;
5956            }
5957            return this.each( function() {
5958                jQuery.event.remove( this, types, fn, selector );
5959            } );
5960        }
5961    } );
5962
5963
5964    var
5965
5966        // Support: IE <=10 - 11, Edge 12 - 13 only
5967        // In IE/Edge using regex groups here causes severe slowdowns.
5968        // See https://connect.microsoft.com/IE/feedback/details/1736512/
5969        rnoInnerhtml = /<script|<style|<link/i,
5970
5971        // checked="checked" or checked
5972        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5973        rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5974
5975// Prefer a tbody over its parent table for containing new rows
5976    function manipulationTarget( elem, content ) {
5977        if ( nodeName( elem, "table" ) &&
5978            nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5979
5980            return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5981        }
5982
5983        return elem;
5984    }
5985
5986// Replace/restore the type attribute of script elements for safe DOM manipulation
5987    function disableScript( elem ) {
5988        elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5989        return elem;
5990    }
5991    function restoreScript( elem ) {
5992        if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5993            elem.type = elem.type.slice( 5 );
5994        } else {
5995            elem.removeAttribute( "type" );
5996        }
5997
5998        return elem;
5999    }
6000
6001    function cloneCopyEvent( src, dest ) {
6002        var i, l, type, pdataOld, udataOld, udataCur, events;
6003
vendor: 8,599 bytes, lines 6004-6232
6004        if ( dest.nodeType !== 1 ) {
6005            return;
6006        }
6007
6008        // 1. Copy private data: events, handlers, etc.
6009        if ( dataPriv.hasData( src ) ) {
6010            pdataOld = dataPriv.get( src );
6011            events = pdataOld.events;
6012
6013            if ( events ) {
6014                dataPriv.remove( dest, "handle events" );
6015
6016                for ( type in events ) {
6017                    for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6018                        jQuery.event.add( dest, type, events[ type ][ i ] );
6019                    }
6020                }
6021            }
6022        }
6023
6024        // 2. Copy user data
6025        if ( dataUser.hasData( src ) ) {
6026            udataOld = dataUser.access( src );
6027            udataCur = jQuery.extend( {}, udataOld );
6028
6029            dataUser.set( dest, udataCur );
6030        }
6031    }
6032
6033// Fix IE bugs, see support tests
6034    function fixInput( src, dest ) {
6035        var nodeName = dest.nodeName.toLowerCase();
6036
6037        // Fails to persist the checked state of a cloned checkbox or radio button.
6038        if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
6039            dest.checked = src.checked;
6040
6041            // Fails to return the selected option to the default selected state when cloning options
6042        } else if ( nodeName === "input" || nodeName === "textarea" ) {
6043            dest.defaultValue = src.defaultValue;
6044        }
6045    }
6046
6047    function domManip( collection, args, callback, ignored ) {
6048
6049        // Flatten any nested arrays
6050        args = flat( args );
6051
6052        var fragment, first, scripts, hasScripts, node, doc,
6053            i = 0,
6054            l = collection.length,
6055            iNoClone = l - 1,
6056            value = args[ 0 ],
6057            valueIsFunction = isFunction( value );
6058
6059        // We can't cloneNode fragments that contain checked, in WebKit
6060        if ( valueIsFunction ||
6061            ( l > 1 && typeof value === "string" &&
6062                !support.checkClone && rchecked.test( value ) ) ) {
6063            return collection.each( function( index ) {
6064                var self = collection.eq( index );
6065                if ( valueIsFunction ) {
6066                    args[ 0 ] = value.call( this, index, self.html() );
6067                }
6068                domManip( self, args, callback, ignored );
6069            } );
6070        }
6071
6072        if ( l ) {
6073            fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
6074            first = fragment.firstChild;
6075
6076            if ( fragment.childNodes.length === 1 ) {
6077                fragment = first;
6078            }
6079
6080            // Require either new content or an interest in ignored elements to invoke the callback
6081            if ( first || ignored ) {
6082                scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
6083                hasScripts = scripts.length;
6084
6085                // Use the original fragment for the last item
6086                // instead of the first because it can end up
6087                // being emptied incorrectly in certain situations (#8070).
6088                for ( ; i < l; i++ ) {
6089                    node = fragment;
6090
6091                    if ( i !== iNoClone ) {
6092                        node = jQuery.clone( node, true, true );
6093
6094                        // Keep references to cloned scripts for later restoration
6095                        if ( hasScripts ) {
6096
6097                            // Support: Android <=4.0 only, PhantomJS 1 only
6098                            // push.apply(_, arraylike) throws on ancient WebKit
6099                            jQuery.merge( scripts, getAll( node, "script" ) );
6100                        }
6101                    }
6102
6103                    callback.call( collection[ i ], node, i );
6104                }
6105
6106                if ( hasScripts ) {
6107                    doc = scripts[ scripts.length - 1 ].ownerDocument;
6108
6109                    // Reenable scripts
6110                    jQuery.map( scripts, restoreScript );
6111
6112                    // Evaluate executable scripts on first document insertion
6113                    for ( i = 0; i < hasScripts; i++ ) {
6114                        node = scripts[ i ];
6115                        if ( rscriptType.test( node.type || "" ) &&
6116                            !dataPriv.access( node, "globalEval" ) &&
6117                            jQuery.contains( doc, node ) ) {
6118
6119                            if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
6120
6121                                // Optional AJAX dependency, but won't run scripts if not present
6122                                if ( jQuery._evalUrl && !node.noModule ) {
6123                                    jQuery._evalUrl( node.src, {
6124                                        nonce: node.nonce || node.getAttribute( "nonce" )
6125                                    }, doc );
6126                                }
6127                            } else {
6128                                DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
6129                            }
6130                        }
6131                    }
6132                }
6133            }
6134        }
6135
6136        return collection;
6137    }
6138
6139    function remove( elem, selector, keepData ) {
6140        var node,
6141            nodes = selector ? jQuery.filter( selector, elem ) : elem,
6142            i = 0;
6143
6144        for ( ; ( node = nodes[ i ] ) != null; i++ ) {
6145            if ( !keepData && node.nodeType === 1 ) {
6146                jQuery.cleanData( getAll( node ) );
6147            }
6148
6149            if ( node.parentNode ) {
6150                if ( keepData && isAttached( node ) ) {
6151                    setGlobalEval( getAll( node, "script" ) );
6152                }
6153                node.parentNode.removeChild( node );
6154            }
6155        }
6156
6157        return elem;
6158    }
6159
6160    jQuery.extend( {
6161        htmlPrefilter: function( html ) {
6162            return html;
6163        },
6164
6165        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6166            var i, l, srcElements, destElements,
6167                clone = elem.cloneNode( true ),
6168                inPage = isAttached( elem );
6169
6170            // Fix IE cloning issues
6171            if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
6172                !jQuery.isXMLDoc( elem ) ) {
6173
6174                // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
6175                destElements = getAll( clone );
6176                srcElements = getAll( elem );
6177
6178                for ( i = 0, l = srcElements.length; i < l; i++ ) {
6179                    fixInput( srcElements[ i ], destElements[ i ] );
6180                }
6181            }
6182
6183            // Copy the events from the original to the clone
6184            if ( dataAndEvents ) {
6185                if ( deepDataAndEvents ) {
6186                    srcElements = srcElements || getAll( elem );
6187                    destElements = destElements || getAll( clone );
6188
6189                    for ( i = 0, l = srcElements.length; i < l; i++ ) {
6190                        cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6191                    }
6192                } else {
6193                    cloneCopyEvent( elem, clone );
6194                }
6195            }
6196
6197            // Preserve script evaluation history
6198            destElements = getAll( clone, "script" );
6199            if ( destElements.length > 0 ) {
6200                setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6201            }
6202
6203            // Return the cloned set
6204            return clone;
6205        },
6206
6207        cleanData: function( elems ) {
6208            var data, elem, type,
6209                special = jQuery.event.special,
6210                i = 0;
6211
6212            for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6213                if ( acceptData( elem ) ) {
6214                    if ( ( data = elem[ dataPriv.expando ] ) ) {
6215                        if ( data.events ) {
6216                            for ( type in data.events ) {
6217                                if ( special[ type ] ) {
6218                                    jQuery.event.remove( elem, type );
6219
6220                                    // This is a shortcut to avoid jQuery.event.remove's overhead
6221                                } else {
6222                                    jQuery.removeEvent( elem, type, data.handle );
6223                                }
6224                            }
6225                        }
6226
6227                        // Support: Chrome <=35 - 45+
6228                        // Assign undefined instead of using delete, see Data#remove
6229                        elem[ dataPriv.expando ] = undefined;
6230                    }
6231                    if ( elem[ dataUser.expando ] ) {
6232
vendor: 5,129 bytes, lines 6233-6383
6233                        // Support: Chrome <=35 - 45+
6234                        // Assign undefined instead of using delete, see Data#remove
6235                        elem[ dataUser.expando ] = undefined;
6236                    }
6237                }
6238            }
6239        }
6240    } );
6241
6242    jQuery.fn.extend( {
6243        detach: function( selector ) {
6244            return remove( this, selector, true );
6245        },
6246
6247        remove: function( selector ) {
6248            return remove( this, selector );
6249        },
6250
6251        text: function( value ) {
6252            return access( this, function( value ) {
6253                return value === undefined ?
6254                    jQuery.text( this ) :
6255                    this.empty().each( function() {
6256                        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6257                            this.textContent = value;
6258                        }
6259                    } );
6260            }, null, value, arguments.length );
6261        },
6262
6263        append: function() {
6264            return domManip( this, arguments, function( elem ) {
6265                if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6266                    var target = manipulationTarget( this, elem );
6267                    target.appendChild( elem );
6268                }
6269            } );
6270        },
6271
6272        prepend: function() {
6273            return domManip( this, arguments, function( elem ) {
6274                if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6275                    var target = manipulationTarget( this, elem );
6276                    target.insertBefore( elem, target.firstChild );
6277                }
6278            } );
6279        },
6280
6281        before: function() {
6282            return domManip( this, arguments, function( elem ) {
6283                if ( this.parentNode ) {
6284                    this.parentNode.insertBefore( elem, this );
6285                }
6286            } );
6287        },
6288
6289        after: function() {
6290            return domManip( this, arguments, function( elem ) {
6291                if ( this.parentNode ) {
6292                    this.parentNode.insertBefore( elem, this.nextSibling );
6293                }
6294            } );
6295        },
6296
6297        empty: function() {
6298            var elem,
6299                i = 0;
6300
6301            for ( ; ( elem = this[ i ] ) != null; i++ ) {
6302                if ( elem.nodeType === 1 ) {
6303
6304                    // Prevent memory leaks
6305                    jQuery.cleanData( getAll( elem, false ) );
6306
6307                    // Remove any remaining nodes
6308                    elem.textContent = "";
6309                }
6310            }
6311
6312            return this;
6313        },
6314
6315        clone: function( dataAndEvents, deepDataAndEvents ) {
6316            dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6317            deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6318
6319            return this.map( function() {
6320                return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6321            } );
6322        },
6323
6324        html: function( value ) {
6325            return access( this, function( value ) {
6326                var elem = this[ 0 ] || {},
6327                    i = 0,
6328                    l = this.length;
6329
6330                if ( value === undefined && elem.nodeType === 1 ) {
6331                    return elem.innerHTML;
6332                }
6333
6334                // See if we can take a shortcut and just use innerHTML
6335                if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6336                    !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6337
6338                    value = jQuery.htmlPrefilter( value );
6339
6340                    try {
6341                        for ( ; i < l; i++ ) {
6342                            elem = this[ i ] || {};
6343
6344                            // Remove element nodes and prevent memory leaks
6345                            if ( elem.nodeType === 1 ) {
6346                                jQuery.cleanData( getAll( elem, false ) );
6347                                elem.innerHTML = value;
6348                            }
6349                        }
6350
6351                        elem = 0;
6352
6353                        // If using innerHTML throws an exception, use the fallback method
6354                    } catch ( e ) {}
6355                }
6356
6357                if ( elem ) {
6358                    this.empty().append( value );
6359                }
6360            }, null, value, arguments.length );
6361        },
6362
6363        replaceWith: function() {
6364            var ignored = [];
6365
6366            // Make the changes, replacing each non-ignored context element with the new content
6367            return domManip( this, arguments, function( elem ) {
6368                var parent = this.parentNode;
6369
6370                if ( jQuery.inArray( this, ignored ) < 0 ) {
6371                    jQuery.cleanData( getAll( this ) );
6372                    if ( parent ) {
6373                        parent.replaceChild( elem, this );
6374                    }
6375                }
6376
6377                // Force callback invocation
6378            }, ignored );
6379        }
6380    } );
6381
6382    jQuery.each( {
6383        appendTo: "append",
vendor: 14,475 bytes, lines 6384-6784
6384        prependTo: "prepend",
6385        insertBefore: "before",
6386        insertAfter: "after",
6387        replaceAll: "replaceWith"
6388    }, function( name, original ) {
6389        jQuery.fn[ name ] = function( selector ) {
6390            var elems,
6391                ret = [],
6392                insert = jQuery( selector ),
6393                last = insert.length - 1,
6394                i = 0;
6395
6396            for ( ; i <= last; i++ ) {
6397                elems = i === last ? this : this.clone( true );
6398                jQuery( insert[ i ] )[ original ]( elems );
6399
6400                // Support: Android <=4.0 only, PhantomJS 1 only
6401                // .get() because push.apply(_, arraylike) throws on ancient WebKit
6402                push.apply( ret, elems.get() );
6403            }
6404
6405            return this.pushStack( ret );
6406        };
6407    } );
6408    var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6409
6410    var getStyles = function( elem ) {
6411
6412        // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6413        // IE throws on elements created in popups
6414        // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6415        var view = elem.ownerDocument.defaultView;
6416
6417        if ( !view || !view.opener ) {
6418            view = window;
6419        }
6420
6421        return view.getComputedStyle( elem );
6422    };
6423
6424    var swap = function( elem, options, callback ) {
6425        var ret, name,
6426            old = {};
6427
6428        // Remember the old values, and insert the new ones
6429        for ( name in options ) {
6430            old[ name ] = elem.style[ name ];
6431            elem.style[ name ] = options[ name ];
6432        }
6433
6434        ret = callback.call( elem );
6435
6436        // Revert the old values
6437        for ( name in options ) {
6438            elem.style[ name ] = old[ name ];
6439        }
6440
6441        return ret;
6442    };
6443
6444
6445    var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6446
6447
6448
6449    ( function() {
6450
6451        // Executing both pixelPosition & boxSizingReliable tests require only one layout
6452        // so they're executed at the same time to save the second computation.
6453        function computeStyleTests() {
6454
6455            // This is a singleton, we need to execute it only once
6456            if ( !div ) {
6457                return;
6458            }
6459
6460            container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6461                "margin-top:1px;padding:0;border:0";
6462            div.style.cssText =
6463                "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6464                "margin:auto;border:1px;padding:1px;" +
6465                "width:60%;top:1%";
6466            documentElement.appendChild( container ).appendChild( div );
6467
6468            var divStyle = window.getComputedStyle( div );
6469            pixelPositionVal = divStyle.top !== "1%";
6470
6471            // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6472            reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6473
6474            // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6475            // Some styles come back with percentage values, even though they shouldn't
6476            div.style.right = "60%";
6477            pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6478
6479            // Support: IE 9 - 11 only
6480            // Detect misreporting of content dimensions for box-sizing:border-box elements
6481            boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6482
6483            // Support: IE 9 only
6484            // Detect overflow:scroll screwiness (gh-3699)
6485            // Support: Chrome <=64
6486            // Don't get tricked when zoom affects offsetWidth (gh-4029)
6487            div.style.position = "absolute";
6488            scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6489
6490            documentElement.removeChild( container );
6491
6492            // Nullify the div so it wouldn't be stored in the memory and
6493            // it will also be a sign that checks already performed
6494            div = null;
6495        }
6496
6497        function roundPixelMeasures( measure ) {
6498            return Math.round( parseFloat( measure ) );
6499        }
6500
6501        var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6502            reliableTrDimensionsVal, reliableMarginLeftVal,
6503            container = document.createElement( "div" ),
6504            div = document.createElement( "div" );
6505
6506        // Finish early in limited (non-browser) environments
6507        if ( !div.style ) {
6508            return;
6509        }
6510
6511        // Support: IE <=9 - 11 only
6512        // Style of cloned element affects source element cloned (#8908)
6513        div.style.backgroundClip = "content-box";
6514        div.cloneNode( true ).style.backgroundClip = "";
6515        support.clearCloneStyle = div.style.backgroundClip === "content-box";
6516
6517        jQuery.extend( support, {
6518            boxSizingReliable: function() {
6519                computeStyleTests();
6520                return boxSizingReliableVal;
6521            },
6522            pixelBoxStyles: function() {
6523                computeStyleTests();
6524                return pixelBoxStylesVal;
6525            },
6526            pixelPosition: function() {
6527                computeStyleTests();
6528                return pixelPositionVal;
6529            },
6530            reliableMarginLeft: function() {
6531                computeStyleTests();
6532                return reliableMarginLeftVal;
6533            },
6534            scrollboxSize: function() {
6535                computeStyleTests();
6536                return scrollboxSizeVal;
6537            },
6538
6539            // Support: IE 9 - 11+, Edge 15 - 18+
6540            // IE/Edge misreport `getComputedStyle` of table rows with width/height
6541            // set in CSS while `offset*` properties report correct values.
6542            // Behavior in IE 9 is more subtle than in newer versions & it passes
6543            // some versions of this test; make sure not to make it pass there!
6544            reliableTrDimensions: function() {
6545                var table, tr, trChild, trStyle;
6546                if ( reliableTrDimensionsVal == null ) {
6547                    table = document.createElement( "table" );
6548                    tr = document.createElement( "tr" );
6549                    trChild = document.createElement( "div" );
6550
6551                    table.style.cssText = "position:absolute;left:-11111px";
6552                    tr.style.height = "1px";
6553                    trChild.style.height = "9px";
6554
6555                    documentElement
6556                        .appendChild( table )
6557                        .appendChild( tr )
6558                        .appendChild( trChild );
6559
6560                    trStyle = window.getComputedStyle( tr );
6561                    reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
6562
6563                    documentElement.removeChild( table );
6564                }
6565                return reliableTrDimensionsVal;
6566            }
6567        } );
6568    } )();
6569
6570
6571    function curCSS( elem, name, computed ) {
6572        var width, minWidth, maxWidth, ret,
6573
6574            // Support: Firefox 51+
6575            // Retrieving style before computed somehow
6576            // fixes an issue with getting wrong values
6577            // on detached elements
6578            style = elem.style;
6579
6580        computed = computed || getStyles( elem );
6581
6582        // getPropertyValue is needed for:
6583        //   .css('filter') (IE 9 only, #12537)
6584        //   .css('--customProperty) (#3144)
6585        if ( computed ) {
6586            ret = computed.getPropertyValue( name ) || computed[ name ];
6587
6588            if ( ret === "" && !isAttached( elem ) ) {
6589                ret = jQuery.style( elem, name );
6590            }
6591
6592            // A tribute to the "awesome hack by Dean Edwards"
6593            // Android Browser returns percentage for some values,
6594            // but width seems to be reliably pixels.
6595            // This is against the CSSOM draft spec:
6596            // https://drafts.csswg.org/cssom/#resolved-values
6597            if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6598
6599                // Remember the original values
6600                width = style.width;
6601                minWidth = style.minWidth;
6602                maxWidth = style.maxWidth;
6603
6604                // Put in the new values to get a computed value out
6605                style.minWidth = style.maxWidth = style.width = ret;
6606                ret = computed.width;
6607
6608                // Revert the changed values
6609                style.width = width;
6610                style.minWidth = minWidth;
6611                style.maxWidth = maxWidth;
6612            }
6613        }
6614
6615        return ret !== undefined ?
6616
6617            // Support: IE <=9 - 11 only
6618            // IE returns zIndex value as an integer.
6619            ret + "" :
6620            ret;
6621    }
6622
6623
6624    function addGetHookIf( conditionFn, hookFn ) {
6625
6626        // Define the hook, we'll check on the first run if it's really needed.
6627        return {
6628            get: function() {
6629                if ( conditionFn() ) {
6630
6631                    // Hook not needed (or it's not possible to use it due
6632                    // to missing dependency), remove it.
6633                    delete this.get;
6634                    return;
6635                }
6636
6637                // Hook needed; redefine it so that the support test is not executed again.
6638                return ( this.get = hookFn ).apply( this, arguments );
6639            }
6640        };
6641    }
6642
6643
6644    var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6645        emptyStyle = document.createElement( "div" ).style,
6646        vendorProps = {};
6647
6648// Return a vendor-prefixed property or undefined
6649    function vendorPropName( name ) {
6650
6651        // Check for vendor prefixed names
6652        var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6653            i = cssPrefixes.length;
6654
6655        while ( i-- ) {
6656            name = cssPrefixes[ i ] + capName;
6657            if ( name in emptyStyle ) {
6658                return name;
6659            }
6660        }
6661    }
6662
6663// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6664    function finalPropName( name ) {
6665        var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6666
6667        if ( final ) {
6668            return final;
6669        }
6670        if ( name in emptyStyle ) {
6671            return name;
6672        }
6673        return vendorProps[ name ] = vendorPropName( name ) || name;
6674    }
6675
6676
6677    var
6678
6679        // Swappable if display is none or starts with table
6680        // except "table", "table-cell", or "table-caption"
6681        // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6682        rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6683        rcustomProp = /^--/,
6684        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6685        cssNormalTransform = {
6686            letterSpacing: "0",
6687            fontWeight: "400"
6688        };
6689
6690    function setPositiveNumber( _elem, value, subtract ) {
6691
6692        // Any relative (+/-) values have already been
6693        // normalized at this point
6694        var matches = rcssNum.exec( value );
6695        return matches ?
6696
6697            // Guard against undefined "subtract", e.g., when used as in cssHooks
6698            Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6699            value;
6700    }
6701
6702    function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6703        var i = dimension === "width" ? 1 : 0,
6704            extra = 0,
6705            delta = 0;
6706
6707        // Adjustment may not be necessary
6708        if ( box === ( isBorderBox ? "border" : "content" ) ) {
6709            return 0;
6710        }
6711
6712        for ( ; i < 4; i += 2 ) {
6713
6714            // Both box models exclude margin
6715            if ( box === "margin" ) {
6716                delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6717            }
6718
6719            // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6720            if ( !isBorderBox ) {
6721
6722                // Add padding
6723                delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6724
6725                // For "border" or "margin", add border
6726                if ( box !== "padding" ) {
6727                    delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6728
6729                    // But still keep track of it otherwise
6730                } else {
6731                    extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6732                }
6733
6734                // If we get here with a border-box (content + padding + border), we're seeking "content" or
6735                // "padding" or "margin"
6736            } else {
6737
6738                // For "content", subtract padding
6739                if ( box === "content" ) {
6740                    delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6741                }
6742
6743                // For "content" or "padding", subtract border
6744                if ( box !== "margin" ) {
6745                    delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6746                }
6747            }
6748        }
6749
6750        // Account for positive content-box scroll gutter when requested by providing computedVal
6751        if ( !isBorderBox && computedVal >= 0 ) {
6752
6753            // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6754            // Assuming integer scroll gutter, subtract the rest and round down
6755            delta += Math.max( 0, Math.ceil(
6756                elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6757                computedVal -
6758                delta -
6759                extra -
6760                0.5
6761
6762                // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6763                // Use an explicit zero to avoid NaN (gh-3964)
6764            ) ) || 0;
6765        }
6766
6767        return delta;
6768    }
6769
6770    function getWidthOrHeight( elem, dimension, extra ) {
6771
6772        // Start with computed style
6773        var styles = getStyles( elem ),
6774
6775            // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6776            // Fake content-box until we know it's needed to know the true value.
6777            boxSizingNeeded = !support.boxSizingReliable() || extra,
6778            isBorderBox = boxSizingNeeded &&
6779                jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6780            valueIsBorderBox = isBorderBox,
6781
6782            val = curCSS( elem, dimension, styles ),
6783            offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6784
vendor: 6,163 bytes, lines 6785-6944
6785        // Support: Firefox <=54
6786        // Return a confounding non-pixel value or feign ignorance, as appropriate.
6787        if ( rnumnonpx.test( val ) ) {
6788            if ( !extra ) {
6789                return val;
6790            }
6791            val = "auto";
6792        }
6793
6794
6795        // Support: IE 9 - 11 only
6796        // Use offsetWidth/offsetHeight for when box sizing is unreliable.
6797        // In those cases, the computed value can be trusted to be border-box.
6798        if ( ( !support.boxSizingReliable() && isBorderBox ||
6799
6800            // Support: IE 10 - 11+, Edge 15 - 18+
6801            // IE/Edge misreport `getComputedStyle` of table rows with width/height
6802            // set in CSS while `offset*` properties report correct values.
6803            // Interestingly, in some cases IE 9 doesn't suffer from this issue.
6804            !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6805
6806            // Fall back to offsetWidth/offsetHeight when value is "auto"
6807            // This happens for inline elements with no explicit setting (gh-3571)
6808            val === "auto" ||
6809
6810            // Support: Android <=4.1 - 4.3 only
6811            // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6812            !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6813
6814            // Make sure the element is visible & connected
6815            elem.getClientRects().length ) {
6816
6817            isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6818
6819            // Where available, offsetWidth/offsetHeight approximate border box dimensions.
6820            // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6821            // retrieved value as a content box dimension.
6822            valueIsBorderBox = offsetProp in elem;
6823            if ( valueIsBorderBox ) {
6824                val = elem[ offsetProp ];
6825            }
6826        }
6827
6828        // Normalize "" and auto
6829        val = parseFloat( val ) || 0;
6830
6831        // Adjust for the element's box model
6832        return ( val +
6833            boxModelAdjustment(
6834                elem,
6835                dimension,
6836                extra || ( isBorderBox ? "border" : "content" ),
6837                valueIsBorderBox,
6838                styles,
6839
6840                // Provide the current computed size to request scroll gutter calculation (gh-3589)
6841                val
6842            )
6843        ) + "px";
6844    }
6845
6846    jQuery.extend( {
6847
6848        // Add in style property hooks for overriding the default
6849        // behavior of getting and setting a style property
6850        cssHooks: {
6851            opacity: {
6852                get: function( elem, computed ) {
6853                    if ( computed ) {
6854
6855                        // We should always get a number back from opacity
6856                        var ret = curCSS( elem, "opacity" );
6857                        return ret === "" ? "1" : ret;
6858                    }
6859                }
6860            }
6861        },
6862
6863        // Don't automatically add "px" to these possibly-unitless properties
6864        cssNumber: {
6865            "animationIterationCount": true,
6866            "columnCount": true,
6867            "fillOpacity": true,
6868            "flexGrow": true,
6869            "flexShrink": true,
6870            "fontWeight": true,
6871            "gridArea": true,
6872            "gridColumn": true,
6873            "gridColumnEnd": true,
6874            "gridColumnStart": true,
6875            "gridRow": true,
6876            "gridRowEnd": true,
6877            "gridRowStart": true,
6878            "lineHeight": true,
6879            "opacity": true,
6880            "order": true,
6881            "orphans": true,
6882            "widows": true,
6883            "zIndex": true,
6884            "zoom": true
6885        },
6886
6887        // Add in properties whose names you wish to fix before
6888        // setting or getting the value
6889        cssProps: {},
6890
6891        // Get and set the style property on a DOM Node
6892        style: function( elem, name, value, extra ) {
6893
6894            // Don't set styles on text and comment nodes
6895            if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6896                return;
6897            }
6898
6899            // Make sure that we're working with the right name
6900            var ret, type, hooks,
6901                origName = camelCase( name ),
6902                isCustomProp = rcustomProp.test( name ),
6903                style = elem.style;
6904
6905            // Make sure that we're working with the right name. We don't
6906            // want to query the value if it is a CSS custom property
6907            // since they are user-defined.
6908            if ( !isCustomProp ) {
6909                name = finalPropName( origName );
6910            }
6911
6912            // Gets hook for the prefixed version, then unprefixed version
6913            hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6914
6915            // Check if we're setting a value
6916            if ( value !== undefined ) {
6917                type = typeof value;
6918
6919                // Convert "+=" or "-=" to relative numbers (#7345)
6920                if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6921                    value = adjustCSS( elem, name, ret );
6922
6923                    // Fixes bug #9237
6924                    type = "number";
6925                }
6926
6927                // Make sure that null and NaN values aren't set (#7116)
6928                if ( value == null || value !== value ) {
6929                    return;
6930                }
6931
6932                // If a number was passed in, add the unit (except for certain CSS properties)
6933                // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6934                // "px" to a few hardcoded values.
6935                if ( type === "number" && !isCustomProp ) {
6936                    value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6937                }
6938
6939                // background-* props affect original clone's values
6940                if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6941                    style[ name ] = "inherit";
6942                }
6943
6944                // If a hook was provided, use that value, otherwise just set the specified value
vendor: 15,960 bytes, lines 6945-7389
6945                if ( !hooks || !( "set" in hooks ) ||
6946                    ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6947
6948                    if ( isCustomProp ) {
6949                        style.setProperty( name, value );
6950                    } else {
6951                        style[ name ] = value;
6952                    }
6953                }
6954
6955            } else {
6956
6957                // If a hook was provided get the non-computed value from there
6958                if ( hooks && "get" in hooks &&
6959                    ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6960
6961                    return ret;
6962                }
6963
6964                // Otherwise just get the value from the style object
6965                return style[ name ];
6966            }
6967        },
6968
6969        css: function( elem, name, extra, styles ) {
6970            var val, num, hooks,
6971                origName = camelCase( name ),
6972                isCustomProp = rcustomProp.test( name );
6973
6974            // Make sure that we're working with the right name. We don't
6975            // want to modify the value if it is a CSS custom property
6976            // since they are user-defined.
6977            if ( !isCustomProp ) {
6978                name = finalPropName( origName );
6979            }
6980
6981            // Try prefixed name followed by the unprefixed name
6982            hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6983
6984            // If a hook was provided get the computed value from there
6985            if ( hooks && "get" in hooks ) {
6986                val = hooks.get( elem, true, extra );
6987            }
6988
6989            // Otherwise, if a way to get the computed value exists, use that
6990            if ( val === undefined ) {
6991                val = curCSS( elem, name, styles );
6992            }
6993
6994            // Convert "normal" to computed value
6995            if ( val === "normal" && name in cssNormalTransform ) {
6996                val = cssNormalTransform[ name ];
6997            }
6998
6999            // Make numeric if forced or a qualifier was provided and val looks numeric
7000            if ( extra === "" || extra ) {
7001                num = parseFloat( val );
7002                return extra === true || isFinite( num ) ? num || 0 : val;
7003            }
7004
7005            return val;
7006        }
7007    } );
7008
7009    jQuery.each( [ "height", "width" ], function( _i, dimension ) {
7010        jQuery.cssHooks[ dimension ] = {
7011            get: function( elem, computed, extra ) {
7012                if ( computed ) {
7013
7014                    // Certain elements can have dimension info if we invisibly show them
7015                    // but it must have a current display style that would benefit
7016                    return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
7017
7018                    // Support: Safari 8+
7019                    // Table columns in Safari have non-zero offsetWidth & zero
7020                    // getBoundingClientRect().width unless display is changed.
7021                    // Support: IE <=11 only
7022                    // Running getBoundingClientRect on a disconnected node
7023                    // in IE throws an error.
7024                    ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
7025                        swap( elem, cssShow, function() {
7026                            return getWidthOrHeight( elem, dimension, extra );
7027                        } ) :
7028                        getWidthOrHeight( elem, dimension, extra );
7029                }
7030            },
7031
7032            set: function( elem, value, extra ) {
7033                var matches,
7034                    styles = getStyles( elem ),
7035
7036                    // Only read styles.position if the test has a chance to fail
7037                    // to avoid forcing a reflow.
7038                    scrollboxSizeBuggy = !support.scrollboxSize() &&
7039                        styles.position === "absolute",
7040
7041                    // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
7042                    boxSizingNeeded = scrollboxSizeBuggy || extra,
7043                    isBorderBox = boxSizingNeeded &&
7044                        jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
7045                    subtract = extra ?
7046                        boxModelAdjustment(
7047                            elem,
7048                            dimension,
7049                            extra,
7050                            isBorderBox,
7051                            styles
7052                        ) :
7053                        0;
7054
7055                // Account for unreliable border-box dimensions by comparing offset* to computed and
7056                // faking a content-box to get border and padding (gh-3699)
7057                if ( isBorderBox && scrollboxSizeBuggy ) {
7058                    subtract -= Math.ceil(
7059                        elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
7060                        parseFloat( styles[ dimension ] ) -
7061                        boxModelAdjustment( elem, dimension, "border", false, styles ) -
7062                        0.5
7063                    );
7064                }
7065
7066                // Convert to pixels if value adjustment is needed
7067                if ( subtract && ( matches = rcssNum.exec( value ) ) &&
7068                    ( matches[ 3 ] || "px" ) !== "px" ) {
7069
7070                    elem.style[ dimension ] = value;
7071                    value = jQuery.css( elem, dimension );
7072                }
7073
7074                return setPositiveNumber( elem, value, subtract );
7075            }
7076        };
7077    } );
7078
7079    jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
7080        function( elem, computed ) {
7081            if ( computed ) {
7082                return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
7083                    elem.getBoundingClientRect().left -
7084                    swap( elem, { marginLeft: 0 }, function() {
7085                        return elem.getBoundingClientRect().left;
7086                    } )
7087                ) + "px";
7088            }
7089        }
7090    );
7091
7092// These hooks are used by animate to expand properties
7093    jQuery.each( {
7094        margin: "",
7095        padding: "",
7096        border: "Width"
7097    }, function( prefix, suffix ) {
7098        jQuery.cssHooks[ prefix + suffix ] = {
7099            expand: function( value ) {
7100                var i = 0,
7101                    expanded = {},
7102
7103                    // Assumes a single number if not a string
7104                    parts = typeof value === "string" ? value.split( " " ) : [ value ];
7105
7106                for ( ; i < 4; i++ ) {
7107                    expanded[ prefix + cssExpand[ i ] + suffix ] =
7108                        parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
7109                }
7110
7111                return expanded;
7112            }
7113        };
7114
7115        if ( prefix !== "margin" ) {
7116            jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7117        }
7118    } );
7119
7120    jQuery.fn.extend( {
7121        css: function( name, value ) {
7122            return access( this, function( elem, name, value ) {
7123                var styles, len,
7124                    map = {},
7125                    i = 0;
7126
7127                if ( Array.isArray( name ) ) {
7128                    styles = getStyles( elem );
7129                    len = name.length;
7130
7131                    for ( ; i < len; i++ ) {
7132                        map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
7133                    }
7134
7135                    return map;
7136                }
7137
7138                return value !== undefined ?
7139                    jQuery.style( elem, name, value ) :
7140                    jQuery.css( elem, name );
7141            }, name, value, arguments.length > 1 );
7142        }
7143    } );
7144
7145
7146    function Tween( elem, options, prop, end, easing ) {
7147        return new Tween.prototype.init( elem, options, prop, end, easing );
7148    }
7149    jQuery.Tween = Tween;
7150
7151    Tween.prototype = {
7152        constructor: Tween,
7153        init: function( elem, options, prop, end, easing, unit ) {
7154            this.elem = elem;
7155            this.prop = prop;
7156            this.easing = easing || jQuery.easing._default;
7157            this.options = options;
7158            this.start = this.now = this.cur();
7159            this.end = end;
7160            this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
7161        },
7162        cur: function() {
7163            var hooks = Tween.propHooks[ this.prop ];
7164
7165            return hooks && hooks.get ?
7166                hooks.get( this ) :
7167                Tween.propHooks._default.get( this );
7168        },
7169        run: function( percent ) {
7170            var eased,
7171                hooks = Tween.propHooks[ this.prop ];
7172
7173            if ( this.options.duration ) {
7174                this.pos = eased = jQuery.easing[ this.easing ](
7175                    percent, this.options.duration * percent, 0, 1, this.options.duration
7176                );
7177            } else {
7178                this.pos = eased = percent;
7179            }
7180            this.now = ( this.end - this.start ) * eased + this.start;
7181
7182            if ( this.options.step ) {
7183                this.options.step.call( this.elem, this.now, this );
7184            }
7185
7186            if ( hooks && hooks.set ) {
7187                hooks.set( this );
7188            } else {
7189                Tween.propHooks._default.set( this );
7190            }
7191            return this;
7192        }
7193    };
7194
7195    Tween.prototype.init.prototype = Tween.prototype;
7196
7197    Tween.propHooks = {
7198        _default: {
7199            get: function( tween ) {
7200                var result;
7201
7202                // Use a property on the element directly when it is not a DOM element,
7203                // or when there is no matching style property that exists.
7204                if ( tween.elem.nodeType !== 1 ||
7205                    tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
7206                    return tween.elem[ tween.prop ];
7207                }
7208
7209                // Passing an empty string as a 3rd parameter to .css will automatically
7210                // attempt a parseFloat and fallback to a string if the parse fails.
7211                // Simple values such as "10px" are parsed to Float;
7212                // complex values such as "rotate(1rad)" are returned as-is.
7213                result = jQuery.css( tween.elem, tween.prop, "" );
7214
7215                // Empty strings, null, undefined and "auto" are converted to 0.
7216                return !result || result === "auto" ? 0 : result;
7217            },
7218            set: function( tween ) {
7219
7220                // Use step hook for back compat.
7221                // Use cssHook if its there.
7222                // Use .style if available and use plain properties where available.
7223                if ( jQuery.fx.step[ tween.prop ] ) {
7224                    jQuery.fx.step[ tween.prop ]( tween );
7225                } else if ( tween.elem.nodeType === 1 && (
7226                    jQuery.cssHooks[ tween.prop ] ||
7227                    tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
7228                    jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7229                } else {
7230                    tween.elem[ tween.prop ] = tween.now;
7231                }
7232            }
7233        }
7234    };
7235
7236// Support: IE <=9 only
7237// Panic based approach to setting things on disconnected nodes
7238    Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7239        set: function( tween ) {
7240            if ( tween.elem.nodeType && tween.elem.parentNode ) {
7241                tween.elem[ tween.prop ] = tween.now;
7242            }
7243        }
7244    };
7245
7246    jQuery.easing = {
7247        linear: function( p ) {
7248            return p;
7249        },
7250        swing: function( p ) {
7251            return 0.5 - Math.cos( p * Math.PI ) / 2;
7252        },
7253        _default: "swing"
7254    };
7255
7256    jQuery.fx = Tween.prototype.init;
7257
7258// Back compat <1.8 extension point
7259    jQuery.fx.step = {};
7260
7261
7262
7263
7264    var
7265        fxNow, inProgress,
7266        rfxtypes = /^(?:toggle|show|hide)$/,
7267        rrun = /queueHooks$/;
7268
7269    function schedule() {
7270        if ( inProgress ) {
7271            if ( document.hidden === false && window.requestAnimationFrame ) {
7272                window.requestAnimationFrame( schedule );
7273            } else {
7274                window.setTimeout( schedule, jQuery.fx.interval );
7275            }
7276
7277            jQuery.fx.tick();
7278        }
7279    }
7280
7281// Animations created synchronously will run synchronously
7282    function createFxNow() {
7283        window.setTimeout( function() {
7284            fxNow = undefined;
7285        } );
7286        return ( fxNow = Date.now() );
7287    }
7288
7289// Generate parameters to create a standard animation
7290    function genFx( type, includeWidth ) {
7291        var which,
7292            i = 0,
7293            attrs = { height: type };
7294
7295        // If we include width, step value is 1 to do all cssExpand values,
7296        // otherwise step value is 2 to skip over Left and Right
7297        includeWidth = includeWidth ? 1 : 0;
7298        for ( ; i < 4; i += 2 - includeWidth ) {
7299            which = cssExpand[ i ];
7300            attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7301        }
7302
7303        if ( includeWidth ) {
7304            attrs.opacity = attrs.width = type;
7305        }
7306
7307        return attrs;
7308    }
7309
7310    function createTween( value, prop, animation ) {
7311        var tween,
7312            collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7313            index = 0,
7314            length = collection.length;
7315        for ( ; index < length; index++ ) {
7316            if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7317
7318                // We're done with this property
7319                return tween;
7320            }
7321        }
7322    }
7323
7324    function defaultPrefilter( elem, props, opts ) {
7325        var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7326            isBox = "width" in props || "height" in props,
7327            anim = this,
7328            orig = {},
7329            style = elem.style,
7330            hidden = elem.nodeType && isHiddenWithinTree( elem ),
7331            dataShow = dataPriv.get( elem, "fxshow" );
7332
7333        // Queue-skipping animations hijack the fx hooks
7334        if ( !opts.queue ) {
7335            hooks = jQuery._queueHooks( elem, "fx" );
7336            if ( hooks.unqueued == null ) {
7337                hooks.unqueued = 0;
7338                oldfire = hooks.empty.fire;
7339                hooks.empty.fire = function() {
7340                    if ( !hooks.unqueued ) {
7341                        oldfire();
7342                    }
7343                };
7344            }
7345            hooks.unqueued++;
7346
7347            anim.always( function() {
7348
7349                // Ensure the complete handler is called before this completes
7350                anim.always( function() {
7351                    hooks.unqueued--;
7352                    if ( !jQuery.queue( elem, "fx" ).length ) {
7353                        hooks.empty.fire();
7354                    }
7355                } );
7356            } );
7357        }
7358
7359        // Detect show/hide animations
7360        for ( prop in props ) {
7361            value = props[ prop ];
7362            if ( rfxtypes.test( value ) ) {
7363                delete props[ prop ];
7364                toggle = toggle || value === "toggle";
7365                if ( value === ( hidden ? "hide" : "show" ) ) {
7366
7367                    // Pretend to be hidden if this is a "show" and
7368                    // there is still data from a stopped show/hide
7369                    if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7370                        hidden = true;
7371
7372                        // Ignore all other no-op show/hide data
7373                    } else {
7374                        continue;
7375                    }
7376                }
7377                orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7378            }
7379        }
7380
7381        // Bail out if this is a no-op like .hide().hide()
7382        propTween = !jQuery.isEmptyObject( props );
7383        if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7384            return;
7385        }
7386
7387        // Restrict "overflow" and "display" styles during box animations
7388        if ( isBox && elem.nodeType === 1 ) {
7389
vendor: 5,766 bytes, lines 7390-7545
7390            // Support: IE <=9 - 11, Edge 12 - 15
7391            // Record all 3 overflow attributes because IE does not infer the shorthand
7392            // from identically-valued overflowX and overflowY and Edge just mirrors
7393            // the overflowX value there.
7394            opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7395
7396            // Identify a display type, preferring old show/hide data over the CSS cascade
7397            restoreDisplay = dataShow && dataShow.display;
7398            if ( restoreDisplay == null ) {
7399                restoreDisplay = dataPriv.get( elem, "display" );
7400            }
7401            display = jQuery.css( elem, "display" );
7402            if ( display === "none" ) {
7403                if ( restoreDisplay ) {
7404                    display = restoreDisplay;
7405                } else {
7406
7407                    // Get nonempty value(s) by temporarily forcing visibility
7408                    showHide( [ elem ], true );
7409                    restoreDisplay = elem.style.display || restoreDisplay;
7410                    display = jQuery.css( elem, "display" );
7411                    showHide( [ elem ] );
7412                }
7413            }
7414
7415            // Animate inline elements as inline-block
7416            if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7417                if ( jQuery.css( elem, "float" ) === "none" ) {
7418
7419                    // Restore the original display value at the end of pure show/hide animations
7420                    if ( !propTween ) {
7421                        anim.done( function() {
7422                            style.display = restoreDisplay;
7423                        } );
7424                        if ( restoreDisplay == null ) {
7425                            display = style.display;
7426                            restoreDisplay = display === "none" ? "" : display;
7427                        }
7428                    }
7429                    style.display = "inline-block";
7430                }
7431            }
7432        }
7433
7434        if ( opts.overflow ) {
7435            style.overflow = "hidden";
7436            anim.always( function() {
7437                style.overflow = opts.overflow[ 0 ];
7438                style.overflowX = opts.overflow[ 1 ];
7439                style.overflowY = opts.overflow[ 2 ];
7440            } );
7441        }
7442
7443        // Implement show/hide animations
7444        propTween = false;
7445        for ( prop in orig ) {
7446
7447            // General show/hide setup for this element animation
7448            if ( !propTween ) {
7449                if ( dataShow ) {
7450                    if ( "hidden" in dataShow ) {
7451                        hidden = dataShow.hidden;
7452                    }
7453                } else {
7454                    dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7455                }
7456
7457                // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7458                if ( toggle ) {
7459                    dataShow.hidden = !hidden;
7460                }
7461
7462                // Show elements before animating them
7463                if ( hidden ) {
7464                    showHide( [ elem ], true );
7465                }
7466
7467                /* eslint-disable no-loop-func */
7468
7469                anim.done( function() {
7470
7471                    /* eslint-enable no-loop-func */
7472
7473                    // The final step of a "hide" animation is actually hiding the element
7474                    if ( !hidden ) {
7475                        showHide( [ elem ] );
7476                    }
7477                    dataPriv.remove( elem, "fxshow" );
7478                    for ( prop in orig ) {
7479                        jQuery.style( elem, prop, orig[ prop ] );
7480                    }
7481                } );
7482            }
7483
7484            // Per-property setup
7485            propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7486            if ( !( prop in dataShow ) ) {
7487                dataShow[ prop ] = propTween.start;
7488                if ( hidden ) {
7489                    propTween.end = propTween.start;
7490                    propTween.start = 0;
7491                }
7492            }
7493        }
7494    }
7495
7496    function propFilter( props, specialEasing ) {
7497        var index, name, easing, value, hooks;
7498
7499        // camelCase, specialEasing and expand cssHook pass
7500        for ( index in props ) {
7501            name = camelCase( index );
7502            easing = specialEasing[ name ];
7503            value = props[ index ];
7504            if ( Array.isArray( value ) ) {
7505                easing = value[ 1 ];
7506                value = props[ index ] = value[ 0 ];
7507            }
7508
7509            if ( index !== name ) {
7510                props[ name ] = value;
7511                delete props[ index ];
7512            }
7513
7514            hooks = jQuery.cssHooks[ name ];
7515            if ( hooks && "expand" in hooks ) {
7516                value = hooks.expand( value );
7517                delete props[ name ];
7518
7519                // Not quite $.extend, this won't overwrite existing keys.
7520                // Reusing 'index' because we have the correct "name"
7521                for ( index in value ) {
7522                    if ( !( index in props ) ) {
7523                        props[ index ] = value[ index ];
7524                        specialEasing[ index ] = easing;
7525                    }
7526                }
7527            } else {
7528                specialEasing[ name ] = easing;
7529            }
7530        }
7531    }
7532
7533    function Animation( elem, properties, options ) {
7534        var result,
7535            stopped,
7536            index = 0,
7537            length = Animation.prefilters.length,
7538            deferred = jQuery.Deferred().always( function() {
7539
7540                // Don't match elem in the :animated selector
7541                delete tick.elem;
7542            } ),
7543            tick = function() {
7544                if ( stopped ) {
7545                    return false;
vendor: 20,459 bytes, lines 7546-8161
7546                }
7547                var currentTime = fxNow || createFxNow(),
7548                    remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7549
7550                    // Support: Android 2.3 only
7551                    // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7552                    temp = remaining / animation.duration || 0,
7553                    percent = 1 - temp,
7554                    index = 0,
7555                    length = animation.tweens.length;
7556
7557                for ( ; index < length; index++ ) {
7558                    animation.tweens[ index ].run( percent );
7559                }
7560
7561                deferred.notifyWith( elem, [ animation, percent, remaining ] );
7562
7563                // If there's more to do, yield
7564                if ( percent < 1 && length ) {
7565                    return remaining;
7566                }
7567
7568                // If this was an empty animation, synthesize a final progress notification
7569                if ( !length ) {
7570                    deferred.notifyWith( elem, [ animation, 1, 0 ] );
7571                }
7572
7573                // Resolve the animation and report its conclusion
7574                deferred.resolveWith( elem, [ animation ] );
7575                return false;
7576            },
7577            animation = deferred.promise( {
7578                elem: elem,
7579                props: jQuery.extend( {}, properties ),
7580                opts: jQuery.extend( true, {
7581                    specialEasing: {},
7582                    easing: jQuery.easing._default
7583                }, options ),
7584                originalProperties: properties,
7585                originalOptions: options,
7586                startTime: fxNow || createFxNow(),
7587                duration: options.duration,
7588                tweens: [],
7589                createTween: function( prop, end ) {
7590                    var tween = jQuery.Tween( elem, animation.opts, prop, end,
7591                        animation.opts.specialEasing[ prop ] || animation.opts.easing );
7592                    animation.tweens.push( tween );
7593                    return tween;
7594                },
7595                stop: function( gotoEnd ) {
7596                    var index = 0,
7597
7598                        // If we are going to the end, we want to run all the tweens
7599                        // otherwise we skip this part
7600                        length = gotoEnd ? animation.tweens.length : 0;
7601                    if ( stopped ) {
7602                        return this;
7603                    }
7604                    stopped = true;
7605                    for ( ; index < length; index++ ) {
7606                        animation.tweens[ index ].run( 1 );
7607                    }
7608
7609                    // Resolve when we played the last frame; otherwise, reject
7610                    if ( gotoEnd ) {
7611                        deferred.notifyWith( elem, [ animation, 1, 0 ] );
7612                        deferred.resolveWith( elem, [ animation, gotoEnd ] );
7613                    } else {
7614                        deferred.rejectWith( elem, [ animation, gotoEnd ] );
7615                    }
7616                    return this;
7617                }
7618            } ),
7619            props = animation.props;
7620
7621        propFilter( props, animation.opts.specialEasing );
7622
7623        for ( ; index < length; index++ ) {
7624            result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7625            if ( result ) {
7626                if ( isFunction( result.stop ) ) {
7627                    jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7628                        result.stop.bind( result );
7629                }
7630                return result;
7631            }
7632        }
7633
7634        jQuery.map( props, createTween, animation );
7635
7636        if ( isFunction( animation.opts.start ) ) {
7637            animation.opts.start.call( elem, animation );
7638        }
7639
7640        // Attach callbacks from options
7641        animation
7642            .progress( animation.opts.progress )
7643            .done( animation.opts.done, animation.opts.complete )
7644            .fail( animation.opts.fail )
7645            .always( animation.opts.always );
7646
7647        jQuery.fx.timer(
7648            jQuery.extend( tick, {
7649                elem: elem,
7650                anim: animation,
7651                queue: animation.opts.queue
7652            } )
7653        );
7654
7655        return animation;
7656    }
7657
7658    jQuery.Animation = jQuery.extend( Animation, {
7659
7660        tweeners: {
7661            "*": [ function( prop, value ) {
7662                var tween = this.createTween( prop, value );
7663                adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7664                return tween;
7665            } ]
7666        },
7667
7668        tweener: function( props, callback ) {
7669            if ( isFunction( props ) ) {
7670                callback = props;
7671                props = [ "*" ];
7672            } else {
7673                props = props.match( rnothtmlwhite );
7674            }
7675
7676            var prop,
7677                index = 0,
7678                length = props.length;
7679
7680            for ( ; index < length; index++ ) {
7681                prop = props[ index ];
7682                Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7683                Animation.tweeners[ prop ].unshift( callback );
7684            }
7685        },
7686
7687        prefilters: [ defaultPrefilter ],
7688
7689        prefilter: function( callback, prepend ) {
7690            if ( prepend ) {
7691                Animation.prefilters.unshift( callback );
7692            } else {
7693                Animation.prefilters.push( callback );
7694            }
7695        }
7696    } );
7697
7698    jQuery.speed = function( speed, easing, fn ) {
7699        var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7700            complete: fn || !fn && easing ||
7701                isFunction( speed ) && speed,
7702            duration: speed,
7703            easing: fn && easing || easing && !isFunction( easing ) && easing
7704        };
7705
7706        // Go to the end state if fx are off
7707        if ( jQuery.fx.off ) {
7708            opt.duration = 0;
7709
7710        } else {
7711            if ( typeof opt.duration !== "number" ) {
7712                if ( opt.duration in jQuery.fx.speeds ) {
7713                    opt.duration = jQuery.fx.speeds[ opt.duration ];
7714
7715                } else {
7716                    opt.duration = jQuery.fx.speeds._default;
7717                }
7718            }
7719        }
7720
7721        // Normalize opt.queue - true/undefined/null -> "fx"
7722        if ( opt.queue == null || opt.queue === true ) {
7723            opt.queue = "fx";
7724        }
7725
7726        // Queueing
7727        opt.old = opt.complete;
7728
7729        opt.complete = function() {
7730            if ( isFunction( opt.old ) ) {
7731                opt.old.call( this );
7732            }
7733
7734            if ( opt.queue ) {
7735                jQuery.dequeue( this, opt.queue );
7736            }
7737        };
7738
7739        return opt;
7740    };
7741
7742    jQuery.fn.extend( {
7743        fadeTo: function( speed, to, easing, callback ) {
7744
7745            // Show any hidden elements after setting opacity to 0
7746            return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7747
7748                // Animate to the value specified
7749                .end().animate( { opacity: to }, speed, easing, callback );
7750        },
7751        animate: function( prop, speed, easing, callback ) {
7752            var empty = jQuery.isEmptyObject( prop ),
7753                optall = jQuery.speed( speed, easing, callback ),
7754                doAnimation = function() {
7755
7756                    // Operate on a copy of prop so per-property easing won't be lost
7757                    var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7758
7759                    // Empty animations, or finishing resolves immediately
7760                    if ( empty || dataPriv.get( this, "finish" ) ) {
7761                        anim.stop( true );
7762                    }
7763                };
7764            doAnimation.finish = doAnimation;
7765
7766            return empty || optall.queue === false ?
7767                this.each( doAnimation ) :
7768                this.queue( optall.queue, doAnimation );
7769        },
7770        stop: function( type, clearQueue, gotoEnd ) {
7771            var stopQueue = function( hooks ) {
7772                var stop = hooks.stop;
7773                delete hooks.stop;
7774                stop( gotoEnd );
7775            };
7776
7777            if ( typeof type !== "string" ) {
7778                gotoEnd = clearQueue;
7779                clearQueue = type;
7780                type = undefined;
7781            }
7782            if ( clearQueue ) {
7783                this.queue( type || "fx", [] );
7784            }
7785
7786            return this.each( function() {
7787                var dequeue = true,
7788                    index = type != null && type + "queueHooks",
7789                    timers = jQuery.timers,
7790                    data = dataPriv.get( this );
7791
7792                if ( index ) {
7793                    if ( data[ index ] && data[ index ].stop ) {
7794                        stopQueue( data[ index ] );
7795                    }
7796                } else {
7797                    for ( index in data ) {
7798                        if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7799                            stopQueue( data[ index ] );
7800                        }
7801                    }
7802                }
7803
7804                for ( index = timers.length; index--; ) {
7805                    if ( timers[ index ].elem === this &&
7806                        ( type == null || timers[ index ].queue === type ) ) {
7807
7808                        timers[ index ].anim.stop( gotoEnd );
7809                        dequeue = false;
7810                        timers.splice( index, 1 );
7811                    }
7812                }
7813
7814                // Start the next in the queue if the last step wasn't forced.
7815                // Timers currently will call their complete callbacks, which
7816                // will dequeue but only if they were gotoEnd.
7817                if ( dequeue || !gotoEnd ) {
7818                    jQuery.dequeue( this, type );
7819                }
7820            } );
7821        },
7822        finish: function( type ) {
7823            if ( type !== false ) {
7824                type = type || "fx";
7825            }
7826            return this.each( function() {
7827                var index,
7828                    data = dataPriv.get( this ),
7829                    queue = data[ type + "queue" ],
7830                    hooks = data[ type + "queueHooks" ],
7831                    timers = jQuery.timers,
7832                    length = queue ? queue.length : 0;
7833
7834                // Enable finishing flag on private data
7835                data.finish = true;
7836
7837                // Empty the queue first
7838                jQuery.queue( this, type, [] );
7839
7840                if ( hooks && hooks.stop ) {
7841                    hooks.stop.call( this, true );
7842                }
7843
7844                // Look for any active animations, and finish them
7845                for ( index = timers.length; index--; ) {
7846                    if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7847                        timers[ index ].anim.stop( true );
7848                        timers.splice( index, 1 );
7849                    }
7850                }
7851
7852                // Look for any animations in the old queue and finish them
7853                for ( index = 0; index < length; index++ ) {
7854                    if ( queue[ index ] && queue[ index ].finish ) {
7855                        queue[ index ].finish.call( this );
7856                    }
7857                }
7858
7859                // Turn off finishing flag
7860                delete data.finish;
7861            } );
7862        }
7863    } );
7864
7865    jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7866        var cssFn = jQuery.fn[ name ];
7867        jQuery.fn[ name ] = function( speed, easing, callback ) {
7868            return speed == null || typeof speed === "boolean" ?
7869                cssFn.apply( this, arguments ) :
7870                this.animate( genFx( name, true ), speed, easing, callback );
7871        };
7872    } );
7873
7874// Generate shortcuts for custom animations
7875    jQuery.each( {
7876        slideDown: genFx( "show" ),
7877        slideUp: genFx( "hide" ),
7878        slideToggle: genFx( "toggle" ),
7879        fadeIn: { opacity: "show" },
7880        fadeOut: { opacity: "hide" },
7881        fadeToggle: { opacity: "toggle" }
7882    }, function( name, props ) {
7883        jQuery.fn[ name ] = function( speed, easing, callback ) {
7884            return this.animate( props, speed, easing, callback );
7885        };
7886    } );
7887
7888    jQuery.timers = [];
7889    jQuery.fx.tick = function() {
7890        var timer,
7891            i = 0,
7892            timers = jQuery.timers;
7893
7894        fxNow = Date.now();
7895
7896        for ( ; i < timers.length; i++ ) {
7897            timer = timers[ i ];
7898
7899            // Run the timer and safely remove it when done (allowing for external removal)
7900            if ( !timer() && timers[ i ] === timer ) {
7901                timers.splice( i--, 1 );
7902            }
7903        }
7904
7905        if ( !timers.length ) {
7906            jQuery.fx.stop();
7907        }
7908        fxNow = undefined;
7909    };
7910
7911    jQuery.fx.timer = function( timer ) {
7912        jQuery.timers.push( timer );
7913        jQuery.fx.start();
7914    };
7915
7916    jQuery.fx.interval = 13;
7917    jQuery.fx.start = function() {
7918        if ( inProgress ) {
7919            return;
7920        }
7921
7922        inProgress = true;
7923        schedule();
7924    };
7925
7926    jQuery.fx.stop = function() {
7927        inProgress = null;
7928    };
7929
7930    jQuery.fx.speeds = {
7931        slow: 600,
7932        fast: 200,
7933
7934        // Default speed
7935        _default: 400
7936    };
7937
7938
7939// Based off of the plugin by Clint Helfers, with permission.
7940// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7941    jQuery.fn.delay = function( time, type ) {
7942        time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7943        type = type || "fx";
7944
7945        return this.queue( type, function( next, hooks ) {
7946            var timeout = window.setTimeout( next, time );
7947            hooks.stop = function() {
7948                window.clearTimeout( timeout );
7949            };
7950        } );
7951    };
7952
7953
7954    ( function() {
7955        var input = document.createElement( "input" ),
7956            select = document.createElement( "select" ),
7957            opt = select.appendChild( document.createElement( "option" ) );
7958
7959        input.type = "checkbox";
7960
7961        // Support: Android <=4.3 only
7962        // Default value for a checkbox should be "on"
7963        support.checkOn = input.value !== "";
7964
7965        // Support: IE <=11 only
7966        // Must access selectedIndex to make default options select
7967        support.optSelected = opt.selected;
7968
7969        // Support: IE <=11 only
7970        // An input loses its value after becoming a radio
7971        input = document.createElement( "input" );
7972        input.value = "t";
7973        input.type = "radio";
7974        support.radioValue = input.value === "t";
7975    } )();
7976
7977
7978    var boolHook,
7979        attrHandle = jQuery.expr.attrHandle;
7980
7981    jQuery.fn.extend( {
7982        attr: function( name, value ) {
7983            return access( this, jQuery.attr, name, value, arguments.length > 1 );
7984        },
7985
7986        removeAttr: function( name ) {
7987            return this.each( function() {
7988                jQuery.removeAttr( this, name );
7989            } );
7990        }
7991    } );
7992
7993    jQuery.extend( {
7994        attr: function( elem, name, value ) {
7995            var ret, hooks,
7996                nType = elem.nodeType;
7997
7998            // Don't get/set attributes on text, comment and attribute nodes
7999            if ( nType === 3 || nType === 8 || nType === 2 ) {
8000                return;
8001            }
8002
8003            // Fallback to prop when attributes are not supported
8004            if ( typeof elem.getAttribute === "undefined" ) {
8005                return jQuery.prop( elem, name, value );
8006            }
8007
8008            // Attribute hooks are determined by the lowercase version
8009            // Grab necessary hook if one is defined
8010            if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8011                hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
8012                    ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
8013            }
8014
8015            if ( value !== undefined ) {
8016                if ( value === null ) {
8017                    jQuery.removeAttr( elem, name );
8018                    return;
8019                }
8020
8021                if ( hooks && "set" in hooks &&
8022                    ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8023                    return ret;
8024                }
8025
8026                elem.setAttribute( name, value + "" );
8027                return value;
8028            }
8029
8030            if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8031                return ret;
8032            }
8033
8034            ret = jQuery.find.attr( elem, name );
8035
8036            // Non-existent attributes return null, we normalize to undefined
8037            return ret == null ? undefined : ret;
8038        },
8039
8040        attrHooks: {
8041            type: {
8042                set: function( elem, value ) {
8043                    if ( !support.radioValue && value === "radio" &&
8044                        nodeName( elem, "input" ) ) {
8045                        var val = elem.value;
8046                        elem.setAttribute( "type", value );
8047                        if ( val ) {
8048                            elem.value = val;
8049                        }
8050                        return value;
8051                    }
8052                }
8053            }
8054        },
8055
8056        removeAttr: function( elem, value ) {
8057            var name,
8058                i = 0,
8059
8060                // Attribute names can contain non-HTML whitespace characters
8061                // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
8062                attrNames = value && value.match( rnothtmlwhite );
8063
8064            if ( attrNames && elem.nodeType === 1 ) {
8065                while ( ( name = attrNames[ i++ ] ) ) {
8066                    elem.removeAttribute( name );
8067                }
8068            }
8069        }
8070    } );
8071
8072// Hooks for boolean attributes
8073    boolHook = {
8074        set: function( elem, value, name ) {
8075            if ( value === false ) {
8076
8077                // Remove boolean attributes when set to false
8078                jQuery.removeAttr( elem, name );
8079            } else {
8080                elem.setAttribute( name, name );
8081            }
8082            return name;
8083        }
8084    };
8085
8086    jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
8087        var getter = attrHandle[ name ] || jQuery.find.attr;
8088
8089        attrHandle[ name ] = function( elem, name, isXML ) {
8090            var ret, handle,
8091                lowercaseName = name.toLowerCase();
8092
8093            if ( !isXML ) {
8094
8095                // Avoid an infinite loop by temporarily removing this function from the getter
8096                handle = attrHandle[ lowercaseName ];
8097                attrHandle[ lowercaseName ] = ret;
8098                ret = getter( elem, name, isXML ) != null ?
8099                    lowercaseName :
8100                    null;
8101                attrHandle[ lowercaseName ] = handle;
8102            }
8103            return ret;
8104        };
8105    } );
8106
8107
8108
8109
8110    var rfocusable = /^(?:input|select|textarea|button)$/i,
8111        rclickable = /^(?:a|area)$/i;
8112
8113    jQuery.fn.extend( {
8114        prop: function( name, value ) {
8115            return access( this, jQuery.prop, name, value, arguments.length > 1 );
8116        },
8117
8118        removeProp: function( name ) {
8119            return this.each( function() {
8120                delete this[ jQuery.propFix[ name ] || name ];
8121            } );
8122        }
8123    } );
8124
8125    jQuery.extend( {
8126        prop: function( elem, name, value ) {
8127            var ret, hooks,
8128                nType = elem.nodeType;
8129
8130            // Don't get/set properties on text, comment and attribute nodes
8131            if ( nType === 3 || nType === 8 || nType === 2 ) {
8132                return;
8133            }
8134
8135            if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8136
8137                // Fix name and attach hooks
8138                name = jQuery.propFix[ name ] || name;
8139                hooks = jQuery.propHooks[ name ];
8140            }
8141
8142            if ( value !== undefined ) {
8143                if ( hooks && "set" in hooks &&
8144                    ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8145                    return ret;
8146                }
8147
8148                return ( elem[ name ] = value );
8149            }
8150
8151            if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8152                return ret;
8153            }
8154
8155            return elem[ name ];
8156        },
8157
8158        propHooks: {
8159            tabIndex: {
8160                get: function( elem ) {
8161
vendor: 16,418 bytes, lines 8162-8650
8162                    // Support: IE <=9 - 11 only
8163                    // elem.tabIndex doesn't always return the
8164                    // correct value when it hasn't been explicitly set
8165                    // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8166                    // Use proper attribute retrieval(#12072)
8167                    var tabindex = jQuery.find.attr( elem, "tabindex" );
8168
8169                    if ( tabindex ) {
8170                        return parseInt( tabindex, 10 );
8171                    }
8172
8173                    if (
8174                        rfocusable.test( elem.nodeName ) ||
8175                        rclickable.test( elem.nodeName ) &&
8176                        elem.href
8177                    ) {
8178                        return 0;
8179                    }
8180
8181                    return -1;
8182                }
8183            }
8184        },
8185
8186        propFix: {
8187            "for": "htmlFor",
8188            "class": "className"
8189        }
8190    } );
8191
8192// Support: IE <=11 only
8193// Accessing the selectedIndex property
8194// forces the browser to respect setting selected
8195// on the option
8196// The getter ensures a default option is selected
8197// when in an optgroup
8198// eslint rule "no-unused-expressions" is disabled for this code
8199// since it considers such accessions noop
8200    if ( !support.optSelected ) {
8201        jQuery.propHooks.selected = {
8202            get: function( elem ) {
8203
8204                /* eslint no-unused-expressions: "off" */
8205
8206                var parent = elem.parentNode;
8207                if ( parent && parent.parentNode ) {
8208                    parent.parentNode.selectedIndex;
8209                }
8210                return null;
8211            },
8212            set: function( elem ) {
8213
8214                /* eslint no-unused-expressions: "off" */
8215
8216                var parent = elem.parentNode;
8217                if ( parent ) {
8218                    parent.selectedIndex;
8219
8220                    if ( parent.parentNode ) {
8221                        parent.parentNode.selectedIndex;
8222                    }
8223                }
8224            }
8225        };
8226    }
8227
8228    jQuery.each( [
8229        "tabIndex",
8230        "readOnly",
8231        "maxLength",
8232        "cellSpacing",
8233        "cellPadding",
8234        "rowSpan",
8235        "colSpan",
8236        "useMap",
8237        "frameBorder",
8238        "contentEditable"
8239    ], function() {
8240        jQuery.propFix[ this.toLowerCase() ] = this;
8241    } );
8242
8243
8244
8245
8246    // Strip and collapse whitespace according to HTML spec
8247    // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
8248    function stripAndCollapse( value ) {
8249        var tokens = value.match( rnothtmlwhite ) || [];
8250        return tokens.join( " " );
8251    }
8252
8253
8254    function getClass( elem ) {
8255        return elem.getAttribute && elem.getAttribute( "class" ) || "";
8256    }
8257
8258    function classesToArray( value ) {
8259        if ( Array.isArray( value ) ) {
8260            return value;
8261        }
8262        if ( typeof value === "string" ) {
8263            return value.match( rnothtmlwhite ) || [];
8264        }
8265        return [];
8266    }
8267
8268    jQuery.fn.extend( {
8269        addClass: function( value ) {
8270            var classes, elem, cur, curValue, clazz, j, finalValue,
8271                i = 0;
8272
8273            if ( isFunction( value ) ) {
8274                return this.each( function( j ) {
8275                    jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8276                } );
8277            }
8278
8279            classes = classesToArray( value );
8280
8281            if ( classes.length ) {
8282                while ( ( elem = this[ i++ ] ) ) {
8283                    curValue = getClass( elem );
8284                    cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8285
8286                    if ( cur ) {
8287                        j = 0;
8288                        while ( ( clazz = classes[ j++ ] ) ) {
8289                            if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8290                                cur += clazz + " ";
8291                            }
8292                        }
8293
8294                        // Only assign if different to avoid unneeded rendering.
8295                        finalValue = stripAndCollapse( cur );
8296                        if ( curValue !== finalValue ) {
8297                            elem.setAttribute( "class", finalValue );
8298                        }
8299                    }
8300                }
8301            }
8302
8303            return this;
8304        },
8305
8306        removeClass: function( value ) {
8307            var classes, elem, cur, curValue, clazz, j, finalValue,
8308                i = 0;
8309
8310            if ( isFunction( value ) ) {
8311                return this.each( function( j ) {
8312                    jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8313                } );
8314            }
8315
8316            if ( !arguments.length ) {
8317                return this.attr( "class", "" );
8318            }
8319
8320            classes = classesToArray( value );
8321
8322            if ( classes.length ) {
8323                while ( ( elem = this[ i++ ] ) ) {
8324                    curValue = getClass( elem );
8325
8326                    // This expression is here for better compressibility (see addClass)
8327                    cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8328
8329                    if ( cur ) {
8330                        j = 0;
8331                        while ( ( clazz = classes[ j++ ] ) ) {
8332
8333                            // Remove *all* instances
8334                            while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8335                                cur = cur.replace( " " + clazz + " ", " " );
8336                            }
8337                        }
8338
8339                        // Only assign if different to avoid unneeded rendering.
8340                        finalValue = stripAndCollapse( cur );
8341                        if ( curValue !== finalValue ) {
8342                            elem.setAttribute( "class", finalValue );
8343                        }
8344                    }
8345                }
8346            }
8347
8348            return this;
8349        },
8350
8351        toggleClass: function( value, stateVal ) {
8352            var type = typeof value,
8353                isValidValue = type === "string" || Array.isArray( value );
8354
8355            if ( typeof stateVal === "boolean" && isValidValue ) {
8356                return stateVal ? this.addClass( value ) : this.removeClass( value );
8357            }
8358
8359            if ( isFunction( value ) ) {
8360                return this.each( function( i ) {
8361                    jQuery( this ).toggleClass(
8362                        value.call( this, i, getClass( this ), stateVal ),
8363                        stateVal
8364                    );
8365                } );
8366            }
8367
8368            return this.each( function() {
8369                var className, i, self, classNames;
8370
8371                if ( isValidValue ) {
8372
8373                    // Toggle individual class names
8374                    i = 0;
8375                    self = jQuery( this );
8376                    classNames = classesToArray( value );
8377
8378                    while ( ( className = classNames[ i++ ] ) ) {
8379
8380                        // Check each className given, space separated list
8381                        if ( self.hasClass( className ) ) {
8382                            self.removeClass( className );
8383                        } else {
8384                            self.addClass( className );
8385                        }
8386                    }
8387
8388                    // Toggle whole class name
8389                } else if ( value === undefined || type === "boolean" ) {
8390                    className = getClass( this );
8391                    if ( className ) {
8392
8393                        // Store className if set
8394                        dataPriv.set( this, "__className__", className );
8395                    }
8396
8397                    // If the element has a class name or if we're passed `false`,
8398                    // then remove the whole classname (if there was one, the above saved it).
8399                    // Otherwise bring back whatever was previously saved (if anything),
8400                    // falling back to the empty string if nothing was stored.
8401                    if ( this.setAttribute ) {
8402                        this.setAttribute( "class",
8403                            className || value === false ?
8404                                "" :
8405                                dataPriv.get( this, "__className__" ) || ""
8406                        );
8407                    }
8408                }
8409            } );
8410        },
8411
8412        hasClass: function( selector ) {
8413            var className, elem,
8414                i = 0;
8415
8416            className = " " + selector + " ";
8417            while ( ( elem = this[ i++ ] ) ) {
8418                if ( elem.nodeType === 1 &&
8419                    ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8420                    return true;
8421                }
8422            }
8423
8424            return false;
8425        }
8426    } );
8427
8428
8429
8430
8431    var rreturn = /\r/g;
8432
8433    jQuery.fn.extend( {
8434        val: function( value ) {
8435            var hooks, ret, valueIsFunction,
8436                elem = this[ 0 ];
8437
8438            if ( !arguments.length ) {
8439                if ( elem ) {
8440                    hooks = jQuery.valHooks[ elem.type ] ||
8441                        jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8442
8443                    if ( hooks &&
8444                        "get" in hooks &&
8445                        ( ret = hooks.get( elem, "value" ) ) !== undefined
8446                    ) {
8447                        return ret;
8448                    }
8449
8450                    ret = elem.value;
8451
8452                    // Handle most common string cases
8453                    if ( typeof ret === "string" ) {
8454                        return ret.replace( rreturn, "" );
8455                    }
8456
8457                    // Handle cases where value is null/undef or number
8458                    return ret == null ? "" : ret;
8459                }
8460
8461                return;
8462            }
8463
8464            valueIsFunction = isFunction( value );
8465
8466            return this.each( function( i ) {
8467                var val;
8468
8469                if ( this.nodeType !== 1 ) {
8470                    return;
8471                }
8472
8473                if ( valueIsFunction ) {
8474                    val = value.call( this, i, jQuery( this ).val() );
8475                } else {
8476                    val = value;
8477                }
8478
8479                // Treat null/undefined as ""; convert numbers to string
8480                if ( val == null ) {
8481                    val = "";
8482
8483                } else if ( typeof val === "number" ) {
8484                    val += "";
8485
8486                } else if ( Array.isArray( val ) ) {
8487                    val = jQuery.map( val, function( value ) {
8488                        return value == null ? "" : value + "";
8489                    } );
8490                }
8491
8492                hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8493
8494                // If set returns undefined, fall back to normal setting
8495                if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8496                    this.value = val;
8497                }
8498            } );
8499        }
8500    } );
8501
8502    jQuery.extend( {
8503        valHooks: {
8504            option: {
8505                get: function( elem ) {
8506
8507                    var val = jQuery.find.attr( elem, "value" );
8508                    return val != null ?
8509                        val :
8510
8511                        // Support: IE <=10 - 11 only
8512                        // option.text throws exceptions (#14686, #14858)
8513                        // Strip and collapse whitespace
8514                        // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8515                        stripAndCollapse( jQuery.text( elem ) );
8516                }
8517            },
8518            select: {
8519                get: function( elem ) {
8520                    var value, option, i,
8521                        options = elem.options,
8522                        index = elem.selectedIndex,
8523                        one = elem.type === "select-one",
8524                        values = one ? null : [],
8525                        max = one ? index + 1 : options.length;
8526
8527                    if ( index < 0 ) {
8528                        i = max;
8529
8530                    } else {
8531                        i = one ? index : 0;
8532                    }
8533
8534                    // Loop through all the selected options
8535                    for ( ; i < max; i++ ) {
8536                        option = options[ i ];
8537
8538                        // Support: IE <=9 only
8539                        // IE8-9 doesn't update selected after form reset (#2551)
8540                        if ( ( option.selected || i === index ) &&
8541
8542                            // Don't return options that are disabled or in a disabled optgroup
8543                            !option.disabled &&
8544                            ( !option.parentNode.disabled ||
8545                                !nodeName( option.parentNode, "optgroup" ) ) ) {
8546
8547                            // Get the specific value for the option
8548                            value = jQuery( option ).val();
8549
8550                            // We don't need an array for one selects
8551                            if ( one ) {
8552                                return value;
8553                            }
8554
8555                            // Multi-Selects return an array
8556                            values.push( value );
8557                        }
8558                    }
8559
8560                    return values;
8561                },
8562
8563                set: function( elem, value ) {
8564                    var optionSet, option,
8565                        options = elem.options,
8566                        values = jQuery.makeArray( value ),
8567                        i = options.length;
8568
8569                    while ( i-- ) {
8570                        option = options[ i ];
8571
8572                        /* eslint-disable no-cond-assign */
8573
8574                        if ( option.selected =
8575                            jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8576                        ) {
8577                            optionSet = true;
8578                        }
8579
8580                        /* eslint-enable no-cond-assign */
8581                    }
8582
8583                    // Force browsers to behave consistently when non-matching value is set
8584                    if ( !optionSet ) {
8585                        elem.selectedIndex = -1;
8586                    }
8587                    return values;
8588                }
8589            }
8590        }
8591    } );
8592
8593// Radios and checkboxes getter/setter
8594    jQuery.each( [ "radio", "checkbox" ], function() {
8595        jQuery.valHooks[ this ] = {
8596            set: function( elem, value ) {
8597                if ( Array.isArray( value ) ) {
8598                    return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8599                }
8600            }
8601        };
8602        if ( !support.checkOn ) {
8603            jQuery.valHooks[ this ].get = function( elem ) {
8604                return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8605            };
8606        }
8607    } );
8608
8609
8610
8611
8612// Return jQuery for attributes-only inclusion
8613
8614
8615    support.focusin = "onfocusin" in window;
8616
8617
8618    var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8619        stopPropagationCallback = function( e ) {
8620            e.stopPropagation();
8621        };
8622
8623    jQuery.extend( jQuery.event, {
8624
8625        trigger: function( event, data, elem, onlyHandlers ) {
8626
8627            var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8628                eventPath = [ elem || document ],
8629                type = hasOwn.call( event, "type" ) ? event.type : event,
8630                namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8631
8632            cur = lastElement = tmp = elem = elem || document;
8633
8634            // Don't do events on text and comment nodes
8635            if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8636                return;
8637            }
8638
8639            // focus/blur morphs to focusin/out; ensure we're not firing them right now
8640            if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8641                return;
8642            }
8643
8644            if ( type.indexOf( "." ) > -1 ) {
8645
8646                // Namespaced trigger; create a regexp to match event type in handle()
8647                namespaces = type.split( "." );
8648                type = namespaces.shift();
8649                namespaces.sort();
8650            }
vendor: 5,833 bytes, lines 8651-8806
8651            ontype = type.indexOf( ":" ) < 0 && "on" + type;
8652
8653            // Caller can pass in a jQuery.Event object, Object, or just an event type string
8654            event = event[ jQuery.expando ] ?
8655                event :
8656                new jQuery.Event( type, typeof event === "object" && event );
8657
8658            // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8659            event.isTrigger = onlyHandlers ? 2 : 3;
8660            event.namespace = namespaces.join( "." );
8661            event.rnamespace = event.namespace ?
8662                new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8663                null;
8664
8665            // Clean up the event in case it is being reused
8666            event.result = undefined;
8667            if ( !event.target ) {
8668                event.target = elem;
8669            }
8670
8671            // Clone any incoming data and prepend the event, creating the handler arg list
8672            data = data == null ?
8673                [ event ] :
8674                jQuery.makeArray( data, [ event ] );
8675
8676            // Allow special events to draw outside the lines
8677            special = jQuery.event.special[ type ] || {};
8678            if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8679                return;
8680            }
8681
8682            // Determine event propagation path in advance, per W3C events spec (#9951)
8683            // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8684            if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8685
8686                bubbleType = special.delegateType || type;
8687                if ( !rfocusMorph.test( bubbleType + type ) ) {
8688                    cur = cur.parentNode;
8689                }
8690                for ( ; cur; cur = cur.parentNode ) {
8691                    eventPath.push( cur );
8692                    tmp = cur;
8693                }
8694
8695                // Only add window if we got to document (e.g., not plain obj or detached DOM)
8696                if ( tmp === ( elem.ownerDocument || document ) ) {
8697                    eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8698                }
8699            }
8700
8701            // Fire handlers on the event path
8702            i = 0;
8703            while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8704                lastElement = cur;
8705                event.type = i > 1 ?
8706                    bubbleType :
8707                    special.bindType || type;
8708
8709                // jQuery handler
8710                handle = (
8711                        dataPriv.get( cur, "events" ) || Object.create( null )
8712                    )[ event.type ] &&
8713                    dataPriv.get( cur, "handle" );
8714                if ( handle ) {
8715                    handle.apply( cur, data );
8716                }
8717
8718                // Native handler
8719                handle = ontype && cur[ ontype ];
8720                if ( handle && handle.apply && acceptData( cur ) ) {
8721                    event.result = handle.apply( cur, data );
8722                    if ( event.result === false ) {
8723                        event.preventDefault();
8724                    }
8725                }
8726            }
8727            event.type = type;
8728
8729            // If nobody prevented the default action, do it now
8730            if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8731
8732                if ( ( !special._default ||
8733                    special._default.apply( eventPath.pop(), data ) === false ) &&
8734                    acceptData( elem ) ) {
8735
8736                    // Call a native DOM method on the target with the same name as the event.
8737                    // Don't do default actions on window, that's where global variables be (#6170)
8738                    if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8739
8740                        // Don't re-trigger an onFOO event when we call its FOO() method
8741                        tmp = elem[ ontype ];
8742
8743                        if ( tmp ) {
8744                            elem[ ontype ] = null;
8745                        }
8746
8747                        // Prevent re-triggering of the same event, since we already bubbled it above
8748                        jQuery.event.triggered = type;
8749
8750                        if ( event.isPropagationStopped() ) {
8751                            lastElement.addEventListener( type, stopPropagationCallback );
8752                        }
8753
8754                        elem[ type ]();
8755
8756                        if ( event.isPropagationStopped() ) {
8757                            lastElement.removeEventListener( type, stopPropagationCallback );
8758                        }
8759
8760                        jQuery.event.triggered = undefined;
8761
8762                        if ( tmp ) {
8763                            elem[ ontype ] = tmp;
8764                        }
8765                    }
8766                }
8767            }
8768
8769            return event.result;
8770        },
8771
8772        // Piggyback on a donor event to simulate a different one
8773        // Used only for `focus(in | out)` events
8774        simulate: function( type, elem, event ) {
8775            var e = jQuery.extend(
8776                new jQuery.Event(),
8777                event,
8778                {
8779                    type: type,
8780                    isSimulated: true
8781                }
8782            );
8783
8784            jQuery.event.trigger( e, null, elem );
8785        }
8786
8787    } );
8788
8789    jQuery.fn.extend( {
8790
8791        trigger: function( type, data ) {
8792            return this.each( function() {
8793                jQuery.event.trigger( type, data, this );
8794            } );
8795        },
8796        triggerHandler: function( type, data ) {
8797            var elem = this[ 0 ];
8798            if ( elem ) {
8799                return jQuery.event.trigger( type, data, elem, true );
8800            }
8801        }
8802    } );
8803
8804
8805// Support: Firefox <=44
8806// Firefox doesn't have focus(in | out) events
vendor: 5,764 bytes, lines 8807-8978
8807// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8808//
8809// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8810// focus(in | out) events fire after focus & blur events,
8811// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8812// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8813    if ( !support.focusin ) {
8814        jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8815
8816            // Attach a single capturing handler on the document while someone wants focusin/focusout
8817            var handler = function( event ) {
8818                jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8819            };
8820
8821            jQuery.event.special[ fix ] = {
8822                setup: function() {
8823
8824                    // Handle: regular nodes (via `this.ownerDocument`), window
8825                    // (via `this.document`) & document (via `this`).
8826                    var doc = this.ownerDocument || this.document || this,
8827                        attaches = dataPriv.access( doc, fix );
8828
8829                    if ( !attaches ) {
8830                        doc.addEventListener( orig, handler, true );
8831                    }
8832                    dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8833                },
8834                teardown: function() {
8835                    var doc = this.ownerDocument || this.document || this,
8836                        attaches = dataPriv.access( doc, fix ) - 1;
8837
8838                    if ( !attaches ) {
8839                        doc.removeEventListener( orig, handler, true );
8840                        dataPriv.remove( doc, fix );
8841
8842                    } else {
8843                        dataPriv.access( doc, fix, attaches );
8844                    }
8845                }
8846            };
8847        } );
8848    }
8849    var location = window.location;
8850
8851    var nonce = { guid: Date.now() };
8852
8853    var rquery = ( /\?/ );
8854
8855
8856
8857// Cross-browser xml parsing
8858    jQuery.parseXML = function( data ) {
8859        var xml;
8860        if ( !data || typeof data !== "string" ) {
8861            return null;
8862        }
8863
8864        // Support: IE 9 - 11 only
8865        // IE throws on parseFromString with invalid input.
8866        try {
8867            xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8868        } catch ( e ) {
8869            xml = undefined;
8870        }
8871
8872        if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8873            jQuery.error( "Invalid XML: " + data );
8874        }
8875        return xml;
8876    };
8877
8878
8879    var
8880        rbracket = /\[\]$/,
8881        rCRLF = /\r?\n/g,
8882        rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8883        rsubmittable = /^(?:input|select|textarea|keygen)/i;
8884
8885    function buildParams( prefix, obj, traditional, add ) {
8886        var name;
8887
8888        if ( Array.isArray( obj ) ) {
8889
8890            // Serialize array item.
8891            jQuery.each( obj, function( i, v ) {
8892                if ( traditional || rbracket.test( prefix ) ) {
8893
8894                    // Treat each array item as a scalar.
8895                    add( prefix, v );
8896
8897                } else {
8898
8899                    // Item is non-scalar (array or object), encode its numeric index.
8900                    buildParams(
8901                        prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8902                        v,
8903                        traditional,
8904                        add
8905                    );
8906                }
8907            } );
8908
8909        } else if ( !traditional && toType( obj ) === "object" ) {
8910
8911            // Serialize object item.
8912            for ( name in obj ) {
8913                buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8914            }
8915
8916        } else {
8917
8918            // Serialize scalar item.
8919            add( prefix, obj );
8920        }
8921    }
8922
8923// Serialize an array of form elements or a set of
8924// key/values into a query string
8925    jQuery.param = function( a, traditional ) {
8926        var prefix,
8927            s = [],
8928            add = function( key, valueOrFunction ) {
8929
8930                // If value is a function, invoke it and use its return value
8931                var value = isFunction( valueOrFunction ) ?
8932                    valueOrFunction() :
8933                    valueOrFunction;
8934
8935                s[ s.length ] = encodeURIComponent( key ) + "=" +
8936                    encodeURIComponent( value == null ? "" : value );
8937            };
8938
8939        if ( a == null ) {
8940            return "";
8941        }
8942
8943        // If an array was passed in, assume that it is an array of form elements.
8944        if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8945
8946            // Serialize the form elements
8947            jQuery.each( a, function() {
8948                add( this.name, this.value );
8949            } );
8950
8951        } else {
8952
8953            // If traditional, encode the "old" way (the way 1.3.2 or older
8954            // did it), otherwise encode params recursively.
8955            for ( prefix in a ) {
8956                buildParams( prefix, a[ prefix ], traditional, add );
8957            }
8958        }
8959
8960        // Return the resulting serialization
8961        return s.join( "&" );
8962    };
8963
8964    jQuery.fn.extend( {
8965        serialize: function() {
8966            return jQuery.param( this.serializeArray() );
8967        },
8968        serializeArray: function() {
8969            return this.map( function() {
8970
8971                // Can add propHook for "elements" to filter or add form elements
8972                var elements = jQuery.prop( this, "elements" );
8973                return elements ? jQuery.makeArray( elements ) : this;
8974            } )
8975                .filter( function() {
8976                    var type = this.type;
8977
8978                    // Use .is( ":disabled" ) so that fieldset[disabled] w
vendor: 4,204 bytes, lines 8978-9088
8978orks
8979                    return this.name && !jQuery( this ).is( ":disabled" ) &&
8980                        rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8981                        ( this.checked || !rcheckableType.test( type ) );
8982                } )
8983                .map( function( _i, elem ) {
8984                    var val = jQuery( this ).val();
8985
8986                    if ( val == null ) {
8987                        return null;
8988                    }
8989
8990                    if ( Array.isArray( val ) ) {
8991                        return jQuery.map( val, function( val ) {
8992                            return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8993                        } );
8994                    }
8995
8996                    return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8997                } ).get();
8998        }
8999    } );
9000
9001
9002    var
9003        r20 = /%20/g,
9004        rhash = /#.*$/,
9005        rantiCache = /([?&])_=[^&]*/,
9006        rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
9007
9008        // #7653, #8125, #8152: local protocol detection
9009        rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
9010        rnoContent = /^(?:GET|HEAD)$/,
9011        rprotocol = /^\/\//,
9012
9013        /* Prefilters
9014	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
9015	 * 2) These are called:
9016	 *    - BEFORE asking for a transport
9017	 *    - AFTER param serialization (s.data is a string if s.processData is true)
9018	 * 3) key is the dataType
9019	 * 4) the catchall symbol "*" can be used
9020	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
9021	 */
9022        prefilters = {},
9023
9024        /* Transports bindings
9025	 * 1) key is the dataType
9026	 * 2) the catchall symbol "*" can be used
9027	 * 3) selection will start with transport dataType and THEN go to "*" if needed
9028	 */
9029        transports = {},
9030
9031        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
9032        allTypes = "*/".concat( "*" ),
9033
9034        // Anchor tag for parsing the document origin
9035        originAnchor = document.createElement( "a" );
9036    originAnchor.href = location.href;
9037
9038// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
9039    function addToPrefiltersOrTransports( structure ) {
9040
9041        // dataTypeExpression is optional and defaults to "*"
9042        return function( dataTypeExpression, func ) {
9043
9044            if ( typeof dataTypeExpression !== "string" ) {
9045                func = dataTypeExpression;
9046                dataTypeExpression = "*";
9047            }
9048
9049            var dataType,
9050                i = 0,
9051                dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
9052
9053            if ( isFunction( func ) ) {
9054
9055                // For each dataType in the dataTypeExpression
9056                while ( ( dataType = dataTypes[ i++ ] ) ) {
9057
9058                    // Prepend if requested
9059                    if ( dataType[ 0 ] === "+" ) {
9060                        dataType = dataType.slice( 1 ) || "*";
9061                        ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
9062
9063                        // Otherwise append
9064                    } else {
9065                        ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
9066                    }
9067                }
9068            }
9069        };
9070    }
9071
9072// Base inspection function for prefilters and transports
9073    function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
9074
9075        var inspected = {},
9076            seekingTransport = ( structure === transports );
9077
9078        function inspect( dataType ) {
9079            var selected;
9080            inspected[ dataType ] = true;
9081            jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
9082                var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
9083                if ( typeof dataTypeOrTransport === "string" &&
9084                    !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
9085
9086                    options.dataTypes.unshift( dataTypeOrTransport );
9087                    inspect( dataTypeOrTransport );
9088                    return false;
vendor: 15,305 bytes, lines 9089-9526
9089                } else if ( seekingTransport ) {
9090                    return !( selected = dataTypeOrTransport );
9091                }
9092            } );
9093            return selected;
9094        }
9095
9096        return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
9097    }
9098
9099// A special extend for ajax options
9100// that takes "flat" options (not to be deep extended)
9101// Fixes #9887
9102    function ajaxExtend( target, src ) {
9103        var key, deep,
9104            flatOptions = jQuery.ajaxSettings.flatOptions || {};
9105
9106        for ( key in src ) {
9107            if ( src[ key ] !== undefined ) {
9108                ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
9109            }
9110        }
9111        if ( deep ) {
9112            jQuery.extend( true, target, deep );
9113        }
9114
9115        return target;
9116    }
9117
9118    /* Handles responses to an ajax request:
9119 * - finds the right dataType (mediates between content-type and expected dataType)
9120 * - returns the corresponding response
9121 */
9122    function ajaxHandleResponses( s, jqXHR, responses ) {
9123
9124        var ct, type, finalDataType, firstDataType,
9125            contents = s.contents,
9126            dataTypes = s.dataTypes;
9127
9128        // Remove auto dataType and get content-type in the process
9129        while ( dataTypes[ 0 ] === "*" ) {
9130            dataTypes.shift();
9131            if ( ct === undefined ) {
9132                ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
9133            }
9134        }
9135
9136        // Check if we're dealing with a known content-type
9137        if ( ct ) {
9138            for ( type in contents ) {
9139                if ( contents[ type ] && contents[ type ].test( ct ) ) {
9140                    dataTypes.unshift( type );
9141                    break;
9142                }
9143            }
9144        }
9145
9146        // Check to see if we have a response for the expected dataType
9147        if ( dataTypes[ 0 ] in responses ) {
9148            finalDataType = dataTypes[ 0 ];
9149        } else {
9150
9151            // Try convertible dataTypes
9152            for ( type in responses ) {
9153                if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
9154                    finalDataType = type;
9155                    break;
9156                }
9157                if ( !firstDataType ) {
9158                    firstDataType = type;
9159                }
9160            }
9161
9162            // Or just use first one
9163            finalDataType = finalDataType || firstDataType;
9164        }
9165
9166        // If we found a dataType
9167        // We add the dataType to the list if needed
9168        // and return the corresponding response
9169        if ( finalDataType ) {
9170            if ( finalDataType !== dataTypes[ 0 ] ) {
9171                dataTypes.unshift( finalDataType );
9172            }
9173            return responses[ finalDataType ];
9174        }
9175    }
9176
9177    /* Chain conversions given the request and the original response
9178 * Also sets the responseXXX fields on the jqXHR instance
9179 */
9180    function ajaxConvert( s, response, jqXHR, isSuccess ) {
9181        var conv2, current, conv, tmp, prev,
9182            converters = {},
9183
9184            // Work with a copy of dataTypes in case we need to modify it for conversion
9185            dataTypes = s.dataTypes.slice();
9186
9187        // Create converters map with lowercased keys
9188        if ( dataTypes[ 1 ] ) {
9189            for ( conv in s.converters ) {
9190                converters[ conv.toLowerCase() ] = s.converters[ conv ];
9191            }
9192        }
9193
9194        current = dataTypes.shift();
9195
9196        // Convert to each sequential dataType
9197        while ( current ) {
9198
9199            if ( s.responseFields[ current ] ) {
9200                jqXHR[ s.responseFields[ current ] ] = response;
9201            }
9202
9203            // Apply the dataFilter if provided
9204            if ( !prev && isSuccess && s.dataFilter ) {
9205                response = s.dataFilter( response, s.dataType );
9206            }
9207
9208            prev = current;
9209            current = dataTypes.shift();
9210
9211            if ( current ) {
9212
9213                // There's only work to do if current dataType is non-auto
9214                if ( current === "*" ) {
9215
9216                    current = prev;
9217
9218                    // Convert response if prev dataType is non-auto and differs from current
9219                } else if ( prev !== "*" && prev !== current ) {
9220
9221                    // Seek a direct converter
9222                    conv = converters[ prev + " " + current ] || converters[ "* " + current ];
9223
9224                    // If none found, seek a pair
9225                    if ( !conv ) {
9226                        for ( conv2 in converters ) {
9227
9228                            // If conv2 outputs current
9229                            tmp = conv2.split( " " );
9230                            if ( tmp[ 1 ] === current ) {
9231
9232                                // If prev can be converted to accepted input
9233                                conv = converters[ prev + " " + tmp[ 0 ] ] ||
9234                                    converters[ "* " + tmp[ 0 ] ];
9235                                if ( conv ) {
9236
9237                                    // Condense equivalence converters
9238                                    if ( conv === true ) {
9239                                        conv = converters[ conv2 ];
9240
9241                                        // Otherwise, insert the intermediate dataType
9242                                    } else if ( converters[ conv2 ] !== true ) {
9243                                        current = tmp[ 0 ];
9244                                        dataTypes.unshift( tmp[ 1 ] );
9245                                    }
9246                                    break;
9247                                }
9248                            }
9249                        }
9250                    }
9251
9252                    // Apply converter (if not an equivalence)
9253                    if ( conv !== true ) {
9254
9255                        // Unless errors are allowed to bubble, catch and return them
9256                        if ( conv && s.throws ) {
9257                            response = conv( response );
9258                        } else {
9259                            try {
9260                                response = conv( response );
9261                            } catch ( e ) {
9262                                return {
9263                                    state: "parsererror",
9264                                    error: conv ? e : "No conversion from " + prev + " to " + current
9265                                };
9266                            }
9267                        }
9268                    }
9269                }
9270            }
9271        }
9272
9273        return { state: "success", data: response };
9274    }
9275
9276    jQuery.extend( {
9277
9278        // Counter for holding the number of active queries
9279        active: 0,
9280
9281        // Last-Modified header cache for next request
9282        lastModified: {},
9283        etag: {},
9284
9285        ajaxSettings: {
9286            url: location.href,
9287            type: "GET",
9288            isLocal: rlocalProtocol.test( location.protocol ),
9289            global: true,
9290            processData: true,
9291            async: true,
9292            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9293
9294            /*
9295		timeout: 0,
9296		data: null,
9297		dataType: null,
9298		username: null,
9299		password: null,
9300		cache: null,
9301		throws: false,
9302		traditional: false,
9303		headers: {},
9304		*/
9305
9306            accepts: {
9307                "*": allTypes,
9308                text: "text/plain",
9309                html: "text/html",
9310                xml: "application/xml, text/xml",
9311                json: "application/json, text/javascript"
9312            },
9313
9314            contents: {
9315                xml: /\bxml\b/,
9316                html: /\bhtml/,
9317                json: /\bjson\b/
9318            },
9319
9320            responseFields: {
9321                xml: "responseXML",
9322                text: "responseText",
9323                json: "responseJSON"
9324            },
9325
9326            // Data converters
9327            // Keys separate source (or catchall "*") and destination types with a single space
9328            converters: {
9329
9330                // Convert anything to text
9331                "* text": String,
9332
9333                // Text to html (true = no transformation)
9334                "text html": true,
9335
9336                // Evaluate text as a json expression
9337                "text json": JSON.parse,
9338
9339                // Parse text as xml
9340                "text xml": jQuery.parseXML
9341            },
9342
9343            // For options that shouldn't be deep extended:
9344            // you can add your own custom options here if
9345            // and when you create one that shouldn't be
9346            // deep extended (see ajaxExtend)
9347            flatOptions: {
9348                url: true,
9349                context: true
9350            }
9351        },
9352
9353        // Creates a full fledged settings object into target
9354        // with both ajaxSettings and settings fields.
9355        // If target is omitted, writes into ajaxSettings.
9356        ajaxSetup: function( target, settings ) {
9357            return settings ?
9358
9359                // Building a settings object
9360                ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9361
9362                // Extending ajaxSettings
9363                ajaxExtend( jQuery.ajaxSettings, target );
9364        },
9365
9366        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9367        ajaxTransport: addToPrefiltersOrTransports( transports ),
9368
9369        // Main method
9370        ajax: function( url, options ) {
9371
9372            // If url is an object, simulate pre-1.5 signature
9373            if ( typeof url === "object" ) {
9374                options = url;
9375                url = undefined;
9376            }
9377
9378            // Force options to be an object
9379            options = options || {};
9380
9381            var transport,
9382
9383                // URL without anti-cache param
9384                cacheURL,
9385
9386                // Response headers
9387                responseHeadersString,
9388                responseHeaders,
9389
9390                // timeout handle
9391                timeoutTimer,
9392
9393                // Url cleanup var
9394                urlAnchor,
9395
9396                // Request state (becomes false upon send and true upon completion)
9397                completed,
9398
9399                // To know if global events are to be dispatched
9400                fireGlobals,
9401
9402                // Loop variable
9403                i,
9404
9405                // uncached part of the url
9406                uncached,
9407
9408                // Create the final options object
9409                s = jQuery.ajaxSetup( {}, options ),
9410
9411                // Callbacks context
9412                callbackContext = s.context || s,
9413
9414                // Context for global events is callbackContext if it is a DOM node or jQuery collection
9415                globalEventContext = s.context &&
9416                ( callbackContext.nodeType || callbackContext.jquery ) ?
9417                    jQuery( callbackContext ) :
9418                    jQuery.event,
9419
9420                // Deferreds
9421                deferred = jQuery.Deferred(),
9422                completeDeferred = jQuery.Callbacks( "once memory" ),
9423
9424                // Status-dependent callbacks
9425                statusCode = s.statusCode || {},
9426
9427                // Headers (they are sent all at once)
9428                requestHeaders = {},
9429                requestHeadersNames = {},
9430
9431                // Default abort message
9432                strAbort = "canceled",
9433
9434                // Fake xhr
9435                jqXHR = {
9436                    readyState: 0,
9437
9438                    // Builds headers hashtable if needed
9439                    getResponseHeader: function( key ) {
9440                        var match;
9441                        if ( completed ) {
9442                            if ( !responseHeaders ) {
9443                                responseHeaders = {};
9444                                while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9445                                    responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9446                                        ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9447                                            .concat( match[ 2 ] );
9448                                }
9449                            }
9450                            match = responseHeaders[ key.toLowerCase() + " " ];
9451                        }
9452                        return match == null ? null : match.join( ", " );
9453                    },
9454
9455                    // Raw string
9456                    getAllResponseHeaders: function() {
9457                        return completed ? responseHeadersString : null;
9458                    },
9459
9460                    // Caches the header
9461                    setRequestHeader: function( name, value ) {
9462                        if ( completed == null ) {
9463                            name = requestHeadersNames[ name.toLowerCase() ] =
9464                                requestHeadersNames[ name.toLowerCase() ] || name;
9465                            requestHeaders[ name ] = value;
9466                        }
9467                        return this;
9468                    },
9469
9470                    // Overrides response content-type header
9471                    overrideMimeType: function( type ) {
9472                        if ( completed == null ) {
9473                            s.mimeType = type;
9474                        }
9475                        return this;
9476                    },
9477
9478                    // Status-dependent callbacks
9479                    statusCode: function( map ) {
9480                        var code;
9481                        if ( map ) {
9482                            if ( completed ) {
9483
9484                                // Execute the appropriate callbacks
9485                                jqXHR.always( map[ jqXHR.status ] );
9486                            } else {
9487
9488                                // Lazy-add the new callbacks in a way that preserves old ones
9489                                for ( code in map ) {
9490                                    statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9491                                }
9492                            }
9493                        }
9494                        return this;
9495                    },
9496
9497                    // Cancel the request
9498                    abort: function( statusText ) {
9499                        var finalText = statusText || strAbort;
9500                        if ( transport ) {
9501                            transport.abort( finalText );
9502                        }
9503                        done( 0, finalText );
9504                        return this;
9505                    }
9506                };
9507
9508            // Attach deferreds
9509            deferred.promise( jqXHR );
9510
9511            // Add protocol if not provided (prefilters might expect it)
9512            // Handle falsy url in the settings object (#10093: consistency with old signature)
9513            // We also use the url parameter if available
9514            s.url = ( ( url || s.url || location.href ) + "" )
9515                .replace( rprotocol, location.protocol + "//" );
9516
9517            // Alias method option to type as per ticket #12004
9518            s.type = options.method || options.type || s.method || s.type;
9519
9520            // Extract dataTypes list
9521            s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9522
9523            // A cross-domain request is in order when the origin doesn't match the current origin.
9524            if ( s.crossDomain == null ) {
9525                urlAnchor = document.createElement( "a" );
9526
vendor: 32,436 bytes, lines 9527-10424
9527                // Support: IE <=8 - 11, Edge 12 - 15
9528                // IE throws exception on accessing the href property if url is malformed,
9529                // e.g. http://example.com:80x/
9530                try {
9531                    urlAnchor.href = s.url;
9532
9533                    // Support: IE <=8 - 11 only
9534                    // Anchor's host property isn't correctly set when s.url is relative
9535                    urlAnchor.href = urlAnchor.href;
9536                    s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9537                        urlAnchor.protocol + "//" + urlAnchor.host;
9538                } catch ( e ) {
9539
9540                    // If there is an error parsing the URL, assume it is crossDomain,
9541                    // it can be rejected by the transport if it is invalid
9542                    s.crossDomain = true;
9543                }
9544            }
9545
9546            // Convert data if not already a string
9547            if ( s.data && s.processData && typeof s.data !== "string" ) {
9548                s.data = jQuery.param( s.data, s.traditional );
9549            }
9550
9551            // Apply prefilters
9552            inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9553
9554            // If request was aborted inside a prefilter, stop there
9555            if ( completed ) {
9556                return jqXHR;
9557            }
9558
9559            // We can fire global events as of now if asked to
9560            // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9561            fireGlobals = jQuery.event && s.global;
9562
9563            // Watch for a new set of requests
9564            if ( fireGlobals && jQuery.active++ === 0 ) {
9565                jQuery.event.trigger( "ajaxStart" );
9566            }
9567
9568            // Uppercase the type
9569            s.type = s.type.toUpperCase();
9570
9571            // Determine if request has content
9572            s.hasContent = !rnoContent.test( s.type );
9573
9574            // Save the URL in case we're toying with the If-Modified-Since
9575            // and/or If-None-Match header later on
9576            // Remove hash to simplify url manipulation
9577            cacheURL = s.url.replace( rhash, "" );
9578
9579            // More options handling for requests with no content
9580            if ( !s.hasContent ) {
9581
9582                // Remember the hash so we can put it back
9583                uncached = s.url.slice( cacheURL.length );
9584
9585                // If data is available and should be processed, append data to url
9586                if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9587                    cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9588
9589                    // #9682: remove data so that it's not used in an eventual retry
9590                    delete s.data;
9591                }
9592
9593                // Add or update anti-cache param if needed
9594                if ( s.cache === false ) {
9595                    cacheURL = cacheURL.replace( rantiCache, "$1" );
9596                    uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9597                        uncached;
9598                }
9599
9600                // Put hash and anti-cache on the URL that will be requested (gh-1732)
9601                s.url = cacheURL + uncached;
9602
9603                // Change '%20' to '+' if this is encoded form body content (gh-2658)
9604            } else if ( s.data && s.processData &&
9605                ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9606                s.data = s.data.replace( r20, "+" );
9607            }
9608
9609            // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9610            if ( s.ifModified ) {
9611                if ( jQuery.lastModified[ cacheURL ] ) {
9612                    jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9613                }
9614                if ( jQuery.etag[ cacheURL ] ) {
9615                    jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9616                }
9617            }
9618
9619            // Set the correct header, if data is being sent
9620            if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9621                jqXHR.setRequestHeader( "Content-Type", s.contentType );
9622            }
9623
9624            // Set the Accepts header for the server, depending on the dataType
9625            jqXHR.setRequestHeader(
9626                "Accept",
9627                s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9628                    s.accepts[ s.dataTypes[ 0 ] ] +
9629                    ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9630                    s.accepts[ "*" ]
9631            );
9632
9633            // Check for headers option
9634            for ( i in s.headers ) {
9635                jqXHR.setRequestHeader( i, s.headers[ i ] );
9636            }
9637
9638            // Allow custom headers/mimetypes and early abort
9639            if ( s.beforeSend &&
9640                ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9641
9642                // Abort if not done already and return
9643                return jqXHR.abort();
9644            }
9645
9646            // Aborting is no longer a cancellation
9647            strAbort = "abort";
9648
9649            // Install callbacks on deferreds
9650            completeDeferred.add( s.complete );
9651            jqXHR.done( s.success );
9652            jqXHR.fail( s.error );
9653
9654            // Get transport
9655            transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9656
9657            // If no transport, we auto-abort
9658            if ( !transport ) {
9659                done( -1, "No Transport" );
9660            } else {
9661                jqXHR.readyState = 1;
9662
9663                // Send global event
9664                if ( fireGlobals ) {
9665                    globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9666                }
9667
9668                // If request was aborted inside ajaxSend, stop there
9669                if ( completed ) {
9670                    return jqXHR;
9671                }
9672
9673                // Timeout
9674                if ( s.async && s.timeout > 0 ) {
9675                    timeoutTimer = window.setTimeout( function() {
9676                        jqXHR.abort( "timeout" );
9677                    }, s.timeout );
9678                }
9679
9680                try {
9681                    completed = false;
9682                    transport.send( requestHeaders, done );
9683                } catch ( e ) {
9684
9685                    // Rethrow post-completion exceptions
9686                    if ( completed ) {
9687                        throw e;
9688                    }
9689
9690                    // Propagate others as results
9691                    done( -1, e );
9692                }
9693            }
9694
9695            // Callback for when everything is done
9696            function done( status, nativeStatusText, responses, headers ) {
9697                var isSuccess, success, error, response, modified,
9698                    statusText = nativeStatusText;
9699
9700                // Ignore repeat invocations
9701                if ( completed ) {
9702                    return;
9703                }
9704
9705                completed = true;
9706
9707                // Clear timeout if it exists
9708                if ( timeoutTimer ) {
9709                    window.clearTimeout( timeoutTimer );
9710                }
9711
9712                // Dereference transport for early garbage collection
9713                // (no matter how long the jqXHR object will be used)
9714                transport = undefined;
9715
9716                // Cache response headers
9717                responseHeadersString = headers || "";
9718
9719                // Set readyState
9720                jqXHR.readyState = status > 0 ? 4 : 0;
9721
9722                // Determine if successful
9723                isSuccess = status >= 200 && status < 300 || status === 304;
9724
9725                // Get response data
9726                if ( responses ) {
9727                    response = ajaxHandleResponses( s, jqXHR, responses );
9728                }
9729
9730                // Use a noop converter for missing script
9731                if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
9732                    s.converters[ "text script" ] = function() {};
9733                }
9734
9735                // Convert no matter what (that way responseXXX fields are always set)
9736                response = ajaxConvert( s, response, jqXHR, isSuccess );
9737
9738                // If successful, handle type chaining
9739                if ( isSuccess ) {
9740
9741                    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9742                    if ( s.ifModified ) {
9743                        modified = jqXHR.getResponseHeader( "Last-Modified" );
9744                        if ( modified ) {
9745                            jQuery.lastModified[ cacheURL ] = modified;
9746                        }
9747                        modified = jqXHR.getResponseHeader( "etag" );
9748                        if ( modified ) {
9749                            jQuery.etag[ cacheURL ] = modified;
9750                        }
9751                    }
9752
9753                    // if no content
9754                    if ( status === 204 || s.type === "HEAD" ) {
9755                        statusText = "nocontent";
9756
9757                        // if not modified
9758                    } else if ( status === 304 ) {
9759                        statusText = "notmodified";
9760
9761                        // If we have data, let's convert it
9762                    } else {
9763                        statusText = response.state;
9764                        success = response.data;
9765                        error = response.error;
9766                        isSuccess = !error;
9767                    }
9768                } else {
9769
9770                    // Extract error from statusText and normalize for non-aborts
9771                    error = statusText;
9772                    if ( status || !statusText ) {
9773                        statusText = "error";
9774                        if ( status < 0 ) {
9775                            status = 0;
9776                        }
9777                    }
9778                }
9779
9780                // Set data for the fake xhr object
9781                jqXHR.status = status;
9782                jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9783
9784                // Success/Error
9785                if ( isSuccess ) {
9786                    deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9787                } else {
9788                    deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9789                }
9790
9791                // Status-dependent callbacks
9792                jqXHR.statusCode( statusCode );
9793                statusCode = undefined;
9794
9795                if ( fireGlobals ) {
9796                    globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9797                        [ jqXHR, s, isSuccess ? success : error ] );
9798                }
9799
9800                // Complete
9801                completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9802
9803                if ( fireGlobals ) {
9804                    globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9805
9806                    // Handle the global AJAX counter
9807                    if ( !( --jQuery.active ) ) {
9808                        jQuery.event.trigger( "ajaxStop" );
9809                    }
9810                }
9811            }
9812
9813            return jqXHR;
9814        },
9815
9816        getJSON: function( url, data, callback ) {
9817            return jQuery.get( url, data, callback, "json" );
9818        },
9819
9820        getScript: function( url, callback ) {
9821            return jQuery.get( url, undefined, callback, "script" );
9822        }
9823    } );
9824
9825    jQuery.each( [ "get", "post" ], function( _i, method ) {
9826        jQuery[ method ] = function( url, data, callback, type ) {
9827
9828            // Shift arguments if data argument was omitted
9829            if ( isFunction( data ) ) {
9830                type = type || callback;
9831                callback = data;
9832                data = undefined;
9833            }
9834
9835            // The url can be an options object (which then must have .url)
9836            return jQuery.ajax( jQuery.extend( {
9837                url: url,
9838                type: method,
9839                dataType: type,
9840                data: data,
9841                success: callback
9842            }, jQuery.isPlainObject( url ) && url ) );
9843        };
9844    } );
9845
9846    jQuery.ajaxPrefilter( function( s ) {
9847        var i;
9848        for ( i in s.headers ) {
9849            if ( i.toLowerCase() === "content-type" ) {
9850                s.contentType = s.headers[ i ] || "";
9851            }
9852        }
9853    } );
9854
9855
9856    jQuery._evalUrl = function( url, options, doc ) {
9857        return jQuery.ajax( {
9858            url: url,
9859
9860            // Make this explicit, since user can override this through ajaxSetup (#11264)
9861            type: "GET",
9862            dataType: "script",
9863            cache: true,
9864            async: false,
9865            global: false,
9866
9867            // Only evaluate the response if it is successful (gh-4126)
9868            // dataFilter is not invoked for failure responses, so using it instead
9869            // of the default converter is kludgy but it works.
9870            converters: {
9871                "text script": function() {}
9872            },
9873            dataFilter: function( response ) {
9874                jQuery.globalEval( response, options, doc );
9875            }
9876        } );
9877    };
9878
9879
9880    jQuery.fn.extend( {
9881        wrapAll: function( html ) {
9882            var wrap;
9883
9884            if ( this[ 0 ] ) {
9885                if ( isFunction( html ) ) {
9886                    html = html.call( this[ 0 ] );
9887                }
9888
9889                // The elements to wrap the target around
9890                wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9891
9892                if ( this[ 0 ].parentNode ) {
9893                    wrap.insertBefore( this[ 0 ] );
9894                }
9895
9896                wrap.map( function() {
9897                    var elem = this;
9898
9899                    while ( elem.firstElementChild ) {
9900                        elem = elem.firstElementChild;
9901                    }
9902
9903                    return elem;
9904                } ).append( this );
9905            }
9906
9907            return this;
9908        },
9909
9910        wrapInner: function( html ) {
9911            if ( isFunction( html ) ) {
9912                return this.each( function( i ) {
9913                    jQuery( this ).wrapInner( html.call( this, i ) );
9914                } );
9915            }
9916
9917            return this.each( function() {
9918                var self = jQuery( this ),
9919                    contents = self.contents();
9920
9921                if ( contents.length ) {
9922                    contents.wrapAll( html );
9923
9924                } else {
9925                    self.append( html );
9926                }
9927            } );
9928        },
9929
9930        wrap: function( html ) {
9931            var htmlIsFunction = isFunction( html );
9932
9933            return this.each( function( i ) {
9934                jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9935            } );
9936        },
9937
9938        unwrap: function( selector ) {
9939            this.parent( selector ).not( "body" ).each( function() {
9940                jQuery( this ).replaceWith( this.childNodes );
9941            } );
9942            return this;
9943        }
9944    } );
9945
9946
9947    jQuery.expr.pseudos.hidden = function( elem ) {
9948        return !jQuery.expr.pseudos.visible( elem );
9949    };
9950    jQuery.expr.pseudos.visible = function( elem ) {
9951        return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9952    };
9953
9954
9955
9956
9957    jQuery.ajaxSettings.xhr = function() {
9958        try {
9959            return new window.XMLHttpRequest();
9960        } catch ( e ) {}
9961    };
9962
9963    var xhrSuccessStatus = {
9964
9965            // File protocol always yields status code 0, assume 200
9966            0: 200,
9967
9968            // Support: IE <=9 only
9969            // #1450: sometimes IE returns 1223 when it should be 204
9970            1223: 204
9971        },
9972        xhrSupported = jQuery.ajaxSettings.xhr();
9973
9974    support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9975    support.ajax = xhrSupported = !!xhrSupported;
9976
9977    jQuery.ajaxTransport( function( options ) {
9978        var callback, errorCallback;
9979
9980        // Cross domain only allowed if supported through XMLHttpRequest
9981        if ( support.cors || xhrSupported && !options.crossDomain ) {
9982            return {
9983                send: function( headers, complete ) {
9984                    var i,
9985                        xhr = options.xhr();
9986
9987                    xhr.open(
9988                        options.type,
9989                        options.url,
9990                        options.async,
9991                        options.username,
9992                        options.password
9993                    );
9994
9995                    // Apply custom fields if provided
9996                    if ( options.xhrFields ) {
9997                        for ( i in options.xhrFields ) {
9998                            xhr[ i ] = options.xhrFields[ i ];
9999                        }
10000                    }
10001
10002                    // Override mime type if needed
10003                    if ( options.mimeType && xhr.overrideMimeType ) {
10004                        xhr.overrideMimeType( options.mimeType );
10005                    }
10006
10007                    // X-Requested-With header
10008                    // For cross-domain requests, seeing as conditions for a preflight are
10009                    // akin to a jigsaw puzzle, we simply never set it to be sure.
10010                    // (it can always be set on a per-request basis or even using ajaxSetup)
10011                    // For same-domain requests, won't change header if already provided.
10012                    if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
10013                        headers[ "X-Requested-With" ] = "XMLHttpRequest";
10014                    }
10015
10016                    // Set headers
10017                    for ( i in headers ) {
10018                        xhr.setRequestHeader( i, headers[ i ] );
10019                    }
10020
10021                    // Callback
10022                    callback = function( type ) {
10023                        return function() {
10024                            if ( callback ) {
10025                                callback = errorCallback = xhr.onload =
10026                                    xhr.onerror = xhr.onabort = xhr.ontimeout =
10027                                        xhr.onreadystatechange = null;
10028
10029                                if ( type === "abort" ) {
10030                                    xhr.abort();
10031                                } else if ( type === "error" ) {
10032
10033                                    // Support: IE <=9 only
10034                                    // On a manual native abort, IE9 throws
10035                                    // errors on any property access that is not readyState
10036                                    if ( typeof xhr.status !== "number" ) {
10037                                        complete( 0, "error" );
10038                                    } else {
10039                                        complete(
10040
10041                                            // File: protocol always yields status 0; see #8605, #14207
10042                                            xhr.status,
10043                                            xhr.statusText
10044                                        );
10045                                    }
10046                                } else {
10047                                    complete(
10048                                        xhrSuccessStatus[ xhr.status ] || xhr.status,
10049                                        xhr.statusText,
10050
10051                                        // Support: IE <=9 only
10052                                        // IE9 has no XHR2 but throws on binary (trac-11426)
10053                                        // For XHR2 non-text, let the caller handle it (gh-2498)
10054                                        ( xhr.responseType || "text" ) !== "text"  ||
10055                                        typeof xhr.responseText !== "string" ?
10056                                            { binary: xhr.response } :
10057                                            { text: xhr.responseText },
10058                                        xhr.getAllResponseHeaders()
10059                                    );
10060                                }
10061                            }
10062                        };
10063                    };
10064
10065                    // Listen to events
10066                    xhr.onload = callback();
10067                    errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
10068
10069                    // Support: IE 9 only
10070                    // Use onreadystatechange to replace onabort
10071                    // to handle uncaught aborts
10072                    if ( xhr.onabort !== undefined ) {
10073                        xhr.onabort = errorCallback;
10074                    } else {
10075                        xhr.onreadystatechange = function() {
10076
10077                            // Check readyState before timeout as it changes
10078                            if ( xhr.readyState === 4 ) {
10079
10080                                // Allow onerror to be called first,
10081                                // but that will not handle a native abort
10082                                // Also, save errorCallback to a variable
10083                                // as xhr.onerror cannot be accessed
10084                                window.setTimeout( function() {
10085                                    if ( callback ) {
10086                                        errorCallback();
10087                                    }
10088                                } );
10089                            }
10090                        };
10091                    }
10092
10093                    // Create the abort callback
10094                    callback = callback( "abort" );
10095
10096                    try {
10097
10098                        // Do send the request (this may raise an exception)
10099                        xhr.send( options.hasContent && options.data || null );
10100                    } catch ( e ) {
10101
10102                        // #14683: Only rethrow if this hasn't been notified as an error yet
10103                        if ( callback ) {
10104                            throw e;
10105                        }
10106                    }
10107                },
10108
10109                abort: function() {
10110                    if ( callback ) {
10111                        callback();
10112                    }
10113                }
10114            };
10115        }
10116    } );
10117
10118
10119
10120
10121// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
10122    jQuery.ajaxPrefilter( function( s ) {
10123        if ( s.crossDomain ) {
10124            s.contents.script = false;
10125        }
10126    } );
10127
10128// Install script dataType
10129    jQuery.ajaxSetup( {
10130        accepts: {
10131            script: "text/javascript, application/javascript, " +
10132                "application/ecmascript, application/x-ecmascript"
10133        },
10134        contents: {
10135            script: /\b(?:java|ecma)script\b/
10136        },
10137        converters: {
10138            "text script": function( text ) {
10139                jQuery.globalEval( text );
10140                return text;
10141            }
10142        }
10143    } );
10144
10145// Handle cache's special case and crossDomain
10146    jQuery.ajaxPrefilter( "script", function( s ) {
10147        if ( s.cache === undefined ) {
10148            s.cache = false;
10149        }
10150        if ( s.crossDomain ) {
10151            s.type = "GET";
10152        }
10153    } );
10154
10155// Bind script tag hack transport
10156    jQuery.ajaxTransport( "script", function( s ) {
10157
10158        // This transport only deals with cross domain or forced-by-attrs requests
10159        if ( s.crossDomain || s.scriptAttrs ) {
10160            var script, callback;
10161            return {
10162                send: function( _, complete ) {
10163                    script = jQuery( "<script>" )
10164                        .attr( s.scriptAttrs || {} )
10165                        .prop( { charset: s.scriptCharset, src: s.url } )
10166                        .on( "load error", callback = function( evt ) {
10167                            script.remove();
10168                            callback = null;
10169                            if ( evt ) {
10170                                complete( evt.type === "error" ? 404 : 200, evt.type );
10171                            }
10172                        } );
10173
10174                    // Use native DOM manipulation to avoid our domManip AJAX trickery
10175                    document.head.appendChild( script[ 0 ] );
10176                },
10177                abort: function() {
10178                    if ( callback ) {
10179                        callback();
10180                    }
10181                }
10182            };
10183        }
10184    } );
10185
10186
10187
10188
10189    var oldCallbacks = [],
10190        rjsonp = /(=)\?(?=&|$)|\?\?/;
10191
10192// Default jsonp settings
10193    jQuery.ajaxSetup( {
10194        jsonp: "callback",
10195        jsonpCallback: function() {
10196            var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
10197            this[ callback ] = true;
10198            return callback;
10199        }
10200    } );
10201
10202// Detect, normalize options and install callbacks for jsonp requests
10203    jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
10204
10205        var callbackName, overwritten, responseContainer,
10206            jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
10207                    "url" :
10208                    typeof s.data === "string" &&
10209                    ( s.contentType || "" )
10210                        .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
10211                    rjsonp.test( s.data ) && "data"
10212            );
10213
10214        // Handle iff the expected data type is "jsonp" or we have a parameter to set
10215        if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
10216
10217            // Get callback name, remembering preexisting value associated with it
10218            callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
10219                s.jsonpCallback() :
10220                s.jsonpCallback;
10221
10222            // Insert callback into url or form data
10223            if ( jsonProp ) {
10224                s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
10225            } else if ( s.jsonp !== false ) {
10226                s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
10227            }
10228
10229            // Use data converter to retrieve json after script execution
10230            s.converters[ "script json" ] = function() {
10231                if ( !responseContainer ) {
10232                    jQuery.error( callbackName + " was not called" );
10233                }
10234                return responseContainer[ 0 ];
10235            };
10236
10237            // Force json dataType
10238            s.dataTypes[ 0 ] = "json";
10239
10240            // Install callback
10241            overwritten = window[ callbackName ];
10242            window[ callbackName ] = function() {
10243                responseContainer = arguments;
10244            };
10245
10246            // Clean-up function (fires after converters)
10247            jqXHR.always( function() {
10248
10249                // If previous value didn't exist - remove it
10250                if ( overwritten === undefined ) {
10251                    jQuery( window ).removeProp( callbackName );
10252
10253                    // Otherwise restore preexisting value
10254                } else {
10255                    window[ callbackName ] = overwritten;
10256                }
10257
10258                // Save back as free
10259                if ( s[ callbackName ] ) {
10260
10261                    // Make sure that re-using the options doesn't screw things around
10262                    s.jsonpCallback = originalSettings.jsonpCallback;
10263
10264                    // Save the callback name for future use
10265                    oldCallbacks.push( callbackName );
10266                }
10267
10268                // Call if it was a function and we have a response
10269                if ( responseContainer && isFunction( overwritten ) ) {
10270                    overwritten( responseContainer[ 0 ] );
10271                }
10272
10273                responseContainer = overwritten = undefined;
10274            } );
10275
10276            // Delegate to script
10277            return "script";
10278        }
10279    } );
10280
10281
10282
10283
10284// Support: Safari 8 only
10285// In Safari 8 documents created via document.implementation.createHTMLDocument
10286// collapse sibling forms: the second one becomes a child of the first one.
10287// Because of that, this security measure has to be disabled in Safari 8.
10288// https://bugs.webkit.org/show_bug.cgi?id=137337
10289    support.createHTMLDocument = ( function() {
10290        var body = document.implementation.createHTMLDocument( "" ).body;
10291        body.innerHTML = "<form></form><form></form>";
10292        return body.childNodes.length === 2;
10293    } )();
10294
10295
10296// Argument "data" should be string of html
10297// context (optional): If specified, the fragment will be created in this context,
10298// defaults to document
10299// keepScripts (optional): If true, will include scripts passed in the html string
10300    jQuery.parseHTML = function( data, context, keepScripts ) {
10301        if ( typeof data !== "string" ) {
10302            return [];
10303        }
10304        if ( typeof context === "boolean" ) {
10305            keepScripts = context;
10306            context = false;
10307        }
10308
10309        var base, parsed, scripts;
10310
10311        if ( !context ) {
10312
10313            // Stop scripts or inline event handlers from being executed immediately
10314            // by using document.implementation
10315            if ( support.createHTMLDocument ) {
10316                context = document.implementation.createHTMLDocument( "" );
10317
10318                // Set the base href for the created document
10319                // so any parsed elements with URLs
10320                // are based on the document's URL (gh-2965)
10321                base = context.createElement( "base" );
10322                base.href = document.location.href;
10323                context.head.appendChild( base );
10324            } else {
10325                context = document;
10326            }
10327        }
10328
10329        parsed = rsingleTag.exec( data );
10330        scripts = !keepScripts && [];
10331
10332        // Single tag
10333        if ( parsed ) {
10334            return [ context.createElement( parsed[ 1 ] ) ];
10335        }
10336
10337        parsed = buildFragment( [ data ], context, scripts );
10338
10339        if ( scripts && scripts.length ) {
10340            jQuery( scripts ).remove();
10341        }
10342
10343        return jQuery.merge( [], parsed.childNodes );
10344    };
10345
10346
10347    /**
10348     * Load a url into a page
10349     */
10350    jQuery.fn.load = function( url, params, callback ) {
10351        var selector, type, response,
10352            self = this,
10353            off = url.indexOf( " " );
10354
10355        if ( off > -1 ) {
10356            selector = stripAndCollapse( url.slice( off ) );
10357            url = url.slice( 0, off );
10358        }
10359
10360        // If it's a function
10361        if ( isFunction( params ) ) {
10362
10363            // We assume that it's the callback
10364            callback = params;
10365            params = undefined;
10366
10367            // Otherwise, build a param string
10368        } else if ( params && typeof params === "object" ) {
10369            type = "POST";
10370        }
10371
10372        // If we have elements to modify, make the request
10373        if ( self.length > 0 ) {
10374            jQuery.ajax( {
10375                url: url,
10376
10377                // If "type" variable is undefined, then "GET" method will be used.
10378                // Make value of this field explicit since
10379                // user can override it through ajaxSetup method
10380                type: type || "GET",
10381                dataType: "html",
10382                data: params
10383            } ).done( function( responseText ) {
10384
10385                // Save response for use in complete callback
10386                response = arguments;
10387
10388                self.html( selector ?
10389
10390                    // If a selector was specified, locate the right elements in a dummy div
10391                    // Exclude scripts to avoid IE 'Permission Denied' errors
10392                    jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10393
10394                    // Otherwise use the full result
10395                    responseText );
10396
10397                // If the request succeeds, this function gets "data", "status", "jqXHR"
10398                // but they are ignored because response was set above.
10399                // If it fails, this function gets "jqXHR", "status", "error"
10400            } ).always( callback && function( jqXHR, status ) {
10401                self.each( function() {
10402                    callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10403                } );
10404            } );
10405        }
10406
10407        return this;
10408    };
10409
10410
10411
10412
10413    jQuery.expr.pseudos.animated = function( elem ) {
10414        return jQuery.grep( jQuery.timers, function( fn ) {
10415            return elem === fn.elem;
10416        } ).length;
10417    };
10418
10419
10420
10421
10422    jQuery.offset = {
10423        setOffset: function( elem, options, i ) {
10424            var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, 
vendor: 4,683 bytes, lines 10424-10548
10424calculatePosition,
10425                position = jQuery.css( elem, "position" ),
10426                curElem = jQuery( elem ),
10427                props = {};
10428
10429            // Set position first, in-case top/left are set even on static elem
10430            if ( position === "static" ) {
10431                elem.style.position = "relative";
10432            }
10433
10434            curOffset = curElem.offset();
10435            curCSSTop = jQuery.css( elem, "top" );
10436            curCSSLeft = jQuery.css( elem, "left" );
10437            calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10438                ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10439
10440            // Need to be able to calculate position if either
10441            // top or left is auto and position is either absolute or fixed
10442            if ( calculatePosition ) {
10443                curPosition = curElem.position();
10444                curTop = curPosition.top;
10445                curLeft = curPosition.left;
10446
10447            } else {
10448                curTop = parseFloat( curCSSTop ) || 0;
10449                curLeft = parseFloat( curCSSLeft ) || 0;
10450            }
10451
10452            if ( isFunction( options ) ) {
10453
10454                // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10455                options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10456            }
10457
10458            if ( options.top != null ) {
10459                props.top = ( options.top - curOffset.top ) + curTop;
10460            }
10461            if ( options.left != null ) {
10462                props.left = ( options.left - curOffset.left ) + curLeft;
10463            }
10464
10465            if ( "using" in options ) {
10466                options.using.call( elem, props );
10467
10468            } else {
10469                if ( typeof props.top === "number" ) {
10470                    props.top += "px";
10471                }
10472                if ( typeof props.left === "number" ) {
10473                    props.left += "px";
10474                }
10475                curElem.css( props );
10476            }
10477        }
10478    };
10479
10480    jQuery.fn.extend( {
10481
10482        // offset() relates an element's border box to the document origin
10483        offset: function( options ) {
10484
10485            // Preserve chaining for setter
10486            if ( arguments.length ) {
10487                return options === undefined ?
10488                    this :
10489                    this.each( function( i ) {
10490                        jQuery.offset.setOffset( this, options, i );
10491                    } );
10492            }
10493
10494            var rect, win,
10495                elem = this[ 0 ];
10496
10497            if ( !elem ) {
10498                return;
10499            }
10500
10501            // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10502            // Support: IE <=11 only
10503            // Running getBoundingClientRect on a
10504            // disconnected node in IE throws an error
10505            if ( !elem.getClientRects().length ) {
10506                return { top: 0, left: 0 };
10507            }
10508
10509            // Get document-relative position by adding viewport scroll to viewport-relative gBCR
10510            rect = elem.getBoundingClientRect();
10511            win = elem.ownerDocument.defaultView;
10512            return {
10513                top: rect.top + win.pageYOffset,
10514                left: rect.left + win.pageXOffset
10515            };
10516        },
10517
10518        // position() relates an element's margin box to its offset parent's padding box
10519        // This corresponds to the behavior of CSS absolute positioning
10520        position: function() {
10521            if ( !this[ 0 ] ) {
10522                return;
10523            }
10524
10525            var offsetParent, offset, doc,
10526                elem = this[ 0 ],
10527                parentOffset = { top: 0, left: 0 };
10528
10529            // position:fixed elements are offset from the viewport, which itself always has zero offset
10530            if ( jQuery.css( elem, "position" ) === "fixed" ) {
10531
10532                // Assume position:fixed implies availability of getBoundingClientRect
10533                offset = elem.getBoundingClientRect();
10534
10535            } else {
10536                offset = this.offset();
10537
10538                // Account for the *real* offset parent, which can be the document or its root element
10539                // when a statically positioned element is identified
10540                doc = elem.ownerDocument;
10541                offsetParent = elem.offsetParent || doc.documentElement;
10542                while ( offsetParent &&
10543                ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10544                jQuery.css( offsetParent, "position" ) === "static" ) {
10545
10546                    offsetParent = offsetParent.parentNode;
10547                }
10548                if ( offsetParent && offsetParent !== elem && offsetParent.
vendor: 4,681 bytes, lines 10548-10657
10548nodeType === 1 ) {
10549
10550                    // Incorporate borders into its offset, since they are outside its content origin
10551                    parentOffset = jQuery( offsetParent ).offset();
10552                    parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10553                    parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10554                }
10555            }
10556
10557            // Subtract parent offsets and element margins
10558            return {
10559                top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10560                left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10561            };
10562        },
10563
10564        // This method will return documentElement in the following cases:
10565        // 1) For the element inside the iframe without offsetParent, this method will return
10566        //    documentElement of the parent window
10567        // 2) For the hidden or detached element
10568        // 3) For body or html element, i.e. in case of the html node - it will return itself
10569        //
10570        // but those exceptions were never presented as a real life use-cases
10571        // and might be considered as more preferable results.
10572        //
10573        // This logic, however, is not guaranteed and can change at any point in the future
10574        offsetParent: function() {
10575            return this.map( function() {
10576                var offsetParent = this.offsetParent;
10577
10578                while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10579                    offsetParent = offsetParent.offsetParent;
10580                }
10581
10582                return offsetParent || documentElement;
10583            } );
10584        }
10585    } );
10586
10587// Create scrollLeft and scrollTop methods
10588    jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10589        var top = "pageYOffset" === prop;
10590
10591        jQuery.fn[ method ] = function( val ) {
10592            return access( this, function( elem, method, val ) {
10593
10594                // Coalesce documents and windows
10595                var win;
10596                if ( isWindow( elem ) ) {
10597                    win = elem;
10598                } else if ( elem.nodeType === 9 ) {
10599                    win = elem.defaultView;
10600                }
10601
10602                if ( val === undefined ) {
10603                    return win ? win[ prop ] : elem[ method ];
10604                }
10605
10606                if ( win ) {
10607                    win.scrollTo(
10608                        !top ? val : win.pageXOffset,
10609                        top ? val : win.pageYOffset
10610                    );
10611
10612                } else {
10613                    elem[ method ] = val;
10614                }
10615            }, method, val, arguments.length );
10616        };
10617    } );
10618
10619// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10620// Add the top/left cssHooks using jQuery.fn.position
10621// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10622// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10623// getComputedStyle returns percent when specified for top/left/bottom/right;
10624// rather than make the css module depend on the offset module, just check for it here
10625    jQuery.each( [ "top", "left" ], function( _i, prop ) {
10626        jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10627            function( elem, computed ) {
10628                if ( computed ) {
10629                    computed = curCSS( elem, prop );
10630
10631                    // If curCSS returns percentage, fallback to offset
10632                    return rnumnonpx.test( computed ) ?
10633                        jQuery( elem ).position()[ prop ] + "px" :
10634                        computed;
10635                }
10636            }
10637        );
10638    } );
10639
10640
10641// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10642    jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10643        jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10644            function( defaultExtra, funcName ) {
10645
10646                // Margin is only for outerHeight, outerWidth
10647                jQuery.fn[ funcName ] = function( margin, value ) {
10648                    var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10649                        extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10650
10651                    return access( this, function( elem, type, value ) {
10652                        var doc;
10653
10654                        if ( isWindow( elem ) ) {
10655
10656                            // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10657                            return funcName.indexOf( "outer" ) === 0 ?
vendor: 5,135 bytes, lines 10658-10813
10658                                elem[ "inner" + name ] :
10659                                elem.document.documentElement[ "client" + name ];
10660                        }
10661
10662                        // Get document width or height
10663                        if ( elem.nodeType === 9 ) {
10664                            doc = elem.documentElement;
10665
10666                            // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10667                            // whichever is greatest
10668                            return Math.max(
10669                                elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10670                                elem.body[ "offset" + name ], doc[ "offset" + name ],
10671                                doc[ "client" + name ]
10672                            );
10673                        }
10674
10675                        return value === undefined ?
10676
10677                            // Get width or height on the element, requesting but not forcing parseFloat
10678                            jQuery.css( elem, type, extra ) :
10679
10680                            // Set width or height on the element
10681                            jQuery.style( elem, type, value, extra );
10682                    }, type, chainable ? margin : undefined, chainable );
10683                };
10684            } );
10685    } );
10686
10687
10688    jQuery.each( [
10689        "ajaxStart",
10690        "ajaxStop",
10691        "ajaxComplete",
10692        "ajaxError",
10693        "ajaxSuccess",
10694        "ajaxSend"
10695    ], function( _i, type ) {
10696        jQuery.fn[ type ] = function( fn ) {
10697            return this.on( type, fn );
10698        };
10699    } );
10700
10701
10702
10703
10704    jQuery.fn.extend( {
10705
10706        bind: function( types, data, fn ) {
10707            return this.on( types, null, data, fn );
10708        },
10709        unbind: function( types, fn ) {
10710            return this.off( types, null, fn );
10711        },
10712
10713        delegate: function( selector, types, data, fn ) {
10714            return this.on( types, selector, data, fn );
10715        },
10716        undelegate: function( selector, types, fn ) {
10717
10718            // ( namespace ) or ( selector, types [, fn] )
10719            return arguments.length === 1 ?
10720                this.off( selector, "**" ) :
10721                this.off( types, selector || "**", fn );
10722        },
10723
10724        hover: function( fnOver, fnOut ) {
10725            return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10726        }
10727    } );
10728
10729    jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10730        "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10731        "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10732        function( _i, name ) {
10733
10734            // Handle event binding
10735            jQuery.fn[ name ] = function( data, fn ) {
10736                return arguments.length > 0 ?
10737                    this.on( name, null, data, fn ) :
10738                    this.trigger( name );
10739            };
10740        } );
10741
10742
10743
10744
10745// Support: Android <=4.0 only
10746// Make sure we trim BOM and NBSP
10747    var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
10748
10749// Bind a function to a context, optionally partially applying any
10750// arguments.
10751// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10752// However, it is not slated for removal any time soon
10753    jQuery.proxy = function( fn, context ) {
10754        var tmp, args, proxy;
10755
10756        if ( typeof context === "string" ) {
10757            tmp = fn[ context ];
10758            context = fn;
10759            fn = tmp;
10760        }
10761
10762        // Quick check to determine if target is callable, in the spec
10763        // this throws a TypeError, but we will just return undefined.
10764        if ( !isFunction( fn ) ) {
10765            return undefined;
10766        }
10767
10768        // Simulated bind
10769        args = slice.call( arguments, 2 );
10770        proxy = function() {
10771            return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10772        };
10773
10774        // Set the guid of unique handler to the same of original handler, so it can be removed
10775        proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10776
10777        return proxy;
10778    };
10779
10780    jQuery.holdReady = function( hold ) {
10781        if ( hold ) {
10782            jQuery.readyWait++;
10783        } else {
10784            jQuery.ready( true );
10785        }
10786    };
10787    jQuery.isArray = Array.isArray;
10788    jQuery.parseJSON = JSON.parse;
10789    jQuery.nodeName = nodeName;
10790    jQuery.isFunction = isFunction;
10791    jQuery.isWindow = isWindow;
10792    jQuery.camelCase = camelCase;
10793    jQuery.type = toType;
10794
10795    jQuery.now = Date.now;
10796
10797    jQuery.isNumeric = function( obj ) {
10798
10799        // As of jQuery 3.0, isNumeric is limited to
10800        // strings and numbers (primitives or objects)
10801        // that can be coerced to finite numbers (gh-2662)
10802        var type = jQuery.type( obj );
10803        return ( type === "number" || type === "string" ) &&
10804
10805            // parseFloat NaNs numeric-cast false positives ("")
10806            // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10807            // subtraction forces infinities to NaN
10808            !isNaN( obj - parseFloat( obj ) );
10809    };
10810
10811    jQuery.trim = function( text ) {
10812        return text == null ?
10813            "" :
10814            ( text + "" ).replace( rtrim, "" );
10815    };
10816
10817
10818
10819// Register as a named AMD module, since jQuery can be concatenated with other
10820// files that may use define, but not via a proper concatenation script that
10821// understands anonymous AMD modules. A named AMD is safest and most robust
10822// way to register. Lowercase jquery is used because AMD module names are
10823// derived from file names, and jQuery is normally delivered in a lowercase
10824// file name. Do this after creating the global so that if an AMD module wants
10825// to call noConflict to hide this version of jQuery, it will work.
10826
10827// Note that for maximum portability, libraries that are not jQuery should
10828// declare themselves as anonymous modules, and avoid setting a global if an
10829// AMD loader is present. jQuery is a special case. For more information, see
10830// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10831
10832    if ( typeof define === "function" && define.amd ) {
10833        define( "jquery", [], function() {
10834            return jQuery;
10835        } );
10836    }
10837
10838
10839
10840
10841    var
10842
10843        // Map over jQuery in case of overwrite
10844        _jQuery = window.jQuery,
10845
10846        // Map over the $ in case of overwrite
10847        _$ = window.$;
10848
10849    jQuery.noConflict = function( deep ) {
10850        if ( window.$ === jQuery ) {
10851            window.$ = _$;
10852        }
10853
10854        if ( deep && window.jQuery === jQuery ) {
10855            window.jQuery = _jQuery;
10856        }
10857
10858        return jQuery;
10859    };
10860
10861// Expose jQuery and $ identifiers, even in AMD
10862// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10863// and CommonJS for browser emulators (#13566)
10864    if ( typeof noGlobal === "undefined" ) {
10865        window.jQuery = window.$ = jQuery;
10866    }
10867
10868
10869
10870
10871    return jQuery;
10872} );
10873
10874/******/ (function() { // webpackBootstrap
10875/******/ 	var __webpack_modules__ = ({
10876
10877/***/ 7090:
10878/***/ (function(module) {
10879
10880(function(window, factory) {
10881	var lazySizes = factory(window, window.document, Date);
10882	window.lazySizes = lazySizes;
10883	if( true
vendor: 19,841 bytes, lines 10883-11693
10883 && module.exports){
10884		module.exports = lazySizes;
10885	}
10886}(typeof window != 'undefined' ?
10887      window : {}, 
10888/**
10889 * import("./types/global")
10890 * @typedef { import("./types/lazysizes-config").LazySizesConfigPartial } LazySizesConfigPartial
10891 */
10892function l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost
10893	'use strict';
10894	/*jshint eqnull:true */
10895
10896	var lazysizes,
10897		/**
10898		 * @type { LazySizesConfigPartial }
10899		 */
10900		lazySizesCfg;
10901
10902	(function(){
10903		var prop;
10904
10905		var lazySizesDefaults = {
10906			lazyClass: 'lazyload',
10907			loadedClass: 'lazyloaded',
10908			loadingClass: 'lazyloading',
10909			preloadClass: 'lazypreload',
10910			errorClass: 'lazyerror',
10911			//strictClass: 'lazystrict',
10912			autosizesClass: 'lazyautosizes',
10913			fastLoadedClass: 'ls-is-cached',
10914			iframeLoadMode: 0,
10915			srcAttr: 'data-src',
10916			srcsetAttr: 'data-srcset',
10917			sizesAttr: 'data-sizes',
10918			//preloadAfterLoad: false,
10919			minSize: 40,
10920			customMedia: {},
10921			init: true,
10922			expFactor: 1.5,
10923			hFac: 0.8,
10924			loadMode: 2,
10925			loadHidden: true,
10926			ricTimeout: 0,
10927			throttleDelay: 125,
10928		};
10929
10930		lazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};
10931
10932		for(prop in lazySizesDefaults){
10933			if(!(prop in lazySizesCfg)){
10934				lazySizesCfg[prop] = lazySizesDefaults[prop];
10935			}
10936		}
10937	})();
10938
10939	if (!document || !document.getElementsByClassName) {
10940		return {
10941			init: function () {},
10942			/**
10943			 * @type { LazySizesConfigPartial }
10944			 */
10945			cfg: lazySizesCfg,
10946			/**
10947			 * @type { true }
10948			 */
10949			noSupport: true,
10950		};
10951	}
10952
10953	var docElem = document.documentElement;
10954
10955	var supportPicture = window.HTMLPictureElement;
10956
10957	var _addEventListener = 'addEventListener';
10958
10959	var _getAttribute = 'getAttribute';
10960
10961	/**
10962	 * Update to bind to window because 'this' becomes null during SSR
10963	 * builds.
10964	 */
10965	var addEventListener = window[_addEventListener].bind(window);
10966
10967	var setTimeout = window.setTimeout;
10968
10969	var requestAnimationFrame = window.requestAnimationFrame || setTimeout;
10970
10971	var requestIdleCallback = window.requestIdleCallback;
10972
10973	var regPicture = /^picture$/i;
10974
10975	var loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];
10976
10977	var regClassCache = {};
10978
10979	var forEach = Array.prototype.forEach;
10980
10981	/**
10982	 * @param ele {Element}
10983	 * @param cls {string}
10984	 */
10985	var hasClass = function(ele, cls) {
10986		if(!regClassCache[cls]){
10987			regClassCache[cls] = new RegExp('(\\s|^)'+cls+'(\\s|$)');
10988		}
10989		return regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];
10990	};
10991
10992	/**
10993	 * @param ele {Element}
10994	 * @param cls {string}
10995	 */
10996	var addClass = function(ele, cls) {
10997		if (!hasClass(ele, cls)){
10998			ele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);
10999		}
11000	};
11001
11002	/**
11003	 * @param ele {Element}
11004	 * @param cls {string}
11005	 */
11006	var removeClass = function(ele, cls) {
11007		var reg;
11008		if ((reg = hasClass(ele,cls))) {
11009			ele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));
11010		}
11011	};
11012
11013	var addRemoveLoadEvents = function(dom, fn, add){
11014		var action = add ? _addEventListener : 'removeEventListener';
11015		if(add){
11016			addRemoveLoadEvents(dom, fn);
11017		}
11018		loadEvents.forEach(function(evt){
11019			dom[action](evt, fn);
11020		});
11021	};
11022
11023	/**
11024	 * @param elem { Element }
11025	 * @param name { string }
11026	 * @param detail { any }
11027	 * @param noBubbles { boolean }
11028	 * @param noCancelable { boolean }
11029	 * @returns { CustomEvent }
11030	 */
11031	var triggerEvent = function(elem, name, detail, noBubbles, noCancelable){
11032		var event = document.createEvent('Event');
11033
11034		if(!detail){
11035			detail = {};
11036		}
11037
11038		detail.instance = lazysizes;
11039
11040		event.initEvent(name, !noBubbles, !noCancelable);
11041
11042		event.detail = detail;
11043
11044		elem.dispatchEvent(event);
11045		return event;
11046	};
11047
11048	var updatePolyfill = function (el, full){
11049		var polyfill;
11050		if( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){
11051			if(full && full.src && !el[_getAttribute]('srcset')){
11052				el.setAttribute('srcset', full.src);
11053			}
11054			polyfill({reevaluate: true, elements: [el]});
11055		} else if(full && full.src){
11056			el.src = full.src;
11057		}
11058	};
11059
11060	var getCSS = function (elem, style){
11061		return (getComputedStyle(elem, null) || {})[style];
11062	};
11063
11064	/**
11065	 *
11066	 * @param elem { Element }
11067	 * @param parent { Element }
11068	 * @param [width] {number}
11069	 * @returns {number}
11070	 */
11071	var getWidth = function(elem, parent, width){
11072		width = width || elem.offsetWidth;
11073
11074		while(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){
11075			width =  parent.offsetWidth;
11076			parent = parent.parentNode;
11077		}
11078
11079		return width;
11080	};
11081
11082	var rAF = (function(){
11083		var running, waiting;
11084		var firstFns = [];
11085		var secondFns = [];
11086		var fns = firstFns;
11087
11088		var run = function(){
11089			var runFns = fns;
11090
11091			fns = firstFns.length ? secondFns : firstFns;
11092
11093			running = true;
11094			waiting = false;
11095
11096			while(runFns.length){
11097				runFns.shift()();
11098			}
11099
11100			running = false;
11101		};
11102
11103		var rafBatch = function(fn, queue){
11104			if(running && !queue){
11105				fn.apply(this, arguments);
11106			} else {
11107				fns.push(fn);
11108
11109				if(!waiting){
11110					waiting = true;
11111					(document.hidden ? setTimeout : requestAnimationFrame)(run);
11112				}
11113			}
11114		};
11115
11116		rafBatch._lsFlush = run;
11117
11118		return rafBatch;
11119	})();
11120
11121	var rAFIt = function(fn, simple){
11122		return simple ?
11123			function() {
11124				rAF(fn);
11125			} :
11126			function(){
11127				var that = this;
11128				var args = arguments;
11129				rAF(function(){
11130					fn.apply(that, args);
11131				});
11132			}
11133		;
11134	};
11135
11136	var throttle = function(fn){
11137		var running;
11138		var lastTime = 0;
11139		var gDelay = lazySizesCfg.throttleDelay;
11140		var rICTimeout = lazySizesCfg.ricTimeout;
11141		var run = function(){
11142			running = false;
11143			lastTime = Date.now();
11144			fn();
11145		};
11146		var idleCallback = requestIdleCallback && rICTimeout > 49 ?
11147			function(){
11148				requestIdleCallback(run, {timeout: rICTimeout});
11149
11150				if(rICTimeout !== lazySizesCfg.ricTimeout){
11151					rICTimeout = lazySizesCfg.ricTimeout;
11152				}
11153			} :
11154			rAFIt(function(){
11155				setTimeout(run);
11156			}, true)
11157		;
11158
11159		return function(isPriority){
11160			var delay;
11161
11162			if((isPriority = isPriority === true)){
11163				rICTimeout = 33;
11164			}
11165
11166			if(running){
11167				return;
11168			}
11169
11170			running =  true;
11171
11172			delay = gDelay - (Date.now() - lastTime);
11173
11174			if(delay < 0){
11175				delay = 0;
11176			}
11177
11178			if(isPriority || delay < 9){
11179				idleCallback();
11180			} else {
11181				setTimeout(idleCallback, delay);
11182			}
11183		};
11184	};
11185
11186	//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html
11187	var debounce = function(func) {
11188		var timeout, timestamp;
11189		var wait = 99;
11190		var run = function(){
11191			timeout = null;
11192			func();
11193		};
11194		var later = function() {
11195			var last = Date.now() - timestamp;
11196
11197			if (last < wait) {
11198				setTimeout(later, wait - last);
11199			} else {
11200				(requestIdleCallback || run)(run);
11201			}
11202		};
11203
11204		return function() {
11205			timestamp = Date.now();
11206
11207			if (!timeout) {
11208				timeout = setTimeout(later, wait);
11209			}
11210		};
11211	};
11212
11213	var loader = (function(){
11214		var preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;
11215
11216		var eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;
11217
11218		var regImg = /^img$/i;
11219		var regIframe = /^iframe$/i;
11220
11221		var supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));
11222
11223		var shrinkExpand = 0;
11224		var currentExpand = 0;
11225
11226		var isLoading = 0;
11227		var lowRuns = -1;
11228
11229		var resetPreloading = function(e){
11230			isLoading--;
11231			if(!e || isLoading < 0 || !e.target){
11232				isLoading = 0;
11233			}
11234		};
11235
11236		var isVisible = function (elem) {
11237			if (isBodyHidden == null) {
11238				isBodyHidden = getCSS(document.body, 'visibility') == 'hidden';
11239			}
11240
11241			return isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');
11242		};
11243
11244		var isNestedVisible = function(elem, elemExpand){
11245			var outerRect;
11246			var parent = elem;
11247			var visible = isVisible(elem);
11248
11249			eLtop -= elemExpand;
11250			eLbottom += elemExpand;
11251			eLleft -= elemExpand;
11252			eLright += elemExpand;
11253
11254			while(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){
11255				visible = ((getCSS(parent, 'opacity') || 1) > 0);
11256
11257				if(visible && getCSS(parent, 'overflow') != 'visible'){
11258					outerRect = parent.getBoundingClientRect();
11259					visible = eLright > outerRect.left &&
11260						eLleft < outerRect.right &&
11261						eLbottom > outerRect.top - 1 &&
11262						eLtop < outerRect.bottom + 1
11263					;
11264				}
11265			}
11266
11267			return visible;
11268		};
11269
11270		var checkElements = function() {
11271			var eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,
11272				beforeExpandVal, defaultExpand, preloadExpand, hFac;
11273			var lazyloadElems = lazysizes.elements;
11274
11275			if((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){
11276
11277				i = 0;
11278
11279				lowRuns++;
11280
11281				for(; i < eLlen; i++){
11282
11283					if(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}
11284
11285					if(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}
11286
11287					if(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){
11288						elemExpand = currentExpand;
11289					}
11290
11291					if (!defaultExpand) {
11292						defaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?
11293							docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :
11294							lazySizesCfg.expand;
11295
11296						lazysizes._defEx = defaultExpand;
11297
11298						preloadExpand = defaultExpand * lazySizesCfg.expFactor;
11299						hFac = lazySizesCfg.hFac;
11300						isBodyHidden = null;
11301
11302						if(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){
11303							currentExpand = preloadExpand;
11304							lowRuns = 0;
11305						} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){
11306							currentExpand = defaultExpand;
11307						} else {
11308							currentExpand = shrinkExpand;
11309						}
11310					}
11311
11312					if(beforeExpandVal !== elemExpand){
11313						eLvW = innerWidth + (elemExpand * hFac);
11314						elvH = innerHeight + elemExpand;
11315						elemNegativeExpand = elemExpand * -1;
11316						beforeExpandVal = elemExpand;
11317					}
11318
11319					rect = lazyloadElems[i].getBoundingClientRect();
11320
11321					if ((eLbottom = rect.bottom) >= elemNegativeExpand &&
11322						(eLtop = rect.top) <= elvH &&
11323						(eLright = rect.right) >= elemNegativeExpand * hFac &&
11324						(eLleft = rect.left) <= eLvW &&
11325						(eLbottom || eLright || eLleft || eLtop) &&
11326						(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&
11327						((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){
11328						unveilElement(lazyloadElems[i]);
11329						loadedSomething = true;
11330						if(isLoading > 9){break;}
11331					} else if(!loadedSomething && isCompleted && !autoLoadElem &&
11332						isLoading < 4 && lowRuns < 4 && loadMode > 2 &&
11333						(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&
11334						(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){
11335						autoLoadElem = preloadElems[0] || lazyloadElems[i];
11336					}
11337				}
11338
11339				if(autoLoadElem && !loadedSomething){
11340					unveilElement(autoLoadElem);
11341				}
11342			}
11343		};
11344
11345		var throttledCheckElements = throttle(checkElements);
11346
11347		var switchLoadingClass = function(e){
11348			var elem = e.target;
11349
11350			if (elem._lazyCache) {
11351				delete elem._lazyCache;
11352				return;
11353			}
11354
11355			resetPreloading(e);
11356			addClass(elem, lazySizesCfg.loadedClass);
11357			removeClass(elem, lazySizesCfg.loadingClass);
11358			addRemoveLoadEvents(elem, rafSwitchLoadingClass);
11359			triggerEvent(elem, 'lazyloaded');
11360		};
11361		var rafedSwitchLoadingClass = rAFIt(switchLoadingClass);
11362		var rafSwitchLoadingClass = function(e){
11363			rafedSwitchLoadingClass({target: e.target});
11364		};
11365
11366		var changeIframeSrc = function(elem, src){
11367			var loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;
11368
11369			// loadMode can be also a string!
11370			if (loadMode == 0) {
11371				elem.contentWindow.location.replace(src);
11372			} else if (loadMode == 1) {
11373				elem.src = src;
11374			}
11375		};
11376
11377		var handleSources = function(source){
11378			var customMedia;
11379
11380			var sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);
11381
11382			if( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){
11383				source.setAttribute('media', customMedia);
11384			}
11385
11386			if(sourceSrcset){
11387				source.setAttribute('srcset', sourceSrcset);
11388			}
11389		};
11390
11391		var lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){
11392			var src, srcset, parent, isPicture, event, firesLoad;
11393
11394			if(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){
11395
11396				if(sizes){
11397					if(isAuto){
11398						addClass(elem, lazySizesCfg.autosizesClass);
11399					} else {
11400						elem.setAttribute('sizes', sizes);
11401					}
11402				}
11403
11404				srcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);
11405				src = elem[_getAttribute](lazySizesCfg.srcAttr);
11406
11407				if(isImg) {
11408					parent = elem.parentNode;
11409					isPicture = parent && regPicture.test(parent.nodeName || '');
11410				}
11411
11412				firesLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));
11413
11414				event = {target: elem};
11415
11416				addClass(elem, lazySizesCfg.loadingClass);
11417
11418				if(firesLoad){
11419					clearTimeout(resetPreloadingTimer);
11420					resetPreloadingTimer = setTimeout(resetPreloading, 2500);
11421					addRemoveLoadEvents(elem, rafSwitchLoadingClass, true);
11422				}
11423
11424				if(isPicture){
11425					forEach.call(parent.getElementsByTagName('source'), handleSources);
11426				}
11427
11428				if(srcset){
11429					elem.setAttribute('srcset', srcset);
11430				} else if(src && !isPicture){
11431					if(regIframe.test(elem.nodeName)){
11432						changeIframeSrc(elem, src);
11433					} else {
11434						elem.src = src;
11435					}
11436				}
11437
11438				if(isImg && (srcset || isPicture)){
11439					updatePolyfill(elem, {src: src});
11440				}
11441			}
11442
11443			if(elem._lazyRace){
11444				delete elem._lazyRace;
11445			}
11446			removeClass(elem, lazySizesCfg.lazyClass);
11447
11448			rAF(function(){
11449				// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)
11450				var isLoaded = elem.complete && elem.naturalWidth > 1;
11451
11452				if( !firesLoad || isLoaded){
11453					if (isLoaded) {
11454						addClass(elem, lazySizesCfg.fastLoadedClass);
11455					}
11456					switchLoadingClass(event);
11457					elem._lazyCache = true;
11458					setTimeout(function(){
11459						if ('_lazyCache' in elem) {
11460							delete elem._lazyCache;
11461						}
11462					}, 9);
11463				}
11464				if (elem.loading == 'lazy') {
11465					isLoading--;
11466				}
11467			}, true);
11468		});
11469
11470		/**
11471		 *
11472		 * @param elem { Element }
11473		 */
11474		var unveilElement = function (elem){
11475			if (elem._lazyRace) {return;}
11476			var detail;
11477
11478			var isImg = regImg.test(elem.nodeName);
11479
11480			//allow using sizes="auto", but don't use. it's invalid. Use data-sizes="auto" or a valid value for sizes instead (i.e.: sizes="80vw")
11481			var sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));
11482			var isAuto = sizes == 'auto';
11483
11484			if( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}
11485
11486			detail = triggerEvent(elem, 'lazyunveilread').detail;
11487
11488			if(isAuto){
11489				 autoSizer.updateElem(elem, true, elem.offsetWidth);
11490			}
11491
11492			elem._lazyRace = true;
11493			isLoading++;
11494
11495			lazyUnveil(elem, detail, isAuto, sizes, isImg);
11496		};
11497
11498		var afterScroll = debounce(function(){
11499			lazySizesCfg.loadMode = 3;
11500			throttledCheckElements();
11501		});
11502
11503		var altLoadmodeScrollListner = function(){
11504			if(lazySizesCfg.loadMode == 3){
11505				lazySizesCfg.loadMode = 2;
11506			}
11507			afterScroll();
11508		};
11509
11510		var onload = function(){
11511			if(isCompleted){return;}
11512			if(Date.now() - started < 999){
11513				setTimeout(onload, 999);
11514				return;
11515			}
11516
11517
11518			isCompleted = true;
11519
11520			lazySizesCfg.loadMode = 3;
11521
11522			throttledCheckElements();
11523
11524			addEventListener('scroll', altLoadmodeScrollListner, true);
11525		};
11526
11527		return {
11528			_: function(){
11529				started = Date.now();
11530
11531				lazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);
11532				preloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);
11533
11534				addEventListener('scroll', throttledCheckElements, true);
11535
11536				addEventListener('resize', throttledCheckElements, true);
11537
11538				addEventListener('pageshow', function (e) {
11539					if (e.persisted) {
11540						var loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);
11541
11542						if (loadingElements.length && loadingElements.forEach) {
11543							requestAnimationFrame(function () {
11544								loadingElements.forEach( function (img) {
11545									if (img.complete) {
11546										unveilElement(img);
11547									}
11548								});
11549							});
11550						}
11551					}
11552				});
11553
11554				if(window.MutationObserver){
11555					new MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );
11556				} else {
11557					docElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);
11558					docElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);
11559					setInterval(throttledCheckElements, 999);
11560				}
11561
11562				addEventListener('hashchange', throttledCheckElements, true);
11563
11564				//, 'fullscreenchange'
11565				['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){
11566					document[_addEventListener](name, throttledCheckElements, true);
11567				});
11568
11569				if((/d$|^c/.test(document.readyState))){
11570					onload();
11571				} else {
11572					addEventListener('load', onload);
11573					document[_addEventListener]('DOMContentLoaded', throttledCheckElements);
11574					setTimeout(onload, 20000);
11575				}
11576
11577				if(lazysizes.elements.length){
11578					checkElements();
11579					rAF._lsFlush();
11580				} else {
11581					throttledCheckElements();
11582				}
11583			},
11584			checkElems: throttledCheckElements,
11585			unveil: unveilElement,
11586			_aLSL: altLoadmodeScrollListner,
11587		};
11588	})();
11589
11590
11591	var autoSizer = (function(){
11592		var autosizesElems;
11593
11594		var sizeElement = rAFIt(function(elem, parent, event, width){
11595			var sources, i, len;
11596			elem._lazysizesWidth = width;
11597			width += 'px';
11598
11599			elem.setAttribute('sizes', width);
11600
11601			if(regPicture.test(parent.nodeName || '')){
11602				sources = parent.getElementsByTagName('source');
11603				for(i = 0, len = sources.length; i < len; i++){
11604					sources[i].setAttribute('sizes', width);
11605				}
11606			}
11607
11608			if(!event.detail.dataAttr){
11609				updatePolyfill(elem, event.detail);
11610			}
11611		});
11612		/**
11613		 *
11614		 * @param elem {Element}
11615		 * @param dataAttr
11616		 * @param [width] { number }
11617		 */
11618		var getSizeElement = function (elem, dataAttr, width){
11619			var event;
11620			var parent = elem.parentNode;
11621
11622			if(parent){
11623				width = getWidth(elem, parent, width);
11624				event = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});
11625
11626				if(!event.defaultPrevented){
11627					width = event.detail.width;
11628
11629					if(width && width !== elem._lazysizesWidth){
11630						sizeElement(elem, parent, event, width);
11631					}
11632				}
11633			}
11634		};
11635
11636		var updateElementsSizes = function(){
11637			var i;
11638			var len = autosizesElems.length;
11639			if(len){
11640				i = 0;
11641
11642				for(; i < len; i++){
11643					getSizeElement(autosizesElems[i]);
11644				}
11645			}
11646		};
11647
11648		var debouncedUpdateElementsSizes = debounce(updateElementsSizes);
11649
11650		return {
11651			_: function(){
11652				autosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);
11653				addEventListener('resize', debouncedUpdateElementsSizes);
11654			},
11655			checkElems: debouncedUpdateElementsSizes,
11656			updateElem: getSizeElement
11657		};
11658	})();
11659
11660	var init = function(){
11661		if(!init.i && document.getElementsByClassName){
11662			init.i = true;
11663			autoSizer._();
11664			loader._();
11665		}
11666	};
11667
11668	setTimeout(function(){
11669		if(lazySizesCfg.init){
11670			init();
11671		}
11672	});
11673
11674	lazysizes = {
11675		/**
11676		 * @type { LazySizesConfigPartial }
11677		 */
11678		cfg: lazySizesCfg,
11679		autoSizer: autoSizer,
11680		loader: loader,
11681		init: init,
11682		uP: updatePolyfill,
11683		aC: addClass,
11684		rC: removeClass,
11685		hC: hasClass,
11686		fire: triggerEvent,
11687		gW: getWidth,
11688		rAF: rAF,
11689	};
11690
11691	return lazysizes;
11692}
11693));
11694
11695
11696/***/ }),
11697
11698/***/ 5222:
11699/***/ (function(module, exports, __webpack_require__) {
11700
11701var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*
11702This lazySizes extension adds better support for print.
11703In case the user starts to print lazysizes will load all images.
11704*/
11705(function(window, factory) {
11706	var globalInstall = function(){
11707		factory(window.lazySizes);
11708		window.removeEventListener('lazyunveilread', globalInstall, true);
11709	};
11710
11711	factory = factory.bind(null, window, window.document);
11712
11713	if( true && module.exports){
11714		factory(__webpack_require__(7090));
11715	} else if (true) {
11716		!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(7090)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
11717		__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
11718		(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
11719		__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
11720	} else {}
11721}(window, function(window, document, lazySizes) {
11722	/*jshint eqnull:true */
11723	'use strict';
11724	var config, elements, onprint, printMedia;
11725	// see also: http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/
11726	if(window.addEventListener){
11727		config = lazySizes && lazySizes.cfg;
11728		elements = config.lazyClass || 'lazyload';
11729		onprint = function(){
11730			var i, len;
11731			if(typeof elements == 'string'){
11732				elements = document.getElementsByClassName(elements);
11733			}
11734
11735			if(lazySizes){
11736				for(i = 0, len = elements.length; i < len; i++){
11737					lazySizes.loader.unveil(elements[i]);
11738				}
11739			}
11740		};
11741
11742		addEventListener('beforeprint', onprint, false);
11743
11744		if(!('onbeforeprint' in window) && window.matchMedia && (printMedia = matchMedia('print')) && printMedia.addListener){
11745			printMedia.addListener(function(){
11746				if(printMedia.matches){
11747					onprint();
11748				}
11749			});
11750		}
11751	}
11752}));
11753
11754
11755/***/ })
11756
11757/******/ 	});
11758/************************************************************************/
11759/******/ 	// The module cache
11760/******/ 	var __webpack_module_cache__ = {};
11761/******/ 	
11762/******/ 	// The require function
11763/******/ 	function __webpack_require__(moduleId) {
11764/******/ 		// Check if module is in cache
11765/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
11766/******/ 		if (cachedModule !== undefined) {
11767/******/ 			return cachedModule.exports;
11768/******/ 		}
11769/******/ 		// Create a new module (and put it into the cache)
11770/******/ 		var module = __webpack_module_cache__[moduleId] = {
11771/******/ 			// no module.id needed
11772/******/ 			// no module.loaded needed
11773/******/ 			exports: {}
11774/******/ 		};
11775/******/ 	
11776/******/ 		// Execute the module function
11777/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
11778/******/ 	
11779/******/ 		// Return the exports of the module
11780/******/ 		return module.exports;
11781/******/ 	}
11782/******/ 	
11783/************************************************************************/
11784/******/ 	/* webpack/runtime/compat get default export */
11785/******/ 	!function() {
11786/******/ 		// getDefaultExport function for compatibility with non-harmony modules
11787/******/ 		__webpack_require__.n = function(module) {
11788/******/ 			var getter = module && module.__esModule ?
11789/******/ 				function() { return module['default']; } :
11790/******/ 				function() { return module; };
11791/******/ 			__webpack_require__.d(getter, { a: getter });
11792/******/ 			return getter;
11793/******/ 		};
11794/******/ 	}();
11795/******/ 	
11796/******/ 	/* webpack/runtime/define property getters */
11797/******/ 	!function() {
11798/******/ 		// define getter functions for harmony exports
11799/******/ 		__webpack_require__.d = function(exports, definition) {
11800/******/ 			for(var key in definition) {
11801/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
11802/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
11803/******/ 				}
11804/******/ 			}
11805/******/ 		};
11806/******/ 	}();
11807/******/ 	
11808/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
11809/******/ 	!function() {
11810/******/ 		__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
11811/******/ 	}();
11812/******/ 	
11813/************************************************************************/
11814var __webpack_exports__ = {};
11815// This entry need to be wrapped in an IIFE because it need to be in strict mode.
11816!function() {
11817"use strict";
11818
11819// EXTERNAL MODULE: ./node_modules/lazysizes/lazysizes.js
11820var lazysizes = __webpack_require__(7090);
11821var lazysizes_default = /*#__PURE__*/__webpack_require__.n(lazysizes);
11822// EXTERNAL MODULE: ./node_modules/lazysizes/plugins/print/ls.print.js
11823var ls_print = __webpack_require__(5222);
11824;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/earlyLoaded/lazyload/lazyload.early.js
11825
11826
11827lazysizes_default().init();
11828console.log('lazyloading initialised immediate');
11829;// CONCATENATED MODULE: external "$"
11830var external_$_namespaceObject = $;
11831var external_$_default = /*#__PURE__*/__webpack_require__.n(external_$_namespaceObject);
11832;// CONCATENATED MODULE: ./src/js/earlyLoaded/scriptUnblocker/scriptUnblocker.early.js
11833function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
11834
11835function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
11836
11837function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11838
11839function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
11840
11841function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
11842
11843function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
11844
11845
11846
11847function unblockScript(names) {
11848  names.forEach(function (name) {
11849    // die Variable "sitepackage_base_js_path" wird vom Backend mit einem <script> via TypoScript bereitgestellt
11850    var path = sitepackage_base_js_path; // jshint ignore:line
11851    // only load the scripts once!!!
11852
11853    if (external_$_default()('script[src="' + path + name + '.js"]').length > 0) {
11854      return;
11855    }
11856
11857    var script = document.createElement('script');
11858    script.src = path + name + '.js';
11859    document.head.appendChild(script);
11860  });
11861}
11862/**
11863 * Init on DOM ready
11864 */
11865
11866
11867external_$_default().when((external_$_default()).ready).then(function () {
11868  // todo: if dependency on jquery causes problems remove jquery
11869  var contentObjects = {
11870    '.f-form': ['form'],
11871    '[data-parsley-validate]': ['formOptions'],
11872    '.f-form--ajax-submit': ['formOptions'],
11873    '.f-field[data-condition]': ['formOptions'],
11874    '.f-form--floating-labels': ['formOptions'],
11875    '.f-form--save-data': ['formOptions'],
11876    '.js-datepicker': ['datepicker'],
11877    '.tx_solr': ['solr'],
11878    '.headerSearchSolr': ['solr'],
11879    '.m-tab': ['tabs'],
11880    '.imageComparisonSlider': ['imageComparisonSlider'],
11881    '.counterTeaser': ['counterTeaser'],
11882    '.figure[data-lightbox]': ['lightBox'],
11883    '.coPopup': ['lightBox'],
11884    '.js-open-popupFilter': ['lightBox'],
11885    '.shopBasketTeaser': ['lightBox'],
11886    // '.locationMap': ['vendors~locationMap~simpleMap', 'locationMap'],
11887    '.mapOsmSimple': ['simpleMap'],
11888    '.thumbnailSlider': ['sliderComponents'],
11889    '.m-stage': ['sliderComponents'],
11890    '.gallery--slider': ['sliderComponents'],
11891    '.m-slider': ['sliderComponents'],
11892    '.video': ['video'],
11893    '.iframe': ['iframe'],
11894    '.coWwt3_shop_step_nav, [data-cart-counter]': ['shopComponents'],
11895    '.shopBasket': ['shopComponents'],
11896    '.orderPanel': ['shopComponents'],
11897    '.miniOrderPanel': ['shopComponents']
11898  };
11899
11900  for (var _i = 0, _Object$entries = Object.entries(contentObjects); _i < _Object$entries.length; _i++) {
11901    var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
11902        key = _Object$entries$_i[0],
11903        value = _Object$entries$_i[1];
11904
11905    if (external_$_default()(key).length > 0) {
11906      unblockScript(value);
11907    }
11908  }
11909});
11910;// CONCATENATED MODULE: ./src/js/_imports/earlyLoaded.js
11911
11912
11913}();
11914/******/ })()
11915;
11916/******/ (function() { // webpackBootstrap
11917/******/ 	"use strict";
11918var __webpack_exports__ = {};
11919
11920;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/core/config.core.js
11921// Keep in sync with breakpoints in sass/_variables.scss
11922var breakpoints = {
11923  base: 0,
11924  mobile: 320,
11925  phablet: 540,
11926  tablet: 740,
11927  desktop: 980,
11928  mainNavigation: 980,
11929  wide: 1200,
11930  slider: 1280,
11931  extraordinary: 1400
11932}; // Keep in sync with transitions in sass/_variables.scss
11933
11934var speed = {
11935  instant: 5,
11936  fast: 100,
11937  normal: 300,
11938  slow: 700,
11939  sluggish: 1200
11940}; // todo @skm: ist this the right place for this? copied from gf-023...
11941
11942if ("ontouchstart" in document.documentElement) {
11943  var root = document.getElementsByTagName('html')[0]; // '0' to assign the first (and only `HTML` tag)
11944
11945  root.className += ' touch-device';
11946}
11947
11948window.addEventListener('beforeprint', function () {
11949  window.scrollTo(0, 0);
11950});
11951;// CONCATENATED MODULE: ./src/js/_imports/core.js
11952
11953
11954
11955
11956/******/ })()
11957;
11958/******/ (function() { // webpackBootstrap
11959/******/ 	var __webpack_modules__ = ({
11960
11961/***/ 7669:
11962/***/ (function(module) {
11963
11964;(function(window){
11965      var hadGlobal = 'Modernizr' in window;
11966      var oldGlobal = window.Modernizr;
11967      /*! modernizr 3.12.0 (Custom Build) | MIT *
11968 * https://modernizr.com/download/?-objectfit-setclasses !*/
11969!function(e,n,t,r){function o(e,n){return typeof e===n}function i(e,n){return!!~(""+e).indexOf(n)}function s(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):S?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}function l(){var e=t.body;return e||(e=s(S?"svg":"body"),e.fake=!0),e}function a(e,n,r,o){var i,a,f,u,p="modernizr",c=s("div"),d=l();if(parseInt(r,10))for(;r--;)f=s("div"),f.id=o?o[r]:p+(r+1),c.appendChild(f);return i=s("style"),i.type="text/css",i.id="s"+p,(d.fake?d:c).appendChild(i),d.appendChild(c),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(t.createTextNode(e)),c.id=p,d.fake&&(d.style.background="",d.style.overflow="hidden",u=w.style.overflow,w.style.overflow="hidden",w.appendChild(d)),a=n(c,e),d.fake&&d.parentNode?(d.parentNode.removeChild(d),w.style.overflow=u,w.offsetHeight):c.parentNode.removeChild(c),!!a}function f(e){return e.replace(/([A-Z])/g,function(e,n){return"-"+n.toLowerCase()}).replace(/^ms-/,"-ms-")}function u(e,t,r){var o;if("getComputedStyle"in n){o=getComputedStyle.call(n,e,t);var i=n.console;if(null!==o)r&&(o=o.getPropertyValue(r));else if(i){var s=i.error?"error":"log";i[s].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else o=!t&&e.currentStyle&&e.currentStyle[r];return o}function p(e,t){var o=e.length;if("CSS"in n&&"supports"in n.CSS){for(;o--;)if(n.CSS.supports(f(e[o]),t))return!0;return!1}if("CSSSupportsRule"in n){for(var i=[];o--;)i.push("("+f(e[o])+":"+t+")");return i=i.join(" or "),a("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"===u(e,null,"position")})}return r}function c(e){return e.replace(/([a-z])-([a-z])/g,function(e,n,t){return n+t.toUpperCase()}).replace(/^-/,"")}function d(e,n,t,l){function a(){u&&(delete E.style,delete E.modElem)}if(l=!o(l,"undefined")&&l,!o(t,"undefined")){var f=p(e,t);if(!o(f,"undefined"))return f}for(var u,d,m,v,y,h=["modernizr","tspan","samp"];!E.style&&h.length;)u=!0,E.modElem=s(h.shift()),E.style=E.modElem.style;for(m=e.length,d=0;d<m;d++)if(v=e[d],y=E.style[v],i(v,"-")&&(v=c(v)),E.style[v]!==r){if(l||o(t,"undefined"))return a(),"pfx"!==n||v;try{E.style[v]=t}catch(e){}if(E.style[v]!==y)return a(),"pfx"!==n||v}return a(),!1}function m(e,n){return function(){return e.apply(n,arguments)}}function v(e,n,t){var r;for(var i in e)if(e[i]in n)return!1===t?e[i]:(r=n[e[i]],o(r,"function")?m(r,t||n):r);return!1}function y(e,n,t,r,i){var s=e.charAt(0).toUpperCase()+e.slice(1),l=(e+" "+x.join(s+" ")+s).split(" ");return o(n,"string")||o(n,"undefined")?d(l,n,r,i):(l=(e+" "+j.join(s+" ")+s).split(" "),v(l,n,t))}var h=[],g={_version:"3.12.0",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,n){var t=this;setTimeout(function(){n(t[e])},0)},addTest:function(e,n,t){h.push({name:e,fn:n,options:t})},addAsyncTest:function(e){h.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=g,Modernizr=new Modernizr;var C=[],w=t.documentElement,S="svg"===w.nodeName.toLowerCase(),_="Moz O ms Webkit",x=g._config.usePrefixes?_.split(" "):[];g._cssomPrefixes=x;var b={elem:s("modernizr")};Modernizr._q.push(function(){delete b.elem});var E={style:b.elem.style};Modernizr._q.unshift(function(){delete E.style});var j=g._config.usePrefixes?_.toLowerCase().split(" "):[];g._domPrefixes=j,g.testAllProps=y;var z=function(e){var t,o=prefixes.length,i=n.CSSRule;if(void 0===i)return r;if(!e)return!1;if(e=e.replace(/^@/,""),(t=e.replace(/-/g,"_").toUpperCase()+"_RULE")in i)return"@"+e;for(var s=0;s<o;s++){var l=prefixes[s];if(l.toUpperCase()+"_"+t in i)return"@-"+l.toLowerCase()+"-"+e}return!1};g.atRule=z;var N=g.prefixed=function(e,n,t){return 0===e.indexOf("@")?z(e):(-1!==e.indexOf("-")&&(e=c(e)),n?y(e,n,t):y(e,"pfx"))};Modernizr.addTest("objectfit",!!N("objectFit"),{aliases:["object-fit"]}),function(){var e,n,t,r,i,s,l;for(var a in h)if(h.hasOwnProperty(a)){if(e=[],n=h[a],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t<n.options.aliases.length;t++)e.push(n.options.aliases[t].toLowerCase());for(r=o(n.fn,"function")?n.fn():n.fn,i=0;i<e.length;i++)s=e[i],l=s.split("."),1===l.length?Modernizr[l[0]]=r:(Modernizr[l[0]]&&(!Modernizr[l[0]]||Modernizr[l[0]]instanceof Boolean)||(Modernizr[l[0]]=new Boolean(Modernizr[l[0]])),Modernizr[l[0]][l[1]]=r),C.push((r?"":"no-")+l.join("-"))}}(),function(e){var n=w.className,t=Modernizr._config.classPrefix||"";if(S&&(n=n.baseVal),Modernizr._config.enableJSClass){var r=new RegExp("(^|\\s)"+t+"no-js(\\s|$)");n=n.replace(r,"$1"+t+"js$2")}Modernizr._config.enableClasses&&(e.length>0&&(n+=" "+t+e.join(" "+t)),S?w.className.baseVal=n:w.className=n)}(C),delete g.addTest,delete g.addAsyncTest;for(var P=0;P<Modernizr._q.length;P++)Modernizr._q[P]();e.Modernizr=Modernizr}(window,window,document);
11970      module.exports = window.Modernizr;
11971      if (hadGlobal) {
11972        window.Modernizr = oldGlobal;
11973      } else {
11974        delete window.Modernizr;
11975      }
11976    })(window);
11977
11978/***/ }),
11979
11980/***/ 2873:
11981/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
11982
11983/* provided dependency */ var jQuery = __webpack_require__(3336);
11984/*
11985Copyright © 2013 Adobe Systems Incorporated.
11986
11987Licensed under the Apache License, Version 2.0 (the “License”);
11988you may not use this file except in compliance with the License.
11989You may obtain a copy of the License at
11990
11991http://www.apache.org/licenses/LICENSE-2.0
11992
11993Unless required by applicable law or agreed to in writing, softw
11993are
11994distributed under the License is distributed on an “AS IS” BASIS,
11995WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11996See the License for the specific language governing permissions and
11997limitations under the License.
11998*/
11999
12000/**
12001 * See <a href="http://jquery.com">http://jquery.com</a>.
12002 * @name jquery
12003 * @class
12004 * See the jQuery Library  (<a href="http://jquery.com">http://jquery.com</a>) for full details.  This just
12005 * documents the function and classes that are added to jQuery by this plug-in.
12006 */
12007
12008/**
12009 * See <a href="http://jquery.com">http://jquery.com</a>
12010 * @name fn
12011 * @class
12012 * See the jQuery Library  (<a href="http://jquery.com">http://jquery.com</a>) for full details.  This just
12013 * documents the function and classes that are added to jQuery by this plug-in.
12014 * @memberOf jquery
12015 */
12016
12017/**
12018 * @fileOverview accessibleMegaMenu plugin
12019 *
12020 *<p>Licensed under the Apache License, Version 2.0 (the “License”)
12021 *<br />Copyright © 2013 Adobe Systems Incorporated.
12022 *<br />Project page <a href="https://github.com/adobe-accessibility/Accessible-Mega-Menu">https://github.com/adobe-accessibility/Accessible-Mega-Menu</a>
12023 * @version 0.1
12024 * @author Michael Jordan
12025 * @requires jquery
12026 */
12027
12028/*jslint browser: true, devel: true, plusplus: true, nomen: true */
12029
12030/*global jQuery, window, document */
12031(function ($, window, document) {
12032  "use strict";
12033
12034  var pluginName = "accessibleMegaMenu",
12035      defaults = {
12036    uuidPrefix: "accessible-megamenu",
12037    // unique ID's are required to indicate aria-owns, aria-controls and aria-labelledby
12038    menuClass: "accessible-megamenu",
12039    // default css class used to define the megamenu styling
12040    topNavItemClass: "accessible-megamenu-top-nav-item",
12041    // default css class for a top-level navigation item in the megamenu
12042    panelClass: "accessible-megamenu-panel",
12043    // default css class for a megamenu panel
12044    panelGroupClass: "accessible-megamenu-panel-group",
12045    // default css class for a group of items within a megamenu panel
12046    hoverClass: "hover",
12047    // default css class for the hover state
12048    focusClass: "focus",
12049    // default css class for the focus state
12050    openClass: "open",
12051    // default css class for the open state,
12052    toggleButtonClass: "accessible-megamenu-toggle",
12053    // default css class responsive toggle button
12054    openDelay: 0,
12055    // default open delay when opening menu via mouseover
12056    closeDelay: 250,
12057    // default open delay when opening menu via mouseover
12058    openOnMouseover: true // default setting for whether menu should open on mouseover
12059
12060  },
12061      Keyboard = {
12062    BACKSPACE: 8,
12063    COMMA: 188,
12064    DELETE: 46,
12065    DOWN: 40,
12066    END: 35,
12067    ENTER: 13,
12068    ESCAPE: 27,
12069    HOME: 36,
12070    LEFT: 37,
12071    PAGE_DOWN: 34,
12072    PAGE_UP: 33,
12073    PERIOD: 190,
12074    RIGHT: 39,
12075    SPACE: 32,
12076    TAB: 9,
12077    UP: 38,
12078    keyMap: {
12079      48: "0",
12080      49: "1",
12081      50: "2",
12082      51: "3",
12083      52: "4",
12084      53: "5",
12085      54: "6",
12086      55: "7",
12087      56: "8",
12088      57: "9",
12089      59: ";",
12090      65: "a",
12091      66: "b",
12092      67: "c",
12093      68: "d",
12094      69: "e",
12095      70: "f",
12096      71: "g",
12097      72: "h",
12098      73: "i",
12099      74: "j",
12100      75: "k",
12101      76: "l",
12102      77: "m",
12103      78: "n",
12104      79: "o",
12105      80: "p",
12106      81: "q",
12107      82: "r",
12108      83: "s",
12109      84: "t",
12110      85: "u",
12111      86: "v",
12112      87: "w",
12113      88: "x",
12114      89: "y",
12115      90: "z",
12116      96: "0",
12117      97: "1",
12118      98: "2",
12119      99: "3",
12120      100: "4",
12121      101: "5",
12122      102: "6",
12123      103: "7",
12124      104: "8",
12125      105: "9",
12126      190: "."
12127    }
12128  },
12129      clearTimeout = window.clearTimeout,
12130      setTimeout = window.setTimeout,
12131      isOpera = window.opera && window.opera.toString() === '[object Opera]';
12132  /**
12133   * @desc Creates a new accessible mega menu instance.
12134   * @param {jquery} element
12135   * @param {object} [options] Mega Menu options
12136   * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby
12137   * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling
12138   * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu
12139   * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel
12140   * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel
12141   * @param {string} [options.hoverClass=hover] - CSS class for the hover state
12142   * @param {string} [options.focusClass=focus] - CSS class for the focus state
12143   * @param {string} [options.openClass=open] - CSS class for the open state
12144   * @constructor
12145   */
12146
12147  function AccessibleMegaMenu(element, options) {
12148    this.element = element; // merge optional settings and defaults into settings
12149
12150    this.settings = $.extend({}, defaults, options);
12151    this._defaults = defaults;
12152    this._name = pluginName;
12153    this.mouseTimeoutID = null;
12154    this.focusTimeoutID = null;
12155    this.mouseFocused = false;
12156    this.justFocused = false;
12157    this.init();
12158  }
12159
12160  AccessibleMegaMenu.prototype = function () {
12161    /* private attributes and methods ------------------------ */
12162    var uuid = 0,
12163        keydownTimeoutDuration = 1000,
12164        keydownSearchString = "",
12165        isTouch = 'ontouchstart' in window || window.navigator.msMaxTouchPoints,
12166        _getPlugin,
12167        _addUniqueId,
12168        _togglePanel,
12169        _clickHandler,
12170        _touchmoveHandler,
12171        _clickOutsideHandler,
12172        _DOMAttrModifiedHandler,
12173        _focusInHandler,
12174        _focusOutHandler,
12175        _keyDownHandler,
12176        _mouseDownHandler,
12177        _mouseOverHandler,
12178        _mouseOutHandler,
12179        _clickToggleHandler,
12180        _toggleExpandedEventHandlers,
12181        _addEventHandlers,
12182        _removeEventHandlers;
12183    /**
12184     * @name jQuery.fn.accessibleMegaMenu~_getPlugin
12185     * @desc Returns the parent accessibleMegaMenu instance for a given element
12186     * @param {jQuery} element
12187     * @memberof jQuery.fn.accessibleMegaMenu
12188     * @inner
12189     * @private
12190     */
12191
12192
12193    _getPlugin = function _getPlugin(element) {
12194      return $(element).closest(':data(plugin_' + pluginName + ')').data("plugin_" + pluginName);
12195    };
12196    /**
12197     * @name jQuery.fn.accessibleMegaMenu~_addUniqueId
12198     * @desc Adds a unique id and element.
12199     * The id string starts with the
12200     * string defined in settings.uuidPrefix.
12201     * @param {jQuery} element
12202     * @memberof jQuery.fn.accessibleMegaMenu
12203     * @inner
12204     * @private
12205     */
12206
12207
12208    _addUniqueId = function _addUniqueId(element) {
12209      element = $(element);
12210      var settings = this.settings;
12211
12212      if (!element.attr("id")) {
12213        element.attr("id", settings.uuidPrefix + "-" + new Date().getTime() + "-" + ++uuid);
12214      }
12215    };
12216    /**
12217     * @name jQuery.fn.accessibleMegaMenu~_togglePanel
12218     * @desc Toggle the display of mega menu panels in response to an event.
12219     * The optional boolean value 'hide' forces all panels to hide.
12220     * @param {event} event
12221     * @param {Boolean} [hide] Hide all mega menu panels when true
12222     * @memberof jQuery.fn.accessibleMegaMenu
12223     * @inner
12224     * @private
12225     */
12226
12227
12228    _togglePanel = function _togglePanel(event, hide) {
12229      var target = $(event.target),
12230          that = this,
12231          settings = this.settings,
12232          menu = this.menu,
12233          topli = target.closest('.' + settings.topNavItemClass),
12234          panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),
12235          newfocus;
12236
12237      _toggleExpandedEventHandlers.call(this, true);
12238
12239      if (hide) {
12240        topli = menu.find('.' + settings.topNavItemClass + ' .' + settings.openClass + ':first').closest('.' + settings.topNavItemClass);
12241
12242        if (!(topli.is(event.relatedTarget) || topli.has(event.relatedTarget).length > 0)) {
12243          if ((event.type === 'mouseout' || event.type === 'focusout') && topli.has(document.activeElement).length > 0) {
12244            return;
12245          }
12246
12247          topli.find('[aria-expanded]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
12248
12249          if (event.type === 'keydown' && event.keyCode === Keyboard.ESCAPE || event.type === 'DOMAttrModified') {
12250            newfocus = topli.find(':tabbable:first');
12251            setTimeout(function () {
12252              menu.find('[aria-expanded].' + that.settings.panelClass).off('DOMAttrModified.accessible-megamenu');
12253              newfocus.focus();
12254              that.justFocused = false;
12255            }, 99);
12256          }
12257        } else if (topli.length === 0) {
12258          menu.find('[aria-expanded=true]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
12259        }
12260      } else {
12261        clearTimeout(that.focusTimeoutID);
12262        topli.siblings().find('[aria-expanded]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
12263        topli.find('[aria-expanded]').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false');
12264        var pageScrollPosition = $('html')[0].scrollTop;
12265        var $openPanel = $('.' + settings.panelClass + '.' + settings.openClass).parent();
12266
12267        if ($openPanel.length > 0) {
12268          var openPanelTopPosition = $openPanel.offset().top;
12269
12270          if (pageScrollPosition > openPanelTopPosition) {
12271            $('html')[0].scrollTop = openPanelTopPosition;
12272          }
12273        }
12274
12275        if (event.type === 'mouseover' && target.is(':tabbable') && topli.length === 1 && panel.length === 0 && menu.has(document.activeElement).length > 0) {
12276          target.focus();
12277          that.justFocused = false;
12278        }
12279
12280        _toggleExpandedEventHandlers.call(that);
12281      }
12282    };
12283    /**
12284     * @name jQuery.fn.accessibleMegaMenu~_clickHandler
12285     * @desc Handle click event on mega menu item
12286     * @param {event} Event object
12287     * @memberof jQuery.fn.accessibleMegaMenu
12288     * @inner
12289     * @private
12290     */
12291
12292
12293    _clickHandler = function _clickHandler(event) {
12294      var target = $(event.target).closest(':tabbable'),
12295          topli = target.closest('.' + this.settings.topNavItemClass),
12296          panel = target.closest('.' + this.settings.panelClass);
12297
12298      if (topli.length === 1 && panel.length === 0 && topli.find('.' + this.settings.panelClass).length === 1) {
12299        if (!target.hasClass(this.settings.openClass)) {
12300          event.preventDefault();
12301          event.stopPropagation();
12302
12303          _togglePanel.call(this, event);
12304
12305          this.justFocused = false;
12306        } else {
12307          if (this.justFocused) {
12308            event.preventDefault();
12309            event.stopPropagation();
12310            this.justFocused = false;
12311          } else if (isTouch || !isTouch && !this.settings.openOnMouseover) {
12312            event.preventDefault();
12313            event.stopPropagation();
12314
12315            _togglePanel.call(this, event, target.hasClass(this.settings.openClass));
12316          }
12317        }
12318      }
12319    };
12320    /**
12321     * @name jQuery.fn.accessibleMegaMenu~_touchmoveHandler
12322     * @desc Handle touch move event on menu
12323     * @memberof jQuery.fn.accessibleMegaMenu
12324     * @inner
12325     * @private
12326     */
12327
12328
12329    _touchmoveHandler = function _touchmoveHandler() {
12330      this.justMoved = true;
12331    };
12332    /**
12333     * @name jQuery.fn.accessibleMegaMenu~_clickOutsideHandler
12334     * @desc Handle click event outside of a the megamenu
12335     * @param {event} Event object
12336     * @memberof jQuery.fn.accessibleMegaMenu
12337     * @inner
12338     * @private
12339     */
12340
12341
12342    _clickOutsideHandler = function _clickOutsideHandler(event) {
12343      if ($(event.target).closest(this.menu).length === 0) {
12344        event.preventDefault();
12345        event.stopPropagation();
12346
12347        _togglePanel.call(this, event, true);
12348      }
12349    };
12350    /**
12351     * @name jQuery.fn.accessibleMegaMenu~_DOMAttrModifiedHandler
12352     * @desc Handle DOMAttrModified event on panel to respond to Windows 8 Narrator ExpandCollapse pattern
12353     * @param {event} Event object
12354     * @memberof jQuery.fn.accessibleMegaMenu
12355     * @inner
12356     * @private
12357     */
12358
12359
12360    _DOMAttrModifiedHandler = function _DOMAttrModifiedHandler(event) {
12361      if (event.originalEvent.attrName === 'aria-expanded' && event.originalEvent.newValue === 'false' && $(event.target).hasClass(this.settings.openClass)) {
12362        event.preventDefault();
12363        event.stopPropagation();
12364
12365        _togglePanel.call(this, event, true);
12366      }
12367    };
12368    /**
12369     * @name jQuery.fn.accessibleMegaMenu~_focusInHandler
12370     * @desc Handle focusin event on mega menu item.
12371     * @param {event} Event object
12372     * @memberof jQuery.fn.accessibleMegaMenu
12373     * @inner
12374     * @private
12375     */
12376
12377
12378    _focusInHandler = function _focusInHandler(event) {
12379      clearTimeout(this.focusTimeoutID);
12380      var target = $(event.target),
12381          panel = target.closest('.' + this.settings.panelClass);
12382      target.addClass(this.settings.focusClass);
12383      this.justFocused = !this.mouseFocused || !this.settings.openOnMouseover && this.mouseFocused;
12384      this.mouseFocused = false;
12385
12386      if (this.justFocused && this.panels.not(panel).filter('.' + this.settings.openClass).length) {
12387        _togglePanel.call(this, event);
12388      }
12389    };
12390    /**
12391     * @name jQuery.fn.accessibleMegaMenu~_focusOutHandler
12392     * @desc Handle focusout event on mega menu item.
12393     * @param {event} Event object
12394     * @memberof jQuery.fn.accessibleMegaMenu
12395     * @inner
12396     * @private
12397     */
12398
12399
12400    _focusOutHandler = function _focusOutHandler(event) {
12401      this.justFocused = false;
12402      var that = this,
12403          target = $(event.target),
12404          topli = target.closest('.' + this.settings.topNavItemClass);
12405      target.removeClass(this.settings.focusClass);
12406
12407      if (window.cvox) {
12408        // If ChromeVox is running...
12409        that.focusTimeoutID = setTimeout(function () {
12410          window.cvox.Api.getCurrentNode(function (node) {
12411            if (topli.has(node).length) {
12412              // and the current node being voiced is in
12413              // the mega menu, clearTimeout,
12414              // so the panel stays open.
12415              clearTimeout(that.focusTimeoutID);
12416            } else {
12417              that.focusTimeoutID = setTimeout(function (scope, event, hide) {
12418                _togglePanel.call(scope, event, hide);
12419              }, 275, that, event, true);
12420            }
12421          });
12422        }, 25);
12423      } else {
12424        that.focusTimeoutID = setTimeout(function () {
12425          if (that.mouseFocused && event.relatedTarget === null) {
12426            return;
12427          }
12428
12429          _togglePanel.call(that, event, true);
12430        }, 300);
12431      }
12432    };
12433    /**
12434     * @name jQuery.fn.accessibleMegaMenu~_keyDownHandler
12435     * @desc Handle keydown event on mega menu.
12436     * @param {event} Event object
12437     * @memberof jQuery.fn.accessibleMegaMenu
12438     * @inner
12439     * @private
12440     */
12441
12442
12443    _keyDownHandler = function _keyDownHandler(event) {
12444      var that = this.constructor === AccessibleMegaMenu ? this : _getPlugin(this),
12445          // determine the AccessibleMegaMenu plugin instance
12446      settings = that.settings,
12447          target = $($(this).is('.' + settings.hoverClass + ':tabbable') ? this : event.target),
12448          // if the element is hovered the target is this, otherwise, its the focused element
12449      menu = that.menu,
12450          topnavitems = that.topnavitems,
12451          topli = target.closest('.' + settings.topNavItemClass),
12452          tabbables = menu.find(':tabbable'),
12453          panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),
12454          panelGroups = panel.find('.' + settings.panelGroupClass),
12455          currentPanelGroup = target.closest('.' + settings.panelGroupClass),
12456          next,
12457          keycode = event.keyCode || event.which,
12458          start,
12459          i,
12460          o,
12461          label,
12462          found = false,
12463          newString = Keyboard.keyMap[event.keyCode] || '',
12464          regex,
12465          isTopNavItem = topli.length === 1 && panel.length === 0;
12466
12467      if (target.is("input:focus, select:focus, textarea:focus, button:focus")) {
12468        // if the event target is a form element we should handle keydown normally
12469        return;
12470      }
12471
12472      if (target.is('.' + settings.hoverClass + ':tabbable')) {
12473        $('html').off('keydown.accessible-megamenu');
12474      }
12475
12476      switch (keycode) {
12477        case Keyboard.ESCAPE:
12478          this.mouseFocused = false;
12479
12480          _togglePanel.call(that, event, true);
12481
12482          break;
12483
12484        case Keyboard.DOWN:
12485          event.preventDefault();
12486          this.mouseFocused = false;
12487
12488          if (isTopNavItem) {
12489            _togglePanel.call(that, event);
12490
12491            found = topli.find('.' + settings.panelClass + ' :tabbable:first').focus().length === 1;
12492          } else {
12493            found = tabbables.filter(':gt(' + tabbables.index(target) + '):first').focus().length === 1;
12494          }
12495
12496          if (!found && isOpera && (event.ctrlKey || event.metaKey)) {
12497            tabbables = $(':tabbable');
12498            i = tabbables.index(target);
12499            found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
12500          }
12501
12502          break;
12503
12504        case Keyboard.UP:
12505          event.preventDefault();
12506          this.mouseFocused = false;
12507
12508          if (isTopNavItem && target.hasClass(settings.openClass)) {
12509            _togglePanel.call(that, event, true);
12510
12511            next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');
12512
12513            if (next.children('.' + settings.panelClass).length) {
12514              found = next.find('[aria-expanded]').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus() === 1;
12515            }
12516          } else if (!isTopNavItem) {
12517            found = tabbables.filter(':lt(' + tabbables.index(target) + '):last').focus().length === 1;
12518          }
12519
12520          if (!found && isOpera && (event.ctrlKey || event.metaKey)) {
12521            tabbables = $(':tabbable');
12522            i = tabbables.index(target);
12523            found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
12524          }
12525
12526          break;
12527
12528        case Keyboard.RIGHT:
12529          event.preventDefault();
12530          this.mouseFocused = false;
12531
12532          if (isTopNavItem) {
12533            found = topnavitems.filter(':gt(' + topnavitems.index(topli) + '):first').find(':tabbable:first').focus().length === 1;
12534          } else {
12535            if (panelGroups.length && currentPanelGroup.length) {
12536              // if the current panel contains panel groups, and we are able to focus the first tabbable element of the next panel group
12537              found = panelGroups.filter(':gt(' + panelGroups.index(currentPanelGroup) + '):first').find(':tabbable:first').focus().length === 1;
12538            }
12539
12540            if (!found) {
12541              found = topli.find(':tabbable:first').focus().length === 1;
12542            }
12543          }
12544
12545          break;
12546
12547        case Keyboard.LEFT:
12548          event.preventDefault();
12549          this.mouseFocused = false;
12550
12551          if (isTopNavItem) {
12552            found = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last').find(':tabbable:first').focus().length === 1;
12553          } else {
12554            if (panelGroups.length && currentPanelGroup.length) {
12555              // if the current panel contains panel groups, and we are able to focus the first tabbable element of the previous panel group
12556              found = panelGroups.filter(':lt(' + panelGroups.index(currentPanelGroup) + '):last').find(':tabbable:first').focus().length === 1;
12557            }
12558
12559            if (!found) {
12560              found = topli.find(':tabbable:first').focus().length === 1;
12561            }
12562          }
12563
12564          break;
12565
12566        case Keyboard.TAB:
12567          this.mouseFocused = false;
12568          i = tabbables.index(target);
12569
12570          if (event.shiftKey && isTopNavItem && target.hasClass(settings.openClass)) {
12571            _togglePanel.call(that, event, true);
12572
12573            next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');
12574
12575            if (next.children('.' + settings.panelClass).length) {
12576              found = next.children().attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus();
12577            }
12578          } else if (event.shiftKey && i > 0) {
12579            found = tabbables.filter(':lt(' + i + '):last').focus().length === 1;
12580          } else if (!event.shiftKey && i < tabbables.length - 1) {
12581            found = tabbables.filter(':gt(' + i + '):first').focus().length === 1;
12582          } else if (isOpera) {
12583            tabbables = $(':tabbable');
12584            i = tabbables.index(target);
12585
12586            if (event.shiftKey) {
12587              found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):last').focus().length === 1;
12588            } else {
12589              found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
12590            }
12591          }
12592
12593          if (found) {
12594            event.preventDefault();
12595          }
12596
12597          break;
12598
12599        case Keyboard.SPACE:
12600        case Keyboard.ENTER:
12601          if (isTopNavItem) {
12602            event.preventDefault();
12603
12604            _clickHandler.call(that, event);
12605          } else {
12606            return true;
12607          }
12608
12609          break;
12610
12611        default:
12612          // alphanumeric filter
12613          clearTimeout(this.keydownTimeoutID);
12614          keydownSearchString += newString !== keydownSearchString ? newString : '';
12615
12616          if (keydownSearchString.length === 0) {
12617            return;
12618          }
12619
12620          this.keydownTimeoutID = setTimeout(function () {
12621            keydownSearchString = '';
12622          }, keydownTimeoutDuration);
12623
12624          if (isTopNavItem && !target.hasClass(settings.openClass)) {
12625            tabbables = tabbables.filter(':not(.' + settings.panelClass + ' :tabbable)');
12626          } else {
12627            tabbables = topli.find(':tabbable');
12628          }
12629
12630          if (event.shiftKey) {
12631            tabbables = $(tabbables.get().reverse());
12632          }
12633
12634          for (i = 0; i < tabbables.length; i++) {
12635            o = tabbables.eq(i);
12636
12637            if (o.is(target)) {
12638              start = keydownSearchString.length === 1 ? i + 1 : i;
12639              break;
12640            }
12641          }
12642
12643          regex = new RegExp('^' + keydownSearchString.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'), 'i');
12644
12645          for (i = start; i < tabbables.length; i++) {
12646            o = tabbables.eq(i);
12647            label = $.trim(o.text());
12648
12649            if (regex.test(label)) {
12650              found = true;
12651              o.focus();
12652              break;
12653            }
12654          }
12655
12656          if (!found) {
12657            for (i = 0; i < start; i++) {
12658              o = tabbables.eq(i);
12659              label = $.trim(o.text());
12660
12661              if (regex.test(label)) {
12662                o.focus();
12663                break;
12664              }
12665            }
12666          }
12667
12668          break;
12669      }
12670
12671      that.justFocused = false;
12672    };
12673    /**
12674     * @name jQuery.fn.accessibleMegaMenu~_mouseDownHandler
12675     * @desc Handle mousedown event on mega menu.
12676     * @param {event} Event object
12677     * @memberof accessibleMegaMenu
12678     * @inner
12679     * @private
12680     */
12681
12682
12683    _mouseDownHandler = function _mouseDownHandler(event) {
12684      if ($(event.target).closest(this.settings.panelClass) || $(event.target).closest(":focusable").length) {
12685        this.mouseFocused = true;
12686
12687        if ($(event.target).closest(this.settings.menuClass)) {
12688          $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target));
12689        }
12690      }
12691
12692      clearTimeout(this.mouseTimeoutID);
12693      this.mouseTimeoutID = setTimeout(function () {
12694        clearTimeout(this.focusTimeoutID);
12695      }, 1);
12696    };
12697    /**
12698     * @name jQuery.fn.accessibleMegaMenu~_mouseOverHandler
12699     * @desc Handle mouseover event on mega menu.
12700     * @param {event} Event object
12701     * @memberof jQuery.fn.accessibleMegaMenu
12702     * @inner
12703     * @private
12704     */
12705
12706
12707    _mouseOverHandler = function _mouseOverHandler(event) {
12708      clearTimeout(this.mouseTimeoutID);
12709      var that = this;
12710
12711      if (!that.settings.openOnMouseover) {
12712        return;
12713      }
12714
12715      this.mouseTimeoutID = setTimeout(function () {
12716        $(event.target).addClass(that.settings.hoverClass);
12717
12718        _togglePanel.call(that, event);
12719
12720        if ($(event.target).closest(that.settings.menuClass)) {
12721          $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target));
12722        }
12723      }, this.settings.openDelay);
12724    };
12725    /**
12726     * @name jQuery.fn.accessibleMegaMenu~_mouseOutHandler
12727     * @desc Handle mouseout event on mega menu.
12728     * @param {event} Event object
12729     * @memberof jQuery.fn.accessibleMegaMenu
12730     * @inner
12731     * @private
12732     */
12733
12734
12735    _mouseOutHandler = function _mouseOutHandler(event) {
12736      clearTimeout(this.mouseTimeoutID);
12737      var that = this;
12738
12739      if (!that.settings.openOnMouseover) {
12740        return;
12741      }
12742
12743      $(event.target).removeClass(that.settings.hoverClass);
12744      that.mouseTimeoutID = setTimeout(function () {
12745        _togglePanel.call(that, event, true);
12746      }, this.settings.closeDelay);
12747
12748      if ($(event.target).is(':tabbable')) {
12749        $('html').off('keydown.accessible-megamenu');
12750      }
12751    };
12752    /**
12753     * @name jQuery.fn.accessibleMegaMenu~_clickToggleHandler
12754     * @desc Handle click event on menu toggle button.
12755     * @memberof jQuery.fn.accessibleMegaMenu
12756     * @inner
12757     * @private
12758     */
12759
12760
12761    _clickToggleHandler = function _clickToggleHandler() {
12762      var isExpanded = this.toggleButton.attr('aria-expanded') === 'true';
12763      this.toggleButton.attr({
12764        'aria-expanded': !isExpanded,
12765        'aria-pressed': !isExpanded
12766      });
12767    };
12768
12769    _toggleExpandedEventHandlers = function _toggleExpandedEventHandlers(hide) {
12770      var menu = this.menu;
12771
12772      if (hide) {
12773        $('html').off('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu,  pointerup.outside-accessible-megamenu');
12774        menu.find('[aria-expanded].' + this.settings.panelClass).off('DOMAttrModified.accessible-megamenu');
12775      } else {
12776        $('html').on('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu,  pointerup.outside-accessible-megamenu', $.proxy(_clickOutsideHandler, this));
12777        /* Narrator in Windows 8 automatically toggles the aria-expanded property on double tap or click.
12778           To respond to the change to collapse the panel, we must add a listener for a DOMAttrModified event. */
12779
12780        menu.find('[aria-expanded=true].' + this.settings.panelClass).on('DOMAttrModified.accessible-megamenu', $.proxy(_DOMAttrModifiedHandler, this));
12781      }
12782    };
12783
12784    _addEventHandlers = function _addEventHandlers() {
12785      var menu = this.menu,
12786          toggleButton = this.toggleButton;
12787      menu.on("focusin.accessible-megamenu", ":focusable, ." + this.settings.panelClass, $.proxy(_focusInHandler, this)).on("focusout.accessible-megamenu", ":focusable, ." + this.settings.panelClass, $.proxy(_focusOutHandler, this)).on("keydown.accessible-megamenu", $.proxy(_keyDownHandler, this)).on("mouseover.accessible-megamenu", $.proxy(_mouseOverHandler, this)).on("mouseout.accessible-megamenu", $.proxy(_mouseOutHandler, this)).on("mousedown.accessible-megamenu", $.proxy(_mouseDownHandler, this)).on("click.accessible-megamenu", $.proxy(_clickHandler, this));
12788      toggleButton.on('click.accessible-megamenu', $.proxy(_clickToggleHandler, this));
12789
12790      if (isTouch) {
12791        menu.on("touchmove.accessible-megamenu", $.proxy(_touchmoveHandler, this));
12792      }
12793
12794      if ($(document.activeElement).closest(menu).length) {
12795        $(document.activeElement).trigger("focusin.accessible-megamenu");
12796      }
12797    };
12798
12799    _removeEventHandlers = function _removeEventHandlers() {
12800      var menu = this.menu,
12801          toggleButton = this.toggleButton;
12802      menu.off('.accessible-megamenu');
12803
12804      if (menu.find('[aria-expanded=true].' + this.settings.panelClass).length) {
12805        _toggleExpandedEventHandlers.call(this, true);
12806      }
12807
12808      toggleButton.off('.accessible-megamenu');
12809    };
12810    /* public attributes and methods ------------------------- */
12811
12812
12813    return {
12814      constructor: AccessibleMegaMenu,
12815
12816      /**
12817       * @lends jQuery.fn.accessibleMegaMenu
12818       * @desc Initializes an instance of the accessibleMegaMenu plugins
12819       * @memberof jQuery.fn.accessibleMegaMenu
12820       * @instance
12821       */
12822      init: function init() {
12823        var settings = this.settings,
12824            nav = $(this.element),
12825            menu = nav.children('ol,ul').first(),
12826            topnavitems = menu.children(),
12827            toggleButton = nav.children('button').first();
12828        this.start(settings, nav, menu, topnavitems, toggleButton);
12829      },
12830      start: function start(settings, nav, menu, topnavitems, toggleButton) {
12831        var that = this;
12832        this.settings = settings;
12833        this.menu = menu;
12834        this.topnavitems = topnavitems;
12835        this.toggleButton = toggleButton;
12836        nav.attr("role", "navigation");
12837
12838        _addUniqueId.call(that, menu);
12839
12840        menu.addClass(settings.menuClass);
12841        menu.addClass(['js', settings.menuClass].join('-'));
12842        topnavitems.each(function (i, topnavitem) {
12843          var topnavitemlink, topnavitempanel;
12844          topnavitem = $(topnavitem);
12845          topnavitem.addClass(settings.topNavItemClass);
12846          topnavitemlink = topnavitem.find(":tabbable:first");
12847          topnavitempanel = topnavitem.children(":not(:tabbable):last");
12848
12849          _addUniqueId.call(that, topnavitemlink);
12850
12851          if (topnavitempanel.length) {
12852            _addUniqueId.call(that, topnavitempanel);
12853
12854            topnavitemlink.attr({
12855              "role": "button",
12856              "aria-controls": topnavitempanel.attr("id"),
12857              "aria-expanded": false,
12858              "tabindex": 0
12859            });
12860            topnavitempanel.attr({
12861              "role": "region",
12862              "aria-expanded": false,
12863              "aria-hidden": true
12864            }).addClass(settings.panelClass).not("[aria-labelledby]").attr("aria-labelledby", topnavitemlink.attr("id"));
12865          }
12866        });
12867        this.panels = menu.find("." + settings.panelClass);
12868        menu.find("hr").attr("role", "separator");
12869        toggleButton.addClass(settings.toggleButtonClass);
12870        toggleButton.attr({
12871          'aria-expanded': false,
12872          'aria-pressed': false,
12873          'aria-controls': menu.attr('id')
12874        });
12875
12876        _addEventHandlers.call(this);
12877      },
12878
12879      /**
12880       * @desc Removes maga menu javascript behavior
12881       * @example $(selector).accessibleMegaMenu("destroy");
12882       * @return {object}
12883       * @memberof jQuery.fn.accessibleMegaMenu
12884       * @instance
12885       */
12886      destroy: function destroy() {
12887        this.menu.removeClass(['js', this.settings.menuClass].join('-'));
12888
12889        _removeEventHandlers.call(this, true);
12890      },
12891
12892      /**
12893       * @desc Get default values
12894       * @example $(selector).accessibleMegaMenu("getDefaults");
12895       * @return {object}
12896       * @memberof jQuery.fn.accessibleMegaMenu
12897       * @instance
12898       */
12899      getDefaults: function getDefaults() {
12900        return this._defaults;
12901      },
12902
12903      /**
12904       * @desc Get any option set to plugin using its name (as string)
12905       * @example $(selector).accessibleMegaMenu("getOption", some_option);
12906       * @param {string} opt
12907       * @return {string}
12908       * @memberof jQuery.fn.accessibleMegaMenu
12909       * @instance
12910       */
12911      getOption: function getOption(opt) {
12912        return this.settings[opt];
12913      },
12914
12915      /**
12916       * @desc Get all options
12917       * @example $(selector).accessibleMegaMenu("getAllOptions");
12918       * @return {object}
12919       * @memberof jQuery.fn.accessibleMegaMenu
12920       * @instance
12921       */
12922      getAllOptions: function getAllOptions() {
12923        return this.settings;
12924      },
12925
12926      /**
12927       * @desc Set option
12928       * @example $(selector).accessibleMegaMenu("setOption", "option_name",  "option_value",  reinitialize);
12929       * @param {string} opt - Option name
12930       * @param {string} val - Option value
12931       * @param {boolean} [reinitialize] - boolean to re-initialize the menu.
12932       * @memberof jQuery.fn.accessibleMegaMenu
12933       * @instance
12934       */
12935      setOption: function setOption(opt, value, reinitialize) {
12936        this.settings[opt] = value;
12937
12938        if (reinitialize) {
12939          this.init();
12940        }
12941      }
12942    };
12943  }();
12944  /* lightweight plugin wrapper around the constructor,
12945     to prevent against multiple instantiations */
12946
12947  /**
12948   * @class accessibleMegaMenu
12949   * @memberOf jQuery.fn
12950   * @classdesc Implements an accessible mega menu as a jQuery plugin.
12951   * <p>The mega-menu It is modeled after the mega menu on {@link http://adobe.com|adobe.com} but has been simplified for use by others. A brief description of the interaction design choices can be found in a blog post at {@link http://blogs.adobe.com/accessibility/2013/05/adobe-com.html|Mega menu accessibility on adobe.com}.</p>
12952   * <h3>Keyboard Accessibility</h3>
12953   * <p>The accessible mega menu supports keyboard interaction modeled after the behavior described 
12953in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern}, however we also try to respect users' general expectations for the behavior of links in a global navigation. To this end, the accessible mega menu implementation permits tab focus on each of the six top-level menu items. When one of the menu items has focus, pressing the Enter key, Spacebar or Down arrow will open the submenu panel, and pressing the Left or Right arrow key will shift focus to the adjacent menu item. Links within the submenu panels are included in the tab order when the panel is open. They can also be navigated with the arrow keys or by typing the first character in the link name, which speeds up keyboard navigation considerably. Pressing the Escape key closes the submenu and restores focus to the parent menu item.</p>
12954   * <h3>Screen Reader Accessibility</h3>
12955   * <p>The accessible mega menu models its use of WAI-ARIA Roles, States, and Properties after those described in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern} with some notable exceptions, so that it behaves better with screen reader user expectations for global navigation. We don't use <code class="prettyprint prettyprinted" style=""><span class="pln">role</span><span class="pun">=</span><span class="str">"menu"</span></code> for the menu container and <code class="prettyprint prettyprinted" style=""><span class="pln">role</span><span class="pun">=</span><span class="str">"menuitem"</span></code> for each of the links therein, because if we do, assistive technology will no longer interpret the links as links, but instead, as menu items, and the links in our global navigation will no longer show up when a screen reader user executes a shortcut command to bring up a list of links in the page.</p>
12956   * @example <h4>HTML</h4><hr/>
12957   &lt;nav&gt;
12958   &lt;ul class=&quot;nav-menu&quot;&gt;
12959   &lt;li class=&quot;nav-item&quot;&gt;
12960   &lt;a href=&quot;?movie&quot;&gt;Movies&lt;/a&gt;
12961   &lt;div class=&quot;sub-nav&quot;&gt;
12962   &lt;ul class=&quot;sub-nav-group&quot;&gt;
12963   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=0&quot;&gt;Action &amp;amp; Adventure&lt;/a&gt;&lt;/li&gt;
12964   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=2&quot;&gt;Children &amp;amp; Family&lt;/a&gt;&lt;/li&gt;
12965   &lt;li&gt;&amp;#8230;&lt;/li&gt;
12966   &lt;/ul&gt;
12967   &lt;ul class=&quot;sub-nav-group&quot;&gt;
12968   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=7&quot;&gt;Dramas&lt;/a&gt;&lt;/li&gt;
12969   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=9&quot;&gt;Foreign&lt;/a&gt;&lt;/li&gt;
12970   &lt;li&gt;&amp;#8230;&lt;/li&gt;
12971   &lt;/ul&gt;
12972   &lt;ul class=&quot;sub-nav-group&quot;&gt;
12973   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=14&quot;&gt;Musicals&lt;/a&gt;&lt;/li&gt;
12974   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=15&quot;&gt;Romance&lt;/a&gt;&lt;/li&gt;
12975   &lt;li&gt;&amp;#8230;&lt;/li&gt;
12976   &lt;/ul&gt;
12977   &lt;/div&gt;
12978   &lt;/li&gt;
12979   &lt;li class=&quot;nav-item&quot;&gt;
12980   &lt;a href=&quot;?tv&quot;&gt;TV Shows&lt;/a&gt;
12981   &lt;div class=&quot;sub-nav&quot;&gt;
12982   &lt;ul class=&quot;sub-nav-group&quot;&gt;
12983   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=20&quot;&gt;Classic TV&lt;/a&gt;&lt;/li&gt;
12984   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=21&quot;&gt;Crime TV&lt;/a&gt;&lt;/li&gt;
12985   &lt;li&gt;&amp;#8230;&lt;/li&gt;
12986   &lt;/ul&gt;
12987   &lt;ul class=&quot;sub-nav-group&quot;&gt;
12988   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=27&quot;&gt;Reality TV&lt;/a&gt;&lt;/li&gt;
12989   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=30&quot;&gt;TV Action&lt;/a&gt;&lt;/li&gt;
12990   &lt;li&gt;&amp;#8230;&lt;/li&gt;
12991   &lt;/ul&gt;
12992   &lt;ul class=&quot;sub-nav-group&quot;&gt;
12993   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=33&quot;&gt;TV Dramas&lt;/a&gt;&lt;/li&gt;
12994   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=34&quot;&gt;TV Horror&lt;/a&gt;&lt;/li&gt;
12995   &lt;li&gt;&amp;#8230;&lt;/li&gt;
12996   &lt;/ul&gt;
12997   &lt;/div&gt;
12998   &lt;/li&gt;
12999   &lt;/ul&gt;
13000   &lt;/nav&gt;
13001   * @example <h4>CSS</h4><hr/>
13002   &#47;* Rudimentary mega menu CSS for demonstration *&#47;
13003    &#47;* mega menu list *&#47;
13004   .nav-menu {
13005  display: block;
13006  position: relative;
13007  list-style: none;
13008  margin: 0;
13009  padding: 0;
13010  z-index: 15;
13011  }
13012    &#47;* a top level navigation item in the mega menu *&#47;
13013   .nav-item {
13014  list-style: none;
13015  display: inline-block;
13016  padding: 0;
13017  margin: 0;
13018  }
13019    &#47;* first descendant link within a top level navigation item *&#47;
13020   .nav-item &gt; a {
13021  position: relative;
13022  display: inline-block;
13023  padding: 0.5em 1em;
13024  margin: 0 0 -1px 0;
13025  border: 1px solid transparent;
13026  }
13027    &#47;* focus/open states of first descendant link within a top level
13028   navigation item *&#47;
13029   .nav-item &gt; a:focus,
13030   .nav-item &gt; a.open {
13031  border: 1px solid #dedede;
13032  }
13033    &#47;* open state of first descendant link within a top level
13034   navigation item *&#47;
13035   .nav-item &gt; a.open {
13036  background-color: #fff;
13037  border-bottom: none;
13038  z-index: 1;
13039  }
13040    &#47;* sub-navigation panel *&#47;
13041   .sub-nav {
13042  position: absolute;
13043  display: none;
13044  top: 2.2em;
13045  margin-top: -1px;
13046  padding: 0.5em 1em;
13047  border: 1px solid #dedede;
13048  background-color: #fff;
13049  }
13050    &#47;* sub-navigation panel open state *&#47;
13051   .sub-nav.open {
13052  display: block;
13053  }
13054    &#47;* list of items within sub-navigation panel *&#47;
13055   .sub-nav ul {
13056  display: inline-block;
13057  vertical-align: top;
13058  margin: 0 1em 0 0;
13059  padding: 0;
13060  }
13061    &#47;* list item within sub-navigation panel *&#47;
13062   .sub-nav li {
13063  display: block;
13064  list-style-type: none;
13065  margin: 0;
13066  padding: 0;
13067  }
13068   * @example <h4>JavaScript</h4><hr/>
13069   &lt;!-- include jquery --&gt;
13070   &lt;script src=&quot;http://code.jquery.com/jquery-1.10.1.min.js&quot;&gt;&lt;/script&gt;
13071    &lt;!-- include the jquery-accessibleMegaMenu plugin script --&gt;
13072   &lt;script src=&quot;js/jquery-accessibleMegaMenu.js&quot;&gt;&lt;/script&gt;
13073    &lt;!-- initialize a selector as an accessibleMegaMenu --&gt;
13074   &lt;script&gt;
13075   $(&quot;nav:first&quot;).accessibleMegaMenu({
13076      &#47;* prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby *&#47;
13077      uuidPrefix: &quot;accessible-megamenu&quot;,
13078       &#47;* css class used to define the megamenu styling *&#47;
13079      menuClass: &quot;nav-menu&quot;,
13080       &#47;* css class for a top-level navigation item in the megamenu *&#47;
13081      topNavItemClass: &quot;nav-item&quot;,
13082       &#47;* css class for a megamenu panel *&#47;
13083      panelClass: &quot;sub-nav&quot;,
13084       &#47;* css class for a group of items within a megamenu panel *&#47;
13085      panelGroupClass: &quot;sub-nav-group&quot;,
13086       &#47;* css class for the hover state *&#47;
13087      hoverClass: &quot;hover&quot;,
13088       &#47;* css class for the focus state *&#47;
13089      focusClass: &quot;focus&quot;,
13090       &#47;* css class for the open state *&#47;
13091      openClass: &quot;open&quot;
13092  });
13093   &lt;/script&gt;
13094   * @param {object} [options] Mega Menu options
13095   * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby
13096   * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling
13097   * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu
13098   * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel
13099   * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel
13100   * @param {string} [options.hoverClass=hover] - CSS class for the hover state
13101   * @param {string} [options.focusClass=focus] - CSS class for the focus state
13102   * @param {string} [options.openClass=open] - CSS class for the open state
13103   * @param {string} [options.openDelay=0] - Open delay when opening menu via mouseover
13104   * @param {string} [options.closeDelay=250] - Open delay when opening menu via mouseover
13105   * @param {boolean} [options.openOnMouseover=false] - Should menu open on mouseover
13106   */
13107
13108
13109  $.fn[pluginName] = function (options) {
13110    return this.each(function () {
13111      var pluginInstance = $.data(this, "plugin_" + pluginName);
13112
13113      if (!pluginInstance) {
13114        $.data(this, "plugin_" + pluginName, new $.fn[pluginName].Acce
13114ssibleMegaMenu(this, options));
13115      } else if (typeof pluginInstance[options] === 'function') {
13116        pluginInstance[options].apply(pluginInstance, Array.prototype.slice.call(arguments, 1));
13117      }
13118    });
13119  };
13120
13121  $.fn[pluginName].AccessibleMegaMenu = AccessibleMegaMenu;
13122  /* :focusable and :tabbable selectors from
13123     https://raw.github.com/jquery/jquery-ui/master/ui/jquery.ui.core.js */
13124
13125  /**
13126   * @private
13127   */
13128
13129  function visible(element) {
13130    return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function () {
13131      return $.css(this, "visibility") === "hidden";
13132    }).length;
13133  }
13134  /**
13135   * @private
13136   */
13137
13138
13139  function _focusable(element, isTabIndexNotNaN) {
13140    var map,
13141        mapName,
13142        img,
13143        nodeName = element.nodeName.toLowerCase();
13144
13145    if ("area" === nodeName) {
13146      map = element.parentNode;
13147      mapName = map.name;
13148
13149      if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") {
13150        return false;
13151      }
13152
13153      img = $("img[usemap=#" + mapName + "]")[0];
13154      return !!img && visible(img);
13155    }
13156
13157    return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && // the element and all of its ancestors must be visible
13158    visible(element);
13159  }
13160
13161  $.extend($.expr[":"], {
13162    data: $.expr.createPseudo ? $.expr.createPseudo(function (dataName) {
13163      return function (elem) {
13164        return !!$.data(elem, dataName);
13165      };
13166    }) : // support: jQuery <1.8
13167    function (elem, i, match) {
13168      return !!$.data(elem, match[3]);
13169    },
13170    focusable: function focusable(element) {
13171      return _focusable(element, !isNaN($.attr(element, "tabindex")));
13172    },
13173    tabbable: function tabbable(element) {
13174      var tabIndex = $.attr(element, "tabindex"),
13175          isTabIndexNaN = isNaN(tabIndex);
13176      return (isTabIndexNaN || tabIndex >= 0) && _focusable(element, !isTabIndexNaN);
13177    }
13178  });
13179})(jQuery, window, document);
13180
13181/***/ }),
13182
13183/***/ 7364:
13184/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
13185
13186/* provided dependency */ var $ = __webpack_require__(3336);
13187var debug = true;
13188var buttonThemeDisabled = 'button--outline';
13189var buttonThemeEnabled = 'button--primary';
13190$.when($.ready).then(function () {
13191  if (debug) {
13192    console.log('cookieman initialised on ready');
13193  }
13194
13195  var $modal = $('#cookieman-modal');
13196
13197  if ($modal.length < 1) {
13198    return;
13199  }
13200
13201  var $checkboxes = $modal.find('input[type="checkbox"]');
13202  var $saveButton = $modal.find('[data-cookieman-save]');
13203  $checkboxes.change(function () {
13204    $saveButton.removeClass(buttonThemeDisabled).addClass(buttonThemeEnabled);
13205  });
13206});
13207
13208/***/ }),
13209
13210/***/ 5539:
13211/***/ (function() {
13212
13213var options = {
13214  selector: '.expand'
13215};
13216
13217function initExpand(expand) {
13218  /**
13219   * Switch Labels with Open/Closed Expand State
13220   */
13221  var expandButton = expand.querySelectorAll('.expand-button').item(0);
13222  var expandButtonText = expandButton.querySelectorAll('[data-expand-label]').item(0);
13223  var label = expandButton.textContent.trim();
13224  var switchLabel = expandButton.getAttribute('data-expand-switch-label').trim();
13225  document.querySelectorAll(expandButton.getAttribute('data-bs-target')).forEach(function (e) {
13226    e.addEventListener('show.bs.collapse', function () {
13227      expandButtonText.textContent = switchLabel;
13228    });
13229    e.addEventListener('hide.bs.collapse', function () {
13230      expandButtonText.textContent = label;
13231    });
13232  });
13233}
13234
13235function init() {
13236  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : options.selector;
13237  var expands = document.querySelectorAll(selector);
13238
13239  if (expands.length < 1) {
13240    return;
13241  }
13242
13243  expands.forEach(initExpand);
13244}
13245
13246document.addEventListener('DOMContentLoaded', function () {
13247  init();
13248});
13249
13250/***/ }),
13251
13252/***/ 4591:
13253/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
13254
13255/* provided dependency */ var $ = __webpack_require__(3336);
13256var spinner = '<span class="spinner__wrapper"><span class="spinner">Wird geladen</span></span>';
13257
13258function removeLoader() {
13259  $(this).removeClass('loading').find('.spinner__wrapper').remove();
13260}
13261
13262function addLoader() {
13263  $(this).append(spinner).addClass('loading');
13264}
13265
13266$.when($.ready).then(function () {
13267  var $ajaxButtons = $('button.ajax');
13268  $ajaxButtons.each(function (evt, el) {
13269    $(el).on('click', addLoader);
13270    $(el).on('button:removeLoader', removeLoader);
13271    $(el).parents('form').on('field:error', function () {
13272      removeLoader();
13273    });
13274  });
13275});
13276
13277/***/ }),
13278
13279/***/ 4452:
13280/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
13281
13282/* provided dependency */ var jQuery = __webpack_require__(3336);
13283/*
13284Copyright © 2013 Adobe Systems Incorporated.
13285
13286Licensed under the Apache License, Version 2.0 (the “License”);
13287you may not use this file except in compliance with the License.
13288You may obtain a copy of the License at
13289
13290http://www.apache.org/licenses/LICENSE-2.0
13291
13292Unless required by applicable law or agreed to in writing, softw
13292are
13293distributed under the License is distributed on an “AS IS” BASIS,
13294WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13295See the License for the specific language governing permissions and
13296limitations under the License.
13297*/
13298
13299/**
13300 * See <a href="http://jquery.com">http://jquery.com</a>.
13301 * @name jquery
13302 * @class
13303 * See the jQuery Library  (<a href="http://jquery.com">http://jquery.com</a>) for full details.  This just
13304 * documents the function and classes that are added to jQuery by this plug-in.
13305 */
13306
13307/**
13308 * See <a href="http://jquery.com">http://jquery.com</a>
13309 * @name fn
13310 * @class
13311 * See the jQuery Library  (<a href="http://jquery.com">http://jquery.com</a>) for full details.  This just
13312 * documents the function and classes that are added to jQuery by this plug-in.
13313 * @memberOf jquery
13314 */
13315
13316/**
13317 * @fileOverview accessibleMegaMenu plugin
13318 *
13319 *<p>Licensed under the Apache License, Version 2.0 (the “License”)
13320 *<br />Copyright © 2013 Adobe Systems Incorporated.
13321 *<br />Project page <a href="https://github.com/adobe-accessibility/Accessible-Mega-Menu">https://github.com/adobe-accessibility/Accessible-Mega-Menu</a>
13322 * @version 0.1
13323 * @author Michael Jordan
13324 * @requires jquery
13325 */
13326
13327/*jslint browser: true, devel: true, plusplus: true, nomen: true */
13328
13329/*global jQuery, window, document */
13330(function ($, window, document) {
13331  "use strict";
13332
13333  var pluginName = "accessibleMegaMenu",
13334      defaults = {
13335    uuidPrefix: "accessible-megamenu",
13336    // unique ID's are required to indicate aria-owns, aria-controls and aria-labelledby
13337    menuClass: "accessible-megamenu",
13338    // default css class used to define the megamenu styling
13339    topNavItemClass: "accessible-megamenu-top-nav-item",
13340    // default css class for a top-level navigation item in the megamenu
13341    panelClass: "accessible-megamenu-panel",
13342    // default css class for a megamenu panel
13343    panelGroupClass: "accessible-megamenu-panel-group",
13344    // default css class for a group of items within a megamenu panel
13345    hoverClass: "hover",
13346    // default css class for the hover state
13347    focusClass: "focus",
13348    // default css class for the focus state
13349    openClass: "open",
13350    // default css class for the open state,
13351    toggleButtonClass: "accessible-megamenu-toggle",
13352    // default css class responsive toggle button
13353    openDelay: 0,
13354    // default open delay when opening menu via mouseover
13355    closeDelay: 250,
13356    // default open delay when opening menu via mouseover
13357    openOnMouseover: true // default setting for whether menu should open on mouseover
13358
13359  },
13360      Keyboard = {
13361    BACKSPACE: 8,
13362    COMMA: 188,
13363    DELETE: 46,
13364    DOWN: 40,
13365    END: 35,
13366    ENTER: 13,
13367    ESCAPE: 27,
13368    HOME: 36,
13369    LEFT: 37,
13370    PAGE_DOWN: 34,
13371    PAGE_UP: 33,
13372    PERIOD: 190,
13373    RIGHT: 39,
13374    SPACE: 32,
13375    TAB: 9,
13376    UP: 38,
13377    keyMap: {
13378      48: "0",
13379      49: "1",
13380      50: "2",
13381      51: "3",
13382      52: "4",
13383      53: "5",
13384      54: "6",
13385      55: "7",
13386      56: "8",
13387      57: "9",
13388      59: ";",
13389      65: "a",
13390      66: "b",
13391      67: "c",
13392      68: "d",
13393      69: "e",
13394      70: "f",
13395      71: "g",
13396      72: "h",
13397      73: "i",
13398      74: "j",
13399      75: "k",
13400      76: "l",
13401      77: "m",
13402      78: "n",
13403      79: "o",
13404      80: "p",
13405      81: "q",
13406      82: "r",
13407      83: "s",
13408      84: "t",
13409      85: "u",
13410      86: "v",
13411      87: "w",
13412      88: "x",
13413      89: "y",
13414      90: "z",
13415      96: "0",
13416      97: "1",
13417      98: "2",
13418      99: "3",
13419      100: "4",
13420      101: "5",
13421      102: "6",
13422      103: "7",
13423      104: "8",
13424      105: "9",
13425      190: "."
13426    }
13427  },
13428      clearTimeout = window.clearTimeout,
13429      setTimeout = window.setTimeout,
13430      isOpera = window.opera && window.opera.toString() === '[object Opera]';
13431  /**
13432   * @desc Creates a new accessible mega menu instance.
13433   * @param {jquery} element
13434   * @param {object} [options] Mega Menu options
13435   * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby
13436   * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling
13437   * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu
13438   * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel
13439   * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel
13440   * @param {string} [options.hoverClass=hover] - CSS class for the hover state
13441   * @param {string} [options.focusClass=focus] - CSS class for the focus state
13442   * @param {string} [options.openClass=open] - CSS class for the open state
13443   * @constructor
13444   */
13445
13446  function AccessibleMegaMenu(element, options) {
13447    this.element = element; // merge optional settings and defaults into settings
13448
13449    this.settings = $.extend({}, defaults, options);
13450    this._defaults = defaults;
13451    this._name = pluginName;
13452    this.mouseTimeoutID = null;
13453    this.focusTimeoutID = null;
13454    this.mouseFocused = false;
13455    this.justFocused = false;
13456    this.init();
13457  }
13458
13459  AccessibleMegaMenu.prototype = function () {
13460    /* private attributes and methods ------------------------ */
13461    var uuid = 0,
13462        keydownTimeoutDuration = 1000,
13463        keydownSearchString = "",
13464        isTouch = 'ontouchstart' in window || window.navigator.msMaxTouchPoints,
13465        _getPlugin,
13466        _addUniqueId,
13467        _togglePanel,
13468        _clickHandler,
13469        _touchmoveHandler,
13470        _clickOutsideHandler,
13471        _DOMAttrModifiedHandler,
13472        _focusInHandler,
13473        _focusOutHandler,
13474        _keyDownHandler,
13475        _mouseDownHandler,
13476        _mouseOverHandler,
13477        _mouseOutHandler,
13478        _clickToggleHandler,
13479        _toggleExpandedEventHandlers,
13480        _addEventHandlers,
13481        _removeEventHandlers;
13482    /**
13483     * @name jQuery.fn.accessibleMegaMenu~_getPlugin
13484     * @desc Returns the parent accessibleMegaMenu instance for a given element
13485     * @param {jQuery} element
13486     * @memberof jQuery.fn.accessibleMegaMenu
13487     * @inner
13488     * @private
13489     */
13490
13491
13492    _getPlugin = function _getPlugin(element) {
13493      return $(element).closest(':data(plugin_' + pluginName + ')').data("plugin_" + pluginName);
13494    };
13495    /**
13496     * @name jQuery.fn.accessibleMegaMenu~_addUniqueId
13497     * @desc Adds a unique id and element.
13498     * The id string starts with the
13499     * string defined in settings.uuidPrefix.
13500     * @param {jQuery} element
13501     * @memberof jQuery.fn.accessibleMegaMenu
13502     * @inner
13503     * @private
13504     */
13505
13506
13507    _addUniqueId = function _addUniqueId(element) {
13508      element = $(element);
13509      var settings = this.settings;
13510
13511      if (!element.attr("id")) {
13512        element.attr("id", settings.uuidPrefix + "-" + new Date().getTime() + "-" + ++uuid);
13513      }
13514    };
13515    /**
13516     * @name jQuery.fn.accessibleMegaMenu~_togglePanel
13517     * @desc Toggle the display of mega menu panels in response to an event.
13518     * The optional boolean value 'hide' forces all panels to hide.
13519     * @param {event} event
13520     * @param {Boolean} [hide] Hide all mega menu panels when true
13521     * @memberof jQuery.fn.accessibleMegaMenu
13522     * @inner
13523     * @private
13524     */
13525
13526
13527    _togglePanel = function _togglePanel(event, hide) {
13528      var target = $(event.target),
13529          that = this,
13530          settings = this.settings,
13531          menu = this.menu,
13532          topli = target.closest('.' + settings.topNavItemClass),
13533          panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),
13534          newfocus;
13535
13536      _toggleExpandedEventHandlers.call(this, true);
13537
13538      if (hide) {
13539        topli = menu.find('.' + settings.topNavItemClass + ' .' + settings.openClass + ':first').closest('.' + settings.topNavItemClass);
13540
13541        if (!(topli.is(event.relatedTarget) || topli.has(event.relatedTarget).length > 0)) {
13542          if ((event.type === 'mouseout' || event.type === 'focusout') && topli.has(document.activeElement).length > 0) {
13543            return;
13544          }
13545
13546          topli.find('[aria-expanded]').filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
13547
13548          if (event.type === 'keydown' && event.keyCode === Keyboard.ESCAPE || event.type === 'DOMAttrModified') {
13549            newfocus = topli.find(':tabbable:first');
13550            setTimeout(function () {
13551              menu.find('[aria-expanded].' + that.settings.panelClass).off('DOMAttrModified.accessible-megamenu');
13552              newfocus.focus();
13553              that.justFocused = false;
13554            }, 99);
13555          }
13556        } else if (topli.length === 0) {
13557          menu.find('[aria-expanded=true]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
13558        }
13559      } else {
13560        clearTimeout(that.focusTimeoutID);
13561        topli.siblings().find('[aria-expanded]').filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
13562        topli.find('[aria-expanded]').filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false');
13563        var pageScrollPosition = $('html')[0].scrollTop;
13564        var $openPanel = $('.' + settings.panelClass + '.' + settings.openClass).parent();
13565
13566        if ($openPanel.length > 0) {
13567          var openPanelTopPosition = $openPanel.offset().top;
13568
13569          if (pageScrollPosition > openPanelTopPosition) {
13570            $('html')[0].scrollTop = openPanelTopPosition;
13571          }
13572        }
13573
13574        if (event.type === 'mouseover' && target.is(':tabbable') && topli.length === 1 && panel.length === 0 && menu.has(document.activeElement).length > 0) {
13575          target.focus();
13576          that.justFocused = false;
13577        }
13578
13579        _toggleExpandedEventHandlers.call(that);
13580      }
13581    };
13582    /**
13583     * @name jQuery.fn.accessibleMegaMenu~_clickHandler
13584     * @desc Handle click event on mega menu item
13585     * @param {event} Event object
13586     * @memberof jQuery.fn.accessibleMegaMenu
13587     * @inner
13588     * @private
13589     */
13590
13591
13592    _clickHandler = function _clickHandler(event) {
13593      var target = $(event.target).closest(':tabbable'),
13594          topli = target.closest('.' + this.settings.topNavItemClass),
13595          panel = target.closest('.' + this.settings.panelClass);
13596
13597      if (topli.length === 1 && panel.length === 0 && topli.find('.' + this.settings.panelClass).length === 1) {
13598        if (!target.hasClass(this.settings.openClass)) {
13599          event.preventDefault();
13600          event.stopPropagation();
13601
13602          _togglePanel.call(this, event);
13603
13604          this.justFocused = false;
13605        } else {
13606          if (this.justFocused) {
13607            event.preventDefault();
13608            event.stopPropagation();
13609            this.justFocused = false;
13610          } else if (isTouch || !isTouch && !this.settings.openOnMouseover) {
13611            event.preventDefault();
13612            event.stopPropagation();
13613
13614            _togglePanel.call(this, event, target.hasClass(this.settings.openClass));
13615          }
13616        }
13617      }
13618    };
13619    /**
13620     * @name jQuery.fn.accessibleMegaMenu~_touchmoveHandler
13621     * @desc Handle touch move event on menu
13622     * @memberof jQuery.fn.accessibleMegaMenu
13623     * @inner
13624     * @private
13625     */
13626
13627
13628    _touchmoveHandler = function _touchmoveHandler() {
13629      this.justMoved = true;
13630    };
13631    /**
13632     * @name jQuery.fn.accessibleMegaMenu~_clickOutsideHandler
13633     * @desc Handle click event outside of a the megamenu
13634     * @param {event} Event object
13635     * @memberof jQuery.fn.accessibleMegaMenu
13636     * @inner
13637     * @private
13638     */
13639
13640
13641    _clickOutsideHandler = function _clickOutsideHandler(event) {
13642      if ($(event.target).closest(this.menu).length === 0) {
13643        event.preventDefault();
13644        event.stopPropagation();
13645
13646        _togglePanel.call(this, event, true);
13647      }
13648    };
13649    /**
13650     * @name jQuery.fn.accessibleMegaMenu~_DOMAttrModifiedHandler
13651     * @desc Handle DOMAttrModified event on panel to respond to Windows 8 Narrator ExpandCollapse pattern
13652     * @param {event} Event object
13653     * @memberof jQuery.fn.accessibleMegaMenu
13654     * @inner
13655     * @private
13656     */
13657
13658
13659    _DOMAttrModifiedHandler = function _DOMAttrModifiedHandler(event) {
13660      if (event.originalEvent.attrName === 'aria-expanded' && event.originalEvent.newValue === 'false' && $(event.target).hasClass(this.settings.openClass) && !$(event.target).hasClass('ww-megaMenu-aria-mangling-fix')) {
13661        event.preventDefault();
13662        event.stopPropagation();
13663
13664        _togglePanel.call(this, event, true);
13665      }
13666    };
13667    /**
13668     * @name jQuery.fn.accessibleMegaMenu~_focusInHandler
13669     * @desc Handle focusin event on mega menu item.
13670     * @param {event} Event object
13671     * @memberof jQuery.fn.accessibleMegaMenu
13672     * @inner
13673     * @private
13674     */
13675
13676
13677    _focusInHandler = function _focusInHandler(event) {
13678      clearTimeout(this.focusTimeoutID);
13679      var target = $(event.target),
13680          panel = target.closest('.' + this.settings.panelClass);
13681      target.addClass(this.settings.focusClass);
13682      this.justFocused = !this.mouseFocused || !this.settings.openOnMouseover && this.mouseFocused;
13683      this.mouseFocused = false;
13684
13685      if (this.justFocused && this.panels.not(panel).filter('.' + this.settings.openClass).length) {
13686        _togglePanel.call(this, event);
13687      }
13688    };
13689    /**
13690     * @name jQuery.fn.accessibleMegaMenu~_focusOutHandler
13691     * @desc Handle focusout event on mega menu item.
13692     * @param {event} Event object
13693     * @memberof jQuery.fn.accessibleMegaMenu
13694     * @inner
13695     * @private
13696     */
13697
13698
13699    _focusOutHandler = function _focusOutHandler(event) {
13700      this.justFocused = false;
13701      var that = this,
13702          target = $(event.target),
13703          topli = target.closest('.' + this.settings.topNavItemClass);
13704      target.removeClass(this.settings.focusClass);
13705
13706      if (window.cvox) {
13707        // If ChromeVox is running...
13708        that.focusTimeoutID = setTimeout(function () {
13709          window.cvox.Api.getCurrentNode(function (node) {
13710            if (topli.has(node).length) {
13711              // and the current node being voiced is in
13712              // the mega menu, clearTimeout,
13713              // so the panel stays open.
13714              clearTimeout(that.focusTimeoutID);
13715            } else {
13716              that.focusTimeoutID = setTimeout(function (scope, event, hide) {
13717                _togglePanel.call(scope, event, hide);
13718              }, 275, that, event, true);
13719            }
13720          });
13721        }, 25);
13722      } else {
13723        that.focusTimeoutID = setTimeout(function () {
13724          if (that.mouseFocused && event.relatedTarget === null) {
13725            return;
13726          }
13727
13728          _togglePanel.call(that, event, true);
13729        }, 300);
13730      }
13731    };
13732    /**
13733     * @name jQuery.fn.accessibleMegaMenu~_keyDownHandler
13734     * @desc Handle keydown event on mega menu.
13735     * @param {event} Event object
13736     * @memberof jQuery.fn.accessibleMegaMenu
13737     * @inner
13738     * @private
13739     */
13740
13741
13742    _keyDownHandler = function _keyDownHandler(event) {
13743      var that = this.constructor === AccessibleMegaMenu ? this : _getPlugin(this),
13744          // determine the AccessibleMegaMenu plugin instance
13745      settings = that.settings,
13746          target = $($(this).is('.' + settings.hoverClass + ':tabbable') ? this : event.target),
13747          // if the element is hovered the target is this, otherwise, its the focused element
13748      menu = that.menu,
13749          topnavitems = that.topnavitems,
13750          topli = target.closest('.' + settings.topNavItemClass),
13751          tabbables = menu.find(':tabbable'),
13752          panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),
13753          panelGroups = panel.find('.' + settings.panelGroupClass),
13754          currentPanelGroup = target.closest('.' + settings.panelGroupClass),
13755          next,
13756          keycode = event.keyCode || event.which,
13757          start,
13758          i,
13759          o,
13760          label,
13761          found = false,
13762          newString = Keyboard.keyMap[event.keyCode] || '',
13763          regex,
13764          isTopNavItem = topli.length === 1 && panel.length === 0;
13765
13766      if (target.is("input:focus, select:focus, textarea:focus, button:focus")) {
13767        // if the event target is a form element we should handle keydown normally
13768        return;
13769      }
13770
13771      if (target.is('.' + settings.hoverClass + ':tabbable')) {
13772        $('html').off('keydown.accessible-megamenu');
13773      }
13774
13775      switch (keycode) {
13776        case Keyboard.ESCAPE:
13777          this.mouseFocused = false;
13778
13779          _togglePanel.call(that, event, true);
13780
13781          break;
13782
13783        case Keyboard.DOWN:
13784          event.preventDefault();
13785          this.mouseFocused = false;
13786
13787          if (isTopNavItem) {
13788            _togglePanel.call(that, event);
13789
13790            found = topli.find('.' + settings.panelClass + ' :tabbable:first').focus().length === 1;
13791          } else {
13792            found = tabbables.filter(':gt(' + tabbables.index(target) + '):first').focus().length === 1;
13793          }
13794
13795          if (!found && isOpera && (event.ctrlKey || event.metaKey)) {
13796            tabbables = $(':tabbable');
13797            i = tabbables.index(target);
13798            found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
13799          }
13800
13801          break;
13802
13803        case Keyboard.UP:
13804          event.preventDefault();
13805          this.mouseFocused = false;
13806
13807          if (isTopNavItem && target.hasClass(settings.openClass)) {
13808            _togglePanel.call(that, event, true);
13809
13810            next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');
13811
13812            if (next.children('.' + settings.panelClass).length) {
13813              found = next.find('[aria-expanded]').filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus() === 1;
13814            }
13815          } else if (!isTopNavItem) {
13816            found = tabbables.filter(':lt(' + tabbables.index(target) + '):last').focus().length === 1;
13817          }
13818
13819          if (!found && isOpera && (event.ctrlKey || event.metaKey)) {
13820            tabbables = $(':tabbable');
13821            i = tabbables.index(target);
13822            found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
13823          }
13824
13825          break;
13826
13827        case Keyboard.RIGHT:
13828          event.preventDefault();
13829          this.mouseFocused = false;
13830
13831          if (isTopNavItem) {
13832            found = topnavitems.filter(':gt(' + topnavitems.index(topli) + '):first').find(':tabbable:first').focus().length === 1;
13833          } else {
13834            if (panelGroups.length && currentPanelGroup.length) {
13835              // if the current panel contains panel groups, and we are able to focus the first tabbable element of the next panel group
13836              found = panelGroups.filter(':gt(' + panelGroups.index(currentPanelGroup) + '):first').find(':tabbable:first').focus().length === 1;
13837            }
13838
13839            if (!found) {
13840              found = topli.find(':tabbable:first').focus().length === 1;
13841            }
13842          }
13843
13844          break;
13845
13846        case Keyboard.LEFT:
13847          event.preventDefault();
13848          this.mouseFocused = false;
13849
13850          if (isTopNavItem) {
13851            found = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last').find(':tabbable:first').focus().length === 1;
13852          } else {
13853            if (panelGroups.length && currentPanelGroup.length) {
13854              // if the current panel contains panel groups, and we are able to focus the first tabbable element of the previous panel group
13855              found = panelGroups.filter(':lt(' + panelGroups.index(currentPanelGroup) + '):last').find(':tabbable:first').focus().length === 1;
13856            }
13857
13858            if (!found) {
13859              found = topli.find(':tabbable:first').focus().length === 1;
13860            }
13861          }
13862
13863          break;
13864
13865        case Keyboard.TAB:
13866          this.mouseFocused = false;
13867          i = tabbables.index(target);
13868
13869          if (event.shiftKey && isTopNavItem && target.hasClass(settings.openClass)) {
13870            _togglePanel.call(that, event, true);
13871
13872            next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');
13873
13874            if (next.children('.' + settings.panelClass).length) {
13875              found = next.children().filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus();
13876            }
13877          } else if (event.shiftKey && i > 0) {
13878            found = tabbables.filter(':lt(' + i + '):last').focus().length === 1;
13879          } else if (!event.shiftKey && i < tabbables.length - 1) {
13880            found = tabbables.filter(':gt(' + i + '):first').focus().length === 1;
13881          } else if (isOpera) {
13882            tabbables = $(':tabbable');
13883            i = tabbables.index(target);
13884
13885            if (event.shiftKey) {
13886              found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):last').focus().length === 1;
13887            } else {
13888              found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
13889            }
13890          }
13891
13892          if (found) {
13893            event.preventDefault();
13894          }
13895
13896          break;
13897
13898        case Keyboard.SPACE:
13899        case Keyboard.ENTER:
13900          if (isTopNavItem) {
13901            event.preventDefault();
13902
13903            _clickHandler.call(that, event);
13904          } else {
13905            return true;
13906          }
13907
13908          break;
13909
13910        default:
13911          // alphanumeric filter
13912          clearTimeout(this.keydownTimeoutID);
13913          keydownSearchString += newString !== keydownSearchString ? newString : '';
13914
13915          if (keydownSearchString.length === 0) {
13916            return;
13917          }
13918
13919          this.keydownTimeoutID = setTimeout(function () {
13920            keydownSearchString = '';
13921          }, keydownTimeoutDuration);
13922
13923          if (isTopNavItem && !target.hasClass(settings.openClass)) {
13924            tabbables = tabbables.filter(':not(.' + settings.panelClass + ' :tabbable)');
13925          } else {
13926            tabbables = topli.find(':tabbable');
13927          }
13928
13929          if (event.shiftKey) {
13930            tabbables = $(tabbables.get().reverse());
13931          }
13932
13933          for (i = 0; i < tabbables.length; i++) {
13934            o = tabbables.eq(i);
13935
13936            if (o.is(target)) {
13937              start = keydownSearchString.length === 1 ? i + 1 : i;
13938              break;
13939            }
13940          }
13941
13942          regex = new RegExp('^' + keydownSearchString.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'), 'i');
13943
13944          for (i = start; i < tabbables.length; i++) {
13945            o = tabbables.eq(i);
13946            label = $.trim(o.text());
13947
13948            if (regex.test(label)) {
13949              found = true;
13950              o.focus();
13951              break;
13952            }
13953          }
13954
13955          if (!found) {
13956            for (i = 0; i < start; i++) {
13957              o = tabbables.eq(i);
13958              label = $.trim(o.text());
13959
13960              if (regex.test(label)) {
13961                o.focus();
13962                break;
13963              }
13964            }
13965          }
13966
13967          break;
13968      }
13969
13970      that.justFocused = false;
13971    };
13972    /**
13973     * @name jQuery.fn.accessibleMegaMenu~_mouseDownHandler
13974     * @desc Handle mousedown event on mega menu.
13975     * @param {event} Event object
13976     * @memberof accessibleMegaMenu
13977     * @inner
13978     * @private
13979     */
13980
13981
13982    _mouseDownHandler = function _mouseDownHandler(event) {
13983      if ($(event.target).closest(this.settings.panelClass) || $(event.target).closest(":focusable").length) {
13984        this.mouseFocused = true;
13985
13986        if ($(event.target).closest(this.settings.menuClass)) {
13987          $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target));
13988        }
13989      }
13990
13991      clearTimeout(this.mouseTimeoutID);
13992      this.mouseTimeoutID = setTimeout(function () {
13993        clearTimeout(this.focusTimeoutID);
13994      }, 1);
13995    };
13996    /**
13997     * @name jQuery.fn.accessibleMegaMenu~_mouseOverHandler
13998     * @desc Handle mouseover event on mega menu.
13999     * @param {event} Event object
14000     * @memberof jQuery.fn.accessibleMegaMenu
14001     * @inner
14002     * @private
14003     */
14004
14005
14006    _mouseOverHandler = function _mouseOverHandler(event) {
14007      clearTimeout(this.mouseTimeoutID);
14008      var that = this;
14009
14010      if (!that.settings.openOnMouseover) {
14011        return;
14012      }
14013
14014      this.mouseTimeoutID = setTimeout(function () {
14015        $(event.target).addClass(that.settings.hoverClass);
14016
14017        _togglePanel.call(that, event);
14018
14019        if ($(event.target).closest(that.settings.menuClass)) {
14020          $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target));
14021        }
14022      }, this.settings.openDelay);
14023    };
14024    /**
14025     * @name jQuery.fn.accessibleMegaMenu~_mouseOutHandler
14026     * @desc Handle mouseout event on mega menu.
14027     * @param {event} Event object
14028     * @memberof jQuery.fn.accessibleMegaMenu
14029     * @inner
14030     * @private
14031     */
14032
14033
14034    _mouseOutHandler = function _mouseOutHandler(event) {
14035      clearTimeout(this.mouseTimeoutID);
14036      var that = this;
14037
14038      if (!that.settings.openOnMouseover) {
14039        return;
14040      }
14041
14042      $(event.target).removeClass(that.settings.hoverClass);
14043      that.mouseTimeoutID = setTimeout(function () {
14044        _togglePanel.call(that, event, true);
14045      }, this.settings.closeDelay);
14046
14047      if ($(event.target).is(':tabbable')) {
14048        $('html').off('keydown.accessible-megamenu');
14049      }
14050    };
14051    /**
14052     * @name jQuery.fn.accessibleMegaMenu~_clickToggleHandler
14053     * @desc Handle click event on menu toggle button.
14054     * @memberof jQuery.fn.accessibleMegaMenu
14055     * @inner
14056     * @private
14057     */
14058
14059
14060    _clickToggleHandler = function _clickToggleHandler() {
14061      var isExpanded = this.toggleButton.attr('aria-expanded') === 'true';
14062      this.toggleButton.attr({
14063        'aria-expanded': !isExpanded,
14064        'aria-pressed': !isExpanded
14065      });
14066    };
14067
14068    _toggleExpandedEventHandlers = function _toggleExpandedEventHandlers(hide) {
14069      var menu = this.menu;
14070
14071      if (hide) {
14072        $('html').off('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu,  pointerup.outside-accessible-megamenu');
14073        menu.find('[aria-expanded].' + this.settings.panelClass).off('DOMAttrModified.accessible-megamenu');
14074      } else {
14075        $('html').on('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu,  pointerup.outside-accessible-megamenu', $.proxy(_clickOutsideHandler, this));
14076        /* Narrator in Windows 8 automatically toggles the aria-expanded property on double tap or click.
14077           To respond to the change to collapse the panel, we must add a listener for a DOMAttrModified event. */
14078
14079        menu.find('[aria-expanded=true].' + this.settings.panelClass).on('DOMAttrModified.accessible-megamenu', $.proxy(_DOMAttrModifiedHandler, this));
14080      }
14081    };
14082
14083    _addEventHandlers = function _addEventHandlers() {
14084      var menu = this.menu,
14085          toggleButton = this.toggleButton;
14086      menu.on("focusin.accessible-megamenu", ":focusable, ." + this.settings.panelClass, $.proxy(_focusInHandler, this)).on("focusout.accessible-megamenu", ":focusable, ." + this.settings.panelClass, $.proxy(_focusOutHandler, this)).on("keydown.accessible-megamenu", $.proxy(_keyDownHandler, this)).on("mouseover.accessible-megamenu", $.proxy(_mouseOverHandler, this)).on("mouseout.accessible-megamenu", $.proxy(_mouseOutHandler, this)).on("mousedown.accessible-megamenu", $.proxy(_mouseDownHandler, this)).on("click.accessible-megamenu", $.proxy(_clickHandler, this));
14087      toggleButton.on('click.accessible-megamenu', $.proxy(_clickToggleHandler, this));
14088
14089      if (isTouch) {
14090        menu.on("touchmove.accessible-megamenu", $.proxy(_touchmoveHandler, this));
14091      }
14092
14093      if ($(document.activeElement).closest(menu).length) {
14094        $(document.activeElement).trigger("focusin.accessible-megamenu");
14095      }
14096    };
14097
14098    _removeEventHandlers = function _removeEventHandlers() {
14099      var menu = this.menu,
14100          toggleButton = this.toggleButton;
14101      menu.off('.accessible-megamenu');
14102
14103      if (menu.find('[aria-expanded=true].' + this.settings.panelClass).length) {
14104        _toggleExpandedEventHandlers.call(this, true);
14105      }
14106
14107      toggleButton.off('.accessible-megamenu');
14108    };
14109    /* public attributes and methods ------------------------- */
14110
14111
14112    return {
14113      constructor: AccessibleMegaMenu,
14114
14115      /**
14116       * @lends jQuery.fn.accessibleMegaMenu
14117       * @desc Initializes an instance of the accessibleMegaMenu plugins
14118       * @memberof jQuery.fn.accessibleMegaMenu
14119       * @instance
14120       */
14121      init: function init() {
14122        var settings = this.settings,
14123            nav = $(this.element),
14124            menu = nav.children('ol,ul').first(),
14125            topnavitems = menu.children(),
14126            toggleButton = nav.children('button').first();
14127        this.start(settings, nav, menu, topnavitems, toggleButton);
14128      },
14129      start: function start(settings, nav, menu, topnavitems, toggleButton) {
14130        var that = this;
14131        this.settings = settings;
14132        this.menu = menu;
14133        this.topnavitems = topnavitems;
14134        this.toggleButton = toggleButton;
14135        nav.attr("role", "navigation");
14136
14137        _addUniqueId.call(that, menu);
14138
14139        menu.addClass(settings.menuClass);
14140        menu.addClass(['js', settings.menuClass].join('-'));
14141        topnavitems.each(function (i, topnavitem) {
14142          var topnavitemlink, topnavitempanel;
14143          topnavitem = $(topnavitem);
14144          topnavitem.addClass(settings.topNavItemClass);
14145          topnavitemlink = topnavitem.find(":tabbable:first");
14146          topnavitempanel = topnavitem.children(":not(:tabbable):last");
14147
14148          _addUniqueId.call(that, topnavitemlink);
14149
14150          if (topnavitempanel.length) {
14151            _addUniqueId.call(that, topnavitempanel);
14152
14153            topnavitemlink.attr({
14154              "role": "button",
14155              "aria-controls": topnavitempanel.attr("id"),
14156              "aria-expanded": false,
14157              "tabindex": 0
14158            });
14159            topnavitempanel.attr({
14160              "role": "region",
14161              "aria-expanded": false,
14162              "aria-hidden": true
14163            }).addClass(settings.panelClass).not("[aria-labelledby]").attr("aria-labelledby", topnavitemlink.attr("id"));
14164          }
14165        });
14166        this.panels = menu.find("." + settings.panelClass);
14167        menu.find("hr").attr("role", "separator");
14168        toggleButton.addClass(settings.toggleButtonClass);
14169        toggleButton.attr({
14170          'aria-expanded': false,
14171          'aria-pressed': false,
14172          'aria-controls': menu.attr('id')
14173        });
14174
14175        _addEventHandlers.call(this);
14176      },
14177
14178      /**
14179       * @desc Removes maga menu javascript behavior
14180       * @example $(selector).accessibleMegaMenu("destroy");
14181       * @return {object}
14182       * @memberof jQuery.fn.accessibleMegaMenu
14183       * @instance
14184       */
14185      destroy: function destroy() {
14186        this.menu.removeClass(['js', this.settings.menuClass].join('-'));
14187
14188        _removeEventHandlers.call(this, true);
14189      },
14190
14191      /**
14192       * @desc Get default values
14193       * @example $(selector).accessibleMegaMenu("getDefaults");
14194       * @return {object}
14195       * @memberof jQuery.fn.accessibleMegaMenu
14196       * @instance
14197       */
14198      getDefaults: function getDefaults() {
14199        return this._defaults;
14200      },
14201
14202      /**
14203       * @desc Get any option set to plugin using its name (as string)
14204       * @example $(selector).accessibleMegaMenu("getOption", some_option);
14205       * @param {string} opt
14206       * @return {string}
14207       * @memberof jQuery.fn.accessibleMegaMenu
14208       * @instance
14209       */
14210      getOption: function getOption(opt) {
14211        return this.settings[opt];
14212      },
14213
14214      /**
14215       * @desc Get all options
14216       * @example $(selector).accessibleMegaMenu("getAllOptions");
14217       * @return {object}
14218       * @memberof jQuery.fn.accessibleMegaMenu
14219       * @instance
14220       */
14221      getAllOptions: function getAllOptions() {
14222        return this.settings;
14223      },
14224
14225      /**
14226       * @desc Set option
14227       * @example $(selector).accessibleMegaMenu("setOption", "option_name",  "option_value",  reinitialize);
14228       * @param {string} opt - Option name
14229       * @param {string} val - Option value
14230       * @param {boolean} [reinitialize] - boolean to re-initialize the menu.
14231       * @memberof jQuery.fn.accessibleMegaMenu
14232       * @instance
14233       */
14234      setOption: function setOption(opt, value, reinitialize) {
14235        this.settings[opt] = value;
14236
14237        if (reinitialize) {
14238          this.init();
14239        }
14240      }
14241    };
14242  }();
14243  /* lightweight plugin wrapper around the constructor,
14244     to prevent against multiple instantiations */
14245
14246  /**
14247   * @class accessibleMegaMenu
14248   * @memberOf jQuery.fn
14249   * @classdesc Implements an accessible mega menu as a jQuery plugin.
14250   * <p>The mega-menu It is modeled after the mega menu on {@link http://adobe.com|adobe.com} but has been simplified for use by others. A brief description of the interaction design choices can be found in a blog post at {@link http://blogs.adobe.com/accessibility/2013/05/adobe-com.html|Mega menu accessibility on adobe.com}.</p>
14251   * <h3>Keyboard Accessibility</h3>
14252   * <p>The accessible mega menu supports keyboard interaction modeled after the behavior described 
14252in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern}, however we also try to respect users' general expectations for the behavior of links in a global navigation. To this end, the accessible mega menu implementation permits tab focus on each of the six top-level menu items. When one of the menu items has focus, pressing the Enter key, Spacebar or Down arrow will open the submenu panel, and pressing the Left or Right arrow key will shift focus to the adjacent menu item. Links within the submenu panels are included in the tab order when the panel is open. They can also be navigated with the arrow keys or by typing the first character in the link name, which speeds up keyboard navigation considerably. Pressing the Escape key closes the submenu and restores focus to the parent menu item.</p>
14253   * <h3>Screen Reader Accessibility</h3>
14254   * <p>The accessible mega menu models its use of WAI-ARIA Roles, States, and Properties after those described in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern} with some notable exceptions, so that it behaves better with screen reader user expectations for global navigation. We don't use <code class="prettyprint prettyprinted" style=""><span class="pln">role</span><span class="pun">=</span><span class="str">"menu"</span></code> for the menu container and <code class="prettyprint prettyprinted" style=""><span class="pln">role</span><span class="pun">=</span><span class="str">"menuitem"</span></code> for each of the links therein, because if we do, assistive technology will no longer interpret the links as links, but instead, as menu items, and the links in our global navigation will no longer show up when a screen reader user executes a shortcut command to bring up a list of links in the page.</p>
14255   * @example <h4>HTML</h4><hr/>
14256   &lt;nav&gt;
14257   &lt;ul class=&quot;nav-menu&quot;&gt;
14258   &lt;li class=&quot;nav-item&quot;&gt;
14259   &lt;a href=&quot;?movie&quot;&gt;Movies&lt;/a&gt;
14260   &lt;div class=&quot;sub-nav&quot;&gt;
14261   &lt;ul class=&quot;sub-nav-group&quot;&gt;
14262   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=0&quot;&gt;Action &amp;amp; Adventure&lt;/a&gt;&lt;/li&gt;
14263   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=2&quot;&gt;Children &amp;amp; Family&lt;/a&gt;&lt;/li&gt;
14264   &lt;li&gt;&amp;#8230;&lt;/li&gt;
14265   &lt;/ul&gt;
14266   &lt;ul class=&quot;sub-nav-group&quot;&gt;
14267   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=7&quot;&gt;Dramas&lt;/a&gt;&lt;/li&gt;
14268   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=9&quot;&gt;Foreign&lt;/a&gt;&lt;/li&gt;
14269   &lt;li&gt;&amp;#8230;&lt;/li&gt;
14270   &lt;/ul&gt;
14271   &lt;ul class=&quot;sub-nav-group&quot;&gt;
14272   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=14&quot;&gt;Musicals&lt;/a&gt;&lt;/li&gt;
14273   &lt;li&gt;&lt;a href=&quot;?movie&amp;genre=15&quot;&gt;Romance&lt;/a&gt;&lt;/li&gt;
14274   &lt;li&gt;&amp;#8230;&lt;/li&gt;
14275   &lt;/ul&gt;
14276   &lt;/div&gt;
14277   &lt;/li&gt;
14278   &lt;li class=&quot;nav-item&quot;&gt;
14279   &lt;a href=&quot;?tv&quot;&gt;TV Shows&lt;/a&gt;
14280   &lt;div class=&quot;sub-nav&quot;&gt;
14281   &lt;ul class=&quot;sub-nav-group&quot;&gt;
14282   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=20&quot;&gt;Classic TV&lt;/a&gt;&lt;/li&gt;
14283   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=21&quot;&gt;Crime TV&lt;/a&gt;&lt;/li&gt;
14284   &lt;li&gt;&amp;#8230;&lt;/li&gt;
14285   &lt;/ul&gt;
14286   &lt;ul class=&quot;sub-nav-group&quot;&gt;
14287   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=27&quot;&gt;Reality TV&lt;/a&gt;&lt;/li&gt;
14288   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=30&quot;&gt;TV Action&lt;/a&gt;&lt;/li&gt;
14289   &lt;li&gt;&amp;#8230;&lt;/li&gt;
14290   &lt;/ul&gt;
14291   &lt;ul class=&quot;sub-nav-group&quot;&gt;
14292   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=33&quot;&gt;TV Dramas&lt;/a&gt;&lt;/li&gt;
14293   &lt;li&gt;&lt;a href=&quot;?tv&amp;genre=34&quot;&gt;TV Horror&lt;/a&gt;&lt;/li&gt;
14294   &lt;li&gt;&amp;#8230;&lt;/li&gt;
14295   &lt;/ul&gt;
14296   &lt;/div&gt;
14297   &lt;/li&gt;
14298   &lt;/ul&gt;
14299   &lt;/nav&gt;
14300   * @example <h4>CSS</h4><hr/>
14301   &#47;* Rudimentary mega menu CSS for demonstration *&#47;
14302    &#47;* mega menu list *&#47;
14303   .nav-menu {
14304  display: block;
14305  position: relative;
14306  list-style: none;
14307  margin: 0;
14308  padding: 0;
14309  z-index: 15;
14310  }
14311    &#47;* a top level navigation item in the mega menu *&#47;
14312   .nav-item {
14313  list-style: none;
14314  display: inline-block;
14315  padding: 0;
14316  margin: 0;
14317  }
14318    &#47;* first descendant link within a top level navigation item *&#47;
14319   .nav-item &gt; a {
14320  position: relative;
14321  display: inline-block;
14322  padding: 0.5em 1em;
14323  margin: 0 0 -1px 0;
14324  border: 1px solid transparent;
14325  }
14326    &#47;* focus/open states of first descendant link within a top level
14327   navigation item *&#47;
14328   .nav-item &gt; a:focus,
14329   .nav-item &gt; a.open {
14330  border: 1px solid #dedede;
14331  }
14332    &#47;* open state of first descendant link within a top level
14333   navigation item *&#47;
14334   .nav-item &gt; a.open {
14335  background-color: #fff;
14336  border-bottom: none;
14337  z-index: 1;
14338  }
14339    &#47;* sub-navigation panel *&#47;
14340   .sub-nav {
14341  position: absolute;
14342  display: none;
14343  top: 2.2em;
14344  margin-top: -1px;
14345  padding: 0.5em 1em;
14346  border: 1px solid #dedede;
14347  background-color: #fff;
14348  }
14349    &#47;* sub-navigation panel open state *&#47;
14350   .sub-nav.open {
14351  display: block;
14352  }
14353    &#47;* list of items within sub-navigation panel *&#47;
14354   .sub-nav ul {
14355  display: inline-block;
14356  vertical-align: top;
14357  margin: 0 1em 0 0;
14358  padding: 0;
14359  }
14360    &#47;* list item within sub-navigation panel *&#47;
14361   .sub-nav li {
14362  display: block;
14363  list-style-type: none;
14364  margin: 0;
14365  padding: 0;
14366  }
14367   * @example <h4>JavaScript</h4><hr/>
14368   &lt;!-- include jquery --&gt;
14369   &lt;script src=&quot;http://code.jquery.com/jquery-1.10.1.min.js&quot;&gt;&lt;/script&gt;
14370    &lt;!-- include the jquery-accessibleMegaMenu plugin script --&gt;
14371   &lt;script src=&quot;js/jquery-accessibleMegaMenu.js&quot;&gt;&lt;/script&gt;
14372    &lt;!-- initialize a selector as an accessibleMegaMenu --&gt;
14373   &lt;script&gt;
14374   $(&quot;nav:first&quot;).accessibleMegaMenu({
14375      &#47;* prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby *&#47;
14376      uuidPrefix: &quot;accessible-megamenu&quot;,
14377       &#47;* css class used to define the megamenu styling *&#47;
14378      menuClass: &quot;nav-menu&quot;,
14379       &#47;* css class for a top-level navigation item in the megamenu *&#47;
14380      topNavItemClass: &quot;nav-item&quot;,
14381       &#47;* css class for a megamenu panel *&#47;
14382      panelClass: &quot;sub-nav&quot;,
14383       &#47;* css class for a group of items within a megamenu panel *&#47;
14384      panelGroupClass: &quot;sub-nav-group&quot;,
14385       &#47;* css class for the hover state *&#47;
14386      hoverClass: &quot;hover&quot;,
14387       &#47;* css class for the focus state *&#47;
14388      focusClass: &quot;focus&quot;,
14389       &#47;* css class for the open state *&#47;
14390      openClass: &quot;open&quot;
14391  });
14392   &lt;/script&gt;
14393   * @param {object} [options] Mega Menu options
14394   * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby
14395   * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling
14396   * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu
14397   * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel
14398   * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel
14399   * @param {string} [options.hoverClass=hover] - CSS class for the hover state
14400   * @param {string} [options.focusClass=focus] - CSS class for the focus state
14401   * @param {string} [options.openClass=open] - CSS class for the open state
14402   * @param {string} [options.openDelay=0] - Open delay when opening menu via mouseover
14403   * @param {string} [options.closeDelay=250] - Open delay when opening menu via mouseover
14404   * @param {boolean} [options.openOnMouseover=false] - Should menu open on mouseover
14405   */
14406
14407
14408  $.fn[pluginName] = function (options) {
14409    return this.each(function () {
14410      var pluginInstance = $.data(this, "plugin_" + pluginName);
14411
14412      if (!pluginInstance) {
14413        $.data(this, "plugin_" + pluginName, new $.fn[pluginName].Acce
14413ssibleMegaMenu(this, options));
14414      } else if (typeof pluginInstance[options] === 'function') {
14415        pluginInstance[options].apply(pluginInstance, Array.prototype.slice.call(arguments, 1));
14416      }
14417    });
14418  };
14419
14420  $.fn[pluginName].AccessibleMegaMenu = AccessibleMegaMenu;
14421  /* :focusable and :tabbable selectors from
14422     https://raw.github.com/jquery/jquery-ui/master/ui/jquery.ui.core.js */
14423
14424  /**
14425   * @private
14426   */
14427
14428  function visible(element) {
14429    return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function () {
14430      return $.css(this, "visibility") === "hidden";
14431    }).length;
14432  }
14433  /**
14434   * @private
14435   */
14436
14437
14438  function _focusable(element, isTabIndexNotNaN) {
14439    var map,
14440        mapName,
14441        img,
14442        nodeName = element.nodeName.toLowerCase();
14443
14444    if ("area" === nodeName) {
14445      map = element.parentNode;
14446      mapName = map.name;
14447
14448      if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") {
14449        return false;
14450      }
14451
14452      img = $("img[usemap=#" + mapName + "]")[0];
14453      return !!img && visible(img);
14454    }
14455
14456    return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && // the element and all of its ancestors must be visible
14457    visible(element);
14458  }
14459
14460  $.extend($.expr[":"], {
14461    data: $.expr.createPseudo ? $.expr.createPseudo(function (dataName) {
14462      return function (elem) {
14463        return !!$.data(elem, dataName);
14464      };
14465    }) : // support: jQuery <1.8
14466    function (elem, i, match) {
14467      return !!$.data(elem, match[3]);
14468    },
14469    focusable: function focusable(element) {
14470      return _focusable(element, !isNaN($.attr(element, "tabindex")));
14471    },
14472    tabbable: function tabbable(element) {
14473      var tabIndex = $.attr(element, "tabindex"),
14474          isTabIndexNaN = isNaN(tabIndex);
14475      return (isTabIndexNaN || tabIndex >= 0) && _focusable(element, !isTabIndexNaN);
14476    }
14477  });
14478})(jQuery, window, document);
14479
14480/***/ }),
14481
14482/***/ 600:
14483/***/ (function() {
14484
14485function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
14486
14487function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
14488
14489function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
14490
14491var ExpandablePreview = /*#__PURE__*/function () {
14492  function ExpandablePreview(rteContentDiv) {
14493    _classCallCheck(this, ExpandablePreview);
14494
14495    this.lang = document.documentElement.lang || "de";
14496    this.lang = this.lang.slice(0, 2).toLowerCase();
14497    this.showMoreText = this.lang === 'de' ? 'Mehr' : 'Show more';
14498    this.showLessText = this.lang === 'de' ? 'Weniger anzeigen' : 'Show less';
14499    this.statusMoreText = this.lang === 'de' ? 'Text wurde erweitert' : 'Text was expanded';
14500    this.statusLessText = this.lang === 'de' ? 'Text wurde reduziert' : 'Text was reduced';
14501    this.rteContentDiv = rteContentDiv;
14502    this.content = rteContentDiv.innerHTML;
14503    this.expandableId = 'expandable-preview-' + Math.floor(Math.random() * 1000000);
14504    this.init();
14505  }
14506
14507  _createClass(ExpandablePreview, [{
14508    key: "init",
14509    value: function init() {
14510      if (this.rteContentDiv.offsetHeight < 300) {
14511        // Wenn die Höhe des Inhalts kleiner als 300px ist,
14512        // wird die Klappfunktion nicht benötigt
14513        return;
14514      }
14515
14516      this.createMarkup();
14517      this.bindEvents();
14518    }
14519  }, {
14520    key: "createMarkup",
14521    value: function createMarkup() {
14522      var newMarkup = "\n            <div class=\"rteContent expandable-preview expandable-preview--processed\">\n                <div id=\"".concat(this.expandableId, "__text\" class=\"expandable-preview__text expandable-preview__text--collapsed\" aria-live=\"polite\">\n                    ").concat(this.content, "\n                </div>\n                <button id=\"").concat(this.expandableId, "__toggle\" class=\"expandable-preview__toggle ajaxLoadmore__button button button button--expand\" aria-controls=\"").concat(this.expandableId, "__text\" aria-expanded=\"false\">\n                    <svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" width=\"11\" height=\"13\" viewBox=\"0 0 11 13\">\n                      <g fill=\"none\" fill-rule=\"evenodd\" stroke=\"currentColor\" stroke-width=\"1.5\" transform=\"translate(0 1)\">\n                        <line x1=\"5.5\" x2=\"5.5\" y2=\"11\"/>\n                        <line x2=\"11\" y1=\"5.5\" y2=\"5.5\"/>\n                      </g>\n                    </svg>
14522\n                    <span>").concat(this.showMoreText, "</span>\n                </button>\n                <div id=\"").concat(this.expandableId, "__status\" aria-live=\"polite\" class=\"visuallyhidden\"></div>\n            </div>\n        ");
14523      this.rteContentDiv.outerHTML = newMarkup;
14524    }
14525  }, {
14526    key: "bindEvents",
14527    value: function bindEvents() {
14528      var _this = this;
14529
14530      var toggleButton = document.getElementById("".concat(this.expandableId, "__toggle"));
14531      var toggleButtonSpan = toggleButton.querySelector('span');
14532      toggleButton.addEventListener('click', function () {
14533        var textDiv = document.getElementById("".concat(_this.expandableId, "__text"));
14534        var statusDiv = document.getElementById("".concat(_this.expandableId, "__status"));
14535        var isExpanded = toggleButton.getAttribute('aria-expanded') === 'true';
14536
14537        if (isExpanded) {
14538          textDiv.classList.add('expandable-preview__text--collapsed');
14539        } else {
14540          textDiv.classList.remove('expandable-preview__text--collapsed');
14541        }
14542
14543        toggleButton.setAttribute('aria-expanded', !isExpanded);
14544        toggleButtonSpan.innerText = isExpanded ? _this.showMoreText : _this.showLessText;
14545        statusDiv.innerText = isExpanded ? _this.statusLessText : _this.statusMoreText;
14546      });
14547    }
14548  }]);
14549
14550  return ExpandablePreview;
14551}();
14552
14553document.addEventListener('DOMContentLoaded', function () {
14554  var rteContentDivs = document.querySelectorAll('.expandable-preview:not(.expandable-preview--processed)');
14555  rteContentDivs.forEach(function (rteContentDiv) {
14556    if (rteContentDiv) {
14557      new ExpandablePreview(rteContentDiv);
14558    }
14559  });
14560});
14561
14562/***/ }),
14563
14564/***/ 9709:
14565/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
14566
14567/* provided dependency */ var $ = __webpack_require__(3336);
14568function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
14569
14570function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
14571
14572function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
14573
14574var TileTeaser = /*#__PURE__*/function () {
14575  function TileTeaser(teaser) {
14576    _classCallCheck(this, TileTeaser);
14577
14578    this.teaser = teaser;
14579    this.teaser.classList.remove('loading');
14580    this.title = teaser.querySelectorAll('[data-title]').item(0);
14581    this.setProperties(this.titleHeight);
14582    this.eventHandler();
14583  }
14584
14585  _createClass(TileTeaser, [{
14586    key: "titleHeight",
14587    get: function get() {
14588      return this.title.offsetHeight;
14589    }
14590    /**
14591     * set css variables
14592     * @param titleHeight
14593     */
14594
14595  }, {
14596    key: "setProperties",
14597    value: function setProperties(titleHeight) {
14598      this.teaser.style.setProperty('--title-height', titleHeight + "px");
14599    }
14600  }, {
14601    key: "eventHandler",
14602    value: function eventHandler() {
14603      window.addEventListener('resize', this.setProperties(this.titleHeight));
14604    }
14605  }]);
14606
14607  return TileTeaser;
14608}();
14609
14610$.when($.ready).then(function () {
14611  var tileTeasers = document.querySelectorAll('.tileTeaser');
14612  var teaser;
14613  tileTeasers.forEach(function (t) {
14614    teaser = new TileTeaser(t);
14615  });
14616});
14617
14618/***/ }),
14619
14620/***/ 7729:
14621/***/ (function(module, exports, __webpack_require__) {
14622
14623var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! Magnific Popup - v1.1.0 - 2016-02-20
14624* http://dimsemenov.com/plugins/magnific-popup/
14625* Copyright (c) 2016 Dmitry Semenov; */
14626;(function (factory) { 
14627if (true) { 
14628 // AMD. Register as an anonymous module. 
14629 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3336)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
14630		__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
14631		(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
vendor: 42,744 bytes, lines 14632-16521
14632		__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 
14633 } else {} 
14634 }(function($) { 
14635
14636/*>>core*/
14637/**
14638 * 
14639 * Magnific Popup Core JS file
14640 * 
14641 */
14642
14643
14644/**
14645 * Private static constants
14646 */
14647var CLOSE_EVENT = 'Close',
14648	BEFORE_CLOSE_EVENT = 'BeforeClose',
14649	AFTER_CLOSE_EVENT = 'AfterClose',
14650	BEFORE_APPEND_EVENT = 'BeforeAppend',
14651	MARKUP_PARSE_EVENT = 'MarkupParse',
14652	OPEN_EVENT = 'Open',
14653	CHANGE_EVENT = 'Change',
14654	NS = 'mfp',
14655	EVENT_NS = '.' + NS,
14656	READY_CLASS = 'mfp-ready',
14657	REMOVING_CLASS = 'mfp-removing',
14658	PREVENT_CLOSE_CLASS = 'mfp-prevent-close';
14659
14660
14661/**
14662 * Private vars 
14663 */
14664/*jshint -W079 */
14665var mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this'
14666	MagnificPopup = function(){},
14667	_isJQ = !!(window.jQuery),
14668	_prevStatus,
14669	_window = $(window),
14670	_document,
14671	_prevContentType,
14672	_wrapClasses,
14673	_currPopupType;
14674
14675
14676/**
14677 * Private functions
14678 */
14679var _mfpOn = function(name, f) {
14680		mfp.ev.on(NS + name + EVENT_NS, f);
14681	},
14682	_getEl = function(className, appendTo, html, raw) {
14683		var el = document.createElement('div');
14684		el.className = 'mfp-'+className;
14685		if(html) {
14686			el.innerHTML = html;
14687		}
14688		if(!raw) {
14689			el = $(el);
14690			if(appendTo) {
14691				el.appendTo(appendTo);
14692			}
14693		} else if(appendTo) {
14694			appendTo.appendChild(el);
14695		}
14696		return el;
14697	},
14698	_mfpTrigger = function(e, data) {
14699		mfp.ev.triggerHandler(NS + e, data);
14700
14701		if(mfp.st.callbacks) {
14702			// converts "mfpEventName" to "eventName" callback and triggers it if it's present
14703			e = e.charAt(0).toLowerCase() + e.slice(1);
14704			if(mfp.st.callbacks[e]) {
14705				mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]);
14706			}
14707		}
14708	},
14709	_getCloseBtn = function(type) {
14710		if(type !== _currPopupType || !mfp.currTemplate.closeBtn) {
14711			mfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) );
14712			_currPopupType = type;
14713		}
14714		return mfp.currTemplate.closeBtn;
14715	},
14716	// Initialize Magnific Popup only when called at least once
14717	_checkInstance = function() {
14718		if(!$.magnificPopup.instance) {
14719			/*jshint -W020 */
14720			mfp = new MagnificPopup();
14721			mfp.init();
14722			$.magnificPopup.instance = mfp;
14723		}
14724	},
14725	// CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr
14726	supportsTransitions = function() {
14727		var s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist
14728			v = ['ms','O','Moz','Webkit']; // 'v' for vendor
14729
14730		if( s['transition'] !== undefined ) {
14731			return true; 
14732		}
14733			
14734		while( v.length ) {
14735			if( v.pop() + 'Transition' in s ) {
14736				return true;
14737			}
14738		}
14739				
14740		return false;
14741	};
14742
14743
14744
14745/**
14746 * Public functions
14747 */
14748MagnificPopup.prototype = {
14749
14750	constructor: MagnificPopup,
14751
14752	/**
14753	 * Initializes Magnific Popup plugin. 
14754	 * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed
14755	 */
14756	init: function() {
14757		var appVersion = navigator.appVersion;
14758		mfp.isLowIE = mfp.isIE8 = document.all && !document.addEventListener;
14759		mfp.isAndroid = (/android/gi).test(appVersion);
14760		mfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion);
14761		mfp.supportsTransition = supportsTransitions();
14762
14763		// We disable fixed positioned lightbox on devices that don't handle it nicely.
14764		// If you know a better way of detecting this - let me know.
14765		mfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) );
14766		_document = $(document);
14767
14768		mfp.popupsCache = {};
14769	},
14770
14771	/**
14772	 * Opens popup
14773	 * @param  data [description]
14774	 */
14775	open: function(data) {
14776
14777		var i;
14778
14779		if(data.isObj === false) { 
14780			// convert jQuery collection to array to avoid conflicts later
14781			mfp.items = data.items.toArray();
14782
14783			mfp.index = 0;
14784			var items = data.items,
14785				item;
14786			for(i = 0; i < items.length; i++) {
14787				item = items[i];
14788				if(item.parsed) {
14789					item = item.el[0];
14790				}
14791				if(item === data.el[0]) {
14792					mfp.index = i;
14793					break;
14794				}
14795			}
14796		} else {
14797			mfp.items = $.isArray(data.items) ? data.items : [data.items];
14798			mfp.index = data.index || 0;
14799		}
14800
14801		// if popup is already opened - we just update the content
14802		if(mfp.isOpen) {
14803			mfp.updateItemHTML();
14804			return;
14805		}
14806		
14807		mfp.types = []; 
14808		_wrapClasses = '';
14809		if(data.mainEl && data.mainEl.length) {
14810			mfp.ev = data.mainEl.eq(0);
14811		} else {
14812			mfp.ev = _document;
14813		}
14814
14815		if(data.key) {
14816			if(!mfp.popupsCache[data.key]) {
14817				mfp.popupsCache[data.key] = {};
14818			}
14819			mfp.currTemplate = mfp.popupsCache[data.key];
14820		} else {
14821			mfp.currTemplate = {};
14822		}
14823
14824
14825
14826		mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data ); 
14827		mfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos;
14828
14829		if(mfp.st.modal) {
14830			mfp.st.closeOnContentClick = false;
14831			mfp.st.closeOnBgClick = false;
14832			mfp.st.showCloseBtn = false;
14833			mfp.st.enableEscapeKey = false;
14834		}
14835		
14836
14837		// Building markup
14838		// main containers are created only once
14839		if(!mfp.bgOverlay) {
14840
14841			// Dark overlay
14842			mfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() {
14843				mfp.close();
14844			});
14845
14846			mfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) {
14847				if(mfp._checkIfClose(e.target)) {
14848					mfp.close();
14849				}
14850			});
14851
14852			mfp.container = _getEl('container', mfp.wrap);
14853		}
14854
14855		mfp.contentContainer = _getEl('content');
14856		if(mfp.st.preloader) {
14857			mfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading);
14858		}
14859
14860
14861		// Initializing modules
14862		var modules = $.magnificPopup.modules;
14863		for(i = 0; i < modules.length; i++) {
14864			var n = modules[i];
14865			n = n.charAt(0).toUpperCase() + n.slice(1);
14866			mfp['init'+n].call(mfp);
14867		}
14868		_mfpTrigger('BeforeOpen');
14869
14870
14871		if(mfp.st.showCloseBtn) {
14872			// Close button
14873			if(!mfp.st.closeBtnInside) {
14874				mfp.wrap.append( _getCloseBtn() );
14875			} else {
14876				_mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) {
14877					values.close_replaceWith = _getCloseBtn(item.type);
14878				});
14879				_wrapClasses += ' mfp-close-btn-in';
14880			}
14881		}
14882
14883		if(mfp.st.alignTop) {
14884			_wrapClasses += ' mfp-align-top';
14885		}
14886
14887	
14888
14889		if(mfp.fixedContentPos) {
14890			mfp.wrap.css({
14891				overflow: mfp.st.overflowY,
14892				overflowX: 'hidden',
14893				overflowY: mfp.st.overflowY
14894			});
14895		} else {
14896			mfp.wrap.css({ 
14897				top: _window.scrollTop(),
14898				position: 'absolute'
14899			});
14900		}
14901		if( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) {
14902			mfp.bgOverlay.css({
14903				height: _document.height(),
14904				position: 'absolute'
14905			});
14906		}
14907
14908		
14909
14910		if(mfp.st.enableEscapeKey) {
14911			// Close on ESC key
14912			_document.on('keyup' + EVENT_NS, function(e) {
14913				if(e.keyCode === 27) {
14914					mfp.close();
14915				}
14916			});
14917		}
14918
14919		_window.on('resize' + EVENT_NS, function() {
14920			mfp.updateSize();
14921		});
14922
14923
14924		if(!mfp.st.closeOnContentClick) {
14925			_wrapClasses += ' mfp-auto-cursor';
14926		}
14927		
14928		if(_wrapClasses)
14929			mfp.wrap.addClass(_wrapClasses);
14930
14931
14932		// this triggers recalculation of layout, so we get it once to not to trigger twice
14933		var windowHeight = mfp.wH = _window.height();
14934
14935		
14936		var windowStyles = {};
14937
14938		if( mfp.fixedContentPos ) {
14939            if(mfp._hasScrollBar(windowHeight)){
14940                var s = mfp._getScrollbarSize();
14941                if(s) {
14942                    windowStyles.marginRight = s;
14943                }
14944            }
14945        }
14946
14947		if(mfp.fixedContentPos) {
14948			if(!mfp.isIE7) {
14949				windowStyles.overflow = 'hidden';
14950			} else {
14951				// ie7 double-scroll bug
14952				$('body, html').css('overflow', 'hidden');
14953			}
14954		}
14955
14956		
14957		
14958		var classesToadd = mfp.st.mainClass;
14959		if(mfp.isIE7) {
14960			classesToadd += ' mfp-ie7';
14961		}
14962		if(classesToadd) {
14963			mfp._addClassToMFP( classesToadd );
14964		}
14965
14966		// add content
14967		mfp.updateItemHTML();
14968
14969		_mfpTrigger('BuildControls');
14970
14971		// remove scrollbar, add margin e.t.c
14972		$('html').css(windowStyles);
14973		
14974		// add everything to DOM
14975		mfp.bgOverlay.add(mfp.wrap).prependTo( mfp.st.prependTo || $(document.body) );
14976
14977		// Save last focused element
14978		mfp._lastFocusedEl = document.activeElement;
14979		
14980		// Wait for next cycle to allow CSS transition
14981		setTimeout(function() {
14982			
14983			if(mfp.content) {
14984				mfp._addClassToMFP(READY_CLASS);
14985				mfp._setFocus();
14986			} else {
14987				// if content is not defined (not loaded e.t.c) we add class only for BG
14988				mfp.bgOverlay.addClass(READY_CLASS);
14989			}
14990			
14991			// Trap the focus in popup
14992			_document.on('focusin' + EVENT_NS, mfp._onFocusIn);
14993
14994		}, 16);
14995
14996		mfp.isOpen = true;
14997		mfp.updateSize(windowHeight);
14998		_mfpTrigger(OPEN_EVENT);
14999
15000		return data;
15001	},
15002
15003	/**
15004	 * Closes the popup
15005	 */
15006	close: function() {
15007		if(!mfp.isOpen) return;
15008		_mfpTrigger(BEFORE_CLOSE_EVENT);
15009
15010		mfp.isOpen = false;
15011		// for CSS3 animation
15012		if(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition )  {
15013			mfp._addClassToMFP(REMOVING_CLASS);
15014			setTimeout(function() {
15015				mfp._close();
15016			}, mfp.st.removalDelay);
15017		} else {
15018			mfp._close();
15019		}
15020	},
15021
15022	/**
15023	 * Helper for close() function
15024	 */
15025	_close: function() {
15026		_mfpTrigger(CLOSE_EVENT);
15027
15028		var classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' ';
15029
15030		mfp.bgOverlay.detach();
15031		mfp.wrap.detach();
15032		mfp.container.empty();
15033
15034		if(mfp.st.mainClass) {
15035			classesToRemove += mfp.st.mainClass + ' ';
15036		}
15037
15038		mfp._removeClassFromMFP(classesToRemove);
15039
15040		if(mfp.fixedContentPos) {
15041			var windowStyles = {marginRight: ''};
15042			if(mfp.isIE7) {
15043				$('body, html').css('overflow', '');
15044			} else {
15045				windowStyles.overflow = '';
15046			}
15047			$('html').css(windowStyles);
15048		}
15049		
15050		_document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS);
15051		mfp.ev.off(EVENT_NS);
15052
15053		// clean up DOM elements that aren't removed
15054		mfp.wrap.attr('class', 'mfp-wrap').removeAttr('style');
15055		mfp.bgOverlay.attr('class', 'mfp-bg');
15056		mfp.container.attr('class', 'mfp-container');
15057
15058		// remove close button from target element
15059		if(mfp.st.showCloseBtn &&
15060		(!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) {
15061			if(mfp.currTemplate.closeBtn)
15062				mfp.currTemplate.closeBtn.detach();
15063		}
15064
15065
15066		if(mfp.st.autoFocusLast && mfp._lastFocusedEl) {
15067			$(mfp._lastFocusedEl).focus(); // put tab focus back
15068		}
15069		mfp.currItem = null;	
15070		mfp.content = null;
15071		mfp.currTemplate = null;
15072		mfp.prevHeight = 0;
15073
15074		_mfpTrigger(AFTER_CLOSE_EVENT);
15075	},
15076	
15077	updateSize: function(winHeight) {
15078
15079		if(mfp.isIOS) {
15080			// fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2
15081			var zoomLevel = document.documentElement.clientWidth / window.innerWidth;
15082			var height = window.innerHeight * zoomLevel;
15083			mfp.wrap.css('height', height);
15084			mfp.wH = height;
15085		} else {
15086			mfp.wH = winHeight || _window.height();
15087		}
15088		// Fixes #84: popup incorrectly positioned with position:relative on body
15089		if(!mfp.fixedContentPos) {
15090			mfp.wrap.css('height', mfp.wH);
15091		}
15092
15093		_mfpTrigger('Resize');
15094
15095	},
15096
15097	/**
15098	 * Set content of popup based on current index
15099	 */
15100	updateItemHTML: function() {
15101		var item = mfp.items[mfp.index];
15102
15103		// Detach and perform modifications
15104		mfp.contentContainer.detach();
15105
15106		if(mfp.content)
15107			mfp.content.detach();
15108
15109		if(!item.parsed) {
15110			item = mfp.parseEl( mfp.index );
15111		}
15112
15113		var type = item.type;
15114
15115		_mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]);
15116		// BeforeChange event works like so:
15117		// _mfpOn('BeforeChange', function(e, prevType, newType) { });
15118
15119		mfp.currItem = item;
15120
15121		if(!mfp.currTemplate[type]) {
15122			var markup = mfp.st[type] ? mfp.st[type].markup : false;
15123
15124			// allows to modify markup
15125			_mfpTrigger('FirstMarkupParse', markup);
15126
15127			if(markup) {
15128				mfp.currTemplate[type] = $(markup);
15129			} else {
15130				// if there is no markup found we just define that template is parsed
15131				mfp.currTemplate[type] = true;
15132			}
15133		}
15134
15135		if(_prevContentType && _prevContentType !== item.type) {
15136			mfp.container.removeClass('mfp-'+_prevContentType+'-holder');
15137		}
15138
15139		var newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]);
15140		mfp.appendContent(newContent, type);
15141
15142		item.preloaded = true;
15143
15144		_mfpTrigger(CHANGE_EVENT, item);
15145		_prevContentType = item.type;
15146
15147		// Append container back after its content changed
15148		mfp.container.prepend(mfp.contentContainer);
15149
15150		_mfpTrigger('AfterChange');
15151	},
15152
15153
15154	/**
15155	 * Set HTML content of popup
15156	 */
15157	appendContent: function(newContent, type) {
15158		mfp.content = newContent;
15159
15160		if(newContent) {
15161			if(mfp.st.showCloseBtn && mfp.st.closeBtnInside &&
15162				mfp.currTemplate[type] === true) {
15163				// if there is no markup, we just append close button element inside
15164				if(!mfp.content.find('.mfp-close').length) {
15165					mfp.content.append(_getCloseBtn());
15166				}
15167			} else {
15168				mfp.content = newContent;
15169			}
15170		} else {
15171			mfp.content = '';
15172		}
15173
15174		_mfpTrigger(BEFORE_APPEND_EVENT);
15175		mfp.container.addClass('mfp-'+type+'-holder');
15176
15177		mfp.contentContainer.append(mfp.content);
15178	},
15179
15180
15181	/**
15182	 * Creates Magnific Popup data object based on given data
15183	 * @param  {int} index Index of item to parse
15184	 */
15185	parseEl: function(index) {
15186		var item = mfp.items[index],
15187			type;
15188
15189		if(item.tagName) {
15190			item = { el: $(item) };
15191		} else {
15192			type = item.type;
15193			item = { data: item, src: item.src };
15194		}
15195
15196		if(item.el) {
15197			var types = mfp.types;
15198
15199			// check for 'mfp-TYPE' class
15200			for(var i = 0; i < types.length; i++) {
15201				if( item.el.hasClass('mfp-'+types[i]) ) {
15202					type = types[i];
15203					break;
15204				}
15205			}
15206
15207			item.src = item.el.attr('data-mfp-src');
15208			if(!item.src) {
15209				item.src = item.el.attr('href');
15210			}
15211		}
15212
15213		item.type = type || mfp.st.type || 'inline';
15214		item.index = index;
15215		item.parsed = true;
15216		mfp.items[index] = item;
15217		_mfpTrigger('ElementParse', item);
15218
15219		return mfp.items[index];
15220	},
15221
15222
15223	/**
15224	 * Initializes single popup or a group of popups
15225	 */
15226	addGroup: function(el, options) {
15227		var eHandler = function(e) {
15228			e.mfpEl = this;
15229			mfp._openClick(e, el, options);
15230		};
15231
15232		if(!options) {
15233			options = {};
15234		}
15235
15236		var eName = 'click.magnificPopup';
15237		options.mainEl = el;
15238
15239		if(options.items) {
15240			options.isObj = true;
15241			el.off(eName).on(eName, eHandler);
15242		} else {
15243			options.isObj = false;
15244			if(options.delegate) {
15245				el.off(eName).on(eName, options.delegate , eHandler);
15246			} else {
15247				options.items = el;
15248				el.off(eName).on(eName, eHandler);
15249			}
15250		}
15251	},
15252	_openClick: function(e, el, options) {
15253		var midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick;
15254
15255
15256		if(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey ) ) {
15257			return;
15258		}
15259
15260		var disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn;
15261
15262		if(disableOn) {
15263			if($.isFunction(disableOn)) {
15264				if( !disableOn.call(mfp) ) {
15265					return true;
15266				}
15267			} else { // else it's number
15268				if( _window.width() < disableOn ) {
15269					return true;
15270				}
15271			}
15272		}
15273
15274		if(e.type) {
15275			e.preventDefault();
15276
15277			// This will prevent popup from closing if element is inside and popup is already opened
15278			if(mfp.isOpen) {
15279				e.stopPropagation();
15280			}
15281		}
15282
15283		options.el = $(e.mfpEl);
15284		if(options.delegate) {
15285			options.items = el.find(options.delegate);
15286		}
15287		mfp.open(options);
15288	},
15289
15290
15291	/**
15292	 * Updates text on preloader
15293	 */
15294	updateStatus: function(status, text) {
15295
15296		if(mfp.preloader) {
15297			if(_prevStatus !== status) {
15298				mfp.container.removeClass('mfp-s-'+_prevStatus);
15299			}
15300
15301			if(!text && status === 'loading') {
15302				text = mfp.st.tLoading;
15303			}
15304
15305			var data = {
15306				status: status,
15307				text: text
15308			};
15309			// allows to modify status
15310			_mfpTrigger('UpdateStatus', data);
15311
15312			status = data.status;
15313			text = data.text;
15314
15315			mfp.preloader.html(text);
15316
15317			mfp.preloader.find('a').on('click', function(e) {
15318				e.stopImmediatePropagation();
15319			});
15320
15321			mfp.container.addClass('mfp-s-'+status);
15322			_prevStatus = status;
15323		}
15324	},
15325
15326
15327	/*
15328		"Private" helpers that aren't private at all
15329	 */
15330	// Check to close popup or not
15331	// "target" is an element that was clicked
15332	_checkIfClose: function(target) {
15333
15334		if($(target).hasClass(PREVENT_CLOSE_CLASS)) {
15335			return;
15336		}
15337
15338		var closeOnContent = mfp.st.closeOnContentClick;
15339		var closeOnBg = mfp.st.closeOnBgClick;
15340
15341		if(closeOnContent && closeOnBg) {
15342			return true;
15343		} else {
15344
15345			// We close the popup if click is on close button or on preloader. Or if there is no content.
15346			if(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) {
15347				return true;
15348			}
15349
15350			// if click is outside the content
15351			if(  (target !== mfp.content[0] && !$.contains(mfp.content[0], target))  ) {
15352				if(closeOnBg) {
15353					// last check, if the clicked element is in DOM, (in case it's removed onclick)
15354					if( $.contains(document, target) ) {
15355						return true;
15356					}
15357				}
15358			} else if(closeOnContent) {
15359				return true;
15360			}
15361
15362		}
15363		return false;
15364	},
15365	_addClassToMFP: function(cName) {
15366		mfp.bgOverlay.addClass(cName);
15367		mfp.wrap.addClass(cName);
15368	},
15369	_removeClassFromMFP: function(cName) {
15370		this.bgOverlay.removeClass(cName);
15371		mfp.wrap.removeClass(cName);
15372	},
15373	_hasScrollBar: function(winHeight) {
15374		return (  (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) );
15375	},
15376	_setFocus: function() {
15377		(mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus();
15378	},
15379	_onFocusIn: function(e) {
15380		if( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) {
15381			mfp._setFocus();
15382			return false;
15383		}
15384	},
15385	_parseMarkup: function(template, values, item) {
15386		var arr;
15387		if(item.data) {
15388			values = $.extend(item.data, values);
15389		}
15390		_mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] );
15391
15392		$.each(values, function(key, value) {
15393			if(value === undefined || value === false) {
15394				return true;
15395			}
15396			arr = key.split('_');
15397			if(arr.length > 1) {
15398				var el = template.find(EVENT_NS + '-'+arr[0]);
15399
15400				if(el.length > 0) {
15401					var attr = arr[1];
15402					if(attr === 'replaceWith') {
15403						if(el[0] !== value[0]) {
15404							el.replaceWith(value);
15405						}
15406					} else if(attr === 'img') {
15407						if(el.is('img')) {
15408							el.attr('src', value);
15409						} else {
15410							el.replaceWith( $('<img>').attr('src', value).attr('class', el.attr('class')) );
15411						}
15412					} else {
15413						el.attr(arr[1], value);
15414					}
15415				}
15416
15417			} else {
15418				template.find(EVENT_NS + '-'+key).html(value);
15419			}
15420		});
15421	},
15422
15423	_getScrollbarSize: function() {
15424		// thx David
15425		if(mfp.scrollbarSize === undefined) {
15426			var scrollDiv = document.createElement("div");
15427			scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';
15428			document.body.appendChild(scrollDiv);
15429			mfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;
15430			document.body.removeChild(scrollDiv);
15431		}
15432		return mfp.scrollbarSize;
15433	}
15434
15435}; /* MagnificPopup core prototype end */
15436
15437
15438
15439
15440/**
15441 * Public static functions
15442 */
15443$.magnificPopup = {
15444	instance: null,
15445	proto: MagnificPopup.prototype,
15446	modules: [],
15447
15448	open: function(options, index) {
15449		_checkInstance();
15450
15451		if(!options) {
15452			options = {};
15453		} else {
15454			options = $.extend(true, {}, options);
15455		}
15456
15457		options.isObj = true;
15458		options.index = index || 0;
15459		return this.instance.open(options);
15460	},
15461
15462	close: function() {
15463		return $.magnificPopup.instance && $.magnificPopup.instance.close();
15464	},
15465
15466	registerModule: function(name, module) {
15467		if(module.options) {
15468			$.magnificPopup.defaults[name] = module.options;
15469		}
15470		$.extend(this.proto, module.proto);
15471		this.modules.push(name);
15472	},
15473
15474	defaults: {
15475
15476		// Info about options is in docs:
15477		// http://dimsemenov.com/plugins/magnific-popup/documentation.html#options
15478
15479		disableOn: 0,
15480
15481		key: null,
15482
15483		midClick: false,
15484
15485		mainClass: '',
15486
15487		preloader: true,
15488
15489		focus: '', // CSS selector of input to focus after popup is opened
15490
15491		closeOnContentClick: false,
15492
15493		closeOnBgClick: true,
15494
15495		closeBtnInside: true,
15496
15497		showCloseBtn: true,
15498
15499		enableEscapeKey: true,
15500
15501		modal: false,
15502
15503		alignTop: false,
15504
15505		removalDelay: 0,
15506
15507		prependTo: null,
15508
15509		fixedContentPos: 'auto',
15510
15511		fixedBgPos: 'auto',
15512
15513		overflowY: 'auto',
15514
15515		closeMarkup: '<button title="%title%" type="button" class="mfp-close">&#215;</button>',
15516
15517		tClose: 'Close (Esc)',
15518
15519		tLoading: 'Loading...',
15520
15521		autoFocusLast: true
15522
15523	}
15524};
15525
15526
15527
15528$.fn.magnificPopup = function(options) {
15529	_checkInstance();
15530
15531	var jqEl = $(this);
15532
15533	// We call some API method of first param is a string
15534	if (typeof options === "string" ) {
15535
15536		if(options === 'open') {
15537			var items,
15538				itemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup,
15539				index = parseInt(arguments[1], 10) || 0;
15540
15541			if(itemOpts.items) {
15542				items = itemOpts.items[index];
15543			} else {
15544				items = jqEl;
15545				if(itemOpts.delegate) {
15546					items = items.find(itemOpts.delegate);
15547				}
15548				items = items.eq( index );
15549			}
15550			mfp._openClick({mfpEl:items}, jqEl, itemOpts);
15551		} else {
15552			if(mfp.isOpen)
15553				mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1));
15554		}
15555
15556	} else {
15557		// clone options obj
15558		options = $.extend(true, {}, options);
15559
15560		/*
15561		 * As Zepto doesn't support .data() method for objects
15562		 * and it works only in normal browsers
15563		 * we assign "options" object directly to the DOM element. FTW!
15564		 */
15565		if(_isJQ) {
15566			jqEl.data('magnificPopup', options);
15567		} else {
15568			jqEl[0].magnificPopup = options;
15569		}
15570
15571		mfp.addGroup(jqEl, options);
15572
15573	}
15574	return jqEl;
15575};
15576
15577/*>>core*/
15578
15579/*>>inline*/
15580
15581var INLINE_NS = 'inline',
15582	_hiddenClass,
15583	_inlinePlaceholder,
15584	_lastInlineElement,
15585	_putInlineElementsBack = function() {
15586		if(_lastInlineElement) {
15587			_inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach();
15588			_lastInlineElement = null;
15589		}
15590	};
15591
15592$.magnificPopup.registerModule(INLINE_NS, {
15593	options: {
15594		hiddenClass: 'hide', // will be appended with `mfp-` prefix
15595		markup: '',
15596		tNotFound: 'Content not found'
15597	},
15598	proto: {
15599
15600		initInline: function() {
15601			mfp.types.push(INLINE_NS);
15602
15603			_mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() {
15604				_putInlineElementsBack();
15605			});
15606		},
15607
15608		getInline: function(item, template) {
15609
15610			_putInlineElementsBack();
15611
15612			if(item.src) {
15613				var inlineSt = mfp.st.inline,
15614					el = $(item.src);
15615
15616				if(el.length) {
15617
15618					// If target element has parent - we replace it with placeholder and put it back after popup is closed
15619					var parent = el[0].parentNode;
15620					if(parent && parent.tagName) {
15621						if(!_inlinePlaceholder) {
15622							_hiddenClass = inlineSt.hiddenClass;
15623							_inlinePlaceholder = _getEl(_hiddenClass);
15624							_hiddenClass = 'mfp-'+_hiddenClass;
15625						}
15626						// replace target inline element with placeholder
15627						_lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass);
15628					}
15629
15630					mfp.updateStatus('ready');
15631				} else {
15632					mfp.updateStatus('error', inlineSt.tNotFound);
15633					el = $('<div>');
15634				}
15635
15636				item.inlineElement = el;
15637				return el;
15638			}
15639
15640			mfp.updateStatus('ready');
15641			mfp._parseMarkup(template, {}, item);
15642			return template;
15643		}
15644	}
15645});
15646
15647/*>>inline*/
15648
15649/*>>ajax*/
15650var AJAX_NS = 'ajax',
15651	_ajaxCur,
15652	_removeAjaxCursor = function() {
15653		if(_ajaxCur) {
15654			$(document.body).removeClass(_ajaxCur);
15655		}
15656	},
15657	_destroyAjaxRequest = function() {
15658		_removeAjaxCursor();
15659		if(mfp.req) {
15660			mfp.req.abort();
15661		}
15662	};
15663
15664$.magnificPopup.registerModule(AJAX_NS, {
15665
15666	options: {
15667		settings: null,
15668		cursor: 'mfp-ajax-cur',
15669		tError: '<a href="%url%">The content</a> could not be loaded.'
15670	},
15671
15672	proto: {
15673		initAjax: function() {
15674			mfp.types.push(AJAX_NS);
15675			_ajaxCur = mfp.st.ajax.cursor;
15676
15677			_mfpOn(CLOSE_EVENT+'.'+AJAX_NS, _destroyAjaxRequest);
15678			_mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest);
15679		},
15680		getAjax: function(item) {
15681
15682			if(_ajaxCur) {
15683				$(document.body).addClass(_ajaxCur);
15684			}
15685
15686			mfp.updateStatus('loading');
15687
15688			var opts = $.extend({
15689				url: item.src,
15690				success: function(data, textStatus, jqXHR) {
15691					var temp = {
15692						data:data,
15693						xhr:jqXHR
15694					};
15695
15696					_mfpTrigger('ParseAjax', temp);
15697
15698					mfp.appendContent( $(temp.data), AJAX_NS );
15699
15700					item.finished = true;
15701
15702					_removeAjaxCursor();
15703
15704					mfp._setFocus();
15705
15706					setTimeout(function() {
15707						mfp.wrap.addClass(READY_CLASS);
15708					}, 16);
15709
15710					mfp.updateStatus('ready');
15711
15712					_mfpTrigger('AjaxContentAdded');
15713				},
15714				error: function() {
15715					_removeAjaxCursor();
15716					item.finished = item.loadError = true;
15717					mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src));
15718				}
15719			}, mfp.st.ajax.settings);
15720
15721			mfp.req = $.ajax(opts);
15722
15723			return '';
15724		}
15725	}
15726});
15727
15728/*>>ajax*/
15729
15730/*>>image*/
15731var _imgInterval,
15732	_getTitle = function(item) {
15733		if(item.data && item.data.title !== undefined)
15734			return item.data.title;
15735
15736		var src = mfp.st.image.titleSrc;
15737
15738		if(src) {
15739			if($.isFunction(src)) {
15740				return src.call(mfp, item);
15741			} else if(item.el) {
15742				return item.el.attr(src) || '';
15743			}
15744		}
15745		return '';
15746	};
15747
15748$.magnificPopup.registerModule('image', {
15749
15750	options: {
15751		markup: '<div class="mfp-figure">'+
15752					'<div class="mfp-close"></div>'+
15753					'<figure>'+
15754						'<div class="mfp-img"></div>'+
15755						'<figcaption>'+
15756							'<div class="mfp-bottom-bar">'+
15757								'<div class="mfp-title"></div>'+
15758								'<div class="mfp-counter"></div>'+
15759							'</div>'+
15760						'</figcaption>'+
15761					'</figure>'+
15762				'</div>',
15763		cursor: 'mfp-zoom-out-cur',
15764		titleSrc: 'title',
15765		verticalFit: true,
15766		tError: '<a href="%url%">The image</a> could not be loaded.'
15767	},
15768
15769	proto: {
15770		initImage: function() {
15771			var imgSt = mfp.st.image,
15772				ns = '.image';
15773
15774			mfp.types.push('image');
15775
15776			_mfpOn(OPEN_EVENT+ns, function() {
15777				if(mfp.currItem.type === 'image' && imgSt.cursor) {
15778					$(document.body).addClass(imgSt.cursor);
15779				}
15780			});
15781
15782			_mfpOn(CLOSE_EVENT+ns, function() {
15783				if(imgSt.cursor) {
15784					$(document.body).removeClass(imgSt.cursor);
15785				}
15786				_window.off('resize' + EVENT_NS);
15787			});
15788
15789			_mfpOn('Resize'+ns, mfp.resizeImage);
15790			if(mfp.isLowIE) {
15791				_mfpOn('AfterChange', mfp.resizeImage);
15792			}
15793		},
15794		resizeImage: function() {
15795			var item = mfp.currItem;
15796			if(!item || !item.img) return;
15797
15798			if(mfp.st.image.verticalFit) {
15799				var decr = 0;
15800				// fix box-sizing in ie7/8
15801				if(mfp.isLowIE) {
15802					decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10);
15803				}
15804				item.img.css('max-height', mfp.wH-decr);
15805			}
15806		},
15807		_onImageHasSize: function(item) {
15808			if(item.img) {
15809
15810				item.hasSize = true;
15811
15812				if(_imgInterval) {
15813					clearInterval(_imgInterval);
15814				}
15815
15816				item.isCheckingImgSize = false;
15817
15818				_mfpTrigger('ImageHasSize', item);
15819
15820				if(item.imgHidden) {
15821					if(mfp.content)
15822						mfp.content.removeClass('mfp-loading');
15823
15824					item.imgHidden = false;
15825				}
15826
15827			}
15828		},
15829
15830		/**
15831		 * Function that loops until the image has size to display elements that rely on it asap
15832		 */
15833		findImageSize: function(item) {
15834
15835			var counter = 0,
15836				img = item.img[0],
15837				mfpSetInterval = function(delay) {
15838
15839					if(_imgInterval) {
15840						clearInterval(_imgInterval);
15841					}
15842					// decelerating interval that checks for size of an image
15843					_imgInterval = setInterval(function() {
15844						if(img.naturalWidth > 0) {
15845							mfp._onImageHasSize(item);
15846							return;
15847						}
15848
15849						if(counter > 200) {
15850							clearInterval(_imgInterval);
15851						}
15852
15853						counter++;
15854						if(counter === 3) {
15855							mfpSetInterval(10);
15856						} else if(counter === 40) {
15857							mfpSetInterval(50);
15858						} else if(counter === 100) {
15859							mfpSetInterval(500);
15860						}
15861					}, delay);
15862				};
15863
15864			mfpSetInterval(1);
15865		},
15866
15867		getImage: function(item, template) {
15868
15869			var guard = 0,
15870
15871				// image load complete handler
15872				onLoadComplete = function() {
15873					if(item) {
15874						if (item.img[0].complete) {
15875							item.img.off('.mfploader');
15876
15877							if(item === mfp.currItem){
15878								mfp._onImageHasSize(item);
15879
15880								mfp.updateStatus('ready');
15881							}
15882
15883							item.hasSize = true;
15884							item.loaded = true;
15885
15886							_mfpTrigger('ImageLoadComplete');
15887
15888						}
15889						else {
15890							// if image complete check fails 200 times (20 sec), we assume that there was an error.
15891							guard++;
15892							if(guard < 200) {
15893								setTimeout(onLoadComplete,100);
15894							} else {
15895								onLoadError();
15896							}
15897						}
15898					}
15899				},
15900
15901				// image error handler
15902				onLoadError = function() {
15903					if(item) {
15904						item.img.off('.mfploader');
15905						if(item === mfp.currItem){
15906							mfp._onImageHasSize(item);
15907							mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );
15908						}
15909
15910						item.hasSize = true;
15911						item.loaded = true;
15912						item.loadError = true;
15913					}
15914				},
15915				imgSt = mfp.st.image;
15916
15917
15918			var el = template.find('.mfp-img');
15919			if(el.length) {
15920				var img = document.createElement('img');
15921				img.className = 'mfp-img';
15922				if(item.el && item.el.find('img').length) {
15923					img.alt = item.el.find('img').attr('alt');
15924				}
15925				item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError);
15926				img.src = item.src;
15927
15928				// without clone() "error" event is not firing when IMG is replaced by new IMG
15929				// TODO: find a way to avoid such cloning
15930				if(el.is('img')) {
15931					item.img = item.img.clone();
15932				}
15933
15934				img = item.img[0];
15935				if(img.naturalWidth > 0) {
15936					item.hasSize = true;
15937				} else if(!img.width) {
15938					item.hasSize = false;
15939				}
15940			}
15941
15942			mfp._parseMarkup(template, {
15943				title: _getTitle(item),
15944				img_replaceWith: item.img
15945			}, item);
15946
15947			mfp.resizeImage();
15948
15949			if(item.hasSize) {
15950				if(_imgInterval) clearInterval(_imgInterval);
15951
15952				if(item.loadError) {
15953					template.addClass('mfp-loading');
15954					mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );
15955				} else {
15956					template.removeClass('mfp-loading');
15957					mfp.updateStatus('ready');
15958				}
15959				return template;
15960			}
15961
15962			mfp.updateStatus('loading');
15963			item.loading = true;
15964
15965			if(!item.hasSize) {
15966				item.imgHidden = true;
15967				template.addClass('mfp-loading');
15968				mfp.findImageSize(item);
15969			}
15970
15971			return template;
15972		}
15973	}
15974});
15975
15976/*>>image*/
15977
15978/*>>zoom*/
15979var hasMozTransform,
15980	getHasMozTransform = function() {
15981		if(hasMozTransform === undefined) {
15982			hasMozTransform = document.createElement('p').style.MozTransform !== undefined;
15983		}
15984		return hasMozTransform;
15985	};
15986
15987$.magnificPopup.registerModule('zoom', {
15988
15989	options: {
15990		enabled: false,
15991		easing: 'ease-in-out',
15992		duration: 300,
15993		opener: function(element) {
15994			return element.is('img') ? element : element.find('img');
15995		}
15996	},
15997
15998	proto: {
15999
16000		initZoom: function() {
16001			var zoomSt = mfp.st.zoom,
16002				ns = '.zoom',
16003				image;
16004
16005			if(!zoomSt.enabled || !mfp.supportsTransition) {
16006				return;
16007			}
16008
16009			var duration = zoomSt.duration,
16010				getElToAnimate = function(image) {
16011					var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'),
16012						transition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing,
16013						cssObj = {
16014							position: 'fixed',
16015							zIndex: 9999,
16016							left: 0,
16017							top: 0,
16018							'-webkit-backface-visibility': 'hidden'
16019						},
16020						t = 'transition';
16021
16022					cssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition;
16023
16024					newImg.css(cssObj);
16025					return newImg;
16026				},
16027				showMainContent = function() {
16028					mfp.content.css('visibility', 'visible');
16029				},
16030				openTimeout,
16031				animatedImg;
16032
16033			_mfpOn('BuildControls'+ns, function() {
16034				if(mfp._allowZoom()) {
16035
16036					clearTimeout(openTimeout);
16037					mfp.content.css('visibility', 'hidden');
16038
16039					// Basically, all code below does is clones existing image, puts in on top of the current one and animated it
16040
16041					image = mfp._getItemToZoom();
16042
16043					if(!image) {
16044						showMainContent();
16045						return;
16046					}
16047
16048					animatedImg = getElToAnimate(image);
16049
16050					animatedImg.css( mfp._getOffset() );
16051
16052					mfp.wrap.append(animatedImg);
16053
16054					openTimeout = setTimeout(function() {
16055						animatedImg.css( mfp._getOffset( true ) );
16056						openTimeout = setTimeout(function() {
16057
16058							showMainContent();
16059
16060							setTimeout(function() {
16061								animatedImg.remove();
16062								image = animatedImg = null;
16063								_mfpTrigger('ZoomAnimationEnded');
16064							}, 16); // avoid blink when switching images
16065
16066						}, duration); // this timeout equals animation duration
16067
16068					}, 16); // by adding this timeout we avoid short glitch at the beginning of animation
16069
16070
16071					// Lots of timeouts...
16072				}
16073			});
16074			_mfpOn(BEFORE_CLOSE_EVENT+ns, function() {
16075				if(mfp._allowZoom()) {
16076
16077					clearTimeout(openTimeout);
16078
16079					mfp.st.removalDelay = duration;
16080
16081					if(!image) {
16082						image = mfp._getItemToZoom();
16083						if(!image) {
16084							return;
16085						}
16086						animatedImg = getElToAnimate(image);
16087					}
16088
16089					animatedImg.css( mfp._getOffset(true) );
16090					mfp.wrap.append(animatedImg);
16091					mfp.content.css('visibility', 'hidden');
16092
16093					setTimeout(function() {
16094						animatedImg.css( mfp._getOffset() );
16095					}, 16);
16096				}
16097
16098			});
16099
16100			_mfpOn(CLOSE_EVENT+ns, function() {
16101				if(mfp._allowZoom()) {
16102					showMainContent();
16103					if(animatedImg) {
16104						animatedImg.remove();
16105					}
16106					image = null;
16107				}
16108			});
16109		},
16110
16111		_allowZoom: function() {
16112			return mfp.currItem.type === 'image';
16113		},
16114
16115		_getItemToZoom: function() {
16116			if(mfp.currItem.hasSize) {
16117				return mfp.currItem.img;
16118			} else {
16119				return false;
16120			}
16121		},
16122
16123		// Get element postion relative to viewport
16124		_getOffset: function(isLarge) {
16125			var el;
16126			if(isLarge) {
16127				el = mfp.currItem.img;
16128			} else {
16129				el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);
16130			}
16131
16132			var offset = el.offset();
16133			var paddingTop = parseInt(el.css('padding-top'),10);
16134			var paddingBottom = parseInt(el.css('padding-bottom'),10);
16135			offset.top -= ( $(window).scrollTop() - paddingTop );
16136
16137
16138			/*
16139
16140			Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa.
16141
16142			 */
16143			var obj = {
16144				width: el.width(),
16145				// fix Zepto height+padding issue
16146				height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop
16147			};
16148
16149			// I hate to do this, but there is no another option
16150			if( getHasMozTransform() ) {
16151				obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)';
16152			} else {
16153				obj.left = offset.left;
16154				obj.top = offset.top;
16155			}
16156			return obj;
16157		}
16158
16159	}
16160});
16161
16162
16163
16164/*>>zoom*/
16165
16166/*>>iframe*/
16167
16168var IFRAME_NS = 'iframe',
16169	_emptyPage = '//about:blank',
16170
16171	_fixIframeBugs = function(isShowing) {
16172		if(mfp.currTemplate[IFRAME_NS]) {
16173			var el = mfp.currTemplate[IFRAME_NS].find('iframe');
16174			if(el.length) {
16175				// reset src after the popup is closed to avoid "video keeps playing after popup is closed" bug
16176				if(!isShowing) {
16177					el[0].src = _emptyPage;
16178				}
16179
16180				// IE8 black screen bug fix
16181				if(mfp.isIE8) {
16182					el.css('display', isShowing ? 'block' : 'none');
16183				}
16184			}
16185		}
16186	};
16187
16188$.magnificPopup.registerModule(IFRAME_NS, {
16189
16190	options: {
16191		markup: '<div class="mfp-iframe-scaler">'+
16192					'<div class="mfp-close"></div>'+
16193					'<iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe>'+
16194				'</div>',
16195
16196		srcAction: 'iframe_src',
16197
16198		// we don't care and support only one default type of URL by default
16199		patterns: {
16200			youtube: {
16201				index: 'youtube.com',
16202				id: 'v=',
16203				src: '//www.youtube.com/embed/%id%?autoplay=1'
16204			},
16205			vimeo: {
16206				index: 'vimeo.com/',
16207				id: '/',
16208				src: '//player.vimeo.com/video/%id%?autoplay=1'
16209			},
16210			gmaps: {
16211				index: '//maps.google.',
16212				src: '%id%&output=embed'
16213			}
16214		}
16215	},
16216
16217	proto: {
16218		initIframe: function() {
16219			mfp.types.push(IFRAME_NS);
16220
16221			_mfpOn('BeforeChange', function(e, prevType, newType) {
16222				if(prevType !== newType) {
16223					if(prevType === IFRAME_NS) {
16224						_fixIframeBugs(); // iframe if removed
16225					} else if(newType === IFRAME_NS) {
16226						_fixIframeBugs(true); // iframe is showing
16227					}
16228				}// else {
16229					// iframe source is switched, don't do anything
16230				//}
16231			});
16232
16233			_mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() {
16234				_fixIframeBugs();
16235			});
16236		},
16237
16238		getIframe: function(item, template) {
16239			var embedSrc = item.src;
16240			var iframeSt = mfp.st.iframe;
16241
16242			$.each(iframeSt.patterns, function() {
16243				if(embedSrc.indexOf( this.index ) > -1) {
16244					if(this.id) {
16245						if(typeof this.id === 'string') {
16246							embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length);
16247						} else {
16248							embedSrc = this.id.call( this, embedSrc );
16249						}
16250					}
16251					embedSrc = this.src.replace('%id%', embedSrc );
16252					return false; // break;
16253				}
16254			});
16255
16256			var dataObj = {};
16257			if(iframeSt.srcAction) {
16258				dataObj[iframeSt.srcAction] = embedSrc;
16259			}
16260			mfp._parseMarkup(template, dataObj, item);
16261
16262			mfp.updateStatus('ready');
16263
16264			return template;
16265		}
16266	}
16267});
16268
16269
16270
16271/*>>iframe*/
16272
16273/*>>gallery*/
16274/**
16275 * Get looped index depending on number of slides
16276 */
16277var _getLoopedId = function(index) {
16278		var numSlides = mfp.items.length;
16279		if(index > numSlides - 1) {
16280			return index - numSlides;
16281		} else  if(index < 0) {
16282			return numSlides + index;
16283		}
16284		return index;
16285	},
16286	_replaceCurrTotal = function(text, curr, total) {
16287		return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total);
16288	};
16289
16290$.magnificPopup.registerModule('gallery', {
16291
16292	options: {
16293		enabled: false,
16294		arrowMarkup: '<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',
16295		preload: [0,2],
16296		navigateByImgClick: true,
16297		arrows: true,
16298
16299		tPrev: 'Previous (Left arrow key)',
16300		tNext: 'Next (Right arrow key)',
16301		tCounter: '%curr% of %total%'
16302	},
16303
16304	proto: {
16305		initGallery: function() {
16306
16307			var gSt = mfp.st.gallery,
16308				ns = '.mfp-gallery';
16309
16310			mfp.direction = true; // true - next, false - prev
16311
16312			if(!gSt || !gSt.enabled ) return false;
16313
16314			_wrapClasses += ' mfp-gallery';
16315
16316			_mfpOn(OPEN_EVENT+ns, function() {
16317
16318				if(gSt.navigateByImgClick) {
16319					mfp.wrap.on('click'+ns, '.mfp-img', function() {
16320						if(mfp.items.length > 1) {
16321							mfp.next();
16322							return false;
16323						}
16324					});
16325				}
16326
16327				_document.on('keydown'+ns, function(e) {
16328					if (e.keyCode === 37) {
16329						mfp.prev();
16330					} else if (e.keyCode === 39) {
16331						mfp.next();
16332					}
16333				});
16334			});
16335
16336			_mfpOn('UpdateStatus'+ns, function(e, data) {
16337				if(data.text) {
16338					data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length);
16339				}
16340			});
16341
16342			_mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) {
16343				var l = mfp.items.length;
16344				values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : '';
16345			});
16346
16347			_mfpOn('BuildControls' + ns, function() {
16348				if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) {
16349					var markup = gSt.arrowMarkup,
16350						arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS),
16351						arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS);
16352
16353					arrowLeft.click(function() {
16354						mfp.prev();
16355					});
16356					arrowRight.click(function() {
16357						mfp.next();
16358					});
16359
16360					mfp.container.append(arrowLeft.add(arrowRight));
16361				}
16362			});
16363
16364			_mfpOn(CHANGE_EVENT+ns, function() {
16365				if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout);
16366
16367				mfp._preloadTimeout = setTimeout(function() {
16368					mfp.preloadNearbyImages();
16369					mfp._preloadTimeout = null;
16370				}, 16);
16371			});
16372
16373
16374			_mfpOn(CLOSE_EVENT+ns, function() {
16375				_document.off(ns);
16376				mfp.wrap.off('click'+ns);
16377				mfp.arrowRight = mfp.arrowLeft = null;
16378			});
16379
16380		},
16381		next: function() {
16382			mfp.direction = true;
16383			mfp.index = _getLoopedId(mfp.index + 1);
16384			mfp.updateItemHTML();
16385		},
16386		prev: function() {
16387			mfp.direction = false;
16388			mfp.index = _getLoopedId(mfp.index - 1);
16389			mfp.updateItemHTML();
16390		},
16391		goTo: function(newIndex) {
16392			mfp.direction = (newIndex >= mfp.index);
16393			mfp.index = newIndex;
16394			mfp.updateItemHTML();
16395		},
16396		preloadNearbyImages: function() {
16397			var p = mfp.st.gallery.preload,
16398				preloadBefore = Math.min(p[0], mfp.items.length),
16399				preloadAfter = Math.min(p[1], mfp.items.length),
16400				i;
16401
16402			for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) {
16403				mfp._preloadItem(mfp.index+i);
16404			}
16405			for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) {
16406				mfp._preloadItem(mfp.index-i);
16407			}
16408		},
16409		_preloadItem: function(index) {
16410			index = _getLoopedId(index);
16411
16412			if(mfp.items[index].preloaded) {
16413				return;
16414			}
16415
16416			var item = mfp.items[index];
16417			if(!item.parsed) {
16418				item = mfp.parseEl( index );
16419			}
16420
16421			_mfpTrigger('LazyLoad', item);
16422
16423			if(item.type === 'image') {
16424				item.img = $('<img class="mfp-img" />').on('load.mfploader', function() {
16425					item.hasSize = true;
16426				}).on('error.mfploader', function() {
16427					item.hasSize = true;
16428					item.loadError = true;
16429					_mfpTrigger('LazyLoadError', item);
16430				}).attr('src', item.src);
16431			}
16432
16433
16434			item.preloaded = true;
16435		}
16436	}
16437});
16438
16439/*>>gallery*/
16440
16441/*>>retina*/
16442
16443var RETINA_NS = 'retina';
16444
16445$.magnificPopup.registerModule(RETINA_NS, {
16446	options: {
16447		replaceSrc: function(item) {
16448			return item.src.replace(/\.\w+$/, function(m) { return '@2x' + m; });
16449		},
16450		ratio: 1 // Function or number.  Set to 1 to disable.
16451	},
16452	proto: {
16453		initRetina: function() {
16454			if(window.devicePixelRatio > 1) {
16455
16456				var st = mfp.st.retina,
16457					ratio = st.ratio;
16458
16459				ratio = !isNaN(ratio) ? ratio : ratio();
16460
16461				if(ratio > 1) {
16462					_mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) {
16463						item.img.css({
16464							'max-width': item.img[0].naturalWidth / ratio,
16465							'width': '100%'
16466						});
16467					});
16468					_mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) {
16469						item.src = st.replaceSrc(item, ratio);
16470					});
16471				}
16472			}
16473
16474		}
16475	}
16476});
16477
16478/*>>retina*/
16479 _checkInstance(); }));
16480
16481/***/ }),
16482
16483/***/ 3336:
16484/***/ (function(module) {
16485
16486"use strict";
16487module.exports = $;
16488
16489/***/ })
16490
16491/******/ 	});
16492/************************************************************************/
16493/******/ 	// The module cache
16494/******/ 	var __webpack_module_cache__ = {};
16495/******/ 	
16496/******/ 	// The require function
16497/******/ 	function __webpack_require__(moduleId) {
16498/******/ 		// Check if module is in cache
16499/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
16500/******/ 		if (cachedModule !== undefined) {
16501/******/ 			return cachedModule.exports;
16502/******/ 		}
16503/******/ 		// Create a new module (and put it into the cache)
16504/******/ 		var module = __webpack_module_cache__[moduleId] = {
16505/******/ 			// no module.id needed
16506/******/ 			// no module.loaded needed
16507/******/ 			exports: {}
16508/******/ 		};
16509/******/ 	
16510/******/ 		// Execute the module function
16511/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
16512/******/ 	
16513/******/ 		// Return the exports of the module
16514/******/ 		return module.exports;
16515/******/ 	}
16516/******/ 	
16517/************************************************************************/
16518/******/ 	/* webpack/runtime/compat get default export */
16519/******/ 	!function() {
16520/******/ 		// getDefaultExport function for compatibility with non-harmony modules
16521/******/ 		__webpack_require__.n = function(module) {
vendor: 4,112 bytes, lines 16522-16611
16522/******/ 			var getter = module && module.__esModule ?
16523/******/ 				function() { return module['default']; } :
16524/******/ 				function() { return module; };
16525/******/ 			__webpack_require__.d(getter, { a: getter });
16526/******/ 			return getter;
16527/******/ 		};
16528/******/ 	}();
16529/******/ 	
16530/******/ 	/* webpack/runtime/define property getters */
16531/******/ 	!function() {
16532/******/ 		// define getter functions for harmony exports
16533/******/ 		__webpack_require__.d = function(exports, definition) {
16534/******/ 			for(var key in definition) {
16535/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
16536/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
16537/******/ 				}
16538/******/ 			}
16539/******/ 		};
16540/******/ 	}();
16541/******/ 	
16542/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
16543/******/ 	!function() {
16544/******/ 		__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
16545/******/ 	}();
16546/******/ 	
16547/******/ 	/* webpack/runtime/make namespace object */
16548/******/ 	!function() {
16549/******/ 		// define __esModule on exports
16550/******/ 		__webpack_require__.r = function(exports) {
16551/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
16552/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
16553/******/ 			}
16554/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
16555/******/ 		};
16556/******/ 	}();
16557/******/ 	
16558/************************************************************************/
16559var __webpack_exports__ = {};
16560// This entry need to be wrapped in an IIFE because it need to be in strict mode.
16561!function() {
16562"use strict";
16563
16564// NAMESPACE OBJECT: ./node_modules/@popperjs/core/lib/index.js
16565var lib_namespaceObject = {};
16566__webpack_require__.r(lib_namespaceObject);
16567__webpack_require__.d(lib_namespaceObject, {
16568  "afterMain": function() { return afterMain; },
16569  "afterRead": function() { return afterRead; },
16570  "afterWrite": function() { return afterWrite; },
16571  "applyStyles": function() { return modifiers_applyStyles; },
16572  "arrow": function() { return modifiers_arrow; },
16573  "auto": function() { return auto; },
16574  "basePlacements": function() { return basePlacements; },
16575  "beforeMain": function() { return beforeMain; },
16576  "beforeRead": function() { return beforeRead; },
16577  "beforeWrite": function() { return beforeWrite; },
16578  "bottom": function() { return bottom; },
16579  "clippingParents": function() { return clippingParents; },
16580  "computeStyles": function() { return modifiers_computeStyles; },
16581  "createPopper": function() { return popper_createPopper; },
16582  "createPopperBase": function() { return createPopper; },
16583  "createPopperLite": function() { return popper_lite_createPopper; },
16584  "detectOverflow": function() { return detectOverflow; },
16585  "end": function() { return end; },
16586  "eventListeners": function() { return eventListeners; },
16587  "flip": function() { return modifiers_flip; },
16588  "hide": function() { return modifiers_hide; },
16589  "left": function() { return left; },
16590  "main": function() { return main; },
16591  "modifierPhases": function() { return modifierPhases; },
16592  "offset": function() { return modifiers_offset; },
16593  "placements": function() { return enums_placements; },
16594  "popper": function() { return popper; },
16595  "popperGenerator": function() { return popperGenerator; },
16596  "popperOffsets": function() { return modifiers_popperOffsets; },
16597  "preventOverflow": function() { return modifiers_preventOverflow; },
16598  "read": function() { return read; },
16599  "reference": function() { return reference; },
16600  "right": function() { return right; },
16601  "start": function() { return start; },
16602  "top": function() { return enums_top; },
16603  "variationPlacements": function() { return variationPlacements; },
16604  "viewport": function() { return viewport; },
16605  "write": function() { return write; }
16606});
16607
16608// EXTERNAL MODULE: external "$"
16609var external_$_ = __webpack_require__(3336);
16610var external_$_default = /*#__PURE__*/__webpack_require__.n(external_$_);
16611;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/
16611accordionNav/accordionNav.main.js
16612/**
16613 * ARIA Handling not compatible to Accessible Mega Menu in hover mode on Firefox.
16614 * To use ARIA Handling, set openOnMouseover to false in accessibleMegaMenu
16615 */
16616
16617
16618function changeState(state, $button, $label, $panel) {
16619  /** ARIA Handling disabled */
16620  $button.data('expanded', !state);
16621  $button.toggleClass('open-accordion'); // .attr({'aria-expanded': !state})
16622  // .prop({'aria-expanded': !state});
16623
16624  $label.toggleClass('open-accordion');
16625  /** ARIA Handling disabled */
16626
16627  $panel.toggleClass('open-accordion');
16628  $panel.data('expanded', !state); // .attr({'aria-expanded': !state, 'aria-hidden': state})
16629  // .prop({'aria-expanded': !state, 'aria-hidden': state});
16630}
16631
16632function closeSiblings($btn) {
16633  $btn.parent().siblings('.has-accordion-panel').each(function (i, el) {
16634    var $el = external_$_default()(el);
16635    var $button = $el.find('> .accordion-panel-toggle');
16636    var $label = $el.find('> a');
16637    var $panel = $el.find('> .secondLevel, > .thirdLevel');
16638    /** ARIA Handling disabled */
16639
16640    $button.data('expanded', false);
16641    $button.removeClass('open-accordion'); // .attr({'aria-expanded': false})
16642    // .prop({'aria-expanded': false});
16643
16644    $label.removeClass('open-accordion');
16645    /** ARIA Handling disabled */
16646
16647    $panel.data('expanded', false);
16648    $panel.removeClass('open-accordion'); // .attr({'aria-expanded': false, 'aria-hidden': true})
16649    // .prop({'aria-expanded': false, 'aria-hidden': true});
16650  });
16651}
16652
16653function scaffold(i, el) {
16654  var $panel = external_$_default()(el);
16655  var $label = $panel.prev('a');
16656  var svg = document.getElementById('accordionNav__panel-svg').outerHTML;
16657  var $button = external_$_default()('<button class="accordion-panel-toggle"></button>');
16658  var buttonLabelOpen = "Untermen\xFC von ".concat($label.text(), " anzeigen");
16659  var buttonLabelClose = "Untermen\xFC von ".concat($label.text(), " ausblenden");
16660  $button.text(buttonLabelOpen).data({
16661    labelOpen: buttonLabelOpen,
16662    labelClose: buttonLabelClose
16663  });
16664  /** ARIA Handling disabled */
16665  // const idLabel = `accordion-nav-sub-label-${i}`;
16666  // const idPanel = `accordion-nav-sub-panel-${i}`;
16667  // $button.attr({
16668  //     'aria-controls': idPanel,
16669  //     'aria-expanded': false,
16670  //     id: idLabel,
16671  //     role: 'region'
16672  // });
16673  // $panel.attr({
16674  //     'aria-expanded': false,
16675  //     'aria-hidden': true,
16676  //     'aria-labeledby': idLabel,
16677  //     id: idPanel,
16678  //     role: 'region'
16679  // });
16680
16681  $button.data('expanded', false);
16682  $panel.data('expanded', false);
16683  /* delegate click on label to the button */
16684
16685  $label.click(function (evt) {
16686    if (!$button.data('expanded')) {
16687      evt.preventDefault();
16688      $button.trigger('click');
16689    }
16690  });
16691  /* handle click on toggle: switch between open and close */
16692
16693  $button.click(function (evt) {
16694    var state = $button.data('expanded');
16695    evt.preventDefault();
16696    changeState(state, $button, $label, $panel);
16697    closeSiblings($button);
16698    external_$_default()(window).trigger('accordionNav:toggle');
16699  });
16700  $button.append(external_$_default()(svg).removeAttr('id'));
16701  /* add functional classnames */
16702
16703  $panel.addClass('accordion-panel');
16704  $panel.parent().addClass('has-accordion-panel');
16705  /* add button to the dom */
16706
16707  $panel.before($button);
16708}
16709/* Init on DOM ready */
16710
16711
16712function init() {
16713  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '.accordionNav .subNav';
16714  console.log('accordionNav initialised through accordionNav on: ' + selector);
16715  external_$_default()(selector).each(scaffold);
16716}
16717external_$_default().when((external_$_default()).ready).then(function () {
16718  console.log('accordionNav initialised on DOMContentLoaded'); // init modes
16719
16720  init('.accordionNav .secondLevel');
16721  init('.accordionNav .thirdLevel');
16722});
16723/* Init on document load */
16724
16725function load() {}
16726// EXTERNAL MODULE: ./node_modules/magnific-popup/dist/jquery.magnific-popup.js
16727var jquery_magnific_popup = __webpack_require__(7729);
16728;// CONCATENATED MODULE: ./src/modules/elements/figure/figure.lightbox.js
16729
16730
16731function initLightbox() {
16732  var $figures = external_$_default()(this);
16733
16734  if ($figures.length < 1) {
16735    return;
16736  } // init popup
16737
16738
16739  $figures.magnificPopup({
16740    delegate: '.figure__mediaContainer a:not(.figure__download-button)',
16741    type: 'image',
16742    image: {
16743      tError: '<a href="%url%">Das Bild</a> konnte nicht geladen werden.',
16744      titleSrc: function titleSrc(item) {
16745        var title = item.el.closest('.figure').find('.figure__figcaption').html() ? item.el.closest('.figure').find('.figure__figcaption').html() : '';
16746        return title;
16747      }
16748    },
16749    gallery: {
16750      enabled: false // set to true to enable gallery
16751
16752    },
16753    ajax: {
16754      tError: '<a href="%url%">Der Inhalt konnte nicht geladen werden.</a>'
16755    },
16756    tClose: 'Schließen (Esc)',
16757    tLoading: 'Lädt...',
16758    callbacks: {
16759      open: function open() {
16760        external_$_default()(this.container).find('.mfp-bottom-bar').attr('tabindex', '0');
16761        external_$_default()(this.container).find('.mfp-bottom-bar').attr('aria-label', 'Erweiterte Bildbeschreibung');
16762      }
16763    }
16764  });
16765  $figures.on('click', '.figure__zoom-button', function (evt) {
16766    evt.preventDefault(); // mimik click event to use options
16767
16768    external_$_default()(evt.target).parents('.figure').find('.figure__mediaContainer a:not(.figure__download-button)').trigger('click');
16769  });
16770}
16771/**
16772 * Init on DOM ready
16773 */
16774
16775external_$_default().when((external_$_default()).ready).then(function () {
16776  console.log('figure initialised on DOMContentLoaded'); // do it only for figures
16777
16778  external_$_default()('.figure[data-lightbox]').each(initLightbox);
16779});
16780;// CONCATENATED MODULE: ./src/modules/components/ajaxLoadmore/ajaxLoadmore.main.js
16781
16782
16783
16784function handleError($module) {
16785  $module.removeClass('ajaxLoadmore--is-processing'); // show some form of error message
16786
16787  $module.attr('aria-live', 'assertive');
16788  $module.removeClass('ajaxLoadmore--has-success');
16789  $module.addClass('ajaxLoadmore--has-error');
16790  $module.data('error-count', $module.data('error-count') + 1); // dismiss
16791
16792  setTimeout(function () {
16793    $module.attr('aria-live', 'off');
16794    $module.removeClass('ajaxLoadmore--has-error'); // disable module after third error in row
16795
16796    if ($module.data('error-count') > 2) {
16797      $module.find('.ajaxLoadmore__button').attr('disable', 'disable');
16798      $module.addClass('ajaxLoadmore--has-finished');
16799    }
16800  }, 5000);
16801  $module.data('is-loading', false);
16802  $module.find('button').trigger('button:removeLoader');
16803}
16804
16805function loadContent($module, $list) {
16806  var url = $module.data('nextpage');
16807  var $lastListItemBeforeLoadmore = $list.find('.teaserList__item').last();
16808  $module.addClass('ajaxLoadmore--is-processing');
16809  external_$_default().get({
16810    dataType: 'json',
16811    url: url,
16812    success: function success(responseData) {
16813      if (!responseData.data) {
16814        handleError($module);
16815        return;
16816      }
16817
16818      var $el = external_$_default()(responseData.data).find('.teaserList__item');
16819      $el.appendTo($list).fadeIn();
16820      $el.each(function () {
16821        external_$_default()(document).trigger('ajaxLoadmore', this);
16822
16823        if (external_$_default()(this).find('[data-lightbox="true"]')) {
16824          initLightbox.call(this);
16825        }
16826      });
16827      $module.removeClass('ajaxLoadmore--is-processing');
16828      $module.data('is-loading', false);
16829
16830      if (responseData.nextpage === '') {
16831        $module.addClass('ajaxLoadmore--has-finished');
16832        $module.find('button').trigger('button:removeLoader');
16833        return;
16834      }
16835
16836      $module.data('nextpage', responseData.nextpage);
16837      $module.removeClass('ajaxLoadmore--has-error');
16838      $module.addClass('ajaxLoadmore--has-success'); // reset error count
16839
16840      $module.data('error-count', 0);
16841      $module.data('is-loading', false); // focus on newest element to keep flow for keyboard users
16842
16843      $lastListItemBeforeLoadmore.next().find('a').focus();
16844      $module.find('button').trigger('button:removeLoader');
16845    },
16846    error: function error() {
16847      handleError($module);
16848    }
16849  });
16850}
16851
16852function initloadmore() {
16853  var $module = external_$_default()(this);
16854  var $button = $module.find('.button');
16855  var $list = $module.closest('.co').find('.teaserList').eq(0);
16856  $module.data('error-count', 0);
16857  $module.data('nextpage', $module.attr('data-url')); // keep reference to first URL in case user klicks 'show less'
16858
16859  $module.data('firstUrl', $module.data('nextpage'));
16860  $module.data('moreButton', $button);
16861  $button.click(function () {
16862    if ($module.data('is-loading') === true) {
16863      return;
16864    }
16865
16866    $module.data('is-loading', true);
16867    loadContent($module, $list);
16868  });
16869}
16870/**
16871 * Init on DOM ready
16872 */
16873
16874
16875external_$_default().when((external_$_default()).ready).then(function () {
16876  console.log('ajaxLoadmore initialised on DOMContentLoaded');
16877});
16878/**
16879 * Init on document load
16880 */
16881
16882external_$_default()(window).on('load', function () {
16883  console.log('ajaxLoadmore initialised on load');
16884  external_$_default()('.ajaxLoadmore').each(initloadmore);
16885});
16886;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/characterNav/characterNav.main.js
16887
16888external_$_default().when((external_$_default()).ready).then(function () {
16889  console.log('characterNav initialised on ready');
16890  var $charFilter = external_$_default()('.co__characterFilter');
16891
16892  if ($charFilter.length < 1) {
16893    return;
16894  }
16895
16896  var $listItem = $charFilter.find('li');
16897  var $teaser = $charFilter.parent().next('.co__main').find('.teaserList .teaserList__item');
16898  var alphabet = [];
16899  $teaser.each(function () {
16900    var $this = external_$_default()(this);
16901    var dataAttr = $this.data('jump'); // bail if undefined
16902
16903    if (typeof dataAttr === 'undefined') {
16904      return;
16905    }
16906
16907    if (!alphabet.includes(dataAttr)) {
16908      alphabet.push(dataAttr);
16909    }
16910  });
16911  $listItem.each(function () {
16912    var $this = external_$_default()(this);
16913    var $link = $this.find('a');
16914    var letter = $link.data('jumptarget');
16915
16916    if (!alphabet.includes(letter)) {
16917      var linkHtml = $link.html();
16918      $link.before('<span>' + linkHtml + '</span>');
16919      $link.remove();
16920    }
16921  });
16922});
16923external_$_default()(window).on('load', function () {// console.log('characterNav initialised on load');
16924});
16925;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/index.js
16926/**
16927 * --------------------------------------------------------------------------
16928 * Bootstrap (v5.1.3): util/index.js
16929 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16930 * --------------------------------------------------------------------------
16931 */
16932
16933const MAX_UID = 1000000
16934const MILLISECONDS_MULTIPLIER = 1000
16935const TRANSITION_END = 'transitionend'
16936
16937// Shoutout AngusCroll (https://goo.gl/pxwQGp)
16938const toType = obj => {
16939  if (obj === null || obj === undefined) {
16940    return `${obj}`
16941  }
16942
16943  return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase()
16944}
16945
16946/**
16947 * --------------------------------------------------------------------------
16948 * Public Util Api
16949 * --------------------------------------------------------------------------
16950 */
16951
16952const getUID = prefix => {
16953  do {
16954    prefix += Math.floor(Math.random() * MAX_UID)
16955  } while (document.getElementById(prefix))
16956
16957  return prefix
16958}
16959
16960const getSelector = element => {
16961  let selector = element.getAttribute('data-bs-target')
16962
16963  if (!selector || selector === '#') {
16964    let hrefAttr = element.getAttribute('href')
16965
16966    // The only valid content that could double as a selector are IDs or classes,
16967    // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
16968    // `document.querySelector` will rightfully complain it is invali
16968d.
16969    // See https://github.com/twbs/bootstrap/issues/32273
16970    if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {
16971      return null
16972    }
16973
16974    // Just in case some CMS puts out a full URL with the anchor appended
16975    if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
16976      hrefAttr = `#${hrefAttr.split('#')[1]}`
16977    }
16978
16979    selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null
16980  }
16981
16982  return selector
16983}
16984
16985const getSelectorFromElement = element => {
16986  const selector = getSelector(element)
16987
16988  if (selector) {
16989    return document.querySelector(selector) ? selector : null
16990  }
16991
16992  return null
16993}
16994
16995const getElementFromSelector = element => {
16996  const selector = getSelector(element)
16997
16998  return selector ? document.querySelector(selector) : null
16999}
17000
17001const getTransitionDurationFromElement = element => {
17002  if (!element) {
17003    return 0
17004  }
17005
17006  // Get transition-duration of the element
17007  let { transitionDuration, transitionDelay } = window.getComputedStyle(element)
17008
17009  const floatTransitionDuration = Number.parseFloat(transitionDuration)
17010  const floatTransitionDelay = Number.parseFloat(transitionDelay)
17011
17012  // Return 0 if element or transition duration is not found
17013  if (!floatTransitionDuration && !floatTransitionDelay) {
17014    return 0
17015  }
17016
17017  // If multiple durations are defined, take the first
17018  transitionDuration = transitionDuration.split(',')[0]
17019  transitionDelay = transitionDelay.split(',')[0]
17020
17021  return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER
17022}
17023
17024const triggerTransitionEnd = element => {
17025  element.dispatchEvent(new Event(TRANSITION_END))
17026}
17027
17028const isElement = obj => {
17029  if (!obj || typeof obj !== 'object') {
17030    return false
17031  }
17032
17033  if (typeof obj.jquery !== 'undefined') {
17034    obj = obj[0]
17035  }
17036
17037  return typeof obj.nodeType !== 'undefined'
17038}
17039
17040const getElement = obj => {
17041  if (isElement(obj)) { // it's a jQuery object or a node element
17042    return obj.jquery ? obj[0] : obj
17043  }
17044
17045  if (typeof obj === 'string' && obj.length > 0) {
17046    return document.querySelector(obj)
17047  }
17048
17049  return null
17050}
17051
17052const typeCheckConfig = (componentName, config, configTypes) => {
17053  Object.keys(configTypes).forEach(property => {
17054    const expectedTypes = configTypes[property]
17055    const value = config[property]
17056    const valueType = value && isElement(value) ? 'element' : toType(value)
17057
17058    if (!new RegExp(expectedTypes).test(valueType)) {
17059      throw new TypeError(
17060        `${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`
17061      )
17062    }
17063  })
17064}
17065
17066const isVisible = element => {
17067  if (!isElement(element) || element.getClientRects().length === 0) {
17068    return false
17069  }
17070
17071  return getComputedStyle(element).getPropertyValue('visibility') === 'visible'
17072}
17073
17074const isDisabled = element => {
17075  if (!element || element.nodeType !== Node.ELEMENT_NODE) {
17076    return true
17077  }
17078
17079  if (element.classList.contains('disabled')) {
17080    return true
17081  }
17082
17083  if (typeof element.disabled !== 'undefined') {
17084    return element.disabled
17085  }
17086
17087  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'
17088}
17089
17090const findShadowRoot = element => {
17091  if (!document.documentElement.attachShadow) {
17092    return null
17093  }
17094
17095  // Can find the shadow root otherwise it'll return the document
17096  if (typeof element.getRootNode === 'function') {
17097    const root = element.getRootNode()
17098    return root instanceof ShadowRoot ? root : null
17099  }
17100
17101  if (element instanceof ShadowRoot) {
17102    return element
17103  }
17104
17105  // when we don't find a shadow root
17106  if (!element.parentNode) {
17107    return null
17108  }
17109
17110  return findShadowRoot(element.parentNode)
17111}
17112
17113const noop = () => {}
17114
17115/**
17116 * Trick to restart an element's animation
17117 *
17118 * @param {HTMLElement} element
17119 * @return void
17120 *
17121 * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
17122 */
17123const reflow = element => {
17124  // eslint-disable-next-line no-unused-expressions
17125  element.offsetHeight
17126}
17127
17128const getjQuery = () => {
17129  const { jQuery } = window
17130
17131  if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
17132    return jQuery
17133  }
17134
17135  return null
17136}
17137
17138const DOMContentLoadedCallbacks = []
17139
17140const onDOMContentLoaded = callback => {
17141  if (document.readyState === 'loading') {
17142    // add listener on the first call when the document is in loading state
17143    if (!DOMContentLoadedCallbacks.length) {
17144      document.addEventListener('DOMContentLoaded', () => {
17145        DOMContentLoadedCallbacks.forEach(callback => callback())
17146      })
17147    }
17148
17149    DOMContentLoadedCallbacks.push(callback)
17150  } else {
17151    callback()
17152  }
17153}
17154
17155const isRTL = () => document.documentElement.dir === 'rtl'
17156
17157const defineJQueryPlugin = plugin => {
17158  onDOMContentLoaded(() => {
17159    const $ = getjQuery()
17160    /* istanbul ignore if */
17161    if ($) {
17162      const name = plugin.NAME
17163      const JQUERY_NO_CONFLICT = $.fn[name]
17164      $.fn[name] = plugin.jQueryInterface
17165      $.fn[name].Constructor = plugin
17166      $.fn[name].noConflict = () => {
17167        $.fn[name] = JQUERY_NO_CONFLICT
17168        return plugin.jQueryInterface
17169      }
17170    }
17171  })
17172}
17173
17174const execute = callback => {
17175  if (typeof callback === 'function') {
17176    callback()
17177  }
17178}
17179
17180const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
17181  if (!waitForTransition) {
17182    execute(callback)
17183    return
17184  }
17185
17186  const durationPadding = 5
17187  const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding
17188
17189  let called = false
17190
17191  const handler = ({ target }) => {
17192    if (target !== transitionElement) {
17193      return
17194    }
17195
17196    called = true
17197    transitionElement.removeEventListener(TRANSITION_END, handler)
17198    execute(callback)
17199  }
17200
17201  transitionElement.addEventListener(TRANSITION_END, handler)
17202  setTimeout(() => {
17203    if (!called) {
17204      triggerTransitionEnd(transitionElement)
17205    }
17206  }, emulatedDuration)
17207}
17208
17209/**
17210 * Return the previous/next element of a list.
17211 *
17212 * @param {array} list    The list of elements
17213 * @param activeElement   The active element
17214 * @param shouldGetNext   Choose to get next or previous element
17215 * @param isCycleAllowed
17216 * @return {Element|elem} The proper element
17217 */
17218const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
17219  let index = list.indexOf(activeElement)
17220
17221  // if the element does not exist in the list return an element depending on the direction and if cycle is allowed
17222  if (index === -1) {
17223    return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]
17224  }
17225
17226  const listLength = list.length
17227
17228  index += shouldGetNext ? 1 : -1
17229
17230  if (isCycleAllowed) {
17231    index = (index + listLength) % listLength
17232  }
17233
17234  return list[Math.max(0, Math.min(index, listLength - 1))]
17235}
17236
17237
17238
17239;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/dom/data.js
17240/**
17241 * --------------------------------------------------------------------------
17242 * Bootstrap (v5.1.3): dom/data.js
17243 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
17244 * --------------------------------------------------------------------------
17245 */
17246
17247/**
17248 * ------------------------------------------------------------------------
17249 * Constants
17250 * ------------------------------------------------------------------------
17251 */
17252
17253const elementMap = new Map()
17254
17255/* harmony default export */ var data = ({
17256  set(element, key, instance) {
17257    if (!elementMap.has(element)) {
17258      elementMap.set(element, new Map())
17259    }
17260
17261    const instanceMap = elementMap.get(element)
17262
17263    // make it clear we only want one instance per element
17264    // can be removed later when multiple key/instances are fine to be used
17265    if (!instanceMap.has(key) && instanceMap.size !== 0) {
17266      // eslint-disable-next-line no-console
17267      console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)
17268      return
17269    }
17270
17271    instanceMap.set(key, instance)
17272  },
17273
17274  get(element, key) {
17275    if (elementMap.has(element)) {
17276      return elementMap.get(element).get(key) || null
17277    }
17278
17279    return null
17280  },
17281
17282  remove(element, key) {
17283    if (!elementMap.has(element)) {
17284      return
17285    }
17286
17287    const instanceMap = elementMap.get(element)
17288
17289    instanceMap.delete(key)
17290
17291    // free up element references if there are no instances left for an element
17292    if (instanceMap.size === 0) {
17293      elementMap.delete(element)
17294    }
17295  }
17296});
17297
17298;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/dom/event-handler.js
17299/**
17300 * --------------------------------------------------------------------------
17301 * Bootstrap (v5.1.3): dom/event-handler.js
17302 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
17303 * --------------------------------------------------------------------------
17304 */
17305
17306
17307
17308/**
17309 * ------------------------------------------------------------------------
17310 * Constants
17311 * ------------------------------------------------------------------------
17312 */
17313
17314const namespaceRegex = /[^.]*(?=\..*)\.|.*/
17315const stripNameRegex = /\..*/
17316const stripUidRegex = /::\d+$/
17317const eventRegistry = {} // Events storage
17318let uidEvent = 1
17319const customEvents = {
17320  mouseenter: 'mouseover',
17321  mouseleave: 'mouseout'
17322}
17323const customEventsRegex = /^(mouseenter|mouseleave)/i
17324const nativeEvents = new Set([
17325  'click',
17326  'dblclick',
17327  'mouseup',
17328  'mousedown',
17329  'contextmenu',
17330  'mousewheel',
17331  'DOMMouseScroll',
17332  'mouseover',
17333  'mouseout',
17334  'mousemove',
17335  'selectstart',
17336  'selectend',
17337  'keydown',
17338  'keypress',
17339  'keyup',
17340  'orientationchange',
17341  'touchstart',
17342  'touchmove',
17343  'touchend',
17344  'touchcancel',
17345  'pointerdown',
17346  'pointermove',
17347  'pointerup',
17348  'pointerleave',
17349  'pointercancel',
17350  'gesturestart',
17351  'gesturechange',
17352  'gestureend',
17353  'focus',
17354  'blur',
17355  'change',
17356  'reset',
17357  'select',
17358  'submit',
17359  'focusin',
17360  'focusout',
17361  'load',
17362  'unload',
17363  'beforeunload',
17364  'resize',
17365  'move',
17366  'DOMContentLoaded',
17367  'readystatechange',
17368  'error',
17369  'abort',
17370  'scroll'
17371])
17372
17373/**
17374 * ------------------------------------------------------------------------
17375 * Private methods
17376 * ------------------------------------------------------------------------
17377 */
17378
17379function getUidEvent(element, uid) {
17380  return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++
17381}
17382
17383function getEvent(element) {
17384  const uid = getUidEvent(element)
17385
17386  element.uidEvent = uid
17387  eventRegistry[uid] = eventRegistry[uid] || {}
17388
17389  return eventRegistry[uid]
17390}
17391
17392function bootstrapHandler(element, fn) {
17393  return function handler(event) {
17394    event.delegateTarget = element
17395
17396    if (handler.oneOff) {
17397      EventHandler.off(element, event.type, fn)
17398    }
17399
17400    return fn.apply(element, [event])
17401  }
17402}
17403
17404function bootstrapDelegationHandler(element, selector, fn) {
17405  return function handler(event) {
17406    const domElements = element.querySelectorAll(selector)
17407
17408    for (let { target } = event; target && target !== this; target = target.parentNode) {
17409      for (let i = domElements.length; i--;) {
17410        if (domElements[i] === target) {
17411          event.delegateTarget = target
17412
17413          if (handler.oneOff) {
17414            EventHandler.off(element, event.type, selector, fn)
17415          }
17416
17417          return fn.apply(target, [event])
17418        }
17419      }
17420    }
17421
17422    // To please ESLint
17423    return null
17424  }
17425}
17426
17427function findHandler(events, handler, delegationSelector = null) {
17428  const uidEventList = Object.keys(events)
17429
17430  for (let i = 0, len = uidEventList.length; i < len; i++) {
17431    const event = events[uidEventList[i]]
17432
17433    if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
17434      return event
17435    }
17436  }
17437
17438  return null
17439}
17440
17441function normalizeParams(originalTypeEvent, handler, delegationFn) {
17442  const delegation = typeof handler === 'string'
17443  const originalHandler = delegation ? delegationFn : handler
17444
17445  let typeEvent = getTypeEvent(originalTypeEvent)
17446  const isNative = nativeEvents.has(typeEvent)
17447
17448  if (!isNative) {
17449    typeEvent = originalTypeEvent
17450  }
17451
17452  return [delegation, originalHandler, typeEvent]
17453}
17454
17455function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
17456  if (typeof originalTypeEvent !== 'string' || !element) {
17457    return
17458  }
17459
17460  if (!handler) {
17461    handler = delegationFn
17462    delegationFn = null
17463  }
17464
17465  // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
17466  // this prevents the handler from being dispatched the same way as mouseover or mouseout does
17467  if (customEventsRegex.test(originalTypeEvent)) {
17468    const wrapFn = fn => {
17469      return function (event) {
17470        if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {
17471          return fn.call(this, event)
17472        }
17473      }
17474    }
17475
17476    if (delegationFn) {
17477      delegationFn = wrapFn(delegationFn)
17478    } else {
17479      handler = wrapFn(handler)
17480    }
17481  }
17482
17483  const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)
17484  const events = getEvent(element)
17485  const handlers = events[typeEvent] || (events[typeEvent] = {})
17486  const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)
17487
17488  if (previousFn) {
17489    previousFn.oneOff = previousFn.oneOff && oneOff
17490
17491    return
17492  }
17493
17494  const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))
17495  const fn = delegation ?
17496    bootstrapDelegationHandler(element, handler, delegationFn) :
17497    bootstrapHandler(element, handler)
17498
17499  fn.delegationSelector = delegation ? handler : null
17500  fn.originalHandler = originalHandler
17501  fn.oneOff = oneOff
17502  fn.uidEvent = uid
17503  handlers[uid] = fn
17504
17505  element.addEventListener(typeEvent, fn, delegation)
17506}
17507
17508function removeHandler(element, events, typeEvent, handler, delegationSelector) {
17509  const fn = findHandler(events[typeEvent], handler, delegationSelector)
17510
17511  if (!fn) {
17512    return
17513  }
17514
17515  element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))
17516  delete events[typeEvent][fn.uidEvent]
17517}
17518
17519function removeNamespacedHandlers(element, events, typeEvent, namespace) {
17520  const storeElementEvent = events[typeEvent] || {}
17521
17522  Object.keys(storeElementEvent).forEach(handlerKey => {
17523    if (handlerKey.includes(namespace)) {
17524      const event = storeElementEvent[handlerKey]
17525
17526      removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)
17527    }
17528  })
17529}
17530
17531function getTypeEvent(event) {
17532  // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
17533  event = event.replace(stripNameRegex, '')
17534  return customEvents[event] || event
17535}
17536
17537const EventHandler = {
17538  on(element, event, handler, delegationFn) {
17539    addHandler(element, event, handler, delegationFn, false)
17540  },
17541
17542  one(element, event, handler, delegationFn) {
17543    addHandler(element, event, handler, delegationFn, true)
17544  },
17545
17546  off(element, originalTypeEvent, handler, delegationFn) {
17547    if (typeof originalTypeEvent !== 'string' || !element) {
17548      return
17549    }
17550
17551    const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)
17552    const inNamespace = typeEvent !== originalTypeEvent
17553    const events = getEvent(element)
17554    const isNamespace = originalTypeEvent.startsWith('.')
17555
17556    if (typeof originalHandler !== 'undefined') {
17557      // Simplest case: handler is passed, remove that listener ONLY.
17558      if (!events || !events[typeEvent]) {
17559        return
17560      }
17561
17562      removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)
17563      return
17564    }
17565
17566    if (isNamespace) {
17567      Object.keys(events).forEach(elementEvent => {
17568        removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))
17569      })
17570    }
17571
17572    const storeElementEvent = events[typeEvent] || {}
17573    Object.keys(storeElementEvent).forEach(keyHandlers => {
17574      const handlerKey = keyHandlers.replace(stripUidRegex, '')
17575
17576      if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
17577        const event = storeElementEvent[keyHandlers]
17578
17579        removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)
17580      }
17581    })
17582  },
17583
17584  trigger(element, event, args) {
17585    if (typeof event !== 'string' || !element) {
17586      return null
17587    }
17588
17589    const $ = getjQuery()
17590    const typeEvent = getTypeEvent(event)
17591    const inNamespace = event !== typeEvent
17592    const isNative = nativeEvents.has(typeEvent)
17593
17594    let jQueryEvent
17595    let bubbles = true
17596    let nativeDispatch = true
17597    let defaultPrevented = false
17598    let evt = null
17599
17600    if (inNamespace && $) {
17601      jQueryEvent = $.Event(event, args)
17602
17603      $(element).trigger(jQueryEvent)
17604      bubbles = !jQueryEvent.isPropagationStopped()
17605      nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()
17606      defaultPrevented = jQueryEvent.isDefaultPrevented()
17607    }
17608
17609    if (isNative) {
17610      evt = document.createEvent('HTMLEvents')
17611      evt.initEvent(typeEvent, bubbles, true)
17612    } else {
17613      evt = new CustomEvent(event, {
17614        bubbles,
17615        cancelable: true
17616      })
17617    }
17618
17619    // merge custom information in our event
17620    if (typeof args !== 'undefined') {
17621      Object.keys(args).forEach(key => {
17622        Object.defineProperty(evt, key, {
17623          get() {
17624            return args[key]
17625          }
17626        })
17627      })
17628    }
17629
17630    if (defaultPrevented) {
17631      evt.preventDefault()
17632    }
17633
17634    if (nativeDispatch) {
17635      element.dispatchEvent(evt)
17636    }
17637
17638    if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {
17639      jQueryEvent.preventDefault()
17640    }
17641
17642    return evt
17643  }
17644}
17645
17646/* harmony default export */ var event_handler = (EventHandler);
17647
17648;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/dom/manipulator.js
17649/**
17650 * --------------------------------------------------------------------------
17651 * Bootstrap (v5.1.3): dom/manipulator.js
17652 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
17653 * --------------------------------------------------------------------------
17654 */
17655
17656function normalizeData(val) {
17657  if (val === 'true') {
17658    return true
17659  }
17660
17661  if (val === 'false') {
17662    return false
17663  }
17664
17665  if (val === Number(val).toString()) {
17666    return Number(val)
17667  }
17668
17669  if (val === '' || val === 'null') {
17670    return null
17671  }
17672
17673  return val
17674}
17675
17676function normalizeDataKey(key) {
17677  return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)
17678}
17679
17680const Manipulator = {
17681  setDataAttribute(element, key, value) {
17682    element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)
17683  },
17684
17685  removeDataAttribute(element, key) {
17686    element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)
17687  },
17688
17689  getDataAttributes(element) {
17690    if (!element) {
17691      return {}
17692    }
17693
17694    const attributes = {}
17695
17696    Object.keys(element.dataset)
17697      .filter(key => key.startsWith('bs'))
17698      .forEach(key => {
17699        let pureKey = key.replace(/^bs/, '')
17700        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)
17701        attributes[pureKey] = normalizeData(element.dataset[key])
17702      })
17703
17704    return attributes
17705  },
17706
17707  getDataAttribute(element, key) {
17708    return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))
17709  },
17710
17711  offset(element) {
17712    const rect = element.getBoundingClientRect()
17713
17714    return {
17715      top: rect.top + window.pageYOffset,
17716      left: rect.left + window.pageXOffset
17717    }
17718  },
17719
17720  position(element) {
17721    return {
17722      top: element.offsetTop,
17723      left: element.offsetLeft
17724    }
17725  }
17726}
17727
17728/* harmony default export */ var manipulator = (Manipulator);
17729
17730;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/dom/selector-engine.js
17731/**
17732 * --------------------------------------------------------------------------
17733 * Bootstrap (v5.1.3): dom/selector-engine.js
17734 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
17735 * --------------------------------------------------------------------------
17736 */
17737
17738/**
17739 * ------------------------------------------------------------------------
17740 * Constants
17741 * ------------------------------------------------------------------------
17742 */
17743
17744
17745
17746const NODE_TEXT = 3
17747
17748const SelectorEngine = {
17749  find(selector, element = document.documentElement) {
17750    return [].concat(...Element.prototype.querySelectorAll.call(element, selector))
17751  },
17752
17753  findOne(selector, element = document.documentElement) {
17754    return Element.prototype.querySelector.call(element, selector)
17755  },
17756
17757  children(element, selector) {
17758    return [].concat(...element.children)
17759      .filter(child => child.matches(selector))
17760  },
17761
17762  parents(element, selector) {
17763    const parents = []
17764
17765    let ancestor = element.parentNode
17766
17767    while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
17768      if (ancestor.matches(selector)) {
17769        parents.push(ancestor)
17770      }
17771
17772      ancestor = ancestor.parentNode
17773    }
17774
17775    return parents
17776  },
17777
17778  prev(element, selector) {
17779    let previous = element.previousElementSibling
17780
17781    while (previous) {
17782      if (previous.matches(selector)) {
17783        return [previous]
17784      }
17785
17786      previous = previous.previousElementSibling
17787    }
17788
17789    return []
17790  },
17791
17792  next(element, selector) {
17793    let next = element.nextElementSibling
17794
17795    while (next) {
17796      if (next.matches(selector)) {
17797        return [next]
17798      }
17799
17800      next = next.nextElementSibling
17801    }
17802
17803    return []
17804  },
17805
17806  focusableChildren(element) {
17807    const focusables = [
17808      'a',
17809      'button',
17810      'input',
17811      'textarea',
17812      'select',
17813      'details',
17814      '[tabindex]',
17815      '[contenteditable="true"]'
17816    ].map(selector => `${selector}:not([tabindex^="-"])`).join(', ')
17817
17818    return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))
17819  }
17820}
17821
17822/* harmony default export */ var selector_engine = (SelectorEngine);
17823
17824;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/base-component.js
17825/**
17826 * --------------------------------------------------------------------------
17827 * Bootstrap (v5.1.3): base-component.js
17828 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
17829 * --------------------------------------------------------------------------
17830 */
17831
17832
17833
17834
17835
17836/**
17837 * ------------------------------------------------------------------------
17838 * Constants
17839 * ------------------------------------------------------------------------
17840 */
17841
17842const VERSION = '5.1.3'
17843
17844class BaseComponent {
17845  constructor(element) {
17846    element = getElement(element)
17847
17848    if (!element) {
17849      return
17850    }
17851
17852    this._element = element
17853    data.set(this._element, this.constructor.DATA_KEY, this)
17854  }
17855
17856  dispose() {
17857    data.remove(this._element, this.constructor.DATA_KEY)
17858    event_handler.off(this._element, this.constructor.EVENT_KEY)
17859
17860    Object.getOwnPropertyNames(this).forEach(propertyName => {
17861      this[propertyName] = null
17862    })
17863  }
17864
17865  _queueCallback(callback, element, isAnimated = true) {
17866    executeAfterTransition(callback, element, isAnimated)
17867  }
17868
17869  /** Static */
17870
17871  static getInstance(element) {
17872    return data.get(getElement(element), this.DATA_KEY)
17873  }
17874
17875  static getOrCreateInstance(element, config = {}) {
17876    return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)
17877  }
17878
17879  static get VERSION() {
17880    return VERSION
17881  }
17882
17883  static get NAME() {
17884    throw new Error('You have to implement the static method "NAME", for each component!')
17885  }
17886
17887  static get DATA_KEY() {
17888    return `bs.${this.NAME}`
17889  }
17890
17891  static get EVENT_KEY() {
17892    return `.${this.DATA_KEY}`
17893  }
17894}
17895
17896/* harmony default export */ var base_component = (BaseComponent);
17897
17898;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/collapse.js
17899/**
17900 * --------------------------------------------------------------------------
17901 * Bootstrap (v5.1.3): collapse.js
17902 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
17903 * --------------------------------------------------------------------------
17904 */
17905
17906
17907
17908
17909
17910
17911
17912
17913/**
17914 * ------------------------------------------------------------------------
17915 * Constants
17916 * ------------------------------------------------------------------------
17917 */
17918
17919const NAME = 'collapse'
17920const DATA_KEY = 'bs.collapse'
17921const EVENT_KEY = `.${DATA_KEY}`
17922const DATA_API_KEY = '.data-api'
17923
17924const Default = {
17925  toggle: true,
17926  parent: null
17927}
17928
17929const DefaultType = {
17930  toggle: 'boolean',
17931  parent: '(null|element)'
17932}
17933
17934const EVENT_SHOW = `show${EVENT_KEY}`
17935const EVENT_SHOWN = `shown${EVENT_KEY}`
17936const EVENT_HIDE = `hide${EVENT_KEY}`
17937const EVENT_HIDDEN = `hidden${EVENT_KEY}`
17938const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
17939
17940const CLASS_NAME_SHOW = 'show'
17941const CLASS_NAME_COLLAPSE = 'collapse'
17942const CLASS_NAME_COLLAPSING = 'collapsing'
17943const CLASS_NAME_COLLAPSED = 'collapsed'
17944const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`
17945const CLASS_NAME_HORIZONTAL = 'collapse-horizontal'
17946
17947const WIDTH = 'width'
17948const HEIGHT = 'height'
17949
17950const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'
17951const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]'
17952
17953/**
17954 * ------------------------------------------------------------------------
17955 * Class Definition
17956 * ------------------------------------------------------------------------
17957 */
17958
17959class Collapse extends base_component {
17960  constructor(element, config) {
17961    super(element)
17962
17963    this._isTransitioning = false
17964    this._config = this._getConfig(config)
17965    this._triggerArray = []
17966
17967    const toggleList = selector_engine.find(SELECTOR_DATA_TOGGLE)
17968
17969    for (let i = 0, len = toggleList.length; i < len; i++) {
17970      const elem = toggleList[i]
17971      const selector = getSelectorFromElement(elem)
17972      const filterElement = selector_engine.find(selector)
17973        .filter(foundElem => foundElem === this._element)
17974
17975      if (selector !== null && filterElement.length) {
17976        this._selector = selector
17977        this._triggerArray.push(elem)
17978      }
17979    }
17980
17981    this._initializeChildren()
17982
17983    if (!this._config.parent) {
17984      this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())
17985    }
17986
17987    if (this._config.toggle) {
17988      this.toggle()
17989    }
17990  }
17991
17992  // Getters
17993
17994  static get Default() {
17995    return Default
17996  }
17997
17998  static get NAME() {
17999    return NAME
18000  }
18001
18002  // Public
18003
18004  toggle() {
18005    if (this._isShown()) {
18006      this.hide()
18007    } else {
18008      this.show()
18009    }
18010  }
18011
18012  show() {
18013    if (this._isTransitioning || this._isShown()) {
18014      return
18015    }
18016
18017    let actives = []
18018    let activesData
18019
18020    if (this._config.parent) {
18021      const children = selector_engine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)
18022      actives = selector_engine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth
18023    }
18024
18025    const container = selector_engine.findOne(this._selector)
18026    if (actives.length) {
18027      const tempActiveData = actives.find(elem => container !== elem)
18028      activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null
18029
18030      if (activesData && activesData._isTransitioning) {
18031        return
18032      }
18033    }
18034
18035    const startEvent = event_handler.trigger(this._element, EVENT_SHOW)
18036    if (startEvent.defaultPrevented) {
18037      return
18038    }
18039
18040    actives.forEach(elemActive => {
18041      if (container !== elemActive) {
18042        Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()
18043      }
18044
18045      if (!activesData) {
18046        data.set(elemActive, DATA_KEY, null)
18047      }
18048    })
18049
18050    const dimension = this._getDimension()
18051
18052    this._element.classList.remove(CLASS_NAME_COLLAPSE)
18053    this._element.classList.add(CLASS_NAME_COLLAPSING)
18054
18055    this._element.style[dimension] = 0
18056
18057    this._addAriaAndCollapsedClass(this._triggerArray, true)
18058    this._isTransitioning = true
18059
18060    const complete = () => {
18061      this._isTransitioning = false
18062
18063      this._element.classList.remove(CLASS_NAME_COLLAPSING)
18064      this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)
18065
18066      this._element.style[dimension] = ''
18067
18068      event_handler.trigger(this._element, EVENT_SHOWN)
18069    }
18070
18071    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)
18072    const scrollSize = `scroll${capitalizedDimension}`
18073
18074    this._queueCallback(complete, this._element, true)
18075    this._element.style[dimension] = `${this._element[scrollSize]}px`
18076  }
18077
18078  hide() {
18079    if (this._isTransitioning || !this._isShown()) {
18080      return
18081    }
18082
18083    const startEvent = event_handler.trigger(this._element, EVENT_HIDE)
18084    if (startEvent.defaultPrevented) {
18085      return
18086    }
18087
18088    const dimension = this._getDimension()
18089
18090    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`
18091
18092    reflow(this._element)
18093
18094    this._element.classList.add(CLASS_NAME_COLLAPSING)
18095    this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)
18096
18097    const triggerArrayLength = this._triggerArray.length
18098    for (let i = 0; i < triggerArrayLength; i++) {
18099      const trigger = this._triggerArray[i]
18100      const elem = getElementFromSelector(trigger)
18101
18102      if (elem && !this._isShown(elem)) {
18103        this._addAriaAndCollapsedClass([trigger], false)
18104      }
18105    }
18106
18107    this._isTransitioning = true
18108
18109    const complete = () => {
18110      this._isTransitioning = false
18111      this._element.classList.remove(CLASS_NAME_COLLAPSING)
18112      this._element.classList.add(CLASS_NAME_COLLAPSE)
18113      event_handler.trigger(this._element, EVENT_HIDDEN)
18114    }
18115
18116    this._element.style[dimension] = ''
18117
18118    this._queueCallback(complete, this._element, true)
18119  }
18120
18121  _isShown(element = this._element) {
18122    return element.classList.contains(CLASS_NAME_SHOW)
18123  }
18124
18125  // Private
18126
18127  _getConfig(config) {
18128    config = {
18129      ...Default,
18130      ...manipulator.getDataAttributes(this._element),
18131      ...config
18132    }
18133    config.toggle = Boolean(config.toggle) // Coerce string values
18134    config.parent = getElement(config.parent)
18135    typeCheckConfig(NAME, config, DefaultType)
18136    return config
18137  }
18138
18139  _getDimension() {
18140    return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT
18141  }
18142
18143  _initializeChildren() {
18144    if (!this._config.parent) {
18145      return
18146    }
18147
18148    const children = selector_engine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)
18149    selector_engine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))
18150      .forEach(element => {
18151        const selected = getElementFromSelector(element)
18152
18153        if (selected) {
18154          this._addAriaAndCollapsedClass([element], this._isShown(selected))
18155        }
18156      })
18157  }
18158
18159  _addAriaAndCollapsedClass(triggerArray, isOpen) {
18160    if (!triggerArray.length) {
18161      return
18162    }
18163
18164    triggerArray.forEach(elem => {
18165      if (isOpen) {
18166        elem.classList.remove(CLASS_NAME_COLLAPSED)
18167      } else {
18168        elem.classList.add(CLASS_NAME_COLLAPSED)
18169      }
18170
18171      elem.setAttribute('aria-expanded', isOpen)
18172    })
18173  }
18174
18175  // Static
18176
18177  static jQueryInterface(config) {
18178    return this.each(function () {
18179      const _config = {}
18180      if (typeof config === 'string' && /show|hide/.test(config)) {
18181        _config.toggle = false
18182      }
18183
18184      const data = Collapse.getOrCreateInstance(this, _config)
18185
18186      if (typeof config === 'string') {
18187        if (typeof data[config] === 'undefined') {
18188          throw new TypeError(`No method named "${config}"`)
18189        }
18190
18191        data[config]()
18192      }
18193    })
18194  }
18195}
18196
18197/**
18198 * ------------------------------------------------------------------------
18199 * Data Api implementation
18200 * ------------------------------------------------------------------------
18201 */
18202
18203event_handler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
18204  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
18205  if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {
18206    event.preventDefault()
18207  }
18208
18209  const selector = getSelectorFromElement(this)
18210  const selectorElements = selector_engine.find(selector)
18211
18212  selectorElements.forEach(element => {
18213    Collapse.getOrCreateInstance(element, { toggle: false }).toggle()
18214  })
18215})
18216
18217/**
18218 * ------------------------------------------------------------------------
18219 * jQuery
18220 * ------------------------------------------------------------------------
18221 * add .Collapse to jQuery only if jQuery is present
18222 */
18223
18224defineJQueryPlugin(Collapse)
18225
18226/* harmony default export */ var collapse = ((/* unused pure expression or super */ null && (Collapse)));
18227
18228;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/collapse/collapse.main.js
18229
18230// EXTERNAL MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/cookieman/cookieman.main.js
18231var cookieman_main = __webpack_require__(7364);
18232// EXTERNAL MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/vendor/Accessible-Mega-Menu/js/jquery-accessibleMegaMenu.js
18233var jquery_accessibleMegaMenu = __webpack_require__(2873);
18234// EXTERNAL MODULE: ./src/js/vendor/Accessible-Mega-Menu/js/jquery-accessibleMegaMenu.js
18235var js_jquery_accessibleMegaMenu = __webpack_require__(4452);
18236;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/dropdownNav/dropdownNav.main.js
18237// todo: is this import needed
18238//  must test with only one nav available!
18239
18240
18241
18242function clickHandler(el) {
18243  external_$_default()(el).on('click', function (e) {
18244    var url = e.target.href; // this catches if event is on a span etc instead on the a tag
18245
18246    if (url === undefined) {
18247      url = external_$_default()(e.target).closest('a')[0].href;
18248    } // workaround, as megamenu will deactivate top level links
18249
18250
18251    window.location.href = url;
18252  });
18253}
18254
18255function touchHandler(el) {
18256  external_$_default()(el).on('touchstart', function () {
18257    external_$_default()('.firstLevel__list > li > a').removeClass('focus');
18258    external_$_default()('.subNav').removeClass('open');
18259    external_$_default()(el).addClass('focus');
18260    external_$_default()(el).siblings('.subNav').addClass('open');
18261  });
18262}
18263/**
18264 * Init on DOM ready
18265 */
18266
18267
18268function dropdownNav_main_init() {
18269  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '.dropdownNav .firstLevel';
18270  console.log('dropdownNav initialised through dropdownNav on: ' + selector);
18271  external_$_default()(selector).accessibleMegaMenu({
18272    openOnMouseover: true
18273  }); // hack so that the megamenu doesn't show flash of css animation after the page loads.
18274
18275  setTimeout(function () {
18276    external_$_default()('body').removeClass('init');
18277  }, 500);
18278  var $links = external_$_default()('.dropdownNav .firstLevel__list > li > a');
18279  $links.each(function (e, el) {
18280    return clickHandler(el);
18281  });
18282  $links.each(function (e, el) {
18283    return touchHandler(el);
18284  });
18285  external_$_default()(window).on('touchstart', function (e) {
18286    if (external_$_default()(e.target).parents('.dropdownNav').length < 1) {
18287      external_$_default()('.dropdownNav .firstLevel__list > li > a').removeClass('focus');
18288      external_$_default()('.dropdownNav .subNav').removeClass('open');
18289    }
18290  });
18291}
18292external_$_default().when((external_$_default()).ready).then(function () {
18293  console.log('dropdownNav initialised on DOMContentLoaded'); // init modes
18294
18295  dropdownNav_main_init('.dropdownNav .firstLevel');
18296});
18297;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/dropdownAccordionNav/dropdownAccordionNav.main.js
18298
18299
18300
18301
18302external_$_default().when((external_$_default()).ready).then(function () {
18303  console.log('dropdownAccordionNav initialised on DOMContentLoaded'); // init modes
18304
18305  dropdownNav_main_init('.dropdownAccordionNav .firstLevel');
18306  init('.dropdownAccordionNav .thirdLevel');
18307});
18308;// CONCATENATED MODULE: ./src/modules/components/dropdownFilter/dropdownFilter.main.js
18309
18310
18311function isFilterEmpty($filter) {
18312  var $selects = $filter.find('select');
18313  var $inputs = $filter.find('input:not(:hidden)');
18314  var isEmpty = true;
18315  $selects.each(function () {
18316    var $select = external_$_default()(this);
18317
18318    if ($select[0].selectedIndex !== 0) {
18319      isEmpty = false;
18320    }
18321  });
18322  $inputs.each(function () {
18323    var $input = external_$_default()(this);
18324
18325    if ($input.val() !== '') {
18326      isEmpty = false;
18327    }
18328
18329    if ($input.next().length > 0) {
18330      if ($input.next().val() !== '') {
18331        isEmpty = false;
18332      }
18333    }
18334  });
18335  return isEmpty;
18336}
18337
18338function resetFilter($filter) {
18339  var $selects = $filter.find('select');
18340  var $inputs = $filter.find('input:not(:hidden)');
18341  $selects.each(function () {
18342    var $select = external_$_default()(this);
18343    $select[0].selectedIndex = 0;
18344  });
18345  $inputs.each(function () {
18346    var $input = external_$_default()(this);
18347    $input.val('');
18348
18349    if ($input.next().length > 0) {
18350      $input.next().val('');
18351    }
18352  });
18353}
18354/**
18355 * Init on DOM ready
18356 */
18357
18358
18359external_$_default().when((external_$_default()).ready).then(function () {
18360  external_$_default()('.dropdownFilter').each(function () {
18361    var $dropdownFilter = external_$_default()(this);
18362    var $submit = $dropdownFilter.find('[type="submit"]');
18363    var $resetButtonLabel = 'Filter zurücksetzen';
18364
18365    if (external_$_default()('html').attr('lang') != 'de-de') {
18366      $resetButtonLabel = 'filter reset';
18367    }
18368
18369    if (isFilterEmpty($dropdownFilter)) {
18370      return;
18371    }
18372
18373    var $filterReset = external_$_default()('<span class="f-navigation__reset">' + '<button class="dropdownFilter__reset">' + $resetButtonLabel + '</button></span>');
18374    $dropdownFilter.find('.f-navigation').append($filterReset);
18375    $filterReset.on('click', function (evt) {
18376      evt.preventDefault();
18377      resetFilter($dropdownFilter);
18378      $submit.trigger('click');
18379    });
18380  });
18381});
18382/**
18383 * Init on document load
18384 */
18385
18386function dropdownFilter_main_load() {}
18387// EXTERNAL MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/expand/expand.main.js
18388var expand_main = __webpack_require__(5539);
18389;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/enums.js
18390var enums_top = 'top';
18391var bottom = 'bottom';
18392var right = 'right';
18393var left = 'left';
18394var auto = 'auto';
18395var basePlacements = [enums_top, bottom, right, left];
18396var start = 'start';
18397var end = 'end';
18398var clippingParents = 'clippingParents';
18399var viewport = 'viewport';
18400var popper = 'popper';
18401var reference = 'reference';
18402var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {
18403  return acc.concat([placement + "-" + start, placement + "-" + end]);
18404}, []);
18405var enums_placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {
18406  return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
18407}, []); // modifiers that need to read the DOM
18408
18409var beforeRead = 'beforeRead';
18410var read = 'read';
18411var afterRead = 'afterRead'; // pure-logic modifiers
18412
18413var beforeMain = 'beforeMain';
18414var main = 'main';
18415var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)
18416
18417var beforeWrite = 'beforeWrite';
18418var write = 'write';
18419var afterWrite = 'afterWrite';
18420var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
18421;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js
18422function getNodeName(element) {
18423  return element ? (element.nodeName || '').toLowerCase() : null;
18424}
18425;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getWindow.js
18426function getWindow(node) {
18427  if (node == null) {
18428    return window;
18429  }
18430
18431  if (node.toString() !== '[object Window]') {
18432    var ownerDocument = node.ownerDocument;
18433    return ownerDocument ? ownerDocument.defaultView || window : window;
18434  }
18435
18436  return node;
18437}
18438;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js
18439
18440
18441function instanceOf_isElement(node) {
18442  var OwnElement = getWindow(node).Element;
18443  return node instanceof OwnElement || node instanceof Element;
18444}
18445
18446function isHTMLElement(node) {
18447  var OwnElement = getWindow(node).HTMLElement;
18448  return node instanceof OwnElement || node instanceof HTMLElement;
18449}
18450
18451function isShadowRoot(node) {
18452  // IE 11 has no ShadowRoot
18453  if (typeof ShadowRoot === 'undefined') {
18454    return false;
vendor: 9,203 bytes, lines 18455-18743
18455  }
18456
18457  var OwnElement = getWindow(node).ShadowRoot;
18458  return node instanceof OwnElement || node instanceof ShadowRoot;
18459}
18460
18461
18462;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/applyStyles.js
18463
18464 // This modifier takes the styles prepared by the `computeStyles` modifier
18465// and applies them to the HTMLElements such as popper and arrow
18466
18467function applyStyles(_ref) {
18468  var state = _ref.state;
18469  Object.keys(state.elements).forEach(function (name) {
18470    var style = state.styles[name] || {};
18471    var attributes = state.attributes[name] || {};
18472    var element = state.elements[name]; // arrow is optional + virtual elements
18473
18474    if (!isHTMLElement(element) || !getNodeName(element)) {
18475      return;
18476    } // Flow doesn't support to extend this property, but it's the most
18477    // effective way to apply styles to an HTMLElement
18478    // $FlowFixMe[cannot-write]
18479
18480
18481    Object.assign(element.style, style);
18482    Object.keys(attributes).forEach(function (name) {
18483      var value = attributes[name];
18484
18485      if (value === false) {
18486        element.removeAttribute(name);
18487      } else {
18488        element.setAttribute(name, value === true ? '' : value);
18489      }
18490    });
18491  });
18492}
18493
18494function effect(_ref2) {
18495  var state = _ref2.state;
18496  var initialStyles = {
18497    popper: {
18498      position: state.options.strategy,
18499      left: '0',
18500      top: '0',
18501      margin: '0'
18502    },
18503    arrow: {
18504      position: 'absolute'
18505    },
18506    reference: {}
18507  };
18508  Object.assign(state.elements.popper.style, initialStyles.popper);
18509  state.styles = initialStyles;
18510
18511  if (state.elements.arrow) {
18512    Object.assign(state.elements.arrow.style, initialStyles.arrow);
18513  }
18514
18515  return function () {
18516    Object.keys(state.elements).forEach(function (name) {
18517      var element = state.elements[name];
18518      var attributes = state.attributes[name] || {};
18519      var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them
18520
18521      var style = styleProperties.reduce(function (style, property) {
18522        style[property] = '';
18523        return style;
18524      }, {}); // arrow is optional + virtual elements
18525
18526      if (!isHTMLElement(element) || !getNodeName(element)) {
18527        return;
18528      }
18529
18530      Object.assign(element.style, style);
18531      Object.keys(attributes).forEach(function (attribute) {
18532        element.removeAttribute(attribute);
18533      });
18534    });
18535  };
18536} // eslint-disable-next-line import/no-unused-modules
18537
18538
18539/* harmony default export */ var modifiers_applyStyles = ({
18540  name: 'applyStyles',
18541  enabled: true,
18542  phase: 'write',
18543  fn: applyStyles,
18544  effect: effect,
18545  requires: ['computeStyles']
18546});
18547;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getBasePlacement.js
18548
18549function getBasePlacement(placement) {
18550  return placement.split('-')[0];
18551}
18552;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/math.js
18553var math_max = Math.max;
18554var math_min = Math.min;
18555var round = Math.round;
18556;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js
18557
18558
18559function getBoundingClientRect(element, includeScale) {
18560  if (includeScale === void 0) {
18561    includeScale = false;
18562  }
18563
18564  var rect = element.getBoundingClientRect();
18565  var scaleX = 1;
18566  var scaleY = 1;
18567
18568  if (isHTMLElement(element) && includeScale) {
18569    var offsetHeight = element.offsetHeight;
18570    var offsetWidth = element.offsetWidth; // Do not attempt to divide by 0, otherwise we get `Infinity` as scale
18571    // Fallback to 1 in case both values are `0`
18572
18573    if (offsetWidth > 0) {
18574      scaleX = round(rect.width) / offsetWidth || 1;
18575    }
18576
18577    if (offsetHeight > 0) {
18578      scaleY = round(rect.height) / offsetHeight || 1;
18579    }
18580  }
18581
18582  return {
18583    width: rect.width / scaleX,
18584    height: rect.height / scaleY,
18585    top: rect.top / scaleY,
18586    right: rect.right / scaleX,
18587    bottom: rect.bottom / scaleY,
18588    left: rect.left / scaleX,
18589    x: rect.left / scaleX,
18590    y: rect.top / scaleY
18591  };
18592}
18593;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js
18594 // Returns the layout rect of an element relative to its offsetParent. Layout
18595// means it doesn't take into account transforms.
18596
18597function getLayoutRect(element) {
18598  var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.
18599  // Fixes https://github.com/popperjs/popper-core/issues/1223
18600
18601  var width = element.offsetWidth;
18602  var height = element.offsetHeight;
18603
18604  if (Math.abs(clientRect.width - width) <= 1) {
18605    width = clientRect.width;
18606  }
18607
18608  if (Math.abs(clientRect.height - height) <= 1) {
18609    height = clientRect.height;
18610  }
18611
18612  return {
18613    x: element.offsetLeft,
18614    y: element.offsetTop,
18615    width: width,
18616    height: height
18617  };
18618}
18619;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/contains.js
18620
18621function contains(parent, child) {
18622  var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method
18623
18624  if (parent.contains(child)) {
18625    return true;
18626  } // then fallback to custom implementation with Shadow DOM support
18627  else if (rootNode && isShadowRoot(rootNode)) {
18628      var next = child;
18629
18630      do {
18631        if (next && parent.isSameNode(next)) {
18632          return true;
18633        } // $FlowFixMe[prop-missing]: need a better way to handle this...
18634
18635
18636        next = next.parentNode || next.host;
18637      } while (next);
18638    } // Give up, the result is false
18639
18640
18641  return false;
18642}
18643;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js
18644
18645function getComputedStyle_getComputedStyle(element) {
18646  return getWindow(element).getComputedStyle(element);
18647}
18648;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js
18649
18650function isTableElement(element) {
18651  return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;
18652}
18653;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js
18654
18655function getDocumentElement(element) {
18656  // $FlowFixMe[incompatible-return]: assume body is always available
18657  return ((instanceOf_isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]
18658  element.document) || window.document).documentElement;
18659}
18660;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js
18661
18662
18663
18664function getParentNode(element) {
18665  if (getNodeName(element) === 'html') {
18666    return element;
18667  }
18668
18669  return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle
18670    // $FlowFixMe[incompatible-return]
18671    // $FlowFixMe[prop-missing]
18672    element.assignedSlot || // step into the shadow DOM of the parent of a slotted node
18673    element.parentNode || ( // DOM Element detected
18674    isShadowRoot(element) ? element.host : null) || // ShadowRoot detected
18675    // $FlowFixMe[incompatible-call]: HTMLElement is a Node
18676    getDocumentElement(element) // fallback
18677
18678  );
18679}
18680;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js
18681
18682
18683
18684
18685
18686
18687
18688function getTrueOffsetParent(element) {
18689  if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837
18690  getComputedStyle_getComputedStyle(element).position === 'fixed') {
18691    return null;
18692  }
18693
18694  return element.offsetParent;
18695} // `.offsetParent` reports `null` for fixed elements, while absolute elements
18696// return the containing block
18697
18698
18699function getContainingBlock(element) {
18700  var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;
18701  var isIE = navigator.userAgent.indexOf('Trident') !== -1;
18702
18703  if (isIE && isHTMLElement(element)) {
18704    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport
18705    var elementCss = getComputedStyle_getComputedStyle(element);
18706
18707    if (elementCss.position === 'fixed') {
18708      return null;
18709    }
18710  }
18711
18712  var currentNode = getParentNode(element);
18713
18714  if (isShadowRoot(currentNode)) {
18715    currentNode = currentNode.host;
18716  }
18717
18718  while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {
18719    var css = getComputedStyle_getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that
18720    // create a containing block.
18721    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
18722
18723    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {
18724      return currentNode;
18725    } else {
18726      currentNode = currentNode.parentNode;
18727    }
18728  }
18729
18730  return null;
18731} // Gets the closest ancestor positioned element. Handles some edge cases,
18732// such as table ancestors and cross browser bugs.
18733
18734
18735function getOffsetParent(element) {
18736  var window = getWindow(element);
18737  var offsetParent = getTrueOffsetParent(element);
18738
18739  while (offsetParent && isTableElement(offsetParent) && getComputedStyle_getComputedStyle(offsetParent).position === 'static') {
18740    offsetParent = getTrueOffsetParent(offsetParent);
18741  }
18742
18743  if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle_
vendor: 6,229 bytes, lines 18743-18955
18743getComputedStyle(offsetParent).position === 'static')) {
18744    return window;
18745  }
18746
18747  return offsetParent || getContainingBlock(element) || window;
18748}
18749;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js
18750function getMainAxisFromPlacement(placement) {
18751  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';
18752}
18753;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/within.js
18754
18755function within(min, value, max) {
18756  return math_max(min, math_min(value, max));
18757}
18758function withinMaxClamp(min, value, max) {
18759  var v = within(min, value, max);
18760  return v > max ? max : v;
18761}
18762;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js
18763function getFreshSideObject() {
18764  return {
18765    top: 0,
18766    right: 0,
18767    bottom: 0,
18768    left: 0
18769  };
18770}
18771;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js
18772
18773function mergePaddingObject(paddingObject) {
18774  return Object.assign({}, getFreshSideObject(), paddingObject);
18775}
18776;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/expandToHashMap.js
18777function expandToHashMap(value, keys) {
18778  return keys.reduce(function (hashMap, key) {
18779    hashMap[key] = value;
18780    return hashMap;
18781  }, {});
18782}
18783;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/arrow.js
18784
18785
18786
18787
18788
18789
18790
18791
18792
18793 // eslint-disable-next-line import/no-unused-modules
18794
18795var toPaddingObject = function toPaddingObject(padding, state) {
18796  padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {
18797    placement: state.placement
18798  })) : padding;
18799  return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
18800};
18801
18802function arrow(_ref) {
18803  var _state$modifiersData$;
18804
18805  var state = _ref.state,
18806      name = _ref.name,
18807      options = _ref.options;
18808  var arrowElement = state.elements.arrow;
18809  var popperOffsets = state.modifiersData.popperOffsets;
18810  var basePlacement = getBasePlacement(state.placement);
18811  var axis = getMainAxisFromPlacement(basePlacement);
18812  var isVertical = [left, right].indexOf(basePlacement) >= 0;
18813  var len = isVertical ? 'height' : 'width';
18814
18815  if (!arrowElement || !popperOffsets) {
18816    return;
18817  }
18818
18819  var paddingObject = toPaddingObject(options.padding, state);
18820  var arrowRect = getLayoutRect(arrowElement);
18821  var minProp = axis === 'y' ? enums_top : left;
18822  var maxProp = axis === 'y' ? bottom : right;
18823  var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];
18824  var startDiff = popperOffsets[axis] - state.rects.reference[axis];
18825  var arrowOffsetParent = getOffsetParent(arrowElement);
18826  var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
18827  var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is
18828  // outside of the popper bounds
18829
18830  var min = paddingObject[minProp];
18831  var max = clientSize - arrowRect[len] - paddingObject[maxProp];
18832  var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
18833  var offset = within(min, center, max); // Prevents breaking syntax highlighting...
18834
18835  var axisProp = axis;
18836  state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);
18837}
18838
18839function arrow_effect(_ref2) {
18840  var state = _ref2.state,
18841      options = _ref2.options;
18842  var _options$element = options.element,
18843      arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;
18844
18845  if (arrowElement == null) {
18846    return;
18847  } // CSS selector
18848
18849
18850  if (typeof arrowElement === 'string') {
18851    arrowElement = state.elements.popper.querySelector(arrowElement);
18852
18853    if (!arrowElement) {
18854      return;
18855    }
18856  }
18857
18858  if (false) {}
18859
18860  if (!contains(state.elements.popper, arrowElement)) {
18861    if (false) {}
18862
18863    return;
18864  }
18865
18866  state.elements.arrow = arrowElement;
18867} // eslint-disable-next-line import/no-unused-modules
18868
18869
18870/* harmony default export */ var modifiers_arrow = ({
18871  name: 'arrow',
18872  enabled: true,
18873  phase: 'main',
18874  fn: arrow,
18875  effect: arrow_effect,
18876  requires: ['popperOffsets'],
18877  requiresIfExists: ['preventOverflow']
18878});
18879;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getVariation.js
18880function getVariation(placement) {
18881  return placement.split('-')[1];
18882}
18883;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/computeStyles.js
18884
18885
18886
18887
18888
18889
18890
18891 // eslint-disable-next-line import/no-unused-modules
18892
18893var unsetSides = {
18894  top: 'auto',
18895  right: 'auto',
18896  bottom: 'auto',
18897  left: 'auto'
18898}; // Round the offsets to the nearest suitable subpixel based on the DPR.
18899// Zooming can change the DPR, but it seems to report a value that will
18900// cleanly divide the values into the appropriate subpixels.
18901
18902function roundOffsetsByDPR(_ref) {
18903  var x = _ref.x,
18904      y = _ref.y;
18905  var win = window;
18906  var dpr = win.devicePixelRatio || 1;
18907  return {
18908    x: round(x * dpr) / dpr || 0,
18909    y: round(y * dpr) / dpr || 0
18910  };
18911}
18912
18913function mapToStyles(_ref2) {
18914  var _Object$assign2;
18915
18916  var popper = _ref2.popper,
18917      popperRect = _ref2.popperRect,
18918      placement = _ref2.placement,
18919      variation = _ref2.variation,
18920      offsets = _ref2.offsets,
18921      position = _ref2.position,
18922      gpuAcceleration = _ref2.gpuAcceleration,
18923      adaptive = _ref2.adaptive,
18924      roundOffsets = _ref2.roundOffsets,
18925      isFixed = _ref2.isFixed;
18926  var _offsets$x = offsets.x,
18927      x = _offsets$x === void 0 ? 0 : _offsets$x,
18928      _offsets$y = offsets.y,
18929      y = _offsets$y === void 0 ? 0 : _offsets$y;
18930
18931  var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({
18932    x: x,
18933    y: y
18934  }) : {
18935    x: x,
18936    y: y
18937  };
18938
18939  x = _ref3.x;
18940  y = _ref3.y;
18941  var hasX = offsets.hasOwnProperty('x');
18942  var hasY = offsets.hasOwnProperty('y');
18943  var sideX = left;
18944  var sideY = enums_top;
18945  var win = window;
18946
18947  if (adaptive) {
18948    var offsetParent = getOffsetParent(popper);
18949    var heightProp = 'clientHeight';
18950    var widthProp = 'clientWidth';
18951
18952    if (offsetParent === getWindow(popper)) {
18953      offsetParent = getDocumentElement(popper);
18954
18955      if (getComputedStyle
vendor: 7,421 bytes, lines 18955-19172
18955_getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {
18956        heightProp = 'scrollHeight';
18957        widthProp = 'scrollWidth';
18958      }
18959    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it
18960
18961
18962    offsetParent = offsetParent;
18963
18964    if (placement === enums_top || (placement === left || placement === right) && variation === end) {
18965      sideY = bottom;
18966      var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]
18967      offsetParent[heightProp];
18968      y -= offsetY - popperRect.height;
18969      y *= gpuAcceleration ? 1 : -1;
18970    }
18971
18972    if (placement === left || (placement === enums_top || placement === bottom) && variation === end) {
18973      sideX = right;
18974      var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]
18975      offsetParent[widthProp];
18976      x -= offsetX - popperRect.width;
18977      x *= gpuAcceleration ? 1 : -1;
18978    }
18979  }
18980
18981  var commonStyles = Object.assign({
18982    position: position
18983  }, adaptive && unsetSides);
18984
18985  var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
18986    x: x,
18987    y: y
18988  }) : {
18989    x: x,
18990    y: y
18991  };
18992
18993  x = _ref4.x;
18994  y = _ref4.y;
18995
18996  if (gpuAcceleration) {
18997    var _Object$assign;
18998
18999    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
19000  }
19001
19002  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2));
19003}
19004
19005function computeStyles(_ref5) {
19006  var state = _ref5.state,
19007      options = _ref5.options;
19008  var _options$gpuAccelerat = options.gpuAcceleration,
19009      gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,
19010      _options$adaptive = options.adaptive,
19011      adaptive = _options$adaptive === void 0 ? true : _options$adaptive,
19012      _options$roundOffsets = options.roundOffsets,
19013      roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
19014
19015  if (false) { var transitionProperty; }
19016
19017  var commonStyles = {
19018    placement: getBasePlacement(state.placement),
19019    variation: getVariation(state.placement),
19020    popper: state.elements.popper,
19021    popperRect: state.rects.popper,
19022    gpuAcceleration: gpuAcceleration,
19023    isFixed: state.options.strategy === 'fixed'
19024  };
19025
19026  if (state.modifiersData.popperOffsets != null) {
19027    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
19028      offsets: state.modifiersData.popperOffsets,
19029      position: state.options.strategy,
19030      adaptive: adaptive,
19031      roundOffsets: roundOffsets
19032    })));
19033  }
19034
19035  if (state.modifiersData.arrow != null) {
19036    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
19037      offsets: state.modifiersData.arrow,
19038      position: 'absolute',
19039      adaptive: false,
19040      roundOffsets: roundOffsets
19041    })));
19042  }
19043
19044  state.attributes.popper = Object.assign({}, state.attributes.popper, {
19045    'data-popper-placement': state.placement
19046  });
19047} // eslint-disable-next-line import/no-unused-modules
19048
19049
19050/* harmony default export */ var modifiers_computeStyles = ({
19051  name: 'computeStyles',
19052  enabled: true,
19053  phase: 'beforeWrite',
19054  fn: computeStyles,
19055  data: {}
19056});
19057;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/eventListeners.js
19058 // eslint-disable-next-line import/no-unused-modules
19059
19060var passive = {
19061  passive: true
19062};
19063
19064function eventListeners_effect(_ref) {
19065  var state = _ref.state,
19066      instance = _ref.instance,
19067      options = _ref.options;
19068  var _options$scroll = options.scroll,
19069      scroll = _options$scroll === void 0 ? true : _options$scroll,
19070      _options$resize = options.resize,
19071      resize = _options$resize === void 0 ? true : _options$resize;
19072  var window = getWindow(state.elements.popper);
19073  var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
19074
19075  if (scroll) {
19076    scrollParents.forEach(function (scrollParent) {
19077      scrollParent.addEventListener('scroll', instance.update, passive);
19078    });
19079  }
19080
19081  if (resize) {
19082    window.addEventListener('resize', instance.update, passive);
19083  }
19084
19085  return function () {
19086    if (scroll) {
19087      scrollParents.forEach(function (scrollParent) {
19088        scrollParent.removeEventListener('scroll', instance.update, passive);
19089      });
19090    }
19091
19092    if (resize) {
19093      window.removeEventListener('resize', instance.update, passive);
19094    }
19095  };
19096} // eslint-disable-next-line import/no-unused-modules
19097
19098
19099/* harmony default export */ var eventListeners = ({
19100  name: 'eventListeners',
19101  enabled: true,
19102  phase: 'write',
19103  fn: function fn() {},
19104  effect: eventListeners_effect,
19105  data: {}
19106});
19107;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js
19108var hash = {
19109  left: 'right',
19110  right: 'left',
19111  bottom: 'top',
19112  top: 'bottom'
19113};
19114function getOppositePlacement(placement) {
19115  return placement.replace(/left|right|bottom|top/g, function (matched) {
19116    return hash[matched];
19117  });
19118}
19119;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js
19120var getOppositeVariationPlacement_hash = {
19121  start: 'end',
19122  end: 'start'
19123};
19124function getOppositeVariationPlacement(placement) {
19125  return placement.replace(/start|end/g, function (matched) {
19126    return getOppositeVariationPlacement_hash[matched];
19127  });
19128}
19129;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js
19130
19131function getWindowScroll(node) {
19132  var win = getWindow(node);
19133  var scrollLeft = win.pageXOffset;
19134  var scrollTop = win.pageYOffset;
19135  return {
19136    scrollLeft: scrollLeft,
19137    scrollTop: scrollTop
19138  };
19139}
19140;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js
19141
19142
19143
19144function getWindowScrollBarX(element) {
19145  // If <html> has a CSS width greater than the viewport, then this will be
19146  // incorrect for RTL.
19147  // Popper 1 is broken in this case and never had a bug report so let's assume
19148  // it's not an issue. I don't think anyone ever specifies width on <html>
19149  // anyway.
19150  // Browsers where the left scrollbar doesn't cause an issue report `0` for
19151  // this (e.g. Edge 2019, IE11, Safari)
19152  return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
19153}
19154;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js
19155
19156
19157
19158function getViewportRect(element) {
19159  var win = getWindow(element);
19160  var html = getDocumentElement(element);
19161  var visualViewport = win.visualViewport;
19162  var width = html.clientWidth;
19163  var height = html.clientHeight;
19164  var x = 0;
19165  var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper
19166  // can be obscured underneath it.
19167  // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even
19168  // if it isn't open, so if this isn't available, the popper will be detected
19169  // to overflow the bottom of the screen too early.
19170
19171  if (visualViewport) {
19172    width = visualViewport.width;
vendor: 9,843 bytes, lines 19173-19464
19173    height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)
19174    // In Chrome, it returns a value very close to 0 (+/-) but contains rounding
19175    // errors due to floating point numbers, so we need to check precision.
19176    // Safari returns a number <= 0, usually < -1 when pinch-zoomed
19177    // Feature detection fails in mobile emulation mode in Chrome.
19178    // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <
19179    // 0.001
19180    // Fallback here: "Not Safari" userAgent
19181
19182    if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
19183      x = visualViewport.offsetLeft;
19184      y = visualViewport.offsetTop;
19185    }
19186  }
19187
19188  return {
19189    width: width,
19190    height: height,
19191    x: x + getWindowScrollBarX(element),
19192    y: y
19193  };
19194}
19195;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js
19196
19197
19198
19199
19200 // Gets the entire size of the scrollable document area, even extending outside
19201// of the `<html>` and `<body>` rect bounds if horizontally scrollable
19202
19203function getDocumentRect(element) {
19204  var _element$ownerDocumen;
19205
19206  var html = getDocumentElement(element);
19207  var winScroll = getWindowScroll(element);
19208  var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
19209  var width = math_max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
19210  var height = math_max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
19211  var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
19212  var y = -winScroll.scrollTop;
19213
19214  if (getComputedStyle_getComputedStyle(body || html).direction === 'rtl') {
19215    x += math_max(html.clientWidth, body ? body.clientWidth : 0) - width;
19216  }
19217
19218  return {
19219    width: width,
19220    height: height,
19221    x: x,
19222    y: y
19223  };
19224}
19225;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js
19226
19227function isScrollParent(element) {
19228  // Firefox wants us to check `-x` and `-y` variations as well
19229  var _getComputedStyle = getComputedStyle_getComputedStyle(element),
19230      overflow = _getComputedStyle.overflow,
19231      overflowX = _getComputedStyle.overflowX,
19232      overflowY = _getComputedStyle.overflowY;
19233
19234  return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
19235}
19236;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js
19237
19238
19239
19240
19241function getScrollParent(node) {
19242  if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {
19243    // $FlowFixMe[incompatible-return]: assume body is always available
19244    return node.ownerDocument.body;
19245  }
19246
19247  if (isHTMLElement(node) && isScrollParent(node)) {
19248    return node;
19249  }
19250
19251  return getScrollParent(getParentNode(node));
19252}
19253;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js
19254
19255
19256
19257
19258/*
19259given a DOM element, return the list of all scroll parents, up the list of ancesors
19260until we get to the top window object. This list is what we attach scroll listeners
19261to, because if any of these parent elements scroll, we'll need to re-calculate the
19262reference element's position.
19263*/
19264
19265function listScrollParents(element, list) {
19266  var _element$ownerDocumen;
19267
19268  if (list === void 0) {
19269    list = [];
19270  }
19271
19272  var scrollParent = getScrollParent(element);
19273  var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
19274  var win = getWindow(scrollParent);
19275  var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
19276  var updatedList = list.concat(target);
19277  return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
19278  updatedList.concat(listScrollParents(getParentNode(target)));
19279}
19280;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/rectToClientRect.js
19281function rectToClientRect(rect) {
19282  return Object.assign({}, rect, {
19283    left: rect.x,
19284    top: rect.y,
19285    right: rect.x + rect.width,
19286    bottom: rect.y + rect.height
19287  });
19288}
19289;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js
19290
19291
19292
19293
19294
19295
19296
19297
19298
19299
19300
19301
19302
19303
19304
19305function getInnerBoundingClientRect(element) {
19306  var rect = getBoundingClientRect(element);
19307  rect.top = rect.top + element.clientTop;
19308  rect.left = rect.left + element.clientLeft;
19309  rect.bottom = rect.top + element.clientHeight;
19310  rect.right = rect.left + element.clientWidth;
19311  rect.width = element.clientWidth;
19312  rect.height = element.clientHeight;
19313  rect.x = rect.left;
19314  rect.y = rect.top;
19315  return rect;
19316}
19317
19318function getClientRectFromMixedType(element, clippingParent) {
19319  return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : instanceOf_isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
19320} // A "clipping parent" is an overflowable container with the characteristic of
19321// clipping (or hiding) overflowing elements with a position different from
19322// `initial`
19323
19324
19325function getClippingParents(element) {
19326  var clippingParents = listScrollParents(getParentNode(element));
19327  var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle_getComputedStyle(element).position) >= 0;
19328  var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
19329
19330  if (!instanceOf_isElement(clipperElement)) {
19331    return [];
19332  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414
19333
19334
19335  return clippingParents.filter(function (clippingParent) {
19336    return instanceOf_isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';
19337  });
19338} // Gets the maximum area that the element is visible in due to any number of
19339// clipping parents
19340
19341
19342function getClippingRect(element, boundary, rootBoundary) {
19343  var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);
19344  var clippingParents = [].concat(mainClippingParents, [rootBoundary]);
19345  var firstClippingParent = clippingParents[0];
19346  var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {
19347    var rect = getClientRectFromMixedType(element, clippingParent);
19348    accRect.top = math_max(rect.top, accRect.top);
19349    accRect.right = math_min(rect.right, accRect.right);
19350    accRect.bottom = math_min(rect.bottom, accRect.bottom);
19351    accRect.left = math_max(rect.left, accRect.left);
19352    return accRect;
19353  }, getClientRectFromMixedType(element, firstClippingParent));
19354  clippingRect.width = clippingRect.right - clippingRect.left;
19355  clippingRect.height = clippingRect.bottom - clippingRect.top;
19356  clippingRect.x = clippingRect.left;
19357  clippingRect.y = clippingRect.top;
19358  return clippingRect;
19359}
19360;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/computeOffsets.js
19361
19362
19363
19364
19365function computeOffsets(_ref) {
19366  var reference = _ref.reference,
19367      element = _ref.element,
19368      placement = _ref.placement;
19369  var basePlacement = placement ? getBasePlacement(placement) : null;
19370  var variation = placement ? getVariation(placement) : null;
19371  var commonX = reference.x + reference.width / 2 - element.width / 2;
19372  var commonY = reference.y + reference.height / 2 - element.height / 2;
19373  var offsets;
19374
19375  switch (basePlacement) {
19376    case enums_top:
19377      offsets = {
19378        x: commonX,
19379        y: reference.y - element.height
19380      };
19381      break;
19382
19383    case bottom:
19384      offsets = {
19385        x: commonX,
19386        y: reference.y + reference.height
19387      };
19388      break;
19389
19390    case right:
19391      offsets = {
19392        x: reference.x + reference.width,
19393        y: commonY
19394      };
19395      break;
19396
19397    case left:
19398      offsets = {
19399        x: reference.x - element.width,
19400        y: commonY
19401      };
19402      break;
19403
19404    default:
19405      offsets = {
19406        x: reference.x,
19407        y: reference.y
19408      };
19409  }
19410
19411  var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
19412
19413  if (mainAxis != null) {
19414    var len = mainAxis === 'y' ? 'height' : 'width';
19415
19416    switch (variation) {
19417      case start:
19418        offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);
19419        break;
19420
19421      case end:
19422        offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);
19423        break;
19424
19425      default:
19426    }
19427  }
19428
19429  return offsets;
19430}
19431;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/detectOverflow.js
19432
19433
19434
19435
19436
19437
19438
19439
19440 // eslint-disable-next-line import/no-unused-modules
19441
19442function detectOverflow(state, options) {
19443  if (options === void 0) {
19444    options = {};
19445  }
19446
19447  var _options = options,
19448      _options$placement = _options.placement,
19449      placement = _options$placement === void 0 ? state.placement : _options$placement,
19450      _options$boundary = _options.boundary,
19451      boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,
19452      _options$rootBoundary = _options.rootBoundary,
19453      rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,
19454      _options$elementConte = _options.elementContext,
19455      elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,
19456      _options$altBoundary = _options.altBoundary,
19457      altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,
19458      _options$padding = _options.padding,
19459      padding = _options$padding === void 0 ? 0 : _options$padding;
19460  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
19461  var altContext = elementContext === popper ? reference : popper;
19462  var popperRect = state.rects.popper;
19463  var element = state.elements[altBoundary ? altContext : elementContext];
19464  var clippingClientRect = getClippingRect(instanceOf_
vendor: 5,572 bytes, lines 19464-19607
19464isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);
19465  var referenceClientRect = getBoundingClientRect(state.elements.reference);
19466  var popperOffsets = computeOffsets({
19467    reference: referenceClientRect,
19468    element: popperRect,
19469    strategy: 'absolute',
19470    placement: placement
19471  });
19472  var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));
19473  var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect
19474  // 0 or negative = within the clipping rect
19475
19476  var overflowOffsets = {
19477    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
19478    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
19479    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
19480    right: elementClientRect.right - clippingClientRect.right + paddingObject.right
19481  };
19482  var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element
19483
19484  if (elementContext === popper && offsetData) {
19485    var offset = offsetData[placement];
19486    Object.keys(overflowOffsets).forEach(function (key) {
19487      var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
19488      var axis = [enums_top, bottom].indexOf(key) >= 0 ? 'y' : 'x';
19489      overflowOffsets[key] += offset[axis] * multiply;
19490    });
19491  }
19492
19493  return overflowOffsets;
19494}
19495;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js
19496
19497
19498
19499
19500function computeAutoPlacement(state, options) {
19501  if (options === void 0) {
19502    options = {};
19503  }
19504
19505  var _options = options,
19506      placement = _options.placement,
19507      boundary = _options.boundary,
19508      rootBoundary = _options.rootBoundary,
19509      padding = _options.padding,
19510      flipVariations = _options.flipVariations,
19511      _options$allowedAutoP = _options.allowedAutoPlacements,
19512      allowedAutoPlacements = _options$allowedAutoP === void 0 ? enums_placements : _options$allowedAutoP;
19513  var variation = getVariation(placement);
19514  var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {
19515    return getVariation(placement) === variation;
19516  }) : basePlacements;
19517  var allowedPlacements = placements.filter(function (placement) {
19518    return allowedAutoPlacements.indexOf(placement) >= 0;
19519  });
19520
19521  if (allowedPlacements.length === 0) {
19522    allowedPlacements = placements;
19523
19524    if (false) {}
19525  } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...
19526
19527
19528  var overflows = allowedPlacements.reduce(function (acc, placement) {
19529    acc[placement] = detectOverflow(state, {
19530      placement: placement,
19531      boundary: boundary,
19532      rootBoundary: rootBoundary,
19533      padding: padding
19534    })[getBasePlacement(placement)];
19535    return acc;
19536  }, {});
19537  return Object.keys(overflows).sort(function (a, b) {
19538    return overflows[a] - overflows[b];
19539  });
19540}
19541;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/flip.js
19542
19543
19544
19545
19546
19547
19548 // eslint-disable-next-line import/no-unused-modules
19549
19550function getExpandedFallbackPlacements(placement) {
19551  if (getBasePlacement(placement) === auto) {
19552    return [];
19553  }
19554
19555  var oppositePlacement = getOppositePlacement(placement);
19556  return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
19557}
19558
19559function flip(_ref) {
19560  var state = _ref.state,
19561      options = _ref.options,
19562      name = _ref.name;
19563
19564  if (state.modifiersData[name]._skip) {
19565    return;
19566  }
19567
19568  var _options$mainAxis = options.mainAxis,
19569      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
19570      _options$altAxis = options.altAxis,
19571      checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,
19572      specifiedFallbackPlacements = options.fallbackPlacements,
19573      padding = options.padding,
19574      boundary = options.boundary,
19575      rootBoundary = options.rootBoundary,
19576      altBoundary = options.altBoundary,
19577      _options$flipVariatio = options.flipVariations,
19578      flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,
19579      allowedAutoPlacements = options.allowedAutoPlacements;
19580  var preferredPlacement = state.options.placement;
19581  var basePlacement = getBasePlacement(preferredPlacement);
19582  var isBasePlacement = basePlacement === preferredPlacement;
19583  var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
19584  var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {
19585    return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {
19586      placement: placement,
19587      boundary: boundary,
19588      rootBoundary: rootBoundary,
19589      padding: padding,
19590      flipVariations: flipVariations,
19591      allowedAutoPlacements: allowedAutoPlacements
19592    }) : placement);
19593  }, []);
19594  var referenceRect = state.rects.reference;
19595  var popperRect = state.rects.popper;
19596  var checksMap = new Map();
19597  var makeFallbackChecks = true;
19598  var firstFittingPlacement = placements[0];
19599
19600  for (var i = 0; i < placements.length; i++) {
19601    var placement = placements[i];
19602
19603    var _basePlacement = getBasePlacement(placement);
19604
19605    var isStartVariation = getVariation(placement) === start;
19606    var isVertical = [enums_top, bottom].indexOf(_basePlacement) >= 0;
19607    var len = isVertical ? 'width' : 'height';
vendor: 14,091 bytes, lines 19608-20035
19608    var overflow = detectOverflow(state, {
19609      placement: placement,
19610      boundary: boundary,
19611      rootBoundary: rootBoundary,
19612      altBoundary: altBoundary,
19613      padding: padding
19614    });
19615    var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : enums_top;
19616
19617    if (referenceRect[len] > popperRect[len]) {
19618      mainVariationSide = getOppositePlacement(mainVariationSide);
19619    }
19620
19621    var altVariationSide = getOppositePlacement(mainVariationSide);
19622    var checks = [];
19623
19624    if (checkMainAxis) {
19625      checks.push(overflow[_basePlacement] <= 0);
19626    }
19627
19628    if (checkAltAxis) {
19629      checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
19630    }
19631
19632    if (checks.every(function (check) {
19633      return check;
19634    })) {
19635      firstFittingPlacement = placement;
19636      makeFallbackChecks = false;
19637      break;
19638    }
19639
19640    checksMap.set(placement, checks);
19641  }
19642
19643  if (makeFallbackChecks) {
19644    // `2` may be desired in some cases – research later
19645    var numberOfChecks = flipVariations ? 3 : 1;
19646
19647    var _loop = function _loop(_i) {
19648      var fittingPlacement = placements.find(function (placement) {
19649        var checks = checksMap.get(placement);
19650
19651        if (checks) {
19652          return checks.slice(0, _i).every(function (check) {
19653            return check;
19654          });
19655        }
19656      });
19657
19658      if (fittingPlacement) {
19659        firstFittingPlacement = fittingPlacement;
19660        return "break";
19661      }
19662    };
19663
19664    for (var _i = numberOfChecks; _i > 0; _i--) {
19665      var _ret = _loop(_i);
19666
19667      if (_ret === "break") break;
19668    }
19669  }
19670
19671  if (state.placement !== firstFittingPlacement) {
19672    state.modifiersData[name]._skip = true;
19673    state.placement = firstFittingPlacement;
19674    state.reset = true;
19675  }
19676} // eslint-disable-next-line import/no-unused-modules
19677
19678
19679/* harmony default export */ var modifiers_flip = ({
19680  name: 'flip',
19681  enabled: true,
19682  phase: 'main',
19683  fn: flip,
19684  requiresIfExists: ['offset'],
19685  data: {
19686    _skip: false
19687  }
19688});
19689;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/hide.js
19690
19691
19692
19693function getSideOffsets(overflow, rect, preventedOffsets) {
19694  if (preventedOffsets === void 0) {
19695    preventedOffsets = {
19696      x: 0,
19697      y: 0
19698    };
19699  }
19700
19701  return {
19702    top: overflow.top - rect.height - preventedOffsets.y,
19703    right: overflow.right - rect.width + preventedOffsets.x,
19704    bottom: overflow.bottom - rect.height + preventedOffsets.y,
19705    left: overflow.left - rect.width - preventedOffsets.x
19706  };
19707}
19708
19709function isAnySideFullyClipped(overflow) {
19710  return [enums_top, right, bottom, left].some(function (side) {
19711    return overflow[side] >= 0;
19712  });
19713}
19714
19715function hide(_ref) {
19716  var state = _ref.state,
19717      name = _ref.name;
19718  var referenceRect = state.rects.reference;
19719  var popperRect = state.rects.popper;
19720  var preventedOffsets = state.modifiersData.preventOverflow;
19721  var referenceOverflow = detectOverflow(state, {
19722    elementContext: 'reference'
19723  });
19724  var popperAltOverflow = detectOverflow(state, {
19725    altBoundary: true
19726  });
19727  var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
19728  var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
19729  var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
19730  var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
19731  state.modifiersData[name] = {
19732    referenceClippingOffsets: referenceClippingOffsets,
19733    popperEscapeOffsets: popperEscapeOffsets,
19734    isReferenceHidden: isReferenceHidden,
19735    hasPopperEscaped: hasPopperEscaped
19736  };
19737  state.attributes.popper = Object.assign({}, state.attributes.popper, {
19738    'data-popper-reference-hidden': isReferenceHidden,
19739    'data-popper-escaped': hasPopperEscaped
19740  });
19741} // eslint-disable-next-line import/no-unused-modules
19742
19743
19744/* harmony default export */ var modifiers_hide = ({
19745  name: 'hide',
19746  enabled: true,
19747  phase: 'main',
19748  requiresIfExists: ['preventOverflow'],
19749  fn: hide
19750});
19751;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/offset.js
19752
19753 // eslint-disable-next-line import/no-unused-modules
19754
19755function distanceAndSkiddingToXY(placement, rects, offset) {
19756  var basePlacement = getBasePlacement(placement);
19757  var invertDistance = [left, enums_top].indexOf(basePlacement) >= 0 ? -1 : 1;
19758
19759  var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {
19760    placement: placement
19761  })) : offset,
19762      skidding = _ref[0],
19763      distance = _ref[1];
19764
19765  skidding = skidding || 0;
19766  distance = (distance || 0) * invertDistance;
19767  return [left, right].indexOf(basePlacement) >= 0 ? {
19768    x: distance,
19769    y: skidding
19770  } : {
19771    x: skidding,
19772    y: distance
19773  };
19774}
19775
19776function offset(_ref2) {
19777  var state = _ref2.state,
19778      options = _ref2.options,
19779      name = _ref2.name;
19780  var _options$offset = options.offset,
19781      offset = _options$offset === void 0 ? [0, 0] : _options$offset;
19782  var data = enums_placements.reduce(function (acc, placement) {
19783    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);
19784    return acc;
19785  }, {});
19786  var _data$state$placement = data[state.placement],
19787      x = _data$state$placement.x,
19788      y = _data$state$placement.y;
19789
19790  if (state.modifiersData.popperOffsets != null) {
19791    state.modifiersData.popperOffsets.x += x;
19792    state.modifiersData.popperOffsets.y += y;
19793  }
19794
19795  state.modifiersData[name] = data;
19796} // eslint-disable-next-line import/no-unused-modules
19797
19798
19799/* harmony default export */ var modifiers_offset = ({
19800  name: 'offset',
19801  enabled: true,
19802  phase: 'main',
19803  requires: ['popperOffsets'],
19804  fn: offset
19805});
19806;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js
19807
19808
19809function popperOffsets(_ref) {
19810  var state = _ref.state,
19811      name = _ref.name;
19812  // Offsets are the actual position the popper needs to have to be
19813  // properly positioned near its reference element
19814  // This is the most basic placement, and will be adjusted by
19815  // the modifiers in the next step
19816  state.modifiersData[name] = computeOffsets({
19817    reference: state.rects.reference,
19818    element: state.rects.popper,
19819    strategy: 'absolute',
19820    placement: state.placement
19821  });
19822} // eslint-disable-next-line import/no-unused-modules
19823
19824
19825/* harmony default export */ var modifiers_popperOffsets = ({
19826  name: 'popperOffsets',
19827  enabled: true,
19828  phase: 'read',
19829  fn: popperOffsets,
19830  data: {}
19831});
19832;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getAltAxis.js
19833function getAltAxis(axis) {
19834  return axis === 'x' ? 'y' : 'x';
19835}
19836;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js
19837
19838
19839
19840
19841
19842
19843
19844
19845
19846
19847
19848
19849function preventOverflow(_ref) {
19850  var state = _ref.state,
19851      options = _ref.options,
19852      name = _ref.name;
19853  var _options$mainAxis = options.mainAxis,
19854      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
19855      _options$altAxis = options.altAxis,
19856      checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,
19857      boundary = options.boundary,
19858      rootBoundary = options.rootBoundary,
19859      altBoundary = options.altBoundary,
19860      padding = options.padding,
19861      _options$tether = options.tether,
19862      tether = _options$tether === void 0 ? true : _options$tether,
19863      _options$tetherOffset = options.tetherOffset,
19864      tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
19865  var overflow = detectOverflow(state, {
19866    boundary: boundary,
19867    rootBoundary: rootBoundary,
19868    padding: padding,
19869    altBoundary: altBoundary
19870  });
19871  var basePlacement = getBasePlacement(state.placement);
19872  var variation = getVariation(state.placement);
19873  var isBasePlacement = !variation;
19874  var mainAxis = getMainAxisFromPlacement(basePlacement);
19875  var altAxis = getAltAxis(mainAxis);
19876  var popperOffsets = state.modifiersData.popperOffsets;
19877  var referenceRect = state.rects.reference;
19878  var popperRect = state.rects.popper;
19879  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {
19880    placement: state.placement
19881  })) : tetherOffset;
19882  var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {
19883    mainAxis: tetherOffsetValue,
19884    altAxis: tetherOffsetValue
19885  } : Object.assign({
19886    mainAxis: 0,
19887    altAxis: 0
19888  }, tetherOffsetValue);
19889  var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
19890  var data = {
19891    x: 0,
19892    y: 0
19893  };
19894
19895  if (!popperOffsets) {
19896    return;
19897  }
19898
19899  if (checkMainAxis) {
19900    var _offsetModifierState$;
19901
19902    var mainSide = mainAxis === 'y' ? enums_top : left;
19903    var altSide = mainAxis === 'y' ? bottom : right;
19904    var len = mainAxis === 'y' ? 'height' : 'width';
19905    var offset = popperOffsets[mainAxis];
19906    var min = offset + overflow[mainSide];
19907    var max = offset - overflow[altSide];
19908    var additive = tether ? -popperRect[len] / 2 : 0;
19909    var minLen = variation === start ? referenceRect[len] : popperRect[len];
19910    var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go
19911    // outside the reference bounds
19912
19913    var arrowElement = state.elements.arrow;
19914    var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
19915      width: 0,
19916      height: 0
19917    };
19918    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();
19919    var arrowPaddingMin = arrowPaddingObject[mainSide];
19920    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want
19921    // to include its full size in the calculation. If the reference is small
19922    // and near the edge of a boundary, the popper can overflow even if the
19923    // reference is not overflowing as well (e.g. virtual elements with no
19924    // width or height)
19925
19926    var arrowLen = within(0, referenceRect[len], arrowRect[len]);
19927    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
19928    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
19929    var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
19930    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
19931    var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
19932    var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;
19933    var tetherMax = offset + maxOffset - offsetModifierValue;
19934    var preventedOffset = within(tether ? math_min(min, tetherMin) : min, offset, tether ? math_max(max, tetherMax) : max);
19935    popperOffsets[mainAxis] = preventedOffset;
19936    data[mainAxis] = preventedOffset - offset;
19937  }
19938
19939  if (checkAltAxis) {
19940    var _offsetModifierState$2;
19941
19942    var _mainSide = mainAxis === 'x' ? enums_top : left;
19943
19944    var _altSide = mainAxis === 'x' ? bottom : right;
19945
19946    var _offset = popperOffsets[altAxis];
19947
19948    var _len = altAxis === 'y' ? 'height' : 'width';
19949
19950    var _min = _offset + overflow[_mainSide];
19951
19952    var _max = _offset - overflow[_altSide];
19953
19954    var isOriginSide = [enums_top, left].indexOf(basePlacement) !== -1;
19955
19956    var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
19957
19958    var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
19959
19960    var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
19961
19962    var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
19963
19964    popperOffsets[altAxis] = _preventedOffset;
19965    data[altAxis] = _preventedOffset - _offset;
19966  }
19967
19968  state.modifiersData[name] = data;
19969} // eslint-disable-next-line import/no-unused-modules
19970
19971
19972/* harmony default export */ var modifiers_preventOverflow = ({
19973  name: 'preventOverflow',
19974  enabled: true,
19975  phase: 'main',
19976  fn: preventOverflow,
19977  requiresIfExists: ['offset']
19978});
19979;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/index.js
19980
19981
19982
19983
19984
19985
19986
19987
19988
19989;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js
19990function getHTMLElementScroll(element) {
19991  return {
19992    scrollLeft: element.scrollLeft,
19993    scrollTop: element.scrollTop
19994  };
19995}
19996;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js
19997
19998
19999
20000
20001function getNodeScroll(node) {
20002  if (node === getWindow(node) || !isHTMLElement(node)) {
20003    return getWindowScroll(node);
20004  } else {
20005    return getHTMLElementScroll(node);
20006  }
20007}
20008;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js
20009
20010
20011
20012
20013
20014
20015
20016
20017
20018function isElementScaled(element) {
20019  var rect = element.getBoundingClientRect();
20020  var scaleX = round(rect.width) / element.offsetWidth || 1;
20021  var scaleY = round(rect.height) / element.offsetHeight || 1;
20022  return scaleX !== 1 || scaleY !== 1;
20023} // Returns the composite rect of an element relative to its offsetParent.
20024// Composite means it takes into account transforms as well as layout.
20025
20026
20027function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
20028  if (isFixed === void 0) {
20029    isFixed = false;
20030  }
20031
20032  var isOffsetParentAnElement = isHTMLElement(offsetParent);
20033  var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
20034  var documentElement = getDocumentElement(offsetParent);
20035  var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled
vendor: 13,030 bytes, lines 20035-20438
20035);
20036  var scroll = {
20037    scrollLeft: 0,
20038    scrollTop: 0
20039  };
20040  var offsets = {
20041    x: 0,
20042    y: 0
20043  };
20044
20045  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
20046    if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078
20047    isScrollParent(documentElement)) {
20048      scroll = getNodeScroll(offsetParent);
20049    }
20050
20051    if (isHTMLElement(offsetParent)) {
20052      offsets = getBoundingClientRect(offsetParent, true);
20053      offsets.x += offsetParent.clientLeft;
20054      offsets.y += offsetParent.clientTop;
20055    } else if (documentElement) {
20056      offsets.x = getWindowScrollBarX(documentElement);
20057    }
20058  }
20059
20060  return {
20061    x: rect.left + scroll.scrollLeft - offsets.x,
20062    y: rect.top + scroll.scrollTop - offsets.y,
20063    width: rect.width,
20064    height: rect.height
20065  };
20066}
20067;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/orderModifiers.js
20068 // source: https://stackoverflow.com/questions/49875255
20069
20070function order(modifiers) {
20071  var map = new Map();
20072  var visited = new Set();
20073  var result = [];
20074  modifiers.forEach(function (modifier) {
20075    map.set(modifier.name, modifier);
20076  }); // On visiting object, check for its dependencies and visit them recursively
20077
20078  function sort(modifier) {
20079    visited.add(modifier.name);
20080    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
20081    requires.forEach(function (dep) {
20082      if (!visited.has(dep)) {
20083        var depModifier = map.get(dep);
20084
20085        if (depModifier) {
20086          sort(depModifier);
20087        }
20088      }
20089    });
20090    result.push(modifier);
20091  }
20092
20093  modifiers.forEach(function (modifier) {
20094    if (!visited.has(modifier.name)) {
20095      // check for visited object
20096      sort(modifier);
20097    }
20098  });
20099  return result;
20100}
20101
20102function orderModifiers(modifiers) {
20103  // order based on dependencies
20104  var orderedModifiers = order(modifiers); // order based on phase
20105
20106  return modifierPhases.reduce(function (acc, phase) {
20107    return acc.concat(orderedModifiers.filter(function (modifier) {
20108      return modifier.phase === phase;
20109    }));
20110  }, []);
20111}
20112;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/debounce.js
20113function debounce(fn) {
20114  var pending;
20115  return function () {
20116    if (!pending) {
20117      pending = new Promise(function (resolve) {
20118        Promise.resolve().then(function () {
20119          pending = undefined;
20120          resolve(fn());
20121        });
20122      });
20123    }
20124
20125    return pending;
20126  };
20127}
20128;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/mergeByName.js
20129function mergeByName(modifiers) {
20130  var merged = modifiers.reduce(function (merged, current) {
20131    var existing = merged[current.name];
20132    merged[current.name] = existing ? Object.assign({}, existing, current, {
20133      options: Object.assign({}, existing.options, current.options),
20134      data: Object.assign({}, existing.data, current.data)
20135    }) : current;
20136    return merged;
20137  }, {}); // IE11 does not support Object.values
20138
20139  return Object.keys(merged).map(function (key) {
20140    return merged[key];
20141  });
20142}
20143;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/createPopper.js
20144
20145
20146
20147
20148
20149
20150
20151
20152
20153
20154
20155
20156
20157
20158var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';
20159var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';
20160var DEFAULT_OPTIONS = {
20161  placement: 'bottom',
20162  modifiers: [],
20163  strategy: 'absolute'
20164};
20165
20166function areValidElements() {
20167  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
20168    args[_key] = arguments[_key];
20169  }
20170
20171  return !args.some(function (element) {
20172    return !(element && typeof element.getBoundingClientRect === 'function');
20173  });
20174}
20175
20176function popperGenerator(generatorOptions) {
20177  if (generatorOptions === void 0) {
20178    generatorOptions = {};
20179  }
20180
20181  var _generatorOptions = generatorOptions,
20182      _generatorOptions$def = _generatorOptions.defaultModifiers,
20183      defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,
20184      _generatorOptions$def2 = _generatorOptions.defaultOptions,
20185      defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
20186  return function createPopper(reference, popper, options) {
20187    if (options === void 0) {
20188      options = defaultOptions;
20189    }
20190
20191    var state = {
20192      placement: 'bottom',
20193      orderedModifiers: [],
20194      options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
20195      modifiersData: {},
20196      elements: {
20197        reference: reference,
20198        popper: popper
20199      },
20200      attributes: {},
20201      styles: {}
20202    };
20203    var effectCleanupFns = [];
20204    var isDestroyed = false;
20205    var instance = {
20206      state: state,
20207      setOptions: function setOptions(setOptionsAction) {
20208        var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;
20209        cleanupModifierEffects();
20210        state.options = Object.assign({}, defaultOptions, state.options, options);
20211        state.scrollParents = {
20212          reference: instanceOf_isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],
20213          popper: listScrollParents(popper)
20214        }; // Orders the modifiers based on their dependencies and `phase`
20215        // properties
20216
20217        var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers
20218
20219        state.orderedModifiers = orderedModifiers.filter(function (m) {
20220          return m.enabled;
20221        }); // Validate the provided modifiers so that the consumer will get warned
20222        // if one of the modifiers is invalid for any reason
20223
20224        if (false) { var _getComputedStyle, marginTop, marginRight, marginBottom, marginLeft, flipModifier, modifiers; }
20225
20226        runModifierEffects();
20227        return instance.update();
20228      },
20229      // Sync update – it will always be executed, even if not necessary. This
20230      // is useful for low frequency updates where sync behavior simplifies the
20231      // logic.
20232      // For high frequency updates (e.g. `resize` and `scroll` events), always
20233      // prefer the async Popper#update method
20234      forceUpdate: function forceUpdate() {
20235        if (isDestroyed) {
20236          return;
20237        }
20238
20239        var _state$elements = state.elements,
20240            reference = _state$elements.reference,
20241            popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements
20242        // anymore
20243
20244        if (!areValidElements(reference, popper)) {
20245          if (false) {}
20246
20247          return;
20248        } // Store the reference and popper rects to be read by modifiers
20249
20250
20251        state.rects = {
20252          reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),
20253          popper: getLayoutRect(popper)
20254        }; // Modifiers have the ability to reset the current update cycle. The
20255        // most common use case for this is the `flip` modifier changing the
20256        // placement, which then needs to re-run all the modifiers, because the
20257        // logic was previously ran for the previous placement and is therefore
20258        // stale/incorrect
20259
20260        state.reset = false;
20261        state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier
20262        // is filled with the initial data specified by the modifier. This means
20263        // it doesn't persist and is fresh on each update.
20264        // To ensure persistent data, use `${name}#persistent`
20265
20266        state.orderedModifiers.forEach(function (modifier) {
20267          return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
20268        });
20269        var __debug_loops__ = 0;
20270
20271        for (var index = 0; index < state.orderedModifiers.length; index++) {
20272          if (false) {}
20273
20274          if (state.reset === true) {
20275            state.reset = false;
20276            index = -1;
20277            continue;
20278          }
20279
20280          var _state$orderedModifie = state.orderedModifiers[index],
20281              fn = _state$orderedModifie.fn,
20282              _state$orderedModifie2 = _state$orderedModifie.options,
20283              _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,
20284              name = _state$orderedModifie.name;
20285
20286          if (typeof fn === 'function') {
20287            state = fn({
20288              state: state,
20289              options: _options,
20290              name: name,
20291              instance: instance
20292            }) || state;
20293          }
20294        }
20295      },
20296      // Async and optimistically optimized update – it will not be executed if
20297      // not necessary (debounced to run at most once-per-tick)
20298      update: debounce(function () {
20299        return new Promise(function (resolve) {
20300          instance.forceUpdate();
20301          resolve(state);
20302        });
20303      }),
20304      destroy: function destroy() {
20305        cleanupModifierEffects();
20306        isDestroyed = true;
20307      }
20308    };
20309
20310    if (!areValidElements(reference, popper)) {
20311      if (false) {}
20312
20313      return instance;
20314    }
20315
20316    instance.setOptions(options).then(function (state) {
20317      if (!isDestroyed && options.onFirstUpdate) {
20318        options.onFirstUpdate(state);
20319      }
20320    }); // Modifiers have the ability to execute arbitrary code before the first
20321    // update cycle runs. They will be executed in the same order as the update
20322    // cycle. This is useful when a modifier adds some persistent data that
20323    // other modifiers need to use, but the modifier is run after the dependent
20324    // one.
20325
20326    function runModifierEffects() {
20327      state.orderedModifiers.forEach(function (_ref3) {
20328        var name = _ref3.name,
20329            _ref3$options = _ref3.options,
20330            options = _ref3$options === void 0 ? {} : _ref3$options,
20331            effect = _ref3.effect;
20332
20333        if (typeof effect === 'function') {
20334          var cleanupFn = effect({
20335            state: state,
20336            name: name,
20337            instance: instance,
20338            options: options
20339          });
20340
20341          var noopFn = function noopFn() {};
20342
20343          effectCleanupFns.push(cleanupFn || noopFn);
20344        }
20345      });
20346    }
20347
20348    function cleanupModifierEffects() {
20349      effectCleanupFns.forEach(function (fn) {
20350        return fn();
20351      });
20352      effectCleanupFns = [];
20353    }
20354
20355    return instance;
20356  };
20357}
20358var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules
20359
20360
20361;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/popper.js
20362
20363
20364
20365
20366
20367
20368
20369
20370
20371
20372var defaultModifiers = [eventListeners, modifiers_popperOffsets, modifiers_computeStyles, modifiers_applyStyles, modifiers_offset, modifiers_flip, modifiers_preventOverflow, modifiers_arrow, modifiers_hide];
20373var popper_createPopper = /*#__PURE__*/popperGenerator({
20374  defaultModifiers: defaultModifiers
20375}); // eslint-disable-next-line import/no-unused-modules
20376
20377 // eslint-disable-next-line import/no-unused-modules
20378
20379 // eslint-disable-next-line import/no-unused-modules
20380
20381
20382;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/popper-lite.js
20383
20384
20385
20386
20387
20388var popper_lite_defaultModifiers = [eventListeners, modifiers_popperOffsets, modifiers_computeStyles, modifiers_applyStyles];
20389var popper_lite_createPopper = /*#__PURE__*/popperGenerator({
20390  defaultModifiers: popper_lite_defaultModifiers
20391}); // eslint-disable-next-line import/no-unused-modules
20392
20393
20394;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/index.js
20395
20396 // eslint-disable-next-line import/no-unused-modules
20397
20398 // eslint-disable-next-line import/no-unused-modules
20399
20400 // eslint-disable-next-line import/no-unused-modules
20401
20402
20403;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/sanitizer.js
20404/**
20405 * --------------------------------------------------------------------------
20406 * Bootstrap (v5.1.3): util/sanitizer.js
20407 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
20408 * --------------------------------------------------------------------------
20409 */
20410
20411const uriAttributes = new Set([
20412  'background',
20413  'cite',
20414  'href',
20415  'itemtype',
20416  'longdesc',
20417  'poster',
20418  'src',
20419  'xlink:href'
20420])
20421
20422const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
20423
20424/**
20425 * A pattern that recognizes a commonly useful subset of URLs that are safe.
20426 *
20427 * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
20428 */
20429const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i
20430
20431/**
20432 * A pattern that matches safe data URLs. Only matches image, video and audio types.
20433 *
20434 * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
20435 */
20436const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i
20437
20438const allowedAttribute = (attribute, allowedAttributeList) => {
20439  const attributeName = attribute.nodeName.toLowerCase()
20440
20441  if (allowedAttributeList.includes(attributeName)) {
20442    if (uriAttributes.has(attributeName)) {
20443      return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue))
20444    }
20445
20446    return true
20447  }
20448
20449  const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)
20450
20451  // Check if a regular expression validates the attribute.
20452  for (let i = 0, len = regExp.length; i < len; i++) {
20453    if (regExp[i].test(attributeName)) {
20454      return true
20455    }
20456  }
20457
20458  return false
20459}
20460
20461const DefaultAllowlist = {
20462  // Global attributes allowed on any supplied element below.
20463  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
20464  a: ['target', 'href', 'title', 'rel'],
20465  area: [],
20466  b: [],
20467  br: [],
20468  col: [],
20469  code: [],
20470  div: [],
20471  em: [],
20472  hr: [],
20473  h1: [],
20474  h2: [],
20475  h3: [],
20476  h4: [],
20477  h5: [],
20478  h6: [],
20479  i: [],
20480  img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
20481  li: [],
20482  ol: [],
20483  p: [],
20484  pre: [],
20485  s: [],
20486  small: [],
20487  span: [],
20488  sub: [],
20489  sup: [],
20490  strong: [],
20491  u: [],
20492  ul: []
20493}
20494
20495function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {
20496  if (!unsafeHtml.length) {
20497    return unsafeHtml
20498  }
20499
20500  if (sanitizeFn && typeof sanitizeFn === 'function') {
20501    return sanitizeFn(unsafeHtml)
20502  }
20503
20504  const domParser = new window.DOMParser()
20505  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')
20506  const elements = [].concat(...createdDocument.body.querySelectorAll('*'))
20507
20508  for (let i = 0, len = elements.length; i < len; i++) {
20509    const element = elements[i]
20510    const elementName = element.nodeName.toLowerCase()
20511
20512    if (!Object.keys(allowList).includes(elementName)) {
20513      element.remove()
20514
20515      continue
20516    }
20517
20518    const attributeList = [].concat(...element.attributes)
20519    const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])
20520
20521    attributeList.forEach(attribute => {
20522      if (!allowedAttribute(attribute, allowedAttributes)) {
20523        element.removeAttribute(attribute.nodeName)
20524      }
20525    })
20526  }
20527
20528  return createdDocument.body.innerHTML
20529}
20530
20531;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/tooltip.js
20532/**
20533 * --------------------------------------------------------------------------
20534 * Bootstrap (v5.1.3): tooltip.js
20535 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
20536 * --------------------------------------------------------------------------
20537 */
20538
20539
20540
20541
20542
20543
20544
20545
20546
20547
20548
20549/**
20550 * ------------------------------------------------------------------------
20551 * Constants
20552 * ------------------------------------------------------------------------
20553 */
20554
20555const tooltip_NAME = 'tooltip'
20556const tooltip_DATA_KEY = 'bs.tooltip'
20557const tooltip_EVENT_KEY = `.${tooltip_DATA_KEY}`
20558const CLASS_PREFIX = 'bs-tooltip'
20559const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])
20560
20561const tooltip_DefaultType = {
20562  animation: 'boolean',
20563  template: 'string',
20564  title: '(string|element|function)',
20565  trigger: 'string',
20566  delay: '(number|object)',
20567  html: 'boolean',
20568  selector: '(string|boolean)',
20569  placement: '(string|function)',
20570  offset: '(array|string|function)',
20571  container: '(string|element|boolean)',
20572  fallbackPlacements: 'array',
20573  boundary: '(string|element)',
20574  customClass: '(string|function)',
20575  sanitize: 'boolean',
20576  sanitizeFn: '(null|function)',
20577  allowList: 'object',
20578  popperConfig: '(null|object|function)'
20579}
20580
20581const AttachmentMap = {
20582  AUTO: 'auto',
20583  TOP: 'top',
20584  RIGHT: isRTL() ? 'left' : 'right',
20585  BOTTOM: 'bottom',
20586  LEFT: isRTL() ? 'right' : 'left'
20587}
20588
20589const tooltip_Default = {
20590  animation: true,
20591  template: '<div class="tooltip" role="tooltip">' +
20592              '<div class="tooltip-arrow"></div>' +
20593              '<div class="tooltip-inner"></div>' +
20594            '</div>',
20595  trigger: 'hover focus',
20596  title: '',
20597  delay: 0,
20598  html: false,
20599  selector: false,
20600  placement: 'top',
20601  offset: [0, 0],
20602  container: false,
20603  fallbackPlacements: ['top', 'right', 'bottom', 'left'],
20604  boundary: 'clippingParents',
20605  customClass: '',
20606  sanitize: true,
20607  sanitizeFn: null,
20608  allowList: DefaultAllowlist,
20609  popperConfig: null
20610}
20611
20612const tooltip_Event = {
20613  HIDE: `hide${tooltip_EVENT_KEY}`,
20614  HIDDEN: `hidden${tooltip_EVENT_KEY}`,
20615  SHOW: `show${tooltip_EVENT_KEY}`,
20616  SHOWN: `shown${tooltip_EVENT_KEY}`,
20617  INSERTED: `inserted${tooltip_EVENT_KEY}`,
20618  CLICK: `click${tooltip_EVENT_KEY}`,
20619  FOCUSIN: `focusin${tooltip_EVENT_KEY}`,
20620  FOCUSOUT: `focusout${tooltip_EVENT_KEY}`,
20621  MOUSEENTER: `mouseenter${tooltip_EVENT_KEY}`,
20622  MOUSELEAVE: `mouseleave${tooltip_EVENT_KEY}`
20623}
20624
20625const CLASS_NAME_FADE = 'fade'
20626const CLASS_NAME_MODAL = 'modal'
20627const tooltip_CLASS_NAME_SHOW = 'show'
20628
20629const HOVER_STATE_SHOW = 'show'
20630const HOVER_STATE_OUT = 'out'
20631
20632const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'
20633const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`
20634
20635const EVENT_MODAL_HIDE = 'hide.bs.modal'
20636
20637const TRIGGER_HOVER = 'hover'
20638const TRIGGER_FOCUS = 'focus'
20639const TRIGGER_CLICK = 'click'
20640const TRIGGER_MANUAL = 'manual'
20641
20642/**
20643 * ------------------------------------------------------------------------
20644 * Class Definition
20645 * ------------------------------------------------------------------------
20646 */
20647
20648class Tooltip extends base_component {
20649  constructor(element, config) {
20650    if (typeof lib_namespaceObject === 'undefined') {
20651      throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)')
20652    }
20653
20654    super(element)
20655
20656    // private
20657    this._isEnabled = true
20658    this._timeout = 0
20659    this._hoverState = ''
20660    this._activeTrigger = {}
20661    this._popper = null
20662
20663    // Protected
20664    this._config = this._getConfig(config)
20665    this.tip = null
20666
20667    this._setListeners()
20668  }
20669
20670  // Getters
20671
20672  static get Default() {
20673    return tooltip_Default
20674  }
20675
20676  static get NAME() {
20677    return tooltip_NAME
20678  }
20679
20680  static get Event() {
20681    return tooltip_Event
20682  }
20683
20684  static get DefaultType() {
20685    return tooltip_DefaultType
20686  }
20687
20688  // Public
20689
20690  enable() {
20691    this._isEnabled = true
20692  }
20693
20694  disable() {
20695    this._isEnabled = false
20696  }
20697
20698  toggleEnabled() {
20699    this._isEnabled = !this._isEnabled
20700  }
20701
20702  toggle(event) {
20703    if (!this._isEnabled) {
20704      return
20705    }
20706
20707    if (event) {
20708      const context = this._initializeOnDelegatedTarget(event)
20709
20710      context._activeTrigger.click = !context._activeTrigger.click
20711
20712      if (context._isWithActiveTrigger()) {
20713        context._enter(null, context)
20714      } else {
20715        context._leave(null, context)
20716      }
20717    } else {
20718      if (this.getTipElement().classList.contains(tooltip_CLASS_NAME_SHOW)) {
20719        this._leave(null, this)
20720        return
20721      }
20722
20723      this._enter(null, this)
20724    }
20725  }
20726
20727  dispose() {
20728    clearTimeout(this._timeout)
20729
20730    event_handler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)
20731
20732    if (this.tip) {
20733      this.tip.remove()
20734    }
20735
20736    this._disposePopper()
20737    super.dispose()
20738  }
20739
20740  show() {
20741    if (this._element.style.display === 'none') {
20742      throw new Error('Please use show on visible elements')
20743    }
20744
20745    if (!(this.isWithContent() && this._isEnabled)) {
20746      return
20747    }
20748
20749    const showEvent = event_handler.trigger(this._element, this.constructor.Event.SHOW)
20750    const shadowRoot = findShadowRoot(this._element)
20751    const isInTheDom = shadowRoot === null ?
20752      this._element.ownerDocument.documentElement.contains(this._element) :
20753      shadowRoot.contains(this._element)
20754
20755    if (showEvent.defaultPrevented || !isInTheDom) {
20756      return
20757    }
20758
20759    // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`
20760    // This will be removed later in favor of a `setContent` method
20761    if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {
20762      this._disposePopper()
20763      this.tip.remove()
20764      this.tip = null
20765    }
20766
20767    const tip = this.getTipElement()
20768    const tipId = getUID(this.constructor.NAME)
20769
20770    tip.setAttribute('id', tipId)
20771    this._element.setAttribute('aria-describedby', tipId)
20772
20773    if (this._config.animation) {
20774      tip.classList.add(CLASS_NAME_FADE)
20775    }
20776
20777    const placement = typeof this._config.placement === 'function' ?
20778      this._config.placement.call(this, tip, this._element) :
20779      this._config.placement
20780
20781    const attachment = this._getAttachment(placement)
20782    this._addAttachmentClass(attachment)
20783
20784    const { container } = this._config
20785    data.set(tip, this.constructor.DATA_KEY, this)
20786
20787    if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
20788      container.append(tip)
20789      event_handler.trigger(this._element, this.constructor.Event.INSERTED)
20790    }
20791
20792    if (this._popper) {
20793      this._popper.update()
20794    } else {
20795      this._popper = popper_createPopper(this._element, tip, this._getPopperConfig(attachment))
20796    }
20797
20798    tip.classList.add(tooltip_CLASS_NAME_SHOW)
20799
20800    const customClass = this._resolvePossibleFunction(this._config.customClass)
20801    if (customClass) {
20802      tip.classList.add(...customClass.split(' '))
20803    }
20804
20805    // If this is a touch-enabled device we add extra
20806    // empty mouseover listeners to the body's immediate children;
20807    // only needed because of broken event delegation on iOS
20808    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
20809    if ('ontouchstart' in document.documentElement) {
20810      [].concat(...document.body.children).forEach(element => {
20811        event_handler.on(element, 'mouseover', noop)
20812      })
20813    }
20814
20815    const complete = () => {
20816      const prevHoverState = this._hoverState
20817
20818      this._hoverState = null
20819      event_handler.trigger(this._element, this.constructor.Event.SHOWN)
20820
20821      if (prevHoverState === HOVER_STATE_OUT) {
20822        this._leave(null, this)
20823      }
20824    }
20825
20826    const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)
20827    this._queueCallback(complete, this.tip, isAnimated)
20828  }
20829
20830  hide() {
20831    if (!this._popper) {
20832      return
20833    }
20834
20835    const tip = this.getTipElement()
20836    const complete = () => {
20837      if (this._isWithActiveTrigger()) {
20838        return
20839      }
20840
20841      if (this._hoverState !== HOVER_STATE_SHOW) {
20842        tip.remove()
20843      }
20844
20845      this._cleanTipClass()
20846      this._element.removeAttribute('aria-describedby')
20847      event_handler.trigger(this._element, this.constructor.Event.HIDDEN)
20848
20849      this._disposePopper()
20850    }
20851
20852    const hideEvent = event_handler.trigger(this._element, this.constructor.Event.HIDE)
20853    if (hideEvent.defaultPrevented) {
20854      return
20855    }
20856
20857    tip.classList.remove(tooltip_CLASS_NAME_SHOW)
20858
20859    // If this is a touch-enabled device we remove the extra
20860    // empty mouseover listeners we added for iOS support
20861    if ('ontouchstart' in document.documentElement) {
20862      [].concat(...document.body.children)
20863        .forEach(element => event_handler.off(element, 'mouseover', noop))
20864    }
20865
20866    this._activeTrigger[TRIGGER_CLICK] = false
20867    this._activeTrigger[TRIGGER_FOCUS] = false
20868    this._activeTrigger[TRIGGER_HOVER] = false
20869
20870    const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)
20871    this._queueCallback(complete, this.tip, isAnimated)
20872    this._hoverState = ''
20873  }
20874
20875  update() {
20876    if (this._popper !== null) {
20877      this._popper.update()
20878    }
20879  }
20880
20881  // Protected
20882
20883  isWithContent() {
20884    return Boolean(this.getTitle())
20885  }
20886
20887  getTipElement() {
20888    if (this.tip) {
20889      return this.tip
20890    }
20891
20892    const element = document.createElement('div')
20893    element.innerHTML = this._config.template
20894
20895    const tip = element.children[0]
20896    this.setContent(tip)
20897    tip.classList.remove(CLASS_NAME_FADE, tooltip_CLASS_NAME_SHOW)
20898
20899    this.tip = tip
20900    return this.tip
20901  }
20902
20903  setContent(tip) {
20904    this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)
20905  }
20906
20907  _sanitizeAndSetContent(template, content, selector) {
20908    const templateElement = selector_engine.findOne(selector, template)
20909
20910    if (!content && templateElement) {
20911      templateElement.remove()
20912      return
20913    }
20914
20915    // we use append for html objects to maintain js events
20916    this.setElementContent(templateElement, content)
20917  }
20918
20919  setElementContent(element, content) {
20920    if (element === null) {
20921      return
20922    }
20923
20924    if (isElement(content)) {
20925      content = getElement(content)
20926
20927      // content is a DOM node or a jQuery
20928      if (this._config.html) {
20929        if (content.parentNode !== element) {
20930          element.innerHTML = ''
20931          element.append(content)
20932        }
20933      } else {
20934        element.textContent = content.textContent
20935      }
20936
20937      return
20938    }
20939
20940    if (this._config.html) {
20941      if (this._config.sanitize) {
20942        content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)
20943      }
20944
20945      element.innerHTML = content
20946    } else {
20947      element.textContent = content
20948    }
20949  }
20950
20951  getTitle() {
20952    const title = this._element.getAttribute('data-bs-original-title') || this._config.title
20953
20954    return this._resolvePossibleFunction(title)
20955  }
20956
20957  updateAttachment(attachment) {
20958    if (attachment === 'right') {
20959      return 'end'
20960    }
20961
20962    if (attachment === 'left') {
20963      return 'start'
20964    }
20965
20966    return attachment
20967  }
20968
20969  // Private
20970
20971  _initializeOnDelegatedTarget(event, context) {
20972    return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())
20973  }
20974
20975  _getOffset() {
20976    const { offset } = this._config
20977
20978    if (typeof offset === 'string') {
20979      return offset.split(',').map(val => Number.parseInt(val, 10))
20980    }
20981
20982    if (typeof offset === 'function') {
20983      return popperData => offset(popperData, this._element)
20984    }
20985
20986    return offset
20987  }
20988
20989  _resolvePossibleFunction(content) {
20990    return typeof content === 'function' ? content.call(this._element) : content
20991  }
20992
20993  _getPopperConfig(attachment) {
20994    const defaultBsPopperConfig = {
20995      placement: attachment,
20996      modifiers: [
20997        {
20998          name: 'flip',
20999          options: {
21000            fallbackPlacements: this._config.fallbackPlacements
21001          }
21002        },
21003        {
21004          name: 'offset',
21005          options: {
21006            offset: this._getOffset()
21007          }
21008        },
21009        {
21010          name: 'preventOverflow',
21011          options: {
21012            boundary: this._config.boundary
21013          }
21014        },
21015        {
21016          name: 'arrow',
21017          options: {
21018            element: `.${this.constructor.NAME}-arrow`
21019          }
21020        },
21021        {
21022          name: 'onChange',
21023          enabled: true,
21024          phase: 'afterWrite',
21025          fn: data => this._handlePopperPlacementChange(data)
21026        }
21027      ],
21028      onFirstUpdate: data => {
21029        if (data.options.placement !== data.placement) {
21030          this._handlePopperPlacementChange(data)
21031        }
21032      }
21033    }
21034
21035    return {
21036      ...defaultBsPopperConfig,
21037      ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
21038    }
21039  }
21040
21041  _addAttachmentClass(attachment) {
21042    this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`)
21043  }
21044
21045  _getAttachment(placement) {
21046    return AttachmentMap[placement.toUpperCase()]
21047  }
21048
21049  _setListeners() {
21050    const triggers = this._config.trigger.split(' ')
21051
21052    triggers.forEach(trigger => {
21053      if (trigger === 'click') {
21054        event_handler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))
21055      } else if (trigger !== TRIGGER_MANUAL) {
21056        const eventIn = trigger === TRIGGER_HOVER ?
21057          this.constructor.Event.MOUSEENTER :
21058          this.constructor.Event.FOCUSIN
21059        const eventOut = trigger === TRIGGER_HOVER ?
21060          this.constructor.Event.MOUSELEAVE :
21061          this.constructor.Event.FOCUSOUT
21062
21063        event_handler.on(this._element, eventIn, this._config.selector, event => this._enter(event))
21064        event_handler.on(this._element, eventOut, this._config.selector, event => this._leave(event))
21065      }
21066    })
21067
21068    this._hideModalHandler = () => {
21069      if (this._element) {
21070        this.hide()
21071      }
21072    }
21073
21074    event_handler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)
21075
21076    if (this._config.selector) {
21077      this._config = {
21078        ...this._config,
21079        trigger: 'manual',
21080        selector: ''
21081      }
21082    } else {
21083      this._fixTitle()
21084    }
21085  }
21086
21087  _fixTitle() {
21088    const title = this._element.getAttribute('title')
21089    const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')
21090
21091    if (title || originalTitleType !== 'string') {
21092      this._element.setAttribute('data-bs-original-title', title || '')
21093      if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {
21094        this._element.setAttribute('aria-label', title)
21095      }
21096
21097      this._element.setAttribute('title', '')
21098    }
21099  }
21100
21101  _enter(event, context) {
21102    context = this._initializeOnDelegatedTarget(event, context)
21103
21104    if (event) {
21105      context._activeTrigger[
21106        event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER
21107      ] = true
21108    }
21109
21110    if (context.getTipElement().classList.contains(tooltip_CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {
21111      context._hoverState = HOVER_STATE_SHOW
21112      return
21113    }
21114
21115    clearTimeout(context._timeout)
21116
21117    context._hoverState = HOVER_STATE_SHOW
21118
21119    if (!context._config.delay || !context._config.delay.show) {
21120      context.show()
21121      return
21122    }
21123
21124    context._timeout = setTimeout(() => {
21125      if (context._hoverState === HOVER_STATE_SHOW) {
21126        context.show()
21127      }
21128    }, context._config.delay.show)
21129  }
21130
21131  _leave(event, context) {
21132    context = this._initializeOnDelegatedTarget(event, context)
21133
21134    if (event) {
21135      context._activeTrigger[
21136        event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER
21137      ] = context._element.contains(event.relatedTarget)
21138    }
21139
21140    if (context._isWithActiveTrigger()) {
21141      return
21142    }
21143
21144    clearTimeout(context._timeout)
21145
21146    context._hoverState = HOVER_STATE_OUT
21147
21148    if (!context._config.delay || !context._config.delay.hide) {
21149      context.hide()
21150      return
21151    }
21152
21153    context._timeout = setTimeout(() => {
21154      if (context._hoverState === HOVER_STATE_OUT) {
21155        context.hide()
21156      }
21157    }, context._config.delay.hide)
21158  }
21159
21160  _isWithActiveTrigger() {
21161    for (const trigger in this._activeTrigger) {
21162      if (this._activeTrigger[trigger]) {
21163        return true
21164      }
21165    }
21166
21167    return false
21168  }
21169
21170  _getConfig(config) {
21171    const dataAttributes = manipulator.getDataAttributes(this._element)
21172
21173    Object.keys(dataAttributes).forEach(dataAttr => {
21174      if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {
21175        delete dataAttributes[dataAttr]
21176      }
21177    })
21178
21179    config = {
21180      ...this.constructor.Default,
21181      ...dataAttributes,
21182      ...(typeof config === 'object' && config ? config : {})
21183    }
21184
21185    config.container = config.container === false ? document.body : getElement(config.container)
21186
21187    if (typeof config.delay === 'number') {
21188      config.delay = {
21189        show: config.delay,
21190        hide: config.delay
21191      }
21192    }
21193
21194    if (typeof config.title === 'number') {
21195      config.title = config.title.toString()
21196    }
21197
21198    if (typeof config.content === 'number') {
21199      config.content = config.content.toString()
21200    }
21201
21202    typeCheckConfig(tooltip_NAME, config, this.constructor.DefaultType)
21203
21204    if (config.sanitize) {
21205      config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)
21206    }
21207
21208    return config
21209  }
21210
21211  _getDelegateConfig() {
21212    const config = {}
21213
21214    for (const key in this._config) {
21215      if (this.constructor.Default[key] !== this._config[key]) {
21216        config[key] = this._config[key]
21217      }
21218    }
21219
21220    // In the future can be replaced with:
21221    // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
21222    // `Object.fromEntries(keysWithDifferentValues)`
21223    return config
21224  }
21225
21226  _cleanTipClass() {
21227    const tip = this.getTipElement()
21228    const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g')
21229    const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex)
21230    if (tabClass !== null && tabClass.length > 0) {
21231      tabClass.map(token => token.trim())
21232        .forEach(tClass => tip.classList.remove(tClass))
21233    }
21234  }
21235
21236  _getBasicClassPrefix() {
21237    return CLASS_PREFIX
21238  }
21239
21240  _handlePopperPlacementChange(popperData) {
21241    const { state } = popperData
21242
21243    if (!state) {
21244      return
21245    }
21246
21247    this.tip = state.elements.popper
21248    this._cleanTipClass()
21249    this._addAttachmentClass(this._getAttachment(state.placement))
21250  }
21251
21252  _disposePopper() {
21253    if (this._popper) {
21254      this._popper.destroy()
21255      this._popper = null
21256    }
21257  }
21258
21259  // Static
21260
21261  static jQueryInterface(config) {
21262    return this.each(function () {
21263      const data = Tooltip.getOrCreateInstance(this, config)
21264
21265      if (typeof config === 'string') {
21266        if (typeof data[config] === 'undefined') {
21267          throw new TypeError(`No method named "${config}"`)
21268        }
21269
21270        data[config]()
21271      }
21272    })
21273  }
21274}
21275
21276/**
21277 * ------------------------------------------------------------------------
21278 * jQuery
21279 * ------------------------------------------------------------------------
21280 * add .Tooltip to jQuery only if jQuery is present
21281 */
21282
21283defineJQueryPlugin(Tooltip)
21284
21285/* harmony default export */ var src_tooltip = (Tooltip);
21286
21287;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/glossary/glossary.main.js
21288
21289
21290external_$_default().when((external_$_default()).ready).then(function () {
21291  var $assets = external_$_default()('.dpnglossary');
21292
21293  if (!$assets.length) {
21294    return;
21295  }
21296
21297  console.log('glossary initialised on load');
21298  var tooltips = document.querySelectorAll('.dpnglossary.link');
21299  tooltips.forEach(function (tt) {
21300    new src_tooltip(tt);
21301  });
21302});
21303;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/headerSearch/headerSearch.main.js
21304//todo: toggle label
21305
21306var $searchToggle = external_$_default()('.headerSearch__toggle');
21307var $search = external_$_default()('.headerSearch');
21308function openHeaderSearch() {
21309  var mq = window.matchMedia("(max-width: 48.75em)");
21310
21311  if (mq.matches) {
21312    external_$_default()('.main-nav-toggle--show').click();
21313  }
21314
21315  external_$_default()('body').addClass('headerSearch-is-visible');
21316  external_$_default()('.documentHeader .headerSearch__submit').attr('tabindex', '0');
21317  $searchToggle.attr('aria-expanded', true);
21318  $search.attr('aria-expanded', true);
21319  $search.find('.headerSearch__q').focus();
21320}
21321function closeHeaderSearch() {
21322  external_$_default()('body').removeClass('headerSearch-is-visible');
21323  external_$_default()('.documentHeader .headerSearch__submit').attr('tabindex', '-1');
21324  $searchToggle.attr('aria-expanded', false);
21325  $search.attr('aria-expanded', false);
21326}
21327/**
21328 * Init on DOM ready
21329 */
21330
21331external_$_default().when((external_$_default()).ready).then(function () {
21332  console.log('headerSearch initialised on DOMContentLoaded');
21333
21334  if ($searchToggle.length < 1) {
21335    return;
21336  }
21337
21338  var $body = external_$_default()('body'); // add a canvas to put an opacity layer over the content except the header
21339  // rather add 2 items than have complicated CSS
21340
21341  external_$_default()('<div class="headerSearch__canvas"></div>').appendTo('.documentMain');
21342  external_$_default()('<div class="headerSearch__canvas"></div>').appendTo('.documentFooter'); // close on click elsewhere
21343
21344  external_$_default()(window).on('click', function (evt) {
21345    if ($body.hasClass('headerSearch-is-visible') && external_$_default()(evt.target).parents('.headerSearch').length < 1) {
21346      $body.removeClass('headerSearch-is-visible');
21347    }
21348  });
21349  $searchToggle.click(function () {
21350    if ($searchToggle.attr('aria-expanded') === 'false') {
21351      openHeaderSearch();
21352    } else {
21353      closeHeaderSearch();
21354    }
21355  }); // close on ESC
21356
21357  $body.on('keydown', function (evt) {
21358    if (evt.keyCode === 27 && $body.hasClass('headerSearch-is-visible')) {
21359      closeHeaderSearch();
21360      $searchToggle.focus();
21361    }
21362  });
21363  external_$_default()(window).on('focusin', function (e) {
21364    if (external_$_default()(e.target).parents('.headerSearch').length < 1 && $search.attr('aria-expanded', true)) {
21365      closeHeaderSearch();
21366    }
21367  });
21368});
21369;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/infoBox/infobox.main.js
21370
21371external_$_default().when((external_$_default()).ready).then(function () {
21372  console.log('hello im infobox');
21373  var $this;
21374  /**
21375   * Create Context for different behaviour of Textmedia Elements with, without or only infoboxes
21376   */
21377
21378  external_$_default()('.infoBox').each(function (e, el) {
21379    $this = external_$_default()(el);
21380    $this.siblings('figure').addClass('figure--infoBox');
21381    console.log($this.parent().siblings().length, $this.siblings().length);
21382
21383    if ($this.parent().siblings().length < 1) {
21384      $this.parents('.co').addClass('coInfobox');
21385    }
21386  });
21387});
21388;// CONCATENATED MODULE: ./src/modules/components/megaNav/megaNav.main.js
21389
21390
21391
21392function positionSecondLevel() {
21393  var $docHeader = external_$_default()('.documentHeader__container');
21394
21395  if ($docHeader.length < 1) {
21396    return;
21397  }
21398
21399  var menuBottom = $docHeader[0].getBoundingClientRect().top;
21400  external_$_default()('.megaNav .secondLevel').css('transform', 'translateY(' + menuBottom + 'px)');
21401}
21402/**
21403 * Init on DOM ready
21404 */
21405
21406
21407function megaNav_main_init() {
21408  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '.megaNav .firstLevel';
21409  console.log('megaNav initialised on DOMContentLoaded');
21410  external_$_default()(selector).accessibleMegaMenu({
21411    openOnMouseover: true
21412  });
21413  external_$_default()(selector).removeAttr('role'); //set by aMM but not needed
21414  // $('.documentHeader__offscreen').css('display', 'none');
21415  // hack so that the megamenu doesn't show flash of css animation after the page loads.
21416
21417  setTimeout(function () {
21418    external_$_default()('body').removeClass('init');
21419  }, 500);
21420  positionSecondLevel();
21421  var timeoutID;
21422  external_$_default()(window).on('scroll resize', function () {
21423    positionSecondLevel(); // Verzögertes Ausführen der Repositionierungs-Funktion
21424    // (Falls dich die Header-Position beim Wechsel von Sticky zu Non-Sticky ändert, wird die Position mit einer
21425    // CSS-Animation verändert, was erst nach dem Animations-Ende zu korrekt auslesbaren Werten führt)
21426
21427    clearTimeout(timeoutID);
21428    timeoutID = setTimeout(positionSecondLevel, 500);
21429  });
21430}
21431external_$_default().when((external_$_default()).ready).then(function () {
21432  console.log('megaNav initialised on DOMContentLoaded'); // init modes
21433
21434  megaNav_main_init('.megaNav .firstLevel');
21435});
21436;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/scrollbar.
21436js
21437/**
21438 * --------------------------------------------------------------------------
21439 * Bootstrap (v5.1.3): util/scrollBar.js
21440 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
21441 * --------------------------------------------------------------------------
21442 */
21443
21444
21445
21446
21447
21448const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
21449const SELECTOR_STICKY_CONTENT = '.sticky-top'
21450
21451class ScrollBarHelper {
21452  constructor() {
21453    this._element = document.body
21454  }
21455
21456  getWidth() {
21457    // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
21458    const documentWidth = document.documentElement.clientWidth
21459    return Math.abs(window.innerWidth - documentWidth)
21460  }
21461
21462  hide() {
21463    const width = this.getWidth()
21464    this._disableOverFlow()
21465    // give padding to element to balance the hidden scrollbar width
21466    this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)
21467    // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
21468    this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)
21469    this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)
21470  }
21471
21472  _disableOverFlow() {
21473    this._saveInitialAttribute(this._element, 'overflow')
21474    this._element.style.overflow = 'hidden'
21475  }
21476
21477  _setElementAttributes(selector, styleProp, callback) {
21478    const scrollbarWidth = this.getWidth()
21479    const manipulationCallBack = element => {
21480      if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
21481        return
21482      }
21483
21484      this._saveInitialAttribute(element, styleProp)
21485      const calculatedValue = window.getComputedStyle(element)[styleProp]
21486      element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`
21487    }
21488
21489    this._applyManipulationCallback(selector, manipulationCallBack)
21490  }
21491
21492  reset() {
21493    this._resetElementAttributes(this._element, 'overflow')
21494    this._resetElementAttributes(this._element, 'paddingRight')
21495    this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')
21496    this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')
21497  }
21498
21499  _saveInitialAttribute(element, styleProp) {
21500    const actualValue = element.style[styleProp]
21501    if (actualValue) {
21502      manipulator.setDataAttribute(element, styleProp, actualValue)
21503    }
21504  }
21505
21506  _resetElementAttributes(selector, styleProp) {
21507    const manipulationCallBack = element => {
21508      const value = manipulator.getDataAttribute(element, styleProp)
21509      if (typeof value === 'undefined') {
21510        element.style.removeProperty(styleProp)
21511      } else {
21512        manipulator.removeDataAttribute(element, styleProp)
21513        element.style[styleProp] = value
21514      }
21515    }
21516
21517    this._applyManipulationCallback(selector, manipulationCallBack)
21518  }
21519
21520  _applyManipulationCallback(selector, callBack) {
21521    if (isElement(selector)) {
21522      callBack(selector)
21523    } else {
21524      selector_engine.find(selector, this._element).forEach(callBack)
21525    }
21526  }
21527
21528  isOverflowing() {
21529    return this.getWidth() > 0
21530  }
21531}
21532
21533/* harmony default export */ var scrollbar = (ScrollBarHelper);
21534
21535;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/backdrop.js
21536/**
21537 * --------------------------------------------------------------------------
21538 * Bootstrap (v5.1.3): util/backdrop.js
21539 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
21540 * --------------------------------------------------------------------------
21541 */
21542
21543
21544
21545
21546const backdrop_Default = {
21547  className: 'modal-backdrop',
21548  isVisible: true, // if false, we use the backdrop helper without adding any element to the dom
21549  isAnimated: false,
21550  rootElement: 'body', // give the choice to place backdrop under different elements
21551  clickCallback: null
21552}
21553
21554const backdrop_DefaultType = {
21555  className: 'string',
21556  isVisible: 'boolean',
21557  isAnimated: 'boolean',
21558  rootElement: '(element|string)',
21559  clickCallback: '(function|null)'
21560}
21561const backdrop_NAME = 'backdrop'
21562const backdrop_CLASS_NAME_FADE = 'fade'
21563const backdrop_CLASS_NAME_SHOW = 'show'
21564
21565const EVENT_MOUSEDOWN = `mousedown.bs.${backdrop_NAME}`
21566
21567class Backdrop {
21568  constructor(config) {
21569    this._config = this._getConfig(config)
21570    this._isAppended = false
21571    this._element = null
21572  }
21573
21574  show(callback) {
21575    if (!this._config.isVisible) {
21576      execute(callback)
21577      return
21578    }
21579
21580    this._append()
21581
21582    if (this._config.isAnimated) {
21583      reflow(this._getElement())
21584    }
21585
21586    this._getElement().classList.add(backdrop_CLASS_NAME_SHOW)
21587
21588    this._emulateAnimation(() => {
21589      execute(callback)
21590    })
21591  }
21592
21593  hide(callback) {
21594    if (!this._config.isVisible) {
21595      execute(callback)
21596      return
21597    }
21598
21599    this._getElement().classList.remove(backdrop_CLASS_NAME_SHOW)
21600
21601    this._emulateAnimation(() => {
21602      this.dispose()
21603      execute(callback)
21604    })
21605  }
21606
21607  // Private
21608
21609  _getElement() {
21610    if (!this._element) {
21611      const backdrop = document.createElement('div')
21612      backdrop.className = this._config.className
21613      if (this._config.isAnimated) {
21614        backdrop.classList.add(backdrop_CLASS_NAME_FADE)
21615      }
21616
21617      this._element = backdrop
21618    }
21619
21620    return this._element
21621  }
21622
21623  _getConfig(config) {
21624    config = {
21625      ...backdrop_Default,
21626      ...(typeof config === 'object' ? config : {})
21627    }
21628
21629    // use getElement() with the default "body" to get a fresh Element on each instantiation
21630    config.rootElement = getElement(config.rootElement)
21631    typeCheckConfig(backdrop_NAME, config, backdrop_DefaultType)
21632    return config
21633  }
21634
21635  _append() {
21636    if (this._isAppended) {
21637      return
21638    }
21639
21640    this._config.rootElement.append(this._getElement())
21641
21642    event_handler.on(this._getElement(), EVENT_MOUSEDOWN, () => {
21643      execute(this._config.clickCallback)
21644    })
21645
21646    this._isAppended = true
21647  }
21648
21649  dispose() {
21650    if (!this._isAppended) {
21651      return
21652    }
21653
21654    event_handler.off(this._element, EVENT_MOUSEDOWN)
21655
21656    this._element.remove()
21657    this._isAppended = false
21658  }
21659
21660  _emulateAnimation(callback) {
21661    executeAfterTransition(callback, this._getElement(), this._config.isAnimated)
21662  }
21663}
21664
21665/* harmony default export */ var backdrop = (Backdrop);
21666
21667;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/focustrap.js
21668/**
21669 * --------------------------------------------------------------------------
21670 * Bootstrap (v5.1.3): util/focustrap.js
21671 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
21672 * --------------------------------------------------------------------------
21673 */
21674
21675
21676
21677
21678
21679const focustrap_Default = {
21680  trapElement: null, // The element to trap focus inside of
21681  autofocus: true
21682}
21683
21684const focustrap_DefaultType = {
21685  trapElement: 'element',
21686  autofocus: 'boolean'
21687}
21688
21689const focustrap_NAME = 'focustrap'
21690const focustrap_DATA_KEY = 'bs.focustrap'
21691const focustrap_EVENT_KEY = `.${focustrap_DATA_KEY}`
21692const EVENT_FOCUSIN = `focusin${focustrap_EVENT_KEY}`
21693const EVENT_KEYDOWN_TAB = `keydown.tab${focustrap_EVENT_KEY}`
21694
21695const TAB_KEY = 'Tab'
21696const TAB_NAV_FORWARD = 'forward'
21697const TAB_NAV_BACKWARD = 'backward'
21698
21699class FocusTrap {
21700  constructor(config) {
21701    this._config = this._getConfig(config)
21702    this._isActive = false
21703    this._lastTabNavDirection = null
21704  }
21705
21706  activate() {
21707    const { trapElement, autofocus } = this._config
21708
21709    if (this._isActive) {
21710      return
21711    }
21712
21713    if (autofocus) {
21714      trapElement.focus()
21715    }
21716
21717    event_handler.off(document, focustrap_EVENT_KEY) // guard against infinite focus loop
21718    event_handler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))
21719    event_handler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))
21720
21721    this._isActive = true
21722  }
21723
21724  deactivate() {
21725    if (!this._isActive) {
21726      return
21727    }
21728
21729    this._isActive = false
21730    event_handler.off(document, focustrap_EVENT_KEY)
21731  }
21732
21733  // Private
21734
21735  _handleFocusin(event) {
21736    const { target } = event
21737    const { trapElement } = this._config
21738
21739    if (target === document || target === trapElement || trapElement.contains(target)) {
21740      return
21741    }
21742
21743    const elements = selector_engine.focusableChildren(trapElement)
21744
21745    if (elements.length === 0) {
21746      trapElement.focus()
21747    } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
21748      elements[elements.length - 1].focus()
21749    } else {
21750      elements[0].focus()
21751    }
21752  }
21753
21754  _handleKeydown(event) {
21755    if (event.key !== TAB_KEY) {
21756      return
21757    }
21758
21759    this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD
21760  }
21761
21762  _getConfig(config) {
21763    config = {
21764      ...focustrap_Default,
21765      ...(typeof config === 'object' ? config : {})
21766    }
21767    typeCheckConfig(focustrap_NAME, config, focustrap_DefaultType)
21768    return config
21769  }
21770}
21771
21772/* harmony default export */ var focustrap = (FocusTrap);
21773
21774;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/component-functions.js
21775/**
21776 * --------------------------------------------------------------------------
21777 * Bootstrap (v5.1.3): util/component-functions.js
21778 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
21779 * --------------------------------------------------------------------------
21780 */
21781
21782
21783
21784
21785const enableDismissTrigger = (component, method = 'hide') => {
21786  const clickEvent = `click.dismiss${component.EVENT_KEY}`
21787  const name = component.NAME
21788
21789  event_handler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
21790    if (['A', 'AREA'].includes(this.tagName)) {
21791      event.preventDefault()
21792    }
21793
21794    if (isDisabled(this)) {
21795      return
21796    }
21797
21798    const target = getElementFromSelector(this) || this.closest(`.${name}`)
21799    const instance = component.getOrCreateInstance(target)
21800
21801    // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
21802    instance[method]()
21803  })
21804}
21805
21806
21807
21808;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/offcanvas.js
21809/**
21810 * --------------------------------------------------------------------------
21811 * Bootstrap (v5.1.3): offcanvas.js
21812 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
21813 * --------------------------------------------------------------------------
21814 */
21815
21816
21817
21818
21819
21820
21821
21822
21823
21824
21825
21826/**
21827 * ------------------------------------------------------------------------
21828 * Constants
21829 * ------------------------------------------------------------------------
21830 */
21831
21832const offcanvas_NAME = 'offcanvas'
21833const offcanvas_DATA_KEY = 'bs.offcanvas'
21834const offcanvas_EVENT_KEY = `.${offcanvas_DATA_KEY}`
21835const offcanvas_DATA_API_KEY = '.data-api'
21836const EVENT_LOAD_DATA_API = `load${offcanvas_EVENT_KEY}${offcanvas_DATA_API_KEY}`
21837const ESCAPE_KEY = 'Escape'
21838
21839const offcanvas_Default = {
21840  backdrop: true,
21841  keyboard: true,
21842  scroll: false
21843}
21844
21845const offcanvas_DefaultType = {
21846  backdrop: 'boolean',
21847  keyboard: 'boolean',
21848  scroll: 'boolean'
21849}
21850
21851const offcanvas_CLASS_NAME_SHOW = 'show'
21852const CLASS_NAME_BACKDROP = 'offcanvas-backdrop'
21853const OPEN_SELECTOR = '.offcanvas.show'
21854
21855const offcanvas_EVENT_SHOW = `show${offcanvas_EVENT_KEY}`
21856const offcanvas_EVENT_SHOWN = `shown${offcanvas_EVENT_KEY}`
21857const offcanvas_EVENT_HIDE = `hide${offcanvas_EVENT_KEY}`
21858const offcanvas_EVENT_HIDDEN = `hidden${offcanvas_EVENT_KEY}`
21859const offcanvas_EVENT_CLICK_DATA_API = `click${offcanvas_EVENT_KEY}${offcanvas_DATA_API_KEY}`
21860const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${offcanvas_EVENT_KEY}`
21861
21862const offcanvas_SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]'
21863
21864/**
21865 * ------------------------------------------------------------------------
21866 * Class Definition
21867 * ------------------------------------------------------------------------
21868 */
21869
21870class Offcanvas extends base_component {
21871  constructor(element, config) {
21872    super(element)
21873
21874    this._config = this._getConfig(config)
21875    this._isShown = false
21876    this._backdrop = this._initializeBackDrop()
21877    this._focustrap = this._initializeFocusTrap()
21878    this._addEventListeners()
21879  }
21880
21881  // Getters
21882
21883  static get NAME() {
21884    return offcanvas_NAME
21885  }
21886
21887  static get Default() {
21888    return offcanvas_Default
21889  }
21890
21891  // Public
21892
21893  toggle(relatedTarget) {
21894    return this._isShown ? this.hide() : this.show(relatedTarget)
21895  }
21896
21897  show(relatedTarget) {
21898    if (this._isShown) {
21899      return
21900    }
21901
21902    const showEvent = event_handler.trigger(this._element, offcanvas_EVENT_SHOW, { relatedTarget })
21903
21904    if (showEvent.defaultPrevented) {
21905      return
21906    }
21907
21908    this._isShown = true
21909    this._element.style.visibility = 'visible'
21910
21911    this._backdrop.show()
21912
21913    if (!this._config.scroll) {
21914      new scrollbar().hide()
21915    }
21916
21917    this._element.removeAttribute('aria-hidden')
21918    this._element.setAttribute('aria-modal', true)
21919    this._element.setAttribute('role', 'dialog')
21920    this._element.classList.add(offcanvas_CLASS_NAME_SHOW)
21921
21922    const completeCallBack = () => {
21923      if (!this._config.scroll) {
21924        this._focustrap.activate()
21925      }
21926
21927      event_handler.trigger(this._element, offcanvas_EVENT_SHOWN, { relatedTarget })
21928    }
21929
21930    this._queueCallback(completeCallBack, this._element, true)
21931  }
21932
21933  hide() {
21934    if (!this._isShown) {
21935      return
21936    }
21937
21938    const hideEvent = event_handler.trigger(this._element, offcanvas_EVENT_HIDE)
21939
21940    if (hideEvent.defaultPrevented) {
21941      return
21942    }
21943
21944    this._focustrap.deactivate()
21945    this._element.blur()
21946    this._isShown = false
21947    this._element.classList.remove(offcanvas_CLASS_NAME_SHOW)
21948    this._backdrop.hide()
21949
21950    const completeCallback = () => {
21951      this._element.setAttribute('aria-hidden', true)
21952      this._element.removeAttribute('aria-modal')
21953      this._element.removeAttribute('role')
21954      this._element.style.visibility = 'hidden'
21955
21956      if (!this._config.scroll) {
21957        new scrollbar().reset()
21958      }
21959
21960      event_handler.trigger(this._element, offcanvas_EVENT_HIDDEN)
21961    }
21962
21963    this._queueCallback(completeCallback, this._element, true)
21964  }
21965
21966  dispose() {
21967    this._backdrop.dispose()
21968    this._focustrap.deactivate()
21969    super.dispose()
21970  }
21971
21972  // Private
21973
21974  _getConfig(config) {
21975    config = {
21976      ...offcanvas_Default,
21977      ...manipulator.getDataAttributes(this._element),
21978      ...(typeof config === 'object' ? config : {})
21979    }
21980    typeCheckConfig(offcanvas_NAME, config, offcanvas_DefaultType)
21981    return config
21982  }
21983
21984  _initializeBackDrop() {
21985    return new backdrop({
21986      className: CLASS_NAME_BACKDROP,
21987      isVisible: this._config.backdrop,
21988      isAnimated: true,
21989      rootElement: this._element.parentNode,
21990      clickCallback: () => this.hide()
21991    })
21992  }
21993
21994  _initializeFocusTrap() {
21995    return new focustrap({
21996      trapElement: this._element
21997    })
21998  }
21999
22000  _addEventListeners() {
22001    event_handler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
22002      if (this._config.keyboard && event.key === ESCAPE_KEY) {
22003        this.hide()
22004      }
22005    })
22006  }
22007
22008  // Static
22009
22010  static jQueryInterface(config) {
22011    return this.each(function () {
22012      const data = Offcanvas.getOrCreateInstance(this, config)
22013
22014      if (typeof config !== 'string') {
22015        return
22016      }
22017
22018      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
22019        throw new TypeError(`No method named "${config}"`)
22020      }
22021
22022      data[config](this)
22023    })
22024  }
22025}
22026
22027/**
22028 * ------------------------------------------------------------------------
22029 * Data Api implementation
22030 * ------------------------------------------------------------------------
22031 */
22032
22033event_handler.on(document, offcanvas_EVENT_CLICK_DATA_API, offcanvas_SELECTOR_DATA_TOGGLE, function (event) {
22034  const target = getElementFromSelector(this)
22035
22036  if (['A', 'AREA'].includes(this.tagName)) {
22037    event.preventDefault()
22038  }
22039
22040  if (isDisabled(this)) {
22041    return
22042  }
22043
22044  event_handler.one(target, offcanvas_EVENT_HIDDEN, () => {
22045    // focus on trigger when it is closed
22046    if (isVisible(this)) {
22047      this.focus()
22048    }
22049  })
22050
22051  // avoid conflict when clicking a toggler of an offcanvas, while another is open
22052  const allReadyOpen = selector_engine.findOne(OPEN_SELECTOR)
22053  if (allReadyOpen && allReadyOpen !== target) {
22054    Offcanvas.getInstance(allReadyOpen).hide()
22055  }
22056
22057  const data = Offcanvas.getOrCreateInstance(target)
22058  data.toggle(this)
22059})
22060
22061event_handler.on(window, EVENT_LOAD_DATA_API, () =>
22062  selector_engine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())
22063)
22064
22065enableDismissTrigger(Offcanvas)
22066/**
22067 * ------------------------------------------------------------------------
22068 * jQuery
22069 * ------------------------------------------------------------------------
22070 */
22071
22072defineJQueryPlugin(Offcanvas)
22073
22074/* harmony default export */ var src_offcanvas = (Offcanvas);
22075
22076;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/core/config.core.js
22077// Keep in sync with breakpoints in sass/_variables.scss
22078var breakpoints = {
22079  base: 0,
22080  mobile: 320,
22081  phablet: 540,
22082  tablet: 740,
22083  desktop: 980,
22084  mainNavigation: 980,
22085  wide: 1200,
22086  slider: 1280,
22087  extraordinary: 1400
22088}; // Keep in sync with transitions in sass/_variables.scss
22089
22090var speed = {
22091  instant: 5,
22092  fast: 100,
22093  normal: 300,
22094  slow: 700,
22095  sluggish: 1200
22096}; // todo @skm: ist this the right place for this? copied from gf-023...
22097
22098if ("ontouchstart" in document.documentElement) {
22099  var root = document.getElementsByTagName('html')[0]; // '0' to assign the first (and only `HTML` tag)
22100
22101  root.className += ' touch-device';
22102}
22103
22104window.addEventListener('beforeprint', function () {
22105  window.scrollTo(0, 0);
22106});
22107;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/offcanvas/offcanvas.main.js
22108
22109
22110function offcanvas_main_init() {
22111  var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'offcanvas';
22112  var offcanvas = new src_offcanvas(document.getElementById(id));
22113  window.addEventListener('resize', function () {
22114    if (window.innerWidth > breakpoints.mainNavigation) {
22115      offcanvas.hide();
22116    }
22117  });
22118}
22119document.addEventListener('DOMContentLoaded', function () {
22120  offcanvas_main_init();
22121});
22122;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/printButton/printButton.main.js
22123/**
22124 * Trigger print
22125 */
22126
22127/**
22128 * module initialisation
22129 */
22130
22131external_$_default().when((external_$_default()).ready).then(function () {
22132  external_$_default()('.printButton').on('click', function (evt) {
22133    evt.preventDefault();
22134    window.print();
22135  });
22136});
22137;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/skiplinks/skiplinks.main.js
22138 // Init on DOM ready
22139
22140external_$_default().when((external_$_default()).ready).then(function () {
22141  console.log('skiplinks initialised on DOMContentLoaded');
22142  var $skiplinksContainer = external_$_default()('.skiplinks');
22143  var $skiplinks = $skiplinksContainer.find('a');
22144  $skiplinks.on('focus', function () {
22145    $skiplinksContainer.addClass('is-focussed');
22146  });
22147  $skiplinks.on('blur', function () {
22148    $skiplinksContainer.removeClass('is-focussed');
22149  });
22150});
22151;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/toggle/toggle.main.js
22152
22153
22154function getTarget($toggle) {
22155  var $target;
22156  var mode = $toggle.data('mode');
22157  var target = $toggle.data('target') || 'body';
22158
22159  if (mode === 'siblings') {
22160    $target = $toggle.siblings(target);
22161  } else if (mode === 'closest') {
22162    $target = $toggle.closest(target);
22163  } else {
22164    $target = external_$_default()(target);
22165  }
22166
22167  return $target;
22168}
22169/**
22170 * build toggle
22171 * @param el
22172 */
22173
22174
22175function prepare(el) {
22176  /* jshint maxcomplexity: false */
22177  var $toggle = external_$_default()(el);
22178  var $label = $toggle.find('.m-toggle__label');
22179  var $target = getTarget($toggle);
22180  var ariaTarget = $toggle.data('aria-target') || false;
22181  var $ariaTarget = ariaTarget ? external_$_default()(ariaTarget) : false;
22182  var mode = $toggle.data('mode') || false;
22183  var accordion = $toggle.closest('.coAccordion .co__main').data('accordion') || false; // accordion functionality
22184
22185  var firstOpen = $toggle.closest('.coAccordion .co__main').data('first-open') || false; // accordion functionality
22186
22187  var closeOnClickOutside = $toggle.data('close-on-click-outside') || false;
22188  var expanded = $toggle.data('expanded') || false; // initially opens Expand
22189
22190  var switchClassname = $toggle.data('switch-classname') || 'm-toggle--active';
22191  var switchLabel = $toggle.data('switch-label') ? $toggle.data('switch-label') || $toggle.text() : false;
22192  var toggleOnce = $toggle.data('toggle-once') || false;
22193  var focus = $toggle.data('focus') || false; // defines element that should be focussed - used in header search
22194  // wrap toggle text if not already happened
22195
22196  if ($label.length < 1) {
22197    $label = $toggle.wrapInner('<span class="m-toggle__label"></span>');
22198  } // store current label
22199
22200
22201  if (switchLabel) {
22202    $toggle.data('default-label', $toggle.text());
22203  } // set aria attribute
22204
22205
22206  if ($ariaTarget) {
22207    $ariaTarget.attr('aria-expanded', 'false');
22208  } // set tabindex
22209  // could be a bit better maybe...
22210  // see: https://stackoverflow.com/questions/1599660/which-html-elements-can-receive-focus
22211
22212
22213  $target.find('.expand__main').find('a[href], button, input, select, textarea').attr('tabindex', '-1'); // close toggle when clicked outside
22214
22215  if (closeOnClickOutside) {
22216    external_$_default()(document).on('click', function (evt) {
22217      if (external_$_default()(evt.target).is($toggle) === false && $toggle.hasClass(switchClassname)) {
22218        $toggle.trigger('click');
22219      }
22220    });
22221  }
22222  /* jshint maxcomplexity: false */
22223
22224
22225  var doToggle = function doToggle(evt) {
22226    evt.preventDefault();
22227    evt.stopPropagation();
22228    console.log('toggle.js triggered');
22229    var state;
22230    var isToggled = $target.data('is-toggled') || false;
22231
22232    if (toggleOnce && isToggled) {
22233      $toggle.off('click', doToggle);
22234      return;
22235    }
22236
22237    if ($target.hasClass(switchClassname)) {
22238      $target.removeClass(switchClassname);
22239      $toggle.removeClass(switchClassname);
22240
22241      if (switchLabel) {
22242        $label.text($toggle.data('default-label'));
22243      }
22244
22245      state = false;
22246    } else {
22247      if (accordion === true) {
22248        $toggle.closest('.coAccordion .co__main').find('.expand--expanded .m-toggle').not($toggle).click();
22249      } else if (mode !== 'siblings' && mode !== 'closest') {
22250        $toggle.siblings().removeClass(switchClassname);
22251        $target.siblings().removeClass(switchClassname);
22252        $toggle.parent().parent().find('.' + switchClassname).removeClass(switchClassname);
22253      }
22254
22255      if (switchLabel) {
22256        $label.text(switchLabel);
22257      }
22258
22259      $target.addClass(switchClassname);
22260      $toggle.addClass(switchClassname);
22261      state = true;
22262    }
22263
22264    $target.data('is-toggled', true).data('toggle-state', state); // set aria attribute
22265
22266    if ($ariaTarget) {
22267      $ariaTarget.attr('aria-expanded', state);
22268    } // focus on element defined in data focus
22269
22270
22271    if (focus !== false) {
22272      setTimeout(function () {
22273        external_$_default()(focus).focus();
22274      }, 500);
22275    }
22276  };
22277
22278  $toggle.on('click', doToggle); // mark toggle as initialised
22279
22280  $toggle.addClass('m-toggle--initialised');
22281  $toggle.trigger('mToggleInitialised'); // only for cco--accordion
22282
22283  if (expanded) {
22284    $toggle.trigger('click');
22285  } //open first expand if firstOpen is set
22286
22287
22288  if (firstOpen && $toggle.parent().is(':first-child')) {
22289    $toggle.trigger('click');
22290  }
22291}
22292/**
22293 * module initialisation
22294 */
22295
22296external_$_default().when((external_$_default()).ready).then(function () {
22297  console.log('toggle initialised on DOMContentLoaded'); // prevent double-initialisation when combined with solrSearch.solr.js
22298
22299  var $toggle = external_$_default()('.m-toggle:not(.m-toggle--initialised)');
22300  $toggle.each(function () {
22301    prepare(this);
22302  });
22303});
22304;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/tooltip/tooltip.settings.main.js
22305var options = {
22306  selector: '[data-bs-toggle="tooltip"]',
22307  attrConsentType: 'data-bs-cookie-consent-type',
22308  attrCookieDependency: 'data-bs-cookie-dependency'
22309};
22310;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/tooltip/tooltip.main.js
22311/* provided dependency */ var $ = __webpack_require__(3336);
22312
22313
22314
22315function updateTooltip(cookieman, tooltip) {
22316  tooltip.enable();
22317
22318  var cookieConsentType = tooltip._element.getAttribute(options.attrConsentType);
22319
22320  var cookieDependency = tooltip._element.getAttribute(options.attrCookieDependency) ? tooltip._element.getAttribute(options.attrCookieDependency) : 'if';
22321
22322  if (!cookieman.hasConsented(cookieConsentType) && cookieDependency === 'if') {
22323    tooltip.disable();
22324  }
22325
22326  if (cookieman.hasConsented(cookieConsentType) && cookieDependency === 'else') {
22327    tooltip.disable();
22328  }
22329}
22330
22331function initTooltip(tt) {
22332  var tooltip = new src_tooltip(tt);
22333  var cookieman = window.cookieman ? window.cookieman : null;
22334
22335  var cookieConsentType = tooltip._element.getAttribute(options.attrConsentType);
22336
22337  if (!cookieman || !cookieConsentType) {
22338    return;
22339  }
22340
22341  updateTooltip(cookieman, tooltip);
22342  $(document).on('cookieman-updated', function () {
22343    updateTooltip(cookieman, tooltip);
22344  });
22345}
22346function tooltip_main_init() {
22347  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : options.selector;
22348  var tooltips = document.querySelectorAll(selector);
22349
22350  if (tooltips.length < 1) {
22351    return;
22352  }
22353
22354  tooltips.forEach(initTooltip);
22355}
22356document.addEventListener('DOMContentLoaded', function () {
22357  tooltip_main_init();
22358});
22359;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/contentObjects/coTextmedia/coTextmedia.main.js
22360
22361
22362
22363function checkLines($el) {
22364  var height = $el.height();
22365  var lineheight = parseInt($el.css('line-height'));
22366  return height > lineheight;
22367}
22368
22369function alignToNumber($el) {
22370  var $sibling = $el.find('+ *');
22371  var y1 = $el[0].getBoundingClientRect().bottom;
22372  var y2 = $sibling[0].getBoundingClientRect().bottom;
22373  $sibling.css('transform', 'translateY(' + (y1 - y2) + 'px)');
22374}
22375
22376function setMarginForBeside() {
22377  // only do this from tablet up
22378  if (external_$_default()(window).width() > breakpoints.phablet) {
22379    external_$_default()('.coTextmedia.co--beside').each(function () {
22380      var $co = external_$_default()(this);
22381      var $mediaContainer = $co.find('.mediaContainer');
22382      var $rteContent = $co.find('.co__rteContent');
22383      var alignment = $mediaContainer.hasClass('mediaContainer--left') ? 'left' : 'right';
22384      var mediaWidth = $mediaContainer.outerWidth();
22385      $rteContent.css('margin-' + alignment, mediaWidth);
22386    });
22387  } else {
22388    external_$_default()('.coTextmedia.co--beside').each(function () {
22389      var $co = external_$_default()(this);
22390      var $rteContent = $co.find('.co__rteContent');
22391      $rteContent.css({
22392        'margin-left': '',
22393        'margin-right': ''
22394      });
22395    });
22396  }
22397}
22398
22399external_$_default().when((external_$_default()).ready).then(function () {
22400  external_$_default()('.coTextmedia p').filter(function () {
22401    return !external_$_default().trim(external_$_default()(this).text());
22402  }).remove();
22403  /**
22404   * [#27812], [#28443] CO »Herausgestellte Zahl
22405   */
22406
22407  var $floatedNumber = external_$_default()('.number-floated');
22408  $floatedNumber.each(function () {
22409    var $this = external_$_default()(this);
22410    /**
22411     * if sibling of floated number is a oneliner, align to baseline of number
22412     */
22413
22414    if (!checkLines($this.find('+ *'))) {
22415      alignToNumber($this);
22416    }
22417  }); // todo: maybe there is a pure CSS solution but could not find anything
22418  //  problem is that the image size/width can be adjusted in the BE
22419
22420  if (external_$_default()('.coTextmedia.co--beside').length > 0) {
22421    setMarginForBeside(); // update the slider options on resize
22422
22423    var resizeTimer = null;
22424    external_$_default()(window).on('resize', function () {
22425      clearTimeout(resizeTimer);
22426      resizeTimer = setTimeout(setMarginForBeside(), 50);
22427    });
22428  }
22429});
22430;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/core/supports.core.js
22431function supports_core_passive() {
22432  var supports = false;
22433
22434  try {
22435    var opts = Object.defineProperty({}, 'passive', {
22436      get: function get() {
22437        supports = true;
22438      }
22439    });
22440    window.addEventListener("test", null, opts);
22441  } catch (e) {}
22442
22443  return supports;
22444}
22445;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/document/documentHeader/fixedHeader.settings.js
22446var fixedHeader_settings_options = {
22447  // On-Off Switch
22448  active: true,
22449  // <string>, element selector -> element that is being fixed
22450  element: '.documentHeader',
22451  // <string>, element selector
22452  switchOnElement: 'body',
22453  // <string>, switch classname
22454  switchClassname: 'is-fixed',
22455  // <string>, set scroll offset -> offset is calculated
22456  offsetElement: '.documentHeader',
22457  // <string>, element to receive padding to make sure we do not get any jumping of content
22458  paddingElement: 'body',
22459  // <bool> set to true, if documentHeader is basically fixed
22460  paddingInstant: false,
22461  // the sticky handler
22462  priority: 1
22463};
22464;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/document/documentHeader/fixedHeader.main.js
22465
22466
22467
22468
22469function getPosition(selector) {
22470  var $element = external_$_default()(selector);
22471  var element = $element[0];
22472  var xPosition = 0;
22473  var yPosition = 0; // bail if element is hidden with CSS
22474
22475  if ($element.css('display') === 'none') {
22476    return {
22477      x: false,
22478      y: false
22479    };
22480  }
22481
22482  while (element) {
22483    xPosition += element.offsetLeft - element.scrollLeft + element.clientLeft;
22484    yPosition += element.offsetTop - element.scrollTop + element.clientTop;
22485    element = element.offsetParent;
22486  }
22487
22488  return {
22489    x: xPosition,
22490    y: yPosition
22491  };
22492}
22493
22494external_$_default().when((external_$_default()).ready).then(function () {
22495  console.log('fixedHeader initialised on DOMContentLoaded');
22496
22497  if (!fixedHeader_settings_options.active) {
22498    return;
22499  }
22500
22501  var $window = external_$_default()(window);
22502  var $el = external_$_default()(fixedHeader_settings_options.element);
22503
22504  if ($el.length < 1) {
22505    return;
22506  }
22507
22508  var elClass = external_$_default()(fixedHeader_settings_options.element).attr('class').split(' ')[0];
22509  var $elSwitch = external_$_default()(fixedHeader_settings_options.switchOnElement);
22510  var $paddingElement = external_$_default()(fixedHeader_settings_options.paddingElement);
22511
22512  if (!$el || !$elSwitch) {
22513    return;
22514  }
22515
22516  var attached = false;
22517  var offset = getPosition(fixedHeader_settings_options.offsetElement).y || $el.outerHeight();
22518  var headerHeight = $el.outerHeight();
22519
22520  var attachhandler = function attachhandler() {
22521    $elSwitch.addClass(elClass + '-' + fixedHeader_settings_options.switchClassname);
22522    $el.addClass(fixedHeader_settings_options.switchClassname);
22523    headerHeight = $el.outerHeight(); // get headerHeight in case it changed
22524
22525    $paddingElement.css('padding-top', parseInt(headerHeight, 10)); // dispatch to sticky handler
22526
22527    $window.trigger('sticky', {
22528      $el: $el,
22529      priority: fixedHeader_settings_options.priority,
22530      status: 'stuck'
22531    });
22532  };
22533
22534  var detachhandler = function detachhandler() {
22535    $elSwitch.removeClass(elClass + '-' + fixedHeader_settings_options.switchClassname);
22536    $el.removeClass(fixedHeader_settings_options.switchClassname);
22537
22538    if (!fixedHeader_settings_options.paddingInstant) {
22539      $paddingElement.css('padding-top', '');
22540    } // dispatch to sticky handler
22541
22542
22543    $window.trigger('sticky', {
22544      $el: $el,
22545      priority: fixedHeader_settings_options.priority,
22546      status: 'unstuck'
22547    });
22548  };
22549
22550  var resizeUpdate = function resizeUpdate() {
22551    if (attached) {
22552      $el.removeClass(fixedHeader_settings_options.switchClassname);
22553    }
22554
22555    offset = getPosition(fixedHeader_settings_options.offsetElement).y || $el.outerHeight();
22556    headerHeight = $el.outerHeight();
22557
22558    if (attached) {
22559      $el.addClass(fixedHeader_settings_options.switchClassname);
22560      $paddingElement.css('padding-top', parseInt(headerHeight, 10));
22561    }
22562
22563    external_$_default()(window).scroll();
22564  };
22565
22566  var lastScrollTop = 0;
22567  window.addEventListener('scroll', function () {
22568    var nextScrollTop = window.pageYOffset || document.documentElement.scrollTop;
22569
22570    if (nextScrollTop > lastScrollTop) {
22571      $elSwitch.removeClass('is-topscrolling');
22572    } else {
22573      $elSwitch.addClass('is-topscrolling');
22574    }
22575
22576    lastScrollTop = nextScrollTop <= 0 ? 0 : nextScrollTop;
22577
22578    if (!attached && window.pageYOffset > offset) {
22579      attached = true;
22580      attachhandler();
22581    } else if (attached && window.pageYOffset <= offset) {
22582      attached = false;
22583      detachhandler();
22584    }
22585  }, supports_core_passive() ? {
22586    passive: true
22587  } : false); // update the slider options on resize
22588
22589  var resizeTimer = null;
22590  external_$_default()(window).on('resize', function () {
22591    clearTimeout(resizeTimer);
22592    resizeTimer = setTimeout(resizeUpdate, 20);
22593  });
22594  window.dispatchEvent(new CustomEvent('scroll'));
22595});
22596;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/elements/audio/audio.main.js
22597
22598
22599function initAudio() {
22600  var $audios = external_$_default()(this);
22601
22602  if ($audios.length < 1) {
22603    return;
22604  }
22605
22606  $audios.each(function (i, audio) {
22607    var $audio = external_$_default()(audio);
22608    var $playButton = $audio.find('.audio__play-button');
22609    var $player = $audio.find('.audio__player audio');
22610    $playButton.on('click', function () {
22611      $audio.addClass('player-is-initialised');
22612      $player[0].play();
22613    });
22614  });
22615}
22616/**
22617 * Init on DOM ready
22618 */
22619
22620
22621external_$_default().when((external_$_default()).ready).then(function () {
22622  // console.log('audios initialised on DOMContentLoaded');
22623  external_$_default()('.audio').each(initAudio);
22624});
22625// EXTERNAL MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/elements/button/button.main.js
22626var button_main = __webpack_require__(4591);
22627;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/rteElements/sortableTable/sortableTable.main.js
22628// import { breakpoints, speed } from 'Src/core/config';
22629
22630
22631function sortableTable_main_init() {
22632  var $table = external_$_default()(this);
22633  var $tHead = $table.find('thead').eq(0);
22634  var $tHeadRow = $tHead.find('tr').eq(0);
22635  var $tHeadRowCells = $tHeadRow.find('th, td');
22636
22637  var _hasTHead = $tHeadRowCells.length > 1;
22638
22639  var $headerTR = _hasTHead ? $tHeadRow : $table.find('tr').eq(0);
22640  var $allTableHeadCells = $headerTR.find('th, td');
22641  $table.addClass('sortable-table');
22642  $allTableHeadCells.addClass('sortable-table__th');
22643  var $sortableRows = $table.find('tr').not($headerTR);
22644  var sortableData = [];
22645  $sortableRows.each(function () {
22646    var $row = external_$_default()(this);
22647    var row = [$row];
22648    var $td = $row.find('td');
22649    $td.each(function () {
22650      row.push(external_$_default()(this).text());
22651    });
22652    sortableData.push(row);
22653  });
22654
22655  var stripSpaces = function stripSpaces(string) {
22656    var temp = String(string).split(' ');
22657    return temp.join('');
22658  };
22659
22660  var sortTable = function sortTable(index, direction) {
22661    console.log("sortTable: " + index + " : " + direction); // index 0 is the jQuery Object, so comparable Data is starting at index 1
22662
22663    index = index + 1;
22664
22665    var _supportsLocaleCompare = !!String.prototype.localeCompare;
22666
22667    sortableData.sort(function (a, b) {
22668      var valueA = stripSpaces(a[index]);
22669      var valueB = stripSpaces(b[index]);
22670
22671      var _compareByString = isNaN(Number(valueA)) || isNaN(Number(valueB));
22672
22673      if (_compareByString) {
22674        valueA = valueA.toLowerCase();
22675        valueB = valueB.toLowerCase();
22676
22677        if (_supportsLocaleCompare) {
22678          return valueA.localeCompare(valueB) * direction;
22679        } else {
22680          if (valueA > valueB) {
22681            return -1 * direction;
22682          } else if (valueB > valueA) {
22683            return 1 * direction;
22684          } else {
22685            return 0;
22686          }
22687        }
22688      } else {
22689        valueA = Number(valueA);
22690        valueB = Number(valueB);
22691
22692        if (valueA > valueB) {
22693          return -1 * direction;
22694        } else if (valueB > valueA) {
22695          return 1 * direction;
22696        } else {
22697          return 0;
22698        }
22699      }
22700    });
22701    sortableData.map(function (e) {
22702      e[0].appendTo($table);
22703    });
22704  };
22705
22706  $allTableHeadCells.each(function (index) {
22707    var $th = external_$_default()(this);
22708    $th.data('direction', 0);
22709    $th.click(function () {
22710      var $this = external_$_default()(this);
22711      var direction = Number($this.data('direction'));
22712      $allTableHeadCells.data('direction', 0).removeClass('sortable-table__th--active sortable-table__th--up sortable-table__th--down');
22713
22714      if (direction === 0 || direction === 1) {
22715        direction = -1;
22716      } else {
22717        direction = 1;
22718      }
22719
22720      $this.data('direction', direction).addClass('sortable-table__th--active').addClass('sortable-table__th--' + (direction === 1 ? "up" : "down"));
22721      sortTable(index, direction);
22722    });
22723  });
22724  return $table;
22725}
22726/**
22727 * Init on DOM ready
22728 */
22729
22730
22731external_$_default().when((external_$_default()).ready).then(function () {
22732  console.log('sortableTable initialised on DOMContentLoaded'); // do it only for figures
22733
22734  var $table = external_$_default()('table.contenttable');
22735  $table.each(sortableTable_main_init);
22736  $table.wrap('<div class="contenttable__outer-wrapper">');
22737});
22738;// CONCATENATED MODULE: ./src/modules/components/teaser/stageTeaser/stageTeaser.main.js
22739
22740
22741function checkImage($img, $wrapper) {
22742  if (!$wrapper.data('imageFillsHeight') && $img.height() < $wrapper.height()) {
22743    $wrapper.addClass('js-imageFillsHeight');
22744    $wrapper.data('imageFillsHeight', true);
22745  }
22746
22747  if ($wrapper.data('imageFillsHeight') && $img.width() < $wrapper.width()) {
22748    $wrapper.removeClass('js-imageFillsHeight');
22749    $wrapper.data('imageFillsHeight', false);
22750    return false;
22751  }
22752}
22753
22754external_$_default().when((external_$_default()).ready).then(function () {
22755  console.log('stageTeaser initialised at DOM Ready');
22756  external_$_default()('.stageTeaser__content').each(function () {
22757    var $content = external_$_default()(this);
22758    $content.parents('.stageTeaser').addClass('js-ready');
22759  });
22760  external_$_default()('.stageTeaser--layout-c .stageTeaser__media').each(function () {
22761    var $this = external_$_default()(this);
22762    var $img = $this.find('img');
22763    $this.data('imageFillsHeight', false);
22764    checkImage($img, $this);
22765    external_$_default()(window).resize(function () {
22766      checkImage($img, $this);
22767    });
22768  });
22769});
22770// EXTERNAL MODULE: ./src/modules/components/teaser/tileTeaser/tileTeaser.main.js
22771var tileTeaser_main = __webpack_require__(9709);
22772// EXTERNAL MODULE: ./.modernizrrc
22773var _modernizrrc = __webpack_require__(7669);
22774var _modernizrrc_default = /*#__PURE__*/__webpack_require__.n(_modernizrrc);
22775;// CONCATENATED MODULE: ./src/modules/contentObjects/coBreaking/variants/coBreaking5050/coBreaking5050.main.js
22776
22777
22778/**
22779 * Init on DOM ready
22780 */
22781
22782external_$_default().when((external_$_default()).ready).then(function () {
22783  console.log('coBreaking initialised on DOMContentLoaded');
22784
22785  if (!(_modernizrrc_default()).objectfit) {
22786    external_$_default()('.coBreaking--coBreaking5050 .co__media').each(function () {
22787      var $container = external_$_default()(this),
22788          imgUrl = $container.find('img').prop('src');
22789
22790      if (imgUrl) {
22791        $container.css('backgroundImage', 'url(' + imgUrl + ')').addClass('compat-object-fit');
22792      }
22793    });
22794  }
22795});
22796// EXTERNAL MODULE: ./src/modules/components/contentHeader/simpleHeader/simpleHeader.main.js
22797var simpleHeader_main = __webpack_require__(600);
22798;// CONCATENATED MODULE: ./src/js/_imports/main.js
22799
22800
22801
22802
22803
22804
22805
22806
22807
22808
22809
22810
22811
22812
22813
22814
22815
22816
22817
22818
22819
22820
22821
22822
22823
22824
22825
22826}();
22827/******/ })()
22828;
22829/******/ (function() { // webpackBootstrap
22830var __webpack_exports__ = {};
22831
22832/******/ })()
22833;

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.