1/******/ (function() { // webpackBootstrap 2 /******/ var __webpack_modules__ = ({ 3 4
vendor: 243,474 bytes, lines 4-5646
4/***/ "./node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js": 5 /*!******************************************************************!*\ 6 !*** ./node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js ***! 7 \******************************************************************/ 8 /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { 9 10 /* provided dependency */ var jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 11// ================================================== 12// fancyBox v3.5.7 13// 14// Licensed GPLv3 for open source use 15// or fancyBox Commercial License for commercial use 16// 17// http://fancyapps.com/fancybox/ 18// Copyright 2019 fancyApps 19// 20// ================================================== 21 (function (window, document, $, undefined) { 22 "use strict"; 23 24 window.console = window.console || { 25 info: function (stuff) {} 26 }; 27 28 // If there's no jQuery, fancyBox can't work 29 // ========================================= 30 31 if (!$) { 32 return; 33 } 34 35 // Check if fancyBox is already initialized 36 // ======================================== 37 38 if ($.fn.fancybox) { 39 console.info("fancyBox already initialized"); 40 41 return; 42 } 43 44 // Private default settings 45 // ======================== 46 47 var defaults = { 48 // Close existing modals 49 // Set this to false if you do not need to stack multiple instances 50 closeExisting: false, 51 52 // Enable infinite gallery navigation 53 loop: false, 54 55 // Horizontal space between slides 56 gutter: 50, 57 58 // Enable keyboard navigation 59 keyboard: true, 60 61 // Should allow caption to overlap the content 62 preventCaptionOverlap: true, 63 64 // Should display navigation arrows at the screen edges 65 arrows: true, 66 67 // Should display counter at the top left corner 68 infobar: true, 69 70 // Should display close button (using `btnTpl.smallBtn` template) over the content 71 // Can be true, false, "auto" 72 // If "auto" - will be automatically enabled for "html", "inline" or "ajax" items 73 smallBtn: "auto", 74 75 // Should display toolbar (buttons at the top) 76 // Can be true, false, "auto" 77 // If "auto" - will be automatically hidden if "smallBtn" is enabled 78 toolbar: "auto", 79 80 // What buttons should appear in the top right corner. 81 // Buttons will be created using templates from `btnTpl` option 82 // and they will be placed into toolbar (class="fancybox-toolbar"` element) 83 buttons: [ 84 "zoom", 85 //"share", 86 "slideShow", 87 //"fullScreen", 88 //"download", 89 "thumbs", 90 "close" 91 ], 92 93 // Detect "idle" time in seconds 94 idleTime: 3, 95 96 // Disable right-click and use simple image protection for images 97 protect: false, 98 99 // Shortcut to make content "modal" - disable keyboard navigtion, hide buttons, etc 100 modal: false, 101 102 image: { 103 // Wait for images to load before displaying 104 // true - wait for image to load and then display; 105 // false - display thumbnail and load the full-sized image over top, 106 // requires predefined image dimensions (`data-width` and `data-height` attributes) 107 preload: false 108 }, 109 110 ajax: { 111 // Object containing settings for ajax request 112 settings: { 113 // This helps to indicate that request comes from the modal 114 // Feel free to change naming 115 data: { 116 fancybox: true 117 } 118 } 119 }, 120 121 iframe: { 122 // Iframe template 123 tpl: '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" allowfullscreen="allowfullscreen" allow="autoplay; fullscreen" src=""></iframe>', 124 125 // Preload iframe before displaying it 126 // This allows to calculate iframe content width and height 127 // (note: Due to "Same Origin Policy", you can't get cross domain data). 128 preload: true, 129 130 // Custom CSS styling for iframe wrapping element 131 // You can use this to set custom iframe dimensions 132 css: {}, 133 134 // Iframe tag attributes 135 attr: { 136 scrolling: "auto" 137 } 138 }, 139 140 // For HTML5 video only 141 video: { 142 tpl: '<video class="fancybox-video" controls controlsList="nodownload" poster="{{poster}}">' + 143 '<source src="{{src}}" type="{{format}}" />' + 144 'Sorry, your browser doesn\'t support embedded videos, <a href="{{src}}">download</a> and watch with your favorite video player!' + 145 "</video>", 146 format: "", // custom video format 147 autoStart: true 148 }, 149 150 // Default content type if cannot be detected automatically 151 defaultType: "image", 152 153 // Open/close animation type 154 // Possible values: 155 // false - disable 156 // "zoom" - zoom images from/to thumbnail 157 // "fade" 158 // "zoom-in-out" 159 // 160 animationEffect: "zoom", 161 162 // Duration in ms for open/close animation 163 animationDuration: 366, 164 165 // Should image change opacity while zooming 166 // If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios 167 zoomOpacity: "auto", 168 169 // Transition effect between slides 170 // 171 // Possible values: 172 // false - disable 173 // "fade' 174 // "slide' 175 // "circular' 176 // "tube' 177 // "zoom-in-out' 178 // "rotate' 179 // 180 transitionEffect: "fade", 181 182 // Duration in ms for transition animation 183 transitionDuration: 366, 184 185 // Custom CSS class for slide element 186 slideClass: "", 187 188 // Custom CSS class for layout 189 baseClass: "", 190 191 // Base template for layout 192 baseTpl: '<div class="fancybox-container" role="dialog" tabindex="-1">' + 193 '<div class="fancybox-bg"></div>' + 194 '<div class="fancybox-inner">' + 195 '<div class="fancybox-infobar"><span data-fancybox-index></span> / <span data-fancybox-count></span></div>' + 196 '<div class="fancybox-toolbar">{{buttons}}</div>' + 197 '<div class="fancybox-navigation">{{arrows}}</div>' + 198 '<div class="fancybox-stage"></div>' + 199 '<div class="fancybox-caption"><div class="fancybox-caption__body"></div></div>' + 200 "</div>" + 201 "</div>", 202 203 // Loading indicator template 204 spinnerTpl: '<div class="fancybox-loading"></div>', 205 206 // Error message template 207 errorTpl: '<div class="fancybox-error"><p>{{ERROR}}</p></div>', 208 209 btnTpl: { 210 download: '<a download data-fancybox-download class="fancybox-button fancybox-button--download" title="{{DOWNLOAD}}" href="javascript:;">' + 211 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.62 17.09V19H5.38v-1.91zm-2.97-6.96L17 11.45l-5 4.87-5-4.87 1.36-1.32 2.68 2.64V5h1.92v7.77z"/></svg>' + 212 "</a>", 213 214 zoom: '<button data-fancybox-zoom class="fancybox-button fancybox-button--zoom" title="{{ZOOM}}">' + 215 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.7 17.3l-3-3a5.9 5.9 0 0 0-.6-7.6 5.9 5.9 0 0 0-8.4 0 5.9 5.9 0 0 0 0 8.4 5.9 5.9 0 0 0 7.7.7l3 3a1 1 0 0 0 1.3 0c.4-.5.4-1 0-1.5zM8.1 13.8a4 4 0 0 1 0-5.7 4 4 0 0 1 5.7 0 4 4 0 0 1 0 5.7 4 4 0 0 1-5.7 0z"/></svg>' + 216 "</button>", 217 218 close: '<button data-fancybox-close class="fancybox-button fancybox-button--close" title="{{CLOSE}}">' + 219 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 10.6L6.6 5.2 5.2 6.6l5.4 5.4-5.4 5.4 1.4 1.4 5.4-5.4 5.4 5.4 1.4-1.4-5.4-5.4 5.4-5.4-1.4-1.4-5.4 5.4z"/></svg>' + 220 "</button>", 221 222 // Arrows 223 arrowLeft: '<button data-fancybox-prev class="fancybox-button fancybox-button--arrow_left" title="{{PREV}}">' + 224 '<div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.28 15.7l-1.34 1.37L5 12l4.94-5.07 1.34 1.38-2.68 2.72H19v1.94H8.6z"/></svg></div>' + 225 "</button>", 226 227 arrowRight: '<button data-fancybox-next class="fancybox-button fancybox-button--arrow_right" title="{{NEXT}}">' + 228 '<div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.4 12.97l-2.68 2.72 1.34 1.38L19 12l-4.94-5.07-1.34 1.38 2.68 2.72H5v1.94z"/></svg></div>' + 229 "</button>", 230 231 // This small close button will be appended to your html/inline/ajax content by default, 232 // if "smallBtn" option is not set to false 233 smallBtn: '<button type="button" data-fancybox-close class="fancybox-button fancybox-close-small" title="{{CLOSE}}">' + 234 '<svg xmlns="http://www.w3.org/2000/svg" version="1" viewBox="0 0 24 24"><path d="M13 12l5-5-1-1-5 5-5-5-1 1 5 5-5 5 1 1 5-5 5 5 1-1z"/></svg>' + 235 "</button>" 236 }, 237 238 // Container is injected into this element 239 parentEl: "body", 240 241 // Hide browser vertical scrollbars; use at your own risk 242 hideScrollbar: true, 243 244 // Focus handling 245 // ============== 246 247 // Try to focus on the first focusable element after opening 248 autoFocus: true, 249 250 // Put focus back to active element after closing 251 backFocus: true, 252 253 // Do not let user to focus on element outside modal content 254 trapFocus: true, 255 256 // Module specific options 257 // ======================= 258 259 fullScreen: { 260 autoStart: false 261 }, 262 263 // Set `touch: false` to disable panning/swiping 264 touch: { 265 vertical: true, // Allow to drag content vertically 266 momentum: true // Continue movement after releasing mouse/touch when panning 267 }, 268 269 // Hash value when initializing manually, 270 // set `false` to disable hash change 271 hash: null, 272 273 // Customize or add new media types 274 // Example: 275 /* 276 media : { 277 youtube : { 278 params : { 279 autoplay : 0 280 } 281 } 282 } 283 */ 284 media: {}, 285 286 slideShow: { 287 autoStart: false, 288 speed: 3000 289 }, 290 291 thumbs: { 292 autoStart: false, // Display thumbnails on opening 293 hideOnClose: true, // Hide thumbnail grid when closing animation starts 294 parentEl: ".fancybox-container", // Container is injected into this element 295 axis: "y" // Vertical (y) or horizontal (x) scrolling 296 }, 297 298 // Use mousewheel to navigate gallery 299 // If 'auto' - enabled for images only 300 wheel: "auto", 301 302 // Callbacks 303 //========== 304 305 // See Documentation/API/Events for more information 306 // Example: 307 /* 308 afterShow: function( instance, current ) { 309 console.info( 'Clicked element:' ); 310 console.info( current.opts.$orig ); 311 } 312 */ 313 314 onInit: $.noop, // When instance has been initialized 315 316 beforeLoad: $.noop, // Before the content of a slide is being loaded 317 afterLoad: $.noop, // When the content of a slide is done loading 318 319 beforeShow: $.noop, // Before open animation starts 320 afterShow: $.noop, // When content is done loading and animating 321 322 beforeClose: $.noop, // Before the instance attempts to close. Return false to cancel the close. 323 afterClose: $.noop, // After instance has been closed 324 325 onActivate: $.noop, // When instance is brought to front 326 onDeactivate: $.noop, // When other instance has been activated 327 328 // Interaction 329 // =========== 330 331 // Use options below to customize taken action when user clicks or double clicks on the fancyBox area, 332 // each option can be string or method that returns value. 333 // 334 // Possible values: 335 // "close" - close instance 336 // "next" - move to next gallery item 337 // "nextOrClose" - move to next gallery item or close if gallery has only one item 338 // "toggleControls" - show/hide controls 339 // "zoom" - zoom image (if loaded) 340 // false - do nothing 341 342 // Clicked on the content 343 clickContent: function (current, event) { 344 return current.type === "image" ? "zoom" : false; 345 }, 346 347 // Clicked on the slide 348 clickSlide: "close", 349 350 // Clicked on the background (backdrop) element; 351 // if you have not changed the layout, then most likely you need to use `clickSlide` option 352 clickOutside: "close", 353 354 // Same as previous two, but for double click 355 dblclickContent: false, 356 dblclickSlide: false, 357 dblclickOutside: false, 358 359 // Custom options when mobile device is detected 360 // ============================================= 361 362 mobile: { 363 preventCaptionOverlap: false, 364 idleTime: false, 365 clickContent: function (current, event) { 366 return current.type === "image" ? "toggleControls" : false; 367 }, 368 clickSlide: function (current, event) { 369 return current.type === "image" ? "toggleControls" : "close"; 370 }, 371 dblclickContent: function (current, event) { 372 return current.type === "image" ? "zoom" : false; 373 }, 374 dblclickSlide: function (current, event) { 375 return current.type === "image" ? "zoom" : false; 376 } 377 }, 378 379 // Internationalization 380 // ==================== 381 382 lang: "en", 383 i18n: { 384 en: { 385 CLOSE: "Close", 386 NEXT: "Next", 387 PREV: "Previous", 388 ERROR: "The requested content cannot be loaded. <br/> Please try again later.", 389 PLAY_START: "Start slideshow", 390 PLAY_STOP: "Pause slideshow", 391 FULL_SCREEN: "Full screen", 392 THUMBS: "Thumbnails", 393 DOWNLOAD: "Download", 394 SHARE: "Share", 395 ZOOM: "Zoom" 396 }, 397 de: { 398 CLOSE: "Schließen", 399 NEXT: "Weiter", 400 PREV: "Zurück", 401 ERROR: "Die angeforderten Daten konnten nicht geladen werden. <br/> Bitte versuchen Sie es später nochmal.", 402 PLAY_START: "Diaschau starten", 403 PLAY_STOP: "Diaschau beenden", 404 FULL_SCREEN: "Vollbild", 405 THUMBS: "Vorschaubilder", 406 DOWNLOAD: "Herunterladen", 407 SHARE: "Teilen", 408 ZOOM: "Vergrößern" 409 } 410 } 411 }; 412 413 // Few useful variables and methods 414 // ================================ 415 416 var $W = $(window); 417 var $D = $(document); 418 419 var called = 0; 420 421 // Check if an object is a jQuery object and not a native JavaScript object 422 // ======================================================================== 423 var isQuery = function (obj) { 424 return obj && obj.hasOwnProperty && obj instanceof $; 425 }; 426 427 // Handle multiple browsers for "requestAnimationFrame" and "cancelAnimationFrame" 428 // =============================================================================== 429 var requestAFrame = (function () { 430 return ( 431 window.requestAnimationFrame || 432 window.webkitRequestAnimationFrame || 433 window.mozRequestAnimationFrame || 434 window.oRequestAnimationFrame || 435 // if all else fails, use setTimeout 436 function (callback) { 437 return window.setTimeout(callback, 1000 / 60); 438 } 439 ); 440 })(); 441 442 var cancelAFrame = (function () { 443 return ( 444 window.cancelAnimationFrame || 445 window.webkitCancelAnimationFrame || 446 window.mozCancelAnimationFrame || 447 window.oCancelAnimationFrame || 448 function (id) { 449 window.clearTimeout(id); 450 } 451 ); 452 })(); 453 454 // Detect the supported transition-end event property name 455 // ======================================================= 456 var transitionEnd = (function () { 457 var el = document.createElement("fakeelement"), 458 t; 459 460 var transitions = { 461 transition: "transitionend", 462 OTransition: "oTransitionEnd", 463 MozTransition: "transitionend", 464 WebkitTransition: "webkitTransitionEnd" 465 }; 466 467 for (t in transitions) { 468 if (el.style[t] !== undefined) { 469 return transitions[t]; 470 } 471 } 472 473 return "transitionend"; 474 })(); 475 476 // Force redraw on an element. 477 // This helps in cases where the browser doesn't redraw an updated element properly 478 // ================================================================================ 479 var forceRedraw = function ($el) { 480 return $el && $el.length && $el[0].offsetHeight; 481 }; 482 483 // Exclude array (`buttons`) options from deep merging 484 // =================================================== 485 var mergeOpts = function (opts1, opts2) { 486 var rez = $.extend(true, {}, opts1, opts2); 487 488 $.each(opts2, function (key, value) { 489 if ($.isArray(value)) { 490 rez[key] = value; 491 } 492 }); 493 494 return rez; 495 }; 496 497 // How much of an element is visible in viewport 498 // ============================================= 499 500 var inViewport = function (elem) { 501 var elemCenter, rez; 502 503 if (!elem || elem.ownerDocument !== document) { 504 return false; 505 } 506 507 $(".fancybox-container").css("pointer-events", "none"); 508 509 elemCenter = { 510 x: elem.getBoundingClientRect().left + elem.offsetWidth / 2, 511 y: elem.getBoundingClientRect().top + elem.offsetHeight / 2 512 }; 513 514 rez = document.elementFromPoint(elemCenter.x, elemCenter.y) === elem; 515 516 $(".fancybox-container").css("pointer-events", ""); 517 518 return rez; 519 }; 520 521 // Class definition 522 // ================ 523 524 var FancyBox = function (content, opts, index) { 525 var self = this; 526 527 self.opts = mergeOpts({ 528 index: index 529 }, $.fancybox.defaults); 530 531 if ($.isPlainObject(opts)) { 532 self.opts = mergeOpts(self.opts, opts); 533 } 534 535 if ($.fancybox.isMobile) { 536 self.opts = mergeOpts(self.opts, self.opts.mobile); 537 } 538 539 self.id = self.opts.id || ++called; 540 541 self.currIndex = parseInt(self.opts.index, 10) || 0; 542 self.prevIndex = null; 543 544 self.prevPos = null; 545 self.currPos = 0; 546 547 self.firstRun = true; 548 549 // All group items 550 self.group = []; 551 552 // Existing slides (for current, next and previous gallery items) 553 self.slides = {}; 554 555 // Create group elements 556 self.addContent(content); 557 558 if (!self.group.length) { 559 return; 560 } 561 562 self.init(); 563 }; 564 565 $.extend(FancyBox.prototype, { 566 // Create DOM structure 567 // ==================== 568 569 init: function () { 570 var self = this, 571 firstItem = self.group[self.currIndex], 572 firstItemOpts = firstItem.opts, 573 $container, 574 buttonStr; 575 576 if (firstItemOpts.closeExisting) { 577 $.fancybox.close(true); 578 } 579 580 // Hide scrollbars 581 // =============== 582 583 $("body").addClass("fancybox-active"); 584 585 if ( 586 !$.fancybox.getInstance() && 587 firstItemOpts.hideScrollbar !== false && 588 !$.fancybox.isMobile && 589 document.body.scrollHeight > window.innerHeight 590 ) { 591 $("head").append( 592 '<style id="fancybox-style-noscroll" type="text/css">.compensate-for-scrollbar{margin-right:' + 593 (window.innerWidth - document.documentElement.clientWidth) + 594 "px;}</style>" 595 ); 596 597 $("body").addClass("compensate-for-scrollbar"); 598 } 599 600 // Build html markup and set references 601 // ==================================== 602 603 // Build html code for buttons and insert into main template 604 buttonStr = ""; 605 606 $.each(firstItemOpts.buttons, function (index, value) { 607 buttonStr += firstItemOpts.btnTpl[value] || ""; 608 }); 609 610 // Create markup from base template, it will be initially hidden to 611 // avoid unnecessary work like painting while initializing is not complete 612 $container = $( 613 self.translate( 614 self, 615 firstItemOpts.baseTpl 616 .replace("{{buttons}}", buttonStr) 617 .replace("{{arrows}}", firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight) 618 ) 619 ) 620 .attr("id", "fancybox-container-" + self.id) 621 .addClass(firstItemOpts.baseClass) 622 .data("FancyBox", self) 623 .appendTo(firstItemOpts.parentEl); 624 625 // Create object holding references to jQuery wrapped nodes 626 self.$refs = { 627 container: $container 628 }; 629 630 ["bg", "inner", "infobar", "toolbar", "stage", "caption", "navigation"].forEach(function (item) { 631 self.$refs[item] = $container.find(".fancybox-" + item); 632 }); 633 634 self.trigger("onInit"); 635 636 // Enable events, deactive previous instances 637 self.activate(); 638 639 // Build slides, load and reveal content 640 self.jumpTo(self.currIndex); 641 }, 642 643 // Simple i18n support - replaces object keys found in template 644 // with corresponding values 645 // ============================================================ 646 647 translate: function (obj, str) { 648 var arr = obj.opts.i18n[obj.opts.lang] || obj.opts.i18n.en; 649 650 return str.replace(/\{\{(\w+)\}\}/g, function (match, n) { 651 return arr[n] === undefined ? match : arr[n]; 652 }); 653 }, 654 655 // Populate current group with fresh content 656 // Check if each object has valid type and content 657 // =============================================== 658 659 addContent: function (content) { 660 var self = this, 661 items = $.makeArray(content), 662 thumbs; 663 664 $.each(items, function (i, item) { 665 var obj = {}, 666 opts = {}, 667 $item, 668 type, 669 found, 670 src, 671 srcParts; 672 673 // Step 1 - Make sure we have an object 674 // ==================================== 675 676 if ($.isPlainObject(item)) { 677 // We probably have manual usage here, something like 678 // $.fancybox.open( [ { src : "image.jpg", type : "image" } ] ) 679 680 obj = item; 681 opts = item.opts || item; 682 } else if ($.type(item) === "object" && $(item).length) { 683 // Here we probably have jQuery collection returned by some selector 684 $item = $(item); 685 686 // Support attributes like `data-options='{"touch" : false}'` and `data-touch='false'` 687 opts = $item.data() || {}; 688 opts = $.extend(true, {}, opts, opts.options); 689 690 // Here we store clicked element 691 opts.$orig = $item; 692 693 obj.src = self.opts.src || opts.src || $item.attr("href"); 694 695 // Assume that simple syntax is used, for example: 696 // `$.fancybox.open( $("#test"), {} );` 697 if (!obj.type && !obj.src) { 698 obj.type = "inline"; 699 obj.src = item; 700 } 701 } else { 702 // Assume we have a simple html code, for example: 703 // $.fancybox.open( '<div><h1>Hi!</h1></div>' ); 704 obj = { 705 type: "html", 706 src: item + "" 707 }; 708 } 709 710 // Each gallery object has full collection of options 711 obj.opts = $.extend(true, {}, self.opts, opts); 712 713 // Do not merge buttons array 714 if ($.isArray(opts.buttons)) { 715 obj.opts.buttons = opts.buttons; 716 } 717 718 if ($.fancybox.isMobile && obj.opts.mobile) { 719 obj.opts = mergeOpts(obj.opts, obj.opts.mobile); 720 } 721 722 // Step 2 - Make sure we have content type, if not - try to guess 723 // ============================================================== 724 725 type = obj.type || obj.opts.type; 726 src = obj.src || ""; 727 728 if (!type && src) { 729 if ((found = src.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))) { 730 type = "video"; 731 732 if (!obj.opts.video.format) { 733 obj.opts.video.format = "video/" + (found[1] === "ogv" ? "ogg" : found[1]); 734 } 735 } else if (src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)) { 736 type = "image"; 737 } else if (src.match(/\.(pdf)((\?|#).*)?$/i)) { 738 type = "iframe"; 739 obj = $.extend(true, obj, { 740 contentType: "pdf", 741 opts: { 742 iframe: { 743 preload: false 744 } 745 } 746 }); 747 } else if (src.charAt(0) === "#") { 748 type = "inline"; 749 } 750 } 751 752 if (type) { 753 obj.type = type; 754 } else { 755 self.trigger("objectNeedsType", obj); 756 } 757 758 if (!obj.contentType) { 759 obj.contentType = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1 ? "html" : obj.type; 760 } 761 762 // Step 3 - Some adjustments 763 // ========================= 764 765 obj.index = self.group.length; 766 767 if (obj.opts.smallBtn == "auto") { 768 obj.opts.smallBtn = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1; 769 } 770 771 if (obj.opts.toolbar === "auto") { 772 obj.opts.toolbar = !obj.opts.smallBtn; 773 } 774 775 // Find thumbnail image, check if exists and if is in the viewport 776 obj.$thumb = obj.opts.$thumb || null; 777 778 if (obj.opts.$trigger && obj.index === self.opts.index) { 779 obj.$thumb = obj.opts.$trigger.find("img:first"); 780 781 if (obj.$thumb.length) { 782 obj.opts.$orig = obj.opts.$trigger; 783 } 784 } 785 786 if (!(obj.$thumb && obj.$thumb.length) && obj.opts.$orig) { 787 obj.$thumb = obj.opts.$orig.find("img:first"); 788 } 789 790 if (obj.$thumb && !obj.$thumb.length) { 791 obj.$thumb = null; 792 } 793 794 obj.thumb = obj.opts.thumb || (obj.$thumb ? obj.$thumb[0].src : null); 795 796 // "caption" is a "special" option, it can be used to customize caption per gallery item 797 if ($.type(obj.opts.caption) === "function") { 798 obj.opts.caption = obj.opts.caption.apply(item, [self, obj]); 799 } 800 801 if ($.type(self.opts.caption) === "function") { 802 obj.opts.caption = self.opts.caption.apply(item, [self, obj]); 803 } 804 805 // Make sure we have caption as a string or jQuery object 806 if (!(obj.opts.caption instanceof $)) { 807 obj.opts.caption = obj.opts.caption === undefined ? "" : obj.opts.caption + ""; 808 } 809 810 // Check if url contains "filter" used to filter the content 811 // Example: "ajax.html #something" 812 if (obj.type === "ajax") { 813 srcParts = src.split(/\s+/, 2); 814 815 if (srcParts.length > 1) { 816 obj.src = srcParts.shift(); 817 818 obj.opts.filter = srcParts.shift(); 819 } 820 } 821 822 // Hide all buttons and disable interactivity for modal items 823 if (obj.opts.modal) { 824 obj.opts = $.extend(true, obj.opts, { 825 trapFocus: true, 826 // Remove buttons 827 infobar: 0, 828 toolbar: 0, 829 830 smallBtn: 0, 831 832 // Disable keyboard navigation 833 keyboard: 0, 834 835 // Disable some modules 836 slideShow: 0, 837 fullScreen: 0, 838 thumbs: 0, 839 touch: 0, 840 841 // Disable click event handlers 842 clickContent: false, 843 clickSlide: false, 844 clickOutside: false, 845 dblclickContent: false, 846 dblclickSlide: false, 847 dblclickOutside: false 848 }); 849 } 850 851 // Step 4 - Add processed object to group 852 // ====================================== 853 854 self.group.push(obj); 855 }); 856 857 // Update controls if gallery is already opened 858 if (Object.keys(self.slides).length) { 859 self.updateControls(); 860 861 // Update thumbnails, if needed 862 thumbs = self.Thumbs; 863 864 if (thumbs && thumbs.isActive) { 865 thumbs.create(); 866 867 thumbs.focus(); 868 } 869 } 870 }, 871 872 // Attach an event handler functions for: 873 // - navigation buttons 874 // - browser scrolling, resizing; 875 // - focusing 876 // - keyboard 877 // - detecting inactivity 878 // ====================================== 879 880 addEvents: function () { 881 var self = this; 882 883 self.removeEvents(); 884 885 // Make navigation elements clickable 886 // ================================== 887 888 self.$refs.container 889 .on("click.fb-close", "[data-fancybox-close]", function (e) { 890 e.stopPropagation(); 891 e.preventDefault(); 892 893 self.close(e); 894 }) 895 .on("touchstart.fb-prev click.fb-prev", "[data-fancybox-prev]", function (e) { 896 e.stopPropagation(); 897 e.preventDefault(); 898 899 self.previous(); 900 }) 901 .on("touchstart.fb-next click.fb-next", "[data-fancybox-next]", function (e) { 902 e.stopPropagation(); 903 e.preventDefault(); 904 905 self.next(); 906 }) 907 .on("click.fb", "[data-fancybox-zoom]", function (e) { 908 // Click handler for zoom button 909 self[self.isScaledDown() ? "scaleToActual" : "scaleToFit"](); 910 }); 911 912 // Handle page scrolling and browser resizing 913 // ========================================== 914 915 $W.on("orientationchange.fb resize.fb", function (e) { 916 if (e && e.originalEvent && e.originalEvent.type === "resize") { 917 if (self.requestId) { 918 cancelAFrame(self.requestId); 919 } 920 921 self.requestId = requestAFrame(function () { 922 self.update(e); 923 }); 924 } else { 925 if (self.current && self.current.type === "iframe") { 926 self.$refs.stage.hide(); 927 } 928 929 setTimeout( 930 function () { 931 self.$refs.stage.show(); 932 933 self.update(e); 934 }, 935 $.fancybox.isMobile ? 600 : 250 936 ); 937 } 938 }); 939 940 $D.on("keydown.fb", function (e) { 941 var instance = $.fancybox ? $.fancybox.getInstance() : null, 942 current = instance.current, 943 keycode = e.keyCode || e.which; 944 945 // Trap keyboard focus inside of the modal 946 // ======================================= 947 948 if (keycode == 9) { 949 if (current.opts.trapFocus) { 950 self.focus(e); 951 } 952 953 return; 954 } 955 956 // Enable keyboard navigation 957 // ========================== 958 959 if (!current.opts.keyboard || e.ctrlKey || e.altKey || e.shiftKey || $(e.target).is("input,textarea,video,audio,select")) { 960 return; 961 } 962 963 // Backspace and Esc keys 964 if (keycode === 8 || keycode === 27) { 965 e.preventDefault(); 966 967 self.close(e); 968 969 return; 970 } 971 972 // Left arrow and Up arrow 973 if (keycode === 37 || keycode === 38) { 974 e.preventDefault(); 975 976 self.previous(); 977 978 return; 979 } 980 981 // Righ arrow and Down arrow 982 if (keycode === 39 || keycode === 40) { 983 e.preventDefault(); 984 985 self.next(); 986 987 return; 988 } 989 990 self.trigger("afterKeydown", e, keycode); 991 }); 992 993 // Hide controls after some inactivity period 994 if (self.group[self.currIndex].opts.idleTime) { 995 self.idleSecondsCounter = 0; 996 997 $D.on( 998 "mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle", 999 function (e) { 1000 self.idleSecondsCounter = 0; 1001 1002 if (self.isIdle) { 1003 self.showControls(); 1004 } 1005 1006 self.isIdle = false; 1007 } 1008 ); 1009 1010 self.idleInterval = window.setInterval(function () { 1011 self.idleSecondsCounter++; 1012 1013 if (self.idleSecondsCounter >= self.group[self.currIndex].opts.idleTime && !self.isDragging) { 1014 self.isIdle = true; 1015 self.idleSecondsCounter = 0; 1016 1017 self.hideControls(); 1018 } 1019 }, 1000); 1020 } 1021 }, 1022 1023 // Remove events added by the core 1024 // =============================== 1025 1026 removeEvents: function () { 1027 var self = this; 1028 1029 $W.off("orientationchange.fb resize.fb"); 1030 $D.off("keydown.fb .fb-idle"); 1031 1032 this.$refs.container.off(".fb-close .fb-prev .fb-next"); 1033 1034 if (self.idleInterval) { 1035 window.clearInterval(self.idleInterval); 1036 1037 self.idleInterval = null; 1038 } 1039 }, 1040 1041 // Change to previous gallery item 1042 // =============================== 1043 1044 previous: function (duration) { 1045 return this.jumpTo(this.currPos - 1, duration); 1046 }, 1047 1048 // Change to next gallery item 1049 // =========================== 1050 1051 next: function (duration) { 1052 return this.jumpTo(this.currPos + 1, duration); 1053 }, 1054 1055 // Switch to selected gallery item 1056 // =============================== 1057 1058 jumpTo: function (pos, duration) { 1059 var self = this, 1060 groupLen = self.group.length, 1061 firstRun, 1062 isMoved, 1063 loop, 1064 current, 1065 previous, 1066 slidePos, 1067 stagePos, 1068 prop, 1069 diff; 1070 1071 if (self.isDragging || self.isClosing || (self.isAnimating && self.firstRun)) { 1072 return; 1073 } 1074 1075 // Should loop? 1076 pos = parseInt(pos, 10); 1077 loop = self.current ? self.current.opts.loop : self.opts.loop; 1078 1079 if (!loop && (pos < 0 || pos >= groupLen)) { 1080 return false; 1081 } 1082 1083 // Check if opening for the first time; this helps to speed things up 1084 firstRun = self.firstRun = !Object.keys(self.slides).length; 1085 1086 // Create slides 1087 previous = self.current; 1088 1089 self.prevIndex = self.currIndex; 1090 self.prevPos = self.currPos; 1091 1092 current = self.createSlide(pos); 1093 1094 if (groupLen > 1) { 1095 if (loop || current.index < groupLen - 1) { 1096 self.createSlide(pos + 1); 1097 } 1098 1099 if (loop || current.index > 0) { 1100 self.createSlide(pos - 1); 1101 } 1102 } 1103 1104 self.current = current; 1105 self.currIndex = current.index; 1106 self.currPos = current.pos; 1107 1108 self.trigger("beforeShow", firstRun); 1109 1110 self.updateControls(); 1111 1112 // Validate duration length 1113 current.forcedDuration = undefined; 1114 1115 if ($.isNumeric(duration)) { 1116 current.forcedDuration = duration; 1117 } else { 1118 duration = current.opts[firstRun ? "animationDuration" : "transitionDuration"]; 1119 } 1120 1121 duration = parseInt(duration, 10); 1122 1123 // Check if user has swiped the slides or if still animating 1124 isMoved = self.isMoved(current); 1125 1126 // Make sure current slide is visible 1127 current.$slide.addClass("fancybox-slide--current"); 1128 1129 // Fresh start - reveal container, current slide and start loading content 1130 if (firstRun) { 1131 if (current.opts.animationEffect && duration) { 1132 self.$refs.container.css("transition-duration", duration + "ms"); 1133 } 1134 1135 self.$refs.container.addClass("fancybox-is-open").trigger("focus"); 1136 1137 // Attempt to load content into slide 1138 // This will later call `afterLoad` -> `revealContent` 1139 self.loadSlide(current); 1140 1141 self.preload("image"); 1142 1143 return; 1144 } 1145 1146 // Get actual slide/stage positions (before cleaning up) 1147 slidePos = $.fancybox.getTranslate(previous.$slide); 1148 stagePos = $.fancybox.getTranslate(self.$refs.stage); 1149 1150 // Clean up all slides 1151 $.each(self.slides, function (index, slide) { 1152 $.fancybox.stop(slide.$slide, true); 1153 }); 1154 1155 if (previous.pos !== current.pos) { 1156 previous.isComplete = false; 1157 } 1158 1159 previous.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"); 1160 1161 // If slides are out of place, then animate them to correct position 1162 if (isMoved) { 1163 // Calculate horizontal swipe distance 1164 diff = slidePos.left - (previous.pos * slidePos.width + previous.pos * previous.opts.gutter); 1165 1166 $.each(self.slides, function (index, slide) { 1167 slide.$slide.removeClass("fancybox-animated").removeClass(function (index, className) { 1168 return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); 1169 }); 1170 1171 // Make sure that each slide is in equal distance 1172 // This is mostly needed for freshly added slides, because they are not yet positioned 1173 var leftPos = slide.pos * slidePos.width + slide.pos * slide.opts.gutter; 1174 1175 $.fancybox.setTranslate(slide.$slide, { 1176 top: 0, 1177 left: leftPos - stagePos.left + diff 1178 }); 1179 1180 if (slide.pos !== current.pos) { 1181 slide.$slide.addClass("fancybox-slide--" + (slide.pos > current.pos ? "next" : "previous")); 1182 } 1183 1184 // Redraw to make sure that transition will start 1185 forceRedraw(slide.$slide); 1186 1187 // Animate the slide 1188 $.fancybox.animate( 1189 slide.$slide, { 1190 top: 0, 1191 left: (slide.pos - current.pos) * slidePos.width + (slide.pos - current.pos) * slide.opts.gutter 1192 }, 1193 duration, 1194 function () { 1195 slide.$slide 1196 .css({ 1197 transform: "", 1198 opacity: "" 1199 }) 1200 .removeClass("fancybox-slide--next fancybox-slide--previous"); 1201 1202 if (slide.pos === self.currPos) { 1203 self.complete(); 1204 } 1205 } 1206 ); 1207 }); 1208 } else if (duration && current.opts.transitionEffect) { 1209 // Set transition effect for previously active slide 1210 prop = "fancybox-animated fancybox-fx-" + current.opts.transitionEffect; 1211 1212 previous.$slide.addClass("fancybox-slide--" + (previous.pos > current.pos ? "next" : "previous")); 1213 1214 $.fancybox.animate( 1215 previous.$slide, 1216 prop, 1217 duration, 1218 function () { 1219 previous.$slide.removeClass(prop).removeClass("fancybox-slide--next fancybox-slide--previous"); 1220 }, 1221 false 1222 ); 1223 } 1224 1225 if (current.isLoaded) { 1226 self.revealContent(current); 1227 } else { 1228 self.loadSlide(current); 1229 } 1230 1231 self.preload("image"); 1232 }, 1233 1234 // Create new "slide" element 1235 // These are gallery items that are actually added to DOM 1236 // ======================================================= 1237 1238 createSlide: function (pos) { 1239 var self = this, 1240 $slide, 1241 index; 1242 1243 index = pos % self.group.length; 1244 index = index < 0 ? self.group.length + index : index; 1245 1246 if (!self.slides[pos] && self.group[index]) { 1247 $slide = $('<div class="fancybox-slide"></div>').appendTo(self.$refs.stage); 1248 1249 self.slides[pos] = $.extend(true, {}, self.group[index], { 1250 pos: pos, 1251 $slide: $slide, 1252 isLoaded: false 1253 }); 1254 1255 self.updateSlide(self.slides[pos]); 1256 } 1257 1258 return self.slides[pos]; 1259 }, 1260 1261 // Scale image to the actual size of the image; 1262 // x and y values should be relative to the slide 1263 // ============================================== 1264 1265 scaleToActual: function (x, y, duration) { 1266 var self = this, 1267 current = self.current, 1268 $content = current.$content, 1269 canvasWidth = $.fancybox.getTranslate(current.$slide).width, 1270 canvasHeight = $.fancybox.getTranslate(current.$slide).height, 1271 newImgWidth = current.width, 1272 newImgHeight = current.height, 1273 imgPos, 1274 posX, 1275 posY, 1276 scaleX, 1277 scaleY; 1278 1279 if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { 1280 return; 1281 } 1282 1283 self.isAnimating = true; 1284 1285 $.fancybox.stop($content); 1286 1287 x = x === undefined ? canvasWidth * 0.5 : x; 1288 y = y === undefined ? canvasHeight * 0.5 : y; 1289 1290 imgPos = $.fancybox.getTranslate($content); 1291 1292 imgPos.top -= $.fancybox.getTranslate(current.$slide).top; 1293 imgPos.left -= $.fancybox.getTranslate(current.$slide).left; 1294 1295 scaleX = newImgWidth / imgPos.width; 1296 scaleY = newImgHeight / imgPos.height; 1297 1298 // Get center position for original image 1299 posX = canvasWidth * 0.5 - newImgWidth * 0.5; 1300 posY = canvasHeight * 0.5 - newImgHeight * 0.5; 1301 1302 // Make sure image does not move away from edges 1303 if (newImgWidth > canvasWidth) { 1304 posX = imgPos.left * scaleX - (x * scaleX - x); 1305 1306 if (posX > 0) { 1307 posX = 0; 1308 } 1309 1310 if (posX < canvasWidth - newImgWidth) { 1311 posX = canvasWidth - newImgWidth; 1312 } 1313 } 1314 1315 if (newImgHeight > canvasHeight) { 1316 posY = imgPos.top * scaleY - (y * scaleY - y); 1317 1318 if (posY > 0) { 1319 posY = 0; 1320 } 1321 1322 if (posY < canvasHeight - newImgHeight) { 1323 posY = canvasHeight - newImgHeight; 1324 } 1325 } 1326 1327 self.updateCursor(newImgWidth, newImgHeight); 1328 1329 $.fancybox.animate( 1330 $content, { 1331 top: posY, 1332 left: posX, 1333 scaleX: scaleX, 1334 scaleY: scaleY 1335 }, 1336 duration || 366, 1337 function () { 1338 self.isAnimating = false; 1339 } 1340 ); 1341 1342 // Stop slideshow 1343 if (self.SlideShow && self.SlideShow.isActive) { 1344 self.SlideShow.stop(); 1345 } 1346 }, 1347 1348 // Scale image to fit inside parent element 1349 // ======================================== 1350 1351 scaleToFit: function (duration) { 1352 var self = this, 1353 current = self.current, 1354 $content = current.$content, 1355 end; 1356 1357 if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { 1358 return; 1359 } 1360 1361 self.isAnimating = true; 1362 1363 $.fancybox.stop($content); 1364 1365 end = self.getFitPos(current); 1366 1367 self.updateCursor(end.width, end.height); 1368 1369 $.fancybox.animate( 1370 $content, { 1371 top: end.top, 1372 left: end.left, 1373 scaleX: end.width / $content.width(), 1374 scaleY: end.height / $content.height() 1375 }, 1376 duration || 366, 1377 function () { 1378 self.isAnimating = false; 1379 } 1380 ); 1381 }, 1382 1383 // Calculate image size to fit inside viewport 1384 // =========================================== 1385 1386 getFitPos: function (slide) { 1387 var self = this, 1388 $content = slide.$content, 1389 $slide = slide.$slide, 1390 width = slide.width || slide.opts.width, 1391 height = slide.height || slide.opts.height, 1392 maxWidth, 1393 maxHeight, 1394 minRatio, 1395 aspectRatio, 1396 rez = {}; 1397 1398 if (!slide.isLoaded || !$content || !$content.length) { 1399 return false; 1400 } 1401 1402 maxWidth = $.fancybox.getTranslate(self.$refs.stage).width; 1403 maxHeight = $.fancybox.getTranslate(self.$refs.stage).height; 1404 1405 maxWidth -= 1406 parseFloat($slide.css("paddingLeft")) + 1407 parseFloat($slide.css("paddingRight")) + 1408 parseFloat($content.css("marginLeft")) + 1409 parseFloat($content.css("marginRight")); 1410 1411 maxHeight -= 1412 parseFloat($slide.css("paddingTop")) + 1413 parseFloat($slide.css("paddingBottom")) + 1414 parseFloat($content.css("marginTop")) + 1415 parseFloat($content.css("marginBottom")); 1416 1417 if (!width || !height) { 1418 width = maxWidth; 1419 height = maxHeight; 1420 } 1421 1422 minRatio = Math.min(1, maxWidth / width, maxHeight / height); 1423 1424 width = minRatio * width; 1425 height = minRatio * height; 1426 1427 // Adjust width/height to precisely fit into container 1428 if (width > maxWidth - 0.5) { 1429 width = maxWidth; 1430 } 1431 1432 if (height > maxHeight - 0.5) { 1433 height = maxHeight; 1434 } 1435 1436 if (slide.type === "image") { 1437 rez.top = Math.floor((maxHeight - height) * 0.5) + parseFloat($slide.css("paddingTop")); 1438 rez.left = Math.floor((maxWidth - width) * 0.5) + parseFloat($slide.css("paddingLeft")); 1439 } else if (slide.contentType === "video") { 1440 // Force aspect ratio for the video 1441 // "I say the whole world must learn of our peaceful ways… by force!" 1442 aspectRatio = slide.opts.width && slide.opts.height ? width / height : slide.opts.ratio || 16 / 9; 1443 1444 if (height > width / aspectRatio) { 1445 height = width / aspectRatio; 1446 } else if (width > height * aspectRatio) { 1447 width = height * aspectRatio; 1448 } 1449 } 1450 1451 rez.width = width; 1452 rez.height = height; 1453 1454 return rez; 1455 }, 1456 1457 // Update content size and position for all slides 1458 // ============================================== 1459 1460 update: function (e) { 1461 var self = this; 1462 1463 $.each(self.slides, function (key, slide) { 1464 self.updateSlide(slide, e); 1465 }); 1466 }, 1467 1468 // Update slide content position and size 1469 // ====================================== 1470 1471 updateSlide: function (slide, e) { 1472 var self = this, 1473 $content = slide && slide.$content, 1474 width = slide.width || slide.opts.width, 1475 height = slide.height || slide.opts.height, 1476 $slide = slide.$slide; 1477 1478 // First, prevent caption overlap, if needed 1479 self.adjustCaption(slide); 1480 1481 // Then resize content to fit inside the slide 1482 if ($content && (width || height || slide.contentType === "video") && !slide.hasError) { 1483 $.fancybox.stop($content); 1484 1485 $.fancybox.setTranslate($content, self.getFitPos(slide)); 1486 1487 if (slide.pos === self.currPos) { 1488 self.isAnimating = false; 1489 1490 self.updateCursor(); 1491 } 1492 } 1493 1494 // Then some adjustments 1495 self.adjustLayout(slide); 1496 1497 if ($slide.length) { 1498 $slide.trigger("refresh"); 1499 1500 if (slide.pos === self.currPos) { 1501 self.$refs.toolbar 1502 .add(self.$refs.navigation.find(".fancybox-button--arrow_right")) 1503 .toggleClass("compensate-for-scrollbar", $slide.get(0).scrollHeight > $slide.get(0).clientHeight); 1504 } 1505 } 1506 1507 self.trigger("onUpdate", slide, e); 1508 }, 1509 1510 // Horizontally center slide 1511 // ========================= 1512 1513 centerSlide: function (duration) { 1514 var self = this, 1515 current = self.current, 1516 $slide = current.$slide; 1517 1518 if (self.isClosing || !current) { 1519 return; 1520 } 1521 1522 $slide.siblings().css({ 1523 transform: "", 1524 opacity: "" 1525 }); 1526 1527 $slide 1528 .parent() 1529 .children() 1530 .removeClass("fancybox-slide--previous fancybox-slide--next"); 1531 1532 $.fancybox.animate( 1533 $slide, { 1534 top: 0, 1535 left: 0, 1536 opacity: 1 1537 }, 1538 duration === undefined ? 0 : duration, 1539 function () { 1540 // Clean up 1541 $slide.css({ 1542 transform: "", 1543 opacity: "" 1544 }); 1545 1546 if (!current.isComplete) { 1547 self.complete(); 1548 } 1549 }, 1550 false 1551 ); 1552 }, 1553 1554 // Check if current slide is moved (swiped) 1555 // ======================================== 1556 1557 isMoved: function (slide) { 1558 var current = slide || this.current, 1559 slidePos, 1560 stagePos; 1561 1562 if (!current) { 1563 return false; 1564 } 1565 1566 stagePos = $.fancybox.getTranslate(this.$refs.stage); 1567 slidePos = $.fancybox.getTranslate(current.$slide); 1568 1569 return ( 1570 !current.$slide.hasClass("fancybox-animated") && 1571 (Math.abs(slidePos.top - stagePos.top) > 0.5 || Math.abs(slidePos.left - stagePos.left) > 0.5) 1572 ); 1573 }, 1574 1575 // Update cursor style depending if content can be zoomed 1576 // ====================================================== 1577 1578 updateCursor: function (nextWidth, nextHeight) { 1579 var self = this, 1580 current = self.current, 1581 $container = self.$refs.container, 1582 canPan, 1583 isZoomable; 1584 1585 if (!current || self.isClosing || !self.Guestures) { 1586 return; 1587 } 1588 1589 $container.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"); 1590 1591 canPan = self.canPan(nextWidth, nextHeight); 1592 1593 isZoomable = canPan ? true : self.isZoomable(); 1594 1595 $container.toggleClass("fancybox-is-zoomable", isZoomable); 1596 1597 $("[data-fancybox-zoom]").prop("disabled", !isZoomable); 1598 1599 if (canPan) { 1600 $container.addClass("fancybox-can-pan"); 1601 } else if ( 1602 isZoomable && 1603 (current.opts.clickContent === "zoom" || ($.isFunction(current.opts.clickContent) && current.opts.clickContent(current) == "zoom")) 1604 ) { 1605 $container.addClass("fancybox-can-zoomIn"); 1606 } else if (current.opts.touch && (current.opts.touch.vertical || self.group.length > 1) && current.contentType !== "video") { 1607 $container.addClass("fancybox-can-swipe"); 1608 } 1609 }, 1610 1611 // Check if current slide is zoomable 1612 // ================================== 1613 1614 isZoomable: function () { 1615 var self = this, 1616 current = self.current, 1617 fitPos; 1618 1619 // Assume that slide is zoomable if: 1620 // - image is still loading 1621 // - actual size of the image is smaller than available area 1622 if (current && !self.isClosing && current.type === "image" && !current.hasError) { 1623 if (!current.isLoaded) { 1624 return true; 1625 } 1626 1627 fitPos = self.getFitPos(current); 1628 1629 if (fitPos && (current.width > fitPos.width || current.height > fitPos.height)) { 1630 return true; 1631 } 1632 } 1633 1634 return false; 1635 }, 1636 1637 // Check if current image dimensions are smaller than actual 1638 // ========================================================= 1639 1640 isScaledDown: function (nextWidth, nextHeight) { 1641 var self = this, 1642 rez = false, 1643 current = self.current, 1644 $content = current.$content; 1645 1646 if (nextWidth !== undefined && nextHeight !== undefined) { 1647 rez = nextWidth < current.width && nextHeight < current.height; 1648 } else if ($content) { 1649 rez = $.fancybox.getTranslate($content); 1650 rez = rez.width < current.width && rez.height < current.height; 1651 } 1652 1653 return rez; 1654 }, 1655 1656 // Check if image dimensions exceed parent element 1657 // =============================================== 1658 1659 canPan: function (nextWidth, nextHeight) { 1660 var self = this, 1661 current = self.current, 1662 pos = null, 1663 rez = false; 1664 1665 if (current.type === "image" && (current.isComplete || (nextWidth && nextHeight)) && !current.hasError) { 1666 rez = self.getFitPos(current); 1667 1668 if (nextWidth !== undefined && nextHeight !== undefined) { 1669 pos = { 1670 width: nextWidth, 1671 height: nextHeight 1672 }; 1673 } else if (current.isComplete) { 1674 pos = $.fancybox.getTranslate(current.$content); 1675 } 1676 1677 if (pos && rez) { 1678 rez = Math.abs(pos.width - rez.width) > 1.5 || Math.abs(pos.height - rez.height) > 1.5; 1679 } 1680 } 1681 1682 return rez; 1683 }, 1684 1685 // Load content into the slide 1686 // =========================== 1687 1688 loadSlide: function (slide) { 1689 var self = this, 1690 type, 1691 $slide, 1692 ajaxLoad; 1693 1694 if (slide.isLoading || slide.isLoaded) { 1695 return; 1696 } 1697 1698 slide.isLoading = true; 1699 1700 if (self.trigger("beforeLoad", slide) === false) { 1701 slide.isLoading = false; 1702 1703 return false; 1704 } 1705 1706 type = slide.type; 1707 $slide = slide.$slide; 1708 1709 $slide 1710 .off("refresh") 1711 .trigger("onReset") 1712 .addClass(slide.opts.slideClass); 1713 1714 // Create content depending on the type 1715 switch (type) { 1716 case "image": 1717 self.setImage(slide); 1718 1719 break; 1720 1721 case "iframe": 1722 self.setIframe(slide); 1723 1724 break; 1725 1726 case "html": 1727 self.setContent(slide, slide.src || slide.content); 1728 1729 break; 1730 1731 case "video": 1732 self.setContent( 1733 slide, 1734 slide.opts.video.tpl 1735 .replace(/\{\{src\}\}/gi, slide.src) 1736 .replace("{{format}}", slide.opts.videoFormat || slide.opts.video.format || "") 1737 .replace("{{poster}}", slide.thumb || "") 1738 ); 1739 1740 break; 1741 1742 case "inline": 1743 if ($(slide.src).length) { 1744 self.setContent(slide, $(slide.src)); 1745 } else { 1746 self.setError(slide); 1747 } 1748 1749 break; 1750 1751 case "ajax": 1752 self.showLoading(slide); 1753 1754 ajaxLoad = $.ajax( 1755 $.extend({}, slide.opts.ajax.settings, { 1756 url: slide.src, 1757 success: function (data, textStatus) { 1758 if (textStatus === "success") { 1759 self.setContent(slide, data); 1760 } 1761 }, 1762 error: function (jqXHR, textStatus) { 1763 if (jqXHR && textStatus !== "abort") { 1764 self.setError(slide); 1765 } 1766 } 1767 }) 1768 ); 1769 1770 $slide.one("onReset", function () { 1771 ajaxLoad.abort(); 1772 }); 1773 1774 break; 1775 1776 default: 1777 self.setError(slide); 1778 1779 break; 1780 } 1781 1782 return true; 1783 }, 1784 1785 // Use thumbnail image, if possible 1786 // ================================ 1787 1788 setImage: function (slide) { 1789 var self = this, 1790 ghost; 1791 1792 // Check if need to show loading icon 1793 setTimeout(function () { 1794 var $img = slide.$image; 1795 1796 if (!self.isClosing && slide.isLoading && (!$img || !$img.length || !$img[0].complete) && !slide.hasError) { 1797 self.showLoading(slide); 1798 } 1799 }, 50); 1800 1801 //Check if image has srcset 1802 self.checkSrcset(slide); 1803 1804 // This will be wrapper containing both ghost and actual image 1805 slide.$content = $('<div class="fancybox-content"></div>') 1806 .addClass("fancybox-is-hidden") 1807 .appendTo(slide.$slide.addClass("fancybox-slide--image")); 1808 1809 // If we have a thumbnail, we can display it while actual image is loading 1810 // Users will not stare at black screen and actual image will appear gradually 1811 if (slide.opts.preload !== false && slide.opts.width && slide.opts.height && slide.thumb) { 1812 slide.width = slide.opts.width; 1813 slide.height = slide.opts.height; 1814 1815 ghost = document.createElement("img"); 1816 1817 ghost.onerror = function () { 1818 $(this).remove(); 1819 1820 slide.$ghost = null; 1821 }; 1822 1823 ghost.onload = function () { 1824 self.afterLoad(slide); 1825 }; 1826 1827 slide.$ghost = $(ghost) 1828 .addClass("fancybox-image") 1829 .appendTo(slide.$content) 1830 .attr("src", slide.thumb); 1831 } 1832 1833 // Start loading actual image 1834 self.setBigImage(slide); 1835 }, 1836 1837 // Check if image has srcset and get the source 1838 // ============================================ 1839 checkSrcset: function (slide) { 1840 var srcset = slide.opts.srcset || slide.opts.image.srcset, 1841 found, 1842 temp, 1843 pxRatio, 1844 windowWidth; 1845 1846 // If we have "srcset", then we need to find first matching "src" value. 1847 // This is necessary, because when you set an src attribute, the browser will preload the image 1848 // before any javascript or even CSS is applied. 1849 if (srcset) { 1850 pxRatio = window.devicePixelRatio || 1; 1851 windowWidth = window.innerWidth * pxRatio; 1852 1853 temp = srcset.split(",").map(function (el) { 1854 var ret = {}; 1855 1856 el.trim() 1857 .split(/\s+/) 1858 .forEach(function (el, i) { 1859 var value = parseInt(el.substring(0, el.length - 1), 10); 1860 1861 if (i === 0) { 1862 return (ret.url = el); 1863 } 1864 1865 if (value) { 1866 ret.value = value; 1867 ret.postfix = el[el.length - 1]; 1868 } 1869 }); 1870 1871 return ret; 1872 }); 1873 1874 // Sort by value 1875 temp.sort(function (a, b) { 1876 return a.value - b.value; 1877 }); 1878 1879 // Ok, now we have an array of all srcset values 1880 for (var j = 0; j < temp.length; j++) { 1881 var el = temp[j]; 1882 1883 if ((el.postfix === "w" && el.value >= windowWidth) || (el.postfix === "x" && el.value >= pxRatio)) { 1884 found = el; 1885 break; 1886 } 1887 } 1888 1889 // If not found, take the last one 1890 if (!found && temp.length) { 1891 found = temp[temp.length - 1]; 1892 } 1893 1894 if (found) { 1895 slide.src = found.url; 1896 1897 // If we have default width/height values, we can calculate height for matching source 1898 if (slide.width && slide.height && found.postfix == "w") { 1899 slide.height = (slide.width / slide.height) * found.value; 1900 slide.width = found.value; 1901 } 1902 1903 slide.opts.srcset = srcset; 1904 } 1905 } 1906 }, 1907 1908 // Create full-size image 1909 // ====================== 1910 1911 setBigImage: function (slide) { 1912 var self = this, 1913 img = document.createElement("img"), 1914 $img = $(img); 1915 1916 slide.$image = $img 1917 .one("error", function () { 1918 self.setError(slide); 1919 }) 1920 .one("load", function () { 1921 var sizes; 1922 1923 if (!slide.$ghost) { 1924 self.resolveImageSlideSize(slide, this.naturalWidth, this.naturalHeight); 1925 1926 self.afterLoad(slide); 1927 } 1928 1929 if (self.isClosing) { 1930 return; 1931 } 1932 1933 if (slide.opts.srcset) { 1934 sizes = slide.opts.sizes; 1935 1936 if (!sizes || sizes === "auto") { 1937 sizes = 1938 (slide.width / slide.height > 1 && $W.width() / $W.height() > 1 ? "100" : Math.round((slide.width / slide.height) * 100)) + 1939 "vw"; 1940 } 1941 1942 $img.attr("sizes", sizes).attr("srcset", slide.opts.srcset); 1943 } 1944 1945 // Hide temporary image after some delay 1946 if (slide.$ghost) { 1947 setTimeout(function () { 1948 if (slide.$ghost && !self.isClosing) { 1949 slide.$ghost.hide(); 1950 } 1951 }, Math.min(300, Math.max(1000, slide.height / 1600))); 1952 } 1953 1954 self.hideLoading(slide); 1955 }) 1956 .addClass("fancybox-image") 1957 .attr("src", slide.src) 1958 .appendTo(slide.$content); 1959 1960 if ((img.complete || img.readyState == "complete") && $img.naturalWidth && $img.naturalHeight) { 1961 $img.trigger("load"); 1962 } else if (img.error) { 1963 $img.trigger("error"); 1964 } 1965 }, 1966 1967 // Computes the slide size from image size and maxWidth/maxHeight 1968 // ============================================================== 1969 1970 resolveImageSlideSize: function (slide, imgWidth, imgHeight) { 1971 var maxWidth = parseInt(slide.opts.width, 10), 1972 maxHeight = parseInt(slide.opts.height, 10); 1973 1974 // Sets the default values from the image 1975 slide.width = imgWidth; 1976 slide.height = imgHeight; 1977 1978 if (maxWidth > 0) { 1979 slide.width = maxWidth; 1980 slide.height = Math.floor((maxWidth * imgHeight) / imgWidth); 1981 } 1982 1983 if (maxHeight > 0) { 1984 slide.width = Math.floor((maxHeight * imgWidth) / imgHeight); 1985 slide.height = maxHeight; 1986 } 1987 }, 1988 1989 // Create iframe wrapper, iframe and bindings 1990 // ========================================== 1991 1992 setIframe: function (slide) { 1993 var self = this, 1994 opts = slide.opts.iframe, 1995 $slide = slide.$slide, 1996 $iframe; 1997 1998 slide.$content = $('<div class="fancybox-content' + (opts.preload ? " fancybox-is-hidden" : "") + '"></div>') 1999 .css(opts.css) 2000 .appendTo($slide); 2001 2002 $slide.addClass("fancybox-slide--" + slide.contentType); 2003 2004 slide.$iframe = $iframe = $(opts.tpl.replace(/\{rnd\}/g, new Date().getTime())) 2005 .attr(opts.attr) 2006 .appendTo(slide.$content); 2007 2008 if (opts.preload) { 2009 self.showLoading(slide); 2010 2011 // Unfortunately, it is not always possible to determine if iframe is successfully loaded 2012 // (due to browser security policy) 2013 2014 $iframe.on("load.fb error.fb", function (e) { 2015 this.isReady = 1; 2016 2017 slide.$slide.trigger("refresh"); 2018 2019 self.afterLoad(slide); 2020 }); 2021 2022 // Recalculate iframe content size 2023 // =============================== 2024 2025 $slide.on("refresh.fb", function () { 2026 var $content = slide.$content, 2027 frameWidth = opts.css.width, 2028 frameHeight = opts.css.height, 2029 $contents, 2030 $body; 2031 2032 if ($iframe[0].isReady !== 1) { 2033 return; 2034 } 2035 2036 try { 2037 $contents = $iframe.contents(); 2038 $body = $contents.find("body"); 2039 } catch (ignore) {} 2040 2041 // Calculate content dimensions, if it is accessible 2042 if ($body && $body.length && $body.children().length) { 2043 // Avoid scrolling to top (if multiple instances) 2044 $slide.css("overflow", "visible"); 2045 2046 $content.css({ 2047 width: "100%", 2048 "max-width": "100%", 2049 height: "9999px" 2050 }); 2051 2052 if (frameWidth === undefined) { 2053 frameWidth = Math.ceil(Math.max($body[0].clientWidth, $body.outerWidth(true))); 2054 } 2055 2056 $content.css("width", frameWidth ? frameWidth : "").css("max-width", ""); 2057 2058 if (frameHeight === undefined) { 2059 frameHeight = Math.ceil(Math.max($body[0].clientHeight, $body.outerHeight(true))); 2060 } 2061 2062 $content.css("height", frameHeight ? frameHeight : ""); 2063 2064 $slide.css("overflow", "auto"); 2065 } 2066 2067 $content.removeClass("fancybox-is-hidden"); 2068 }); 2069 } else { 2070 self.afterLoad(slide); 2071 } 2072 2073 $iframe.attr("src", slide.src); 2074 2075 // Remove iframe if closing or changing gallery item 2076 $slide.one("onReset", function () { 2077 // This helps IE not to throw errors when closing 2078 try { 2079 $(this) 2080 .find("iframe") 2081 .hide() 2082 .unbind() 2083 .attr("src", "//about:blank"); 2084 } catch (ignore) {} 2085 2086 $(this) 2087 .off("refresh.fb") 2088 .empty(); 2089 2090 slide.isLoaded = false; 2091 slide.isRevealed = false; 2092 }); 2093 }, 2094 2095 // Wrap and append content to the slide 2096 // ====================================== 2097 2098 setContent: function (slide, content) { 2099 var self = this; 2100 2101 if (self.isClosing) { 2102 return; 2103 } 2104 2105 self.hideLoading(slide); 2106 2107 if (slide.$content) { 2108 $.fancybox.stop(slide.$content); 2109 } 2110 2111 slide.$slide.empty(); 2112 2113 // If content is a jQuery object, then it will be moved to the slide. 2114 // The placeholder is created so we will know where to put it back. 2115 if (isQuery(content) && content.parent().length) { 2116 // Make sure content is not already moved to fancyBox 2117 if (content.hasClass("fancybox-content") || content.parent().hasClass("fancybox-content")) { 2118 content.parents(".fancybox-slide").trigger("onReset"); 2119 } 2120 2121 // Create temporary element marking original place of the content 2122 slide.$placeholder = $("<div>") 2123 .hide() 2124 .insertAfter(content); 2125 2126 // Make sure content is visible 2127 content.css("display", "inline-block"); 2128 } else if (!slide.hasError) { 2129 // If content is just a plain text, try to convert it to html 2130 if ($.type(content) === "string") { 2131 content = $("<div>") 2132 .append($.trim(content)) 2133 .contents(); 2134 } 2135 2136 // If "filter" option is provided, then filter content 2137 if (slide.opts.filter) { 2138 content = $("<div>") 2139 .html(content) 2140 .find(slide.opts.filter); 2141 } 2142 } 2143 2144 slide.$slide.one("onReset", function () { 2145 // Pause all html5 video/audio 2146 $(this) 2147 .find("video,audio") 2148 .trigger("pause"); 2149 2150 // Put content back 2151 if (slide.$placeholder) { 2152 slide.$placeholder.after(content.removeClass("fancybox-content").hide()).remove(); 2153 2154 slide.$placeholder = null; 2155 } 2156 2157 // Remove custom close button 2158 if (slide.$smallBtn) { 2159 slide.$smallBtn.remove(); 2160 2161 slide.$smallBtn = null; 2162 } 2163 2164 // Remove content and mark slide as not loaded 2165 if (!slide.hasError) { 2166 $(this).empty(); 2167 2168 slide.isLoaded = false; 2169 slide.isRevealed = false; 2170 } 2171 }); 2172 2173 $(content).appendTo(slide.$slide); 2174 2175 if ($(content).is("video,audio")) { 2176 $(content).addClass("fancybox-video"); 2177 2178 $(content).wrap("<div></div>"); 2179 2180 slide.contentType = "video"; 2181 2182 slide.opts.width = slide.opts.width || $(content).attr("width"); 2183 slide.opts.height = slide.opts.height || $(content).attr("height"); 2184 } 2185 2186 slide.$content = slide.$slide 2187 .children() 2188 .filter("div,form,main,video,audio,article,.fancybox-content") 2189 .first(); 2190 2191 slide.$content.siblings().hide(); 2192 2193 // Re-check if there is a valid content 2194 // (in some cases, ajax response can contain various elements or plain text) 2195 if (!slide.$content.length) { 2196 slide.$content = slide.$slide 2197 .wrapInner("<div></div>") 2198 .children() 2199 .first(); 2200 } 2201 2202 slide.$content.addClass("fancybox-content"); 2203 2204 slide.$slide.addClass("fancybox-slide--" + slide.contentType); 2205 2206 self.afterLoad(slide); 2207 }, 2208 2209 // Display error message 2210 // ===================== 2211 2212 setError: function (slide) { 2213 slide.hasError = true; 2214 2215 slide.$slide 2216 .trigger("onReset") 2217 .removeClass("fancybox-slide--" + slide.contentType) 2218 .addClass("fancybox-slide--error"); 2219 2220 slide.contentType = "html"; 2221 2222 this.setContent(slide, this.translate(slide, slide.opts.errorTpl)); 2223 2224 if (slide.pos === this.currPos) { 2225 this.isAnimating = false; 2226 } 2227 }, 2228 2229 // Show loading icon inside the slide 2230 // ================================== 2231 2232 showLoading: function (slide) { 2233 var self = this; 2234 2235 slide = slide || self.current; 2236 2237 if (slide && !slide.$spinner) { 2238 slide.$spinner = $(self.translate(self, self.opts.spinnerTpl)) 2239 .appendTo(slide.$slide) 2240 .hide() 2241 .fadeIn("fast"); 2242 } 2243 }, 2244 2245 // Remove loading icon from the slide 2246 // ================================== 2247 2248 hideLoading: function (slide) { 2249 var self = this; 2250 2251 slide = slide || self.current; 2252 2253 if (slide && slide.$spinner) { 2254 slide.$spinner.stop().remove(); 2255 2256 delete slide.$spinner; 2257 } 2258 }, 2259 2260 // Adjustments after slide content has been loaded 2261 // =============================================== 2262 2263 afterLoad: function (slide) { 2264 var self = this; 2265 2266 if (self.isClosing) { 2267 return; 2268 } 2269 2270 slide.isLoading = false; 2271 slide.isLoaded = true; 2272 2273 self.trigger("afterLoad", slide); 2274 2275 self.hideLoading(slide); 2276 2277 // Add small close button 2278 if (slide.opts.smallBtn && (!slide.$smallBtn || !slide.$smallBtn.length)) { 2279 slide.$smallBtn = $(self.translate(slide, slide.opts.btnTpl.smallBtn)).appendTo(slide.$content); 2280 } 2281 2282 // Disable right click 2283 if (slide.opts.protect && slide.$content && !slide.hasError) { 2284 slide.$content.on("contextmenu.fb", function (e) { 2285 if (e.button == 2) { 2286 e.preventDefault(); 2287 } 2288 2289 return true; 2290 }); 2291 2292 // Add fake element on top of the image 2293 // This makes a bit harder for user to select image 2294 if (slide.type === "image") { 2295 $('<div class="fancybox-spaceball"></div>').appendTo(slide.$content); 2296 } 2297 } 2298 2299 self.adjustCaption(slide); 2300 2301 self.adjustLayout(slide); 2302 2303 if (slide.pos === self.currPos) { 2304 self.updateCursor(); 2305 } 2306 2307 self.revealContent(slide); 2308 }, 2309 2310 // Prevent caption overlap, 2311 // fix css inconsistency across browsers 2312 // ===================================== 2313 2314 adjustCaption: function (slide) { 2315 var self = this, 2316 current = slide || self.current, 2317 caption = current.opts.caption, 2318 preventOverlap = current.opts.preventCaptionOverlap, 2319 $caption = self.$refs.caption, 2320 $clone, 2321 captionH = false; 2322 2323 $caption.toggleClass("fancybox-caption--separate", preventOverlap); 2324 2325 if (preventOverlap && caption && caption.length) { 2326 if (current.pos !== self.currPos) { 2327 $clone = $caption.clone().appendTo($caption.parent()); 2328 2329 $clone 2330 .children() 2331 .eq(0) 2332 .empty() 2333 .html(caption); 2334 2335 captionH = $clone.outerHeight(true); 2336 2337 $clone.empty().remove(); 2338 } else if (self.$caption) { 2339 captionH = self.$caption.outerHeight(true); 2340 } 2341 2342 current.$slide.css("padding-bottom", captionH || ""); 2343 } 2344 }, 2345 2346 // Simple hack to fix inconsistency across browsers, described here (affects Edge, too): 2347 // https://bugzilla.mozilla.org/show_bug.cgi?id=748518 2348 // ==================================================================================== 2349 2350 adjustLayout: function (slide) { 2351 var self = this, 2352 current = slide || self.current, 2353 scrollHeight, 2354 marginBottom, 2355 inlinePadding, 2356 actualPadding; 2357 2358 if (current.isLoaded && current.opts.disableLayoutFix !== true) { 2359 current.$content.css("margin-bottom", ""); 2360 2361 // If we would always set margin-bottom for the content, 2362 // then it would potentially break vertical align 2363 if (current.$content.outerHeight() > current.$slide.height() + 0.5) { 2364 inlinePadding = current.$slide[0].style["padding-bottom"]; 2365 actualPadding = current.$slide.css("padding-bottom"); 2366 2367 if (parseFloat(actualPadding) > 0) { 2368 scrollHeight = current.$slide[0].scrollHeight; 2369 2370 current.$slide.css("padding-bottom", 0); 2371 2372 if (Math.abs(scrollHeight - current.$slide[0].scrollHeight) < 1) { 2373 marginBottom = actualPadding; 2374 } 2375 2376 current.$slide.css("padding-bottom", inlinePadding); 2377 } 2378 } 2379 2380 current.$content.css("margin-bottom", marginBottom); 2381 } 2382 }, 2383 2384 // Make content visible 2385 // This method is called right after content has been loaded or 2386 // user navigates gallery and transition should start 2387 // ============================================================ 2388 2389 revealContent: function (slide) { 2390 var self = this, 2391 $slide = slide.$slide, 2392 end = false, 2393 start = false, 2394 isMoved = self.isMoved(slide), 2395 isRevealed = slide.isRevealed, 2396 effect, 2397 effectClassName, 2398 duration, 2399 opacity; 2400 2401 slide.isRevealed = true; 2402 2403 effect = slide.opts[self.firstRun ? "animationEffect" : "transitionEffect"]; 2404 duration = slide.opts[self.firstRun ? "animationDuration" : "transitionDuration"]; 2405 2406 duration = parseInt(slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10); 2407 2408 if (isMoved || slide.pos !== self.currPos || !duration) { 2409 effect = false; 2410 } 2411 2412 // Check if can zoom 2413 if (effect === "zoom") { 2414 if (slide.pos === self.currPos && duration && slide.type === "image" && !slide.hasError && (start = self.getThumbPos(slide))) { 2415 end = self.getFitPos(slide); 2416 } else { 2417 effect = "fade"; 2418 } 2419 } 2420 2421 // Zoom animation 2422 // ============== 2423 if (effect === "zoom") { 2424 self.isAnimating = true; 2425 2426 end.scaleX = end.width / start.width; 2427 end.scaleY = end.height / start.height; 2428 2429 // Check if we need to animate opacity 2430 opacity = slide.opts.zoomOpacity; 2431 2432 if (opacity == "auto") { 2433 opacity = Math.abs(slide.width / slide.height - start.width / start.height) > 0.1; 2434 } 2435 2436 if (opacity) { 2437 start.opacity = 0.1; 2438 end.opacity = 1; 2439 } 2440 2441 // Draw image at start position 2442 $.fancybox.setTranslate(slide.$content.removeClass("fancybox-is-hidden"), start); 2443 2444 forceRedraw(slide.$content); 2445 2446 // Start animation 2447 $.fancybox.animate(slide.$content, end, duration, function () { 2448 self.isAnimating = false; 2449 2450 self.complete(); 2451 }); 2452 2453 return; 2454 } 2455 2456 self.updateSlide(slide); 2457 2458 // Simply show content if no effect 2459 // ================================ 2460 if (!effect) { 2461 slide.$content.removeClass("fancybox-is-hidden"); 2462 2463 if (!isRevealed && isMoved && slide.type === "image" && !slide.hasError) { 2464 slide.$content.hide().fadeIn("fast"); 2465 } 2466 2467 if (slide.pos === self.currPos) { 2468 self.complete(); 2469 } 2470 2471 return; 2472 } 2473 2474 // Prepare for CSS transiton 2475 // ========================= 2476 $.fancybox.stop($slide); 2477 2478 //effectClassName = "fancybox-animated fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-fx-" + effect; 2479 effectClassName = "fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-animated fancybox-fx-" + effect; 2480 2481 $slide.addClass(effectClassName).removeClass("fancybox-slide--current"); //.addClass(effectClassName); 2482 2483 slide.$content.removeClass("fancybox-is-hidden"); 2484 2485 // Force reflow 2486 forceRedraw($slide); 2487 2488 if (slide.type !== "image") { 2489 slide.$content.hide().show(0); 2490 } 2491 2492 $.fancybox.animate( 2493 $slide, 2494 "fancybox-slide--current", 2495 duration, 2496 function () { 2497 $slide.removeClass(effectClassName).css({ 2498 transform: "", 2499 opacity: "" 2500 }); 2501 2502 if (slide.pos === self.currPos) { 2503 self.complete(); 2504 } 2505 }, 2506 true 2507 ); 2508 }, 2509 2510 // Check if we can and have to zoom from thumbnail 2511 //================================================ 2512 2513 getThumbPos: function (slide) { 2514 var rez = false, 2515 $thumb = slide.$thumb, 2516 thumbPos, 2517 btw, 2518 brw, 2519 bbw, 2520 blw; 2521 2522 if (!$thumb || !inViewport($thumb[0])) { 2523 return false; 2524 } 2525 2526 thumbPos = $.fancybox.getTranslate($thumb); 2527 2528 btw = parseFloat($thumb.css("border-top-width") || 0); 2529 brw = parseFloat($thumb.css("border-right-width") || 0); 2530 bbw = parseFloat($thumb.css("border-bottom-width") || 0); 2531 blw = parseFloat($thumb.css("border-left-width") || 0); 2532 2533 rez = { 2534 top: thumbPos.top + btw, 2535 left: thumbPos.left + blw, 2536 width: thumbPos.width - brw - blw, 2537 height: thumbPos.height - btw - bbw, 2538 scaleX: 1, 2539 scaleY: 1 2540 }; 2541 2542 return thumbPos.width > 0 && thumbPos.height > 0 ? rez : false; 2543 }, 2544 2545 // Final adjustments after current gallery item is moved to position 2546 // and it`s content is loaded 2547 // ================================================================== 2548 2549 complete: function () { 2550 var self = this, 2551 current = self.current, 2552 slides = {}, 2553 $el; 2554 2555 if (self.isMoved() || !current.isLoaded) { 2556 return; 2557 } 2558 2559 if (!current.isComplete) { 2560 current.isComplete = true; 2561 2562 current.$slide.siblings().trigger("onReset"); 2563 2564 self.preload("inline"); 2565 2566 // Trigger any CSS transiton inside the slide 2567 forceRedraw(current.$slide); 2568 2569 current.$slide.addClass("fancybox-slide--complete"); 2570 2571 // Remove unnecessary slides 2572 $.each(self.slides, function (key, slide) { 2573 if (slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1) { 2574 slides[slide.pos] = slide; 2575 } else if (slide) { 2576 $.fancybox.stop(slide.$slide); 2577 2578 slide.$slide.off().remove(); 2579 } 2580 }); 2581 2582 self.slides = slides; 2583 } 2584 2585 self.isAnimating = false; 2586 2587 self.updateCursor(); 2588 2589 self.trigger("afterShow"); 2590 2591 // Autoplay first html5 video/audio 2592 if (!!current.opts.video.autoStart) { 2593 current.$slide 2594 .find("video,audio") 2595 .filter(":visible:first") 2596 .trigger("play") 2597 .one("ended", function () { 2598 if (Document.exitFullscreen) { 2599 Document.exitFullscreen(); 2600 } else if (this.webkitExitFullscreen) { 2601 this.webkitExitFullscreen(); 2602 } 2603 2604 self.next(); 2605 }); 2606 } 2607 2608 // Try to focus on the first focusable element 2609 if (current.opts.autoFocus && current.contentType === "html") { 2610 // Look for the first input with autofocus attribute 2611 $el = current.$content.find("input[autofocus]:enabled:visible:first"); 2612 2613 if ($el.length) { 2614 $el.trigger("focus"); 2615 } else { 2616 self.focus(null, true); 2617 } 2618 } 2619 2620 // Avoid jumping 2621 current.$slide.scrollTop(0).scrollLeft(0); 2622 }, 2623 2624 // Preload next and previous slides 2625 // ================================ 2626 2627 preload: function (type) { 2628 var self = this, 2629 prev, 2630 next; 2631 2632 if (self.group.length < 2) { 2633 return; 2634 } 2635 2636 next = self.slides[self.currPos + 1]; 2637 prev = self.slides[self.currPos - 1]; 2638 2639 if (prev && prev.type === type) { 2640 self.loadSlide(prev); 2641 } 2642 2643 if (next && next.type === type) { 2644 self.loadSlide(next); 2645 } 2646 }, 2647 2648 // Try to find and focus on the first focusable element 2649 // ==================================================== 2650 2651 focus: function (e, firstRun) { 2652 var self = this, 2653 focusableStr = [ 2654 "a[href]", 2655 "area[href]", 2656 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', 2657 "select:not([disabled]):not([aria-hidden])", 2658 "textarea:not([disabled]):not([aria-hidden])", 2659 "button:not([disabled]):not([aria-hidden])", 2660 "iframe", 2661 "object", 2662 "embed", 2663 "video", 2664 "audio", 2665 "[contenteditable]", 2666 '[tabindex]:not([tabindex^="-"])' 2667 ].join(","), 2668 focusableItems, 2669 focusedItemIndex; 2670 2671 if (self.isClosing) { 2672 return; 2673 } 2674 2675 if (e || !self.current || !self.current.isComplete) { 2676 // Focus on any element inside fancybox 2677 focusableItems = self.$refs.container.find("*:visible"); 2678 } else { 2679 // Focus inside current slide 2680 focusableItems = self.current.$slide.find("*:visible" + (firstRun ? ":not(.fancybox-close-small)" : "")); 2681 } 2682 2683 focusableItems = focusableItems.filter(focusableStr).filter(function () { 2684 return $(this).css("visibility") !== "hidden" && !$(this).hasClass("disabled"); 2685 }); 2686 2687 if (focusableItems.length) { 2688 focusedItemIndex = focusableItems.index(document.activeElement); 2689 2690 if (e && e.shiftKey) { 2691 // Back tab 2692 if (focusedItemIndex < 0 || focusedItemIndex == 0) { 2693 e.preventDefault(); 2694 2695 focusableItems.eq(focusableItems.length - 1).trigger("focus"); 2696 } 2697 } else { 2698 // Outside or Forward tab 2699 if (focusedItemIndex < 0 || focusedItemIndex == focusableItems.length - 1) { 2700 if (e) { 2701 e.preventDefault(); 2702 } 2703 2704 focusableItems.eq(0).trigger("focus"); 2705 } 2706 } 2707 } else { 2708 self.$refs.container.trigger("focus"); 2709 } 2710 }, 2711 2712 // Activates current instance - brings container to the front and enables keyboard, 2713 // notifies other instances about deactivating 2714 // ================================================================================= 2715 2716 activate: function () { 2717 var self = this; 2718 2719 // Deactivate all instances 2720 $(".fancybox-container").each(function () { 2721 var instance = $(this).data("FancyBox"); 2722 2723 // Skip self and closing instances 2724 if (instance && instance.id !== self.id && !instance.isClosing) { 2725 instance.trigger("onDeactivate"); 2726 2727 instance.removeEvents(); 2728 2729 instance.isVisible = false; 2730 } 2731 }); 2732 2733 self.isVisible = true; 2734 2735 if (self.current || self.isIdle) { 2736 self.update(); 2737 2738 self.updateControls(); 2739 } 2740 2741 self.trigger("onActivate"); 2742 2743 self.addEvents(); 2744 }, 2745 2746 // Start closing procedure 2747 // This will start "zoom-out" animation if needed and clean everything up afterwards 2748 // ================================================================================= 2749 2750 close: function (e, d) { 2751 var self = this, 2752 current = self.current, 2753 effect, 2754 duration, 2755 $content, 2756 domRect, 2757 opacity, 2758 start, 2759 end; 2760 2761 var done = function () { 2762 self.cleanUp(e); 2763 }; 2764 2765 if (self.isClosing) { 2766 return false; 2767 } 2768 2769 self.isClosing = true; 2770 2771 // If beforeClose callback prevents closing, make sure content is centered 2772 if (self.trigger("beforeClose", e) === false) { 2773 self.isClosing = false; 2774 2775 requestAFrame(function () { 2776 self.update(); 2777 }); 2778 2779 return false; 2780 } 2781 2782 // Remove all events 2783 // If there are multiple instances, they will be set again by "activate" method 2784 self.removeEvents(); 2785 2786 $content = current.$content; 2787 effect = current.opts.animationEffect; 2788 duration = $.isNumeric(d) ? d : effect ? current.opts.animationDuration : 0; 2789 2790 current.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"); 2791 2792 if (e !== true) { 2793 $.fancybox.stop(current.$slide); 2794 } else { 2795 effect = false; 2796 } 2797 2798 // Remove other slides 2799 current.$slide 2800 .siblings() 2801 .trigger("onReset") 2802 .remove(); 2803 2804 // Trigger animations 2805 if (duration) { 2806 self.$refs.container 2807 .removeClass("fancybox-is-open") 2808 .addClass("fancybox-is-closing") 2809 .css("transition-duration", duration + "ms"); 2810 } 2811 2812 // Clean up 2813 self.hideLoading(current); 2814 2815 self.hideControls(true); 2816 2817 self.updateCursor(); 2818 2819 // Check if possible to zoom-out 2820 if ( 2821 effect === "zoom" && 2822 !($content && duration && current.type === "image" && !self.isMoved() && !current.hasError && (end = self.getThumbPos(current))) 2823 ) { 2824 effect = "fade"; 2825 } 2826 2827 if (effect === "zoom") { 2828 $.fancybox.stop($content); 2829 2830 domRect = $.fancybox.getTranslate($content); 2831 2832 start = { 2833 top: domRect.top, 2834 left: domRect.left, 2835 scaleX: domRect.width / end.width, 2836 scaleY: domRect.height / end.height, 2837 width: end.width, 2838 height: end.height 2839 }; 2840 2841 // Check if we need to animate opacity 2842 opacity = current.opts.zoomOpacity; 2843 2844 if (opacity == "auto") { 2845 opacity = Math.abs(current.width / current.height - end.width / end.height) > 0.1; 2846 } 2847 2848 if (opacity) { 2849 end.opacity = 0; 2850 } 2851 2852 $.fancybox.setTranslate($content, start); 2853 2854 forceRedraw($content); 2855 2856 $.fancybox.animate($content, end, duration, done); 2857 2858 return true; 2859 } 2860 2861 if (effect && duration) { 2862 $.fancybox.animate( 2863 current.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"), 2864 "fancybox-animated fancybox-fx-" + effect, 2865 duration, 2866 done 2867 ); 2868 } else { 2869 // If skip animation 2870 if (e === true) { 2871 setTimeout(done, duration); 2872 } else { 2873 done(); 2874 } 2875 } 2876 2877 return true; 2878 }, 2879 2880 // Final adjustments after removing the instance 2881 // ============================================= 2882 2883 cleanUp: function (e) { 2884 var self = this, 2885 instance, 2886 $focus = self.current.opts.$orig, 2887 x, 2888 y; 2889 2890 self.current.$slide.trigger("onReset"); 2891 2892 self.$refs.container.empty().remove(); 2893 2894 self.trigger("afterClose", e); 2895 2896 // Place back focus 2897 if (!!self.current.opts.backFocus) { 2898 if (!$focus || !$focus.length || !$focus.is(":visible")) { 2899 $focus = self.$trigger; 2900 } 2901 2902 if ($focus && $focus.length) { 2903 x = window.scrollX; 2904 y = window.scrollY; 2905 2906 $focus.trigger("focus"); 2907 2908 $("html, body") 2909 .scrollTop(y) 2910 .scrollLeft(x); 2911 } 2912 } 2913 2914 self.current = null; 2915 2916 // Check if there are other instances 2917 instance = $.fancybox.getInstance(); 2918 2919 if (instance) { 2920 instance.activate(); 2921 } else { 2922 $("body").removeClass("fancybox-active compensate-for-scrollbar"); 2923 2924 $("#fancybox-style-noscroll").remove(); 2925 } 2926 }, 2927 2928 // Call callback and trigger an event 2929 // ================================== 2930 2931 trigger: function (name, slide) { 2932 var args = Array.prototype.slice.call(arguments, 1), 2933 self = this, 2934 obj = slide && slide.opts ? slide : self.current, 2935 rez; 2936 2937 if (obj) { 2938 args.unshift(obj); 2939 } else { 2940 obj = self; 2941 } 2942 2943 args.unshift(self); 2944 2945 if ($.isFunction(obj.opts[name])) { 2946 rez = obj.opts[name].apply(obj, args); 2947 } 2948 2949 if (rez === false) { 2950 return rez; 2951 } 2952 2953 if (name === "afterClose" || !self.$refs) { 2954 $D.trigger(name + ".fb", args); 2955 } else { 2956 self.$refs.container.trigger(name + ".fb", args); 2957 } 2958 }, 2959 2960 // Update infobar values, navigation button states and reveal caption 2961 // ================================================================== 2962 2963 updateControls: function () { 2964 var self = this, 2965 current = self.current, 2966 index = current.index, 2967 $container = self.$refs.container, 2968 $caption = self.$refs.caption, 2969 caption = current.opts.caption; 2970 2971 // Recalculate content dimensions 2972 current.$slide.trigger("refresh"); 2973 2974 // Set caption 2975 if (caption && caption.length) { 2976 self.$caption = $caption; 2977 2978 $caption 2979 .children() 2980 .eq(0) 2981 .html(caption); 2982 } else { 2983 self.$caption = null; 2984 } 2985 2986 if (!self.hasHiddenControls && !self.isIdle) { 2987 self.showControls(); 2988 } 2989 2990 // Update info and navigation elements 2991 $container.find("[data-fancybox-count]").html(self.group.length); 2992 $container.find("[data-fancybox-index]").html(index + 1); 2993 2994 $container.find("[data-fancybox-prev]").prop("disabled", !current.opts.loop && index <= 0); 2995 $container.find("[data-fancybox-next]").prop("disabled", !current.opts.loop && index >= self.group.length - 1); 2996 2997 if (current.type === "image") { 2998 // Re-enable buttons; update download button source 2999 $container 3000 .find("[data-fancybox-zoom]") 3001 .show() 3002 .end() 3003 .find("[data-fancybox-download]") 3004 .attr("href", current.opts.image.src || current.src) 3005 .show(); 3006 } else if (current.opts.toolbar) { 3007 $container.find("[data-fancybox-download],[data-fancybox-zoom]").hide(); 3008 } 3009 3010 // Make sure focus is not on disabled button/element 3011 if ($(document.activeElement).is(":hidden,[disabled]")) { 3012 self.$refs.container.trigger("focus"); 3013 } 3014 }, 3015 3016 // Hide toolbar and caption 3017 // ======================== 3018 3019 hideControls: function (andCaption) { 3020 var self = this, 3021 arr = ["infobar", "toolbar", "nav"]; 3022 3023 if (andCaption || !self.current.opts.preventCaptionOverlap) { 3024 arr.push("caption"); 3025 } 3026 3027 this.$refs.container.removeClass( 3028 arr 3029 .map(function (i) { 3030 return "fancybox-show-" + i; 3031 }) 3032 .join(" ") 3033 ); 3034 3035 this.hasHiddenControls = true; 3036 }, 3037 3038 showControls: function () { 3039 var self = this, 3040 opts = self.current ? self.current.opts : self.opts, 3041 $container = self.$refs.container; 3042 3043 self.hasHiddenControls = false; 3044 self.idleSecondsCounter = 0; 3045 3046 $container 3047 .toggleClass("fancybox-show-toolbar", !!(opts.toolbar && opts.buttons)) 3048 .toggleClass("fancybox-show-infobar", !!(opts.infobar && self.group.length > 1)) 3049 .toggleClass("fancybox-show-caption", !!self.$caption) 3050 .toggleClass("fancybox-show-nav", !!(opts.arrows && self.group.length > 1)) 3051 .toggleClass("fancybox-is-modal", !!opts.modal); 3052 }, 3053 3054 // Toggle toolbar and caption 3055 // ========================== 3056 3057 toggleControls: function () { 3058 if (this.hasHiddenControls) { 3059 this.showControls(); 3060 } else { 3061 this.hideControls(); 3062 } 3063 } 3064 }); 3065 3066 $.fancybox = { 3067 version: "3.5.7", 3068 defaults: defaults, 3069 3070 // Get current instance and execute a command. 3071 // 3072 // Examples of usage: 3073 // 3074 // $instance = $.fancybox.getInstance(); 3075 // $.fancybox.getInstance().jumpTo( 1 ); 3076 // $.fancybox.getInstance( 'jumpTo', 1 ); 3077 // $.fancybox.getInstance( function() { 3078 // console.info( this.currIndex ); 3079 // }); 3080 // ====================================================== 3081 3082 getInstance: function (command) { 3083 var instance = $('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"), 3084 args = Array.prototype.slice.call(arguments, 1); 3085 3086 if (instance instanceof FancyBox) { 3087 if ($.type(command) === "string") { 3088 instance[command].apply(instance, args); 3089 } else if ($.type(command) === "function") { 3090 command.apply(instance, args); 3091 } 3092 3093 return instance; 3094 } 3095 3096 return false; 3097 }, 3098 3099 // Create new instance 3100 // =================== 3101 3102 open: function (items, opts, index) { 3103 return new FancyBox(items, opts, index); 3104 }, 3105 3106 // Close current or all instances 3107 // ============================== 3108 3109 close: function (all) { 3110 var instance = this.getInstance(); 3111 3112 if (instance) { 3113 instance.close(); 3114 3115 // Try to find and close next instance 3116 if (all === true) { 3117 this.close(all); 3118 } 3119 } 3120 }, 3121 3122 // Close all instances and unbind all events 3123 // ========================================= 3124 3125 destroy: function () { 3126 this.close(true); 3127 3128 $D.add("body").off("click.fb-start", "**"); 3129 }, 3130 3131 // Try to detect mobile devices 3132 // ============================ 3133 3134 isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), 3135 3136 // Detect if 'translate3d' support is available 3137 // ============================================ 3138 3139 use3d: (function () { 3140 var div = document.createElement("div"); 3141 3142 return ( 3143 window.getComputedStyle && 3144 window.getComputedStyle(div) && 3145 window.getComputedStyle(div).getPropertyValue("transform") && 3146 !(document.documentMode && document.documentMode < 11) 3147 ); 3148 })(), 3149 3150 // Helper function to get current visual state of an element 3151 // returns array[ top, left, horizontal-scale, vertical-scale, opacity ] 3152 // ===================================================================== 3153 3154 getTranslate: function ($el) { 3155 var domRect; 3156 3157 if (!$el || !$el.length) { 3158 return false; 3159 } 3160 3161 domRect = $el[0].getBoundingClientRect(); 3162 3163 return { 3164 top: domRect.top || 0, 3165 left: domRect.left || 0, 3166 width: domRect.width, 3167 height: domRect.height, 3168 opacity: parseFloat($el.css("opacity")) 3169 }; 3170 }, 3171 3172 // Shortcut for setting "translate3d" properties for element 3173 // Can set be used to set opacity, too 3174 // ======================================================== 3175 3176 setTranslate: function ($el, props) { 3177 var str = "", 3178 css = {}; 3179 3180 if (!$el || !props) { 3181 return; 3182 } 3183 3184 if (props.left !== undefined || props.top !== undefined) { 3185 str = 3186 (props.left === undefined ? $el.position().left : props.left) + 3187 "px, " + 3188 (props.top === undefined ? $el.position().top : props.top) + 3189 "px"; 3190 3191 if (this.use3d) { 3192 str = "translate3d(" + str + ", 0px)"; 3193 } else { 3194 str = "translate(" + str + ")"; 3195 } 3196 } 3197 3198 if (props.scaleX !== undefined && props.scaleY !== undefined) { 3199 str += " scale(" + props.scaleX + ", " + props.scaleY + ")"; 3200 } else if (props.scaleX !== undefined) { 3201 str += " scaleX(" + props.scaleX + ")"; 3202 } 3203 3204 if (str.length) { 3205 css.transform = str; 3206 } 3207 3208 if (props.opacity !== undefined) { 3209 css.opacity = props.opacity; 3210 } 3211 3212 if (props.width !== undefined) { 3213 css.width = props.width; 3214 } 3215 3216 if (props.height !== undefined) { 3217 css.height = props.height; 3218 } 3219 3220 return $el.css(css); 3221 }, 3222 3223 // Simple CSS transition handler 3224 // ============================= 3225 3226 animate: function ($el, to, duration, callback, leaveAnimationName) { 3227 var self = this, 3228 from; 3229 3230 if ($.isFunction(duration)) { 3231 callback = duration; 3232 duration = null; 3233 } 3234 3235 self.stop($el); 3236 3237 from = self.getTranslate($el); 3238 3239 $el.on(transitionEnd, function (e) { 3240 // Skip events from child elements and z-index change 3241 if (e && e.originalEvent && (!$el.is(e.originalEvent.target) || e.originalEvent.propertyName == "z-index")) { 3242 return; 3243 } 3244 3245 self.stop($el); 3246 3247 if ($.isNumeric(duration)) { 3248 $el.css("transition-duration", ""); 3249 } 3250 3251 if ($.isPlainObject(to)) { 3252 if (to.scaleX !== undefined && to.scaleY !== undefined) { 3253 self.setTranslate($el, { 3254 top: to.top, 3255 left: to.left, 3256 width: from.width * to.scaleX, 3257 height: from.height * to.scaleY, 3258 scaleX: 1, 3259 scaleY: 1 3260 }); 3261 } 3262 } else if (leaveAnimationName !== true) { 3263 $el.removeClass(to); 3264 } 3265 3266 if ($.isFunction(callback)) { 3267 callback(e); 3268 } 3269 }); 3270 3271 if ($.isNumeric(duration)) { 3272 $el.css("transition-duration", duration + "ms"); 3273 } 3274 3275 // Start animation by changing CSS properties or class name 3276 if ($.isPlainObject(to)) { 3277 if (to.scaleX !== undefined && to.scaleY !== undefined) { 3278 delete to.width; 3279 delete to.height; 3280 3281 if ($el.parent().hasClass("fancybox-slide--image")) { 3282 $el.parent().addClass("fancybox-is-scaling"); 3283 } 3284 } 3285 3286 $.fancybox.setTranslate($el, to); 3287 } else { 3288 $el.addClass(to); 3289 } 3290 3291 // Make sure that `transitionend` callback gets fired 3292 $el.data( 3293 "timer", 3294 setTimeout(function () { 3295 $el.trigger(transitionEnd); 3296 }, duration + 33) 3297 ); 3298 }, 3299 3300 stop: function ($el, callCallback) { 3301 if ($el && $el.length) { 3302 clearTimeout($el.data("timer")); 3303 3304 if (callCallback) { 3305 $el.trigger(transitionEnd); 3306 } 3307 3308 $el.off(transitionEnd).css("transition-duration", ""); 3309 3310 $el.parent().removeClass("fancybox-is-scaling"); 3311 } 3312 } 3313 }; 3314 3315 // Default click handler for "fancyboxed" links 3316 // ============================================ 3317 3318 function _run(e, opts) { 3319 var items = [], 3320 index = 0, 3321 $target, 3322 value, 3323 instance; 3324 3325 // Avoid opening multiple times 3326 if (e && e.isDefaultPrevented()) { 3327 return; 3328 } 3329 3330 e.preventDefault(); 3331 3332 opts = opts || {}; 3333 3334 if (e && e.data) { 3335 opts = mergeOpts(e.data.options, opts); 3336 } 3337 3338 $target = opts.$target || $(e.currentTarget).trigger("blur"); 3339 instance = $.fancybox.getInstance(); 3340 3341 if (instance && instance.$trigger && instance.$trigger.is($target)) { 3342 return; 3343 } 3344 3345 if (opts.selector) { 3346 items = $(opts.selector); 3347 } else { 3348 // Get all related items and find index for clicked one 3349 value = $target.attr("data-fancybox") || ""; 3350 3351 if (value) { 3352 items = e.data ? e.data.items : []; 3353 items = items.length ? items.filter('[data-fancybox="' + value + '"]') : $('[data-fancybox="' + value + '"]'); 3354 } else { 3355 items = [$target]; 3356 } 3357 } 3358 3359 index = $(items).index($target); 3360 3361 // Sometimes current item can not be found 3362 if (index < 0) { 3363 index = 0; 3364 } 3365 3366 instance = $.fancybox.open(items, opts, index); 3367 3368 // Save last active element 3369 instance.$trigger = $target; 3370 } 3371 3372 // Create a jQuery plugin 3373 // ====================== 3374 3375 $.fn.fancybox = function (options) { 3376 var selector; 3377 3378 options = options || {}; 3379 selector = options.selector || false; 3380 3381 if (selector) { 3382 // Use body element instead of document so it executes first 3383 $("body") 3384 .off("click.fb-start", selector) 3385 .on("click.fb-start", selector, { 3386 options: options 3387 }, _run); 3388 } else { 3389 this.off("click.fb-start").on( 3390 "click.fb-start", { 3391 items: this, 3392 options: options 3393 }, 3394 _run 3395 ); 3396 } 3397 3398 return this; 3399 }; 3400 3401 // Self initializing plugin for all elements having `data-fancybox` attribute 3402 // ========================================================================== 3403 3404 $D.on("click.fb-start", "[data-fancybox]", _run); 3405 3406 // Enable "trigger elements" 3407 // ========================= 3408 3409 $D.on("click.fb-start", "[data-fancybox-trigger]", function (e) { 3410 $('[data-fancybox="' + $(this).attr("data-fancybox-trigger") + '"]') 3411 .eq($(this).attr("data-fancybox-index") || 0) 3412 .trigger("click.fb-start", { 3413 $trigger: $(this) 3414 }); 3415 }); 3416 3417 // Track focus event for better accessibility styling 3418 // ================================================== 3419 (function () { 3420 var buttonStr = ".fancybox-button", 3421 focusStr = "fancybox-focus", 3422 $pressed = null; 3423 3424 $D.on("mousedown mouseup focus blur", buttonStr, function (e) { 3425 switch (e.type) { 3426 case "mousedown": 3427 $pressed = $(this); 3428 break; 3429 case "mouseup": 3430 $pressed = null; 3431 break; 3432 case "focusin": 3433 $(buttonStr).removeClass(focusStr); 3434 3435 if (!$(this).is($pressed) && !$(this).is("[disabled]")) { 3436 $(this).addClass(focusStr); 3437 } 3438 break; 3439 case "focusout": 3440 $(buttonStr).removeClass(focusStr); 3441 break; 3442 } 3443 }); 3444 })(); 3445 })(window, document, jQuery); 3446// ========================================================================== 3447// 3448// Media 3449// Adds additional media type support 3450// 3451// ========================================================================== 3452 (function ($) { 3453 "use strict"; 3454 3455 // Object containing properties for each media type 3456 var defaults = { 3457 youtube: { 3458 matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i, 3459 params: { 3460 autoplay: 1, 3461 autohide: 1, 3462 fs: 1, 3463 rel: 0, 3464 hd: 1, 3465 wmode: "transparent", 3466 enablejsapi: 1, 3467 html5: 1 3468 }, 3469 paramPlace: 8, 3470 type: "iframe", 3471 url: "https://www.youtube-nocookie.com/embed/$4", 3472 thumb: "https://img.youtube.com/vi/$4/hqdefault.jpg" 3473 }, 3474 3475 vimeo: { 3476 matcher: /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/, 3477 params: { 3478 autoplay: 1, 3479 hd: 1, 3480 show_title: 1, 3481 show_byline: 1, 3482 show_portrait: 0, 3483 fullscreen: 1 3484 }, 3485 paramPlace: 3, 3486 type: "iframe", 3487 url: "//player.vimeo.com/video/$2" 3488 }, 3489 3490 instagram: { 3491 matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, 3492 type: "image", 3493 url: "//$1/p/$2/media/?size=l" 3494 }, 3495 3496 // Examples: 3497 // http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 3498 // https://www.google.com/maps/@37.7852006,-122.4146355,14.65z 3499 // https://www.google.com/maps/@52.2111123,2.9237542,6.61z?hl=en 3500 // https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572 3501 gmap_place: { 3502 matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i, 3503 type: "iframe", 3504 url: function (rez) { 3505 return ( 3506 "//maps.google." + 3507 rez[2] + 3508 "/?ll=" + 3509 (rez[9] ? rez[9] + "&z=" + Math.floor(rez[10]) + (rez[12] ? rez[12].replace(/^\//, "&") : "") : rez[12] + "").replace(/\?/, "&") + 3510 "&output=" + 3511 (rez[12] && rez[12].indexOf("layer=c") > 0 ? "svembed" : "embed") 3512 ); 3513 } 3514 }, 3515 3516 // Examples: 3517 // https://www.google.com/maps/search/Empire+State+Building/ 3518 // https://www.google.com/maps/search/?api=1&query=centurylink+field 3519 // https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393 3520 gmap_search: { 3521 matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i, 3522 type: "iframe", 3523 url: function (rez) { 3524 return "//maps.google." + rez[2] + "/maps?q=" + rez[5].replace("query=", "q=").replace("api=1", "") + "&output=embed"; 3525 } 3526 } 3527 }; 3528 3529 // Formats matching url to final form 3530 var format = function (url, rez, params) { 3531 if (!url) { 3532 return; 3533 } 3534 3535 params = params || ""; 3536 3537 if ($.type(params) === "object") { 3538 params = $.param(params, true); 3539 } 3540 3541 $.each(rez, function (key, value) { 3542 url = url.replace("$" + key, value || ""); 3543 }); 3544 3545 if (params.length) { 3546 url += (url.indexOf("?") > 0 ? "&" : "?") + params; 3547 } 3548 3549 return url; 3550 }; 3551 3552 $(document).on("objectNeedsType.fb", function (e, instance, item) { 3553 var url = item.src || "", 3554 type = false, 3555 media, 3556 thumb, 3557 rez, 3558 params, 3559 urlParams, 3560 paramObj, 3561 provider; 3562 3563 media = $.extend(true, {}, defaults, item.opts.media); 3564 3565 // Look for any matching media type 3566 $.each(media, function (providerName, providerOpts) { 3567 rez = url.match(providerOpts.matcher); 3568 3569 if (!rez) { 3570 return; 3571 } 3572 3573 type = providerOpts.type; 3574 provider = providerName; 3575 paramObj = {}; 3576 3577 if (providerOpts.paramPlace && rez[providerOpts.paramPlace]) { 3578 urlParams = rez[providerOpts.paramPlace]; 3579 3580 if (urlParams[0] == "?") { 3581 urlParams = urlParams.substring(1); 3582 } 3583 3584 urlParams = urlParams.split("&"); 3585 3586 for (var m = 0; m < urlParams.length; ++m) { 3587 var p = urlParams[m].split("=", 2); 3588 3589 if (p.length == 2) { 3590 paramObj[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " ")); 3591 } 3592 } 3593 } 3594 3595 params = $.extend(true, {}, providerOpts.params, item.opts[providerName], paramObj); 3596 3597 url = 3598 $.type(providerOpts.url) === "function" ? providerOpts.url.call(this, rez, params, item) : format(providerOpts.url, rez, params); 3599 3600 thumb = 3601 $.type(providerOpts.thumb) === "function" ? providerOpts.thumb.call(this, rez, params, item) : format(providerOpts.thumb, rez); 3602 3603 if (providerName === "youtube") { 3604 url = url.replace(/&t=((\d+)m)?(\d+)s/, function (match, p1, m, s) { 3605 return "&start=" + ((m ? parseInt(m, 10) * 60 : 0) + parseInt(s, 10)); 3606 }); 3607 } else if (providerName === "vimeo") { 3608 url = url.replace("&%23", "#"); 3609 } 3610 3611 return false; 3612 }); 3613 3614 // If it is found, then change content type and update the url 3615 3616 if (type) { 3617 if (!item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length)) { 3618 item.opts.thumb = thumb; 3619 } 3620 3621 if (type === "iframe") { 3622 item.opts = $.extend(true, item.opts, { 3623 iframe: { 3624 preload: false, 3625 attr: { 3626 scrolling: "no" 3627 } 3628 } 3629 }); 3630 } 3631 3632 $.extend(item, { 3633 type: type, 3634 src: url, 3635 origSrc: item.src, 3636 contentSource: provider, 3637 contentType: type === "image" ? "image" : provider == "gmap_place" || provider == "gmap_search" ? "map" : "video" 3638 }); 3639 } else if (url) { 3640 item.type = item.opts.defaultType; 3641 } 3642 }); 3643 3644 // Load YouTube/Video API on request to detect when video finished playing 3645 var VideoAPILoader = { 3646 youtube: { 3647 src: "https://www.youtube.com/iframe_api", 3648 class: "YT", 3649 loading: false, 3650 loaded: false 3651 }, 3652 3653 vimeo: { 3654 src: "https://player.vimeo.com/api/player.js", 3655 class: "Vimeo", 3656 loading: false, 3657 loaded: false 3658 }, 3659 3660 load: function (vendor) { 3661 var _this = this, 3662 script; 3663 3664 if (this[vendor].loaded) { 3665 setTimeout(function () { 3666 _this.done(vendor); 3667 }); 3668 return; 3669 } 3670 3671 if (this[vendor].loading) { 3672 return; 3673 } 3674 3675 this[vendor].loading = true; 3676 3677 script = document.createElement("script"); 3678 script.type = "text/javascript"; 3679 script.src = this[vendor].src; 3680 3681 if (vendor === "youtube") { 3682 window.onYouTubeIframeAPIReady = function () { 3683 _this[vendor].loaded = true; 3684 _this.done(vendor); 3685 }; 3686 } else { 3687 script.onload = function () { 3688 _this[vendor].loaded = true; 3689 _this.done(vendor); 3690 }; 3691 } 3692 3693 document.body.appendChild(script); 3694 }, 3695 done: function (vendor) { 3696 var instance, $el, player; 3697 3698 if (vendor === "youtube") { 3699 delete window.onYouTubeIframeAPIReady; 3700 } 3701 3702 instance = $.fancybox.getInstance(); 3703 3704 if (instance) { 3705 $el = instance.current.$content.find("iframe"); 3706 3707 if (vendor === "youtube" && YT !== undefined && YT) { 3708 player = new YT.Player($el.attr("id"), { 3709 events: { 3710 onStateChange: function (e) { 3711 if (e.data == 0) { 3712 instance.next(); 3713 } 3714 } 3715 } 3716 }); 3717 } else if (vendor === "vimeo" && Vimeo !== undefined && Vimeo) { 3718 player = new Vimeo.Player($el); 3719 3720 player.on("ended", function () { 3721 instance.next(); 3722 }); 3723 } 3724 } 3725 } 3726 }; 3727 3728 $(document).on({ 3729 "afterShow.fb": function (e, instance, current) { 3730 if (instance.group.length > 1 && (current.contentSource === "youtube" || current.contentSource === "vimeo")) { 3731 VideoAPILoader.load(current.contentSource); 3732 } 3733 } 3734 }); 3735 })(jQuery); 3736// ========================================================================== 3737// 3738// Guestures 3739// Adds touch guestures, handles click and tap events 3740// 3741// ========================================================================== 3742 (function (window, document, $) { 3743 "use strict"; 3744 3745 var requestAFrame = (function () { 3746 return ( 3747 window.requestAnimationFrame || 3748 window.webkitRequestAnimationFrame || 3749 window.mozRequestAnimationFrame || 3750 window.oRequestAnimationFrame || 3751 // if all else fails, use setTimeout 3752 function (callback) { 3753 return window.setTimeout(callback, 1000 / 60); 3754 } 3755 ); 3756 })(); 3757 3758 var cancelAFrame = (function () { 3759 return ( 3760 window.cancelAnimationFrame || 3761 window.webkitCancelAnimationFrame || 3762 window.mozCancelAnimationFrame || 3763 window.oCancelAnimationFrame || 3764 function (id) { 3765 window.clearTimeout(id); 3766 } 3767 ); 3768 })(); 3769 3770 var getPointerXY = function (e) { 3771 var result = []; 3772 3773 e = e.originalEvent || e || window.e; 3774 e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e]; 3775 3776 for (var key in e) { 3777 if (e[key].pageX) { 3778 result.push({ 3779 x: e[key].pageX, 3780 y: e[key].pageY 3781 }); 3782 } else if (e[key].clientX) { 3783 result.push({ 3784 x: e[key].clientX, 3785 y: e[key].clientY 3786 }); 3787 } 3788 } 3789 3790 return result; 3791 }; 3792 3793 var distance = function (point2, point1, what) { 3794 if (!point1 || !point2) { 3795 return 0; 3796 } 3797 3798 if (what === "x") { 3799 return point2.x - point1.x; 3800 } else if (what === "y") { 3801 return point2.y - point1.y; 3802 } 3803 3804 return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2)); 3805 }; 3806 3807 var isClickable = function ($el) { 3808 if ( 3809 $el.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe') || 3810 $.isFunction($el.get(0).onclick) || 3811 $el.data("selectable") 3812 ) { 3813 return true; 3814 } 3815 3816 // Check for attributes like data-fancybox-next or data-fancybox-close 3817 for (var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++) { 3818 if (atts[i].nodeName.substr(0, 14) === "data-fancybox-") { 3819 return true; 3820 } 3821 } 3822 3823 return false; 3824 }; 3825 3826 var hasScrollbars = function (el) { 3827 var overflowY = window.getComputedStyle(el)["overflow-y"], 3828 overflowX = window.getComputedStyle(el)["overflow-x"], 3829 vertical = (overflowY === "scroll" || overflowY === "auto") && el.scrollHeight > el.clientHeight, 3830 horizontal = (overflowX === "scroll" || overflowX === "auto") && el.scrollWidth > el.clientWidth; 3831 3832 return vertical || horizontal; 3833 }; 3834 3835 var isScrollable = function ($el) { 3836 var rez = false; 3837 3838 while (true) { 3839 rez = hasScrollbars($el.get(0)); 3840 3841 if (rez) { 3842 break; 3843 } 3844 3845 $el = $el.parent(); 3846 3847 if (!$el.length || $el.hasClass("fancybox-stage") || $el.is("body")) { 3848 break; 3849 } 3850 } 3851 3852 return rez; 3853 }; 3854 3855 var Guestures = function (instance) { 3856 var self = this; 3857 3858 self.instance = instance; 3859 3860 self.$bg = instance.$refs.bg; 3861 self.$stage = instance.$refs.stage; 3862 self.$container = instance.$refs.container; 3863 3864 self.destroy(); 3865 3866 self.$container.on("touchstart.fb.touch mousedown.fb.touch", $.proxy(self, "ontouchstart")); 3867 }; 3868 3869 Guestures.prototype.destroy = function () { 3870 var self = this; 3871 3872 self.$container.off(".fb.touch"); 3873 3874 $(document).off(".fb.touch"); 3875 3876 if (self.requestId) { 3877 cancelAFrame(self.requestId); 3878 self.requestId = null; 3879 } 3880 3881 if (self.tapped) { 3882 clearTimeout(self.tapped); 3883 self.tapped = null; 3884 } 3885 }; 3886 3887 Guestures.prototype.ontouchstart = function (e) { 3888 var self = this, 3889 $target = $(e.target), 3890 instance = self.instance, 3891 current = instance.current, 3892 $slide = current.$slide, 3893 $content = current.$content, 3894 isTouchDevice = e.type == "touchstart"; 3895 3896 // Do not respond to both (touch and mouse) events 3897 if (isTouchDevice) { 3898 self.$container.off("mousedown.fb.touch"); 3899 } 3900 3901 // Ignore right click 3902 if (e.originalEvent && e.originalEvent.button == 2) { 3903 return; 3904 } 3905 3906 // Ignore taping on links, buttons, input elements 3907 if (!$slide.length || !$target.length || isClickable($target) || isClickable($target.parent())) { 3908 return; 3909 } 3910 // Ignore clicks on the scrollbar 3911 if (!$target.is("img") && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left) { 3912 return; 3913 } 3914 3915 // Ignore clicks while zooming or closing 3916 if (!current || instance.isAnimating || current.$slide.hasClass("fancybox-animated")) { 3917 e.stopPropagation(); 3918 e.preventDefault(); 3919 3920 return; 3921 } 3922 3923 self.realPoints = self.startPoints = getPointerXY(e); 3924 3925 if (!self.startPoints.length) { 3926 return; 3927 } 3928 3929 // Allow other scripts to catch touch event if "touch" is set to false 3930 if (current.touch) { 3931 e.stopPropagation(); 3932 } 3933 3934 self.startEvent = e; 3935 3936 self.canTap = true; 3937 self.$target = $target; 3938 self.$content = $content; 3939 self.opts = current.opts.touch; 3940 3941 self.isPanning = false; 3942 self.isSwiping = false; 3943 self.isZooming = false; 3944 self.isScrolling = false; 3945 self.canPan = instance.canPan(); 3946 3947 self.startTime = new Date().getTime(); 3948 self.distanceX = self.distanceY = self.distance = 0; 3949 3950 self.canvasWidth = Math.round($slide[0].clientWidth); 3951 self.canvasHeight = Math.round($slide[0].clientHeight); 3952 3953 self.contentLastPos = null; 3954 self.contentStartPos = $.fancybox.getTranslate(self.$content) || { 3955 top: 0, 3956 left: 0 3957 }; 3958 self.sliderStartPos = $.fancybox.getTranslate($slide); 3959 3960 // Since position will be absolute, but we need to make it relative to the stage 3961 self.stagePos = $.fancybox.getTranslate(instance.$refs.stage); 3962 3963 self.sliderStartPos.top -= self.stagePos.top; 3964 self.sliderStartPos.left -= self.stagePos.left; 3965 3966 self.contentStartPos.top -= self.stagePos.top; 3967 self.contentStartPos.left -= self.stagePos.left; 3968 3969 $(document) 3970 .off(".fb.touch") 3971 .on(isTouchDevice ? "touchend.fb.touch touchcancel.fb.touch" : "mouseup.fb.touch mouseleave.fb.touch", $.proxy(self, "ontouchend")) 3972 .on(isTouchDevice ? "touchmove.fb.touch" : "mousemove.fb.touch", $.proxy(self, "ontouchmove")); 3973 3974 if ($.fancybox.isMobile) { 3975 document.addEventListener("scroll", self.onscroll, true); 3976 } 3977 3978 // Skip if clicked outside the sliding area 3979 if (!(self.opts || self.canPan) || !($target.is(self.$stage) || self.$stage.find($target).length)) { 3980 if ($target.is(".fancybox-image")) { 3981 e.preventDefault(); 3982 } 3983 3984 if (!($.fancybox.isMobile && $target.parents(".fancybox-caption").length)) { 3985 return; 3986 } 3987 } 3988 3989 self.isScrollable = isScrollable($target) || isScrollable($target.parent()); 3990 3991 // Check if element is scrollable and try to prevent default behavior (scrolling) 3992 if (!($.fancybox.isMobile && self.isScrollable)) { 3993 e.preventDefault(); 3994 } 3995 3996 // One finger or mouse click - swipe or pan an image 3997 if (self.startPoints.length === 1 || current.hasError) { 3998 if (self.canPan) { 3999 $.fancybox.stop(self.$content); 4000 4001 self.isPanning = true; 4002 } else { 4003 self.isSwiping = true; 4004 } 4005 4006 self.$container.addClass("fancybox-is-grabbing"); 4007 } 4008 4009 // Two fingers - zoom image 4010 if (self.startPoints.length === 2 && current.type === "image" && (current.isLoaded || current.$ghost)) { 4011 self.canTap = false; 4012 self.isSwiping = false; 4013 self.isPanning = false; 4014 4015 self.isZooming = true; 4016 4017 $.fancybox.stop(self.$content); 4018 4019 self.centerPointStartX = (self.startPoints[0].x + self.startPoints[1].x) * 0.5 - $(window).scrollLeft(); 4020 self.centerPointStartY = (self.startPoints[0].y + self.startPoints[1].y) * 0.5 - $(window).scrollTop(); 4021 4022 self.percentageOfImageAtPinchPointX = (self.centerPointStartX - self.contentStartPos.left) / self.contentStartPos.width; 4023 self.percentageOfImageAtPinchPointY = (self.centerPointStartY - self.contentStartPos.top) / self.contentStartPos.height; 4024 4025 self.startDistanceBetweenFingers = distance(self.startPoints[0], self.startPoints[1]); 4026 } 4027 }; 4028 4029 Guestures.prototype.onscroll = function (e) { 4030 var self = this; 4031 4032 self.isScrolling = true; 4033 4034 document.removeEventListener("scroll", self.onscroll, true); 4035 }; 4036 4037 Guestures.prototype.ontouchmove = function (e) { 4038 var self = this; 4039 4040 // Make sure user has not released over iframe or disabled element 4041 if (e.originalEvent.buttons !== undefined && e.originalEvent.buttons === 0) { 4042 self.ontouchend(e); 4043 return; 4044 } 4045 4046 if (self.isScrolling) { 4047 self.canTap = false; 4048 return; 4049 } 4050 4051 self.newPoints = getPointerXY(e); 4052 4053 if (!(self.opts || self.canPan) || !self.newPoints.length || !self.newPoints.length) { 4054 return; 4055 } 4056 4057 if (!(self.isSwiping && self.isSwiping === true)) { 4058 e.preventDefault(); 4059 } 4060 4061 self.distanceX = distance(self.newPoints[0], self.startPoints[0], "x"); 4062 self.distanceY = distance(self.newPoints[0], self.startPoints[0], "y"); 4063 4064 self.distance = distance(self.newPoints[0], self.startPoints[0]); 4065 4066 // Skip false ontouchmove events (Chrome) 4067 if (self.distance > 0) { 4068 if (self.isSwiping) { 4069 self.onSwipe(e); 4070 } else if (self.isPanning) { 4071 self.onPan(); 4072 } else if (self.isZooming) { 4073 self.onZoom(); 4074 } 4075 } 4076 }; 4077 4078 Guestures.prototype.onSwipe = function (e) { 4079 var self = this, 4080 instance = self.instance, 4081 swiping = self.isSwiping, 4082 left = self.sliderStartPos.left || 0, 4083 angle; 4084 4085 // If direction is not yet determined 4086 if (swiping === true) { 4087 // We need at least 10px distance to correctly calculate an angle 4088 if (Math.abs(self.distance) > 10) { 4089 self.canTap = false; 4090 4091 if (instance.group.length < 2 && self.opts.vertical) { 4092 self.isSwiping = "y"; 4093 } else if (instance.isDragging || self.opts.vertical === false || (self.opts.vertical === "auto" && $(window).width() > 800)) { 4094 self.isSwiping = "x"; 4095 } else { 4096 angle = Math.abs((Math.atan2(self.distanceY, self.distanceX) * 180) / Math.PI); 4097 4098 self.isSwiping = angle > 45 && angle < 135 ? "y" : "x"; 4099 } 4100 4101 if (self.isSwiping === "y" && $.fancybox.isMobile && self.isScrollable) { 4102 self.isScrolling = true; 4103 4104 return; 4105 } 4106 4107 instance.isDragging = self.isSwiping; 4108 4109 // Reset points to avoid jumping, because we dropped first swipes to calculate the angle 4110 self.startPoints = self.newPoints; 4111 4112 $.each(instance.slides, function (index, slide) { 4113 var slidePos, stagePos; 4114 4115 $.fancybox.stop(slide.$slide); 4116 4117 slidePos = $.fancybox.getTranslate(slide.$slide); 4118 stagePos = $.fancybox.getTranslate(instance.$refs.stage); 4119 4120 slide.$slide 4121 .css({ 4122 transform: "", 4123 opacity: "", 4124 "transition-duration": "" 4125 }) 4126 .removeClass("fancybox-animated") 4127 .removeClass(function (index, className) { 4128 return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); 4129 }); 4130 4131 if (slide.pos === instance.current.pos) { 4132 self.sliderStartPos.top = slidePos.top - stagePos.top; 4133 self.sliderStartPos.left = slidePos.left - stagePos.left; 4134 } 4135 4136 $.fancybox.setTranslate(slide.$slide, { 4137 top: slidePos.top - stagePos.top, 4138 left: slidePos.left - stagePos.left 4139 }); 4140 }); 4141 4142 // Stop slideshow 4143 if (instance.SlideShow && instance.SlideShow.isActive) { 4144 instance.SlideShow.stop(); 4145 } 4146 } 4147 4148 return; 4149 } 4150 4151 // Sticky edges 4152 if (swiping == "x") { 4153 if ( 4154 self.distanceX > 0 && 4155 (self.instance.group.length < 2 || (self.instance.current.index === 0 && !self.instance.current.opts.loop)) 4156 ) { 4157 left = left + Math.pow(self.distanceX, 0.8); 4158 } else if ( 4159 self.distanceX < 0 && 4160 (self.instance.group.length < 2 || 4161 (self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop)) 4162 ) { 4163 left = left - Math.pow(-self.distanceX, 0.8); 4164 } else { 4165 left = left + self.distanceX; 4166 } 4167 } 4168 4169 self.sliderLastPos = { 4170 top: swiping == "x" ? 0 : self.sliderStartPos.top + self.distanceY, 4171 left: left 4172 }; 4173 4174 if (self.requestId) { 4175 cancelAFrame(self.requestId); 4176 4177 self.requestId = null; 4178 } 4179 4180 self.requestId = requestAFrame(function () { 4181 if (self.sliderLastPos) { 4182 $.each(self.instance.slides, function (index, slide) { 4183 var pos = slide.pos - self.instance.currPos; 4184 4185 $.fancybox.setTranslate(slide.$slide, { 4186 top: self.sliderLastPos.top, 4187 left: self.sliderLastPos.left + pos * self.canvasWidth + pos * slide.opts.gutter 4188 }); 4189 }); 4190 4191 self.$container.addClass("fancybox-is-sliding"); 4192 } 4193 }); 4194 }; 4195 4196 Guestures.prototype.onPan = function () { 4197 var self = this; 4198 4199 // Prevent accidental movement (sometimes, when tapping casually, finger can move a bit) 4200 if (distance(self.newPoints[0], self.realPoints[0]) < ($.fancybox.isMobile ? 10 : 5)) { 4201 self.startPoints = self.newPoints; 4202 return; 4203 } 4204 4205 self.canTap = false; 4206 4207 self.contentLastPos = self.limitMovement(); 4208 4209 if (self.requestId) { 4210 cancelAFrame(self.requestId); 4211 } 4212 4213 self.requestId = requestAFrame(function () { 4214 $.fancybox.setTranslate(self.$content, self.contentLastPos); 4215 }); 4216 }; 4217 4218 // Make panning sticky to the edges 4219 Guestures.prototype.limitMovement = function () { 4220 var self = this; 4221 4222 var canvasWidth = self.canvasWidth; 4223 var canvasHeight = self.canvasHeight; 4224 4225 var distanceX = self.distanceX; 4226 var distanceY = self.distanceY; 4227 4228 var contentStartPos = self.contentStartPos; 4229 4230 var currentOffsetX = contentStartPos.left; 4231 var currentOffsetY = contentStartPos.top; 4232 4233 var currentWidth = contentStartPos.width; 4234 var currentHeight = contentStartPos.height; 4235 4236 var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY, newOffsetX, newOffsetY; 4237 4238 if (currentWidth > canvasWidth) { 4239 newOffsetX = currentOffsetX + distanceX; 4240 } else { 4241 newOffsetX = currentOffsetX; 4242 } 4243 4244 newOffsetY = currentOffsetY + distanceY; 4245 4246 // Slow down proportionally to traveled distance 4247 minTranslateX = Math.max(0, canvasWidth * 0.5 - currentWidth * 0.5); 4248 minTranslateY = Math.max(0, canvasHeight * 0.5 - currentHeight * 0.5); 4249 4250 maxTranslateX = Math.min(canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5); 4251 maxTranslateY = Math.min(canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5); 4252 4253 // -> 4254 if (distanceX > 0 && newOffsetX > minTranslateX) { 4255 newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8) || 0; 4256 } 4257 4258 // <- 4259 if (distanceX < 0 && newOffsetX < maxTranslateX) { 4260 newOffsetX = maxTranslateX + 1 - Math.pow(maxTranslateX - currentOffsetX - distanceX, 0.8) || 0; 4261 } 4262 4263 // \/ 4264 if (distanceY > 0 && newOffsetY > minTranslateY) { 4265 newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8) || 0; 4266 } 4267 4268 // /\ 4269 if (distanceY < 0 && newOffsetY < maxTranslateY) { 4270 newOffsetY = maxTranslateY + 1 - Math.pow(maxTranslateY - currentOffsetY - distanceY, 0.8) || 0; 4271 } 4272 4273 return { 4274 top: newOffsetY, 4275 left: newOffsetX 4276 }; 4277 }; 4278 4279 Guestures.prototype.limitPosition = function (newOffsetX, newOffsetY, newWidth, newHeight) { 4280 var self = this; 4281 4282 var canvasWidth = self.canvasWidth; 4283 var canvasHeight = self.canvasHeight; 4284 4285 if (newWidth > canvasWidth) { 4286 newOffsetX = newOffsetX > 0 ? 0 : newOffsetX; 4287 newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX; 4288 } else { 4289 // Center horizontally 4290 newOffsetX = Math.max(0, canvasWidth / 2 - newWidth / 2); 4291 } 4292 4293 if (newHeight > canvasHeight) { 4294 newOffsetY = newOffsetY > 0 ? 0 : newOffsetY; 4295 newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY; 4296 } else { 4297 // Center vertically 4298 newOffsetY = Math.max(0, canvasHeight / 2 - newHeight / 2); 4299 } 4300 4301 return { 4302 top: newOffsetY, 4303 left: newOffsetX 4304 }; 4305 }; 4306 4307 Guestures.prototype.onZoom = function () { 4308 var self = this; 4309 4310 // Calculate current distance between points to get pinch ratio and new width and height 4311 var contentStartPos = self.contentStartPos; 4312 4313 var currentWidth = contentStartPos.width; 4314 var currentHeight = contentStartPos.height; 4315 4316 var currentOffsetX = contentStartPos.left; 4317 var currentOffsetY = contentStartPos.top; 4318 4319 var endDistanceBetweenFingers = distance(self.newPoints[0], self.newPoints[1]); 4320 4321 var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers; 4322 4323 var newWidth = Math.floor(currentWidth * pinchRatio); 4324 var newHeight = Math.floor(currentHeight * pinchRatio); 4325 4326 // This is the translation due to pinch-zooming 4327 var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX; 4328 var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY; 4329 4330 // Point between the two touches 4331 var centerPointEndX = (self.newPoints[0].x + self.newPoints[1].x) / 2 - $(window).scrollLeft(); 4332 var centerPointEndY = (self.newPoints[0].y + self.newPoints[1].y) / 2 - $(window).scrollTop(); 4333 4334 // And this is the translation due to translation of the centerpoint 4335 // between the two fingers 4336 var translateFromTranslatingX = centerPointEndX - self.centerPointStartX; 4337 var translateFromTranslatingY = centerPointEndY - self.centerPointStartY; 4338 4339 // The new offset is the old/current one plus the total translation 4340 var newOffsetX = currentOffsetX + (translateFromZoomingX + translateFromTranslatingX); 4341 var newOffsetY = currentOffsetY + (translateFromZoomingY + translateFromTranslatingY); 4342 4343 var newPos = { 4344 top: newOffsetY, 4345 left: newOffsetX, 4346 scaleX: pinchRatio, 4347 scaleY: pinchRatio 4348 }; 4349 4350 self.canTap = false; 4351 4352 self.newWidth = newWidth; 4353 self.newHeight = newHeight; 4354 4355 self.contentLastPos = newPos; 4356 4357 if (self.requestId) { 4358 cancelAFrame(self.requestId); 4359 } 4360 4361 self.requestId = requestAFrame(function () { 4362 $.fancybox.setTranslate(self.$content, self.contentLastPos); 4363 }); 4364 }; 4365 4366 Guestures.prototype.ontouchend = function (e) { 4367 var self = this; 4368 4369 var swiping = self.isSwiping; 4370 var panning = self.isPanning; 4371 var zooming = self.isZooming; 4372 var scrolling = self.isScrolling; 4373 4374 self.endPoints = getPointerXY(e); 4375 self.dMs = Math.max(new Date().getTime() - self.startTime, 1); 4376 4377 self.$container.removeClass("fancybox-is-grabbing"); 4378 4379 $(document).off(".fb.touch"); 4380 4381 document.removeEventListener("scroll", self.onscroll, true); 4382 4383 if (self.requestId) { 4384 cancelAFrame(self.requestId); 4385 4386 self.requestId = null; 4387 } 4388 4389 self.isSwiping = false; 4390 self.isPanning = false; 4391 self.isZooming = false; 4392 self.isScrolling = false; 4393 4394 self.instance.isDragging = false; 4395 4396 if (self.canTap) { 4397 return self.onTap(e); 4398 } 4399 4400 self.speed = 100; 4401 4402 // Speed in px/ms 4403 self.velocityX = (self.distanceX / self.dMs) * 0.5; 4404 self.velocityY = (self.distanceY / self.dMs) * 0.5; 4405 4406 if (panning) { 4407 self.endPanning(); 4408 } else if (zooming) { 4409 self.endZooming(); 4410 } else { 4411 self.endSwiping(swiping, scrolling); 4412 } 4413 4414 return; 4415 }; 4416 4417 Guestures.prototype.endSwiping = function (swiping, scrolling) { 4418 var self = this, 4419 ret = false, 4420 len = self.instance.group.length, 4421 distanceX = Math.abs(self.distanceX), 4422 canAdvance = swiping == "x" && len > 1 && ((self.dMs > 130 && distanceX > 10) || distanceX > 50), 4423 speedX = 300; 4424 4425 self.sliderLastPos = null; 4426 4427 // Close if swiped vertically / navigate if horizontally 4428 if (swiping == "y" && !scrolling && Math.abs(self.distanceY) > 50) { 4429 // Continue vertical movement 4430 $.fancybox.animate( 4431 self.instance.current.$slide, { 4432 top: self.sliderStartPos.top + self.distanceY + self.velocityY * 150, 4433 opacity: 0 4434 }, 4435 200 4436 ); 4437 ret = self.instance.close(true, 250); 4438 } else if (canAdvance && self.distanceX > 0) { 4439 ret = self.instance.previous(speedX); 4440 } else if (canAdvance && self.distanceX < 0) { 4441 ret = self.instance.next(speedX); 4442 } 4443 4444 if (ret === false && (swiping == "x" || swiping == "y")) { 4445 self.instance.centerSlide(200); 4446 } 4447 4448 self.$container.removeClass("fancybox-is-sliding"); 4449 }; 4450 4451 // Limit panning from edges 4452 // ======================== 4453 Guestures.prototype.endPanning = function () { 4454 var self = this, 4455 newOffsetX, 4456 newOffsetY, 4457 newPos; 4458 4459 if (!self.contentLastPos) { 4460 return; 4461 } 4462 4463 if (self.opts.momentum === false || self.dMs > 350) { 4464 newOffsetX = self.contentLastPos.left; 4465 newOffsetY = self.contentLastPos.top; 4466 } else { 4467 // Continue movement 4468 newOffsetX = self.contentLastPos.left + self.velocityX * 500; 4469 newOffsetY = self.contentLastPos.top + self.velocityY * 500; 4470 } 4471 4472 newPos = self.limitPosition(newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height); 4473 4474 newPos.width = self.contentStartPos.width; 4475 newPos.height = self.contentStartPos.height; 4476 4477 $.fancybox.animate(self.$content, newPos, 366); 4478 }; 4479 4480 Guestures.prototype.endZooming = function () { 4481 var self = this; 4482 4483 var current = self.instance.current; 4484 4485 var newOffsetX, newOffsetY, newPos, reset; 4486 4487 var newWidth = self.newWidth; 4488 var newHeight = self.newHeight; 4489 4490 if (!self.contentLastPos) { 4491 return; 4492 } 4493 4494 newOffsetX = self.contentLastPos.left; 4495 newOffsetY = self.contentLastPos.top; 4496 4497 reset = { 4498 top: newOffsetY, 4499 left: newOffsetX, 4500 width: newWidth, 4501 height: newHeight, 4502 scaleX: 1, 4503 scaleY: 1 4504 }; 4505 4506 // Reset scalex/scaleY values; this helps for perfomance and does not break animation 4507 $.fancybox.setTranslate(self.$content, reset); 4508 4509 if (newWidth < self.canvasWidth && newHeight < self.canvasHeight) { 4510 self.instance.scaleToFit(150); 4511 } else if (newWidth > current.width || newHeight > current.height) { 4512 self.instance.scaleToActual(self.centerPointStartX, self.centerPointStartY, 150); 4513 } else { 4514 newPos = self.limitPosition(newOffsetX, newOffsetY, newWidth, newHeight); 4515 4516 $.fancybox.animate(self.$content, newPos, 150); 4517 } 4518 }; 4519 4520 Guestures.prototype.onTap = function (e) { 4521 var self = this; 4522 var $target = $(e.target); 4523 4524 var instance = self.instance; 4525 var current = instance.current; 4526 4527 var endPoints = (e && getPointerXY(e)) || self.startPoints; 4528 4529 var tapX = endPoints[0] ? endPoints[0].x - $(window).scrollLeft() - self.stagePos.left : 0; 4530 var tapY = endPoints[0] ? endPoints[0].y - $(window).scrollTop() - self.stagePos.top : 0; 4531 4532 var where; 4533 4534 var process = function (prefix) { 4535 var action = current.opts[prefix]; 4536 4537 if ($.isFunction(action)) { 4538 action = action.apply(instance, [current, e]); 4539 } 4540 4541 if (!action) { 4542 return; 4543 } 4544 4545 switch (action) { 4546 case "close": 4547 instance.close(self.startEvent); 4548 4549 break; 4550 4551 case "toggleControls": 4552 instance.toggleControls(); 4553 4554 break; 4555 4556 case "next": 4557 instance.next(); 4558 4559 break; 4560 4561 case "nextOrClose": 4562 if (instance.group.length > 1) { 4563 instance.next(); 4564 } else { 4565 instance.close(self.startEvent); 4566 } 4567 4568 break; 4569 4570 case "zoom": 4571 if (current.type == "image" && (current.isLoaded || current.$ghost)) { 4572 if (instance.canPan()) { 4573 instance.scaleToFit(); 4574 } else if (instance.isScaledDown()) { 4575 instance.scaleToActual(tapX, tapY); 4576 } else if (instance.group.length < 2) { 4577 instance.close(self.startEvent); 4578 } 4579 } 4580 4581 break; 4582 } 4583 }; 4584 4585 // Ignore right click 4586 if (e.originalEvent && e.originalEvent.button == 2) { 4587 return; 4588 } 4589 4590 // Skip if clicked on the scrollbar 4591 if (!$target.is("img") && tapX > $target[0].clientWidth + $target.offset().left) { 4592 return; 4593 } 4594 4595 // Check where is clicked 4596 if ($target.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container")) { 4597 where = "Outside"; 4598 } else if ($target.is(".fancybox-slide")) { 4599 where = "Slide"; 4600 } else if ( 4601 instance.current.$content && 4602 instance.current.$content 4603 .find($target) 4604 .addBack() 4605 .filter($target).length 4606 ) { 4607 where = "Content"; 4608 } else { 4609 return; 4610 } 4611 4612 // Check if this is a double tap 4613 if (self.tapped) { 4614 // Stop previously created single tap 4615 clearTimeout(self.tapped); 4616 self.tapped = null; 4617 4618 // Skip if distance between taps is too big 4619 if (Math.abs(tapX - self.tapX) > 50 || Math.abs(tapY - self.tapY) > 50) { 4620 return this; 4621 } 4622 4623 // OK, now we assume that this is a double-tap 4624 process("dblclick" + where); 4625 } else { 4626 // Single tap will be processed if user has not clicked second time within 300ms 4627 // or there is no need to wait for double-tap 4628 self.tapX = tapX; 4629 self.tapY = tapY; 4630 4631 if (current.opts["dblclick" + where] && current.opts["dblclick" + where] !== current.opts["click" + where]) { 4632 self.tapped = setTimeout(function () { 4633 self.tapped = null; 4634 4635 if (!instance.isAnimating) { 4636 process("click" + where); 4637 } 4638 }, 500); 4639 } else { 4640 process("click" + where); 4641 } 4642 } 4643 4644 return this; 4645 }; 4646 4647 $(document) 4648 .on("onActivate.fb", function (e, instance) { 4649 if (instance && !instance.Guestures) { 4650 instance.Guestures = new Guestures(instance); 4651 } 4652 }) 4653 .on("beforeClose.fb", function (e, instance) { 4654 if (instance && instance.Guestures) { 4655 instance.Guestures.destroy(); 4656 } 4657 }); 4658 })(window, document, jQuery); 4659// ========================================================================== 4660// 4661// SlideShow 4662// Enables slideshow functionality 4663// 4664// Example of usage: 4665// $.fancybox.getInstance().SlideShow.start() 4666// 4667// ========================================================================== 4668 (function (document, $) { 4669 "use strict"; 4670 4671 $.extend(true, $.fancybox.defaults, { 4672 btnTpl: { 4673 slideShow: '<button data-fancybox-play class="fancybox-button fancybox-button--play" title="{{PLAY_START}}">' + 4674 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.5 5.4v13.2l11-6.6z"/></svg>' + 4675 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.33 5.75h2.2v12.5h-2.2V5.75zm5.15 0h2.2v12.5h-2.2V5.75z"/></svg>' + 4676 "</button>" 4677 }, 4678 slideShow: { 4679 autoStart: false, 4680 speed: 3000, 4681 progress: true 4682 } 4683 }); 4684 4685 var SlideShow = function (instance) { 4686 this.instance = instance; 4687 this.init(); 4688 }; 4689 4690 $.extend(SlideShow.prototype, { 4691 timer: null, 4692 isActive: false, 4693 $button: null, 4694 4695 init: function () { 4696 var self = this, 4697 instance = self.instance, 4698 opts = instance.group[instance.currIndex].opts.slideShow; 4699 4700 self.$button = instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function () { 4701 self.toggle(); 4702 }); 4703 4704 if (instance.group.length < 2 || !opts) { 4705 self.$button.hide(); 4706 } else if (opts.progress) { 4707 self.$progress = $('<div class="fancybox-progress"></div>').appendTo(instance.$refs.inner); 4708 } 4709 }, 4710 4711 set: function (force) { 4712 var self = this, 4713 instance = self.instance, 4714 current = instance.current; 4715 4716 // Check if reached last element 4717 if (current && (force === true || current.opts.loop || instance.currIndex < instance.group.length - 1)) { 4718 if (self.isActive && current.contentType !== "video") { 4719 if (self.$progress) { 4720 $.fancybox.animate(self.$progress.show(), { 4721 scaleX: 1 4722 }, current.opts.slideShow.speed); 4723 } 4724 4725 self.timer = setTimeout(function () { 4726 if (!instance.current.opts.loop && instance.current.index == instance.group.length - 1) { 4727 instance.jumpTo(0); 4728 } else { 4729 instance.next(); 4730 } 4731 }, current.opts.slideShow.speed); 4732 } 4733 } else { 4734 self.stop(); 4735 instance.idleSecondsCounter = 0; 4736 instance.showControls(); 4737 } 4738 }, 4739 4740 clear: function () { 4741 var self = this; 4742 4743 clearTimeout(self.timer); 4744 4745 self.timer = null; 4746 4747 if (self.$progress) { 4748 self.$progress.removeAttr("style").hide(); 4749 } 4750 }, 4751 4752 start: function () { 4753 var self = this, 4754 current = self.instance.current; 4755 4756 if (current) { 4757 self.$button 4758 .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_STOP) 4759 .removeClass("fancybox-button--play") 4760 .addClass("fancybox-button--pause"); 4761 4762 self.isActive = true; 4763 4764 if (current.isComplete) { 4765 self.set(true); 4766 } 4767 4768 self.instance.trigger("onSlideShowChange", true); 4769 } 4770 }, 4771 4772 stop: function () { 4773 var self = this, 4774 current = self.instance.current; 4775 4776 self.clear(); 4777 4778 self.$button 4779 .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_START) 4780 .removeClass("fancybox-button--pause") 4781 .addClass("fancybox-button--play"); 4782 4783 self.isActive = false; 4784 4785 self.instance.trigger("onSlideShowChange", false); 4786 4787 if (self.$progress) { 4788 self.$progress.removeAttr("style").hide(); 4789 } 4790 }, 4791 4792 toggle: function () { 4793 var self = this; 4794 4795 if (self.isActive) { 4796 self.stop(); 4797 } else { 4798 self.start(); 4799 } 4800 } 4801 }); 4802 4803 $(document).on({ 4804 "onInit.fb": function (e, instance) { 4805 if (instance && !instance.SlideShow) { 4806 instance.SlideShow = new SlideShow(instance); 4807 } 4808 }, 4809 4810 "beforeShow.fb": function (e, instance, current, firstRun) { 4811 var SlideShow = instance && instance.SlideShow; 4812 4813 if (firstRun) { 4814 if (SlideShow && current.opts.slideShow.autoStart) { 4815 SlideShow.start(); 4816 } 4817 } else if (SlideShow && SlideShow.isActive) { 4818 SlideShow.clear(); 4819 } 4820 }, 4821 4822 "afterShow.fb": function (e, instance, current) { 4823 var SlideShow = instance && instance.SlideShow; 4824 4825 if (SlideShow && SlideShow.isActive) { 4826 SlideShow.set(); 4827 } 4828 }, 4829 4830 "afterKeydown.fb": function (e, instance, current, keypress, keycode) { 4831 var SlideShow = instance && instance.SlideShow; 4832 4833 // "P" or Spacebar 4834 if (SlideShow && current.opts.slideShow && (keycode === 80 || keycode === 32) && !$(document.activeElement).is("button,a,input")) { 4835 keypress.preventDefault(); 4836 4837 SlideShow.toggle(); 4838 } 4839 }, 4840 4841 "beforeClose.fb onDeactivate.fb": function (e, instance) { 4842 var SlideShow = instance && instance.SlideShow; 4843 4844 if (SlideShow) { 4845 SlideShow.stop(); 4846 } 4847 } 4848 }); 4849 4850 // Page Visibility API to pause slideshow when window is not active 4851 $(document).on("visibilitychange", function () { 4852 var instance = $.fancybox.getInstance(), 4853 SlideShow = instance && instance.SlideShow; 4854 4855 if (SlideShow && SlideShow.isActive) { 4856 if (document.hidden) { 4857 SlideShow.clear(); 4858 } else { 4859 SlideShow.set(); 4860 } 4861 } 4862 }); 4863 })(document, jQuery); 4864// ========================================================================== 4865// 4866// FullScreen 4867// Adds fullscreen functionality 4868// 4869// ========================================================================== 4870 (function (document, $) { 4871 "use strict"; 4872 4873 // Collection of methods supported by user browser 4874 var fn = (function () { 4875 var fnMap = [ 4876 ["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"], 4877 // new WebKit 4878 [ 4879 "webkitRequestFullscreen", 4880 "webkitExitFullscreen", 4881 "webkitFullscreenElement", 4882 "webkitFullscreenEnabled", 4883 "webkitfullscreenchange", 4884 "webkitfullscreenerror" 4885 ], 4886 // old WebKit (Safari 5.1) 4887 [ 4888 "webkitRequestFullScreen", 4889 "webkitCancelFullScreen", 4890 "webkitCurrentFullScreenElement", 4891 "webkitCancelFullScreen", 4892 "webkitfullscreenchange", 4893 "webkitfullscreenerror" 4894 ], 4895 [ 4896 "mozRequestFullScreen", 4897 "mozCancelFullScreen", 4898 "mozFullScreenElement", 4899 "mozFullScreenEnabled", 4900 "mozfullscreenchange", 4901 "mozfullscreenerror" 4902 ], 4903 ["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"] 4904 ]; 4905 4906 var ret = {}; 4907 4908 for (var i = 0; i < fnMap.length; i++) { 4909 var val = fnMap[i]; 4910 4911 if (val && val[1] in document) { 4912 for (var j = 0; j < val.length; j++) { 4913 ret[fnMap[0][j]] = val[j]; 4914 } 4915 4916 return ret; 4917 } 4918 } 4919 4920 return false; 4921 })(); 4922 4923 if (fn) { 4924 var FullScreen = { 4925 request: function (elem) { 4926 elem = elem || document.documentElement; 4927 4928 elem[fn.requestFullscreen](elem.ALLOW_KEYBOARD_INPUT); 4929 }, 4930 exit: function () { 4931 document[fn.exitFullscreen](); 4932 }, 4933 toggle: function (elem) { 4934 elem = elem || document.documentElement; 4935 4936 if (this.isFullscreen()) { 4937 this.exit(); 4938 } else { 4939 this.request(elem); 4940 } 4941 }, 4942 isFullscreen: function () { 4943 return Boolean(document[fn.fullscreenElement]); 4944 }, 4945 enabled: function () { 4946 return Boolean(document[fn.fullscreenEnabled]); 4947 } 4948 }; 4949 4950 $.extend(true, $.fancybox.defaults, { 4951 btnTpl: { 4952 fullScreen: '<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fsenter" title="{{FULL_SCREEN}}">' + 4953 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg>' + 4954 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 16h3v3h2v-5H5zm3-8H5v2h5V5H8zm6 11h2v-3h3v-2h-5zm2-11V5h-2v5h5V8z"/></svg>' + 4955 "</button>" 4956 }, 4957 fullScreen: { 4958 autoStart: false 4959 } 4960 }); 4961 4962 $(document).on(fn.fullscreenchange, function () { 4963 var isFullscreen = FullScreen.isFullscreen(), 4964 instance = $.fancybox.getInstance(); 4965 4966 if (instance) { 4967 // If image is zooming, then force to stop and reposition properly 4968 if (instance.current && instance.current.type === "image" && instance.isAnimating) { 4969 instance.isAnimating = false; 4970 4971 instance.update(true, true, 0); 4972 4973 if (!instance.isComplete) { 4974 instance.complete(); 4975 } 4976 } 4977 4978 instance.trigger("onFullscreenChange", isFullscreen); 4979 4980 instance.$refs.container.toggleClass("fancybox-is-fullscreen", isFullscreen); 4981 4982 instance.$refs.toolbar 4983 .find("[data-fancybox-fullscreen]") 4984 .toggleClass("fancybox-button--fsenter", !isFullscreen) 4985 .toggleClass("fancybox-button--fsexit", isFullscreen); 4986 } 4987 }); 4988 } 4989 4990 $(document).on({ 4991 "onInit.fb": function (e, instance) { 4992 var $container; 4993 4994 if (!fn) { 4995 instance.$refs.toolbar.find("[data-fancybox-fullscreen]").remove(); 4996 4997 return; 4998 } 4999 5000 if (instance && instance.group[instance.currIndex].opts.fullScreen) { 5001 $container = instance.$refs.container; 5002 5003 $container.on("click.fb-fullscreen", "[data-fancybox-fullscreen]", function (e) { 5004 e.stopPropagation(); 5005 e.preventDefault(); 5006 5007 FullScreen.toggle(); 5008 }); 5009 5010 if (instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true) { 5011 FullScreen.request(); 5012 } 5013 5014 // Expose API 5015 instance.FullScreen = FullScreen; 5016 } else if (instance) { 5017 instance.$refs.toolbar.find("[data-fancybox-fullscreen]").hide(); 5018 } 5019 }, 5020 5021 "afterKeydown.fb": function (e, instance, current, keypress, keycode) { 5022 // "F" 5023 if (instance && instance.FullScreen && keycode === 70) { 5024 keypress.preventDefault(); 5025 5026 instance.FullScreen.toggle(); 5027 } 5028 }, 5029 5030 "beforeClose.fb": function (e, instance) { 5031 if (instance && instance.FullScreen && instance.$refs.container.hasClass("fancybox-is-fullscreen")) { 5032 FullScreen.exit(); 5033 } 5034 } 5035 }); 5036 })(document, jQuery); 5037// ========================================================================== 5038// 5039// Thumbs 5040// Displays thumbnails in a grid 5041// 5042// ========================================================================== 5043 (function (document, $) { 5044 "use strict"; 5045 5046 var CLASS = "fancybox-thumbs", 5047 CLASS_ACTIVE = CLASS + "-active"; 5048 5049 // Make sure there are default values 5050 $.fancybox.defaults = $.extend( 5051 true, { 5052 btnTpl: { 5053 thumbs: '<button data-fancybox-thumbs class="fancybox-button fancybox-button--thumbs" title="{{THUMBS}}">' + 5054 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.59 14.59h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76H5.65V5.65z"/></svg>' + 5055 "</button>" 5056 }, 5057 thumbs: { 5058 autoStart: false, // Display thumbnails on opening 5059 hideOnClose: true, // Hide thumbnail grid when closing animation starts 5060 parentEl: ".fancybox-container", // Container is injected into this element 5061 axis: "y" // Vertical (y) or horizontal (x) scrolling 5062 } 5063 }, 5064 $.fancybox.defaults 5065 ); 5066 5067 var FancyThumbs = function (instance) { 5068 this.init(instance); 5069 }; 5070 5071 $.extend(FancyThumbs.prototype, { 5072 $button: null, 5073 $grid: null, 5074 $list: null, 5075 isVisible: false, 5076 isActive: false, 5077 5078 init: function (instance) { 5079 var self = this, 5080 group = instance.group, 5081 enabled = 0; 5082 5083 self.instance = instance; 5084 self.opts = group[instance.currIndex].opts.thumbs; 5085 5086 instance.Thumbs = self; 5087 5088 self.$button = instance.$refs.toolbar.find("[data-fancybox-thumbs]"); 5089 5090 // Enable thumbs if at least two group items have thumbnails 5091 for (var i = 0, len = group.length; i < len; i++) { 5092 if (group[i].thumb) { 5093 enabled++; 5094 } 5095 5096 if (enabled > 1) { 5097 break; 5098 } 5099 } 5100 5101 if (enabled > 1 && !!self.opts) { 5102 self.$button.removeAttr("style").on("click", function () { 5103 self.toggle(); 5104 }); 5105 5106 self.isActive = true; 5107 } else { 5108 self.$button.hide(); 5109 } 5110 }, 5111 5112 create: function () { 5113 var self = this, 5114 instance = self.instance, 5115 parentEl = self.opts.parentEl, 5116 list = [], 5117 src; 5118 5119 if (!self.$grid) { 5120 // Create main element 5121 self.$grid = $('<div class="' + CLASS + " " + CLASS + "-" + self.opts.axis + '"></div>').appendTo( 5122 instance.$refs.container 5123 .find(parentEl) 5124 .addBack() 5125 .filter(parentEl) 5126 ); 5127 5128 // Add "click" event that performs gallery navigation 5129 self.$grid.on("click", "a", function () { 5130 instance.jumpTo($(this).attr("data-index")); 5131 }); 5132 } 5133 5134 // Build the list 5135 if (!self.$list) { 5136 self.$list = $('<div class="' + CLASS + '__list">').appendTo(self.$grid); 5137 } 5138 5139 $.each(instance.group, function (i, item) { 5140 src = item.thumb; 5141 5142 if (!src && item.type === "image") { 5143 src = item.src; 5144 } 5145 5146 list.push( 5147 '<a href="javascript:;" tabindex="0" data-index="' + 5148 i + 5149 '"' + 5150 (src && src.length ? ' style="background-image:url(' + src + ')"' : 'class="fancybox-thumbs-missing"') + 5151 "></a>" 5152 ); 5153 }); 5154 5155 self.$list[0].innerHTML = list.join(""); 5156 5157 if (self.opts.axis === "x") { 5158 // Set fixed width for list element to enable horizontal scrolling 5159 self.$list.width( 5160 parseInt(self.$grid.css("padding-right"), 10) + 5161 instance.group.length * 5162 self.$list 5163 .children() 5164 .eq(0) 5165 .outerWidth(true) 5166 ); 5167 } 5168 }, 5169 5170 focus: function (duration) { 5171 var self = this, 5172 $list = self.$list, 5173 $grid = self.$grid, 5174 thumb, 5175 thumbPos; 5176 5177 if (!self.instance.current) { 5178 return; 5179 } 5180 5181 thumb = $list 5182 .children() 5183 .removeClass(CLASS_ACTIVE) 5184 .filter('[data-index="' + self.instance.current.index + '"]') 5185 .addClass(CLASS_ACTIVE); 5186 5187 thumbPos = thumb.position(); 5188 5189 // Check if need to scroll to make current thumb visible 5190 if (self.opts.axis === "y" && (thumbPos.top < 0 || thumbPos.top > $list.height() - thumb.outerHeight())) { 5191 $list.stop().animate({ 5192 scrollTop: $list.scrollTop() + thumbPos.top 5193 }, 5194 duration 5195 ); 5196 } else if ( 5197 self.opts.axis === "x" && 5198 (thumbPos.left < $grid.scrollLeft() || thumbPos.left > $grid.scrollLeft() + ($grid.width() - thumb.outerWidth())) 5199 ) { 5200 $list 5201 .parent() 5202 .stop() 5203 .animate({ 5204 scrollLeft: thumbPos.left 5205 }, 5206 duration 5207 ); 5208 } 5209 }, 5210 5211 update: function () { 5212 var that = this; 5213 that.instance.$refs.container.toggleClass("fancybox-show-thumbs", this.isVisible); 5214 5215 if (that.isVisible) { 5216 if (!that.$grid) { 5217 that.create(); 5218 } 5219 5220 that.instance.trigger("onThumbsShow"); 5221 5222 that.focus(0); 5223 } else if (that.$grid) { 5224 that.instance.trigger("onThumbsHide"); 5225 } 5226 5227 // Update content position 5228 that.instance.update(); 5229 }, 5230 5231 hide: function () { 5232 this.isVisible = false; 5233 this.update(); 5234 }, 5235 5236 show: function () { 5237 this.isVisible = true; 5238 this.update(); 5239 }, 5240 5241 toggle: function () { 5242 this.isVisible = !this.isVisible; 5243 this.update(); 5244 } 5245 }); 5246 5247 $(document).on({ 5248 "onInit.fb": function (e, instance) { 5249 var Thumbs; 5250 5251 if (instance && !instance.Thumbs) { 5252 Thumbs = new FancyThumbs(instance); 5253 5254 if (Thumbs.isActive && Thumbs.opts.autoStart === true) { 5255 Thumbs.show(); 5256 } 5257 } 5258 }, 5259 5260 "beforeShow.fb": function (e, instance, item, firstRun) { 5261 var Thumbs = instance && instance.Thumbs; 5262 5263 if (Thumbs && Thumbs.isVisible) { 5264 Thumbs.focus(firstRun ? 0 : 250); 5265 } 5266 }, 5267 5268 "afterKeydown.fb": function (e, instance, current, keypress, keycode) { 5269 var Thumbs = instance && instance.Thumbs; 5270 5271 // "G" 5272 if (Thumbs && Thumbs.isActive && keycode === 71) { 5273 keypress.preventDefault(); 5274 5275 Thumbs.toggle(); 5276 } 5277 }, 5278 5279 "beforeClose.fb": function (e, instance) { 5280 var Thumbs = instance && instance.Thumbs; 5281 5282 if (Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false) { 5283 Thumbs.$grid.hide(); 5284 } 5285 } 5286 }); 5287 })(document, jQuery); 5288//// ========================================================================== 5289// 5290// Share 5291// Displays simple form for sharing current url 5292// 5293// ========================================================================== 5294 (function (document, $) { 5295 "use strict"; 5296 5297 $.extend(true, $.fancybox.defaults, { 5298 btnTpl: { 5299 share: '<button data-fancybox-share class="fancybox-button fancybox-button--share" title="{{SHARE}}">' + 5300 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2.55 19c1.4-8.4 9.1-9.8 11.9-9.8V5l7 7-7 6.3v-3.5c-2.8 0-10.5 2.1-11.9 4.2z"/></svg>' + 5301 "</button>" 5302 }, 5303 share: { 5304 url: function (instance, item) { 5305 return ( 5306 (!instance.currentHash && !(item.type === "inline" || item.type === "html") ? item.origSrc || item.src : false) || window.location 5307 ); 5308 }, 5309 tpl: '<div class="fancybox-share">' + 5310 "<h1>{{SHARE}}</h1>" + 5311 "<p>" + 5312 '<a class="fancybox-share__button fancybox-share__button--fb" href="https://www.facebook.com/sharer/sharer.php?u={{url}}">' + 5313 '<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m287 456v-299c0-21 6-35 35-35h38v-63c-7-1-29-3-55-3-54 0-91 33-91 94v306m143-254h-205v72h196" /></svg>' + 5314 "<span>Facebook</span>" + 5315 "</a>" + 5316 '<a class="fancybox-share__button fancybox-share__button--tw" href="https://twitter.com/intent/tweet?url={{url}}&text={{descr}}">' + 5317 '<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m456 133c-14 7-31 11-47 13 17-10 30-27 37-46-15 10-34 16-52 20-61-62-157-7-141 75-68-3-129-35-169-85-22 37-11 86 26 109-13 0-26-4-37-9 0 39 28 72 65 80-12 3-25 4-37 2 10 33 41 57 77 57-42 30-77 38-122 34 170 111 378-32 359-208 16-11 30-25 41-42z" /></svg>' + 5318 "<span>Twitter</span>" + 5319 "</a>" + 5320 '<a class="fancybox-share__button fancybox-share__button--pt" href="https://www.pinterest.com/pin/create/button/?url={{url}}&description={{descr}}&media={{media}}">' + 5321 '<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m265 56c-109 0-164 78-164 144 0 39 15 74 47 87 5 2 10 0 12-5l4-19c2-6 1-8-3-13-9-11-15-25-15-45 0-58 43-110 113-110 62 0 96 38 96 88 0 67-30 122-73 122-24 0-42-19-36-44 6-29 20-60 20-81 0-19-10-35-31-35-25 0-44 26-44 60 0 21 7 36 7 36l-30 125c-8 37-1 83 0 87 0 3 4 4 5 2 2-3 32-39 42-75l16-64c8 16 31 29 56 29 74 0 124-67 124-157 0-69-58-132-146-132z" fill="#fff"/></svg>' + 5322 "<span>Pinterest</span>" + 5323 "</a>" + 5324 "</p>" + 5325 '<p><input class="fancybox-share__input" type="text" value="{{url_raw}}" onclick="select()" /></p>' + 5326 "</div>" 5327 } 5328 }); 5329 5330 function escapeHtml(string) { 5331 var entityMap = { 5332 "&": "&", 5333 "<": "<", 5334 ">": ">", 5335 '"': """, 5336 "'": "'", 5337 "/": "/", 5338 "`": "`", 5339 "=": "=" 5340 }; 5341 5342 return String(string).replace(/[&<>"'`=\/]/g, function (s) { 5343 return entityMap[s]; 5344 }); 5345 } 5346 5347 $(document).on("click", "[data-fancybox-share]", function () { 5348 var instance = $.fancybox.getInstance(), 5349 current = instance.current || null, 5350 url, 5351 tpl; 5352 5353 if (!current) { 5354 return; 5355 } 5356 5357 if ($.type(current.opts.share.url) === "function") { 5358 url = current.opts.share.url.apply(current, [instance, current]); 5359 } 5360 5361 tpl = current.opts.share.tpl 5362 .replace(/\{\{media\}\}/g, current.type === "image" ? encodeURIComponent(current.src) : "") 5363 .replace(/\{\{url\}\}/g, encodeURIComponent(url)) 5364 .replace(/\{\{url_raw\}\}/g, escapeHtml(url)) 5365 .replace(/\{\{descr\}\}/g, instance.$caption ? encodeURIComponent(instance.$caption.text()) : ""); 5366 5367 $.fancybox.open({ 5368 src: instance.translate(instance, tpl), 5369 type: "html", 5370 opts: { 5371 touch: false, 5372 animationEffect: false, 5373 afterLoad: function (shareInstance, shareCurrent) { 5374 // Close self if parent instance is closing 5375 instance.$refs.container.one("beforeClose.fb", function () { 5376 shareInstance.close(null, 0); 5377 }); 5378 5379 // Opening links in a popup window 5380 shareCurrent.$content.find(".fancybox-share__button").click(function () { 5381 window.open(this.href, "Share", "width=550, height=450"); 5382 return false; 5383 }); 5384 }, 5385 mobile: { 5386 autoFocus: false 5387 } 5388 } 5389 }); 5390 }); 5391 })(document, jQuery); 5392// ========================================================================== 5393// 5394// Hash 5395// Enables linking to each modal 5396// 5397// ========================================================================== 5398 (function (window, document, $) { 5399 "use strict"; 5400 5401 // Simple $.escapeSelector polyfill (for jQuery prior v3) 5402 if (!$.escapeSelector) { 5403 $.escapeSelector = function (sel) { 5404 var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; 5405 var fcssescape = function (ch, asCodePoint) { 5406 if (asCodePoint) { 5407 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 5408 if (ch === "\0") { 5409 return "\uFFFD"; 5410 } 5411 5412 // Control characters and (dependent upon position) numbers get escaped as code points 5413 return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; 5414 } 5415 5416 // Other potentially-special ASCII characters get backslash-escaped 5417 return "\\" + ch; 5418 }; 5419 5420 return (sel + "").replace(rcssescape, fcssescape); 5421 }; 5422 } 5423 5424 // Get info about gallery name and current index from url 5425 function parseUrl() { 5426 var hash = window.location.hash.substr(1), 5427 rez = hash.split("-"), 5428 index = rez.length > 1 && /^\+?\d+$/.test(rez[rez.length - 1]) ? parseInt(rez.pop(-1), 10) || 1 : 1, 5429 gallery = rez.join("-"); 5430 5431 return { 5432 hash: hash, 5433 /* Index is starting from 1 */ 5434 index: index < 1 ? 1 : index, 5435 gallery: gallery 5436 }; 5437 } 5438 5439 // Trigger click evnt on links to open new fancyBox instance 5440 function triggerFromUrl(url) { 5441 if (url.gallery !== "") { 5442 // If we can find element matching 'data-fancybox' atribute, 5443 // then triggering click event should start fancyBox 5444 $("[data-fancybox='" + $.escapeSelector(url.gallery) + "']") 5445 .eq(url.index - 1) 5446 .focus() 5447 .trigger("click.fb-start"); 5448 } 5449 } 5450 5451 // Get gallery name from current instance 5452 function getGalleryID(instance) { 5453 var opts, ret; 5454 5455 if (!instance) { 5456 return false; 5457 } 5458 5459 opts = instance.current ? instance.current.opts : instance.opts; 5460 ret = opts.hash || (opts.$orig ? opts.$orig.data("fancybox") || opts.$orig.data("fancybox-trigger") : ""); 5461 5462 return ret === "" ? false : ret; 5463 } 5464 5465 // Start when DOM becomes ready 5466 $(function () { 5467 // Check if user has disabled this module 5468 if ($.fancybox.defaults.hash === false) { 5469 return; 5470 } 5471 5472 // Update hash when opening/closing fancyBox 5473 $(document).on({ 5474 "onInit.fb": function (e, instance) { 5475 var url, gallery; 5476 5477 if (instance.group[instance.currIndex].opts.hash === false) { 5478 return; 5479 } 5480 5481 url = parseUrl(); 5482 gallery = getGalleryID(instance); 5483 5484 // Make sure gallery start index matches index from hash 5485 if (gallery && url.gallery && gallery == url.gallery) { 5486 instance.currIndex = url.index - 1; 5487 } 5488 }, 5489 5490 "beforeShow.fb": function (e, instance, current, firstRun) { 5491 var gallery; 5492 5493 if (!current || current.opts.hash === false) { 5494 return; 5495 } 5496 5497 // Check if need to update window hash 5498 gallery = getGalleryID(instance); 5499 5500 if (!gallery) { 5501 return; 5502 } 5503 5504 // Variable containing last hash value set by fancyBox 5505 // It will be used to determine if fancyBox needs to close after hash change is detected 5506 instance.currentHash = gallery + (instance.group.length > 1 ? "-" + (current.index + 1) : ""); 5507 5508 // If current hash is the same (this instance most likely is opened by hashchange), then do nothing 5509 if (window.location.hash === "#" + instance.currentHash) { 5510 return; 5511 } 5512 5513 if (firstRun && !instance.origHash) { 5514 instance.origHash = window.location.hash; 5515 } 5516 5517 if (instance.hashTimer) { 5518 clearTimeout(instance.hashTimer); 5519 } 5520 5521 // Update hash 5522 instance.hashTimer = setTimeout(function () { 5523 if ("replaceState" in window.history) { 5524 window.history[firstRun ? "pushState" : "replaceState"]({}, 5525 document.title, 5526 window.location.pathname + window.location.search + "#" + instance.currentHash 5527 ); 5528 5529 if (firstRun) { 5530 instance.hasCreatedHistory = true; 5531 } 5532 } else { 5533 window.location.hash = instance.currentHash; 5534 } 5535 5536 instance.hashTimer = null; 5537 }, 300); 5538 }, 5539 5540 "beforeClose.fb": function (e, instance, current) { 5541 if (!current || current.opts.hash === false) { 5542 return; 5543 } 5544 5545 clearTimeout(instance.hashTimer); 5546 5547 // Goto previous history entry 5548 if (instance.currentHash && instance.hasCreatedHistory) { 5549 window.history.back(); 5550 } else if (instance.currentHash) { 5551 if ("replaceState" in window.history) { 5552 window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (instance.origHash || "")); 5553 } else { 5554 window.location.hash = instance.origHash; 5555 } 5556 } 5557 5558 instance.currentHash = null; 5559 } 5560 }); 5561 5562 // Check if need to start/close after url has changed 5563 $(window).on("hashchange.fb", function () { 5564 var url = parseUrl(), 5565 fb = null; 5566 5567 // Find last fancyBox instance that has "hash" 5568 $.each( 5569 $(".fancybox-container") 5570 .get() 5571 .reverse(), 5572 function (index, value) { 5573 var tmp = $(value).data("FancyBox"); 5574 5575 if (tmp && tmp.currentHash) { 5576 fb = tmp; 5577 return false; 5578 } 5579 } 5580 ); 5581 5582 if (fb) { 5583 // Now, compare hash values 5584 if (fb.currentHash !== url.gallery + "-" + url.index && !(url.index === 1 && fb.currentHash == url.gallery)) { 5585 fb.currentHash = null; 5586 5587 fb.close(); 5588 } 5589 } else if (url.gallery !== "") { 5590 triggerFromUrl(url); 5591 } 5592 }); 5593 5594 // Check current hash and trigger click event on matching element to start fancyBox, if needed 5595 setTimeout(function () { 5596 if (!$.fancybox.getInstance()) { 5597 triggerFromUrl(parseUrl()); 5598 } 5599 }, 50); 5600 }); 5601 })(window, document, jQuery); 5602// ========================================================================== 5603// 5604// Wheel 5605// Basic mouse weheel support for gallery navigation 5606// 5607// ========================================================================== 5608 (function (document, $) { 5609 "use strict"; 5610 5611 var prevTime = new Date().getTime(); 5612 5613 $(document).on({ 5614 "onInit.fb": function (e, instance, current) { 5615 instance.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll", function (e) { 5616 var current = instance.current, 5617 currTime = new Date().getTime(); 5618 5619 if (instance.group.length < 2 || current.opts.wheel === false || (current.opts.wheel === "auto" && current.type !== "image")) { 5620 return; 5621 } 5622 5623 e.preventDefault(); 5624 e.stopPropagation(); 5625 5626 if (current.$slide.hasClass("fancybox-animated")) { 5627 return; 5628 } 5629 5630 e = e.originalEvent || e; 5631 5632 if (currTime - prevTime < 250) { 5633 return; 5634 } 5635 5636 prevTime = currTime; 5637 5638 instance[(-e.deltaY || -e.deltaX || e.wheelDelta || -e.detail) < 0 ? "next" : "previous"](); 5639 }); 5640 } 5641 }); 5642 })(document, jQuery); 5643 5644 /***/ }), 5645 5646
vendor: 13,320 bytes, lines 5646-5870
5646/***/ "./node_modules/@popperjs/core/lib/createPopper.js": 5647 /*!*********************************************************!*\ 5648 !*** ./node_modules/@popperjs/core/lib/createPopper.js ***! 5649 \*********************************************************/ 5650 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 5651 5652 "use strict"; 5653 __webpack_require__.r(__webpack_exports__); 5654 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 5655 /* harmony export */ createPopper: function() { return /* binding */ createPopper; }, 5656 /* harmony export */ detectOverflow: function() { return /* reexport safe */ _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_8__["default"]; }, 5657 /* harmony export */ popperGenerator: function() { return /* binding */ popperGenerator; } 5658 /* harmony export */ }); 5659 /* harmony import */ var _dom_utils_getCompositeRect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dom-utils/getCompositeRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js"); 5660 /* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"); 5661 /* harmony import */ var _dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dom-utils/listScrollParents.js */ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js"); 5662 /* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); 5663 /* harmony import */ var _utils_orderModifiers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/orderModifiers.js */ "./node_modules/@popperjs/core/lib/utils/orderModifiers.js"); 5664 /* harmony import */ var _utils_debounce_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/debounce.js */ "./node_modules/@popperjs/core/lib/utils/debounce.js"); 5665 /* harmony import */ var _utils_mergeByName_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/mergeByName.js */ "./node_modules/@popperjs/core/lib/utils/mergeByName.js"); 5666 /* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); 5667 /* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 var DEFAULT_OPTIONS = { 5678 placement: 'bottom', 5679 modifiers: [], 5680 strategy: 'absolute' 5681 }; 5682 5683 function areValidElements() { 5684 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 5685 args[_key] = arguments[_key]; 5686 } 5687 5688 return !args.some(function (element) { 5689 return !(element && typeof element.getBoundingClientRect === 'function'); 5690 }); 5691 } 5692 5693 function popperGenerator(generatorOptions) { 5694 if (generatorOptions === void 0) { 5695 generatorOptions = {}; 5696 } 5697 5698 var _generatorOptions = generatorOptions, 5699 _generatorOptions$def = _generatorOptions.defaultModifiers, 5700 defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, 5701 _generatorOptions$def2 = _generatorOptions.defaultOptions, 5702 defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; 5703 return function createPopper(reference, popper, options) { 5704 if (options === void 0) { 5705 options = defaultOptions; 5706 } 5707 5708 var state = { 5709 placement: 'bottom', 5710 orderedModifiers: [], 5711 options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), 5712 modifiersData: {}, 5713 elements: { 5714 reference: reference, 5715 popper: popper 5716 }, 5717 attributes: {}, 5718 styles: {} 5719 }; 5720 var effectCleanupFns = []; 5721 var isDestroyed = false; 5722 var instance = { 5723 state: state, 5724 setOptions: function setOptions(setOptionsAction) { 5725 var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction; 5726 cleanupModifierEffects(); 5727 state.options = Object.assign({}, defaultOptions, state.options, options); 5728 state.scrollParents = { 5729 reference: (0,_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isElement)(reference) ? (0,_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_1__["default"])(reference) : reference.contextElement ? (0,_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_1__["default"])(reference.contextElement) : [], 5730 popper: (0,_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_1__["default"])(popper) 5731 }; // Orders the modifiers based on their dependencies and `phase` 5732 // properties 5733 5734 var orderedModifiers = (0,_utils_orderModifiers_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_utils_mergeByName_js__WEBPACK_IMPORTED_MODULE_3__["default"])([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers 5735 5736 state.orderedModifiers = orderedModifiers.filter(function (m) { 5737 return m.enabled; 5738 }); 5739 runModifierEffects(); 5740 return instance.update(); 5741 }, 5742 // Sync update – it will always be executed, even if not necessary. This 5743 // is useful for low frequency updates where sync behavior simplifies the 5744 // logic. 5745 // For high frequency updates (e.g. `resize` and `scroll` events), always 5746 // prefer the async Popper#update method 5747 forceUpdate: function forceUpdate() { 5748 if (isDestroyed) { 5749 return; 5750 } 5751 5752 var _state$elements = state.elements, 5753 reference = _state$elements.reference, 5754 popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements 5755 // anymore 5756 5757 if (!areValidElements(reference, popper)) { 5758 return; 5759 } // Store the reference and popper rects to be read by modifiers 5760 5761 5762 state.rects = { 5763 reference: (0,_dom_utils_getCompositeRect_js__WEBPACK_IMPORTED_MODULE_4__["default"])(reference, (0,_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(popper), state.options.strategy === 'fixed'), 5764 popper: (0,_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_6__["default"])(popper) 5765 }; // Modifiers have the ability to reset the current update cycle. The 5766 // most common use case for this is the `flip` modifier changing the 5767 // placement, which then needs to re-run all the modifiers, because the 5768 // logic was previously ran for the previous placement and is therefore 5769 // stale/incorrect 5770 5771 state.reset = false; 5772 state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier 5773 // is filled with the initial data specified by the modifier. This means 5774 // it doesn't persist and is fresh on each update. 5775 // To ensure persistent data, use `${name}#persistent` 5776 5777 state.orderedModifiers.forEach(function (modifier) { 5778 return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); 5779 }); 5780 5781 for (var index = 0; index < state.orderedModifiers.length; index++) { 5782 if (state.reset === true) { 5783 state.reset = false; 5784 index = -1; 5785 continue; 5786 } 5787 5788 var _state$orderedModifie = state.orderedModifiers[index], 5789 fn = _state$orderedModifie.fn, 5790 _state$orderedModifie2 = _state$orderedModifie.options, 5791 _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, 5792 name = _state$orderedModifie.name; 5793 5794 if (typeof fn === 'function') { 5795 state = fn({ 5796 state: state, 5797 options: _options, 5798 name: name, 5799 instance: instance 5800 }) || state; 5801 } 5802 } 5803 }, 5804 // Async and optimistically optimized update – it will not be executed if 5805 // not necessary (debounced to run at most once-per-tick) 5806 update: (0,_utils_debounce_js__WEBPACK_IMPORTED_MODULE_7__["default"])(function () { 5807 return new Promise(function (resolve) { 5808 instance.forceUpdate(); 5809 resolve(state); 5810 }); 5811 }), 5812 destroy: function destroy() { 5813 cleanupModifierEffects(); 5814 isDestroyed = true; 5815 } 5816 }; 5817 5818 if (!areValidElements(reference, popper)) { 5819 return instance; 5820 } 5821 5822 instance.setOptions(options).then(function (state) { 5823 if (!isDestroyed && options.onFirstUpdate) { 5824 options.onFirstUpdate(state); 5825 } 5826 }); // Modifiers have the ability to execute arbitrary code before the first 5827 // update cycle runs. They will be executed in the same order as the update 5828 // cycle. This is useful when a modifier adds some persistent data that 5829 // other modifiers need to use, but the modifier is run after the dependent 5830 // one. 5831 5832 function runModifierEffects() { 5833 state.orderedModifiers.forEach(function (_ref) { 5834 var name = _ref.name, 5835 _ref$options = _ref.options, 5836 options = _ref$options === void 0 ? {} : _ref$options, 5837 effect = _ref.effect; 5838 5839 if (typeof effect === 'function') { 5840 var cleanupFn = effect({ 5841 state: state, 5842 name: name, 5843 instance: instance, 5844 options: options 5845 }); 5846 5847 var noopFn = function noopFn() {}; 5848 5849 effectCleanupFns.push(cleanupFn || noopFn); 5850 } 5851 }); 5852 } 5853 5854 function cleanupModifierEffects() { 5855 effectCleanupFns.forEach(function (fn) { 5856 return fn(); 5857 }); 5858 effectCleanupFns = []; 5859 } 5860 5861 return instance; 5862 }; 5863 } 5864 var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules 5865 5866 5867 5868 /***/ }), 5869 5870
vendor: 1,784 bytes, lines 5870-5908
5870/***/ "./node_modules/@popperjs/core/lib/dom-utils/contains.js": 5871 /*!***************************************************************!*\ 5872 !*** ./node_modules/@popperjs/core/lib/dom-utils/contains.js ***! 5873 \***************************************************************/ 5874 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 5875 5876 "use strict"; 5877 __webpack_require__.r(__webpack_exports__); 5878 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 5879 /* harmony export */ "default": function() { return /* binding */ contains; } 5880 /* harmony export */ }); 5881 /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 5882 5883 function contains(parent, child) { 5884 var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method 5885 5886 if (parent.contains(child)) { 5887 return true; 5888 } // then fallback to custom implementation with Shadow DOM support 5889 else if (rootNode && (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isShadowRoot)(rootNode)) { 5890 var next = child; 5891 5892 do { 5893 if (next && parent.isSameNode(next)) { 5894 return true; 5895 } // $FlowFixMe[prop-missing]: need a better way to handle this... 5896 5897 5898 next = next.parentNode || next.host; 5899 } while (next); 5900 } // Give up, the result is false 5901 5902 5903 return false; 5904 } 5905 5906 /***/ }), 5907 5908
vendor: 3,446 bytes, lines 5908-5967
5908/***/ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js": 5909 /*!****************************************************************************!*\ 5910 !*** ./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js ***! 5911 \****************************************************************************/ 5912 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 5913 5914 "use strict"; 5915 __webpack_require__.r(__webpack_exports__); 5916 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 5917 /* harmony export */ "default": function() { return /* binding */ getBoundingClientRect; } 5918 /* harmony export */ }); 5919 /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 5920 /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); 5921 /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 5922 /* harmony import */ var _isLayoutViewport_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isLayoutViewport.js */ "./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js"); 5923 5924 5925 5926 5927 function getBoundingClientRect(element, includeScale, isFixedStrategy) { 5928 if (includeScale === void 0) { 5929 includeScale = false; 5930 } 5931 5932 if (isFixedStrategy === void 0) { 5933 isFixedStrategy = false; 5934 } 5935 5936 var clientRect = element.getBoundingClientRect(); 5937 var scaleX = 1; 5938 var scaleY = 1; 5939 5940 if (includeScale && (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element)) { 5941 scaleX = element.offsetWidth > 0 ? (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_1__.round)(clientRect.width) / element.offsetWidth || 1 : 1; 5942 scaleY = element.offsetHeight > 0 ? (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_1__.round)(clientRect.height) / element.offsetHeight || 1 : 1; 5943 } 5944 5945 var _ref = (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isElement)(element) ? (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element) : window, 5946 visualViewport = _ref.visualViewport; 5947 5948 var addVisualOffsets = !(0,_isLayoutViewport_js__WEBPACK_IMPORTED_MODULE_3__["default"])() && isFixedStrategy; 5949 var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; 5950 var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; 5951 var width = clientRect.width / scaleX; 5952 var height = clientRect.height / scaleY; 5953 return { 5954 width: width, 5955 height: height, 5956 top: y, 5957 right: x + width, 5958 bottom: y + height, 5959 left: x, 5960 x: x, 5961 y: y 5962 }; 5963 } 5964 5965 /***/ }), 5966 5967
vendor: 7,824 bytes, lines 5967-6065
5967/***/ "./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js": 5968 /*!**********************************************************************!*\ 5969 !*** ./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js ***! 5970 \**********************************************************************/ 5971 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 5972 5973 "use strict"; 5974 __webpack_require__.r(__webpack_exports__); 5975 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 5976 /* harmony export */ "default": function() { return /* binding */ getClippingRect; } 5977 /* harmony export */ }); 5978 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 5979 /* harmony import */ var _getViewportRect_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getViewportRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js"); 5980 /* harmony import */ var _getDocumentRect_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getDocumentRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js"); 5981 /* harmony import */ var _listScrollParents_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./listScrollParents.js */ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js"); 5982 /* harmony import */ var _getOffsetParent_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); 5983 /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); 5984 /* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); 5985 /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 5986 /* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); 5987 /* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); 5988 /* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./contains.js */ "./node_modules/@popperjs/core/lib/dom-utils/contains.js"); 5989 /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); 5990 /* harmony import */ var _utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/rectToClientRect.js */ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js"); 5991 /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 function getInnerBoundingClientRect(element, strategy) { 6008 var rect = (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, false, strategy === 'fixed'); 6009 rect.top = rect.top + element.clientTop; 6010 rect.left = rect.left + element.clientLeft; 6011 rect.bottom = rect.top + element.clientHeight; 6012 rect.right = rect.left + element.clientWidth; 6013 rect.width = element.clientWidth; 6014 rect.height = element.clientHeight; 6015 rect.x = rect.left; 6016 rect.y = rect.top; 6017 return rect; 6018 } 6019 6020 function getClientRectFromMixedType(element, clippingParent, strategy) { 6021 return clippingParent === _enums_js__WEBPACK_IMPORTED_MODULE_1__.viewport ? (0,_utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_getViewportRect_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, strategy)) : (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isElement)(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : (0,_utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_getDocumentRect_js__WEBPACK_IMPORTED_MODULE_5__["default"])((0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element))); 6022 } // A "clipping parent" is an overflowable container with the characteristic of 6023// clipping (or hiding) overflowing elements with a position different from 6024// `initial` 6025 6026 6027 function getClippingParents(element) { 6028 var clippingParents = (0,_listScrollParents_js__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_getParentNode_js__WEBPACK_IMPORTED_MODULE_8__["default"])(element)); 6029 var canEscapeClipping = ['absolute', 'fixed'].indexOf((0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_9__["default"])(element).position) >= 0; 6030 var clipperElement = canEscapeClipping && (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isHTMLElement)(element) ? (0,_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element) : element; 6031 6032 if (!(0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isElement)(clipperElement)) { 6033 return []; 6034 } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 6035 6036 6037 return clippingParents.filter(function (clippingParent) { 6038 return (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isElement)(clippingParent) && (0,_contains_js__WEBPACK_IMPORTED_MODULE_11__["default"])(clippingParent, clipperElement) && (0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_12__["default"])(clippingParent) !== 'body'; 6039 }); 6040 } // Gets the maximum area that the element is visible in due to any number of 6041// clipping parents 6042 6043 6044 function getClippingRect(element, boundary, rootBoundary, strategy) { 6045 var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); 6046 var clippingParents = [].concat(mainClippingParents, [rootBoundary]); 6047 var firstClippingParent = clippingParents[0]; 6048 var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { 6049 var rect = getClientRectFromMixedType(element, clippingParent, strategy); 6050 accRect.top = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_13__.max)(rect.top, accRect.top); 6051 accRect.right = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_13__.min)(rect.right, accRect.right); 6052 accRect.bottom = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_13__.min)(rect.bottom, accRect.bottom); 6053 accRect.left = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_13__.max)(rect.left, accRect.left); 6054 return accRect; 6055 }, getClientRectFromMixedType(element, firstClippingParent, strategy)); 6056 clippingRect.width = clippingRect.right - clippingRect.left; 6057 clippingRect.height = clippingRect.bottom - clippingRect.top; 6058 clippingRect.x = clippingRect.left; 6059 clippingRect.y = clippingRect.top; 6060 return clippingRect; 6061 } 6062 6063 /***/ }), 6064 6065
vendor: 5,206 bytes, lines 6065-6145
6065/***/ "./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js": 6066 /*!***********************************************************************!*\ 6067 !*** ./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js ***! 6068 \***********************************************************************/ 6069 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6070 6071 "use strict"; 6072 __webpack_require__.r(__webpack_exports__); 6073 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6074 /* harmony export */ "default": function() { return /* binding */ getCompositeRect; } 6075 /* harmony export */ }); 6076 /* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); 6077 /* harmony import */ var _getNodeScroll_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getNodeScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js"); 6078 /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); 6079 /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 6080 /* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js"); 6081 /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); 6082 /* harmony import */ var _isScrollParent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./isScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js"); 6083 /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 function isElementScaled(element) { 6094 var rect = element.getBoundingClientRect(); 6095 var scaleX = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_0__.round)(rect.width) / element.offsetWidth || 1; 6096 var scaleY = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_0__.round)(rect.height) / element.offsetHeight || 1; 6097 return scaleX !== 1 || scaleY !== 1; 6098 } // Returns the composite rect of an element relative to its offsetParent. 6099// Composite means it takes into account transforms as well as layout. 6100 6101 6102 function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { 6103 if (isFixed === void 0) { 6104 isFixed = false; 6105 } 6106 6107 var isOffsetParentAnElement = (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(offsetParent); 6108 var offsetParentIsScaled = (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(offsetParent) && isElementScaled(offsetParent); 6109 var documentElement = (0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(offsetParent); 6110 var rect = (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_3__["default"])(elementOrVirtualElement, offsetParentIsScaled, isFixed); 6111 var scroll = { 6112 scrollLeft: 0, 6113 scrollTop: 0 6114 }; 6115 var offsets = { 6116 x: 0, 6117 y: 0 6118 }; 6119 6120 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { 6121 if ((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_4__["default"])(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 6122 (0,_isScrollParent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(documentElement)) { 6123 scroll = (0,_getNodeScroll_js__WEBPACK_IMPORTED_MODULE_6__["default"])(offsetParent); 6124 } 6125 6126 if ((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(offsetParent)) { 6127 offsets = (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_3__["default"])(offsetParent, true); 6128 offsets.x += offsetParent.clientLeft; 6129 offsets.y += offsetParent.clientTop; 6130 } else if (documentElement) { 6131 offsets.x = (0,_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_7__["default"])(documentElement); 6132 } 6133 } 6134 6135 return { 6136 x: rect.left + scroll.scrollLeft - offsets.x, 6137 y: rect.top + scroll.scrollTop - offsets.y, 6138 width: rect.width, 6139 height: rect.height 6140 }; 6141 } 6142 6143 /***/ }), 6144 6145
vendor: 1,108 bytes, lines 6145-6164
6145/***/ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js": 6146 /*!***********************************************************************!*\ 6147 !*** ./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js ***! 6148 \***********************************************************************/ 6149 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6150 6151 "use strict"; 6152 __webpack_require__.r(__webpack_exports__); 6153 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6154 /* harmony export */ "default": function() { return /* binding */ getComputedStyle; } 6155 /* harmony export */ }); 6156 /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 6157 6158 function getComputedStyle(element) { 6159 return (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element).getComputedStyle(element); 6160 } 6161 6162 /***/ }), 6163 6164
vendor: 1,311 bytes, lines 6164-6185
6164/***/ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js": 6165 /*!*************************************************************************!*\ 6166 !*** ./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js ***! 6167 \*************************************************************************/ 6168 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6169 6170 "use strict"; 6171 __webpack_require__.r(__webpack_exports__); 6172 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6173 /* harmony export */ "default": function() { return /* binding */ getDocumentElement; } 6174 /* harmony export */ }); 6175 /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 6176 6177 function getDocumentElement(element) { 6178 // $FlowFixMe[incompatible-return]: assume body is always available 6179 return (((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isElement)(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] 6180 element.document) || window.document).documentElement; 6181 } 6182 6183 /***/ }), 6184 6185
vendor: 3,325 bytes, lines 6185-6233
6185/***/ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js": 6186 /*!**********************************************************************!*\ 6187 !*** ./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js ***! 6188 \**********************************************************************/ 6189 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6190 6191 "use strict"; 6192 __webpack_require__.r(__webpack_exports__); 6193 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6194 /* harmony export */ "default": function() { return /* binding */ getDocumentRect; } 6195 /* harmony export */ }); 6196 /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); 6197 /* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); 6198 /* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js"); 6199 /* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"); 6200 /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); 6201 6202 6203 6204 6205 // Gets the entire size of the scrollable document area, even extending outside 6206// of the `<html>` and `<body>` rect bounds if horizontally scrollable 6207 6208 function getDocumentRect(element) { 6209 var _element$ownerDocumen; 6210 6211 var html = (0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 6212 var winScroll = (0,_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element); 6213 var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; 6214 var width = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_2__.max)(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); 6215 var height = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_2__.max)(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); 6216 var x = -winScroll.scrollLeft + (0,_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element); 6217 var y = -winScroll.scrollTop; 6218 6219 if ((0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__["default"])(body || html).direction === 'rtl') { 6220 x += (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_2__.max)(html.clientWidth, body ? body.clientWidth : 0) - width; 6221 } 6222 6223 return { 6224 width: width, 6225 height: height, 6226 x: x, 6227 y: y 6228 }; 6229 } 6230 6231 /***/ }), 6232 6233
vendor: 974 bytes, lines 6233-6253
6233/***/ "./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js": 6234 /*!***************************************************************************!*\ 6235 !*** ./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js ***! 6236 \***************************************************************************/ 6237 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6238 6239 "use strict"; 6240 __webpack_require__.r(__webpack_exports__); 6241 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6242 /* harmony export */ "default": function() { return /* binding */ getHTMLElementScroll; } 6243 /* harmony export */ }); 6244 function getHTMLElementScroll(element) { 6245 return { 6246 scrollLeft: element.scrollLeft, 6247 scrollTop: element.scrollTop 6248 }; 6249 } 6250 6251 /***/ }), 6252 6253
vendor: 1,957 bytes, lines 6253-6293
6253/***/ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js": 6254 /*!********************************************************************!*\ 6255 !*** ./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js ***! 6256 \********************************************************************/ 6257 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6258 6259 "use strict"; 6260 __webpack_require__.r(__webpack_exports__); 6261 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6262 /* harmony export */ "default": function() { return /* binding */ getLayoutRect; } 6263 /* harmony export */ }); 6264 /* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); 6265 // Returns the layout rect of an element relative to its offsetParent. Layout 6266// means it doesn't take into account transforms. 6267 6268 function getLayoutRect(element) { 6269 var clientRect = (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); // Use the clientRect sizes if it's not been transformed. 6270 // Fixes https://github.com/popperjs/popper-core/issues/1223 6271 6272 var width = element.offsetWidth; 6273 var height = element.offsetHeight; 6274 6275 if (Math.abs(clientRect.width - width) <= 1) { 6276 width = clientRect.width; 6277 } 6278 6279 if (Math.abs(clientRect.height - height) <= 1) { 6280 height = clientRect.height; 6281 } 6282 6283 return { 6284 x: element.offsetLeft, 6285 y: element.offsetTop, 6286 width: width, 6287 height: height 6288 }; 6289 } 6290 6291 /***/ }), 6292 6293
vendor: 855 bytes, lines 6293-6310
6293/***/ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js": 6294 /*!******************************************************************!*\ 6295 !*** ./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js ***! 6296 \******************************************************************/ 6297 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6298 6299 "use strict"; 6300 __webpack_require__.r(__webpack_exports__); 6301 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6302 /* harmony export */ "default": function() { return /* binding */ getNodeName; } 6303 /* harmony export */ }); 6304 function getNodeName(element) { 6305 return element ? (element.nodeName || '').toLowerCase() : null; 6306 } 6307 6308 /***/ }), 6309 6310
vendor: 1,994 bytes, lines 6310-6339
6310/***/ "./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js": 6311 /*!********************************************************************!*\ 6312 !*** ./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js ***! 6313 \********************************************************************/ 6314 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6315 6316 "use strict"; 6317 __webpack_require__.r(__webpack_exports__); 6318 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6319 /* harmony export */ "default": function() { return /* binding */ getNodeScroll; } 6320 /* harmony export */ }); 6321 /* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"); 6322 /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 6323 /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 6324 /* harmony import */ var _getHTMLElementScroll_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getHTMLElementScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js"); 6325 6326 6327 6328 6329 function getNodeScroll(node) { 6330 if (node === (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node) || !(0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(node)) { 6331 return (0,_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__["default"])(node); 6332 } else { 6333 return (0,_getHTMLElementScroll_js__WEBPACK_IMPORTED_MODULE_3__["default"])(node); 6334 } 6335 } 6336 6337 /***/ }), 6338 6339
vendor: 5,828 bytes, lines 6339-6429
6339/***/ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js": 6340 /*!**********************************************************************!*\ 6341 !*** ./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js ***! 6342 \**********************************************************************/ 6343 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6344 6345 "use strict"; 6346 __webpack_require__.r(__webpack_exports__); 6347 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6348 /* harmony export */ "default": function() { return /* binding */ getOffsetParent; } 6349 /* harmony export */ }); 6350 /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 6351 /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); 6352 /* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); 6353 /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 6354 /* harmony import */ var _isTableElement_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./isTableElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js"); 6355 /* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); 6356 /* harmony import */ var _utils_userAgent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/userAgent.js */ "./node_modules/@popperjs/core/lib/utils/userAgent.js"); 6357 6358 6359 6360 6361 6362 6363 6364 6365 function getTrueOffsetParent(element) { 6366 if (!(0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element) || // https://github.com/popperjs/popper-core/issues/837 6367 (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element).position === 'fixed') { 6368 return null; 6369 } 6370 6371 return element.offsetParent; 6372 } // `.offsetParent` reports `null` for fixed elements, while absolute elements 6373// return the containing block 6374 6375 6376 function getContainingBlock(element) { 6377 var isFirefox = /firefox/i.test((0,_utils_userAgent_js__WEBPACK_IMPORTED_MODULE_2__["default"])()); 6378 var isIE = /Trident/i.test((0,_utils_userAgent_js__WEBPACK_IMPORTED_MODULE_2__["default"])()); 6379 6380 if (isIE && (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element)) { 6381 // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport 6382 var elementCss = (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element); 6383 6384 if (elementCss.position === 'fixed') { 6385 return null; 6386 } 6387 } 6388 6389 var currentNode = (0,_getParentNode_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element); 6390 6391 if ((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isShadowRoot)(currentNode)) { 6392 currentNode = currentNode.host; 6393 } 6394 6395 while ((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(currentNode) && ['html', 'body'].indexOf((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_4__["default"])(currentNode)) < 0) { 6396 var css = (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(currentNode); // This is non-exhaustive but covers the most common CSS properties that 6397 // create a containing block. 6398 // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block 6399 6400 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') { 6401 return currentNode; 6402 } else { 6403 currentNode = currentNode.parentNode; 6404 } 6405 } 6406 6407 return null; 6408 } // Gets the closest ancestor positioned element. Handles some edge cases, 6409// such as table ancestors and cross browser bugs. 6410 6411 6412 function getOffsetParent(element) { 6413 var window = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element); 6414 var offsetParent = getTrueOffsetParent(element); 6415 6416 while (offsetParent && (0,_isTableElement_js__WEBPACK_IMPORTED_MODULE_6__["default"])(offsetParent) && (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(offsetParent).position === 'static') { 6417 offsetParent = getTrueOffsetParent(offsetParent); 6418 } 6419 6420 if (offsetParent && ((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_4__["default"])(offsetParent) === 'html' || (0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_4__["default"])(offsetParent) === 'body' && (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(offsetParent).position === 'static')) { 6421 return window; 6422 } 6423 6424 return offsetParent || getContainingBlock(element) || window; 6425 } 6426 6427 /***/ }), 6428 6429
vendor: 2,272 bytes, lines 6429-6465
6429/***/ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js": 6430 /*!********************************************************************!*\ 6431 !*** ./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js ***! 6432 \********************************************************************/ 6433 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6434 6435 "use strict"; 6436 __webpack_require__.r(__webpack_exports__); 6437 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6438 /* harmony export */ "default": function() { return /* binding */ getParentNode; } 6439 /* harmony export */ }); 6440 /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); 6441 /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); 6442 /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 6443 6444 6445 6446 function getParentNode(element) { 6447 if ((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element) === 'html') { 6448 return element; 6449 } 6450 6451 return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle 6452 // $FlowFixMe[incompatible-return] 6453 // $FlowFixMe[prop-missing] 6454 element.assignedSlot || // step into the shadow DOM of the parent of a slotted node 6455 element.parentNode || ( // DOM Element detected 6456 (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isShadowRoot)(element) ? element.host : null) || // ShadowRoot detected 6457 // $FlowFixMe[incompatible-call]: HTMLElement is a Node 6458 (0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element) // fallback 6459 6460 ); 6461 } 6462 6463 /***/ }), 6464 6465
vendor: 2,192 bytes, lines 6465-6499
6465/***/ "./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js": 6466 /*!**********************************************************************!*\ 6467 !*** ./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js ***! 6468 \**********************************************************************/ 6469 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6470 6471 "use strict"; 6472 __webpack_require__.r(__webpack_exports__); 6473 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6474 /* harmony export */ "default": function() { return /* binding */ getScrollParent; } 6475 /* harmony export */ }); 6476 /* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); 6477 /* harmony import */ var _isScrollParent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js"); 6478 /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); 6479 /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 6480 6481 6482 6483 6484 function getScrollParent(node) { 6485 if (['html', 'body', '#document'].indexOf((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node)) >= 0) { 6486 // $FlowFixMe[incompatible-return]: assume body is always available 6487 return node.ownerDocument.body; 6488 } 6489 6490 if ((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(node) && (0,_isScrollParent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(node)) { 6491 return node; 6492 } 6493 6494 return getScrollParent((0,_getParentNode_js__WEBPACK_IMPORTED_MODULE_3__["default"])(node)); 6495 } 6496 6497 /***/ }), 6498 6499
vendor: 2,764 bytes, lines 6499-6548
6499/***/ "./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js": 6500 /*!**********************************************************************!*\ 6501 !*** ./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js ***! 6502 \**********************************************************************/ 6503 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6504 6505 "use strict"; 6506 __webpack_require__.r(__webpack_exports__); 6507 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6508 /* harmony export */ "default": function() { return /* binding */ getViewportRect; } 6509 /* harmony export */ }); 6510 /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 6511 /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); 6512 /* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js"); 6513 /* harmony import */ var _isLayoutViewport_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isLayoutViewport.js */ "./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js"); 6514 6515 6516 6517 6518 function getViewportRect(element, strategy) { 6519 var win = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 6520 var html = (0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element); 6521 var visualViewport = win.visualViewport; 6522 var width = html.clientWidth; 6523 var height = html.clientHeight; 6524 var x = 0; 6525 var y = 0; 6526 6527 if (visualViewport) { 6528 width = visualViewport.width; 6529 height = visualViewport.height; 6530 var layoutViewport = (0,_isLayoutViewport_js__WEBPACK_IMPORTED_MODULE_2__["default"])(); 6531 6532 if (layoutViewport || !layoutViewport && strategy === 'fixed') { 6533 x = visualViewport.offsetLeft; 6534 y = visualViewport.offsetTop; 6535 } 6536 } 6537 6538 return { 6539 width: width, 6540 height: height, 6541 x: x + (0,_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element), 6542 y: y 6543 }; 6544 } 6545 6546 /***/ }), 6547 6548
vendor: 1,108 bytes, lines 6548-6574
6548/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js": 6549 /*!****************************************************************!*\ 6550 !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindow.js ***! 6551 \****************************************************************/ 6552 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6553 6554 "use strict"; 6555 __webpack_require__.r(__webpack_exports__); 6556 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6557 /* harmony export */ "default": function() { return /* binding */ getWindow; } 6558 /* harmony export */ }); 6559 function getWindow(node) { 6560 if (node == null) { 6561 return window; 6562 } 6563 6564 if (node.toString() !== '[object Window]') { 6565 var ownerDocument = node.ownerDocument; 6566 return ownerDocument ? ownerDocument.defaultView || window : window; 6567 } 6568 6569 return node; 6570 } 6571 6572 /***/ }), 6573 6574
vendor: 1,301 bytes, lines 6574-6599
6574/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js": 6575 /*!**********************************************************************!*\ 6576 !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js ***! 6577 \**********************************************************************/ 6578 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6579 6580 "use strict"; 6581 __webpack_require__.r(__webpack_exports__); 6582 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6583 /* harmony export */ "default": function() { return /* binding */ getWindowScroll; } 6584 /* harmony export */ }); 6585 /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 6586 6587 function getWindowScroll(node) { 6588 var win = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node); 6589 var scrollLeft = win.pageXOffset; 6590 var scrollTop = win.pageYOffset; 6591 return { 6592 scrollLeft: scrollLeft, 6593 scrollTop: scrollTop 6594 }; 6595 } 6596 6597 /***/ }), 6598 6599
vendor: 2,209 bytes, lines 6599-6629
6599/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js": 6600 /*!**************************************************************************!*\ 6601 !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js ***! 6602 \**************************************************************************/ 6603 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6604 6605 "use strict"; 6606 __webpack_require__.r(__webpack_exports__); 6607 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6608 /* harmony export */ "default": function() { return /* binding */ getWindowScrollBarX; } 6609 /* harmony export */ }); 6610 /* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); 6611 /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); 6612 /* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"); 6613 6614 6615 6616 function getWindowScrollBarX(element) { 6617 // If <html> has a CSS width greater than the viewport, then this will be 6618 // incorrect for RTL. 6619 // Popper 1 is broken in this case and never had a bug report so let's assume 6620 // it's not an issue. I don't think anyone ever specifies width on <html> 6621 // anyway. 6622 // Browsers where the left scrollbar doesn't cause an issue report `0` for 6623 // this (e.g. Edge 2019, IE11, Safari) 6624 return (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)).left + (0,_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element).scrollLeft; 6625 } 6626 6627 /***/ }), 6628 6629
vendor: 1,997 bytes, lines 6629-6669
6629/***/ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js": 6630 /*!*****************************************************************!*\ 6631 !*** ./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js ***! 6632 \*****************************************************************/ 6633 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6634 6635 "use strict"; 6636 __webpack_require__.r(__webpack_exports__); 6637 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6638 /* harmony export */ isElement: function() { return /* binding */ isElement; }, 6639 /* harmony export */ isHTMLElement: function() { return /* binding */ isHTMLElement; }, 6640 /* harmony export */ isShadowRoot: function() { return /* binding */ isShadowRoot; } 6641 /* harmony export */ }); 6642 /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 6643 6644 6645 function isElement(node) { 6646 var OwnElement = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).Element; 6647 return node instanceof OwnElement || node instanceof Element; 6648 } 6649 6650 function isHTMLElement(node) { 6651 var OwnElement = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).HTMLElement; 6652 return node instanceof OwnElement || node instanceof HTMLElement; 6653 } 6654 6655 function isShadowRoot(node) { 6656 // IE 11 has no ShadowRoot 6657 if (typeof ShadowRoot === 'undefined') { 6658 return false; 6659 } 6660 6661 var OwnElement = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).ShadowRoot; 6662 return node instanceof OwnElement || node instanceof ShadowRoot; 6663 } 6664 6665 6666 6667 /***/ }), 6668 6669
vendor: 1,123 bytes, lines 6669-6688
6669/***/ "./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js": 6670 /*!***********************************************************************!*\ 6671 !*** ./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js ***! 6672 \***********************************************************************/ 6673 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6674 6675 "use strict"; 6676 __webpack_require__.r(__webpack_exports__); 6677 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6678 /* harmony export */ "default": function() { return /* binding */ isLayoutViewport; } 6679 /* harmony export */ }); 6680 /* harmony import */ var _utils_userAgent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/userAgent.js */ "./node_modules/@popperjs/core/lib/utils/userAgent.js"); 6681 6682 function isLayoutViewport() { 6683 return !/^((?!chrome|android).)*safari/i.test((0,_utils_userAgent_js__WEBPACK_IMPORTED_MODULE_0__["default"])()); 6684 } 6685 6686 /***/ }), 6687 6688
vendor: 1,467 bytes, lines 6688-6713
6688/***/ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js": 6689 /*!*********************************************************************!*\ 6690 !*** ./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js ***! 6691 \*********************************************************************/ 6692 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6693 6694 "use strict"; 6695 __webpack_require__.r(__webpack_exports__); 6696 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6697 /* harmony export */ "default": function() { return /* binding */ isScrollParent; } 6698 /* harmony export */ }); 6699 /* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); 6700 6701 function isScrollParent(element) { 6702 // Firefox wants us to check `-x` and `-y` variations as well 6703 var _getComputedStyle = (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element), 6704 overflow = _getComputedStyle.overflow, 6705 overflowX = _getComputedStyle.overflowX, 6706 overflowY = _getComputedStyle.overflowY; 6707 6708 return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); 6709 } 6710 6711 /***/ }), 6712 6713
vendor: 1,114 bytes, lines 6713-6732
6713/***/ "./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js": 6714 /*!*********************************************************************!*\ 6715 !*** ./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js ***! 6716 \*********************************************************************/ 6717 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6718 6719 "use strict"; 6720 __webpack_require__.r(__webpack_exports__); 6721 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6722 /* harmony export */ "default": function() { return /* binding */ isTableElement; } 6723 /* harmony export */ }); 6724 /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); 6725 6726 function isTableElement(element) { 6727 return ['table', 'td', 'th'].indexOf((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) >= 0; 6728 } 6729 6730 /***/ }), 6731 6732
vendor: 2,897 bytes, lines 6732-6776
6732/***/ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js": 6733 /*!************************************************************************!*\ 6734 !*** ./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js ***! 6735 \************************************************************************/ 6736 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6737 6738 "use strict"; 6739 __webpack_require__.r(__webpack_exports__); 6740 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6741 /* harmony export */ "default": function() { return /* binding */ listScrollParents; } 6742 /* harmony export */ }); 6743 /* harmony import */ var _getScrollParent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js"); 6744 /* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); 6745 /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 6746 /* harmony import */ var _isScrollParent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js"); 6747 6748 6749 6750 6751 /* 6752given a DOM element, return the list of all scroll parents, up the list of ancesors 6753until we get to the top window object. This list is what we attach scroll listeners 6754to, because if any of these parent elements scroll, we'll need to re-calculate the 6755reference element's position. 6756*/ 6757 6758 function listScrollParents(element, list) { 6759 var _element$ownerDocumen; 6760 6761 if (list === void 0) { 6762 list = []; 6763 } 6764 6765 var scrollParent = (0,_getScrollParent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); 6766 var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); 6767 var win = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scrollParent); 6768 var target = isBody ? [win].concat(win.visualViewport || [], (0,_isScrollParent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(scrollParent) ? scrollParent : []) : scrollParent; 6769 var updatedList = list.concat(target); 6770 return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here 6771 updatedList.concat(listScrollParents((0,_getParentNode_js__WEBPACK_IMPORTED_MODULE_3__["default"])(target))); 6772 } 6773 6774 /***/ }), 6775 6776
vendor: 4,375 bytes, lines 6776-6844
6776/***/ "./node_modules/@popperjs/core/lib/enums.js": 6777 /*!**************************************************!*\ 6778 !*** ./node_modules/@popperjs/core/lib/enums.js ***! 6779 \**************************************************/ 6780 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6781 6782 "use strict"; 6783 __webpack_require__.r(__webpack_exports__); 6784 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6785 /* harmony export */ afterMain: function() { return /* binding */ afterMain; }, 6786 /* harmony export */ afterRead: function() { return /* binding */ afterRead; }, 6787 /* harmony export */ afterWrite: function() { return /* binding */ afterWrite; }, 6788 /* harmony export */ auto: function() { return /* binding */ auto; }, 6789 /* harmony export */ basePlacements: function() { return /* binding */ basePlacements; }, 6790 /* harmony export */ beforeMain: function() { return /* binding */ beforeMain; }, 6791 /* harmony export */ beforeRead: function() { return /* binding */ beforeRead; }, 6792 /* harmony export */ beforeWrite: function() { return /* binding */ beforeWrite; }, 6793 /* harmony export */ bottom: function() { return /* binding */ bottom; }, 6794 /* harmony export */ clippingParents: function() { return /* binding */ clippingParents; }, 6795 /* harmony export */ end: function() { return /* binding */ end; }, 6796 /* harmony export */ left: function() { return /* binding */ left; }, 6797 /* harmony export */ main: function() { return /* binding */ main; }, 6798 /* harmony export */ modifierPhases: function() { return /* binding */ modifierPhases; }, 6799 /* harmony export */ placements: function() { return /* binding */ placements; }, 6800 /* harmony export */ popper: function() { return /* binding */ popper; }, 6801 /* harmony export */ read: function() { return /* binding */ read; }, 6802 /* harmony export */ reference: function() { return /* binding */ reference; }, 6803 /* harmony export */ right: function() { return /* binding */ right; }, 6804 /* harmony export */ start: function() { return /* binding */ start; }, 6805 /* harmony export */ top: function() { return /* binding */ top; }, 6806 /* harmony export */ variationPlacements: function() { return /* binding */ variationPlacements; }, 6807 /* harmony export */ viewport: function() { return /* binding */ viewport; }, 6808 /* harmony export */ write: function() { return /* binding */ write; } 6809 /* harmony export */ }); 6810 var top = 'top'; 6811 var bottom = 'bottom'; 6812 var right = 'right'; 6813 var left = 'left'; 6814 var auto = 'auto'; 6815 var basePlacements = [top, bottom, right, left]; 6816 var start = 'start'; 6817 var end = 'end'; 6818 var clippingParents = 'clippingParents'; 6819 var viewport = 'viewport'; 6820 var popper = 'popper'; 6821 var reference = 'reference'; 6822 var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { 6823 return acc.concat([placement + "-" + start, placement + "-" + end]); 6824 }, []); 6825 var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { 6826 return acc.concat([placement, placement + "-" + start, placement + "-" + end]); 6827 }, []); // modifiers that need to read the DOM 6828 6829 var beforeRead = 'beforeRead'; 6830 var read = 'read'; 6831 var afterRead = 'afterRead'; // pure-logic modifiers 6832 6833 var beforeMain = 'beforeMain'; 6834 var main = 'main'; 6835 var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) 6836 6837 var beforeWrite = 'beforeWrite'; 6838 var write = 'write'; 6839 var afterWrite = 'afterWrite'; 6840 var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; 6841 6842 /***/ }), 6843 6844
vendor: 7,398 bytes, lines 6844-6909
6844/***/ "./node_modules/@popperjs/core/lib/index.js": 6845 /*!**************************************************!*\ 6846 !*** ./node_modules/@popperjs/core/lib/index.js ***! 6847 \**************************************************/ 6848 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6849 6850 "use strict"; 6851 __webpack_require__.r(__webpack_exports__); 6852 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 6853 /* harmony export */ afterMain: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.afterMain; }, 6854 /* harmony export */ afterRead: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.afterRead; }, 6855 /* harmony export */ afterWrite: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.afterWrite; }, 6856 /* harmony export */ applyStyles: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.applyStyles; }, 6857 /* harmony export */ arrow: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.arrow; }, 6858 /* harmony export */ auto: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.auto; }, 6859 /* harmony export */ basePlacements: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.basePlacements; }, 6860 /* harmony export */ beforeMain: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.beforeMain; }, 6861 /* harmony export */ beforeRead: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.beforeRead; }, 6862 /* harmony export */ beforeWrite: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.beforeWrite; }, 6863 /* harmony export */ bottom: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.bottom; }, 6864 /* harmony export */ clippingParents: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.clippingParents; }, 6865 /* harmony export */ computeStyles: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.computeStyles; }, 6866 /* harmony export */ createPopper: function() { return /* reexport safe */ _popper_js__WEBPACK_IMPORTED_MODULE_4__.createPopper; }, 6867 /* harmony export */ createPopperBase: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_2__.createPopper; }, 6868 /* harmony export */ createPopperLite: function() { return /* reexport safe */ _popper_lite_js__WEBPACK_IMPORTED_MODULE_5__.createPopper; }, 6869 /* harmony export */ detectOverflow: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }, 6870 /* harmony export */ end: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.end; }, 6871 /* harmony export */ eventListeners: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.eventListeners; }, 6872 /* harmony export */ flip: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.flip; }, 6873 /* harmony export */ hide: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.hide; }, 6874 /* harmony export */ left: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.left; }, 6875 /* harmony export */ main: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.main; }, 6876 /* harmony export */ modifierPhases: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.modifierPhases; }, 6877 /* harmony export */ offset: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.offset; }, 6878 /* harmony export */ placements: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.placements; }, 6879 /* harmony export */ popper: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper; }, 6880 /* harmony export */ popperGenerator: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_2__.popperGenerator; }, 6881 /* harmony export */ popperOffsets: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.popperOffsets; }, 6882 /* harmony export */ preventOverflow: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.preventOverflow; }, 6883 /* harmony export */ read: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.read; }, 6884 /* harmony export */ reference: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.reference; }, 6885 /* harmony export */ right: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.right; }, 6886 /* harmony export */ start: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.start; }, 6887 /* harmony export */ top: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.top; }, 6888 /* harmony export */ variationPlacements: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.variationPlacements; }, 6889 /* harmony export */ viewport: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.viewport; }, 6890 /* harmony export */ write: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.write; } 6891 /* harmony export */ }); 6892 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 6893 /* harmony import */ var _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifiers/index.js */ "./node_modules/@popperjs/core/lib/modifiers/index.js"); 6894 /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/createPopper.js"); 6895 /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); 6896 /* harmony import */ var _popper_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./popper.js */ "./node_modules/@popperjs/core/lib/popper.js"); 6897 /* harmony import */ var _popper_lite_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./popper-lite.js */ "./node_modules/@popperjs/core/lib/popper-lite.js"); 6898 6899 // eslint-disable-next-line import/no-unused-modules 6900 6901 // eslint-disable-next-line import/no-unused-modules 6902 6903 // eslint-disable-next-line import/no-unused-modules 6904 6905 6906 6907 /***/ }), 6908 6909
vendor: 4,719 bytes, lines 6909-7006
6909/***/ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js": 6910 /*!******************************************************************!*\ 6911 !*** ./node_modules/@popperjs/core/lib/modifiers/applyStyles.js ***! 6912 \******************************************************************/ 6913 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6914 6915 "use strict"; 6916 __webpack_require__.r(__webpack_exports__); 6917 /* harmony import */ var _dom_utils_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-utils/getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); 6918 /* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 6919 6920 // This modifier takes the styles prepared by the `computeStyles` modifier 6921// and applies them to the HTMLElements such as popper and arrow 6922 6923 function applyStyles(_ref) { 6924 var state = _ref.state; 6925 Object.keys(state.elements).forEach(function (name) { 6926 var style = state.styles[name] || {}; 6927 var attributes = state.attributes[name] || {}; 6928 var element = state.elements[name]; // arrow is optional + virtual elements 6929 6930 if (!(0,_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element) || !(0,_dom_utils_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) { 6931 return; 6932 } // Flow doesn't support to extend this property, but it's the most 6933 // effective way to apply styles to an HTMLElement 6934 // $FlowFixMe[cannot-write] 6935 6936 6937 Object.assign(element.style, style); 6938 Object.keys(attributes).forEach(function (name) { 6939 var value = attributes[name]; 6940 6941 if (value === false) { 6942 element.removeAttribute(name); 6943 } else { 6944 element.setAttribute(name, value === true ? '' : value); 6945 } 6946 }); 6947 }); 6948 } 6949 6950 function effect(_ref2) { 6951 var state = _ref2.state; 6952 var initialStyles = { 6953 popper: { 6954 position: state.options.strategy, 6955 left: '0', 6956 top: '0', 6957 margin: '0' 6958 }, 6959 arrow: { 6960 position: 'absolute' 6961 }, 6962 reference: {} 6963 }; 6964 Object.assign(state.elements.popper.style, initialStyles.popper); 6965 state.styles = initialStyles; 6966 6967 if (state.elements.arrow) { 6968 Object.assign(state.elements.arrow.style, initialStyles.arrow); 6969 } 6970 6971 return function () { 6972 Object.keys(state.elements).forEach(function (name) { 6973 var element = state.elements[name]; 6974 var attributes = state.attributes[name] || {}; 6975 var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them 6976 6977 var style = styleProperties.reduce(function (style, property) { 6978 style[property] = ''; 6979 return style; 6980 }, {}); // arrow is optional + virtual elements 6981 6982 if (!(0,_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element) || !(0,_dom_utils_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) { 6983 return; 6984 } 6985 6986 Object.assign(element.style, style); 6987 Object.keys(attributes).forEach(function (attribute) { 6988 element.removeAttribute(attribute); 6989 }); 6990 }); 6991 }; 6992 } // eslint-disable-next-line import/no-unused-modules 6993 6994 6995 /* harmony default export */ __webpack_exports__["default"] = ({ 6996 name: 'applyStyles', 6997 enabled: true, 6998 phase: 'write', 6999 fn: applyStyles, 7000 effect: effect, 7001 requires: ['computeStyles'] 7002 }); 7003 7004 /***/ }), 7005 7006
vendor: 6,924 bytes, lines 7006-7116
7006/***/ "./node_modules/@popperjs/core/lib/modifiers/arrow.js": 7007 /*!************************************************************!*\ 7008 !*** ./node_modules/@popperjs/core/lib/modifiers/arrow.js ***! 7009 \************************************************************/ 7010 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7011 7012 "use strict"; 7013 __webpack_require__.r(__webpack_exports__); 7014 /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); 7015 /* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"); 7016 /* harmony import */ var _dom_utils_contains_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../dom-utils/contains.js */ "./node_modules/@popperjs/core/lib/dom-utils/contains.js"); 7017 /* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); 7018 /* harmony import */ var _utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"); 7019 /* harmony import */ var _utils_within_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/within.js */ "./node_modules/@popperjs/core/lib/utils/within.js"); 7020 /* harmony import */ var _utils_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/mergePaddingObject.js */ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js"); 7021 /* harmony import */ var _utils_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/expandToHashMap.js */ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js"); 7022 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 7023 7024 7025 7026 7027 7028 7029 7030 7031 // eslint-disable-next-line import/no-unused-modules 7032 7033 var toPaddingObject = function toPaddingObject(padding, state) { 7034 padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { 7035 placement: state.placement 7036 })) : padding; 7037 return (0,_utils_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(typeof padding !== 'number' ? padding : (0,_utils_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_1__["default"])(padding, _enums_js__WEBPACK_IMPORTED_MODULE_2__.basePlacements)); 7038 }; 7039 7040 function arrow(_ref) { 7041 var _state$modifiersData$; 7042 7043 var state = _ref.state, 7044 name = _ref.name, 7045 options = _ref.options; 7046 var arrowElement = state.elements.arrow; 7047 var popperOffsets = state.modifiersData.popperOffsets; 7048 var basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(state.placement); 7049 var axis = (0,_utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(basePlacement); 7050 var isVertical = [_enums_js__WEBPACK_IMPORTED_MODULE_2__.left, _enums_js__WEBPACK_IMPORTED_MODULE_2__.right].indexOf(basePlacement) >= 0; 7051 var len = isVertical ? 'height' : 'width'; 7052 7053 if (!arrowElement || !popperOffsets) { 7054 return; 7055 } 7056 7057 var paddingObject = toPaddingObject(options.padding, state); 7058 var arrowRect = (0,_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_5__["default"])(arrowElement); 7059 var minProp = axis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_2__.top : _enums_js__WEBPACK_IMPORTED_MODULE_2__.left; 7060 var maxProp = axis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_2__.bottom : _enums_js__WEBPACK_IMPORTED_MODULE_2__.right; 7061 var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; 7062 var startDiff = popperOffsets[axis] - state.rects.reference[axis]; 7063 var arrowOffsetParent = (0,_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(arrowElement); 7064 var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; 7065 var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is 7066 // outside of the popper bounds 7067 7068 var min = paddingObject[minProp]; 7069 var max = clientSize - arrowRect[len] - paddingObject[maxProp]; 7070 var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; 7071 var offset = (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_7__.within)(min, center, max); // Prevents breaking syntax highlighting... 7072 7073 var axisProp = axis; 7074 state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); 7075 } 7076 7077 function effect(_ref2) { 7078 var state = _ref2.state, 7079 options = _ref2.options; 7080 var _options$element = options.element, 7081 arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; 7082 7083 if (arrowElement == null) { 7084 return; 7085 } // CSS selector 7086 7087 7088 if (typeof arrowElement === 'string') { 7089 arrowElement = state.elements.popper.querySelector(arrowElement); 7090 7091 if (!arrowElement) { 7092 return; 7093 } 7094 } 7095 7096 if (!(0,_dom_utils_contains_js__WEBPACK_IMPORTED_MODULE_8__["default"])(state.elements.popper, arrowElement)) { 7097 return; 7098 } 7099 7100 state.elements.arrow = arrowElement; 7101 } // eslint-disable-next-line import/no-unused-modules 7102 7103 7104 /* harmony default export */ __webpack_exports__["default"] = ({ 7105 name: 'arrow', 7106 enabled: true, 7107 phase: 'main', 7108 fn: arrow, 7109 effect: effect, 7110 requires: ['popperOffsets'], 7111 requiresIfExists: ['preventOverflow'] 7112 }); 7113 7114 /***/ }), 7115 7116
vendor: 10,676 bytes, lines 7116-7307
7116/***/ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js": 7117 /*!********************************************************************!*\ 7118 !*** ./node_modules/@popperjs/core/lib/modifiers/computeStyles.js ***! 7119 \********************************************************************/ 7120 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7121 7122 "use strict"; 7123 __webpack_require__.r(__webpack_exports__); 7124 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 7125 /* harmony export */ mapToStyles: function() { return /* binding */ mapToStyles; } 7126 /* harmony export */ }); 7127 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 7128 /* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); 7129 /* harmony import */ var _dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dom-utils/getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 7130 /* harmony import */ var _dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../dom-utils/getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); 7131 /* harmony import */ var _dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../dom-utils/getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); 7132 /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); 7133 /* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); 7134 /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); 7135 7136 7137 7138 7139 7140 7141 7142 // eslint-disable-next-line import/no-unused-modules 7143 7144 var unsetSides = { 7145 top: 'auto', 7146 right: 'auto', 7147 bottom: 'auto', 7148 left: 'auto' 7149 }; // Round the offsets to the nearest suitable subpixel based on the DPR. 7150// Zooming can change the DPR, but it seems to report a value that will 7151// cleanly divide the values into the appropriate subpixels. 7152 7153 function roundOffsetsByDPR(_ref, win) { 7154 var x = _ref.x, 7155 y = _ref.y; 7156 var dpr = win.devicePixelRatio || 1; 7157 return { 7158 x: (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_0__.round)(x * dpr) / dpr || 0, 7159 y: (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_0__.round)(y * dpr) / dpr || 0 7160 }; 7161 } 7162 7163 function mapToStyles(_ref2) { 7164 var _Object$assign2; 7165 7166 var popper = _ref2.popper, 7167 popperRect = _ref2.popperRect, 7168 placement = _ref2.placement, 7169 variation = _ref2.variation, 7170 offsets = _ref2.offsets, 7171 position = _ref2.position, 7172 gpuAcceleration = _ref2.gpuAcceleration, 7173 adaptive = _ref2.adaptive, 7174 roundOffsets = _ref2.roundOffsets, 7175 isFixed = _ref2.isFixed; 7176 var _offsets$x = offsets.x, 7177 x = _offsets$x === void 0 ? 0 : _offsets$x, 7178 _offsets$y = offsets.y, 7179 y = _offsets$y === void 0 ? 0 : _offsets$y; 7180 7181 var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({ 7182 x: x, 7183 y: y 7184 }) : { 7185 x: x, 7186 y: y 7187 }; 7188 7189 x = _ref3.x; 7190 y = _ref3.y; 7191 var hasX = offsets.hasOwnProperty('x'); 7192 var hasY = offsets.hasOwnProperty('y'); 7193 var sideX = _enums_js__WEBPACK_IMPORTED_MODULE_1__.left; 7194 var sideY = _enums_js__WEBPACK_IMPORTED_MODULE_1__.top; 7195 var win = window; 7196 7197 if (adaptive) { 7198 var offsetParent = (0,_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(popper); 7199 var heightProp = 'clientHeight'; 7200 var widthProp = 'clientWidth'; 7201 7202 if (offsetParent === (0,_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_3__["default"])(popper)) { 7203 offsetParent = (0,_dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(popper); 7204 7205 if ((0,_dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_5__["default"])(offsetParent).position !== 'static' && position === 'absolute') { 7206 heightProp = 'scrollHeight'; 7207 widthProp = 'scrollWidth'; 7208 } 7209 } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it 7210 7211 7212 offsetParent = offsetParent; 7213 7214 if (placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.top || (placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.left || placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.right) && variation === _enums_js__WEBPACK_IMPORTED_MODULE_1__.end) { 7215 sideY = _enums_js__WEBPACK_IMPORTED_MODULE_1__.bottom; 7216 var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing] 7217 offsetParent[heightProp]; 7218 y -= offsetY - popperRect.height; 7219 y *= gpuAcceleration ? 1 : -1; 7220 } 7221 7222 if (placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.left || (placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.top || placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.bottom) && variation === _enums_js__WEBPACK_IMPORTED_MODULE_1__.end) { 7223 sideX = _enums_js__WEBPACK_IMPORTED_MODULE_1__.right; 7224 var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing] 7225 offsetParent[widthProp]; 7226 x -= offsetX - popperRect.width; 7227 x *= gpuAcceleration ? 1 : -1; 7228 } 7229 } 7230 7231 var commonStyles = Object.assign({ 7232 position: position 7233 }, adaptive && unsetSides); 7234 7235 var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ 7236 x: x, 7237 y: y 7238 }, (0,_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_3__["default"])(popper)) : { 7239 x: x, 7240 y: y 7241 }; 7242 7243 x = _ref4.x; 7244 y = _ref4.y; 7245 7246 if (gpuAcceleration) { 7247 var _Object$assign; 7248 7249 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)); 7250 } 7251 7252 return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); 7253 } 7254 7255 function computeStyles(_ref5) { 7256 var state = _ref5.state, 7257 options = _ref5.options; 7258 var _options$gpuAccelerat = options.gpuAcceleration, 7259 gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, 7260 _options$adaptive = options.adaptive, 7261 adaptive = _options$adaptive === void 0 ? true : _options$adaptive, 7262 _options$roundOffsets = options.roundOffsets, 7263 roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; 7264 var commonStyles = { 7265 placement: (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_6__["default"])(state.placement), 7266 variation: (0,_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_7__["default"])(state.placement), 7267 popper: state.elements.popper, 7268 popperRect: state.rects.popper, 7269 gpuAcceleration: gpuAcceleration, 7270 isFixed: state.options.strategy === 'fixed' 7271 }; 7272 7273 if (state.modifiersData.popperOffsets != null) { 7274 state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { 7275 offsets: state.modifiersData.popperOffsets, 7276 position: state.options.strategy, 7277 adaptive: adaptive, 7278 roundOffsets: roundOffsets 7279 }))); 7280 } 7281 7282 if (state.modifiersData.arrow != null) { 7283 state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { 7284 offsets: state.modifiersData.arrow, 7285 position: 'absolute', 7286 adaptive: false, 7287 roundOffsets: roundOffsets 7288 }))); 7289 } 7290 7291 state.attributes.popper = Object.assign({}, state.attributes.popper, { 7292 'data-popper-placement': state.placement 7293 }); 7294 } // eslint-disable-next-line import/no-unused-modules 7295 7296 7297 /* harmony default export */ __webpack_exports__["default"] = ({ 7298 name: 'computeStyles', 7299 enabled: true, 7300 phase: 'beforeWrite', 7301 fn: computeStyles, 7302 data: {} 7303 }); 7304 7305 /***/ }), 7306 7307
vendor: 2,700 bytes, lines 7307-7368
7307/***/ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js": 7308 /*!*********************************************************************!*\ 7309 !*** ./node_modules/@popperjs/core/lib/modifiers/eventListeners.js ***! 7310 \*********************************************************************/ 7311 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7312 7313 "use strict"; 7314 __webpack_require__.r(__webpack_exports__); 7315 /* harmony import */ var _dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-utils/getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); 7316 // eslint-disable-next-line import/no-unused-modules 7317 7318 var passive = { 7319 passive: true 7320 }; 7321 7322 function effect(_ref) { 7323 var state = _ref.state, 7324 instance = _ref.instance, 7325 options = _ref.options; 7326 var _options$scroll = options.scroll, 7327 scroll = _options$scroll === void 0 ? true : _options$scroll, 7328 _options$resize = options.resize, 7329 resize = _options$resize === void 0 ? true : _options$resize; 7330 var window = (0,_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(state.elements.popper); 7331 var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); 7332 7333 if (scroll) { 7334 scrollParents.forEach(function (scrollParent) { 7335 scrollParent.addEventListener('scroll', instance.update, passive); 7336 }); 7337 } 7338 7339 if (resize) { 7340 window.addEventListener('resize', instance.update, passive); 7341 } 7342 7343 return function () { 7344 if (scroll) { 7345 scrollParents.forEach(function (scrollParent) { 7346 scrollParent.removeEventListener('scroll', instance.update, passive); 7347 }); 7348 } 7349 7350 if (resize) { 7351 window.removeEventListener('resize', instance.update, passive); 7352 } 7353 }; 7354 } // eslint-disable-next-line import/no-unused-modules 7355 7356 7357 /* harmony default export */ __webpack_exports__["default"] = ({ 7358 name: 'eventListeners', 7359 enabled: true, 7360 phase: 'write', 7361 fn: function fn() {}, 7362 effect: effect, 7363 data: {} 7364 }); 7365 7366 /***/ }), 7367 7368
vendor: 9,387 bytes, lines 7368-7533
7368/***/ "./node_modules/@popperjs/core/lib/modifiers/flip.js": 7369 /*!***********************************************************!*\ 7370 !*** ./node_modules/@popperjs/core/lib/modifiers/flip.js ***! 7371 \***********************************************************/ 7372 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7373 7374 "use strict"; 7375 __webpack_require__.r(__webpack_exports__); 7376 /* harmony import */ var _utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/getOppositePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js"); 7377 /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); 7378 /* harmony import */ var _utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getOppositeVariationPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js"); 7379 /* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); 7380 /* harmony import */ var _utils_computeAutoPlacement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/computeAutoPlacement.js */ "./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js"); 7381 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 7382 /* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); 7383 7384 7385 7386 7387 7388 7389 // eslint-disable-next-line import/no-unused-modules 7390 7391 function getExpandedFallbackPlacements(placement) { 7392 if ((0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_1__.auto) { 7393 return []; 7394 } 7395 7396 var oppositePlacement = (0,_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(placement); 7397 return [(0,_utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(placement), oppositePlacement, (0,_utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(oppositePlacement)]; 7398 } 7399 7400 function flip(_ref) { 7401 var state = _ref.state, 7402 options = _ref.options, 7403 name = _ref.name; 7404 7405 if (state.modifiersData[name]._skip) { 7406 return; 7407 } 7408 7409 var _options$mainAxis = options.mainAxis, 7410 checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, 7411 _options$altAxis = options.altAxis, 7412 checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, 7413 specifiedFallbackPlacements = options.fallbackPlacements, 7414 padding = options.padding, 7415 boundary = options.boundary, 7416 rootBoundary = options.rootBoundary, 7417 altBoundary = options.altBoundary, 7418 _options$flipVariatio = options.flipVariations, 7419 flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, 7420 allowedAutoPlacements = options.allowedAutoPlacements; 7421 var preferredPlacement = state.options.placement; 7422 var basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(preferredPlacement); 7423 var isBasePlacement = basePlacement === preferredPlacement; 7424 var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [(0,_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); 7425 var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { 7426 return acc.concat((0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_1__.auto ? (0,_utils_computeAutoPlacement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(state, { 7427 placement: placement, 7428 boundary: boundary, 7429 rootBoundary: rootBoundary, 7430 padding: padding, 7431 flipVariations: flipVariations, 7432 allowedAutoPlacements: allowedAutoPlacements 7433 }) : placement); 7434 }, []); 7435 var referenceRect = state.rects.reference; 7436 var popperRect = state.rects.popper; 7437 var checksMap = new Map(); 7438 var makeFallbackChecks = true; 7439 var firstFittingPlacement = placements[0]; 7440 7441 for (var i = 0; i < placements.length; i++) { 7442 var placement = placements[i]; 7443 7444 var _basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement); 7445 7446 var isStartVariation = (0,_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_5__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_1__.start; 7447 var isVertical = [_enums_js__WEBPACK_IMPORTED_MODULE_1__.top, _enums_js__WEBPACK_IMPORTED_MODULE_1__.bottom].indexOf(_basePlacement) >= 0; 7448 var len = isVertical ? 'width' : 'height'; 7449 var overflow = (0,_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_6__["default"])(state, { 7450 placement: placement, 7451 boundary: boundary, 7452 rootBoundary: rootBoundary, 7453 altBoundary: altBoundary, 7454 padding: padding 7455 }); 7456 var mainVariationSide = isVertical ? isStartVariation ? _enums_js__WEBPACK_IMPORTED_MODULE_1__.right : _enums_js__WEBPACK_IMPORTED_MODULE_1__.left : isStartVariation ? _enums_js__WEBPACK_IMPORTED_MODULE_1__.bottom : _enums_js__WEBPACK_IMPORTED_MODULE_1__.top; 7457 7458 if (referenceRect[len] > popperRect[len]) { 7459 mainVariationSide = (0,_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(mainVariationSide); 7460 } 7461 7462 var altVariationSide = (0,_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(mainVariationSide); 7463 var checks = []; 7464 7465 if (checkMainAxis) { 7466 checks.push(overflow[_basePlacement] <= 0); 7467 } 7468 7469 if (checkAltAxis) { 7470 checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); 7471 } 7472 7473 if (checks.every(function (check) { 7474 return check; 7475 })) { 7476 firstFittingPlacement = placement; 7477 makeFallbackChecks = false; 7478 break; 7479 } 7480 7481 checksMap.set(placement, checks); 7482 } 7483 7484 if (makeFallbackChecks) { 7485 // `2` may be desired in some cases – research later 7486 var numberOfChecks = flipVariations ? 3 : 1; 7487 7488 var _loop = function _loop(_i) { 7489 var fittingPlacement = placements.find(function (placement) { 7490 var checks = checksMap.get(placement); 7491 7492 if (checks) { 7493 return checks.slice(0, _i).every(function (check) { 7494 return check; 7495 }); 7496 } 7497 }); 7498 7499 if (fittingPlacement) { 7500 firstFittingPlacement = fittingPlacement; 7501 return "break"; 7502 } 7503 }; 7504 7505 for (var _i = numberOfChecks; _i > 0; _i--) { 7506 var _ret = _loop(_i); 7507 7508 if (_ret === "break") break; 7509 } 7510 } 7511 7512 if (state.placement !== firstFittingPlacement) { 7513 state.modifiersData[name]._skip = true; 7514 state.placement = firstFittingPlacement; 7515 state.reset = true; 7516 } 7517 } // eslint-disable-next-line import/no-unused-modules 7518 7519 7520 /* harmony default export */ __webpack_exports__["default"] = ({ 7521 name: 'flip', 7522 enabled: true, 7523 phase: 'main', 7524 fn: flip, 7525 requiresIfExists: ['offset'], 7526 data: { 7527 _skip: false 7528 } 7529 }); 7530 7531 /***/ }), 7532 7533
vendor: 3,765 bytes, lines 7533-7607
7533/***/ "./node_modules/@popperjs/core/lib/modifiers/hide.js": 7534 /*!***********************************************************!*\ 7535 !*** ./node_modules/@popperjs/core/lib/modifiers/hide.js ***! 7536 \***********************************************************/ 7537 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7538 7539 "use strict"; 7540 __webpack_require__.r(__webpack_exports__); 7541 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 7542 /* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); 7543 7544 7545 7546 function getSideOffsets(overflow, rect, preventedOffsets) { 7547 if (preventedOffsets === void 0) { 7548 preventedOffsets = { 7549 x: 0, 7550 y: 0 7551 }; 7552 } 7553 7554 return { 7555 top: overflow.top - rect.height - preventedOffsets.y, 7556 right: overflow.right - rect.width + preventedOffsets.x, 7557 bottom: overflow.bottom - rect.height + preventedOffsets.y, 7558 left: overflow.left - rect.width - preventedOffsets.x 7559 }; 7560 } 7561 7562 function isAnySideFullyClipped(overflow) { 7563 return [_enums_js__WEBPACK_IMPORTED_MODULE_0__.top, _enums_js__WEBPACK_IMPORTED_MODULE_0__.right, _enums_js__WEBPACK_IMPORTED_MODULE_0__.bottom, _enums_js__WEBPACK_IMPORTED_MODULE_0__.left].some(function (side) { 7564 return overflow[side] >= 0; 7565 }); 7566 } 7567 7568 function hide(_ref) { 7569 var state = _ref.state, 7570 name = _ref.name; 7571 var referenceRect = state.rects.reference; 7572 var popperRect = state.rects.popper; 7573 var preventedOffsets = state.modifiersData.preventOverflow; 7574 var referenceOverflow = (0,_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state, { 7575 elementContext: 'reference' 7576 }); 7577 var popperAltOverflow = (0,_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state, { 7578 altBoundary: true 7579 }); 7580 var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); 7581 var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); 7582 var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); 7583 var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); 7584 state.modifiersData[name] = { 7585 referenceClippingOffsets: referenceClippingOffsets, 7586 popperEscapeOffsets: popperEscapeOffsets, 7587 isReferenceHidden: isReferenceHidden, 7588 hasPopperEscaped: hasPopperEscaped 7589 }; 7590 state.attributes.popper = Object.assign({}, state.attributes.popper, { 7591 'data-popper-reference-hidden': isReferenceHidden, 7592 'data-popper-escaped': hasPopperEscaped 7593 }); 7594 } // eslint-disable-next-line import/no-unused-modules 7595 7596 7597 /* harmony default export */ __webpack_exports__["default"] = ({ 7598 name: 'hide', 7599 enabled: true, 7600 phase: 'main', 7601 requiresIfExists: ['preventOverflow'], 7602 fn: hide 7603 }); 7604 7605 /***/ }), 7606 7607
vendor: 3,619 bytes, lines 7607-7647
7607/***/ "./node_modules/@popperjs/core/lib/modifiers/index.js": 7608 /*!************************************************************!*\ 7609 !*** ./node_modules/@popperjs/core/lib/modifiers/index.js ***! 7610 \************************************************************/ 7611 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7612 7613 "use strict"; 7614 __webpack_require__.r(__webpack_exports__); 7615 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 7616 /* harmony export */ applyStyles: function() { return /* reexport safe */ _applyStyles_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }, 7617 /* harmony export */ arrow: function() { return /* reexport safe */ _arrow_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }, 7618 /* harmony export */ computeStyles: function() { return /* reexport safe */ _computeStyles_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }, 7619 /* harmony export */ eventListeners: function() { return /* reexport safe */ _eventListeners_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }, 7620 /* harmony export */ flip: function() { return /* reexport safe */ _flip_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }, 7621 /* harmony export */ hide: function() { return /* reexport safe */ _hide_js__WEBPACK_IMPORTED_MODULE_5__["default"]; }, 7622 /* harmony export */ offset: function() { return /* reexport safe */ _offset_js__WEBPACK_IMPORTED_MODULE_6__["default"]; }, 7623 /* harmony export */ popperOffsets: function() { return /* reexport safe */ _popperOffsets_js__WEBPACK_IMPORTED_MODULE_7__["default"]; }, 7624 /* harmony export */ preventOverflow: function() { return /* reexport safe */ _preventOverflow_js__WEBPACK_IMPORTED_MODULE_8__["default"]; } 7625 /* harmony export */ }); 7626 /* harmony import */ var _applyStyles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./applyStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js"); 7627 /* harmony import */ var _arrow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./arrow.js */ "./node_modules/@popperjs/core/lib/modifiers/arrow.js"); 7628 /* harmony import */ var _computeStyles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./computeStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js"); 7629 /* harmony import */ var _eventListeners_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./eventListeners.js */ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js"); 7630 /* harmony import */ var _flip_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./flip.js */ "./node_modules/@popperjs/core/lib/modifiers/flip.js"); 7631 /* harmony import */ var _hide_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hide.js */ "./node_modules/@popperjs/core/lib/modifiers/hide.js"); 7632 /* harmony import */ var _offset_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./offset.js */ "./node_modules/@popperjs/core/lib/modifiers/offset.js"); 7633 /* harmony import */ var _popperOffsets_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./popperOffsets.js */ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js"); 7634 /* harmony import */ var _preventOverflow_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./preventOverflow.js */ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js"); 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 /***/ }), 7646 7647
vendor: 3,529 bytes, lines 7647-7717
7647/***/ "./node_modules/@popperjs/core/lib/modifiers/offset.js": 7648 /*!*************************************************************!*\ 7649 !*** ./node_modules/@popperjs/core/lib/modifiers/offset.js ***! 7650 \*************************************************************/ 7651 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7652 7653 "use strict"; 7654 __webpack_require__.r(__webpack_exports__); 7655 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 7656 /* harmony export */ distanceAndSkiddingToXY: function() { return /* binding */ distanceAndSkiddingToXY; } 7657 /* harmony export */ }); 7658 /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); 7659 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 7660 7661 // eslint-disable-next-line import/no-unused-modules 7662 7663 function distanceAndSkiddingToXY(placement, rects, offset) { 7664 var basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement); 7665 var invertDistance = [_enums_js__WEBPACK_IMPORTED_MODULE_1__.left, _enums_js__WEBPACK_IMPORTED_MODULE_1__.top].indexOf(basePlacement) >= 0 ? -1 : 1; 7666 7667 var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { 7668 placement: placement 7669 })) : offset, 7670 skidding = _ref[0], 7671 distance = _ref[1]; 7672 7673 skidding = skidding || 0; 7674 distance = (distance || 0) * invertDistance; 7675 return [_enums_js__WEBPACK_IMPORTED_MODULE_1__.left, _enums_js__WEBPACK_IMPORTED_MODULE_1__.right].indexOf(basePlacement) >= 0 ? { 7676 x: distance, 7677 y: skidding 7678 } : { 7679 x: skidding, 7680 y: distance 7681 }; 7682 } 7683 7684 function offset(_ref2) { 7685 var state = _ref2.state, 7686 options = _ref2.options, 7687 name = _ref2.name; 7688 var _options$offset = options.offset, 7689 offset = _options$offset === void 0 ? [0, 0] : _options$offset; 7690 var data = _enums_js__WEBPACK_IMPORTED_MODULE_1__.placements.reduce(function (acc, placement) { 7691 acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); 7692 return acc; 7693 }, {}); 7694 var _data$state$placement = data[state.placement], 7695 x = _data$state$placement.x, 7696 y = _data$state$placement.y; 7697 7698 if (state.modifiersData.popperOffsets != null) { 7699 state.modifiersData.popperOffsets.x += x; 7700 state.modifiersData.popperOffsets.y += y; 7701 } 7702 7703 state.modifiersData[name] = data; 7704 } // eslint-disable-next-line import/no-unused-modules 7705 7706 7707 /* harmony default export */ __webpack_exports__["default"] = ({ 7708 name: 'offset', 7709 enabled: true, 7710 phase: 'main', 7711 requires: ['popperOffsets'], 7712 fn: offset 7713 }); 7714 7715 /***/ }), 7716 7717
vendor: 1,764 bytes, lines 7717-7754
7717/***/ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js": 7718 /*!********************************************************************!*\ 7719 !*** ./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js ***! 7720 \********************************************************************/ 7721 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7722 7723 "use strict"; 7724 __webpack_require__.r(__webpack_exports__); 7725 /* harmony import */ var _utils_computeOffsets_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/computeOffsets.js */ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js"); 7726 7727 7728 function popperOffsets(_ref) { 7729 var state = _ref.state, 7730 name = _ref.name; 7731 // Offsets are the actual position the popper needs to have to be 7732 // properly positioned near its reference element 7733 // This is the most basic placement, and will be adjusted by 7734 // the modifiers in the next step 7735 state.modifiersData[name] = (0,_utils_computeOffsets_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ 7736 reference: state.rects.reference, 7737 element: state.rects.popper, 7738 strategy: 'absolute', 7739 placement: state.placement 7740 }); 7741 } // eslint-disable-next-line import/no-unused-modules 7742 7743 7744 /* harmony default export */ __webpack_exports__["default"] = ({ 7745 name: 'popperOffsets', 7746 enabled: true, 7747 phase: 'read', 7748 fn: popperOffsets, 7749 data: {} 7750 }); 7751 7752 /***/ }), 7753 7754
vendor: 11,581 bytes, lines 7754-7918
7754/***/ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js": 7755 /*!**********************************************************************!*\ 7756 !*** ./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js ***! 7757 \**********************************************************************/ 7758 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7759 7760 "use strict"; 7761 __webpack_require__.r(__webpack_exports__); 7762 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 7763 /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); 7764 /* harmony import */ var _utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"); 7765 /* harmony import */ var _utils_getAltAxis_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/getAltAxis.js */ "./node_modules/@popperjs/core/lib/utils/getAltAxis.js"); 7766 /* harmony import */ var _utils_within_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/within.js */ "./node_modules/@popperjs/core/lib/utils/within.js"); 7767 /* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"); 7768 /* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); 7769 /* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); 7770 /* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); 7771 /* harmony import */ var _utils_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/getFreshSideObject.js */ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js"); 7772 /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 function preventOverflow(_ref) { 7786 var state = _ref.state, 7787 options = _ref.options, 7788 name = _ref.name; 7789 var _options$mainAxis = options.mainAxis, 7790 checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, 7791 _options$altAxis = options.altAxis, 7792 checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, 7793 boundary = options.boundary, 7794 rootBoundary = options.rootBoundary, 7795 altBoundary = options.altBoundary, 7796 padding = options.padding, 7797 _options$tether = options.tether, 7798 tether = _options$tether === void 0 ? true : _options$tether, 7799 _options$tetherOffset = options.tetherOffset, 7800 tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; 7801 var overflow = (0,_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(state, { 7802 boundary: boundary, 7803 rootBoundary: rootBoundary, 7804 padding: padding, 7805 altBoundary: altBoundary 7806 }); 7807 var basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state.placement); 7808 var variation = (0,_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state.placement); 7809 var isBasePlacement = !variation; 7810 var mainAxis = (0,_utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(basePlacement); 7811 var altAxis = (0,_utils_getAltAxis_js__WEBPACK_IMPORTED_MODULE_4__["default"])(mainAxis); 7812 var popperOffsets = state.modifiersData.popperOffsets; 7813 var referenceRect = state.rects.reference; 7814 var popperRect = state.rects.popper; 7815 var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { 7816 placement: state.placement 7817 })) : tetherOffset; 7818 var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? { 7819 mainAxis: tetherOffsetValue, 7820 altAxis: tetherOffsetValue 7821 } : Object.assign({ 7822 mainAxis: 0, 7823 altAxis: 0 7824 }, tetherOffsetValue); 7825 var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; 7826 var data = { 7827 x: 0, 7828 y: 0 7829 }; 7830 7831 if (!popperOffsets) { 7832 return; 7833 } 7834 7835 if (checkMainAxis) { 7836 var _offsetModifierState$; 7837 7838 var mainSide = mainAxis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_5__.top : _enums_js__WEBPACK_IMPORTED_MODULE_5__.left; 7839 var altSide = mainAxis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_5__.bottom : _enums_js__WEBPACK_IMPORTED_MODULE_5__.right; 7840 var len = mainAxis === 'y' ? 'height' : 'width'; 7841 var offset = popperOffsets[mainAxis]; 7842 var min = offset + overflow[mainSide]; 7843 var max = offset - overflow[altSide]; 7844 var additive = tether ? -popperRect[len] / 2 : 0; 7845 var minLen = variation === _enums_js__WEBPACK_IMPORTED_MODULE_5__.start ? referenceRect[len] : popperRect[len]; 7846 var maxLen = variation === _enums_js__WEBPACK_IMPORTED_MODULE_5__.start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go 7847 // outside the reference bounds 7848 7849 var arrowElement = state.elements.arrow; 7850 var arrowRect = tether && arrowElement ? (0,_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_6__["default"])(arrowElement) : { 7851 width: 0, 7852 height: 0 7853 }; 7854 var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : (0,_utils_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_7__["default"])(); 7855 var arrowPaddingMin = arrowPaddingObject[mainSide]; 7856 var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want 7857 // to include its full size in the calculation. If the reference is small 7858 // and near the edge of a boundary, the popper can overflow even if the 7859 // reference is not overflowing as well (e.g. virtual elements with no 7860 // width or height) 7861 7862 var arrowLen = (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_8__.within)(0, referenceRect[len], arrowRect[len]); 7863 var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; 7864 var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; 7865 var arrowOffsetParent = state.elements.arrow && (0,_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_9__["default"])(state.elements.arrow); 7866 var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; 7867 var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; 7868 var tetherMin = offset + minOffset - offsetModifierValue - clientOffset; 7869 var tetherMax = offset + maxOffset - offsetModifierValue; 7870 var preventedOffset = (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_8__.within)(tether ? (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_10__.min)(min, tetherMin) : min, offset, tether ? (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_10__.max)(max, tetherMax) : max); 7871 popperOffsets[mainAxis] = preventedOffset; 7872 data[mainAxis] = preventedOffset - offset; 7873 } 7874 7875 if (checkAltAxis) { 7876 var _offsetModifierState$2; 7877 7878 var _mainSide = mainAxis === 'x' ? _enums_js__WEBPACK_IMPORTED_MODULE_5__.top : _enums_js__WEBPACK_IMPORTED_MODULE_5__.left; 7879 7880 var _altSide = mainAxis === 'x' ? _enums_js__WEBPACK_IMPORTED_MODULE_5__.bottom : _enums_js__WEBPACK_IMPORTED_MODULE_5__.right; 7881 7882 var _offset = popperOffsets[altAxis]; 7883 7884 var _len = altAxis === 'y' ? 'height' : 'width'; 7885 7886 var _min = _offset + overflow[_mainSide]; 7887 7888 var _max = _offset - overflow[_altSide]; 7889 7890 var isOriginSide = [_enums_js__WEBPACK_IMPORTED_MODULE_5__.top, _enums_js__WEBPACK_IMPORTED_MODULE_5__.left].indexOf(basePlacement) !== -1; 7891 7892 var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; 7893 7894 var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; 7895 7896 var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; 7897 7898 var _preventedOffset = tether && isOriginSide ? (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_8__.withinMaxClamp)(_tetherMin, _offset, _tetherMax) : (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_8__.within)(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); 7899 7900 popperOffsets[altAxis] = _preventedOffset; 7901 data[altAxis] = _preventedOffset - _offset; 7902 } 7903 7904 state.modifiersData[name] = data; 7905 } // eslint-disable-next-line import/no-unused-modules 7906 7907 7908 /* harmony default export */ __webpack_exports__["default"] = ({ 7909 name: 'preventOverflow', 7910 enabled: true, 7911 phase: 'main', 7912 fn: preventOverflow, 7913 requiresIfExists: ['offset'] 7914 }); 7915 7916 /***/ }), 7917 7918
vendor: 2,903 bytes, lines 7918-7952
7918/***/ "./node_modules/@popperjs/core/lib/popper-lite.js": 7919 /*!********************************************************!*\ 7920 !*** ./node_modules/@popperjs/core/lib/popper-lite.js ***! 7921 \********************************************************/ 7922 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7923 7924 "use strict"; 7925 __webpack_require__.r(__webpack_exports__); 7926 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 7927 /* harmony export */ createPopper: function() { return /* binding */ createPopper; }, 7928 /* harmony export */ defaultModifiers: function() { return /* binding */ defaultModifiers; }, 7929 /* harmony export */ detectOverflow: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_5__["default"]; }, 7930 /* harmony export */ popperGenerator: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_4__.popperGenerator; } 7931 /* harmony export */ }); 7932 /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/createPopper.js"); 7933 /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); 7934 /* harmony import */ var _modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modifiers/eventListeners.js */ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js"); 7935 /* harmony import */ var _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifiers/popperOffsets.js */ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js"); 7936 /* harmony import */ var _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifiers/computeStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js"); 7937 /* harmony import */ var _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modifiers/applyStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js"); 7938 7939 7940 7941 7942 7943 var defaultModifiers = [_modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_0__["default"], _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_1__["default"], _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_2__["default"], _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_3__["default"]]; 7944 var createPopper = /*#__PURE__*/(0,_createPopper_js__WEBPACK_IMPORTED_MODULE_4__.popperGenerator)({ 7945 defaultModifiers: defaultModifiers 7946 }); // eslint-disable-next-line import/no-unused-modules 7947 7948 7949 7950 /***/ }), 7951 7952
vendor: 6,258 bytes, lines 7952-8012
7952/***/ "./node_modules/@popperjs/core/lib/popper.js": 7953 /*!***************************************************!*\ 7954 !*** ./node_modules/@popperjs/core/lib/popper.js ***! 7955 \***************************************************/ 7956 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7957 7958 "use strict"; 7959 __webpack_require__.r(__webpack_exports__); 7960 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 7961 /* harmony export */ applyStyles: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.applyStyles; }, 7962 /* harmony export */ arrow: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.arrow; }, 7963 /* harmony export */ computeStyles: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.computeStyles; }, 7964 /* harmony export */ createPopper: function() { return /* binding */ createPopper; }, 7965 /* harmony export */ createPopperLite: function() { return /* reexport safe */ _popper_lite_js__WEBPACK_IMPORTED_MODULE_11__.createPopper; }, 7966 /* harmony export */ defaultModifiers: function() { return /* binding */ defaultModifiers; }, 7967 /* harmony export */ detectOverflow: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_10__["default"]; }, 7968 /* harmony export */ eventListeners: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.eventListeners; }, 7969 /* harmony export */ flip: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.flip; }, 7970 /* harmony export */ hide: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.hide; }, 7971 /* harmony export */ offset: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.offset; }, 7972 /* harmony export */ popperGenerator: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_9__.popperGenerator; }, 7973 /* harmony export */ popperOffsets: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.popperOffsets; }, 7974 /* harmony export */ preventOverflow: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.preventOverflow; } 7975 /* harmony export */ }); 7976 /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/createPopper.js"); 7977 /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); 7978 /* harmony import */ var _modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modifiers/eventListeners.js */ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js"); 7979 /* harmony import */ var _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifiers/popperOffsets.js */ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js"); 7980 /* harmony import */ var _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifiers/computeStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js"); 7981 /* harmony import */ var _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modifiers/applyStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js"); 7982 /* harmony import */ var _modifiers_offset_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modifiers/offset.js */ "./node_modules/@popperjs/core/lib/modifiers/offset.js"); 7983 /* harmony import */ var _modifiers_flip_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modifiers/flip.js */ "./node_modules/@popperjs/core/lib/modifiers/flip.js"); 7984 /* harmony import */ var _modifiers_preventOverflow_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modifiers/preventOverflow.js */ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js"); 7985 /* harmony import */ var _modifiers_arrow_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modifiers/arrow.js */ "./node_modules/@popperjs/core/lib/modifiers/arrow.js"); 7986 /* harmony import */ var _modifiers_hide_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modifiers/hide.js */ "./node_modules/@popperjs/core/lib/modifiers/hide.js"); 7987 /* harmony import */ var _popper_lite_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./popper-lite.js */ "./node_modules/@popperjs/core/lib/popper-lite.js"); 7988 /* harmony import */ var _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modifiers/index.js */ "./node_modules/@popperjs/core/lib/modifiers/index.js"); 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 var defaultModifiers = [_modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_0__["default"], _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_1__["default"], _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_2__["default"], _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_3__["default"], _modifiers_offset_js__WEBPACK_IMPORTED_MODULE_4__["default"], _modifiers_flip_js__WEBPACK_IMPORTED_MODULE_5__["default"], _modifiers_preventOverflow_js__WEBPACK_IMPORTED_MODULE_6__["default"], _modifiers_arrow_js__WEBPACK_IMPORTED_MODULE_7__["default"], _modifiers_hide_js__WEBPACK_IMPORTED_MODULE_8__["default"]]; 8000 var createPopper = /*#__PURE__*/(0,_createPopper_js__WEBPACK_IMPORTED_MODULE_9__.popperGenerator)({ 8001 defaultModifiers: defaultModifiers 8002 }); // eslint-disable-next-line import/no-unused-modules 8003 8004 // eslint-disable-next-line import/no-unused-modules 8005 8006 // eslint-disable-next-line import/no-unused-modules 8007 8008 8009 8010 /***/ }), 8011 8012
vendor: 3,786 bytes, lines 8012-8073
8012/***/ "./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js": 8013 /*!***********************************************************************!*\ 8014 !*** ./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js ***! 8015 \***********************************************************************/ 8016 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8017 8018 "use strict"; 8019 __webpack_require__.r(__webpack_exports__); 8020 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8021 /* harmony export */ "default": function() { return /* binding */ computeAutoPlacement; } 8022 /* harmony export */ }); 8023 /* harmony import */ var _getVariation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); 8024 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 8025 /* harmony import */ var _detectOverflow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); 8026 /* harmony import */ var _getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); 8027 8028 8029 8030 8031 function computeAutoPlacement(state, options) { 8032 if (options === void 0) { 8033 options = {}; 8034 } 8035 8036 var _options = options, 8037 placement = _options.placement, 8038 boundary = _options.boundary, 8039 rootBoundary = _options.rootBoundary, 8040 padding = _options.padding, 8041 flipVariations = _options.flipVariations, 8042 _options$allowedAutoP = _options.allowedAutoPlacements, 8043 allowedAutoPlacements = _options$allowedAutoP === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.placements : _options$allowedAutoP; 8044 var variation = (0,_getVariation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement); 8045 var placements = variation ? flipVariations ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.variationPlacements : _enums_js__WEBPACK_IMPORTED_MODULE_0__.variationPlacements.filter(function (placement) { 8046 return (0,_getVariation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) === variation; 8047 }) : _enums_js__WEBPACK_IMPORTED_MODULE_0__.basePlacements; 8048 var allowedPlacements = placements.filter(function (placement) { 8049 return allowedAutoPlacements.indexOf(placement) >= 0; 8050 }); 8051 8052 if (allowedPlacements.length === 0) { 8053 allowedPlacements = placements; 8054 } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... 8055 8056 8057 var overflows = allowedPlacements.reduce(function (acc, placement) { 8058 acc[placement] = (0,_detectOverflow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state, { 8059 placement: placement, 8060 boundary: boundary, 8061 rootBoundary: rootBoundary, 8062 padding: padding 8063 })[(0,_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(placement)]; 8064 return acc; 8065 }, {}); 8066 return Object.keys(overflows).sort(function (a, b) { 8067 return overflows[a] - overflows[b]; 8068 }); 8069 } 8070 8071 /***/ }), 8072 8073
vendor: 4,300 bytes, lines 8073-8161
8073/***/ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js": 8074 /*!*****************************************************************!*\ 8075 !*** ./node_modules/@popperjs/core/lib/utils/computeOffsets.js ***! 8076 \*****************************************************************/ 8077 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8078 8079 "use strict"; 8080 __webpack_require__.r(__webpack_exports__); 8081 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8082 /* harmony export */ "default": function() { return /* binding */ computeOffsets; } 8083 /* harmony export */ }); 8084 /* harmony import */ var _getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); 8085 /* harmony import */ var _getVariation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); 8086 /* harmony import */ var _getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"); 8087 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 8088 8089 8090 8091 8092 function computeOffsets(_ref) { 8093 var reference = _ref.reference, 8094 element = _ref.element, 8095 placement = _ref.placement; 8096 var basePlacement = placement ? (0,_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) : null; 8097 var variation = placement ? (0,_getVariation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) : null; 8098 var commonX = reference.x + reference.width / 2 - element.width / 2; 8099 var commonY = reference.y + reference.height / 2 - element.height / 2; 8100 var offsets; 8101 8102 switch (basePlacement) { 8103 case _enums_js__WEBPACK_IMPORTED_MODULE_2__.top: 8104 offsets = { 8105 x: commonX, 8106 y: reference.y - element.height 8107 }; 8108 break; 8109 8110 case _enums_js__WEBPACK_IMPORTED_MODULE_2__.bottom: 8111 offsets = { 8112 x: commonX, 8113 y: reference.y + reference.height 8114 }; 8115 break; 8116 8117 case _enums_js__WEBPACK_IMPORTED_MODULE_2__.right: 8118 offsets = { 8119 x: reference.x + reference.width, 8120 y: commonY 8121 }; 8122 break; 8123 8124 case _enums_js__WEBPACK_IMPORTED_MODULE_2__.left: 8125 offsets = { 8126 x: reference.x - element.width, 8127 y: commonY 8128 }; 8129 break; 8130 8131 default: 8132 offsets = { 8133 x: reference.x, 8134 y: reference.y 8135 }; 8136 } 8137 8138 var mainAxis = basePlacement ? (0,_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(basePlacement) : null; 8139 8140 if (mainAxis != null) { 8141 var len = mainAxis === 'y' ? 'height' : 'width'; 8142 8143 switch (variation) { 8144 case _enums_js__WEBPACK_IMPORTED_MODULE_2__.start: 8145 offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); 8146 break; 8147 8148 case _enums_js__WEBPACK_IMPORTED_MODULE_2__.end: 8149 offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); 8150 break; 8151 8152 default: 8153 } 8154 } 8155 8156 return offsets; 8157 } 8158 8159 /***/ }), 8160 8161
vendor: 1,208 bytes, lines 8161-8190
8161/***/ "./node_modules/@popperjs/core/lib/utils/debounce.js": 8162 /*!***********************************************************!*\ 8163 !*** ./node_modules/@popperjs/core/lib/utils/debounce.js ***! 8164 \***********************************************************/ 8165 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8166 8167 "use strict"; 8168 __webpack_require__.r(__webpack_exports__); 8169 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8170 /* harmony export */ "default": function() { return /* binding */ debounce; } 8171 /* harmony export */ }); 8172 function debounce(fn) { 8173 var pending; 8174 return function () { 8175 if (!pending) { 8176 pending = new Promise(function (resolve) { 8177 Promise.resolve().then(function () { 8178 pending = undefined; 8179 resolve(fn()); 8180 }); 8181 }); 8182 } 8183 8184 return pending; 8185 }; 8186 } 8187 8188 /***/ }), 8189 8190
vendor: 7,215 bytes, lines 8190-8278
8190/***/ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js": 8191 /*!*****************************************************************!*\ 8192 !*** ./node_modules/@popperjs/core/lib/utils/detectOverflow.js ***! 8193 \*****************************************************************/ 8194 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8195 8196 "use strict"; 8197 __webpack_require__.r(__webpack_exports__); 8198 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8199 /* harmony export */ "default": function() { return /* binding */ detectOverflow; } 8200 /* harmony export */ }); 8201 /* harmony import */ var _dom_utils_getClippingRect_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dom-utils/getClippingRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js"); 8202 /* harmony import */ var _dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../dom-utils/getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); 8203 /* harmony import */ var _dom_utils_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); 8204 /* harmony import */ var _computeOffsets_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./computeOffsets.js */ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js"); 8205 /* harmony import */ var _rectToClientRect_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./rectToClientRect.js */ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js"); 8206 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 8207 /* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); 8208 /* harmony import */ var _mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mergePaddingObject.js */ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js"); 8209 /* harmony import */ var _expandToHashMap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./expandToHashMap.js */ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js"); 8210 8211 8212 8213 8214 8215 8216 8217 8218 // eslint-disable-next-line import/no-unused-modules 8219 8220 function detectOverflow(state, options) { 8221 if (options === void 0) { 8222 options = {}; 8223 } 8224 8225 var _options = options, 8226 _options$placement = _options.placement, 8227 placement = _options$placement === void 0 ? state.placement : _options$placement, 8228 _options$strategy = _options.strategy, 8229 strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, 8230 _options$boundary = _options.boundary, 8231 boundary = _options$boundary === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.clippingParents : _options$boundary, 8232 _options$rootBoundary = _options.rootBoundary, 8233 rootBoundary = _options$rootBoundary === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.viewport : _options$rootBoundary, 8234 _options$elementConte = _options.elementContext, 8235 elementContext = _options$elementConte === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper : _options$elementConte, 8236 _options$altBoundary = _options.altBoundary, 8237 altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, 8238 _options$padding = _options.padding, 8239 padding = _options$padding === void 0 ? 0 : _options$padding; 8240 var paddingObject = (0,_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(typeof padding !== 'number' ? padding : (0,_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_2__["default"])(padding, _enums_js__WEBPACK_IMPORTED_MODULE_0__.basePlacements)); 8241 var altContext = elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.reference : _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper; 8242 var popperRect = state.rects.popper; 8243 var element = state.elements[altBoundary ? altContext : elementContext]; 8244 var clippingClientRect = (0,_dom_utils_getClippingRect_js__WEBPACK_IMPORTED_MODULE_3__["default"])((0,_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isElement)(element) ? element : element.contextElement || (0,_dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(state.elements.popper), boundary, rootBoundary, strategy); 8245 var referenceClientRect = (0,_dom_utils_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_6__["default"])(state.elements.reference); 8246 var popperOffsets = (0,_computeOffsets_js__WEBPACK_IMPORTED_MODULE_7__["default"])({ 8247 reference: referenceClientRect, 8248 element: popperRect, 8249 strategy: 'absolute', 8250 placement: placement 8251 }); 8252 var popperClientRect = (0,_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_8__["default"])(Object.assign({}, popperRect, popperOffsets)); 8253 var elementClientRect = elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect 8254 // 0 or negative = within the clipping rect 8255 8256 var overflowOffsets = { 8257 top: clippingClientRect.top - elementClientRect.top + paddingObject.top, 8258 bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, 8259 left: clippingClientRect.left - elementClientRect.left + paddingObject.left, 8260 right: elementClientRect.right - clippingClientRect.right + paddingObject.right 8261 }; 8262 var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element 8263 8264 if (elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper && offsetData) { 8265 var offset = offsetData[placement]; 8266 Object.keys(overflowOffsets).forEach(function (key) { 8267 var multiply = [_enums_js__WEBPACK_IMPORTED_MODULE_0__.right, _enums_js__WEBPACK_IMPORTED_MODULE_0__.bottom].indexOf(key) >= 0 ? 1 : -1; 8268 var axis = [_enums_js__WEBPACK_IMPORTED_MODULE_0__.top, _enums_js__WEBPACK_IMPORTED_MODULE_0__.bottom].indexOf(key) >= 0 ? 'y' : 'x'; 8269 overflowOffsets[key] += offset[axis] * multiply; 8270 }); 8271 } 8272 8273 return overflowOffsets; 8274 } 8275 8276 /***/ }), 8277 8278
vendor: 950 bytes, lines 8278-8298
8278/***/ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js": 8279 /*!******************************************************************!*\ 8280 !*** ./node_modules/@popperjs/core/lib/utils/expandToHashMap.js ***! 8281 \******************************************************************/ 8282 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8283 8284 "use strict"; 8285 __webpack_require__.r(__webpack_exports__); 8286 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8287 /* harmony export */ "default": function() { return /* binding */ expandToHashMap; } 8288 /* harmony export */ }); 8289 function expandToHashMap(value, keys) { 8290 return keys.reduce(function (hashMap, key) { 8291 hashMap[key] = value; 8292 return hashMap; 8293 }, {}); 8294 } 8295 8296 /***/ }), 8297 8298
vendor: 799 bytes, lines 8298-8315
8298/***/ "./node_modules/@popperjs/core/lib/utils/getAltAxis.js": 8299 /*!*************************************************************!*\ 8300 !*** ./node_modules/@popperjs/core/lib/utils/getAltAxis.js ***! 8301 \*************************************************************/ 8302 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8303 8304 "use strict"; 8305 __webpack_require__.r(__webpack_exports__); 8306 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8307 /* harmony export */ "default": function() { return /* binding */ getAltAxis; } 8308 /* harmony export */ }); 8309 function getAltAxis(axis) { 8310 return axis === 'x' ? 'y' : 'x'; 8311 } 8312 8313 /***/ }), 8314 8315
vendor: 840 bytes, lines 8315-8333
8315/***/ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js": 8316 /*!*******************************************************************!*\ 8317 !*** ./node_modules/@popperjs/core/lib/utils/getBasePlacement.js ***! 8318 \*******************************************************************/ 8319 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8320 8321 "use strict"; 8322 __webpack_require__.r(__webpack_exports__); 8323 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8324 /* harmony export */ "default": function() { return /* binding */ getBasePlacement; } 8325 /* harmony export */ }); 8326 8327 function getBasePlacement(placement) { 8328 return placement.split('-')[0]; 8329 } 8330 8331 /***/ }), 8332 8333
vendor: 955 bytes, lines 8333-8355
8333/***/ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js": 8334 /*!*********************************************************************!*\ 8335 !*** ./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js ***! 8336 \*********************************************************************/ 8337 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8338 8339 "use strict"; 8340 __webpack_require__.r(__webpack_exports__); 8341 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8342 /* harmony export */ "default": function() { return /* binding */ getFreshSideObject; } 8343 /* harmony export */ }); 8344 function getFreshSideObject() { 8345 return { 8346 top: 0, 8347 right: 0, 8348 bottom: 0, 8349 left: 0 8350 }; 8351 } 8352 8353 /***/ }), 8354 8355
vendor: 917 bytes, lines 8355-8372
8355/***/ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js": 8356 /*!***************************************************************************!*\ 8357 !*** ./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js ***! 8358 \***************************************************************************/ 8359 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8360 8361 "use strict"; 8362 __webpack_require__.r(__webpack_exports__); 8363 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8364 /* harmony export */ "default": function() { return /* binding */ getMainAxisFromPlacement; } 8365 /* harmony export */ }); 8366 function getMainAxisFromPlacement(placement) { 8367 return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; 8368 } 8369 8370 /***/ }), 8371 8372
vendor: 1,128 bytes, lines 8372-8397
8372/***/ "./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js": 8373 /*!***********************************************************************!*\ 8374 !*** ./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js ***! 8375 \***********************************************************************/ 8376 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8377 8378 "use strict"; 8379 __webpack_require__.r(__webpack_exports__); 8380 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8381 /* harmony export */ "default": function() { return /* binding */ getOppositePlacement; } 8382 /* harmony export */ }); 8383 var hash = { 8384 left: 'right', 8385 right: 'left', 8386 bottom: 'top', 8387 top: 'bottom' 8388 }; 8389 function getOppositePlacement(placement) { 8390 return placement.replace(/left|right|bottom|top/g, function (matched) { 8391 return hash[matched]; 8392 }); 8393 } 8394 8395 /***/ }), 8396 8397
vendor: 1,106 bytes, lines 8397-8420
8397/***/ "./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js": 8398 /*!********************************************************************************!*\ 8399 !*** ./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js ***! 8400 \********************************************************************************/ 8401 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8402 8403 "use strict"; 8404 __webpack_require__.r(__webpack_exports__); 8405 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8406 /* harmony export */ "default": function() { return /* binding */ getOppositeVariationPlacement; } 8407 /* harmony export */ }); 8408 var hash = { 8409 start: 'end', 8410 end: 'start' 8411 }; 8412 function getOppositeVariationPlacement(placement) { 8413 return placement.replace(/start|end/g, function (matched) { 8414 return hash[matched]; 8415 }); 8416 } 8417 8418 /***/ }), 8419 8420
vendor: 815 bytes, lines 8420-8437
8420/***/ "./node_modules/@popperjs/core/lib/utils/getVariation.js": 8421 /*!***************************************************************!*\ 8422 !*** ./node_modules/@popperjs/core/lib/utils/getVariation.js ***! 8423 \***************************************************************/ 8424 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8425 8426 "use strict"; 8427 __webpack_require__.r(__webpack_exports__); 8428 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8429 /* harmony export */ "default": function() { return /* binding */ getVariation; } 8430 /* harmony export */ }); 8431 function getVariation(placement) { 8432 return placement.split('-')[1]; 8433 } 8434 8435 /***/ }), 8436 8437
vendor: 935 bytes, lines 8437-8456
8437/***/ "./node_modules/@popperjs/core/lib/utils/math.js": 8438 /*!*******************************************************!*\ 8439 !*** ./node_modules/@popperjs/core/lib/utils/math.js ***! 8440 \*******************************************************/ 8441 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8442 8443 "use strict"; 8444 __webpack_require__.r(__webpack_exports__); 8445 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8446 /* harmony export */ max: function() { return /* binding */ max; }, 8447 /* harmony export */ min: function() { return /* binding */ min; }, 8448 /* harmony export */ round: function() { return /* binding */ round; } 8449 /* harmony export */ }); 8450 var max = Math.max; 8451 var min = Math.min; 8452 var round = Math.round; 8453 8454 /***/ }), 8455 8456
vendor: 1,407 bytes, lines 8456-8484
8456/***/ "./node_modules/@popperjs/core/lib/utils/mergeByName.js": 8457 /*!**************************************************************!*\ 8458 !*** ./node_modules/@popperjs/core/lib/utils/mergeByName.js ***! 8459 \**************************************************************/ 8460 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8461 8462 "use strict"; 8463 __webpack_require__.r(__webpack_exports__); 8464 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8465 /* harmony export */ "default": function() { return /* binding */ mergeByName; } 8466 /* harmony export */ }); 8467 function mergeByName(modifiers) { 8468 var merged = modifiers.reduce(function (merged, current) { 8469 var existing = merged[current.name]; 8470 merged[current.name] = existing ? Object.assign({}, existing, current, { 8471 options: Object.assign({}, existing.options, current.options), 8472 data: Object.assign({}, existing.data, current.data) 8473 }) : current; 8474 return merged; 8475 }, {}); // IE11 does not support Object.values 8476 8477 return Object.keys(merged).map(function (key) { 8478 return merged[key]; 8479 }); 8480 } 8481 8482 /***/ }), 8483 8484
vendor: 1,143 bytes, lines 8484-8503
8484/***/ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js": 8485 /*!*********************************************************************!*\ 8486 !*** ./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js ***! 8487 \*********************************************************************/ 8488 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8489 8490 "use strict"; 8491 __webpack_require__.r(__webpack_exports__); 8492 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8493 /* harmony export */ "default": function() { return /* binding */ mergePaddingObject; } 8494 /* harmony export */ }); 8495 /* harmony import */ var _getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getFreshSideObject.js */ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js"); 8496 8497 function mergePaddingObject(paddingObject) { 8498 return Object.assign({}, (0,_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(), paddingObject); 8499 } 8500 8501 /***/ }), 8502 8503
vendor: 2,687 bytes, lines 8503-8562
8503/***/ "./node_modules/@popperjs/core/lib/utils/orderModifiers.js": 8504 /*!*****************************************************************!*\ 8505 !*** ./node_modules/@popperjs/core/lib/utils/orderModifiers.js ***! 8506 \*****************************************************************/ 8507 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8508 8509 "use strict"; 8510 __webpack_require__.r(__webpack_exports__); 8511 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8512 /* harmony export */ "default": function() { return /* binding */ orderModifiers; } 8513 /* harmony export */ }); 8514 /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); 8515 // source: https://stackoverflow.com/questions/49875255 8516 8517 function order(modifiers) { 8518 var map = new Map(); 8519 var visited = new Set(); 8520 var result = []; 8521 modifiers.forEach(function (modifier) { 8522 map.set(modifier.name, modifier); 8523 }); // On visiting object, check for its dependencies and visit them recursively 8524 8525 function sort(modifier) { 8526 visited.add(modifier.name); 8527 var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); 8528 requires.forEach(function (dep) { 8529 if (!visited.has(dep)) { 8530 var depModifier = map.get(dep); 8531 8532 if (depModifier) { 8533 sort(depModifier); 8534 } 8535 } 8536 }); 8537 result.push(modifier); 8538 } 8539 8540 modifiers.forEach(function (modifier) { 8541 if (!visited.has(modifier.name)) { 8542 // check for visited object 8543 sort(modifier); 8544 } 8545 }); 8546 return result; 8547 } 8548 8549 function orderModifiers(modifiers) { 8550 // order based on dependencies 8551 var orderedModifiers = order(modifiers); // order based on phase 8552 8553 return _enums_js__WEBPACK_IMPORTED_MODULE_0__.modifierPhases.reduce(function (acc, phase) { 8554 return acc.concat(orderedModifiers.filter(function (modifier) { 8555 return modifier.phase === phase; 8556 })); 8557 }, []); 8558 } 8559 8560 /***/ }), 8561 8562
vendor: 1,019 bytes, lines 8562-8584
8562/***/ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js": 8563 /*!*******************************************************************!*\ 8564 !*** ./node_modules/@popperjs/core/lib/utils/rectToClientRect.js ***! 8565 \*******************************************************************/ 8566 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8567 8568 "use strict"; 8569 __webpack_require__.r(__webpack_exports__); 8570 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8571 /* harmony export */ "default": function() { return /* binding */ rectToClientRect; } 8572 /* harmony export */ }); 8573 function rectToClientRect(rect) { 8574 return Object.assign({}, rect, { 8575 left: rect.x, 8576 top: rect.y, 8577 right: rect.x + rect.width, 8578 bottom: rect.y + rect.height 8579 }); 8580 } 8581 8582 /***/ }), 8583 8584
vendor: 1,110 bytes, lines 8584-8609
8584/***/ "./node_modules/@popperjs/core/lib/utils/userAgent.js": 8585 /*!************************************************************!*\ 8586 !*** ./node_modules/@popperjs/core/lib/utils/userAgent.js ***! 8587 \************************************************************/ 8588 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8589 8590 "use strict"; 8591 __webpack_require__.r(__webpack_exports__); 8592 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8593 /* harmony export */ "default": function() { return /* binding */ getUAString; } 8594 /* harmony export */ }); 8595 function getUAString() { 8596 var uaData = navigator.userAgentData; 8597 8598 if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) { 8599 return uaData.brands.map(function (item) { 8600 return item.brand + "/" + item.version; 8601 }).join(' '); 8602 } 8603 8604 return navigator.userAgent; 8605 } 8606 8607 /***/ }), 8608 8609
vendor: 1,303 bytes, lines 8609-8633
8609/***/ "./node_modules/@popperjs/core/lib/utils/within.js": 8610 /*!*********************************************************!*\ 8611 !*** ./node_modules/@popperjs/core/lib/utils/within.js ***! 8612 \*********************************************************/ 8613 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8614 8615 "use strict"; 8616 __webpack_require__.r(__webpack_exports__); 8617 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 8618 /* harmony export */ within: function() { return /* binding */ within; }, 8619 /* harmony export */ withinMaxClamp: function() { return /* binding */ withinMaxClamp; } 8620 /* harmony export */ }); 8621 /* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); 8622 8623 function within(min, value, max) { 8624 return (0,_math_js__WEBPACK_IMPORTED_MODULE_0__.max)(min, (0,_math_js__WEBPACK_IMPORTED_MODULE_0__.min)(value, max)); 8625 } 8626 function withinMaxClamp(min, value, max) { 8627 var v = within(min, value, max); 8628 return v > max ? max : v; 8629 } 8630 8631 /***/ }), 8632 8633
vendor: 14,805 bytes, lines 8633-8643
8633/***/ "./node_modules/aos/dist/aos.js": 8634 /*!**************************************!*\ 8635 !*** ./node_modules/aos/dist/aos.js ***! 8636 \**************************************/ 8637 /***/ (function(module) { 8638 8639 !function(e,t){ true?module.exports=t():0}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},r=n(1),a=(o(r),n(6)),u=o(a),c=n(7),s=o(c),f=n(8),d=o(f),l=n(9),p=o(l),m=n(10),b=o(m),v=n(11),y=o(v),g=n(14),h=o(g),w=[],k=!1,x={offset:120,delay:0,easing:"ease",duration:400,disable:!1,once:!1,startEvent:"DOMContentLoaded",throttleDelay:99,debounceDelay:50,disableMutationObserver:!1},j=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},M=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},S=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},_=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?M():(x.disableMutationObserver||d.default.isSupported()||(console.info('\n aos: MutationObserver is not supported on this browser,\n code mutations observing has been disabled.\n You may have to call "refreshHard()" by yourself.\n '),x.disableMutationObserver=!0),document.querySelector("body").setAttribute("data-aos-easing",x.easing),document.querySelector("body").setAttribute("data-aos-duration",x.duration),document.querySelector("body").setAttribute("data-aos-delay",x.delay),"DOMContentLoaded"===x.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?j(!0):"load"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener("resize",(0,s.default)(j,x.debounceDelay,!0)),window.addEventListener("orientationchange",(0,s.default)(j,x.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||d.default.ready("[data-aos]",O),w)};e.exports={init:_,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(f,t),M?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function f(){var e=O();return c(e)?d(e):void(h=setTimeout(f,a(e)))}function d(e){return h=void 0,_&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(f,t),o(w)}return void 0===h&&(h=setTimeout(f,t)),g}var b,v,y,g,h,w,k=0,M=!1,S=!1,_=!0;if("function"!=typeof e)throw new TypeError(s);return t=u(t)||0,i(n)&&(M=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,_="trailing"in n?!!n.trailing:_),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(s);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return f;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?f:+e}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s="Expected a function",f=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(f,t),M?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function s(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function f(){var e=j();return s(e)?d(e):void(h=setTimeout(f,u(e)))}function d(e){return h=void 0,_&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=s(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(f,t),i(w)}return void 0===h&&(h=setTimeout(f,t)),g}var b,v,y,g,h,w,O=0,M=!1,S=!1,_=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(M=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,_="trailing"in n?!!n.trailing:_),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==f}function a(e){if("number"==typeof e)return e;if(r(e))return s;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?s:+e}var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c="Expected a function",s=NaN,f="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e){var t=void 0,o=void 0,i=void 0;for(t=0;t<e.length;t+=1){if(o=e[t],o.dataset&&o.dataset.aos)return!0;if(i=o.children&&n(o.children))return!0}return!1}function o(){return window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver}function i(){return!!o()}function r(e,t){var n=window.document,i=o(),r=new i(a);u=t,r.observe(n.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function a(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),o=Array.prototype.slice.call(e.removedNodes),i=t.concat(o);if(n(i))return u()})}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){};t.default={isSupported:i,ready:r}},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(){return navigator.userAgent||navigator.vendor||window.opera||""}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),r=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,a=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,u=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i,c=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,s=function(){function e(){n(this,e)}return i(e,[{key:"phone",value:function(){var e=o();return!(!r.test(e)&&!a.test(e.substr(0,4)))}},{key:"mobile",value:function(){var e=o();return!(!u.test(e)&&!c.test(e.substr(0,4)))}},{key:"tablet",value:function(){return this.mobile()&&!this.phone()}}]),e}();t.default=new s},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e,t,n){var o=e.node.getAttribute("data-aos-once");t>e.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])}); 8640 8641 /***/ }), 8642 8643
vendor: 395 bytes, lines 8643-8653
8643/***/ "./node_modules/axios/index.js": 8644 /*!*************************************!*\ 8645 !*** ./node_modules/axios/index.js ***! 8646 \*************************************/ 8647 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 8648 8649 module.exports = __webpack_require__(/*! ./lib/axios */ "./node_modules/axios/lib/axios.js"); 8650 8651 /***/ }), 8652 8653
vendor: 11,709 bytes, lines 8653-8886
8653/***/ "./node_modules/axios/lib/adapters/xhr.js": 8654 /*!************************************************!*\ 8655 !*** ./node_modules/axios/lib/adapters/xhr.js ***! 8656 \************************************************/ 8657 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 8658 8659 "use strict"; 8660 8661 8662 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 8663 var settle = __webpack_require__(/*! ./../core/settle */ "./node_modules/axios/lib/core/settle.js"); 8664 var cookies = __webpack_require__(/*! ./../helpers/cookies */ "./node_modules/axios/lib/helpers/cookies.js"); 8665 var buildURL = __webpack_require__(/*! ./../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js"); 8666 var buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ "./node_modules/axios/lib/core/buildFullPath.js"); 8667 var parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ "./node_modules/axios/lib/helpers/parseHeaders.js"); 8668 var isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ "./node_modules/axios/lib/helpers/isURLSameOrigin.js"); 8669 var transitionalDefaults = __webpack_require__(/*! ../defaults/transitional */ "./node_modules/axios/lib/defaults/transitional.js"); 8670 var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js"); 8671 var CanceledError = __webpack_require__(/*! ../cancel/CanceledError */ "./node_modules/axios/lib/cancel/CanceledError.js"); 8672 var parseProtocol = __webpack_require__(/*! ../helpers/parseProtocol */ "./node_modules/axios/lib/helpers/parseProtocol.js"); 8673 8674 module.exports = function xhrAdapter(config) { 8675 return new Promise(function dispatchXhrRequest(resolve, reject) { 8676 var requestData = config.data; 8677 var requestHeaders = config.headers; 8678 var responseType = config.responseType; 8679 var onCanceled; 8680 function done() { 8681 if (config.cancelToken) { 8682 config.cancelToken.unsubscribe(onCanceled); 8683 } 8684 8685 if (config.signal) { 8686 config.signal.removeEventListener('abort', onCanceled); 8687 } 8688 } 8689 8690 if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) { 8691 delete requestHeaders['Content-Type']; // Let the browser set it 8692 } 8693 8694 var request = new XMLHttpRequest(); 8695 8696 // HTTP basic authentication 8697 if (config.auth) { 8698 var username = config.auth.username || ''; 8699 var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; 8700 requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); 8701 } 8702 8703 var fullPath = buildFullPath(config.baseURL, config.url); 8704 8705 request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); 8706 8707 // Set the request timeout in MS 8708 request.timeout = config.timeout; 8709 8710 function onloadend() { 8711 if (!request) { 8712 return; 8713 } 8714 // Prepare the response 8715 var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; 8716 var responseData = !responseType || responseType === 'text' || responseType === 'json' ? 8717 request.responseText : request.response; 8718 var response = { 8719 data: responseData, 8720 status: request.status, 8721 statusText: request.statusText, 8722 headers: responseHeaders, 8723 config: config, 8724 request: request 8725 }; 8726 8727 settle(function _resolve(value) { 8728 resolve(value); 8729 done(); 8730 }, function _reject(err) { 8731 reject(err); 8732 done(); 8733 }, response); 8734 8735 // Clean up request 8736 request = null; 8737 } 8738 8739 if ('onloadend' in request) { 8740 // Use onloadend if available 8741 request.onloadend = onloadend; 8742 } else { 8743 // Listen for ready state to emulate onloadend 8744 request.onreadystatechange = function handleLoad() { 8745 if (!request || request.readyState !== 4) { 8746 return; 8747 } 8748 8749 // The request errored out and we didn't get a response, this will be 8750 // handled by onerror instead 8751 // With one exception: request that using file: protocol, most browsers 8752 // will return status as 0 even though it's a successful request 8753 if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { 8754 return; 8755 } 8756 // readystate handler is calling before onerror or ontimeout handlers, 8757 // so we should call onloadend on the next 'tick' 8758 setTimeout(onloadend); 8759 }; 8760 } 8761 8762 // Handle browser request cancellation (as opposed to a manual cancellation) 8763 request.onabort = function handleAbort() { 8764 if (!request) { 8765 return; 8766 } 8767 8768 reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request)); 8769 8770 // Clean up request 8771 request = null; 8772 }; 8773 8774 // Handle low level network errors 8775 request.onerror = function handleError() { 8776 // Real errors are hidden from us by the browser 8777 // onerror should only fire if it's a network error 8778 reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, request)); 8779 8780 // Clean up request 8781 request = null; 8782 }; 8783 8784 // Handle timeout 8785 request.ontimeout = function handleTimeout() { 8786 var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; 8787 var transitional = config.transitional || transitionalDefaults; 8788 if (config.timeoutErrorMessage) { 8789 timeoutErrorMessage = config.timeoutErrorMessage; 8790 } 8791 reject(new AxiosError( 8792 timeoutErrorMessage, 8793 transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, 8794 config, 8795 request)); 8796 8797 // Clean up request 8798 request = null; 8799 }; 8800 8801 // Add xsrf header 8802 // This is only done if running in a standard browser environment. 8803 // Specifically not if we're in a web worker, or react-native. 8804 if (utils.isStandardBrowserEnv()) { 8805 // Add xsrf header 8806 var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? 8807 cookies.read(config.xsrfCookieName) : 8808 undefined; 8809 8810 if (xsrfValue) { 8811 requestHeaders[config.xsrfHeaderName] = xsrfValue; 8812 } 8813 } 8814 8815 // Add headers to the request 8816 if ('setRequestHeader' in request) { 8817 utils.forEach(requestHeaders, function setRequestHeader(val, key) { 8818 if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { 8819 // Remove Content-Type if data is undefined 8820 delete requestHeaders[key]; 8821 } else { 8822 // Otherwise add header to the request 8823 request.setRequestHeader(key, val); 8824 } 8825 }); 8826 } 8827 8828 // Add withCredentials to request if needed 8829 if (!utils.isUndefined(config.withCredentials)) { 8830 request.withCredentials = !!config.withCredentials; 8831 } 8832 8833 // Add responseType to request if needed 8834 if (responseType && responseType !== 'json') { 8835 request.responseType = config.responseType; 8836 } 8837 8838 // Handle progress if needed 8839 if (typeof config.onDownloadProgress === 'function') { 8840 request.addEventListener('progress', config.onDownloadProgress); 8841 } 8842 8843 // Not all browsers support upload events 8844 if (typeof config.onUploadProgress === 'function' && request.upload) { 8845 request.upload.addEventListener('progress', config.onUploadProgress); 8846 } 8847 8848 if (config.cancelToken || config.signal) { 8849 // Handle cancellation 8850 // eslint-disable-next-line func-names 8851 onCanceled = function(cancel) { 8852 if (!request) { 8853 return; 8854 } 8855 reject(!cancel || (cancel && cancel.type) ? new CanceledError() : cancel); 8856 request.abort(); 8857 request = null; 8858 }; 8859 8860 config.cancelToken && config.cancelToken.subscribe(onCanceled); 8861 if (config.signal) { 8862 config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); 8863 } 8864 } 8865 8866 if (!requestData) { 8867 requestData = null; 8868 } 8869 8870 var protocol = parseProtocol(fullPath); 8871 8872 if (protocol && [ 'http', 'https', 'file' ].indexOf(protocol) === -1) { 8873 reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config)); 8874 return; 8875 } 8876 8877 8878 // Send the request 8879 request.send(requestData); 8880 }); 8881 }; 8882 8883 8884 /***/ }), 8885 8886
vendor: 3,438 bytes, lines 8886-8961
8886/***/ "./node_modules/axios/lib/axios.js": 8887 /*!*****************************************!*\ 8888 !*** ./node_modules/axios/lib/axios.js ***! 8889 \*****************************************/ 8890 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 8891 8892 "use strict"; 8893 8894 8895 var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js"); 8896 var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); 8897 var Axios = __webpack_require__(/*! ./core/Axios */ "./node_modules/axios/lib/core/Axios.js"); 8898 var mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js"); 8899 var defaults = __webpack_require__(/*! ./defaults */ "./node_modules/axios/lib/defaults/index.js"); 8900 8901 /** 8902 * Create an instance of Axios 8903 * 8904 * @param {Object} defaultConfig The default config for the instance 8905 * @return {Axios} A new instance of Axios 8906 */ 8907 function createInstance(defaultConfig) { 8908 var context = new Axios(defaultConfig); 8909 var instance = bind(Axios.prototype.request, context); 8910 8911 // Copy axios.prototype to instance 8912 utils.extend(instance, Axios.prototype, context); 8913 8914 // Copy context to instance 8915 utils.extend(instance, context); 8916 8917 // Factory for creating new instances 8918 instance.create = function create(instanceConfig) { 8919 return createInstance(mergeConfig(defaultConfig, instanceConfig)); 8920 }; 8921 8922 return instance; 8923 } 8924 8925// Create the default instance to be exported 8926 var axios = createInstance(defaults); 8927 8928// Expose Axios class to allow class inheritance 8929 axios.Axios = Axios; 8930 8931// Expose Cancel & CancelToken 8932 axios.CanceledError = __webpack_require__(/*! ./cancel/CanceledError */ "./node_modules/axios/lib/cancel/CanceledError.js"); 8933 axios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ "./node_modules/axios/lib/cancel/CancelToken.js"); 8934 axios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js"); 8935 axios.VERSION = (__webpack_require__(/*! ./env/data */ "./node_modules/axios/lib/env/data.js").version); 8936 axios.toFormData = __webpack_require__(/*! ./helpers/toFormData */ "./node_modules/axios/lib/helpers/toFormData.js"); 8937 8938// Expose AxiosError class 8939 axios.AxiosError = __webpack_require__(/*! ../lib/core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js"); 8940 8941// alias for CanceledError for backward compatibility 8942 axios.Cancel = axios.CanceledError; 8943 8944// Expose all/spread 8945 axios.all = function all(promises) { 8946 return Promise.all(promises); 8947 }; 8948 axios.spread = __webpack_require__(/*! ./helpers/spread */ "./node_modules/axios/lib/helpers/spread.js"); 8949 8950// Expose isAxiosError 8951 axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ "./node_modules/axios/lib/helpers/isAxiosError.js"); 8952 8953 module.exports = axios; 8954 8955// Allow use of default import syntax in TypeScript 8956 module.exports["default"] = axios; 8957 8958 8959 /***/ }), 8960 8961
vendor: 4,314 bytes, lines 8961-9091
8961/***/ "./node_modules/axios/lib/cancel/CancelToken.js": 8962 /*!******************************************************!*\ 8963 !*** ./node_modules/axios/lib/cancel/CancelToken.js ***! 8964 \******************************************************/ 8965 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 8966 8967 "use strict"; 8968 8969 8970 var CanceledError = __webpack_require__(/*! ./CanceledError */ "./node_modules/axios/lib/cancel/CanceledError.js"); 8971 8972 /** 8973 * A `CancelToken` is an object that can be used to request cancellation of an operation. 8974 * 8975 * @class 8976 * @param {Function} executor The executor function. 8977 */ 8978 function CancelToken(executor) { 8979 if (typeof executor !== 'function') { 8980 throw new TypeError('executor must be a function.'); 8981 } 8982 8983 var resolvePromise; 8984 8985 this.promise = new Promise(function promiseExecutor(resolve) { 8986 resolvePromise = resolve; 8987 }); 8988 8989 var token = this; 8990 8991 // eslint-disable-next-line func-names 8992 this.promise.then(function(cancel) { 8993 if (!token._listeners) return; 8994 8995 var i; 8996 var l = token._listeners.length; 8997 8998 for (i = 0; i < l; i++) { 8999 token._listeners[i](cancel); 9000 } 9001 token._listeners = null; 9002 }); 9003 9004 // eslint-disable-next-line func-names 9005 this.promise.then = function(onfulfilled) { 9006 var _resolve; 9007 // eslint-disable-next-line func-names 9008 var promise = new Promise(function(resolve) { 9009 token.subscribe(resolve); 9010 _resolve = resolve; 9011 }).then(onfulfilled); 9012 9013 promise.cancel = function reject() { 9014 token.unsubscribe(_resolve); 9015 }; 9016 9017 return promise; 9018 }; 9019 9020 executor(function cancel(message) { 9021 if (token.reason) { 9022 // Cancellation has already been requested 9023 return; 9024 } 9025 9026 token.reason = new CanceledError(message); 9027 resolvePromise(token.reason); 9028 }); 9029 } 9030 9031 /** 9032 * Throws a `CanceledError` if cancellation has been requested. 9033 */ 9034 CancelToken.prototype.throwIfRequested = function throwIfRequested() { 9035 if (this.reason) { 9036 throw this.reason; 9037 } 9038 }; 9039 9040 /** 9041 * Subscribe to the cancel signal 9042 */ 9043 9044 CancelToken.prototype.subscribe = function subscribe(listener) { 9045 if (this.reason) { 9046 listener(this.reason); 9047 return; 9048 } 9049 9050 if (this._listeners) { 9051 this._listeners.push(listener); 9052 } else { 9053 this._listeners = [listener]; 9054 } 9055 }; 9056 9057 /** 9058 * Unsubscribe from the cancel signal 9059 */ 9060 9061 CancelToken.prototype.unsubscribe = function unsubscribe(listener) { 9062 if (!this._listeners) { 9063 return; 9064 } 9065 var index = this._listeners.indexOf(listener); 9066 if (index !== -1) { 9067 this._listeners.splice(index, 1); 9068 } 9069 }; 9070 9071 /** 9072 * Returns an object that contains a new `CancelToken` and a function that, when called, 9073 * cancels the `CancelToken`. 9074 */ 9075 CancelToken.source = function source() { 9076 var cancel; 9077 var token = new CancelToken(function executor(c) { 9078 cancel = c; 9079 }); 9080 return { 9081 token: token, 9082 cancel: cancel 9083 }; 9084 }; 9085 9086 module.exports = CancelToken; 9087 9088 9089 /***/ }), 9090 9091
vendor: 1,252 bytes, lines 9091-9124
9091/***/ "./node_modules/axios/lib/cancel/CanceledError.js": 9092 /*!********************************************************!*\ 9093 !*** ./node_modules/axios/lib/cancel/CanceledError.js ***! 9094 \********************************************************/ 9095 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9096 9097 "use strict"; 9098 9099 9100 var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js"); 9101 var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); 9102 9103 /** 9104 * A `CanceledError` is an object that is thrown when an operation is canceled. 9105 * 9106 * @class 9107 * @param {string=} message The message. 9108 */ 9109 function CanceledError(message) { 9110 // eslint-disable-next-line no-eq-null,eqeqeq 9111 AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED); 9112 this.name = 'CanceledError'; 9113 } 9114 9115 utils.inherits(CanceledError, AxiosError, { 9116 __CANCEL__: true 9117 }); 9118 9119 module.exports = CanceledError; 9120 9121 9122 /***/ }), 9123 9124
vendor: 452 bytes, lines 9124-9140
9124/***/ "./node_modules/axios/lib/cancel/isCancel.js": 9125 /*!***************************************************!*\ 9126 !*** ./node_modules/axios/lib/cancel/isCancel.js ***! 9127 \***************************************************/ 9128 /***/ (function(module) { 9129 9130 "use strict"; 9131 9132 9133 module.exports = function isCancel(value) { 9134 return !!(value && value.__CANCEL__); 9135 }; 9136 9137 9138 /***/ }), 9139 9140
vendor: 7,292 bytes, lines 9140-9311
9140/***/ "./node_modules/axios/lib/core/Axios.js": 9141 /*!**********************************************!*\ 9142 !*** ./node_modules/axios/lib/core/Axios.js ***! 9143 \**********************************************/ 9144 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9145 9146 "use strict"; 9147 9148 9149 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 9150 var buildURL = __webpack_require__(/*! ../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js"); 9151 var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js"); 9152 var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js"); 9153 var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js"); 9154 var buildFullPath = __webpack_require__(/*! ./buildFullPath */ "./node_modules/axios/lib/core/buildFullPath.js"); 9155 var validator = __webpack_require__(/*! ../helpers/validator */ "./node_modules/axios/lib/helpers/validator.js"); 9156 9157 var validators = validator.validators; 9158 /** 9159 * Create a new instance of Axios 9160 * 9161 * @param {Object} instanceConfig The default config for the instance 9162 */ 9163 function Axios(instanceConfig) { 9164 this.defaults = instanceConfig; 9165 this.interceptors = { 9166 request: new InterceptorManager(), 9167 response: new InterceptorManager() 9168 }; 9169 } 9170 9171 /** 9172 * Dispatch a request 9173 * 9174 * @param {Object} config The config specific for this request (merged with this.defaults) 9175 */ 9176 Axios.prototype.request = function request(configOrUrl, config) { 9177 /*eslint no-param-reassign:0*/ 9178 // Allow for axios('example/url'[, config]) a la fetch API 9179 if (typeof configOrUrl === 'string') { 9180 config = config || {}; 9181 config.url = configOrUrl; 9182 } else { 9183 config = configOrUrl || {}; 9184 } 9185 9186 config = mergeConfig(this.defaults, config); 9187 9188 // Set config.method 9189 if (config.method) { 9190 config.method = config.method.toLowerCase(); 9191 } else if (this.defaults.method) { 9192 config.method = this.defaults.method.toLowerCase(); 9193 } else { 9194 config.method = 'get'; 9195 } 9196 9197 var transitional = config.transitional; 9198 9199 if (transitional !== undefined) { 9200 validator.assertOptions(transitional, { 9201 silentJSONParsing: validators.transitional(validators.boolean), 9202 forcedJSONParsing: validators.transitional(validators.boolean), 9203 clarifyTimeoutError: validators.transitional(validators.boolean) 9204 }, false); 9205 } 9206 9207 // filter out skipped interceptors 9208 var requestInterceptorChain = []; 9209 var synchronousRequestInterceptors = true; 9210 this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { 9211 if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) { 9212 return; 9213 } 9214 9215 synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; 9216 9217 requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); 9218 }); 9219 9220 var responseInterceptorChain = []; 9221 this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { 9222 responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); 9223 }); 9224 9225 var promise; 9226 9227 if (!synchronousRequestInterceptors) { 9228 var chain = [dispatchRequest, undefined]; 9229 9230 Array.prototype.unshift.apply(chain, requestInterceptorChain); 9231 chain = chain.concat(responseInterceptorChain); 9232 9233 promise = Promise.resolve(config); 9234 while (chain.length) { 9235 promise = promise.then(chain.shift(), chain.shift()); 9236 } 9237 9238 return promise; 9239 } 9240 9241 9242 var newConfig = config; 9243 while (requestInterceptorChain.length) { 9244 var onFulfilled = requestInterceptorChain.shift(); 9245 var onRejected = requestInterceptorChain.shift(); 9246 try { 9247 newConfig = onFulfilled(newConfig); 9248 } catch (error) { 9249 onRejected(error); 9250 break; 9251 } 9252 } 9253 9254 try { 9255 promise = dispatchRequest(newConfig); 9256 } catch (error) { 9257 return Promise.reject(error); 9258 } 9259 9260 while (responseInterceptorChain.length) { 9261 promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift()); 9262 } 9263 9264 return promise; 9265 }; 9266 9267 Axios.prototype.getUri = function getUri(config) { 9268 config = mergeConfig(this.defaults, config); 9269 var fullPath = buildFullPath(config.baseURL, config.url); 9270 return buildURL(fullPath, config.params, config.paramsSerializer); 9271 }; 9272 9273// Provide aliases for supported request methods 9274 utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { 9275 /*eslint func-names:0*/ 9276 Axios.prototype[method] = function(url, config) { 9277 return this.request(mergeConfig(config || {}, { 9278 method: method, 9279 url: url, 9280 data: (config || {}).data 9281 })); 9282 }; 9283 }); 9284 9285 utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { 9286 /*eslint func-names:0*/ 9287 9288 function generateHTTPMethod(isForm) { 9289 return function httpMethod(url, data, config) { 9290 return this.request(mergeConfig(config || {}, { 9291 method: method, 9292 headers: isForm ? { 9293 'Content-Type': 'multipart/form-data' 9294 } : {}, 9295 url: url, 9296 data: data 9297 })); 9298 }; 9299 } 9300 9301 Axios.prototype[method] = generateHTTPMethod(); 9302 9303 Axios.prototype[method + 'Form'] = generateHTTPMethod(true); 9304 }); 9305 9306 module.exports = Axios; 9307 9308 9309 /***/ }), 9310 9311
vendor: 3,662 bytes, lines 9311-9408
9311/***/ "./node_modules/axios/lib/core/AxiosError.js": 9312 /*!***************************************************!*\ 9313 !*** ./node_modules/axios/lib/core/AxiosError.js ***! 9314 \***************************************************/ 9315 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9316 9317 "use strict"; 9318 9319 9320 var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); 9321 9322 /** 9323 * Create an Error with the specified message, config, error code, request and response. 9324 * 9325 * @param {string} message The error message. 9326 * @param {string} [code] The error code (for example, 'ECONNABORTED'). 9327 * @param {Object} [config] The config. 9328 * @param {Object} [request] The request. 9329 * @param {Object} [response] The response. 9330 * @returns {Error} The created error. 9331 */ 9332 function AxiosError(message, code, config, request, response) { 9333 Error.call(this); 9334 this.message = message; 9335 this.name = 'AxiosError'; 9336 code && (this.code = code); 9337 config && (this.config = config); 9338 request && (this.request = request); 9339 response && (this.response = response); 9340 } 9341 9342 utils.inherits(AxiosError, Error, { 9343 toJSON: function toJSON() { 9344 return { 9345 // Standard 9346 message: this.message, 9347 name: this.name, 9348 // Microsoft 9349 description: this.description, 9350 number: this.number, 9351 // Mozilla 9352 fileName: this.fileName, 9353 lineNumber: this.lineNumber, 9354 columnNumber: this.columnNumber, 9355 stack: this.stack, 9356 // Axios 9357 config: this.config, 9358 code: this.code, 9359 status: this.response && this.response.status ? this.response.status : null 9360 }; 9361 } 9362 }); 9363 9364 var prototype = AxiosError.prototype; 9365 var descriptors = {}; 9366 9367 [ 9368 'ERR_BAD_OPTION_VALUE', 9369 'ERR_BAD_OPTION', 9370 'ECONNABORTED', 9371 'ETIMEDOUT', 9372 'ERR_NETWORK', 9373 'ERR_FR_TOO_MANY_REDIRECTS', 9374 'ERR_DEPRECATED', 9375 'ERR_BAD_RESPONSE', 9376 'ERR_BAD_REQUEST', 9377 'ERR_CANCELED' 9378// eslint-disable-next-line func-names 9379 ].forEach(function(code) { 9380 descriptors[code] = {value: code}; 9381 }); 9382 9383 Object.defineProperties(AxiosError, descriptors); 9384 Object.defineProperty(prototype, 'isAxiosError', {value: true}); 9385 9386// eslint-disable-next-line func-names 9387 AxiosError.from = function(error, code, config, request, response, customProps) { 9388 var axiosError = Object.create(prototype); 9389 9390 utils.toFlatObject(error, axiosError, function filter(obj) { 9391 return obj !== Error.prototype; 9392 }); 9393 9394 AxiosError.call(axiosError, error.message, code, config, request, response); 9395 9396 axiosError.name = error.name; 9397 9398 customProps && Object.assign(axiosError, customProps); 9399 9400 return axiosError; 9401 }; 9402 9403 module.exports = AxiosError; 9404 9405 9406 /***/ }), 9407 9408
vendor: 2,421 bytes, lines 9408-9473
9408/***/ "./node_modules/axios/lib/core/InterceptorManager.js": 9409 /*!***********************************************************!*\ 9410 !*** ./node_modules/axios/lib/core/InterceptorManager.js ***! 9411 \***********************************************************/ 9412 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9413 9414 "use strict"; 9415 9416 9417 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 9418 9419 function InterceptorManager() { 9420 this.handlers = []; 9421 } 9422 9423 /** 9424 * Add a new interceptor to the stack 9425 * 9426 * @param {Function} fulfilled The function to handle `then` for a `Promise` 9427 * @param {Function} rejected The function to handle `reject` for a `Promise` 9428 * 9429 * @return {Number} An ID used to remove interceptor later 9430 */ 9431 InterceptorManager.prototype.use = function use(fulfilled, rejected, options) { 9432 this.handlers.push({ 9433 fulfilled: fulfilled, 9434 rejected: rejected, 9435 synchronous: options ? options.synchronous : false, 9436 runWhen: options ? options.runWhen : null 9437 }); 9438 return this.handlers.length - 1; 9439 }; 9440 9441 /** 9442 * Remove an interceptor from the stack 9443 * 9444 * @param {Number} id The ID that was returned by `use` 9445 */ 9446 InterceptorManager.prototype.eject = function eject(id) { 9447 if (this.handlers[id]) { 9448 this.handlers[id] = null; 9449 } 9450 }; 9451 9452 /** 9453 * Iterate over all the registered interceptors 9454 * 9455 * This method is particularly useful for skipping over any 9456 * interceptors that may have become `null` calling `eject`. 9457 * 9458 * @param {Function} fn The function to call for each interceptor 9459 */ 9460 InterceptorManager.prototype.forEach = function forEach(fn) { 9461 utils.forEach(this.handlers, function forEachHandler(h) { 9462 if (h !== null) { 9463 fn(h); 9464 } 9465 }); 9466 }; 9467 9468 module.exports = InterceptorManager; 9469 9470 9471 /***/ }), 9472 9473
vendor: 1,416 bytes, lines 9473-9504
9473/***/ "./node_modules/axios/lib/core/buildFullPath.js": 9474 /*!******************************************************!*\ 9475 !*** ./node_modules/axios/lib/core/buildFullPath.js ***! 9476 \******************************************************/ 9477 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9478 9479 "use strict"; 9480 9481 9482 var isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ "./node_modules/axios/lib/helpers/isAbsoluteURL.js"); 9483 var combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ "./node_modules/axios/lib/helpers/combineURLs.js"); 9484 9485 /** 9486 * Creates a new URL by combining the baseURL with the requestedURL, 9487 * only when the requestedURL is not already an absolute URL. 9488 * If the requestURL is absolute, this function returns the requestedURL untouched. 9489 * 9490 * @param {string} baseURL The base URL 9491 * @param {string} requestedURL Absolute or relative URL to combine 9492 * @returns {string} The combined full path 9493 */ 9494 module.exports = function buildFullPath(baseURL, requestedURL) { 9495 if (baseURL && !isAbsoluteURL(requestedURL)) { 9496 return combineURLs(baseURL, requestedURL); 9497 } 9498 return requestedURL; 9499 }; 9500 9501 9502 /***/ }), 9503 9504
vendor: 3,923 bytes, lines 9504-9602
9504/***/ "./node_modules/axios/lib/core/dispatchRequest.js": 9505 /*!********************************************************!*\ 9506 !*** ./node_modules/axios/lib/core/dispatchRequest.js ***! 9507 \********************************************************/ 9508 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9509 9510 "use strict"; 9511 9512 9513 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 9514 var transformData = __webpack_require__(/*! ./transformData */ "./node_modules/axios/lib/core/transformData.js"); 9515 var isCancel = __webpack_require__(/*! ../cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js"); 9516 var defaults = __webpack_require__(/*! ../defaults */ "./node_modules/axios/lib/defaults/index.js"); 9517 var CanceledError = __webpack_require__(/*! ../cancel/CanceledError */ "./node_modules/axios/lib/cancel/CanceledError.js"); 9518 9519 /** 9520 * Throws a `CanceledError` if cancellation has been requested. 9521 */ 9522 function throwIfCancellationRequested(config) { 9523 if (config.cancelToken) { 9524 config.cancelToken.throwIfRequested(); 9525 } 9526 9527 if (config.signal && config.signal.aborted) { 9528 throw new CanceledError(); 9529 } 9530 } 9531 9532 /** 9533 * Dispatch a request to the server using the configured adapter. 9534 * 9535 * @param {object} config The config that is to be used for the request 9536 * @returns {Promise} The Promise to be fulfilled 9537 */ 9538 module.exports = function dispatchRequest(config) { 9539 throwIfCancellationRequested(config); 9540 9541 // Ensure headers exist 9542 config.headers = config.headers || {}; 9543 9544 // Transform request data 9545 config.data = transformData.call( 9546 config, 9547 config.data, 9548 config.headers, 9549 config.transformRequest 9550 ); 9551 9552 // Flatten headers 9553 config.headers = utils.merge( 9554 config.headers.common || {}, 9555 config.headers[config.method] || {}, 9556 config.headers 9557 ); 9558 9559 utils.forEach( 9560 ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], 9561 function cleanHeaderConfig(method) { 9562 delete config.headers[method]; 9563 } 9564 ); 9565 9566 var adapter = config.adapter || defaults.adapter; 9567 9568 return adapter(config).then(function onAdapterResolution(response) { 9569 throwIfCancellationRequested(config); 9570 9571 // Transform response data 9572 response.data = transformData.call( 9573 config, 9574 response.data, 9575 response.headers, 9576 config.transformResponse 9577 ); 9578 9579 return response; 9580 }, function onAdapterRejection(reason) { 9581 if (!isCancel(reason)) { 9582 throwIfCancellationRequested(config); 9583 9584 // Transform response data 9585 if (reason && reason.response) { 9586 reason.response.data = transformData.call( 9587 config, 9588 reason.response.data, 9589 reason.response.headers, 9590 config.transformResponse 9591 ); 9592 } 9593 } 9594 9595 return Promise.reject(reason); 9596 }); 9597 }; 9598 9599 9600 /***/ }), 9601 9602
vendor: 5,007 bytes, lines 9602-9713
9602/***/ "./node_modules/axios/lib/core/mergeConfig.js": 9603 /*!****************************************************!*\ 9604 !*** ./node_modules/axios/lib/core/mergeConfig.js ***! 9605 \****************************************************/ 9606 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9607 9608 "use strict"; 9609 9610 9611 var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); 9612 9613 /** 9614 * Config-specific merge-function which creates a new config-object 9615 * by merging two configuration objects together. 9616 * 9617 * @param {Object} config1 9618 * @param {Object} config2 9619 * @returns {Object} New object resulting from merging config2 to config1 9620 */ 9621 module.exports = function mergeConfig(config1, config2) { 9622 // eslint-disable-next-line no-param-reassign 9623 config2 = config2 || {}; 9624 var config = {}; 9625 9626 function getMergedValue(target, source) { 9627 if (utils.isPlainObject(target) && utils.isPlainObject(source)) { 9628 return utils.merge(target, source); 9629 } else if (utils.isPlainObject(source)) { 9630 return utils.merge({}, source); 9631 } else if (utils.isArray(source)) { 9632 return source.slice(); 9633 } 9634 return source; 9635 } 9636 9637 // eslint-disable-next-line consistent-return 9638 function mergeDeepProperties(prop) { 9639 if (!utils.isUndefined(config2[prop])) { 9640 return getMergedValue(config1[prop], config2[prop]); 9641 } else if (!utils.isUndefined(config1[prop])) { 9642 return getMergedValue(undefined, config1[prop]); 9643 } 9644 } 9645 9646 // eslint-disable-next-line consistent-return 9647 function valueFromConfig2(prop) { 9648 if (!utils.isUndefined(config2[prop])) { 9649 return getMergedValue(undefined, config2[prop]); 9650 } 9651 } 9652 9653 // eslint-disable-next-line consistent-return 9654 function defaultToConfig2(prop) { 9655 if (!utils.isUndefined(config2[prop])) { 9656 return getMergedValue(undefined, config2[prop]); 9657 } else if (!utils.isUndefined(config1[prop])) { 9658 return getMergedValue(undefined, config1[prop]); 9659 } 9660 } 9661 9662 // eslint-disable-next-line consistent-return 9663 function mergeDirectKeys(prop) { 9664 if (prop in config2) { 9665 return getMergedValue(config1[prop], config2[prop]); 9666 } else if (prop in config1) { 9667 return getMergedValue(undefined, config1[prop]); 9668 } 9669 } 9670 9671 var mergeMap = { 9672 'url': valueFromConfig2, 9673 'method': valueFromConfig2, 9674 'data': valueFromConfig2, 9675 'baseURL': defaultToConfig2, 9676 'transformRequest': defaultToConfig2, 9677 'transformResponse': defaultToConfig2, 9678 'paramsSerializer': defaultToConfig2, 9679 'timeout': defaultToConfig2, 9680 'timeoutMessage': defaultToConfig2, 9681 'withCredentials': defaultToConfig2, 9682 'adapter': defaultToConfig2, 9683 'responseType': defaultToConfig2, 9684 'xsrfCookieName': defaultToConfig2, 9685 'xsrfHeaderName': defaultToConfig2, 9686 'onUploadProgress': defaultToConfig2, 9687 'onDownloadProgress': defaultToConfig2, 9688 'decompress': defaultToConfig2, 9689 'maxContentLength': defaultToConfig2, 9690 'maxBodyLength': defaultToConfig2, 9691 'beforeRedirect': defaultToConfig2, 9692 'transport': defaultToConfig2, 9693 'httpAgent': defaultToConfig2, 9694 'httpsAgent': defaultToConfig2, 9695 'cancelToken': defaultToConfig2, 9696 'socketPath': defaultToConfig2, 9697 'responseEncoding': defaultToConfig2, 9698 'validateStatus': mergeDirectKeys 9699 }; 9700 9701 utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) { 9702 var merge = mergeMap[prop] || mergeDeepProperties; 9703 var configValue = merge(prop); 9704 (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); 9705 }); 9706 9707 return config; 9708 }; 9709 9710 9711 /***/ }), 9712 9713
vendor: 1,519 bytes, lines 9713-9749
9713/***/ "./node_modules/axios/lib/core/settle.js": 9714 /*!***********************************************!*\ 9715 !*** ./node_modules/axios/lib/core/settle.js ***! 9716 \***********************************************/ 9717 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9718 9719 "use strict"; 9720 9721 9722 var AxiosError = __webpack_require__(/*! ./AxiosError */ "./node_modules/axios/lib/core/AxiosError.js"); 9723 9724 /** 9725 * Resolve or reject a Promise based on response status. 9726 * 9727 * @param {Function} resolve A function that resolves the promise. 9728 * @param {Function} reject A function that rejects the promise. 9729 * @param {object} response The response. 9730 */ 9731 module.exports = function settle(resolve, reject, response) { 9732 var validateStatus = response.config.validateStatus; 9733 if (!response.status || !validateStatus || validateStatus(response.status)) { 9734 resolve(response); 9735 } else { 9736 reject(new AxiosError( 9737 'Request failed with status code ' + response.status, 9738 [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], 9739 response.config, 9740 response.request, 9741 response 9742 )); 9743 } 9744 }; 9745 9746 9747 /***/ }), 9748 9749
vendor: 1,353 bytes, lines 9749-9782
9749/***/ "./node_modules/axios/lib/core/transformData.js": 9750 /*!******************************************************!*\ 9751 !*** ./node_modules/axios/lib/core/transformData.js ***! 9752 \******************************************************/ 9753 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9754 9755 "use strict"; 9756 9757 9758 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 9759 var defaults = __webpack_require__(/*! ../defaults */ "./node_modules/axios/lib/defaults/index.js"); 9760 9761 /** 9762 * Transform the data for a request or a response 9763 * 9764 * @param {Object|String} data The data to be transformed 9765 * @param {Array} headers The headers for the request or response 9766 * @param {Array|Function} fns A single function or Array of functions 9767 * @returns {*} The resulting transformed data 9768 */ 9769 module.exports = function transformData(data, headers, fns) { 9770 var context = this || defaults; 9771 /*eslint no-param-reassign:0*/ 9772 utils.forEach(fns, function transform(fn) { 9773 data = fn.call(context, data, headers); 9774 }); 9775 9776 return data; 9777 }; 9778 9779 9780 /***/ }), 9781 9782
vendor: 6,892 bytes, lines 9782-9940
9782/***/ "./node_modules/axios/lib/defaults/index.js": 9783 /*!**************************************************!*\ 9784 !*** ./node_modules/axios/lib/defaults/index.js ***! 9785 \**************************************************/ 9786 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9787 9788 "use strict"; 9789 /* provided dependency */ var process = __webpack_require__(/*! process/browser.js */ "./node_modules/process/browser.js"); 9790 9791 9792 var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); 9793 var normalizeHeaderName = __webpack_require__(/*! ../helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js"); 9794 var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js"); 9795 var transitionalDefaults = __webpack_require__(/*! ./transitional */ "./node_modules/axios/lib/defaults/transitional.js"); 9796 var toFormData = __webpack_require__(/*! ../helpers/toFormData */ "./node_modules/axios/lib/helpers/toFormData.js"); 9797 9798 var DEFAULT_CONTENT_TYPE = { 9799 'Content-Type': 'application/x-www-form-urlencoded' 9800 }; 9801 9802 function setContentTypeIfUnset(headers, value) { 9803 if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { 9804 headers['Content-Type'] = value; 9805 } 9806 } 9807 9808 function getDefaultAdapter() { 9809 var adapter; 9810 if (typeof XMLHttpRequest !== 'undefined') { 9811 // For browsers use XHR adapter 9812 adapter = __webpack_require__(/*! ../adapters/xhr */ "./node_modules/axios/lib/adapters/xhr.js"); 9813 } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { 9814 // For node use HTTP adapter 9815 adapter = __webpack_require__(/*! ../adapters/http */ "./node_modules/axios/lib/adapters/xhr.js"); 9816 } 9817 return adapter; 9818 } 9819 9820 function stringifySafely(rawValue, parser, encoder) { 9821 if (utils.isString(rawValue)) { 9822 try { 9823 (parser || JSON.parse)(rawValue); 9824 return utils.trim(rawValue); 9825 } catch (e) { 9826 if (e.name !== 'SyntaxError') { 9827 throw e; 9828 } 9829 } 9830 } 9831 9832 return (encoder || JSON.stringify)(rawValue); 9833 } 9834 9835 var defaults = { 9836 9837 transitional: transitionalDefaults, 9838 9839 adapter: getDefaultAdapter(), 9840 9841 transformRequest: [function transformRequest(data, headers) { 9842 normalizeHeaderName(headers, 'Accept'); 9843 normalizeHeaderName(headers, 'Content-Type'); 9844 9845 if (utils.isFormData(data) || 9846 utils.isArrayBuffer(data) || 9847 utils.isBuffer(data) || 9848 utils.isStream(data) || 9849 utils.isFile(data) || 9850 utils.isBlob(data) 9851 ) { 9852 return data; 9853 } 9854 if (utils.isArrayBufferView(data)) { 9855 return data.buffer; 9856 } 9857 if (utils.isURLSearchParams(data)) { 9858 setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); 9859 return data.toString(); 9860 } 9861 9862 var isObjectPayload = utils.isObject(data); 9863 var contentType = headers && headers['Content-Type']; 9864 9865 var isFileList; 9866 9867 if ((isFileList = utils.isFileList(data)) || (isObjectPayload && contentType === 'multipart/form-data')) { 9868 var _FormData = this.env && this.env.FormData; 9869 return toFormData(isFileList ? {'files[]': data} : data, _FormData && new _FormData()); 9870 } else if (isObjectPayload || contentType === 'application/json') { 9871 setContentTypeIfUnset(headers, 'application/json'); 9872 return stringifySafely(data); 9873 } 9874 9875 return data; 9876 }], 9877 9878 transformResponse: [function transformResponse(data) { 9879 var transitional = this.transitional || defaults.transitional; 9880 var silentJSONParsing = transitional && transitional.silentJSONParsing; 9881 var forcedJSONParsing = transitional && transitional.forcedJSONParsing; 9882 var strictJSONParsing = !silentJSONParsing && this.responseType === 'json'; 9883 9884 if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) { 9885 try { 9886 return JSON.parse(data); 9887 } catch (e) { 9888 if (strictJSONParsing) { 9889 if (e.name === 'SyntaxError') { 9890 throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response); 9891 } 9892 throw e; 9893 } 9894 } 9895 } 9896 9897 return data; 9898 }], 9899 9900 /** 9901 * A timeout in milliseconds to abort a request. If set to 0 (default) a 9902 * timeout is not created. 9903 */ 9904 timeout: 0, 9905 9906 xsrfCookieName: 'XSRF-TOKEN', 9907 xsrfHeaderName: 'X-XSRF-TOKEN', 9908 9909 maxContentLength: -1, 9910 maxBodyLength: -1, 9911 9912 env: { 9913 FormData: __webpack_require__(/*! ./env/FormData */ "./node_modules/axios/lib/helpers/null.js") 9914 }, 9915 9916 validateStatus: function validateStatus(status) { 9917 return status >= 200 && status < 300; 9918 }, 9919 9920 headers: { 9921 common: { 9922 'Accept': 'application/json, text/plain, */*' 9923 } 9924 } 9925 }; 9926 9927 utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { 9928 defaults.headers[method] = {}; 9929 }); 9930 9931 utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { 9932 defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); 9933 }); 9934 9935 module.exports = defaults; 9936 9937 9938 /***/ }), 9939 9940
vendor: 522 bytes, lines 9940-9958
9940/***/ "./node_modules/axios/lib/defaults/transitional.js": 9941 /*!*********************************************************!*\ 9942 !*** ./node_modules/axios/lib/defaults/transitional.js ***! 9943 \*********************************************************/ 9944 /***/ (function(module) { 9945 9946 "use strict"; 9947 9948 9949 module.exports = { 9950 silentJSONParsing: true, 9951 forcedJSONParsing: true, 9952 clarifyTimeoutError: false 9953 }; 9954 9955 9956 /***/ }), 9957 9958
vendor: 352 bytes, lines 9958-9970
9958/***/ "./node_modules/axios/lib/env/data.js": 9959 /*!********************************************!*\ 9960 !*** ./node_modules/axios/lib/env/data.js ***! 9961 \********************************************/ 9962 /***/ (function(module) { 9963 9964 module.exports = { 9965 "version": "0.27.2" 9966 }; 9967 9968 /***/ }), 9969 9970
vendor: 690 bytes, lines 9970-9992
9970/***/ "./node_modules/axios/lib/helpers/bind.js": 9971 /*!************************************************!*\ 9972 !*** ./node_modules/axios/lib/helpers/bind.js ***! 9973 \************************************************/ 9974 /***/ (function(module) { 9975 9976 "use strict"; 9977 9978 9979 module.exports = function bind(fn, thisArg) { 9980 return function wrap() { 9981 var args = new Array(arguments.length); 9982 for (var i = 0; i < args.length; i++) { 9983 args[i] = arguments[i]; 9984 } 9985 return fn.apply(thisArg, args); 9986 }; 9987 }; 9988 9989 9990 /***/ }), 9991 9992
vendor: 2,948 bytes, lines 9992-10073
9992/***/ "./node_modules/axios/lib/helpers/buildURL.js": 9993 /*!****************************************************!*\ 9994 !*** ./node_modules/axios/lib/helpers/buildURL.js ***! 9995 \****************************************************/ 9996 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 9997 9998 "use strict"; 9999 10000 10001 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 10002 10003 function encode(val) { 10004 return encodeURIComponent(val). 10005 replace(/%3A/gi, ':'). 10006 replace(/%24/g, '$'). 10007 replace(/%2C/gi, ','). 10008 replace(/%20/g, '+'). 10009 replace(/%5B/gi, '['). 10010 replace(/%5D/gi, ']'); 10011 } 10012 10013 /** 10014 * Build a URL by appending params to the end 10015 * 10016 * @param {string} url The base of the url (e.g., http://www.google.com) 10017 * @param {object} [params] The params to be appended 10018 * @returns {string} The formatted url 10019 */ 10020 module.exports = function buildURL(url, params, paramsSerializer) { 10021 /*eslint no-param-reassign:0*/ 10022 if (!params) { 10023 return url; 10024 } 10025 10026 var serializedParams; 10027 if (paramsSerializer) { 10028 serializedParams = paramsSerializer(params); 10029 } else if (utils.isURLSearchParams(params)) { 10030 serializedParams = params.toString(); 10031 } else { 10032 var parts = []; 10033 10034 utils.forEach(params, function serialize(val, key) { 10035 if (val === null || typeof val === 'undefined') { 10036 return; 10037 } 10038 10039 if (utils.isArray(val)) { 10040 key = key + '[]'; 10041 } else { 10042 val = [val]; 10043 } 10044 10045 utils.forEach(val, function parseValue(v) { 10046 if (utils.isDate(v)) { 10047 v = v.toISOString(); 10048 } else if (utils.isObject(v)) { 10049 v = JSON.stringify(v); 10050 } 10051 parts.push(encode(key) + '=' + encode(v)); 10052 }); 10053 }); 10054 10055 serializedParams = parts.join('&'); 10056 } 10057 10058 if (serializedParams) { 10059 var hashmarkIndex = url.indexOf('#'); 10060 if (hashmarkIndex !== -1) { 10061 url = url.slice(0, hashmarkIndex); 10062 } 10063 10064 url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; 10065 } 10066 10067 return url; 10068 }; 10069 10070 10071 /***/ }), 10072 10073
vendor: 862 bytes, lines 10073-10098
10073/***/ "./node_modules/axios/lib/helpers/combineURLs.js": 10074 /*!*******************************************************!*\ 10075 !*** ./node_modules/axios/lib/helpers/combineURLs.js ***! 10076 \*******************************************************/ 10077 /***/ (function(module) { 10078 10079 "use strict"; 10080 10081 10082 /** 10083 * Creates a new URL by combining the specified URLs 10084 * 10085 * @param {string} baseURL The base URL 10086 * @param {string} relativeURL The relative URL 10087 * @returns {string} The combined URL 10088 */ 10089 module.exports = function combineURLs(baseURL, relativeURL) { 10090 return relativeURL 10091 ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') 10092 : baseURL; 10093 }; 10094 10095 10096 /***/ }), 10097 10098
vendor: 2,653 bytes, lines 10098-10162
10098/***/ "./node_modules/axios/lib/helpers/cookies.js": 10099 /*!***************************************************!*\ 10100 !*** ./node_modules/axios/lib/helpers/cookies.js ***! 10101 \***************************************************/ 10102 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 10103 10104 "use strict"; 10105 10106 10107 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 10108 10109 module.exports = ( 10110 utils.isStandardBrowserEnv() ? 10111 10112 // Standard browser envs support document.cookie 10113 (function standardBrowserEnv() { 10114 return { 10115 write: function write(name, value, expires, path, domain, secure) { 10116 var cookie = []; 10117 cookie.push(name + '=' + encodeURIComponent(value)); 10118 10119 if (utils.isNumber(expires)) { 10120 cookie.push('expires=' + new Date(expires).toGMTString()); 10121 } 10122 10123 if (utils.isString(path)) { 10124 cookie.push('path=' + path); 10125 } 10126 10127 if (utils.isString(domain)) { 10128 cookie.push('domain=' + domain); 10129 } 10130 10131 if (secure === true) { 10132 cookie.push('secure'); 10133 } 10134 10135 document.cookie = cookie.join('; '); 10136 }, 10137 10138 read: function read(name) { 10139 var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); 10140 return (match ? decodeURIComponent(match[3]) : null); 10141 }, 10142 10143 remove: function remove(name) { 10144 this.write(name, '', Date.now() - 86400000); 10145 } 10146 }; 10147 })() : 10148 10149 // Non standard browser env (web workers, react-native) lack needed support. 10150 (function nonStandardBrowserEnv() { 10151 return { 10152 write: function write() {}, 10153 read: function read() { return null; }, 10154 remove: function remove() {} 10155 }; 10156 })() 10157 ); 10158 10159 10160 /***/ }), 10161 10162
vendor: 1,049 bytes, lines 10162-10187
10162/***/ "./node_modules/axios/lib/helpers/isAbsoluteURL.js": 10163 /*!*********************************************************!*\ 10164 !*** ./node_modules/axios/lib/helpers/isAbsoluteURL.js ***! 10165 \*********************************************************/ 10166 /***/ (function(module) { 10167 10168 "use strict"; 10169 10170 10171 /** 10172 * Determines whether the specified URL is absolute 10173 * 10174 * @param {string} url The URL to test 10175 * @returns {boolean} True if the specified URL is absolute, otherwise false 10176 */ 10177 module.exports = function isAbsoluteURL(url) { 10178 // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL). 10179 // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed 10180 // by any combination of letters, digits, plus, period, or hyphen. 10181 return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); 10182 }; 10183 10184 10185 /***/ }), 10186 10187
vendor: 927 bytes, lines 10187-10211
10187/***/ "./node_modules/axios/lib/helpers/isAxiosError.js": 10188 /*!********************************************************!*\ 10189 !*** ./node_modules/axios/lib/helpers/isAxiosError.js ***! 10190 \********************************************************/ 10191 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 10192 10193 "use strict"; 10194 10195 10196 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 10197 10198 /** 10199 * Determines whether the payload is an error thrown by Axios 10200 * 10201 * @param {*} payload The value to test 10202 * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false 10203 */ 10204 module.exports = function isAxiosError(payload) { 10205 return utils.isObject(payload) && (payload.isAxiosError === true); 10206 }; 10207 10208 10209 /***/ }), 10210 10211
vendor: 3,855 bytes, lines 10211-10290
10211/***/ "./node_modules/axios/lib/helpers/isURLSameOrigin.js": 10212 /*!***********************************************************!*\ 10213 !*** ./node_modules/axios/lib/helpers/isURLSameOrigin.js ***! 10214 \***********************************************************/ 10215 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 10216 10217 "use strict"; 10218 10219 10220 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 10221 10222 module.exports = ( 10223 utils.isStandardBrowserEnv() ? 10224 10225 // Standard browser envs have full support of the APIs needed to test 10226 // whether the request URL is of the same origin as current location. 10227 (function standardBrowserEnv() { 10228 var msie = /(msie|trident)/i.test(navigator.userAgent); 10229 var urlParsingNode = document.createElement('a'); 10230 var originURL; 10231 10232 /** 10233 * Parse a URL to discover it's components 10234 * 10235 * @param {String} url The URL to be parsed 10236 * @returns {Object} 10237 */ 10238 function resolveURL(url) { 10239 var href = url; 10240 10241 if (msie) { 10242 // IE needs attribute set twice to normalize properties 10243 urlParsingNode.setAttribute('href', href); 10244 href = urlParsingNode.href; 10245 } 10246 10247 urlParsingNode.setAttribute('href', href); 10248 10249 // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils 10250 return { 10251 href: urlParsingNode.href, 10252 protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', 10253 host: urlParsingNode.host, 10254 search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', 10255 hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', 10256 hostname: urlParsingNode.hostname, 10257 port: urlParsingNode.port, 10258 pathname: (urlParsingNode.pathname.charAt(0) === '/') ? 10259 urlParsingNode.pathname : 10260 '/' + urlParsingNode.pathname 10261 }; 10262 } 10263 10264 originURL = resolveURL(window.location.href); 10265 10266 /** 10267 * Determine if a URL shares the same origin as the current location 10268 * 10269 * @param {String} requestURL The URL to test 10270 * @returns {boolean} True if URL shares the same origin, otherwise false 10271 */ 10272 return function isURLSameOrigin(requestURL) { 10273 var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; 10274 return (parsed.protocol === originURL.protocol && 10275 parsed.host === originURL.host); 10276 }; 10277 })() : 10278 10279 // Non standard browser envs (web workers, react-native) lack needed support. 10280 (function nonStandardBrowserEnv() { 10281 return function isURLSameOrigin() { 10282 return true; 10283 }; 10284 })() 10285 ); 10286 10287 10288 /***/ }), 10289 10290
vendor: 949 bytes, lines 10290-10313
10290/***/ "./node_modules/axios/lib/helpers/normalizeHeaderName.js": 10291 /*!***************************************************************!*\ 10292 !*** ./node_modules/axios/lib/helpers/normalizeHeaderName.js ***! 10293 \***************************************************************/ 10294 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 10295 10296 "use strict"; 10297 10298 10299 var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); 10300 10301 module.exports = function normalizeHeaderName(headers, normalizedName) { 10302 utils.forEach(headers, function processHeader(value, name) { 10303 if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { 10304 headers[normalizedName] = value; 10305 delete headers[name]; 10306 } 10307 }); 10308 }; 10309 10310 10311 /***/ }), 10312 10313
vendor: 357 bytes, lines 10313-10325
10313/***/ "./node_modules/axios/lib/helpers/null.js": 10314 /*!************************************************!*\ 10315 !*** ./node_modules/axios/lib/helpers/null.js ***! 10316 \************************************************/ 10317 /***/ (function(module) { 10318 10319// eslint-disable-next-line strict 10320 module.exports = null; 10321 10322 10323 /***/ }), 10324 10325
vendor: 2,439 bytes, lines 10325-10389
10325/***/ "./node_modules/axios/lib/helpers/parseHeaders.js": 10326 /*!********************************************************!*\ 10327 !*** ./node_modules/axios/lib/helpers/parseHeaders.js ***! 10328 \********************************************************/ 10329 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 10330 10331 "use strict"; 10332 10333 10334 var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); 10335 10336// Headers whose duplicates are ignored by node 10337// c.f. https://nodejs.org/api/http.html#http_message_headers 10338 var ignoreDuplicateOf = [ 10339 'age', 'authorization', 'content-length', 'content-type', 'etag', 10340 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 10341 'last-modified', 'location', 'max-forwards', 'proxy-authorization', 10342 'referer', 'retry-after', 'user-agent' 10343 ]; 10344 10345 /** 10346 * Parse headers into an object 10347 * 10348 * ``` 10349 * Date: Wed, 27 Aug 2014 08:58:49 GMT 10350 * Content-Type: application/json 10351 * Connection: keep-alive 10352 * Transfer-Encoding: chunked 10353 * ``` 10354 * 10355 * @param {String} headers Headers needing to be parsed 10356 * @returns {Object} Headers parsed into an object 10357 */ 10358 module.exports = function parseHeaders(headers) { 10359 var parsed = {}; 10360 var key; 10361 var val; 10362 var i; 10363 10364 if (!headers) { return parsed; } 10365 10366 utils.forEach(headers.split('\n'), function parser(line) { 10367 i = line.indexOf(':'); 10368 key = utils.trim(line.substr(0, i)).toLowerCase(); 10369 val = utils.trim(line.substr(i + 1)); 10370 10371 if (key) { 10372 if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { 10373 return; 10374 } 10375 if (key === 'set-cookie') { 10376 parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); 10377 } else { 10378 parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; 10379 } 10380 } 10381 }); 10382 10383 return parsed; 10384 }; 10385 10386 10387 /***/ }), 10388 10389
vendor: 540 bytes, lines 10389-10406
10389/***/ "./node_modules/axios/lib/helpers/parseProtocol.js": 10390 /*!*********************************************************!*\ 10391 !*** ./node_modules/axios/lib/helpers/parseProtocol.js ***! 10392 \*********************************************************/ 10393 /***/ (function(module) { 10394 10395 "use strict"; 10396 10397 10398 module.exports = function parseProtocol(url) { 10399 var match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); 10400 return match && match[1] || ''; 10401 }; 10402 10403 10404 /***/ }), 10405 10406
vendor: 1,180 bytes, lines 10406-10444
10406/***/ "./node_modules/axios/lib/helpers/spread.js": 10407 /*!**************************************************!*\ 10408 !*** ./node_modules/axios/lib/helpers/spread.js ***! 10409 \**************************************************/ 10410 /***/ (function(module) { 10411 10412 "use strict"; 10413 10414 10415 /** 10416 * Syntactic sugar for invoking a function and expanding an array for arguments. 10417 * 10418 * Common use case would be to use `Function.prototype.apply`. 10419 * 10420 * ```js 10421 * function f(x, y, z) {} 10422 * var args = [1, 2, 3]; 10423 * f.apply(null, args); 10424 * ``` 10425 * 10426 * With `spread` this example can be re-written. 10427 * 10428 * ```js 10429 * spread(function(x, y, z) {})([1, 2, 3]); 10430 * ``` 10431 * 10432 * @param {Function} callback 10433 * @returns {Function} 10434 */ 10435 module.exports = function spread(callback) { 10436 return function wrap(arr) { 10437 return callback.apply(null, arr); 10438 }; 10439 }; 10440 10441 10442 /***/ }), 10443 10444
vendor: 3,266 bytes, lines 10444-10528
10444/***/ "./node_modules/axios/lib/helpers/toFormData.js": 10445 /*!******************************************************!*\ 10446 !*** ./node_modules/axios/lib/helpers/toFormData.js ***! 10447 \******************************************************/ 10448 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 10449 10450 "use strict"; 10451 /* provided dependency */ var Buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js")["Buffer"]; 10452 10453 10454 var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); 10455 10456 /** 10457 * Convert a data object to FormData 10458 * @param {Object} obj 10459 * @param {?Object} [formData] 10460 * @returns {Object} 10461 **/ 10462 10463 function toFormData(obj, formData) { 10464 // eslint-disable-next-line no-param-reassign 10465 formData = formData || new FormData(); 10466 10467 var stack = []; 10468 10469 function convertValue(value) { 10470 if (value === null) return ''; 10471 10472 if (utils.isDate(value)) { 10473 return value.toISOString(); 10474 } 10475 10476 if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) { 10477 return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value); 10478 } 10479 10480 return value; 10481 } 10482 10483 function build(data, parentKey) { 10484 if (utils.isPlainObject(data) || utils.isArray(data)) { 10485 if (stack.indexOf(data) !== -1) { 10486 throw Error('Circular reference detected in ' + parentKey); 10487 } 10488 10489 stack.push(data); 10490 10491 utils.forEach(data, function each(value, key) { 10492 if (utils.isUndefined(value)) return; 10493 var fullKey = parentKey ? parentKey + '.' + key : key; 10494 var arr; 10495 10496 if (value && !parentKey && typeof value === 'object') { 10497 if (utils.endsWith(key, '{}')) { 10498 // eslint-disable-next-line no-param-reassign 10499 value = JSON.stringify(value); 10500 } else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) { 10501 // eslint-disable-next-line func-names 10502 arr.forEach(function(el) { 10503 !utils.isUndefined(el) && formData.append(fullKey, convertValue(el)); 10504 }); 10505 return; 10506 } 10507 } 10508 10509 build(value, fullKey); 10510 }); 10511 10512 stack.pop(); 10513 } else { 10514 formData.append(parentKey, convertValue(data)); 10515 } 10516 } 10517 10518 build(obj); 10519 10520 return formData; 10521 } 10522 10523 module.exports = toFormData; 10524 10525 10526 /***/ }), 10527 10528
vendor: 4,137 bytes, lines 10528-10625
10528/***/ "./node_modules/axios/lib/helpers/validator.js": 10529 /*!*****************************************************!*\ 10530 !*** ./node_modules/axios/lib/helpers/validator.js ***! 10531 \*****************************************************/ 10532 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 10533 10534 "use strict"; 10535 10536 10537 var VERSION = (__webpack_require__(/*! ../env/data */ "./node_modules/axios/lib/env/data.js").version); 10538 var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js"); 10539 10540 var validators = {}; 10541 10542// eslint-disable-next-line func-names 10543 ['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) { 10544 validators[type] = function validator(thing) { 10545 return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type; 10546 }; 10547 }); 10548 10549 var deprecatedWarnings = {}; 10550 10551 /** 10552 * Transitional option validator 10553 * @param {function|boolean?} validator - set to false if the transitional option has been removed 10554 * @param {string?} version - deprecated version / removed since version 10555 * @param {string?} message - some message with additional info 10556 * @returns {function} 10557 */ 10558 validators.transitional = function transitional(validator, version, message) { 10559 function formatMessage(opt, desc) { 10560 return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); 10561 } 10562 10563 // eslint-disable-next-line func-names 10564 return function(value, opt, opts) { 10565 if (validator === false) { 10566 throw new AxiosError( 10567 formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), 10568 AxiosError.ERR_DEPRECATED 10569 ); 10570 } 10571 10572 if (version && !deprecatedWarnings[opt]) { 10573 deprecatedWarnings[opt] = true; 10574 // eslint-disable-next-line no-console 10575 console.warn( 10576 formatMessage( 10577 opt, 10578 ' has been deprecated since v' + version + ' and will be removed in the near future' 10579 ) 10580 ); 10581 } 10582 10583 return validator ? validator(value, opt, opts) : true; 10584 }; 10585 }; 10586 10587 /** 10588 * Assert object's properties type 10589 * @param {object} options 10590 * @param {object} schema 10591 * @param {boolean?} allowUnknown 10592 */ 10593 10594 function assertOptions(options, schema, allowUnknown) { 10595 if (typeof options !== 'object') { 10596 throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE); 10597 } 10598 var keys = Object.keys(options); 10599 var i = keys.length; 10600 while (i-- > 0) { 10601 var opt = keys[i]; 10602 var validator = schema[opt]; 10603 if (validator) { 10604 var value = options[opt]; 10605 var result = value === undefined || validator(value, opt, options); 10606 if (result !== true) { 10607 throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE); 10608 } 10609 continue; 10610 } 10611 if (allowUnknown !== true) { 10612 throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION); 10613 } 10614 } 10615 } 10616 10617 module.exports = { 10618 assertOptions: assertOptions, 10619 validators: validators 10620 }; 10621 10622 10623 /***/ }), 10624 10625
vendor: 17,754 bytes, lines 10625-11106
10625/***/ "./node_modules/axios/lib/utils.js": 10626 /*!*****************************************!*\ 10627 !*** ./node_modules/axios/lib/utils.js ***! 10628 \*****************************************/ 10629 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 10630 10631 "use strict"; 10632 10633 10634 var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); 10635 10636// utils is a library of generic helper functions non-specific to axios 10637 10638 var toString = Object.prototype.toString; 10639 10640// eslint-disable-next-line func-names 10641 var kindOf = (function(cache) { 10642 // eslint-disable-next-line func-names 10643 return function(thing) { 10644 var str = toString.call(thing); 10645 return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); 10646 }; 10647 })(Object.create(null)); 10648 10649 function kindOfTest(type) { 10650 type = type.toLowerCase(); 10651 return function isKindOf(thing) { 10652 return kindOf(thing) === type; 10653 }; 10654 } 10655 10656 /** 10657 * Determine if a value is an Array 10658 * 10659 * @param {Object} val The value to test 10660 * @returns {boolean} True if value is an Array, otherwise false 10661 */ 10662 function isArray(val) { 10663 return Array.isArray(val); 10664 } 10665 10666 /** 10667 * Determine if a value is undefined 10668 * 10669 * @param {Object} val The value to test 10670 * @returns {boolean} True if the value is undefined, otherwise false 10671 */ 10672 function isUndefined(val) { 10673 return typeof val === 'undefined'; 10674 } 10675 10676 /** 10677 * Determine if a value is a Buffer 10678 * 10679 * @param {Object} val The value to test 10680 * @returns {boolean} True if value is a Buffer, otherwise false 10681 */ 10682 function isBuffer(val) { 10683 return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) 10684 && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); 10685 } 10686 10687 /** 10688 * Determine if a value is an ArrayBuffer 10689 * 10690 * @function 10691 * @param {Object} val The value to test 10692 * @returns {boolean} True if value is an ArrayBuffer, otherwise false 10693 */ 10694 var isArrayBuffer = kindOfTest('ArrayBuffer'); 10695 10696 10697 /** 10698 * Determine if a value is a view on an ArrayBuffer 10699 * 10700 * @param {Object} val The value to test 10701 * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false 10702 */ 10703 function isArrayBufferView(val) { 10704 var result; 10705 if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { 10706 result = ArrayBuffer.isView(val); 10707 } else { 10708 result = (val) && (val.buffer) && (isArrayBuffer(val.buffer)); 10709 } 10710 return result; 10711 } 10712 10713 /** 10714 * Determine if a value is a String 10715 * 10716 * @param {Object} val The value to test 10717 * @returns {boolean} True if value is a String, otherwise false 10718 */ 10719 function isString(val) { 10720 return typeof val === 'string'; 10721 } 10722 10723 /** 10724 * Determine if a value is a Number 10725 * 10726 * @param {Object} val The value to test 10727 * @returns {boolean} True if value is a Number, otherwise false 10728 */ 10729 function isNumber(val) { 10730 return typeof val === 'number'; 10731 } 10732 10733 /** 10734 * Determine if a value is an Object 10735 * 10736 * @param {Object} val The value to test 10737 * @returns {boolean} True if value is an Object, otherwise false 10738 */ 10739 function isObject(val) { 10740 return val !== null && typeof val === 'object'; 10741 } 10742 10743 /** 10744 * Determine if a value is a plain Object 10745 * 10746 * @param {Object} val The value to test 10747 * @return {boolean} True if value is a plain Object, otherwise false 10748 */ 10749 function isPlainObject(val) { 10750 if (kindOf(val) !== 'object') { 10751 return false; 10752 } 10753 10754 var prototype = Object.getPrototypeOf(val); 10755 return prototype === null || prototype === Object.prototype; 10756 } 10757 10758 /** 10759 * Determine if a value is a Date 10760 * 10761 * @function 10762 * @param {Object} val The value to test 10763 * @returns {boolean} True if value is a Date, otherwise false 10764 */ 10765 var isDate = kindOfTest('Date'); 10766 10767 /** 10768 * Determine if a value is a File 10769 * 10770 * @function 10771 * @param {Object} val The value to test 10772 * @returns {boolean} True if value is a File, otherwise false 10773 */ 10774 var isFile = kindOfTest('File'); 10775 10776 /** 10777 * Determine if a value is a Blob 10778 * 10779 * @function 10780 * @param {Object} val The value to test 10781 * @returns {boolean} True if value is a Blob, otherwise false 10782 */ 10783 var isBlob = kindOfTest('Blob'); 10784 10785 /** 10786 * Determine if a value is a FileList 10787 * 10788 * @function 10789 * @param {Object} val The value to test 10790 * @returns {boolean} True if value is a File, otherwise false 10791 */ 10792 var isFileList = kindOfTest('FileList'); 10793 10794 /** 10795 * Determine if a value is a Function 10796 * 10797 * @param {Object} val The value to test 10798 * @returns {boolean} True if value is a Function, otherwise false 10799 */ 10800 function isFunction(val) { 10801 return toString.call(val) === '[object Function]'; 10802 } 10803 10804 /** 10805 * Determine if a value is a Stream 10806 * 10807 * @param {Object} val The value to test 10808 * @returns {boolean} True if value is a Stream, otherwise false 10809 */ 10810 function isStream(val) { 10811 return isObject(val) && isFunction(val.pipe); 10812 } 10813 10814 /** 10815 * Determine if a value is a FormData 10816 * 10817 * @param {Object} thing The value to test 10818 * @returns {boolean} True if value is an FormData, otherwise false 10819 */ 10820 function isFormData(thing) { 10821 var pattern = '[object FormData]'; 10822 return thing && ( 10823 (typeof FormData === 'function' && thing instanceof FormData) || 10824 toString.call(thing) === pattern || 10825 (isFunction(thing.toString) && thing.toString() === pattern) 10826 ); 10827 } 10828 10829 /** 10830 * Determine if a value is a URLSearchParams object 10831 * @function 10832 * @param {Object} val The value to test 10833 * @returns {boolean} True if value is a URLSearchParams object, otherwise false 10834 */ 10835 var isURLSearchParams = kindOfTest('URLSearchParams'); 10836 10837 /** 10838 * Trim excess whitespace off the beginning and end of a string 10839 * 10840 * @param {String} str The String to trim 10841 * @returns {String} The String freed of excess whitespace 10842 */ 10843 function trim(str) { 10844 return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); 10845 } 10846 10847 /** 10848 * Determine if we're running in a standard browser environment 10849 * 10850 * This allows axios to run in a web worker, and react-native. 10851 * Both environments support XMLHttpRequest, but not fully standard globals. 10852 * 10853 * web workers: 10854 * typeof window -> undefined 10855 * typeof document -> undefined 10856 * 10857 * react-native: 10858 * navigator.product -> 'ReactNative' 10859 * nativescript 10860 * navigator.product -> 'NativeScript' or 'NS' 10861 */ 10862 function isStandardBrowserEnv() { 10863 if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || 10864 navigator.product === 'NativeScript' || 10865 navigator.product === 'NS')) { 10866 return false; 10867 } 10868 return ( 10869 typeof window !== 'undefined' && 10870 typeof document !== 'undefined' 10871 ); 10872 } 10873 10874 /** 10875 * Iterate over an Array or an Object invoking a function for each item. 10876 * 10877 * If `obj` is an Array callback will be called passing 10878 * the value, index, and complete array for each item. 10879 * 10880 * If 'obj' is an Object callback will be called passing 10881 * the value, key, and complete object for each property. 10882 * 10883 * @param {Object|Array} obj The object to iterate 10884 * @param {Function} fn The callback to invoke for each item 10885 */ 10886 function forEach(obj, fn) { 10887 // Don't bother if no value provided 10888 if (obj === null || typeof obj === 'undefined') { 10889 return; 10890 } 10891 10892 // Force an array if not already something iterable 10893 if (typeof obj !== 'object') { 10894 /*eslint no-param-reassign:0*/ 10895 obj = [obj]; 10896 } 10897 10898 if (isArray(obj)) { 10899 // Iterate over array values 10900 for (var i = 0, l = obj.length; i < l; i++) { 10901 fn.call(null, obj[i], i, obj); 10902 } 10903 } else { 10904 // Iterate over object keys 10905 for (var key in obj) { 10906 if (Object.prototype.hasOwnProperty.call(obj, key)) { 10907 fn.call(null, obj[key], key, obj); 10908 } 10909 } 10910 } 10911 } 10912 10913 /** 10914 * Accepts varargs expecting each argument to be an object, then 10915 * immutably merges the properties of each object and returns result. 10916 * 10917 * When multiple objects contain the same key the later object in 10918 * the arguments list will take precedence. 10919 * 10920 * Example: 10921 * 10922 * ```js 10923 * var result = merge({foo: 123}, {foo: 456}); 10924 * console.log(result.foo); // outputs 456 10925 * ``` 10926 * 10927 * @param {Object} obj1 Object to merge 10928 * @returns {Object} Result of all merge properties 10929 */ 10930 function merge(/* obj1, obj2, obj3, ... */) { 10931 var result = {}; 10932 function assignValue(val, key) { 10933 if (isPlainObject(result[key]) && isPlainObject(val)) { 10934 result[key] = merge(result[key], val); 10935 } else if (isPlainObject(val)) { 10936 result[key] = merge({}, val); 10937 } else if (isArray(val)) { 10938 result[key] = val.slice(); 10939 } else { 10940 result[key] = val; 10941 } 10942 } 10943 10944 for (var i = 0, l = arguments.length; i < l; i++) { 10945 forEach(arguments[i], assignValue); 10946 } 10947 return result; 10948 } 10949 10950 /** 10951 * Extends object a by mutably adding to it the properties of object b. 10952 * 10953 * @param {Object} a The object to be extended 10954 * @param {Object} b The object to copy properties from 10955 * @param {Object} thisArg The object to bind function to 10956 * @return {Object} The resulting value of object a 10957 */ 10958 function extend(a, b, thisArg) { 10959 forEach(b, function assignValue(val, key) { 10960 if (thisArg && typeof val === 'function') { 10961 a[key] = bind(val, thisArg); 10962 } else { 10963 a[key] = val; 10964 } 10965 }); 10966 return a; 10967 } 10968 10969 /** 10970 * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) 10971 * 10972 * @param {string} content with BOM 10973 * @return {string} content value without BOM 10974 */ 10975 function stripBOM(content) { 10976 if (content.charCodeAt(0) === 0xFEFF) { 10977 content = content.slice(1); 10978 } 10979 return content; 10980 } 10981 10982 /** 10983 * Inherit the prototype methods from one constructor into another 10984 * @param {function} constructor 10985 * @param {function} superConstructor 10986 * @param {object} [props] 10987 * @param {object} [descriptors] 10988 */ 10989 10990 function inherits(constructor, superConstructor, props, descriptors) { 10991 constructor.prototype = Object.create(superConstructor.prototype, descriptors); 10992 constructor.prototype.constructor = constructor; 10993 props && Object.assign(constructor.prototype, props); 10994 } 10995 10996 /** 10997 * Resolve object with deep prototype chain to a flat object 10998 * @param {Object} sourceObj source object 10999 * @param {Object} [destObj] 11000 * @param {Function} [filter] 11001 * @returns {Object} 11002 */ 11003 11004 function toFlatObject(sourceObj, destObj, filter) { 11005 var props; 11006 var i; 11007 var prop; 11008 var merged = {}; 11009 11010 destObj = destObj || {}; 11011 11012 do { 11013 props = Object.getOwnPropertyNames(sourceObj); 11014 i = props.length; 11015 while (i-- > 0) { 11016 prop = props[i]; 11017 if (!merged[prop]) { 11018 destObj[prop] = sourceObj[prop]; 11019 merged[prop] = true; 11020 } 11021 } 11022 sourceObj = Object.getPrototypeOf(sourceObj); 11023 } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype); 11024 11025 return destObj; 11026 } 11027 11028 /* 11029 * determines whether a string ends with the characters of a specified string 11030 * @param {String} str 11031 * @param {String} searchString 11032 * @param {Number} [position= 0] 11033 * @returns {boolean} 11034 */ 11035 function endsWith(str, searchString, position) { 11036 str = String(str); 11037 if (position === undefined || position > str.length) { 11038 position = str.length; 11039 } 11040 position -= searchString.length; 11041 var lastIndex = str.indexOf(searchString, position); 11042 return lastIndex !== -1 && lastIndex === position; 11043 } 11044 11045 11046 /** 11047 * Returns new array from array like object 11048 * @param {*} [thing] 11049 * @returns {Array} 11050 */ 11051 function toArray(thing) { 11052 if (!thing) return null; 11053 var i = thing.length; 11054 if (isUndefined(i)) return null; 11055 var arr = new Array(i); 11056 while (i-- > 0) { 11057 arr[i] = thing[i]; 11058 } 11059 return arr; 11060 } 11061 11062// eslint-disable-next-line func-names 11063 var isTypedArray = (function(TypedArray) { 11064 // eslint-disable-next-line func-names 11065 return function(thing) { 11066 return TypedArray && thing instanceof TypedArray; 11067 }; 11068 })(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array)); 11069 11070 module.exports = { 11071 isArray: isArray, 11072 isArrayBuffer: isArrayBuffer, 11073 isBuffer: isBuffer, 11074 isFormData: isFormData, 11075 isArrayBufferView: isArrayBufferView, 11076 isString: isString, 11077 isNumber: isNumber, 11078 isObject: isObject, 11079 isPlainObject: isPlainObject, 11080 isUndefined: isUndefined, 11081 isDate: isDate, 11082 isFile: isFile, 11083 isBlob: isBlob, 11084 isFunction: isFunction, 11085 isStream: isStream, 11086 isURLSearchParams: isURLSearchParams, 11087 isStandardBrowserEnv: isStandardBrowserEnv, 11088 forEach: forEach, 11089 merge: merge, 11090 extend: extend, 11091 trim: trim, 11092 stripBOM: stripBOM, 11093 inherits: inherits, 11094 toFlatObject: toFlatObject, 11095 kindOf: kindOf, 11096 kindOfTest: kindOfTest, 11097 endsWith: endsWith, 11098 toArray: toArray, 11099 isTypedArray: isTypedArray, 11100 isFileList: isFileList 11101 }; 11102 11103 11104 /***/ }), 11105 11106
vendor: 6,003 bytes, lines 11106-11267
11106/***/ "./node_modules/base64-js/index.js": 11107 /*!*****************************************!*\ 11108 !*** ./node_modules/base64-js/index.js ***! 11109 \*****************************************/ 11110 /***/ (function(__unused_webpack_module, exports) { 11111 11112 "use strict"; 11113 11114 11115 exports.byteLength = byteLength 11116 exports.toByteArray = toByteArray 11117 exports.fromByteArray = fromByteArray 11118 11119 var lookup = [] 11120 var revLookup = [] 11121 var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array 11122 11123 var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' 11124 for (var i = 0, len = code.length; i < len; ++i) { 11125 lookup[i] = code[i] 11126 revLookup[code.charCodeAt(i)] = i 11127 } 11128 11129// Support decoding URL-safe base64 strings, as Node.js does. 11130// See: https://en.wikipedia.org/wiki/Base64#URL_applications 11131 revLookup['-'.charCodeAt(0)] = 62 11132 revLookup['_'.charCodeAt(0)] = 63 11133 11134 function getLens (b64) { 11135 var len = b64.length 11136 11137 if (len % 4 > 0) { 11138 throw new Error('Invalid string. Length must be a multiple of 4') 11139 } 11140 11141 // Trim off extra bytes after placeholder bytes are found 11142 // See: https://github.com/beatgammit/base64-js/issues/42 11143 var validLen = b64.indexOf('=') 11144 if (validLen === -1) validLen = len 11145 11146 var placeHoldersLen = validLen === len 11147 ? 0 11148 : 4 - (validLen % 4) 11149 11150 return [validLen, placeHoldersLen] 11151 } 11152 11153// base64 is 4/3 + up to two characters of the original data 11154 function byteLength (b64) { 11155 var lens = getLens(b64) 11156 var validLen = lens[0] 11157 var placeHoldersLen = lens[1] 11158 return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen 11159 } 11160 11161 function _byteLength (b64, validLen, placeHoldersLen) { 11162 return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen 11163 } 11164 11165 function toByteArray (b64) { 11166 var tmp 11167 var lens = getLens(b64) 11168 var validLen = lens[0] 11169 var placeHoldersLen = lens[1] 11170 11171 var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) 11172 11173 var curByte = 0 11174 11175 // if there are placeholders, only get up to the last complete 4 chars 11176 var len = placeHoldersLen > 0 11177 ? validLen - 4 11178 : validLen 11179 11180 var i 11181 for (i = 0; i < len; i += 4) { 11182 tmp = 11183 (revLookup[b64.charCodeAt(i)] << 18) | 11184 (revLookup[b64.charCodeAt(i + 1)] << 12) | 11185 (revLookup[b64.charCodeAt(i + 2)] << 6) | 11186 revLookup[b64.charCodeAt(i + 3)] 11187 arr[curByte++] = (tmp >> 16) & 0xFF 11188 arr[curByte++] = (tmp >> 8) & 0xFF 11189 arr[curByte++] = tmp & 0xFF 11190 } 11191 11192 if (placeHoldersLen === 2) { 11193 tmp = 11194 (revLookup[b64.charCodeAt(i)] << 2) | 11195 (revLookup[b64.charCodeAt(i + 1)] >> 4) 11196 arr[curByte++] = tmp & 0xFF 11197 } 11198 11199 if (placeHoldersLen === 1) { 11200 tmp = 11201 (revLookup[b64.charCodeAt(i)] << 10) | 11202 (revLookup[b64.charCodeAt(i + 1)] << 4) | 11203 (revLookup[b64.charCodeAt(i + 2)] >> 2) 11204 arr[curByte++] = (tmp >> 8) & 0xFF 11205 arr[curByte++] = tmp & 0xFF 11206 } 11207 11208 return arr 11209 } 11210 11211 function tripletToBase64 (num) { 11212 return lookup[num >> 18 & 0x3F] + 11213 lookup[num >> 12 & 0x3F] + 11214 lookup[num >> 6 & 0x3F] + 11215 lookup[num & 0x3F] 11216 } 11217 11218 function encodeChunk (uint8, start, end) { 11219 var tmp 11220 var output = [] 11221 for (var i = start; i < end; i += 3) { 11222 tmp = 11223 ((uint8[i] << 16) & 0xFF0000) + 11224 ((uint8[i + 1] << 8) & 0xFF00) + 11225 (uint8[i + 2] & 0xFF) 11226 output.push(tripletToBase64(tmp)) 11227 } 11228 return output.join('') 11229 } 11230 11231 function fromByteArray (uint8) { 11232 var tmp 11233 var len = uint8.length 11234 var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes 11235 var parts = [] 11236 var maxChunkLength = 16383 // must be multiple of 3 11237 11238 // go through the array every three bytes, we'll deal with trailing stuff later 11239 for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { 11240 parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) 11241 } 11242 11243 // pad the end with zeros, but make sure to not forget the extra bytes 11244 if (extraBytes === 1) { 11245 tmp = uint8[len - 1] 11246 parts.push( 11247 lookup[tmp >> 2] + 11248 lookup[(tmp << 4) & 0x3F] + 11249 '==' 11250 ) 11251 } else if (extraBytes === 2) { 11252 tmp = (uint8[len - 2] << 8) + uint8[len - 1] 11253 parts.push( 11254 lookup[tmp >> 10] + 11255 lookup[(tmp >> 4) & 0x3F] + 11256 lookup[(tmp << 2) & 0x3F] + 11257 '=' 11258 ) 11259 } 11260 11261 return parts.join('') 11262 } 11263 11264 11265 /***/ }), 11266 11267
vendor: 4,200 bytes, lines 11267-11360
11267/***/ "./node_modules/bootstrap/js/dist/base-component.js": 11268 /*!**********************************************************!*\ 11269 !*** ./node_modules/bootstrap/js/dist/base-component.js ***! 11270 \**********************************************************/ 11271 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 11272 11273 /*! 11274 * Bootstrap base-component.js v5.3.3 (https://getbootstrap.com/) 11275 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 11276 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11277 */ 11278 (function (global, factory) { 11279 true ? module.exports = factory(__webpack_require__(/*! ./dom/data.js */ "./node_modules/bootstrap/js/dist/dom/data.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./util/config.js */ "./node_modules/bootstrap/js/dist/util/config.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) : 11280 0; 11281 })(this, (function (Data, EventHandler, Config, index_js) { 'use strict'; 11282 11283 /** 11284 * -------------------------------------------------------------------------- 11285 * Bootstrap base-component.js 11286 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11287 * -------------------------------------------------------------------------- 11288 */ 11289 11290 11291 /** 11292 * Constants 11293 */ 11294 11295 const VERSION = '5.3.3'; 11296 11297 /** 11298 * Class definition 11299 */ 11300 11301 class BaseComponent extends Config { 11302 constructor(element, config) { 11303 super(); 11304 element = index_js.getElement(element); 11305 if (!element) { 11306 return; 11307 } 11308 this._element = element; 11309 this._config = this._getConfig(config); 11310 Data.set(this._element, this.constructor.DATA_KEY, this); 11311 } 11312 11313 // Public 11314 dispose() { 11315 Data.remove(this._element, this.constructor.DATA_KEY); 11316 EventHandler.off(this._element, this.constructor.EVENT_KEY); 11317 for (const propertyName of Object.getOwnPropertyNames(this)) { 11318 this[propertyName] = null; 11319 } 11320 } 11321 _queueCallback(callback, element, isAnimated = true) { 11322 index_js.executeAfterTransition(callback, element, isAnimated); 11323 } 11324 _getConfig(config) { 11325 config = this._mergeConfigObj(config, this._element); 11326 config = this._configAfterMerge(config); 11327 this._typeCheckConfig(config); 11328 return config; 11329 } 11330 11331 // Static 11332 static getInstance(element) { 11333 return Data.get(index_js.getElement(element), this.DATA_KEY); 11334 } 11335 static getOrCreateInstance(element, config = {}) { 11336 return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null); 11337 } 11338 static get VERSION() { 11339 return VERSION; 11340 } 11341 static get DATA_KEY() { 11342 return `bs.${this.NAME}`; 11343 } 11344 static get EVENT_KEY() { 11345 return `.${this.DATA_KEY}`; 11346 } 11347 static eventName(name) { 11348 return `${name}${this.EVENT_KEY}`; 11349 } 11350 } 11351 11352 return BaseComponent; 11353 11354 })); 11355//# sourceMappingURL=base-component.js.map 11356 11357 11358 /***/ }), 11359 11360
vendor: 3,571 bytes, lines 11360-11448
11360/***/ "./node_modules/bootstrap/js/dist/button.js": 11361 /*!**************************************************!*\ 11362 !*** ./node_modules/bootstrap/js/dist/button.js ***! 11363 \**************************************************/ 11364 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 11365 11366 /*! 11367 * Bootstrap button.js v5.3.3 (https://getbootstrap.com/) 11368 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 11369 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11370 */ 11371 (function (global, factory) { 11372 true ? module.exports = factory(__webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) : 11373 0; 11374 })(this, (function (BaseComponent, EventHandler, index_js) { 'use strict'; 11375 11376 /** 11377 * -------------------------------------------------------------------------- 11378 * Bootstrap button.js 11379 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11380 * -------------------------------------------------------------------------- 11381 */ 11382 11383 11384 /** 11385 * Constants 11386 */ 11387 11388 const NAME = 'button'; 11389 const DATA_KEY = 'bs.button'; 11390 const EVENT_KEY = `.${DATA_KEY}`; 11391 const DATA_API_KEY = '.data-api'; 11392 const CLASS_NAME_ACTIVE = 'active'; 11393 const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]'; 11394 const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; 11395 11396 /** 11397 * Class definition 11398 */ 11399 11400 class Button extends BaseComponent { 11401 // Getters 11402 static get NAME() { 11403 return NAME; 11404 } 11405 11406 // Public 11407 toggle() { 11408 // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method 11409 this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE)); 11410 } 11411 11412 // Static 11413 static jQueryInterface(config) { 11414 return this.each(function () { 11415 const data = Button.getOrCreateInstance(this); 11416 if (config === 'toggle') { 11417 data[config](); 11418 } 11419 }); 11420 } 11421 } 11422 11423 /** 11424 * Data API implementation 11425 */ 11426 11427 EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => { 11428 event.preventDefault(); 11429 const button = event.target.closest(SELECTOR_DATA_TOGGLE); 11430 const data = Button.getOrCreateInstance(button); 11431 data.toggle(); 11432 }); 11433 11434 /** 11435 * jQuery 11436 */ 11437 11438 index_js.defineJQueryPlugin(Button); 11439 11440 return Button; 11441 11442 })); 11443//# sourceMappingURL=button.js.map 11444 11445 11446 /***/ }), 11447 11448
vendor: 3,021 bytes, lines 11448-11520
11448/***/ "./node_modules/bootstrap/js/dist/dom/data.js": 11449 /*!****************************************************!*\ 11450 !*** ./node_modules/bootstrap/js/dist/dom/data.js ***! 11451 \****************************************************/ 11452 /***/ (function(module) { 11453 11454 /*! 11455 * Bootstrap data.js v5.3.3 (https://getbootstrap.com/) 11456 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 11457 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11458 */ 11459 (function (global, factory) { 11460 true ? module.exports = factory() : 11461 0; 11462 })(this, (function () { 'use strict'; 11463 11464 /** 11465 * -------------------------------------------------------------------------- 11466 * Bootstrap dom/data.js 11467 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11468 * -------------------------------------------------------------------------- 11469 */ 11470 11471 /** 11472 * Constants 11473 */ 11474 11475 const elementMap = new Map(); 11476 const data = { 11477 set(element, key, instance) { 11478 if (!elementMap.has(element)) { 11479 elementMap.set(element, new Map()); 11480 } 11481 const instanceMap = elementMap.get(element); 11482 11483 // make it clear we only want one instance per element 11484 // can be removed later when multiple key/instances are fine to be used 11485 if (!instanceMap.has(key) && instanceMap.size !== 0) { 11486 // eslint-disable-next-line no-console 11487 console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`); 11488 return; 11489 } 11490 instanceMap.set(key, instance); 11491 }, 11492 get(element, key) { 11493 if (elementMap.has(element)) { 11494 return elementMap.get(element).get(key) || null; 11495 } 11496 return null; 11497 }, 11498 remove(element, key) { 11499 if (!elementMap.has(element)) { 11500 return; 11501 } 11502 const instanceMap = elementMap.get(element); 11503 instanceMap.delete(key); 11504 11505 // free up element references if there are no instances left for an element 11506 if (instanceMap.size === 0) { 11507 elementMap.delete(element); 11508 } 11509 } 11510 }; 11511 11512 return data; 11513 11514 })); 11515//# sourceMappingURL=data.js.map 11516 11517 11518 /***/ }), 11519 11520
vendor: 13,454 bytes, lines 11520-11766
11520/***/ "./node_modules/bootstrap/js/dist/dom/event-handler.js": 11521 /*!*************************************************************!*\ 11522 !*** ./node_modules/bootstrap/js/dist/dom/event-handler.js ***! 11523 \*************************************************************/ 11524 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 11525 11526 /*! 11527 * Bootstrap event-handler.js v5.3.3 (https://getbootstrap.com/) 11528 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 11529 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11530 */ 11531 (function (global, factory) { 11532 true ? module.exports = factory(__webpack_require__(/*! ../util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) : 11533 0; 11534 })(this, (function (index_js) { 'use strict'; 11535 11536 /** 11537 * -------------------------------------------------------------------------- 11538 * Bootstrap dom/event-handler.js 11539 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11540 * -------------------------------------------------------------------------- 11541 */ 11542 11543 11544 /** 11545 * Constants 11546 */ 11547 11548 const namespaceRegex = /[^.]*(?=\..*)\.|.*/; 11549 const stripNameRegex = /\..*/; 11550 const stripUidRegex = /::\d+$/; 11551 const eventRegistry = {}; // Events storage 11552 let uidEvent = 1; 11553 const customEvents = { 11554 mouseenter: 'mouseover', 11555 mouseleave: 'mouseout' 11556 }; 11557 const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']); 11558 11559 /** 11560 * Private methods 11561 */ 11562 11563 function makeEventUid(element, uid) { 11564 return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++; 11565 } 11566 function getElementEvents(element) { 11567 const uid = makeEventUid(element); 11568 element.uidEvent = uid; 11569 eventRegistry[uid] = eventRegistry[uid] || {}; 11570 return eventRegistry[uid]; 11571 } 11572 function bootstrapHandler(element, fn) { 11573 return function handler(event) { 11574 hydrateObj(event, { 11575 delegateTarget: element 11576 }); 11577 if (handler.oneOff) { 11578 EventHandler.off(element, event.type, fn); 11579 } 11580 return fn.apply(element, [event]); 11581 }; 11582 } 11583 function bootstrapDelegationHandler(element, selector, fn) { 11584 return function handler(event) { 11585 const domElements = element.querySelectorAll(selector); 11586 for (let { 11587 target 11588 } = event; target && target !== this; target = target.parentNode) { 11589 for (const domElement of domElements) { 11590 if (domElement !== target) { 11591 continue; 11592 } 11593 hydrateObj(event, { 11594 delegateTarget: target 11595 }); 11596 if (handler.oneOff) { 11597 EventHandler.off(element, event.type, selector, fn); 11598 } 11599 return fn.apply(target, [event]); 11600 } 11601 } 11602 }; 11603 } 11604 function findHandler(events, callable, delegationSelector = null) { 11605 return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector); 11606 } 11607 function normalizeParameters(originalTypeEvent, handler, delegationFunction) { 11608 const isDelegated = typeof handler === 'string'; 11609 // TODO: tooltip passes `false` instead of selector, so we need to check 11610 const callable = isDelegated ? delegationFunction : handler || delegationFunction; 11611 let typeEvent = getTypeEvent(originalTypeEvent); 11612 if (!nativeEvents.has(typeEvent)) { 11613 typeEvent = originalTypeEvent; 11614 } 11615 return [isDelegated, callable, typeEvent]; 11616 } 11617 function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { 11618 if (typeof originalTypeEvent !== 'string' || !element) { 11619 return; 11620 } 11621 let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); 11622 11623 // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position 11624 // this prevents the handler from being dispatched the same way as mouseover or mouseout does 11625 if (originalTypeEvent in customEvents) { 11626 const wrapFunction = fn => { 11627 return function (event) { 11628 if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) { 11629 return fn.call(this, event); 11630 } 11631 }; 11632 }; 11633 callable = wrapFunction(callable); 11634 } 11635 const events = getElementEvents(element); 11636 const handlers = events[typeEvent] || (events[typeEvent] = {}); 11637 const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null); 11638 if (previousFunction) { 11639 previousFunction.oneOff = previousFunction.oneOff && oneOff; 11640 return; 11641 } 11642 const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, '')); 11643 const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable); 11644 fn.delegationSelector = isDelegated ? handler : null; 11645 fn.callable = callable; 11646 fn.oneOff = oneOff; 11647 fn.uidEvent = uid; 11648 handlers[uid] = fn; 11649 element.addEventListener(typeEvent, fn, isDelegated); 11650 } 11651 function removeHandler(element, events, typeEvent, handler, delegationSelector) { 11652 const fn = findHandler(events[typeEvent], handler, delegationSelector); 11653 if (!fn) { 11654 return; 11655 } 11656 element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); 11657 delete events[typeEvent][fn.uidEvent]; 11658 } 11659 function removeNamespacedHandlers(element, events, typeEvent, namespace) { 11660 const storeElementEvent = events[typeEvent] || {}; 11661 for (const [handlerKey, event] of Object.entries(storeElementEvent)) { 11662 if (handlerKey.includes(namespace)) { 11663 removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); 11664 } 11665 } 11666 } 11667 function getTypeEvent(event) { 11668 // allow to get the native events from namespaced events ('click.bs.button' --> 'click') 11669 event = event.replace(stripNameRegex, ''); 11670 return customEvents[event] || event; 11671 } 11672 const EventHandler = { 11673 on(element, event, handler, delegationFunction) { 11674 addHandler(element, event, handler, delegationFunction, false); 11675 }, 11676 one(element, event, handler, delegationFunction) { 11677 addHandler(element, event, handler, delegationFunction, true); 11678 }, 11679 off(element, originalTypeEvent, handler, delegationFunction) { 11680 if (typeof originalTypeEvent !== 'string' || !element) { 11681 return; 11682 } 11683 const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); 11684 const inNamespace = typeEvent !== originalTypeEvent; 11685 const events = getElementEvents(element); 11686 const storeElementEvent = events[typeEvent] || {}; 11687 const isNamespace = originalTypeEvent.startsWith('.'); 11688 if (typeof callable !== 'undefined') { 11689 // Simplest case: handler is passed, remove that listener ONLY. 11690 if (!Object.keys(storeElementEvent).length) { 11691 return; 11692 } 11693 removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null); 11694 return; 11695 } 11696 if (isNamespace) { 11697 for (const elementEvent of Object.keys(events)) { 11698 removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); 11699 } 11700 } 11701 for (const [keyHandlers, event] of Object.entries(storeElementEvent)) { 11702 const handlerKey = keyHandlers.replace(stripUidRegex, ''); 11703 if (!inNamespace || originalTypeEvent.includes(handlerKey)) { 11704 removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); 11705 } 11706 } 11707 }, 11708 trigger(element, event, args) { 11709 if (typeof event !== 'string' || !element) { 11710 return null; 11711 } 11712 const $ = index_js.getjQuery(); 11713 const typeEvent = getTypeEvent(event); 11714 const inNamespace = event !== typeEvent; 11715 let jQueryEvent = null; 11716 let bubbles = true; 11717 let nativeDispatch = true; 11718 let defaultPrevented = false; 11719 if (inNamespace && $) { 11720 jQueryEvent = $.Event(event, args); 11721 $(element).trigger(jQueryEvent); 11722 bubbles = !jQueryEvent.isPropagationStopped(); 11723 nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); 11724 defaultPrevented = jQueryEvent.isDefaultPrevented(); 11725 } 11726 const evt = hydrateObj(new Event(event, { 11727 bubbles, 11728 cancelable: true 11729 }), args); 11730 if (defaultPrevented) { 11731 evt.preventDefault(); 11732 } 11733 if (nativeDispatch) { 11734 element.dispatchEvent(evt); 11735 } 11736 if (evt.defaultPrevented && jQueryEvent) { 11737 jQueryEvent.preventDefault(); 11738 } 11739 return evt; 11740 } 11741 }; 11742 function hydrateObj(obj, meta = {}) { 11743 for (const [key, value] of Object.entries(meta)) { 11744 try { 11745 obj[key] = value; 11746 } catch (_unused) { 11747 Object.defineProperty(obj, key, { 11748 configurable: true, 11749 get() { 11750 return value; 11751 } 11752 }); 11753 } 11754 } 11755 return obj; 11756 } 11757 11758 return EventHandler; 11759 11760 })); 11761//# sourceMappingURL=event-handler.js.map 11762 11763 11764 /***/ }), 11765 11766
vendor: 3,520 bytes, lines 11766-11847
11766/***/ "./node_modules/bootstrap/js/dist/dom/manipulator.js": 11767 /*!***********************************************************!*\ 11768 !*** ./node_modules/bootstrap/js/dist/dom/manipulator.js ***! 11769 \***********************************************************/ 11770 /***/ (function(module) { 11771 11772 /*! 11773 * Bootstrap manipulator.js v5.3.3 (https://getbootstrap.com/) 11774 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 11775 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11776 */ 11777 (function (global, factory) { 11778 true ? module.exports = factory() : 11779 0; 11780 })(this, (function () { 'use strict'; 11781 11782 /** 11783 * -------------------------------------------------------------------------- 11784 * Bootstrap dom/manipulator.js 11785 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11786 * -------------------------------------------------------------------------- 11787 */ 11788 11789 function normalizeData(value) { 11790 if (value === 'true') { 11791 return true; 11792 } 11793 if (value === 'false') { 11794 return false; 11795 } 11796 if (value === Number(value).toString()) { 11797 return Number(value); 11798 } 11799 if (value === '' || value === 'null') { 11800 return null; 11801 } 11802 if (typeof value !== 'string') { 11803 return value; 11804 } 11805 try { 11806 return JSON.parse(decodeURIComponent(value)); 11807 } catch (_unused) { 11808 return value; 11809 } 11810 } 11811 function normalizeDataKey(key) { 11812 return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`); 11813 } 11814 const Manipulator = { 11815 setDataAttribute(element, key, value) { 11816 element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); 11817 }, 11818 removeDataAttribute(element, key) { 11819 element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); 11820 }, 11821 getDataAttributes(element) { 11822 if (!element) { 11823 return {}; 11824 } 11825 const attributes = {}; 11826 const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig')); 11827 for (const key of bsKeys) { 11828 let pureKey = key.replace(/^bs/, ''); 11829 pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); 11830 attributes[pureKey] = normalizeData(element.dataset[key]); 11831 } 11832 return attributes; 11833 }, 11834 getDataAttribute(element, key) { 11835 return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); 11836 } 11837 }; 11838 11839 return Manipulator; 11840 11841 })); 11842//# sourceMappingURL=manipulator.js.map 11843 11844 11845 /***/ }), 11846 11847
vendor: 5,984 bytes, lines 11847-11960
11847/***/ "./node_modules/bootstrap/js/dist/dom/selector-engine.js": 11848 /*!***************************************************************!*\ 11849 !*** ./node_modules/bootstrap/js/dist/dom/selector-engine.js ***! 11850 \***************************************************************/ 11851 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 11852 11853 /*! 11854 * Bootstrap selector-engine.js v5.3.3 (https://getbootstrap.com/) 11855 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 11856 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11857 */ 11858 (function (global, factory) { 11859 true ? module.exports = factory(__webpack_require__(/*! ../util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) : 11860 0; 11861 })(this, (function (index_js) { 'use strict'; 11862 11863 /** 11864 * -------------------------------------------------------------------------- 11865 * Bootstrap dom/selector-engine.js 11866 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11867 * -------------------------------------------------------------------------- 11868 */ 11869 11870 const getSelector = element => { 11871 let selector = element.getAttribute('data-bs-target'); 11872 if (!selector || selector === '#') { 11873 let hrefAttribute = element.getAttribute('href'); 11874 11875 // The only valid content that could double as a selector are IDs or classes, 11876 // so everything starting with `#` or `.`. If a "real" URL is used as the selector, 11877 // `document.querySelector` will rightfully complain it is invalid. 11878 // See https://github.com/twbs/bootstrap/issues/32273 11879 if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) { 11880 return null; 11881 } 11882 11883 // Just in case some CMS puts out a full URL with the anchor appended 11884 if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) { 11885 hrefAttribute = `#${hrefAttribute.split('#')[1]}`; 11886 } 11887 selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null; 11888 } 11889 return selector ? selector.split(',').map(sel => index_js.parseSelector(sel)).join(',') : null; 11890 }; 11891 const SelectorEngine = { 11892 find(selector, element = document.documentElement) { 11893 return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); 11894 }, 11895 findOne(selector, element = document.documentElement) { 11896 return Element.prototype.querySelector.call(element, selector); 11897 }, 11898 children(element, selector) { 11899 return [].concat(...element.children).filter(child => child.matches(selector)); 11900 }, 11901 parents(element, selector) { 11902 const parents = []; 11903 let ancestor = element.parentNode.closest(selector); 11904 while (ancestor) { 11905 parents.push(ancestor); 11906 ancestor = ancestor.parentNode.closest(selector); 11907 } 11908 return parents; 11909 }, 11910 prev(element, selector) { 11911 let previous = element.previousElementSibling; 11912 while (previous) { 11913 if (previous.matches(selector)) { 11914 return [previous]; 11915 } 11916 previous = previous.previousElementSibling; 11917 } 11918 return []; 11919 }, 11920 // TODO: this is now unused; remove later along with prev() 11921 next(element, selector) { 11922 let next = element.nextElementSibling; 11923 while (next) { 11924 if (next.matches(selector)) { 11925 return [next]; 11926 } 11927 next = next.nextElementSibling; 11928 } 11929 return []; 11930 }, 11931 focusableChildren(element) { 11932 const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(','); 11933 return this.find(focusables, element).filter(el => !index_js.isDisabled(el) && index_js.isVisible(el)); 11934 }, 11935 getSelectorFromElement(element) { 11936 const selector = getSelector(element); 11937 if (selector) { 11938 return SelectorEngine.findOne(selector) ? selector : null; 11939 } 11940 return null; 11941 }, 11942 getElementFromSelector(element) { 11943 const selector = getSelector(element); 11944 return selector ? SelectorEngine.findOne(selector) : null; 11945 }, 11946 getMultipleElementsFromSelector(element) { 11947 const selector = getSelector(element); 11948 return selector ? SelectorEngine.find(selector) : []; 11949 } 11950 }; 11951 11952 return SelectorEngine; 11953 11954 })); 11955//# sourceMappingURL=selector-engine.js.map 11956 11957 11958 /***/ }), 11959 11960
vendor: 22,141 bytes, lines 11960-12371
11960/***/ "./node_modules/bootstrap/js/dist/dropdown.js": 11961 /*!****************************************************!*\ 11962 !*** ./node_modules/bootstrap/js/dist/dropdown.js ***! 11963 \****************************************************/ 11964 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 11965 11966 /*! 11967 * Bootstrap dropdown.js v5.3.3 (https://getbootstrap.com/) 11968 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 11969 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11970 */ 11971 (function (global, factory) { 11972 true ? module.exports = factory(__webpack_require__(/*! @popperjs/core */ "./node_modules/@popperjs/core/lib/index.js"), __webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./dom/manipulator.js */ "./node_modules/bootstrap/js/dist/dom/manipulator.js"), __webpack_require__(/*! ./dom/selector-engine.js */ "./node_modules/bootstrap/js/dist/dom/selector-engine.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) : 11973 0; 11974 })(this, (function (Popper, BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js) { 'use strict'; 11975 11976 function _interopNamespaceDefault(e) { 11977 const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); 11978 if (e) { 11979 for (const k in e) { 11980 if (k !== 'default') { 11981 const d = Object.getOwnPropertyDescriptor(e, k); 11982 Object.defineProperty(n, k, d.get ? d : { 11983 enumerable: true, 11984 get: () => e[k] 11985 }); 11986 } 11987 } 11988 } 11989 n.default = e; 11990 return Object.freeze(n); 11991 } 11992 11993 const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper); 11994 11995 /** 11996 * -------------------------------------------------------------------------- 11997 * Bootstrap dropdown.js 11998 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 11999 * -------------------------------------------------------------------------- 12000 */ 12001 12002 12003 /** 12004 * Constants 12005 */ 12006 12007 const NAME = 'dropdown'; 12008 const DATA_KEY = 'bs.dropdown'; 12009 const EVENT_KEY = `.${DATA_KEY}`; 12010 const DATA_API_KEY = '.data-api'; 12011 const ESCAPE_KEY = 'Escape'; 12012 const TAB_KEY = 'Tab'; 12013 const ARROW_UP_KEY = 'ArrowUp'; 12014 const ARROW_DOWN_KEY = 'ArrowDown'; 12015 const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button 12016 12017 const EVENT_HIDE = `hide${EVENT_KEY}`; 12018 const EVENT_HIDDEN = `hidden${EVENT_KEY}`; 12019 const EVENT_SHOW = `show${EVENT_KEY}`; 12020 const EVENT_SHOWN = `shown${EVENT_KEY}`; 12021 const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; 12022 const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`; 12023 const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`; 12024 const CLASS_NAME_SHOW = 'show'; 12025 const CLASS_NAME_DROPUP = 'dropup'; 12026 const CLASS_NAME_DROPEND = 'dropend'; 12027 const CLASS_NAME_DROPSTART = 'dropstart'; 12028 const CLASS_NAME_DROPUP_CENTER = 'dropup-center'; 12029 const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'; 12030 const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)'; 12031 const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`; 12032 const SELECTOR_MENU = '.dropdown-menu'; 12033 const SELECTOR_NAVBAR = '.navbar'; 12034 const SELECTOR_NAVBAR_NAV = '.navbar-nav'; 12035 const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; 12036 const PLACEMENT_TOP = index_js.isRTL() ? 'top-end' : 'top-start'; 12037 const PLACEMENT_TOPEND = index_js.isRTL() ? 'top-start' : 'top-end'; 12038 const PLACEMENT_BOTTOM = index_js.isRTL() ? 'bottom-end' : 'bottom-start'; 12039 const PLACEMENT_BOTTOMEND = index_js.isRTL() ? 'bottom-start' : 'bottom-end'; 12040 const PLACEMENT_RIGHT = index_js.isRTL() ? 'left-start' : 'right-start'; 12041 const PLACEMENT_LEFT = index_js.isRTL() ? 'right-start' : 'left-start'; 12042 const PLACEMENT_TOPCENTER = 'top'; 12043 const PLACEMENT_BOTTOMCENTER = 'bottom'; 12044 const Default = { 12045 autoClose: true, 12046 boundary: 'clippingParents', 12047 display: 'dynamic', 12048 offset: [0, 2], 12049 popperConfig: null, 12050 reference: 'toggle' 12051 }; 12052 const DefaultType = { 12053 autoClose: '(boolean|string)', 12054 boundary: '(string|element)', 12055 display: 'string', 12056 offset: '(array|string|function)', 12057 popperConfig: '(null|object|function)', 12058 reference: '(string|element|object)' 12059 }; 12060 12061 /** 12062 * Class definition 12063 */ 12064 12065 class Dropdown extends BaseComponent { 12066 constructor(element, config) { 12067 super(element, config); 12068 this._popper = null; 12069 this._parent = this._element.parentNode; // dropdown wrapper 12070 // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/ 12071 this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent); 12072 this._inNavbar = this._detectNavbar(); 12073 } 12074 12075 // Getters 12076 static get Default() { 12077 return Default; 12078 } 12079 static get DefaultType() { 12080 return DefaultType; 12081 } 12082 static get NAME() { 12083 return NAME; 12084 } 12085 12086 // Public 12087 toggle() { 12088 return this._isShown() ? this.hide() : this.show(); 12089 } 12090 show() { 12091 if (index_js.isDisabled(this._element) || this._isShown()) { 12092 return; 12093 } 12094 const relatedTarget = { 12095 relatedTarget: this._element 12096 }; 12097 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget); 12098 if (showEvent.defaultPrevented) { 12099 return; 12100 } 12101 this._createPopper(); 12102 12103 // If this is a touch-enabled device we add extra 12104 // empty mouseover listeners to the body's immediate children; 12105 // only needed because of broken event delegation on iOS 12106 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html 12107 if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) { 12108 for (const element of [].concat(...document.body.children)) { 12109 EventHandler.on(element, 'mouseover', index_js.noop); 12110 } 12111 } 12112 this._element.focus(); 12113 this._element.setAttribute('aria-expanded', true); 12114 this._menu.classList.add(CLASS_NAME_SHOW); 12115 this._element.classList.add(CLASS_NAME_SHOW); 12116 EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget); 12117 } 12118 hide() { 12119 if (index_js.isDisabled(this._element) || !this._isShown()) { 12120 return; 12121 } 12122 const relatedTarget = { 12123 relatedTarget: this._element 12124 }; 12125 this._completeHide(relatedTarget); 12126 } 12127 dispose() { 12128 if (this._popper) { 12129 this._popper.destroy(); 12130 } 12131 super.dispose(); 12132 } 12133 update() { 12134 this._inNavbar = this._detectNavbar(); 12135 if (this._popper) { 12136 this._popper.update(); 12137 } 12138 } 12139 12140 // Private 12141 _completeHide(relatedTarget) { 12142 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget); 12143 if (hideEvent.defaultPrevented) { 12144 return; 12145 } 12146 12147 // If this is a touch-enabled device we remove the extra 12148 // empty mouseover listeners we added for iOS support 12149 if ('ontouchstart' in document.documentElement) { 12150 for (const element of [].concat(...document.body.children)) { 12151 EventHandler.off(element, 'mouseover', index_js.noop); 12152 } 12153 } 12154 if (this._popper) { 12155 this._popper.destroy(); 12156 } 12157 this._menu.classList.remove(CLASS_NAME_SHOW); 12158 this._element.classList.remove(CLASS_NAME_SHOW); 12159 this._element.setAttribute('aria-expanded', 'false'); 12160 Manipulator.removeDataAttribute(this._menu, 'popper'); 12161 EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget); 12162 } 12163 _getConfig(config) { 12164 config = super._getConfig(config); 12165 if (typeof config.reference === 'object' && !index_js.isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') { 12166 // Popper virtual elements require a getBoundingClientRect method 12167 throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); 12168 } 12169 return config; 12170 } 12171 _createPopper() { 12172 if (typeof Popper__namespace === 'undefined') { 12173 throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); 12174 } 12175 let referenceElement = this._element; 12176 if (this._config.reference === 'parent') { 12177 referenceElement = this._parent; 12178 } else if (index_js.isElement(this._config.reference)) { 12179 referenceElement = index_js.getElement(this._config.reference); 12180 } else if (typeof this._config.reference === 'object') { 12181 referenceElement = this._config.reference; 12182 } 12183 const popperConfig = this._getPopperConfig(); 12184 this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig); 12185 } 12186 _isShown() { 12187 return this._menu.classList.contains(CLASS_NAME_SHOW); 12188 } 12189 _getPlacement() { 12190 const parentDropdown = this._parent; 12191 if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { 12192 return PLACEMENT_RIGHT; 12193 } 12194 if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { 12195 return PLACEMENT_LEFT; 12196 } 12197 if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) { 12198 return PLACEMENT_TOPCENTER; 12199 } 12200 if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) { 12201 return PLACEMENT_BOTTOMCENTER; 12202 } 12203 12204 // We need to trim the value because custom properties can also include spaces 12205 const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'; 12206 if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { 12207 return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; 12208 } 12209 return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; 12210 } 12211 _detectNavbar() { 12212 return this._element.closest(SELECTOR_NAVBAR) !== null; 12213 } 12214 _getOffset() { 12215 const { 12216 offset 12217 } = this._config; 12218 if (typeof offset === 'string') { 12219 return offset.split(',').map(value => Number.parseInt(value, 10)); 12220 } 12221 if (typeof offset === 'function') { 12222 return popperData => offset(popperData, this._element); 12223 } 12224 return offset; 12225 } 12226 _getPopperConfig() { 12227 const defaultBsPopperConfig = { 12228 placement: this._getPlacement(), 12229 modifiers: [{ 12230 name: 'preventOverflow', 12231 options: { 12232 boundary: this._config.boundary 12233 } 12234 }, { 12235 name: 'offset', 12236 options: { 12237 offset: this._getOffset() 12238 } 12239 }] 12240 }; 12241 12242 // Disable Popper if we have a static display or Dropdown is in Navbar 12243 if (this._inNavbar || this._config.display === 'static') { 12244 Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove 12245 defaultBsPopperConfig.modifiers = [{ 12246 name: 'applyStyles', 12247 enabled: false 12248 }]; 12249 } 12250 return { 12251 ...defaultBsPopperConfig, 12252 ...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig]) 12253 }; 12254 } 12255 _selectMenuItem({ 12256 key, 12257 target 12258 }) { 12259 const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => index_js.isVisible(element)); 12260 if (!items.length) { 12261 return; 12262 } 12263 12264 // if target isn't included in items (e.g. when expanding the dropdown) 12265 // allow cycling to get the last item in case key equals ARROW_UP_KEY 12266 index_js.getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus(); 12267 } 12268 12269 // Static 12270 static jQueryInterface(config) { 12271 return this.each(function () { 12272 const data = Dropdown.getOrCreateInstance(this, config); 12273 if (typeof config !== 'string') { 12274 return; 12275 } 12276 if (typeof data[config] === 'undefined') { 12277 throw new TypeError(`No method named "${config}"`); 12278 } 12279 data[config](); 12280 }); 12281 } 12282 static clearMenus(event) { 12283 if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY) { 12284 return; 12285 } 12286 const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN); 12287 for (const toggle of openToggles) { 12288 const context = Dropdown.getInstance(toggle); 12289 if (!context || context._config.autoClose === false) { 12290 continue; 12291 } 12292 const composedPath = event.composedPath(); 12293 const isMenuTarget = composedPath.includes(context._menu); 12294 if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) { 12295 continue; 12296 } 12297 12298 // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu 12299 if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) { 12300 continue; 12301 } 12302 const relatedTarget = { 12303 relatedTarget: context._element 12304 }; 12305 if (event.type === 'click') { 12306 relatedTarget.clickEvent = event; 12307 } 12308 context._completeHide(relatedTarget); 12309 } 12310 } 12311 static dataApiKeydownHandler(event) { 12312 // If not an UP | DOWN | ESCAPE key => not a dropdown command 12313 // If input/textarea && if key is other than ESCAPE => not a dropdown command 12314 12315 const isInput = /input|textarea/i.test(event.target.tagName); 12316 const isEscapeEvent = event.key === ESCAPE_KEY; 12317 const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key); 12318 if (!isUpOrDownEvent && !isEscapeEvent) { 12319 return; 12320 } 12321 if (isInput && !isEscapeEvent) { 12322 return; 12323 } 12324 event.preventDefault(); 12325 12326 // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/ 12327 const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode); 12328 const instance = Dropdown.getOrCreateInstance(getToggleButton); 12329 if (isUpOrDownEvent) { 12330 event.stopPropagation(); 12331 instance.show(); 12332 instance._selectMenuItem(event); 12333 return; 12334 } 12335 if (instance._isShown()) { 12336 // else is escape and we check if it is shown 12337 event.stopPropagation(); 12338 instance.hide(); 12339 getToggleButton.focus(); 12340 } 12341 } 12342 } 12343 12344 /** 12345 * Data API implementation 12346 */ 12347 12348 EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler); 12349 EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler); 12350 EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus); 12351 EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); 12352 EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { 12353 event.preventDefault(); 12354 Dropdown.getOrCreateInstance(this).toggle(); 12355 }); 12356 12357 /** 12358 * jQuery 12359 */ 12360 12361 index_js.defineJQueryPlugin(Dropdown); 12362 12363 return Dropdown; 12364 12365 })); 12366//# sourceMappingURL=dropdown.js.map 12367 12368 12369 /***/ }), 12370 12371
vendor: 14,406 bytes, lines 12371-12655
12371/***/ "./node_modules/bootstrap/js/dist/scrollspy.js": 12372 /*!*****************************************************!*\ 12373 !*** ./node_modules/bootstrap/js/dist/scrollspy.js ***! 12374 \*****************************************************/ 12375 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 12376 12377 /*! 12378 * Bootstrap scrollspy.js v5.3.3 (https://getbootstrap.com/) 12379 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 12380 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 12381 */ 12382 (function (global, factory) { 12383 true ? module.exports = factory(__webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./dom/selector-engine.js */ "./node_modules/bootstrap/js/dist/dom/selector-engine.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) : 12384 0; 12385 })(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict'; 12386 12387 /** 12388 * -------------------------------------------------------------------------- 12389 * Bootstrap scrollspy.js 12390 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 12391 * -------------------------------------------------------------------------- 12392 */ 12393 12394 12395 /** 12396 * Constants 12397 */ 12398 12399 const NAME = 'scrollspy'; 12400 const DATA_KEY = 'bs.scrollspy'; 12401 const EVENT_KEY = `.${DATA_KEY}`; 12402 const DATA_API_KEY = '.data-api'; 12403 const EVENT_ACTIVATE = `activate${EVENT_KEY}`; 12404 const EVENT_CLICK = `click${EVENT_KEY}`; 12405 const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`; 12406 const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; 12407 const CLASS_NAME_ACTIVE = 'active'; 12408 const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; 12409 const SELECTOR_TARGET_LINKS = '[href]'; 12410 const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; 12411 const SELECTOR_NAV_LINKS = '.nav-link'; 12412 const SELECTOR_NAV_ITEMS = '.nav-item'; 12413 const SELECTOR_LIST_ITEMS = '.list-group-item'; 12414 const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`; 12415 const SELECTOR_DROPDOWN = '.dropdown'; 12416 const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; 12417 const Default = { 12418 offset: null, 12419 // TODO: v6 @deprecated, keep it for backwards compatibility reasons 12420 rootMargin: '0px 0px -25%', 12421 smoothScroll: false, 12422 target: null, 12423 threshold: [0.1, 0.5, 1] 12424 }; 12425 const DefaultType = { 12426 offset: '(number|null)', 12427 // TODO v6 @deprecated, keep it for backwards compatibility reasons 12428 rootMargin: 'string', 12429 smoothScroll: 'boolean', 12430 target: 'element', 12431 threshold: 'array' 12432 }; 12433 12434 /** 12435 * Class definition 12436 */ 12437 12438 class ScrollSpy extends BaseComponent { 12439 constructor(element, config) { 12440 super(element, config); 12441 12442 // this._element is the observablesContainer and config.target the menu links wrapper 12443 this._targetLinks = new Map(); 12444 this._observableSections = new Map(); 12445 this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element; 12446 this._activeTarget = null; 12447 this._observer = null; 12448 this._previousScrollData = { 12449 visibleEntryTop: 0, 12450 parentScrollTop: 0 12451 }; 12452 this.refresh(); // initialize 12453 } 12454 12455 // Getters 12456 static get Default() { 12457 return Default; 12458 } 12459 static get DefaultType() { 12460 return DefaultType; 12461 } 12462 static get NAME() { 12463 return NAME; 12464 } 12465 12466 // Public 12467 refresh() { 12468 this._initializeTargetsAndObservables(); 12469 this._maybeEnableSmoothScroll(); 12470 if (this._observer) { 12471 this._observer.disconnect(); 12472 } else { 12473 this._observer = this._getNewObserver(); 12474 } 12475 for (const section of this._observableSections.values()) { 12476 this._observer.observe(section); 12477 } 12478 } 12479 dispose() { 12480 this._observer.disconnect(); 12481 super.dispose(); 12482 } 12483 12484 // Private 12485 _configAfterMerge(config) { 12486 // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case 12487 config.target = index_js.getElement(config.target) || document.body; 12488 12489 // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only 12490 config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin; 12491 if (typeof config.threshold === 'string') { 12492 config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value)); 12493 } 12494 return config; 12495 } 12496 _maybeEnableSmoothScroll() { 12497 if (!this._config.smoothScroll) { 12498 return; 12499 } 12500 12501 // unregister any previous listeners 12502 EventHandler.off(this._config.target, EVENT_CLICK); 12503 EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => { 12504 const observableSection = this._observableSections.get(event.target.hash); 12505 if (observableSection) { 12506 event.preventDefault(); 12507 const root = this._rootElement || window; 12508 const height = observableSection.offsetTop - this._element.offsetTop; 12509 if (root.scrollTo) { 12510 root.scrollTo({ 12511 top: height, 12512 behavior: 'smooth' 12513 }); 12514 return; 12515 } 12516 12517 // Chrome 60 doesn't support `scrollTo` 12518 root.scrollTop = height; 12519 } 12520 }); 12521 } 12522 _getNewObserver() { 12523 const options = { 12524 root: this._rootElement, 12525 threshold: this._config.threshold, 12526 rootMargin: this._config.rootMargin 12527 }; 12528 return new IntersectionObserver(entries => this._observerCallback(entries), options); 12529 } 12530 12531 // The logic of selection 12532 _observerCallback(entries) { 12533 const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`); 12534 const activate = entry => { 12535 this._previousScrollData.visibleEntryTop = entry.target.offsetTop; 12536 this._process(targetElement(entry)); 12537 }; 12538 const parentScrollTop = (this._rootElement || document.documentElement).scrollTop; 12539 const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop; 12540 this._previousScrollData.parentScrollTop = parentScrollTop; 12541 for (const entry of entries) { 12542 if (!entry.isIntersecting) { 12543 this._activeTarget = null; 12544 this._clearActiveClass(targetElement(entry)); 12545 continue; 12546 } 12547 const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; 12548 // if we are scrolling down, pick the bigger offsetTop 12549 if (userScrollsDown && entryIsLowerThanPrevious) { 12550 activate(entry); 12551 // if parent isn't scrolled, let's keep the first visible item, breaking the iteration 12552 if (!parentScrollTop) { 12553 return; 12554 } 12555 continue; 12556 } 12557 12558 // if we are scrolling up, pick the smallest offsetTop 12559 if (!userScrollsDown && !entryIsLowerThanPrevious) { 12560 activate(entry); 12561 } 12562 } 12563 } 12564 _initializeTargetsAndObservables() { 12565 this._targetLinks = new Map(); 12566 this._observableSections = new Map(); 12567 const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target); 12568 for (const anchor of targetLinks) { 12569 // ensure that the anchor has an id and is not disabled 12570 if (!anchor.hash || index_js.isDisabled(anchor)) { 12571 continue; 12572 } 12573 const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element); 12574 12575 // ensure that the observableSection exists & is visible 12576 if (index_js.isVisible(observableSection)) { 12577 this._targetLinks.set(decodeURI(anchor.hash), anchor); 12578 this._observableSections.set(anchor.hash, observableSection); 12579 } 12580 } 12581 } 12582 _process(target) { 12583 if (this._activeTarget === target) { 12584 return; 12585 } 12586 this._clearActiveClass(this._config.target); 12587 this._activeTarget = target; 12588 target.classList.add(CLASS_NAME_ACTIVE); 12589 this._activateParents(target); 12590 EventHandler.trigger(this._element, EVENT_ACTIVATE, { 12591 relatedTarget: target 12592 }); 12593 } 12594 _activateParents(target) { 12595 // Activate dropdown parents 12596 if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { 12597 SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE); 12598 return; 12599 } 12600 for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) { 12601 // Set triggered links parents as active 12602 // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor 12603 for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) { 12604 item.classList.add(CLASS_NAME_ACTIVE); 12605 } 12606 } 12607 } 12608 _clearActiveClass(parent) { 12609 parent.classList.remove(CLASS_NAME_ACTIVE); 12610 const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent); 12611 for (const node of activeNodes) { 12612 node.classList.remove(CLASS_NAME_ACTIVE); 12613 } 12614 } 12615 12616 // Static 12617 static jQueryInterface(config) { 12618 return this.each(function () { 12619 const data = ScrollSpy.getOrCreateInstance(this, config); 12620 if (typeof config !== 'string') { 12621 return; 12622 } 12623 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { 12624 throw new TypeError(`No method named "${config}"`); 12625 } 12626 data[config](); 12627 }); 12628 } 12629 } 12630 12631 /** 12632 * Data API implementation 12633 */ 12634 12635 EventHandler.on(window, EVENT_LOAD_DATA_API, () => { 12636 for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) { 12637 ScrollSpy.getOrCreateInstance(spy); 12638 } 12639 }); 12640 12641 /** 12642 * jQuery 12643 */ 12644 12645 index_js.defineJQueryPlugin(ScrollSpy); 12646 12647 return ScrollSpy; 12648 12649 })); 12650//# sourceMappingURL=scrollspy.js.map 12651 12652 12653 /***/ }), 12654 12655
vendor: 15,044 bytes, lines 12655-12949
12655/***/ "./node_modules/bootstrap/js/dist/tab.js": 12656 /*!***********************************************!*\ 12657 !*** ./node_modules/bootstrap/js/dist/tab.js ***! 12658 \***********************************************/ 12659 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 12660 12661 /*! 12662 * Bootstrap tab.js v5.3.3 (https://getbootstrap.com/) 12663 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 12664 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 12665 */ 12666 (function (global, factory) { 12667 true ? module.exports = factory(__webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./dom/selector-engine.js */ "./node_modules/bootstrap/js/dist/dom/selector-engine.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) : 12668 0; 12669 })(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict'; 12670 12671 /** 12672 * -------------------------------------------------------------------------- 12673 * Bootstrap tab.js 12674 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 12675 * -------------------------------------------------------------------------- 12676 */ 12677 12678 12679 /** 12680 * Constants 12681 */ 12682 12683 const NAME = 'tab'; 12684 const DATA_KEY = 'bs.tab'; 12685 const EVENT_KEY = `.${DATA_KEY}`; 12686 const EVENT_HIDE = `hide${EVENT_KEY}`; 12687 const EVENT_HIDDEN = `hidden${EVENT_KEY}`; 12688 const EVENT_SHOW = `show${EVENT_KEY}`; 12689 const EVENT_SHOWN = `shown${EVENT_KEY}`; 12690 const EVENT_CLICK_DATA_API = `click${EVENT_KEY}`; 12691 const EVENT_KEYDOWN = `keydown${EVENT_KEY}`; 12692 const EVENT_LOAD_DATA_API = `load${EVENT_KEY}`; 12693 const ARROW_LEFT_KEY = 'ArrowLeft'; 12694 const ARROW_RIGHT_KEY = 'ArrowRight'; 12695 const ARROW_UP_KEY = 'ArrowUp'; 12696 const ARROW_DOWN_KEY = 'ArrowDown'; 12697 const HOME_KEY = 'Home'; 12698 const END_KEY = 'End'; 12699 const CLASS_NAME_ACTIVE = 'active'; 12700 const CLASS_NAME_FADE = 'fade'; 12701 const CLASS_NAME_SHOW = 'show'; 12702 const CLASS_DROPDOWN = 'dropdown'; 12703 const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; 12704 const SELECTOR_DROPDOWN_MENU = '.dropdown-menu'; 12705 const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`; 12706 const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'; 12707 const SELECTOR_OUTER = '.nav-item, .list-group-item'; 12708 const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`; 12709 const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // TODO: could only be `tab` in v6 12710 const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`; 12711 const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`; 12712 12713 /** 12714 * Class definition 12715 */ 12716 12717 class Tab extends BaseComponent { 12718 constructor(element) { 12719 super(element); 12720 this._parent = this._element.closest(SELECTOR_TAB_PANEL); 12721 if (!this._parent) { 12722 return; 12723 // TODO: should throw exception in v6 12724 // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`) 12725 } 12726 12727 // Set up initial aria attributes 12728 this._setInitialAttributes(this._parent, this._getChildren()); 12729 EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event)); 12730 } 12731 12732 // Getters 12733 static get NAME() { 12734 return NAME; 12735 } 12736 12737 // Public 12738 show() { 12739 // Shows this elem and deactivate the active sibling if exists 12740 const innerElem = this._element; 12741 if (this._elemIsActive(innerElem)) { 12742 return; 12743 } 12744 12745 // Search for active tab on same parent to deactivate it 12746 const active = this._getActiveElem(); 12747 const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE, { 12748 relatedTarget: innerElem 12749 }) : null; 12750 const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { 12751 relatedTarget: active 12752 }); 12753 if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) { 12754 return; 12755 } 12756 this._deactivate(active, innerElem); 12757 this._activate(innerElem, active); 12758 } 12759 12760 // Private 12761 _activate(element, relatedElem) { 12762 if (!element) { 12763 return; 12764 } 12765 element.classList.add(CLASS_NAME_ACTIVE); 12766 this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section 12767 12768 const complete = () => { 12769 if (element.getAttribute('role') !== 'tab') { 12770 element.classList.add(CLASS_NAME_SHOW); 12771 return; 12772 } 12773 element.removeAttribute('tabindex'); 12774 element.setAttribute('aria-selected', true); 12775 this._toggleDropDown(element, true); 12776 EventHandler.trigger(element, EVENT_SHOWN, { 12777 relatedTarget: relatedElem 12778 }); 12779 }; 12780 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE)); 12781 } 12782 _deactivate(element, relatedElem) { 12783 if (!element) { 12784 return; 12785 } 12786 element.classList.remove(CLASS_NAME_ACTIVE); 12787 element.blur(); 12788 this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too 12789 12790 const complete = () => { 12791 if (element.getAttribute('role') !== 'tab') { 12792 element.classList.remove(CLASS_NAME_SHOW); 12793 return; 12794 } 12795 element.setAttribute('aria-selected', false); 12796 element.setAttribute('tabindex', '-1'); 12797 this._toggleDropDown(element, false); 12798 EventHandler.trigger(element, EVENT_HIDDEN, { 12799 relatedTarget: relatedElem 12800 }); 12801 }; 12802 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE)); 12803 } 12804 _keydown(event) { 12805 if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) { 12806 return; 12807 } 12808 event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page 12809 event.preventDefault(); 12810 const children = this._getChildren().filter(element => !index_js.isDisabled(element)); 12811 let nextActiveElement; 12812 if ([HOME_KEY, END_KEY].includes(event.key)) { 12813 nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]; 12814 } else { 12815 const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key); 12816 nextActiveElement = index_js.getNextActiveElement(children, event.target, isNext, true); 12817 } 12818 if (nextActiveElement) { 12819 nextActiveElement.focus({ 12820 preventScroll: true 12821 }); 12822 Tab.getOrCreateInstance(nextActiveElement).show(); 12823 } 12824 } 12825 _getChildren() { 12826 // collection of inner elements 12827 return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent); 12828 } 12829 _getActiveElem() { 12830 return this._getChildren().find(child => this._elemIsActive(child)) || null; 12831 } 12832 _setInitialAttributes(parent, children) { 12833 this._setAttributeIfNotExists(parent, 'role', 'tablist'); 12834 for (const child of children) { 12835 this._setInitialAttributesOnChild(child); 12836 } 12837 } 12838 _setInitialAttributesOnChild(child) { 12839 child = this._getInnerElement(child); 12840 const isActive = this._elemIsActive(child); 12841 const outerElem = this._getOuterElement(child); 12842 child.setAttribute('aria-selected', isActive); 12843 if (outerElem !== child) { 12844 this._setAttributeIfNotExists(outerElem, 'role', 'presentation'); 12845 } 12846 if (!isActive) { 12847 child.setAttribute('tabindex', '-1'); 12848 } 12849 this._setAttributeIfNotExists(child, 'role', 'tab'); 12850 12851 // set attributes to the related panel too 12852 this._setInitialAttributesOnTargetPanel(child); 12853 } 12854 _setInitialAttributesOnTargetPanel(child) { 12855 const target = SelectorEngine.getElementFromSelector(child); 12856 if (!target) { 12857 return; 12858 } 12859 this._setAttributeIfNotExists(target, 'role', 'tabpanel'); 12860 if (child.id) { 12861 this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`); 12862 } 12863 } 12864 _toggleDropDown(element, open) { 12865 const outerElem = this._getOuterElement(element); 12866 if (!outerElem.classList.contains(CLASS_DROPDOWN)) { 12867 return; 12868 } 12869 const toggle = (selector, className) => { 12870 const element = SelectorEngine.findOne(selector, outerElem); 12871 if (element) { 12872 element.classList.toggle(className, open); 12873 } 12874 }; 12875 toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE); 12876 toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW); 12877 outerElem.setAttribute('aria-expanded', open); 12878 } 12879 _setAttributeIfNotExists(element, attribute, value) { 12880 if (!element.hasAttribute(attribute)) { 12881 element.setAttribute(attribute, value); 12882 } 12883 } 12884 _elemIsActive(elem) { 12885 return elem.classList.contains(CLASS_NAME_ACTIVE); 12886 } 12887 12888 // Try to get the inner element (usually the .nav-link) 12889 _getInnerElement(elem) { 12890 return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem); 12891 } 12892 12893 // Try to get the outer element (usually the .nav-item) 12894 _getOuterElement(elem) { 12895 return elem.closest(SELECTOR_OUTER) || elem; 12896 } 12897 12898 // Static 12899 static jQueryInterface(config) { 12900 return this.each(function () { 12901 const data = Tab.getOrCreateInstance(this); 12902 if (typeof config !== 'string') { 12903 return; 12904 } 12905 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { 12906 throw new TypeError(`No method named "${config}"`); 12907 } 12908 data[config](); 12909 }); 12910 } 12911 } 12912 12913 /** 12914 * Data API implementation 12915 */ 12916 12917 EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { 12918 if (['A', 'AREA'].includes(this.tagName)) { 12919 event.preventDefault(); 12920 } 12921 if (index_js.isDisabled(this)) { 12922 return; 12923 } 12924 Tab.getOrCreateInstance(this).show(); 12925 }); 12926 12927 /** 12928 * Initialize on focus 12929 */ 12930 EventHandler.on(window, EVENT_LOAD_DATA_API, () => { 12931 for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) { 12932 Tab.getOrCreateInstance(element); 12933 } 12934 }); 12935 /** 12936 * jQuery 12937 */ 12938 12939 index_js.defineJQueryPlugin(Tab); 12940 12941 return Tab; 12942 12943 })); 12944//# sourceMappingURL=tab.js.map 12945 12946 12947 /***/ }), 12948 12949
vendor: 27,976 bytes, lines 12949-13504
12949/***/ "./node_modules/bootstrap/js/dist/tooltip.js": 12950 /*!***************************************************!*\ 12951 !*** ./node_modules/bootstrap/js/dist/tooltip.js ***! 12952 \***************************************************/ 12953 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 12954 12955 /*! 12956 * Bootstrap tooltip.js v5.3.3 (https://getbootstrap.com/) 12957 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 12958 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 12959 */ 12960 (function (global, factory) { 12961 true ? module.exports = factory(__webpack_require__(/*! @popperjs/core */ "./node_modules/@popperjs/core/lib/index.js"), __webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./dom/manipulator.js */ "./node_modules/bootstrap/js/dist/dom/manipulator.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js"), __webpack_require__(/*! ./util/sanitizer.js */ "./node_modules/bootstrap/js/dist/util/sanitizer.js"), __webpack_require__(/*! ./util/template-factory.js */ "./node_modules/bootstrap/js/dist/util/template-factory.js")) : 12962 0; 12963 })(this, (function (Popper, BaseComponent, EventHandler, Manipulator, index_js, sanitizer_js, TemplateFactory) { 'use strict'; 12964 12965 function _interopNamespaceDefault(e) { 12966 const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); 12967 if (e) { 12968 for (const k in e) { 12969 if (k !== 'default') { 12970 const d = Object.getOwnPropertyDescriptor(e, k); 12971 Object.defineProperty(n, k, d.get ? d : { 12972 enumerable: true, 12973 get: () => e[k] 12974 }); 12975 } 12976 } 12977 } 12978 n.default = e; 12979 return Object.freeze(n); 12980 } 12981 12982 const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper); 12983 12984 /** 12985 * -------------------------------------------------------------------------- 12986 * Bootstrap tooltip.js 12987 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 12988 * -------------------------------------------------------------------------- 12989 */ 12990 12991 12992 /** 12993 * Constants 12994 */ 12995 12996 const NAME = 'tooltip'; 12997 const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']); 12998 const CLASS_NAME_FADE = 'fade'; 12999 const CLASS_NAME_MODAL = 'modal'; 13000 const CLASS_NAME_SHOW = 'show'; 13001 const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; 13002 const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`; 13003 const EVENT_MODAL_HIDE = 'hide.bs.modal'; 13004 const TRIGGER_HOVER = 'hover'; 13005 const TRIGGER_FOCUS = 'focus'; 13006 const TRIGGER_CLICK = 'click'; 13007 const TRIGGER_MANUAL = 'manual'; 13008 const EVENT_HIDE = 'hide'; 13009 const EVENT_HIDDEN = 'hidden'; 13010 const EVENT_SHOW = 'show'; 13011 const EVENT_SHOWN = 'shown'; 13012 const EVENT_INSERTED = 'inserted'; 13013 const EVENT_CLICK = 'click'; 13014 const EVENT_FOCUSIN = 'focusin'; 13015 const EVENT_FOCUSOUT = 'focusout'; 13016 const EVENT_MOUSEENTER = 'mouseenter'; 13017 const EVENT_MOUSELEAVE = 'mouseleave'; 13018 const AttachmentMap = { 13019 AUTO: 'auto', 13020 TOP: 'top', 13021 RIGHT: index_js.isRTL() ? 'left' : 'right', 13022 BOTTOM: 'bottom', 13023 LEFT: index_js.isRTL() ? 'right' : 'left' 13024 }; 13025 const Default = { 13026 allowList: sanitizer_js.DefaultAllowlist, 13027 animation: true, 13028 boundary: 'clippingParents', 13029 container: false, 13030 customClass: '', 13031 delay: 0, 13032 fallbackPlacements: ['top', 'right', 'bottom', 'left'], 13033 html: false, 13034 offset: [0, 6], 13035 placement: 'top', 13036 popperConfig: null, 13037 sanitize: true, 13038 sanitizeFn: null, 13039 selector: false, 13040 template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>', 13041 title: '', 13042 trigger: 'hover focus' 13043 }; 13044 const DefaultType = { 13045 allowList: 'object', 13046 animation: 'boolean', 13047 boundary: '(string|element)', 13048 container: '(string|element|boolean)', 13049 customClass: '(string|function)', 13050 delay: '(number|object)', 13051 fallbackPlacements: 'array', 13052 html: 'boolean', 13053 offset: '(array|string|function)', 13054 placement: '(string|function)', 13055 popperConfig: '(null|object|function)', 13056 sanitize: 'boolean', 13057 sanitizeFn: '(null|function)', 13058 selector: '(string|boolean)', 13059 template: 'string', 13060 title: '(string|element|function)', 13061 trigger: 'string' 13062 }; 13063 13064 /** 13065 * Class definition 13066 */ 13067 13068 class Tooltip extends BaseComponent { 13069 constructor(element, config) { 13070 if (typeof Popper__namespace === 'undefined') { 13071 throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); 13072 } 13073 super(element, config); 13074 13075 // Private 13076 this._isEnabled = true; 13077 this._timeout = 0; 13078 this._isHovered = null; 13079 this._activeTrigger = {}; 13080 this._popper = null; 13081 this._templateFactory = null; 13082 this._newContent = null; 13083 13084 // Protected 13085 this.tip = null; 13086 this._setListeners(); 13087 if (!this._config.selector) { 13088 this._fixTitle(); 13089 } 13090 } 13091 13092 // Getters 13093 static get Default() { 13094 return Default; 13095 } 13096 static get DefaultType() { 13097 return DefaultType; 13098 } 13099 static get NAME() { 13100 return NAME; 13101 } 13102 13103 // Public 13104 enable() { 13105 this._isEnabled = true; 13106 } 13107 disable() { 13108 this._isEnabled = false; 13109 } 13110 toggleEnabled() { 13111 this._isEnabled = !this._isEnabled; 13112 } 13113 toggle() { 13114 if (!this._isEnabled) { 13115 return; 13116 } 13117 this._activeTrigger.click = !this._activeTrigger.click; 13118 if (this._isShown()) { 13119 this._leave(); 13120 return; 13121 } 13122 this._enter(); 13123 } 13124 dispose() { 13125 clearTimeout(this._timeout); 13126 EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); 13127 if (this._element.getAttribute('data-bs-original-title')) { 13128 this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title')); 13129 } 13130 this._disposePopper(); 13131 super.dispose(); 13132 } 13133 show() { 13134 if (this._element.style.display === 'none') { 13135 throw new Error('Please use show on visible elements'); 13136 } 13137 if (!(this._isWithContent() && this._isEnabled)) { 13138 return; 13139 } 13140 const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW)); 13141 const shadowRoot = index_js.findShadowRoot(this._element); 13142 const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element); 13143 if (showEvent.defaultPrevented || !isInTheDom) { 13144 return; 13145 } 13146 13147 // TODO: v6 remove this or make it optional 13148 this._disposePopper(); 13149 const tip = this._getTipElement(); 13150 this._element.setAttribute('aria-describedby', tip.getAttribute('id')); 13151 const { 13152 container 13153 } = this._config; 13154 if (!this._element.ownerDocument.documentElement.contains(this.tip)) { 13155 container.append(tip); 13156 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); 13157 } 13158 this._popper = this._createPopper(tip); 13159 tip.classList.add(CLASS_NAME_SHOW); 13160 13161 // If this is a touch-enabled device we add extra 13162 // empty mouseover listeners to the body's immediate children; 13163 // only needed because of broken event delegation on iOS 13164 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html 13165 if ('ontouchstart' in document.documentElement) { 13166 for (const element of [].concat(...document.body.children)) { 13167 EventHandler.on(element, 'mouseover', index_js.noop); 13168 } 13169 } 13170 const complete = () => { 13171 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN)); 13172 if (this._isHovered === false) { 13173 this._leave(); 13174 } 13175 this._isHovered = false; 13176 }; 13177 this._queueCallback(complete, this.tip, this._isAnimated()); 13178 } 13179 hide() { 13180 if (!this._isShown()) { 13181 return; 13182 } 13183 const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE)); 13184 if (hideEvent.defaultPrevented) { 13185 return; 13186 } 13187 const tip = this._getTipElement(); 13188 tip.classList.remove(CLASS_NAME_SHOW); 13189 13190 // If this is a touch-enabled device we remove the extra 13191 // empty mouseover listeners we added for iOS support 13192 if ('ontouchstart' in document.documentElement) { 13193 for (const element of [].concat(...document.body.children)) { 13194 EventHandler.off(element, 'mouseover', index_js.noop); 13195 } 13196 } 13197 this._activeTrigger[TRIGGER_CLICK] = false; 13198 this._activeTrigger[TRIGGER_FOCUS] = false; 13199 this._activeTrigger[TRIGGER_HOVER] = false; 13200 this._isHovered = null; // it is a trick to support manual triggering 13201 13202 const complete = () => { 13203 if (this._isWithActiveTrigger()) { 13204 return; 13205 } 13206 if (!this._isHovered) { 13207 this._disposePopper(); 13208 } 13209 this._element.removeAttribute('aria-describedby'); 13210 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN)); 13211 }; 13212 this._queueCallback(complete, this.tip, this._isAnimated()); 13213 } 13214 update() { 13215 if (this._popper) { 13216 this._popper.update(); 13217 } 13218 } 13219 13220 // Protected 13221 _isWithContent() { 13222 return Boolean(this._getTitle()); 13223 } 13224 _getTipElement() { 13225 if (!this.tip) { 13226 this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); 13227 } 13228 return this.tip; 13229 } 13230 _createTipElement(content) { 13231 const tip = this._getTemplateFactory(content).toHtml(); 13232 13233 // TODO: remove this check in v6 13234 if (!tip) { 13235 return null; 13236 } 13237 tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); 13238 // TODO: v6 the following can be achieved with CSS only 13239 tip.classList.add(`bs-${this.constructor.NAME}-auto`); 13240 const tipId = index_js.getUID(this.constructor.NAME).toString(); 13241 tip.setAttribute('id', tipId); 13242 if (this._isAnimated()) { 13243 tip.classList.add(CLASS_NAME_FADE); 13244 } 13245 return tip; 13246 } 13247 setContent(content) { 13248 this._newContent = content; 13249 if (this._isShown()) { 13250 this._disposePopper(); 13251 this.show(); 13252 } 13253 } 13254 _getTemplateFactory(content) { 13255 if (this._templateFactory) { 13256 this._templateFactory.changeContent(content); 13257 } else { 13258 this._templateFactory = new TemplateFactory({ 13259 ...this._config, 13260 // the `content` var has to be after `this._config` 13261 // to override config.content in case of popover 13262 content, 13263 extraClass: this._resolvePossibleFunction(this._config.customClass) 13264 }); 13265 } 13266 return this._templateFactory; 13267 } 13268 _getContentForTemplate() { 13269 return { 13270 [SELECTOR_TOOLTIP_INNER]: this._getTitle() 13271 }; 13272 } 13273 _getTitle() { 13274 return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title'); 13275 } 13276 13277 // Private 13278 _initializeOnDelegatedTarget(event) { 13279 return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); 13280 } 13281 _isAnimated() { 13282 return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE); 13283 } 13284 _isShown() { 13285 return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW); 13286 } 13287 _createPopper(tip) { 13288 const placement = index_js.execute(this._config.placement, [this, tip, this._element]); 13289 const attachment = AttachmentMap[placement.toUpperCase()]; 13290 return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment)); 13291 } 13292 _getOffset() { 13293 const { 13294 offset 13295 } = this._config; 13296 if (typeof offset === 'string') { 13297 return offset.split(',').map(value => Number.parseInt(value, 10)); 13298 } 13299 if (typeof offset === 'function') { 13300 return popperData => offset(popperData, this._element); 13301 } 13302 return offset; 13303 } 13304 _resolvePossibleFunction(arg) { 13305 return index_js.execute(arg, [this._element]); 13306 } 13307 _getPopperConfig(attachment) { 13308 const defaultBsPopperConfig = { 13309 placement: attachment, 13310 modifiers: [{ 13311 name: 'flip', 13312 options: { 13313 fallbackPlacements: this._config.fallbackPlacements 13314 } 13315 }, { 13316 name: 'offset', 13317 options: { 13318 offset: this._getOffset() 13319 } 13320 }, { 13321 name: 'preventOverflow', 13322 options: { 13323 boundary: this._config.boundary 13324 } 13325 }, { 13326 name: 'arrow', 13327 options: { 13328 element: `.${this.constructor.NAME}-arrow` 13329 } 13330 }, { 13331 name: 'preSetPlacement', 13332 enabled: true, 13333 phase: 'beforeMain', 13334 fn: data => { 13335 // Pre-set Popper's placement attribute in order to read the arrow sizes properly. 13336 // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement 13337 this._getTipElement().setAttribute('data-popper-placement', data.state.placement); 13338 } 13339 }] 13340 }; 13341 return { 13342 ...defaultBsPopperConfig, 13343 ...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig]) 13344 }; 13345 } 13346 _setListeners() { 13347 const triggers = this._config.trigger.split(' '); 13348 for (const trigger of triggers) { 13349 if (trigger === 'click') { 13350 EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => { 13351 const context = this._initializeOnDelegatedTarget(event); 13352 context.toggle(); 13353 }); 13354 } else if (trigger !== TRIGGER_MANUAL) { 13355 const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN); 13356 const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT); 13357 EventHandler.on(this._element, eventIn, this._config.selector, event => { 13358 const context = this._initializeOnDelegatedTarget(event); 13359 context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; 13360 context._enter(); 13361 }); 13362 EventHandler.on(this._element, eventOut, this._config.selector, event => { 13363 const context = this._initializeOnDelegatedTarget(event); 13364 context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); 13365 context._leave(); 13366 }); 13367 } 13368 } 13369 this._hideModalHandler = () => { 13370 if (this._element) { 13371 this.hide(); 13372 } 13373 }; 13374 EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); 13375 } 13376 _fixTitle() { 13377 const title = this._element.getAttribute('title'); 13378 if (!title) { 13379 return; 13380 } 13381 if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) { 13382 this._element.setAttribute('aria-label', title); 13383 } 13384 this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility 13385 this._element.removeAttribute('title'); 13386 } 13387 _enter() { 13388 if (this._isShown() || this._isHovered) { 13389 this._isHovered = true; 13390 return; 13391 } 13392 this._isHovered = true; 13393 this._setTimeout(() => { 13394 if (this._isHovered) { 13395 this.show(); 13396 } 13397 }, this._config.delay.show); 13398 } 13399 _leave() { 13400 if (this._isWithActiveTrigger()) { 13401 return; 13402 } 13403 this._isHovered = false; 13404 this._setTimeout(() => { 13405 if (!this._isHovered) { 13406 this.hide(); 13407 } 13408 }, this._config.delay.hide); 13409 } 13410 _setTimeout(handler, timeout) { 13411 clearTimeout(this._timeout); 13412 this._timeout = setTimeout(handler, timeout); 13413 } 13414 _isWithActiveTrigger() { 13415 return Object.values(this._activeTrigger).includes(true); 13416 } 13417 _getConfig(config) { 13418 const dataAttributes = Manipulator.getDataAttributes(this._element); 13419 for (const dataAttribute of Object.keys(dataAttributes)) { 13420 if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { 13421 delete dataAttributes[dataAttribute]; 13422 } 13423 } 13424 config = { 13425 ...dataAttributes, 13426 ...(typeof config === 'object' && config ? config : {}) 13427 }; 13428 config = this._mergeConfigObj(config); 13429 config = this._configAfterMerge(config); 13430 this._typeCheckConfig(config); 13431 return config; 13432 } 13433 _configAfterMerge(config) { 13434 config.container = config.container === false ? document.body : index_js.getElement(config.container); 13435 if (typeof config.delay === 'number') { 13436 config.delay = { 13437 show: config.delay, 13438 hide: config.delay 13439 }; 13440 } 13441 if (typeof config.title === 'number') { 13442 config.title = config.title.toString(); 13443 } 13444 if (typeof config.content === 'number') { 13445 config.content = config.content.toString(); 13446 } 13447 return config; 13448 } 13449 _getDelegateConfig() { 13450 const config = {}; 13451 for (const [key, value] of Object.entries(this._config)) { 13452 if (this.constructor.Default[key] !== value) { 13453 config[key] = value; 13454 } 13455 } 13456 config.selector = false; 13457 config.trigger = 'manual'; 13458 13459 // In the future can be replaced with: 13460 // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) 13461 // `Object.fromEntries(keysWithDifferentValues)` 13462 return config; 13463 } 13464 _disposePopper() { 13465 if (this._popper) { 13466 this._popper.destroy(); 13467 this._popper = null; 13468 } 13469 if (this.tip) { 13470 this.tip.remove(); 13471 this.tip = null; 13472 } 13473 } 13474 13475 // Static 13476 static jQueryInterface(config) { 13477 return this.each(function () { 13478 const data = Tooltip.getOrCreateInstance(this, config); 13479 if (typeof config !== 'string') { 13480 return; 13481 } 13482 if (typeof data[config] === 'undefined') { 13483 throw new TypeError(`No method named "${config}"`); 13484 } 13485 data[config](); 13486 }); 13487 } 13488 } 13489 13490 /** 13491 * jQuery 13492 */ 13493 13494 index_js.defineJQueryPlugin(Tooltip); 13495 13496 return Tooltip; 13497 13498 })); 13499//# sourceMappingURL=tooltip.js.map 13500 13501 13502 /***/ }), 13503 13504
vendor: 3,681 bytes, lines 13504-13581
13504/***/ "./node_modules/bootstrap/js/dist/util/config.js": 13505 /*!*******************************************************!*\ 13506 !*** ./node_modules/bootstrap/js/dist/util/config.js ***! 13507 \*******************************************************/ 13508 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 13509 13510 /*! 13511 * Bootstrap config.js v5.3.3 (https://getbootstrap.com/) 13512 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 13513 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 13514 */ 13515 (function (global, factory) { 13516 true ? module.exports = factory(__webpack_require__(/*! ../dom/manipulator.js */ "./node_modules/bootstrap/js/dist/dom/manipulator.js"), __webpack_require__(/*! ./index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) : 13517 0; 13518 })(this, (function (Manipulator, index_js) { 'use strict'; 13519 13520 /** 13521 * -------------------------------------------------------------------------- 13522 * Bootstrap util/config.js 13523 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 13524 * -------------------------------------------------------------------------- 13525 */ 13526 13527 13528 /** 13529 * Class definition 13530 */ 13531 13532 class Config { 13533 // Getters 13534 static get Default() { 13535 return {}; 13536 } 13537 static get DefaultType() { 13538 return {}; 13539 } 13540 static get NAME() { 13541 throw new Error('You have to implement the static method "NAME", for each component!'); 13542 } 13543 _getConfig(config) { 13544 config = this._mergeConfigObj(config); 13545 config = this._configAfterMerge(config); 13546 this._typeCheckConfig(config); 13547 return config; 13548 } 13549 _configAfterMerge(config) { 13550 return config; 13551 } 13552 _mergeConfigObj(config, element) { 13553 const jsonConfig = index_js.isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse 13554 13555 return { 13556 ...this.constructor.Default, 13557 ...(typeof jsonConfig === 'object' ? jsonConfig : {}), 13558 ...(index_js.isElement(element) ? Manipulator.getDataAttributes(element) : {}), 13559 ...(typeof config === 'object' ? config : {}) 13560 }; 13561 } 13562 _typeCheckConfig(config, configTypes = this.constructor.DefaultType) { 13563 for (const [property, expectedTypes] of Object.entries(configTypes)) { 13564 const value = config[property]; 13565 const valueType = index_js.isElement(value) ? 'element' : index_js.toType(value); 13566 if (!new RegExp(expectedTypes).test(valueType)) { 13567 throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`); 13568 } 13569 } 13570 } 13571 } 13572 13573 return Config; 13574 13575 })); 13576//# sourceMappingURL=config.js.map 13577 13578 13579 /***/ }), 13580 13581
vendor: 13,781 bytes, lines 13581-13872
13581/***/ "./node_modules/bootstrap/js/dist/util/index.js": 13582 /*!******************************************************!*\ 13583 !*** ./node_modules/bootstrap/js/dist/util/index.js ***! 13584 \******************************************************/ 13585 /***/ (function(__unused_webpack_module, exports, __webpack_require__) { 13586 13587 /* provided dependency */ var __webpack_provided_window_dot_jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 13588 /*! 13589 * Bootstrap index.js v5.3.3 (https://getbootstrap.com/) 13590 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 13591 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 13592 */ 13593 (function (global, factory) { 13594 true ? factory(exports) : 13595 0; 13596 })(this, (function (exports) { 'use strict'; 13597 13598 /** 13599 * -------------------------------------------------------------------------- 13600 * Bootstrap util/index.js 13601 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 13602 * -------------------------------------------------------------------------- 13603 */ 13604 13605 const MAX_UID = 1000000; 13606 const MILLISECONDS_MULTIPLIER = 1000; 13607 const TRANSITION_END = 'transitionend'; 13608 13609 /** 13610 * Properly escape IDs selectors to handle weird IDs 13611 * @param {string} selector 13612 * @returns {string} 13613 */ 13614 const parseSelector = selector => { 13615 if (selector && window.CSS && window.CSS.escape) { 13616 // document.querySelector needs escaping to handle IDs (html5+) containing for instance / 13617 selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`); 13618 } 13619 return selector; 13620 }; 13621 13622 // Shout-out Angus Croll (https://goo.gl/pxwQGp) 13623 const toType = object => { 13624 if (object === null || object === undefined) { 13625 return `${object}`; 13626 } 13627 return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(); 13628 }; 13629 13630 /** 13631 * Public Util API 13632 */ 13633 13634 const getUID = prefix => { 13635 do { 13636 prefix += Math.floor(Math.random() * MAX_UID); 13637 } while (document.getElementById(prefix)); 13638 return prefix; 13639 }; 13640 const getTransitionDurationFromElement = element => { 13641 if (!element) { 13642 return 0; 13643 } 13644 13645 // Get transition-duration of the element 13646 let { 13647 transitionDuration, 13648 transitionDelay 13649 } = window.getComputedStyle(element); 13650 const floatTransitionDuration = Number.parseFloat(transitionDuration); 13651 const floatTransitionDelay = Number.parseFloat(transitionDelay); 13652 13653 // Return 0 if element or transition duration is not found 13654 if (!floatTransitionDuration && !floatTransitionDelay) { 13655 return 0; 13656 } 13657 13658 // If multiple durations are defined, take the first 13659 transitionDuration = transitionDuration.split(',')[0]; 13660 transitionDelay = transitionDelay.split(',')[0]; 13661 return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; 13662 }; 13663 const triggerTransitionEnd = element => { 13664 element.dispatchEvent(new Event(TRANSITION_END)); 13665 }; 13666 const isElement = object => { 13667 if (!object || typeof object !== 'object') { 13668 return false; 13669 } 13670 if (typeof object.jquery !== 'undefined') { 13671 object = object[0]; 13672 } 13673 return typeof object.nodeType !== 'undefined'; 13674 }; 13675 const getElement = object => { 13676 // it's a jQuery object or a node element 13677 if (isElement(object)) { 13678 return object.jquery ? object[0] : object; 13679 } 13680 if (typeof object === 'string' && object.length > 0) { 13681 return document.querySelector(parseSelector(object)); 13682 } 13683 return null; 13684 }; 13685 const isVisible = element => { 13686 if (!isElement(element) || element.getClientRects().length === 0) { 13687 return false; 13688 } 13689 const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; 13690 // Handle `details` element as its content may falsie appear visible when it is closed 13691 const closedDetails = element.closest('details:not([open])'); 13692 if (!closedDetails) { 13693 return elementIsVisible; 13694 } 13695 if (closedDetails !== element) { 13696 const summary = element.closest('summary'); 13697 if (summary && summary.parentNode !== closedDetails) { 13698 return false; 13699 } 13700 if (summary === null) { 13701 return false; 13702 } 13703 } 13704 return elementIsVisible; 13705 }; 13706 const isDisabled = element => { 13707 if (!element || element.nodeType !== Node.ELEMENT_NODE) { 13708 return true; 13709 } 13710 if (element.classList.contains('disabled')) { 13711 return true; 13712 } 13713 if (typeof element.disabled !== 'undefined') { 13714 return element.disabled; 13715 } 13716 return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'; 13717 }; 13718 const findShadowRoot = element => { 13719 if (!document.documentElement.attachShadow) { 13720 return null; 13721 } 13722 13723 // Can find the shadow root otherwise it'll return the document 13724 if (typeof element.getRootNode === 'function') { 13725 const root = element.getRootNode(); 13726 return root instanceof ShadowRoot ? root : null; 13727 } 13728 if (element instanceof ShadowRoot) { 13729 return element; 13730 } 13731 13732 // when we don't find a shadow root 13733 if (!element.parentNode) { 13734 return null; 13735 } 13736 return findShadowRoot(element.parentNode); 13737 }; 13738 const noop = () => {}; 13739 13740 /** 13741 * Trick to restart an element's animation 13742 * 13743 * @param {HTMLElement} element 13744 * @return void 13745 * 13746 * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation 13747 */ 13748 const reflow = element => { 13749 element.offsetHeight; // eslint-disable-line no-unused-expressions 13750 }; 13751 const getjQuery = () => { 13752 if (__webpack_provided_window_dot_jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { 13753 return __webpack_provided_window_dot_jQuery; 13754 } 13755 return null; 13756 }; 13757 const DOMContentLoadedCallbacks = []; 13758 const onDOMContentLoaded = callback => { 13759 if (document.readyState === 'loading') { 13760 // add listener on the first call when the document is in loading state 13761 if (!DOMContentLoadedCallbacks.length) { 13762 document.addEventListener('DOMContentLoaded', () => { 13763 for (const callback of DOMContentLoadedCallbacks) { 13764 callback(); 13765 } 13766 }); 13767 } 13768 DOMContentLoadedCallbacks.push(callback); 13769 } else { 13770 callback(); 13771 } 13772 }; 13773 const isRTL = () => document.documentElement.dir === 'rtl'; 13774 const defineJQueryPlugin = plugin => { 13775 onDOMContentLoaded(() => { 13776 const $ = getjQuery(); 13777 /* istanbul ignore if */ 13778 if ($) { 13779 const name = plugin.NAME; 13780 const JQUERY_NO_CONFLICT = $.fn[name]; 13781 $.fn[name] = plugin.jQueryInterface; 13782 $.fn[name].Constructor = plugin; 13783 $.fn[name].noConflict = () => { 13784 $.fn[name] = JQUERY_NO_CONFLICT; 13785 return plugin.jQueryInterface; 13786 }; 13787 } 13788 }); 13789 }; 13790 const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => { 13791 return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue; 13792 }; 13793 const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { 13794 if (!waitForTransition) { 13795 execute(callback); 13796 return; 13797 } 13798 const durationPadding = 5; 13799 const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; 13800 let called = false; 13801 const handler = ({ 13802 target 13803 }) => { 13804 if (target !== transitionElement) { 13805 return; 13806 } 13807 called = true; 13808 transitionElement.removeEventListener(TRANSITION_END, handler); 13809 execute(callback); 13810 }; 13811 transitionElement.addEventListener(TRANSITION_END, handler); 13812 setTimeout(() => { 13813 if (!called) { 13814 triggerTransitionEnd(transitionElement); 13815 } 13816 }, emulatedDuration); 13817 }; 13818 13819 /** 13820 * Return the previous/next element of a list. 13821 * 13822 * @param {array} list The list of elements 13823 * @param activeElement The active element 13824 * @param shouldGetNext Choose to get next or previous element 13825 * @param isCycleAllowed 13826 * @return {Element|elem} The proper element 13827 */ 13828 const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { 13829 const listLength = list.length; 13830 let index = list.indexOf(activeElement); 13831 13832 // if the element does not exist in the list return an element 13833 // depending on the direction and if cycle is allowed 13834 if (index === -1) { 13835 return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]; 13836 } 13837 index += shouldGetNext ? 1 : -1; 13838 if (isCycleAllowed) { 13839 index = (index + listLength) % listLength; 13840 } 13841 return list[Math.max(0, Math.min(index, listLength - 1))]; 13842 }; 13843 13844 exports.defineJQueryPlugin = defineJQueryPlugin; 13845 exports.execute = execute; 13846 exports.executeAfterTransition = executeAfterTransition; 13847 exports.findShadowRoot = findShadowRoot; 13848 exports.getElement = getElement; 13849 exports.getNextActiveElement = getNextActiveElement; 13850 exports.getTransitionDurationFromElement = getTransitionDurationFromElement; 13851 exports.getUID = getUID; 13852 exports.getjQuery = getjQuery; 13853 exports.isDisabled = isDisabled; 13854 exports.isElement = isElement; 13855 exports.isRTL = isRTL; 13856 exports.isVisible = isVisible; 13857 exports.noop = noop; 13858 exports.onDOMContentLoaded = onDOMContentLoaded; 13859 exports.parseSelector = parseSelector; 13860 exports.reflow = reflow; 13861 exports.toType = toType; 13862 exports.triggerTransitionEnd = triggerTransitionEnd; 13863 13864 Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 13865 13866 })); 13867//# sourceMappingURL=index.js.map 13868 13869 13870 /***/ }), 13871 13872
vendor: 5,624 bytes, lines 13872-13995
13872/***/ "./node_modules/bootstrap/js/dist/util/sanitizer.js": 13873 /*!**********************************************************!*\ 13874 !*** ./node_modules/bootstrap/js/dist/util/sanitizer.js ***! 13875 \**********************************************************/ 13876 /***/ (function(__unused_webpack_module, exports) { 13877 13878 /*! 13879 * Bootstrap sanitizer.js v5.3.3 (https://getbootstrap.com/) 13880 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 13881 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 13882 */ 13883 (function (global, factory) { 13884 true ? factory(exports) : 13885 0; 13886 })(this, (function (exports) { 'use strict'; 13887 13888 /** 13889 * -------------------------------------------------------------------------- 13890 * Bootstrap util/sanitizer.js 13891 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 13892 * -------------------------------------------------------------------------- 13893 */ 13894 13895 // js-docs-start allow-list 13896 const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; 13897 const DefaultAllowlist = { 13898 // Global attributes allowed on any supplied element below. 13899 '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], 13900 a: ['target', 'href', 'title', 'rel'], 13901 area: [], 13902 b: [], 13903 br: [], 13904 col: [], 13905 code: [], 13906 dd: [], 13907 div: [], 13908 dl: [], 13909 dt: [], 13910 em: [], 13911 hr: [], 13912 h1: [], 13913 h2: [], 13914 h3: [], 13915 h4: [], 13916 h5: [], 13917 h6: [], 13918 i: [], 13919 img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], 13920 li: [], 13921 ol: [], 13922 p: [], 13923 pre: [], 13924 s: [], 13925 small: [], 13926 span: [], 13927 sub: [], 13928 sup: [], 13929 strong: [], 13930 u: [], 13931 ul: [] 13932 }; 13933 // js-docs-end allow-list 13934 13935 const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']); 13936 13937 /** 13938 * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation 13939 * contexts. 13940 * 13941 * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38 13942 */ 13943 // eslint-disable-next-line unicorn/better-regex 13944 const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i; 13945 const allowedAttribute = (attribute, allowedAttributeList) => { 13946 const attributeName = attribute.nodeName.toLowerCase(); 13947 if (allowedAttributeList.includes(attributeName)) { 13948 if (uriAttributes.has(attributeName)) { 13949 return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue)); 13950 } 13951 return true; 13952 } 13953 13954 // Check if a regular expression validates the attribute. 13955 return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName)); 13956 }; 13957 function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) { 13958 if (!unsafeHtml.length) { 13959 return unsafeHtml; 13960 } 13961 if (sanitizeFunction && typeof sanitizeFunction === 'function') { 13962 return sanitizeFunction(unsafeHtml); 13963 } 13964 const domParser = new window.DOMParser(); 13965 const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); 13966 const elements = [].concat(...createdDocument.body.querySelectorAll('*')); 13967 for (const element of elements) { 13968 const elementName = element.nodeName.toLowerCase(); 13969 if (!Object.keys(allowList).includes(elementName)) { 13970 element.remove(); 13971 continue; 13972 } 13973 const attributeList = [].concat(...element.attributes); 13974 const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []); 13975 for (const attribute of attributeList) { 13976 if (!allowedAttribute(attribute, allowedAttributes)) { 13977 element.removeAttribute(attribute.nodeName); 13978 } 13979 } 13980 } 13981 return createdDocument.body.innerHTML; 13982 } 13983 13984 exports.DefaultAllowlist = DefaultAllowlist; 13985 exports.sanitizeHtml = sanitizeHtml; 13986 13987 Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 13988 13989 })); 13990//# sourceMappingURL=sanitizer.js.map 13991 13992 13993 /***/ }), 13994 13995
vendor: 7,240 bytes, lines 13995-14155
13995/***/ "./node_modules/bootstrap/js/dist/util/template-factory.js": 13996 /*!*****************************************************************!*\ 13997 !*** ./node_modules/bootstrap/js/dist/util/template-factory.js ***! 13998 \*****************************************************************/ 13999 /***/ (function(module, __unused_webpack_exports, __webpack_require__) { 14000 14001 /*! 14002 * Bootstrap template-factory.js v5.3.3 (https://getbootstrap.com/) 14003 * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 14004 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 14005 */ 14006 (function (global, factory) { 14007 true ? module.exports = factory(__webpack_require__(/*! ../dom/selector-engine.js */ "./node_modules/bootstrap/js/dist/dom/selector-engine.js"), __webpack_require__(/*! ./config.js */ "./node_modules/bootstrap/js/dist/util/config.js"), __webpack_require__(/*! ./sanitizer.js */ "./node_modules/bootstrap/js/dist/util/sanitizer.js"), __webpack_require__(/*! ./index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) : 14008 0; 14009 })(this, (function (SelectorEngine, Config, sanitizer_js, index_js) { 'use strict'; 14010 14011 /** 14012 * -------------------------------------------------------------------------- 14013 * Bootstrap util/template-factory.js 14014 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 14015 * -------------------------------------------------------------------------- 14016 */ 14017 14018 14019 /** 14020 * Constants 14021 */ 14022 14023 const NAME = 'TemplateFactory'; 14024 const Default = { 14025 allowList: sanitizer_js.DefaultAllowlist, 14026 content: {}, 14027 // { selector : text , selector2 : text2 , } 14028 extraClass: '', 14029 html: false, 14030 sanitize: true, 14031 sanitizeFn: null, 14032 template: '<div></div>' 14033 }; 14034 const DefaultType = { 14035 allowList: 'object', 14036 content: 'object', 14037 extraClass: '(string|function)', 14038 html: 'boolean', 14039 sanitize: 'boolean', 14040 sanitizeFn: '(null|function)', 14041 template: 'string' 14042 }; 14043 const DefaultContentType = { 14044 entry: '(string|element|function|null)', 14045 selector: '(string|element)' 14046 }; 14047 14048 /** 14049 * Class definition 14050 */ 14051 14052 class TemplateFactory extends Config { 14053 constructor(config) { 14054 super(); 14055 this._config = this._getConfig(config); 14056 } 14057 14058 // Getters 14059 static get Default() { 14060 return Default; 14061 } 14062 static get DefaultType() { 14063 return DefaultType; 14064 } 14065 static get NAME() { 14066 return NAME; 14067 } 14068 14069 // Public 14070 getContent() { 14071 return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean); 14072 } 14073 hasContent() { 14074 return this.getContent().length > 0; 14075 } 14076 changeContent(content) { 14077 this._checkContent(content); 14078 this._config.content = { 14079 ...this._config.content, 14080 ...content 14081 }; 14082 return this; 14083 } 14084 toHtml() { 14085 const templateWrapper = document.createElement('div'); 14086 templateWrapper.innerHTML = this._maybeSanitize(this._config.template); 14087 for (const [selector, text] of Object.entries(this._config.content)) { 14088 this._setContent(templateWrapper, text, selector); 14089 } 14090 const template = templateWrapper.children[0]; 14091 const extraClass = this._resolvePossibleFunction(this._config.extraClass); 14092 if (extraClass) { 14093 template.classList.add(...extraClass.split(' ')); 14094 } 14095 return template; 14096 } 14097 14098 // Private 14099 _typeCheckConfig(config) { 14100 super._typeCheckConfig(config); 14101 this._checkContent(config.content); 14102 } 14103 _checkContent(arg) { 14104 for (const [selector, content] of Object.entries(arg)) { 14105 super._typeCheckConfig({ 14106 selector, 14107 entry: content 14108 }, DefaultContentType); 14109 } 14110 } 14111 _setContent(template, content, selector) { 14112 const templateElement = SelectorEngine.findOne(selector, template); 14113 if (!templateElement) { 14114 return; 14115 } 14116 content = this._resolvePossibleFunction(content); 14117 if (!content) { 14118 templateElement.remove(); 14119 return; 14120 } 14121 if (index_js.isElement(content)) { 14122 this._putElementInTemplate(index_js.getElement(content), templateElement); 14123 return; 14124 } 14125 if (this._config.html) { 14126 templateElement.innerHTML = this._maybeSanitize(content); 14127 return; 14128 } 14129 templateElement.textContent = content; 14130 } 14131 _maybeSanitize(arg) { 14132 return this._config.sanitize ? sanitizer_js.sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg; 14133 } 14134 _resolvePossibleFunction(arg) { 14135 return index_js.execute(arg, [this]); 14136 } 14137 _putElementInTemplate(element, templateElement) { 14138 if (this._config.html) { 14139 templateElement.innerHTML = ''; 14140 templateElement.append(element); 14141 return; 14142 } 14143 templateElement.textContent = element.textContent; 14144 } 14145 } 14146 14147 return TemplateFactory; 14148 14149 })); 14150//# sourceMappingURL=template-factory.js.map 14151 14152 14153 /***/ }), 14154 14155
vendor: 71,522 bytes, lines 14155-15955
14155/***/ "./node_modules/buffer/index.js": 14156 /*!**************************************!*\ 14157 !*** ./node_modules/buffer/index.js ***! 14158 \**************************************/ 14159 /***/ (function(__unused_webpack_module, exports, __webpack_require__) { 14160 14161 "use strict"; 14162 /*! 14163 * The buffer module from node.js, for the browser. 14164 * 14165 * @author Feross Aboukhadijeh <http://feross.org> 14166 * @license MIT 14167 */ 14168 /* eslint-disable no-proto */ 14169 14170 14171 14172 var base64 = __webpack_require__(/*! base64-js */ "./node_modules/base64-js/index.js") 14173 var ieee754 = __webpack_require__(/*! ieee754 */ "./node_modules/ieee754/index.js") 14174 var isArray = __webpack_require__(/*! isarray */ "./node_modules/isarray/index.js") 14175 14176 exports.Buffer = Buffer 14177 exports.SlowBuffer = SlowBuffer 14178 exports.INSPECT_MAX_BYTES = 50 14179 14180 /** 14181 * If `Buffer.TYPED_ARRAY_SUPPORT`: 14182 * === true Use Uint8Array implementation (fastest) 14183 * === false Use Object implementation (most compatible, even IE6) 14184 * 14185 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, 14186 * Opera 11.6+, iOS 4.2+. 14187 * 14188 * Due to various browser bugs, sometimes the Object implementation will be used even 14189 * when the browser supports typed arrays. 14190 * 14191 * Note: 14192 * 14193 * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, 14194 * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. 14195 * 14196 * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. 14197 * 14198 * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of 14199 * incorrect length in some situations. 14200 14201 * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they 14202 * get the Object implementation, which is slower but behaves correctly. 14203 */ 14204 Buffer.TYPED_ARRAY_SUPPORT = __webpack_require__.g.TYPED_ARRAY_SUPPORT !== undefined 14205 ? __webpack_require__.g.TYPED_ARRAY_SUPPORT 14206 : typedArraySupport() 14207 14208 /* 14209 * Export kMaxLength after typed array support is determined. 14210 */ 14211 exports.kMaxLength = kMaxLength() 14212 14213 function typedArraySupport () { 14214 try { 14215 var arr = new Uint8Array(1) 14216 arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} 14217 return arr.foo() === 42 && // typed array instances can be augmented 14218 typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` 14219 arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` 14220 } catch (e) { 14221 return false 14222 } 14223 } 14224 14225 function kMaxLength () { 14226 return Buffer.TYPED_ARRAY_SUPPORT 14227 ? 0x7fffffff 14228 : 0x3fffffff 14229 } 14230 14231 function createBuffer (that, length) { 14232 if (kMaxLength() < length) { 14233 throw new RangeError('Invalid typed array length') 14234 } 14235 if (Buffer.TYPED_ARRAY_SUPPORT) { 14236 // Return an augmented `Uint8Array` instance, for best performance 14237 that = new Uint8Array(length) 14238 that.__proto__ = Buffer.prototype 14239 } else { 14240 // Fallback: Return an object instance of the Buffer class 14241 if (that === null) { 14242 that = new Buffer(length) 14243 } 14244 that.length = length 14245 } 14246 14247 return that 14248 } 14249 14250 /** 14251 * The Buffer constructor returns instances of `Uint8Array` that have their 14252 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of 14253 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods 14254 * and the `Uint8Array` methods. Square bracket notation works as expected -- it 14255 * returns a single octet. 14256 * 14257 * The `Uint8Array` prototype remains unmodified. 14258 */ 14259 14260 function Buffer (arg, encodingOrOffset, length) { 14261 if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { 14262 return new Buffer(arg, encodingOrOffset, length) 14263 } 14264 14265 // Common case. 14266 if (typeof arg === 'number') { 14267 if (typeof encodingOrOffset === 'string') { 14268 throw new Error( 14269 'If encoding is specified then the first argument must be a string' 14270 ) 14271 } 14272 return allocUnsafe(this, arg) 14273 } 14274 return from(this, arg, encodingOrOffset, length) 14275 } 14276 14277 Buffer.poolSize = 8192 // not used by this implementation 14278 14279// TODO: Legacy, not needed anymore. Remove in next major version. 14280 Buffer._augment = function (arr) { 14281 arr.__proto__ = Buffer.prototype 14282 return arr 14283 } 14284 14285 function from (that, value, encodingOrOffset, length) { 14286 if (typeof value === 'number') { 14287 throw new TypeError('"value" argument must not be a number') 14288 } 14289 14290 if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { 14291 return fromArrayBuffer(that, value, encodingOrOffset, length) 14292 } 14293 14294 if (typeof value === 'string') { 14295 return fromString(that, value, encodingOrOffset) 14296 } 14297 14298 return fromObject(that, value) 14299 } 14300 14301 /** 14302 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError 14303 * if value is a number. 14304 * Buffer.from(str[, encoding]) 14305 * Buffer.from(array) 14306 * Buffer.from(buffer) 14307 * Buffer.from(arrayBuffer[, byteOffset[, length]]) 14308 **/ 14309 Buffer.from = function (value, encodingOrOffset, length) { 14310 return from(null, value, encodingOrOffset, length) 14311 } 14312 14313 if (Buffer.TYPED_ARRAY_SUPPORT) { 14314 Buffer.prototype.__proto__ = Uint8Array.prototype 14315 Buffer.__proto__ = Uint8Array 14316 if (typeof Symbol !== 'undefined' && Symbol.species && 14317 Buffer[Symbol.species] === Buffer) { 14318 // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 14319 Object.defineProperty(Buffer, Symbol.species, { 14320 value: null, 14321 configurable: true 14322 }) 14323 } 14324 } 14325 14326 function assertSize (size) { 14327 if (typeof size !== 'number') { 14328 throw new TypeError('"size" argument must be a number') 14329 } else if (size < 0) { 14330 throw new RangeError('"size" argument must not be negative') 14331 } 14332 } 14333 14334 function alloc (that, size, fill, encoding) { 14335 assertSize(size) 14336 if (size <= 0) { 14337 return createBuffer(that, size) 14338 } 14339 if (fill !== undefined) { 14340 // Only pay attention to encoding if it's a string. This 14341 // prevents accidentally sending in a number that would 14342 // be interpretted as a start offset. 14343 return typeof encoding === 'string' 14344 ? createBuffer(that, size).fill(fill, encoding) 14345 : createBuffer(that, size).fill(fill) 14346 } 14347 return createBuffer(that, size) 14348 } 14349 14350 /** 14351 * Creates a new filled Buffer instance. 14352 * alloc(size[, fill[, encoding]]) 14353 **/ 14354 Buffer.alloc = function (size, fill, encoding) { 14355 return alloc(null, size, fill, encoding) 14356 } 14357 14358 function allocUnsafe (that, size) { 14359 assertSize(size) 14360 that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) 14361 if (!Buffer.TYPED_ARRAY_SUPPORT) { 14362 for (var i = 0; i < size; ++i) { 14363 that[i] = 0 14364 } 14365 } 14366 return that 14367 } 14368 14369 /** 14370 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. 14371 * */ 14372 Buffer.allocUnsafe = function (size) { 14373 return allocUnsafe(null, size) 14374 } 14375 /** 14376 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. 14377 */ 14378 Buffer.allocUnsafeSlow = function (size) { 14379 return allocUnsafe(null, size) 14380 } 14381 14382 function fromString (that, string, encoding) { 14383 if (typeof encoding !== 'string' || encoding === '') { 14384 encoding = 'utf8' 14385 } 14386 14387 if (!Buffer.isEncoding(encoding)) { 14388 throw new TypeError('"encoding" must be a valid string encoding') 14389 } 14390 14391 var length = byteLength(string, encoding) | 0 14392 that = createBuffer(that, length) 14393 14394 var actual = that.write(string, encoding) 14395 14396 if (actual !== length) { 14397 // Writing a hex string, for example, that contains invalid characters will 14398 // cause everything after the first invalid character to be ignored. (e.g. 14399 // 'abxxcd' will be treated as 'ab') 14400 that = that.slice(0, actual) 14401 } 14402 14403 return that 14404 } 14405 14406 function fromArrayLike (that, array) { 14407 var length = array.length < 0 ? 0 : checked(array.length) | 0 14408 that = createBuffer(that, length) 14409 for (var i = 0; i < length; i += 1) { 14410 that[i] = array[i] & 255 14411 } 14412 return that 14413 } 14414 14415 function fromArrayBuffer (that, array, byteOffset, length) { 14416 array.byteLength // this throws if `array` is not a valid ArrayBuffer 14417 14418 if (byteOffset < 0 || array.byteLength < byteOffset) { 14419 throw new RangeError('\'offset\' is out of bounds') 14420 } 14421 14422 if (array.byteLength < byteOffset + (length || 0)) { 14423 throw new RangeError('\'length\' is out of bounds') 14424 } 14425 14426 if (byteOffset === undefined && length === undefined) { 14427 array = new Uint8Array(array) 14428 } else if (length === undefined) { 14429 array = new Uint8Array(array, byteOffset) 14430 } else { 14431 array = new Uint8Array(array, byteOffset, length) 14432 } 14433 14434 if (Buffer.TYPED_ARRAY_SUPPORT) { 14435 // Return an augmented `Uint8Array` instance, for best performance 14436 that = array 14437 that.__proto__ = Buffer.prototype 14438 } else { 14439 // Fallback: Return an object instance of the Buffer class 14440 that = fromArrayLike(that, array) 14441 } 14442 return that 14443 } 14444 14445 function fromObject (that, obj) { 14446 if (Buffer.isBuffer(obj)) { 14447 var len = checked(obj.length) | 0 14448 that = createBuffer(that, len) 14449 14450 if (that.length === 0) { 14451 return that 14452 } 14453 14454 obj.copy(that, 0, 0, len) 14455 return that 14456 } 14457 14458 if (obj) { 14459 if ((typeof ArrayBuffer !== 'undefined' && 14460 obj.buffer instanceof ArrayBuffer) || 'length' in obj) { 14461 if (typeof obj.length !== 'number' || isnan(obj.length)) { 14462 return createBuffer(that, 0) 14463 } 14464 return fromArrayLike(that, obj) 14465 } 14466 14467 if (obj.type === 'Buffer' && isArray(obj.data)) { 14468 return fromArrayLike(that, obj.data) 14469 } 14470 } 14471 14472 throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') 14473 } 14474 14475 function checked (length) { 14476 // Note: cannot use `length < kMaxLength()` here because that fails when 14477 // length is NaN (which is otherwise coerced to zero.) 14478 if (length >= kMaxLength()) { 14479 throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 14480 'size: 0x' + kMaxLength().toString(16) + ' bytes') 14481 } 14482 return length | 0 14483 } 14484 14485 function SlowBuffer (length) { 14486 if (+length != length) { // eslint-disable-line eqeqeq 14487 length = 0 14488 } 14489 return Buffer.alloc(+length) 14490 } 14491 14492 Buffer.isBuffer = function isBuffer (b) { 14493 return !!(b != null && b._isBuffer) 14494 } 14495 14496 Buffer.compare = function compare (a, b) { 14497 if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { 14498 throw new TypeError('Arguments must be Buffers') 14499 } 14500 14501 if (a === b) return 0 14502 14503 var x = a.length 14504 var y = b.length 14505 14506 for (var i = 0, len = Math.min(x, y); i < len; ++i) { 14507 if (a[i] !== b[i]) { 14508 x = a[i] 14509 y = b[i] 14510 break 14511 } 14512 } 14513 14514 if (x < y) return -1 14515 if (y < x) return 1 14516 return 0 14517 } 14518 14519 Buffer.isEncoding = function isEncoding (encoding) { 14520 switch (String(encoding).toLowerCase()) { 14521 case 'hex': 14522 case 'utf8': 14523 case 'utf-8': 14524 case 'ascii': 14525 case 'latin1': 14526 case 'binary': 14527 case 'base64': 14528 case 'ucs2': 14529 case 'ucs-2': 14530 case 'utf16le': 14531 case 'utf-16le': 14532 return true 14533 default: 14534 return false 14535 } 14536 } 14537 14538 Buffer.concat = function concat (list, length) { 14539 if (!isArray(list)) { 14540 throw new TypeError('"list" argument must be an Array of Buffers') 14541 } 14542 14543 if (list.length === 0) { 14544 return Buffer.alloc(0) 14545 } 14546 14547 var i 14548 if (length === undefined) { 14549 length = 0 14550 for (i = 0; i < list.length; ++i) { 14551 length += list[i].length 14552 } 14553 } 14554 14555 var buffer = Buffer.allocUnsafe(length) 14556 var pos = 0 14557 for (i = 0; i < list.length; ++i) { 14558 var buf = list[i] 14559 if (!Buffer.isBuffer(buf)) { 14560 throw new TypeError('"list" argument must be an Array of Buffers') 14561 } 14562 buf.copy(buffer, pos) 14563 pos += buf.length 14564 } 14565 return buffer 14566 } 14567 14568 function byteLength (string, encoding) { 14569 if (Buffer.isBuffer(string)) { 14570 return string.length 14571 } 14572 if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && 14573 (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { 14574 return string.byteLength 14575 } 14576 if (typeof string !== 'string') { 14577 string = '' + string 14578 } 14579 14580 var len = string.length 14581 if (len === 0) return 0 14582 14583 // Use a for loop to avoid recursion 14584 var loweredCase = false 14585 for (;;) { 14586 switch (encoding) { 14587 case 'ascii': 14588 case 'latin1': 14589 case 'binary': 14590 return len 14591 case 'utf8': 14592 case 'utf-8': 14593 case undefined: 14594 return utf8ToBytes(string).length 14595 case 'ucs2': 14596 case 'ucs-2': 14597 case 'utf16le': 14598 case 'utf-16le': 14599 return len * 2 14600 case 'hex': 14601 return len >>> 1 14602 case 'base64': 14603 return base64ToBytes(string).length 14604 default: 14605 if (loweredCase) return utf8ToBytes(string).length // assume utf8 14606 encoding = ('' + encoding).toLowerCase() 14607 loweredCase = true 14608 } 14609 } 14610 } 14611 Buffer.byteLength = byteLength 14612 14613 function slowToString (encoding, start, end) { 14614 var loweredCase = false 14615 14616 // No need to verify that "this.length <= MAX_UINT32" since it's a read-only 14617 // property of a typed array. 14618 14619 // This behaves neither like String nor Uint8Array in that we set start/end 14620 // to their upper/lower bounds if the value passed is out of range. 14621 // undefined is handled specially as per ECMA-262 6th Edition, 14622 // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. 14623 if (start === undefined || start < 0) { 14624 start = 0 14625 } 14626 // Return early if start > this.length. Done here to prevent potential uint32 14627 // coercion fail below. 14628 if (start > this.length) { 14629 return '' 14630 } 14631 14632 if (end === undefined || end > this.length) { 14633 end = this.length 14634 } 14635 14636 if (end <= 0) { 14637 return '' 14638 } 14639 14640 // Force coersion to uint32. This will also coerce falsey/NaN values to 0. 14641 end >>>= 0 14642 start >>>= 0 14643 14644 if (end <= start) { 14645 return '' 14646 } 14647 14648 if (!encoding) encoding = 'utf8' 14649 14650 while (true) { 14651 switch (encoding) { 14652 case 'hex': 14653 return hexSlice(this, start, end) 14654 14655 case 'utf8': 14656 case 'utf-8': 14657 return utf8Slice(this, start, end) 14658 14659 case 'ascii': 14660 return asciiSlice(this, start, end) 14661 14662 case 'latin1': 14663 case 'binary': 14664 return latin1Slice(this, start, end) 14665 14666 case 'base64': 14667 return base64Slice(this, start, end) 14668 14669 case 'ucs2': 14670 case 'ucs-2': 14671 case 'utf16le': 14672 case 'utf-16le': 14673 return utf16leSlice(this, start, end) 14674 14675 default: 14676 if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) 14677 encoding = (encoding + '').toLowerCase() 14678 loweredCase = true 14679 } 14680 } 14681 } 14682 14683// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect 14684// Buffer instances. 14685 Buffer.prototype._isBuffer = true 14686 14687 function swap (b, n, m) { 14688 var i = b[n] 14689 b[n] = b[m] 14690 b[m] = i 14691 } 14692 14693 Buffer.prototype.swap16 = function swap16 () { 14694 var len = this.length 14695 if (len % 2 !== 0) { 14696 throw new RangeError('Buffer size must be a multiple of 16-bits') 14697 } 14698 for (var i = 0; i < len; i += 2) { 14699 swap(this, i, i + 1) 14700 } 14701 return this 14702 } 14703 14704 Buffer.prototype.swap32 = function swap32 () { 14705 var len = this.length 14706 if (len % 4 !== 0) { 14707 throw new RangeError('Buffer size must be a multiple of 32-bits') 14708 } 14709 for (var i = 0; i < len; i += 4) { 14710 swap(this, i, i + 3) 14711 swap(this, i + 1, i + 2) 14712 } 14713 return this 14714 } 14715 14716 Buffer.prototype.swap64 = function swap64 () { 14717 var len = this.length 14718 if (len % 8 !== 0) { 14719 throw new RangeError('Buffer size must be a multiple of 64-bits') 14720 } 14721 for (var i = 0; i < len; i += 8) { 14722 swap(this, i, i + 7) 14723 swap(this, i + 1, i + 6) 14724 swap(this, i + 2, i + 5) 14725 swap(this, i + 3, i + 4) 14726 } 14727 return this 14728 } 14729 14730 Buffer.prototype.toString = function toString () { 14731 var length = this.length | 0 14732 if (length === 0) return '' 14733 if (arguments.length === 0) return utf8Slice(this, 0, length) 14734 return slowToString.apply(this, arguments) 14735 } 14736 14737 Buffer.prototype.equals = function equals (b) { 14738 if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') 14739 if (this === b) return true 14740 return Buffer.compare(this, b) === 0 14741 } 14742 14743 Buffer.prototype.inspect = function inspect () { 14744 var str = '' 14745 var max = exports.INSPECT_MAX_BYTES 14746 if (this.length > 0) { 14747 str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') 14748 if (this.length > max) str += ' ... ' 14749 } 14750 return '<Buffer ' + str + '>' 14751 } 14752 14753 Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { 14754 if (!Buffer.isBuffer(target)) { 14755 throw new TypeError('Argument must be a Buffer') 14756 } 14757 14758 if (start === undefined) { 14759 start = 0 14760 } 14761 if (end === undefined) { 14762 end = target ? target.length : 0 14763 } 14764 if (thisStart === undefined) { 14765 thisStart = 0 14766 } 14767 if (thisEnd === undefined) { 14768 thisEnd = this.length 14769 } 14770 14771 if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { 14772 throw new RangeError('out of range index') 14773 } 14774 14775 if (thisStart >= thisEnd && start >= end) { 14776 return 0 14777 } 14778 if (thisStart >= thisEnd) { 14779 return -1 14780 } 14781 if (start >= end) { 14782 return 1 14783 } 14784 14785 start >>>= 0 14786 end >>>= 0 14787 thisStart >>>= 0 14788 thisEnd >>>= 0 14789 14790 if (this === target) return 0 14791 14792 var x = thisEnd - thisStart 14793 var y = end - start 14794 var len = Math.min(x, y) 14795 14796 var thisCopy = this.slice(thisStart, thisEnd) 14797 var targetCopy = target.slice(start, end) 14798 14799 for (var i = 0; i < len; ++i) { 14800 if (thisCopy[i] !== targetCopy[i]) { 14801 x = thisCopy[i] 14802 y = targetCopy[i] 14803 break 14804 } 14805 } 14806 14807 if (x < y) return -1 14808 if (y < x) return 1 14809 return 0 14810 } 14811 14812// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, 14813// OR the last index of `val` in `buffer` at offset <= `byteOffset`. 14814// 14815// Arguments: 14816// - buffer - a Buffer to search 14817// - val - a string, Buffer, or number 14818// - byteOffset - an index into `buffer`; will be clamped to an int32 14819// - encoding - an optional encoding, relevant is val is a string 14820// - dir - true for indexOf, false for lastIndexOf 14821 function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { 14822 // Empty buffer means no match 14823 if (buffer.length === 0) return -1 14824 14825 // Normalize byteOffset 14826 if (typeof byteOffset === 'string') { 14827 encoding = byteOffset 14828 byteOffset = 0 14829 } else if (byteOffset > 0x7fffffff) { 14830 byteOffset = 0x7fffffff 14831 } else if (byteOffset < -0x80000000) { 14832 byteOffset = -0x80000000 14833 } 14834 byteOffset = +byteOffset // Coerce to Number. 14835 if (isNaN(byteOffset)) { 14836 // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer 14837 byteOffset = dir ? 0 : (buffer.length - 1) 14838 } 14839 14840 // Normalize byteOffset: negative offsets start from the end of the buffer 14841 if (byteOffset < 0) byteOffset = buffer.length + byteOffset 14842 if (byteOffset >= buffer.length) { 14843 if (dir) return -1 14844 else byteOffset = buffer.length - 1 14845 } else if (byteOffset < 0) { 14846 if (dir) byteOffset = 0 14847 else return -1 14848 } 14849 14850 // Normalize val 14851 if (typeof val === 'string') { 14852 val = Buffer.from(val, encoding) 14853 } 14854 14855 // Finally, search either indexOf (if dir is true) or lastIndexOf 14856 if (Buffer.isBuffer(val)) { 14857 // Special case: looking for empty string/buffer always fails 14858 if (val.length === 0) { 14859 return -1 14860 } 14861 return arrayIndexOf(buffer, val, byteOffset, encoding, dir) 14862 } else if (typeof val === 'number') { 14863 val = val & 0xFF // Search for a byte value [0-255] 14864 if (Buffer.TYPED_ARRAY_SUPPORT && 14865 typeof Uint8Array.prototype.indexOf === 'function') { 14866 if (dir) { 14867 return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) 14868 } else { 14869 return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) 14870 } 14871 } 14872 return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) 14873 } 14874 14875 throw new TypeError('val must be string, number or Buffer') 14876 } 14877 14878 function arrayIndexOf (arr, val, byteOffset, encoding, dir) { 14879 var indexSize = 1 14880 var arrLength = arr.length 14881 var valLength = val.length 14882 14883 if (encoding !== undefined) { 14884 encoding = String(encoding).toLowerCase() 14885 if (encoding === 'ucs2' || encoding === 'ucs-2' || 14886 encoding === 'utf16le' || encoding === 'utf-16le') { 14887 if (arr.length < 2 || val.length < 2) { 14888 return -1 14889 } 14890 indexSize = 2 14891 arrLength /= 2 14892 valLength /= 2 14893 byteOffset /= 2 14894 } 14895 } 14896 14897 function read (buf, i) { 14898 if (indexSize === 1) { 14899 return buf[i] 14900 } else { 14901 return buf.readUInt16BE(i * indexSize) 14902 } 14903 } 14904 14905 var i 14906 if (dir) { 14907 var foundIndex = -1 14908 for (i = byteOffset; i < arrLength; i++) { 14909 if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { 14910 if (foundIndex === -1) foundIndex = i 14911 if (i - foundIndex + 1 === valLength) return foundIndex * indexSize 14912 } else { 14913 if (foundIndex !== -1) i -= i - foundIndex 14914 foundIndex = -1 14915 } 14916 } 14917 } else { 14918 if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength 14919 for (i = byteOffset; i >= 0; i--) { 14920 var found = true 14921 for (var j = 0; j < valLength; j++) { 14922 if (read(arr, i + j) !== read(val, j)) { 14923 found = false 14924 break 14925 } 14926 } 14927 if (found) return i 14928 } 14929 } 14930 14931 return -1 14932 } 14933 14934 Buffer.prototype.includes = function includes (val, byteOffset, encoding) { 14935 return this.indexOf(val, byteOffset, encoding) !== -1 14936 } 14937 14938 Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { 14939 return bidirectionalIndexOf(this, val, byteOffset, encoding, true) 14940 } 14941 14942 Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { 14943 return bidirectionalIndexOf(this, val, byteOffset, encoding, false) 14944 } 14945 14946 function hexWrite (buf, string, offset, length) { 14947 offset = Number(offset) || 0 14948 var remaining = buf.length - offset 14949 if (!length) { 14950 length = remaining 14951 } else { 14952 length = Number(length) 14953 if (length > remaining) { 14954 length = remaining 14955 } 14956 } 14957 14958 // must be an even number of digits 14959 var strLen = string.length 14960 if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') 14961 14962 if (length > strLen / 2) { 14963 length = strLen / 2 14964 } 14965 for (var i = 0; i < length; ++i) { 14966 var parsed = parseInt(string.substr(i * 2, 2), 16) 14967 if (isNaN(parsed)) return i 14968 buf[offset + i] = parsed 14969 } 14970 return i 14971 } 14972 14973 function utf8Write (buf, string, offset, length) { 14974 return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) 14975 } 14976 14977 function asciiWrite (buf, string, offset, length) { 14978 return blitBuffer(asciiToBytes(string), buf, offset, length) 14979 } 14980 14981 function latin1Write (buf, string, offset, length) { 14982 return asciiWrite(buf, string, offset, length) 14983 } 14984 14985 function base64Write (buf, string, offset, length) { 14986 return blitBuffer(base64ToBytes(string), buf, offset, length) 14987 } 14988 14989 function ucs2Write (buf, string, offset, length) { 14990 return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) 14991 } 14992 14993 Buffer.prototype.write = function write (string, offset, length, encoding) { 14994 // Buffer#write(string) 14995 if (offset === undefined) { 14996 encoding = 'utf8' 14997 length = this.length 14998 offset = 0 14999 // Buffer#write(string, encoding) 15000 } else if (length === undefined && typeof offset === 'string') { 15001 encoding = offset 15002 length = this.length 15003 offset = 0 15004 // Buffer#write(string, offset[, length][, encoding]) 15005 } else if (isFinite(offset)) { 15006 offset = offset | 0 15007 if (isFinite(length)) { 15008 length = length | 0 15009 if (encoding === undefined) encoding = 'utf8' 15010 } else { 15011 encoding = length 15012 length = undefined 15013 } 15014 // legacy write(string, encoding, offset, length) - remove in v0.13 15015 } else { 15016 throw new Error( 15017 'Buffer.write(string, encoding, offset[, length]) is no longer supported' 15018 ) 15019 } 15020 15021 var remaining = this.length - offset 15022 if (length === undefined || length > remaining) length = remaining 15023 15024 if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { 15025 throw new RangeError('Attempt to write outside buffer bounds') 15026 } 15027 15028 if (!encoding) encoding = 'utf8' 15029 15030 var loweredCase = false 15031 for (;;) { 15032 switch (encoding) { 15033 case 'hex': 15034 return hexWrite(this, string, offset, length) 15035 15036 case 'utf8': 15037 case 'utf-8': 15038 return utf8Write(this, string, offset, length) 15039 15040 case 'ascii': 15041 return asciiWrite(this, string, offset, length) 15042 15043 case 'latin1': 15044 case 'binary': 15045 return latin1Write(this, string, offset, length) 15046 15047 case 'base64': 15048 // Warning: maxLength not taken into account in base64Write 15049 return base64Write(this, string, offset, length) 15050 15051 case 'ucs2': 15052 case 'ucs-2': 15053 case 'utf16le': 15054 case 'utf-16le': 15055 return ucs2Write(this, string, offset, length) 15056 15057 default: 15058 if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) 15059 encoding = ('' + encoding).toLowerCase() 15060 loweredCase = true 15061 } 15062 } 15063 } 15064 15065 Buffer.prototype.toJSON = function toJSON () { 15066 return { 15067 type: 'Buffer', 15068 data: Array.prototype.slice.call(this._arr || this, 0) 15069 } 15070 } 15071 15072 function base64Slice (buf, start, end) { 15073 if (start === 0 && end === buf.length) { 15074 return base64.fromByteArray(buf) 15075 } else { 15076 return base64.fromByteArray(buf.slice(start, end)) 15077 } 15078 } 15079 15080 function utf8Slice (buf, start, end) { 15081 end = Math.min(buf.length, end) 15082 var res = [] 15083 15084 var i = start 15085 while (i < end) { 15086 var firstByte = buf[i] 15087 var codePoint = null 15088 var bytesPerSequence = (firstByte > 0xEF) ? 4 15089 : (firstByte > 0xDF) ? 3 15090 : (firstByte > 0xBF) ? 2 15091 : 1 15092 15093 if (i + bytesPerSequence <= end) { 15094 var secondByte, thirdByte, fourthByte, tempCodePoint 15095 15096 switch (bytesPerSequence) { 15097 case 1: 15098 if (firstByte < 0x80) { 15099 codePoint = firstByte 15100 } 15101 break 15102 case 2: 15103 secondByte = buf[i + 1] 15104 if ((secondByte & 0xC0) === 0x80) { 15105 tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) 15106 if (tempCodePoint > 0x7F) { 15107 codePoint = tempCodePoint 15108 } 15109 } 15110 break 15111 case 3: 15112 secondByte = buf[i + 1] 15113 thirdByte = buf[i + 2] 15114 if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { 15115 tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) 15116 if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { 15117 codePoint = tempCodePoint 15118 } 15119 } 15120 break 15121 case 4: 15122 secondByte = buf[i + 1] 15123 thirdByte = buf[i + 2] 15124 fourthByte = buf[i + 3] 15125 if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { 15126 tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) 15127 if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { 15128 codePoint = tempCodePoint 15129 } 15130 } 15131 } 15132 } 15133 15134 if (codePoint === null) { 15135 // we did not generate a valid codePoint so insert a 15136 // replacement char (U+FFFD) and advance only 1 byte 15137 codePoint = 0xFFFD 15138 bytesPerSequence = 1 15139 } else if (codePoint > 0xFFFF) { 15140 // encode to utf16 (surrogate pair dance) 15141 codePoint -= 0x10000 15142 res.push(codePoint >>> 10 & 0x3FF | 0xD800) 15143 codePoint = 0xDC00 | codePoint & 0x3FF 15144 } 15145 15146 res.push(codePoint) 15147 i += bytesPerSequence 15148 } 15149 15150 return decodeCodePointsArray(res) 15151 } 15152 15153// Based on http://stackoverflow.com/a/22747272/680742, the browser with 15154// the lowest limit is Chrome, with 0x10000 args. 15155// We go 1 magnitude less, for safety 15156 var MAX_ARGUMENTS_LENGTH = 0x1000 15157 15158 function decodeCodePointsArray (codePoints) { 15159 var len = codePoints.length 15160 if (len <= MAX_ARGUMENTS_LENGTH) { 15161 return String.fromCharCode.apply(String, codePoints) // avoid extra slice() 15162 } 15163 15164 // Decode in chunks to avoid "call stack size exceeded". 15165 var res = '' 15166 var i = 0 15167 while (i < len) { 15168 res += String.fromCharCode.apply( 15169 String, 15170 codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) 15171 ) 15172 } 15173 return res 15174 } 15175 15176 function asciiSlice (buf, start, end) { 15177 var ret = '' 15178 end = Math.min(buf.length, end) 15179 15180 for (var i = start; i < end; ++i) { 15181 ret += String.fromCharCode(buf[i] & 0x7F) 15182 } 15183 return ret 15184 } 15185 15186 function latin1Slice (buf, start, end) { 15187 var ret = '' 15188 end = Math.min(buf.length, end) 15189 15190 for (var i = start; i < end; ++i) { 15191 ret += String.fromCharCode(buf[i]) 15192 } 15193 return ret 15194 } 15195 15196 function hexSlice (buf, start, end) { 15197 var len = buf.length 15198 15199 if (!start || start < 0) start = 0 15200 if (!end || end < 0 || end > len) end = len 15201 15202 var out = '' 15203 for (var i = start; i < end; ++i) { 15204 out += toHex(buf[i]) 15205 } 15206 return out 15207 } 15208 15209 function utf16leSlice (buf, start, end) { 15210 var bytes = buf.slice(start, end) 15211 var res = '' 15212 for (var i = 0; i < bytes.length; i += 2) { 15213 res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) 15214 } 15215 return res 15216 } 15217 15218 Buffer.prototype.slice = function slice (start, end) { 15219 var len = this.length 15220 start = ~~start 15221 end = end === undefined ? len : ~~end 15222 15223 if (start < 0) { 15224 start += len 15225 if (start < 0) start = 0 15226 } else if (start > len) { 15227 start = len 15228 } 15229 15230 if (end < 0) { 15231 end += len 15232 if (end < 0) end = 0 15233 } else if (end > len) { 15234 end = len 15235 } 15236 15237 if (end < start) end = start 15238 15239 var newBuf 15240 if (Buffer.TYPED_ARRAY_SUPPORT) { 15241 newBuf = this.subarray(start, end) 15242 newBuf.__proto__ = Buffer.prototype 15243 } else { 15244 var sliceLen = end - start 15245 newBuf = new Buffer(sliceLen, undefined) 15246 for (var i = 0; i < sliceLen; ++i) { 15247 newBuf[i] = this[i + start] 15248 } 15249 } 15250 15251 return newBuf 15252 } 15253 15254 /* 15255 * Need to make sure that buffer isn't trying to write out of bounds. 15256 */ 15257 function checkOffset (offset, ext, length) { 15258 if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') 15259 if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') 15260 } 15261 15262 Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { 15263 offset = offset | 0 15264 byteLength = byteLength | 0 15265 if (!noAssert) checkOffset(offset, byteLength, this.length) 15266 15267 var val = this[offset] 15268 var mul = 1 15269 var i = 0 15270 while (++i < byteLength && (mul *= 0x100)) { 15271 val += this[offset + i] * mul 15272 } 15273 15274 return val 15275 } 15276 15277 Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { 15278 offset = offset | 0 15279 byteLength = byteLength | 0 15280 if (!noAssert) { 15281 checkOffset(offset, byteLength, this.length) 15282 } 15283 15284 var val = this[offset + --byteLength] 15285 var mul = 1 15286 while (byteLength > 0 && (mul *= 0x100)) { 15287 val += this[offset + --byteLength] * mul 15288 } 15289 15290 return val 15291 } 15292 15293 Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { 15294 if (!noAssert) checkOffset(offset, 1, this.length) 15295 return this[offset] 15296 } 15297 15298 Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { 15299 if (!noAssert) checkOffset(offset, 2, this.length) 15300 return this[offset] | (this[offset + 1] << 8) 15301 } 15302 15303 Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { 15304 if (!noAssert) checkOffset(offset, 2, this.length) 15305 return (this[offset] << 8) | this[offset + 1] 15306 } 15307 15308 Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { 15309 if (!noAssert) checkOffset(offset, 4, this.length) 15310 15311 return ((this[offset]) | 15312 (this[offset + 1] << 8) | 15313 (this[offset + 2] << 16)) + 15314 (this[offset + 3] * 0x1000000) 15315 } 15316 15317 Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { 15318 if (!noAssert) checkOffset(offset, 4, this.length) 15319 15320 return (this[offset] * 0x1000000) + 15321 ((this[offset + 1] << 16) | 15322 (this[offset + 2] << 8) | 15323 this[offset + 3]) 15324 } 15325 15326 Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { 15327 offset = offset | 0 15328 byteLength = byteLength | 0 15329 if (!noAssert) checkOffset(offset, byteLength, this.length) 15330 15331 var val = this[offset] 15332 var mul = 1 15333 var i = 0 15334 while (++i < byteLength && (mul *= 0x100)) { 15335 val += this[offset + i] * mul 15336 } 15337 mul *= 0x80 15338 15339 if (val >= mul) val -= Math.pow(2, 8 * byteLength) 15340 15341 return val 15342 } 15343 15344 Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { 15345 offset = offset | 0 15346 byteLength = byteLength | 0 15347 if (!noAssert) checkOffset(offset, byteLength, this.length) 15348 15349 var i = byteLength 15350 var mul = 1 15351 var val = this[offset + --i] 15352 while (i > 0 && (mul *= 0x100)) { 15353 val += this[offset + --i] * mul 15354 } 15355 mul *= 0x80 15356 15357 if (val >= mul) val -= Math.pow(2, 8 * byteLength) 15358 15359 return val 15360 } 15361 15362 Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { 15363 if (!noAssert) checkOffset(offset, 1, this.length) 15364 if (!(this[offset] & 0x80)) return (this[offset]) 15365 return ((0xff - this[offset] + 1) * -1) 15366 } 15367 15368 Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { 15369 if (!noAssert) checkOffset(offset, 2, this.length) 15370 var val = this[offset] | (this[offset + 1] << 8) 15371 return (val & 0x8000) ? val | 0xFFFF0000 : val 15372 } 15373 15374 Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { 15375 if (!noAssert) checkOffset(offset, 2, this.length) 15376 var val = this[offset + 1] | (this[offset] << 8) 15377 return (val & 0x8000) ? val | 0xFFFF0000 : val 15378 } 15379 15380 Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { 15381 if (!noAssert) checkOffset(offset, 4, this.length) 15382 15383 return (this[offset]) | 15384 (this[offset + 1] << 8) | 15385 (this[offset + 2] << 16) | 15386 (this[offset + 3] << 24) 15387 } 15388 15389 Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { 15390 if (!noAssert) checkOffset(offset, 4, this.length) 15391 15392 return (this[offset] << 24) | 15393 (this[offset + 1] << 16) | 15394 (this[offset + 2] << 8) | 15395 (this[offset + 3]) 15396 } 15397 15398 Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { 15399 if (!noAssert) checkOffset(offset, 4, this.length) 15400 return ieee754.read(this, offset, true, 23, 4) 15401 } 15402 15403 Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { 15404 if (!noAssert) checkOffset(offset, 4, this.length) 15405 return ieee754.read(this, offset, false, 23, 4) 15406 } 15407 15408 Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { 15409 if (!noAssert) checkOffset(offset, 8, this.length) 15410 return ieee754.read(this, offset, true, 52, 8) 15411 } 15412 15413 Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { 15414 if (!noAssert) checkOffset(offset, 8, this.length) 15415 return ieee754.read(this, offset, false, 52, 8) 15416 } 15417 15418 function checkInt (buf, value, offset, ext, max, min) { 15419 if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') 15420 if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') 15421 if (offset + ext > buf.length) throw new RangeError('Index out of range') 15422 } 15423 15424 Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { 15425 value = +value 15426 offset = offset | 0 15427 byteLength = byteLength | 0 15428 if (!noAssert) { 15429 var maxBytes = Math.pow(2, 8 * byteLength) - 1 15430 checkInt(this, value, offset, byteLength, maxBytes, 0) 15431 } 15432 15433 var mul = 1 15434 var i = 0 15435 this[offset] = value & 0xFF 15436 while (++i < byteLength && (mul *= 0x100)) { 15437 this[offset + i] = (value / mul) & 0xFF 15438 } 15439 15440 return offset + byteLength 15441 } 15442 15443 Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { 15444 value = +value 15445 offset = offset | 0 15446 byteLength = byteLength | 0 15447 if (!noAssert) { 15448 var maxBytes = Math.pow(2, 8 * byteLength) - 1 15449 checkInt(this, value, offset, byteLength, maxBytes, 0) 15450 } 15451 15452 var i = byteLength - 1 15453 var mul = 1 15454 this[offset + i] = value & 0xFF 15455 while (--i >= 0 && (mul *= 0x100)) { 15456 this[offset + i] = (value / mul) & 0xFF 15457 } 15458 15459 return offset + byteLength 15460 } 15461 15462 Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { 15463 value = +value 15464 offset = offset | 0 15465 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) 15466 if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) 15467 this[offset] = (value & 0xff) 15468 return offset + 1 15469 } 15470 15471 function objectWriteUInt16 (buf, value, offset, littleEndian) { 15472 if (value < 0) value = 0xffff + value + 1 15473 for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { 15474 buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> 15475 (littleEndian ? i : 1 - i) * 8 15476 } 15477 } 15478 15479 Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { 15480 value = +value 15481 offset = offset | 0 15482 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) 15483 if (Buffer.TYPED_ARRAY_SUPPORT) { 15484 this[offset] = (value & 0xff) 15485 this[offset + 1] = (value >>> 8) 15486 } else { 15487 objectWriteUInt16(this, value, offset, true) 15488 } 15489 return offset + 2 15490 } 15491 15492 Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { 15493 value = +value 15494 offset = offset | 0 15495 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) 15496 if (Buffer.TYPED_ARRAY_SUPPORT) { 15497 this[offset] = (value >>> 8) 15498 this[offset + 1] = (value & 0xff) 15499 } else { 15500 objectWriteUInt16(this, value, offset, false) 15501 } 15502 return offset + 2 15503 } 15504 15505 function objectWriteUInt32 (buf, value, offset, littleEndian) { 15506 if (value < 0) value = 0xffffffff + value + 1 15507 for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { 15508 buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff 15509 } 15510 } 15511 15512 Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { 15513 value = +value 15514 offset = offset | 0 15515 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) 15516 if (Buffer.TYPED_ARRAY_SUPPORT) { 15517 this[offset + 3] = (value >>> 24) 15518 this[offset + 2] = (value >>> 16) 15519 this[offset + 1] = (value >>> 8) 15520 this[offset] = (value & 0xff) 15521 } else { 15522 objectWriteUInt32(this, value, offset, true) 15523 } 15524 return offset + 4 15525 } 15526 15527 Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { 15528 value = +value 15529 offset = offset | 0 15530 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) 15531 if (Buffer.TYPED_ARRAY_SUPPORT) { 15532 this[offset] = (value >>> 24) 15533 this[offset + 1] = (value >>> 16) 15534 this[offset + 2] = (value >>> 8) 15535 this[offset + 3] = (value & 0xff) 15536 } else { 15537 objectWriteUInt32(this, value, offset, false) 15538 } 15539 return offset + 4 15540 } 15541 15542 Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { 15543 value = +value 15544 offset = offset | 0 15545 if (!noAssert) { 15546 var limit = Math.pow(2, 8 * byteLength - 1) 15547 15548 checkInt(this, value, offset, byteLength, limit - 1, -limit) 15549 } 15550 15551 var i = 0 15552 var mul = 1 15553 var sub = 0 15554 this[offset] = value & 0xFF 15555 while (++i < byteLength && (mul *= 0x100)) { 15556 if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { 15557 sub = 1 15558 } 15559 this[offset + i] = ((value / mul) >> 0) - sub & 0xFF 15560 } 15561 15562 return offset + byteLength 15563 } 15564 15565 Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { 15566 value = +value 15567 offset = offset | 0 15568 if (!noAssert) { 15569 var limit = Math.pow(2, 8 * byteLength - 1) 15570 15571 checkInt(this, value, offset, byteLength, limit - 1, -limit) 15572 } 15573 15574 var i = byteLength - 1 15575 var mul = 1 15576 var sub = 0 15577 this[offset + i] = value & 0xFF 15578 while (--i >= 0 && (mul *= 0x100)) { 15579 if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { 15580 sub = 1 15581 } 15582 this[offset + i] = ((value / mul) >> 0) - sub & 0xFF 15583 } 15584 15585 return offset + byteLength 15586 } 15587 15588 Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { 15589 value = +value 15590 offset = offset | 0 15591 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) 15592 if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) 15593 if (value < 0) value = 0xff + value + 1 15594 this[offset] = (value & 0xff) 15595 return offset + 1 15596 } 15597 15598 Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { 15599 value = +value 15600 offset = offset | 0 15601 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) 15602 if (Buffer.TYPED_ARRAY_SUPPORT) { 15603 this[offset] = (value & 0xff) 15604 this[offset + 1] = (value >>> 8) 15605 } else { 15606 objectWriteUInt16(this, value, offset, true) 15607 } 15608 return offset + 2 15609 } 15610 15611 Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { 15612 value = +value 15613 offset = offset | 0 15614 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) 15615 if (Buffer.TYPED_ARRAY_SUPPORT) { 15616 this[offset] = (value >>> 8) 15617 this[offset + 1] = (value & 0xff) 15618 } else { 15619 objectWriteUInt16(this, value, offset, false) 15620 } 15621 return offset + 2 15622 } 15623 15624 Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { 15625 value = +value 15626 offset = offset | 0 15627 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) 15628 if (Buffer.TYPED_ARRAY_SUPPORT) { 15629 this[offset] = (value & 0xff) 15630 this[offset + 1] = (value >>> 8) 15631 this[offset + 2] = (value >>> 16) 15632 this[offset + 3] = (value >>> 24) 15633 } else { 15634 objectWriteUInt32(this, value, offset, true) 15635 } 15636 return offset + 4 15637 } 15638 15639 Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { 15640 value = +value 15641 offset = offset | 0 15642 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) 15643 if (value < 0) value = 0xffffffff + value + 1 15644 if (Buffer.TYPED_ARRAY_SUPPORT) { 15645 this[offset] = (value >>> 24) 15646 this[offset + 1] = (value >>> 16) 15647 this[offset + 2] = (value >>> 8) 15648 this[offset + 3] = (value & 0xff) 15649 } else { 15650 objectWriteUInt32(this, value, offset, false) 15651 } 15652 return offset + 4 15653 } 15654 15655 function checkIEEE754 (buf, value, offset, ext, max, min) { 15656 if (offset + ext > buf.length) throw new RangeError('Index out of range') 15657 if (offset < 0) throw new RangeError('Index out of range') 15658 } 15659 15660 function writeFloat (buf, value, offset, littleEndian, noAssert) { 15661 if (!noAssert) { 15662 checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) 15663 } 15664 ieee754.write(buf, value, offset, littleEndian, 23, 4) 15665 return offset + 4 15666 } 15667 15668 Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { 15669 return writeFloat(this, value, offset, true, noAssert) 15670 } 15671 15672 Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { 15673 return writeFloat(this, value, offset, false, noAssert) 15674 } 15675 15676 function writeDouble (buf, value, offset, littleEndian, noAssert) { 15677 if (!noAssert) { 15678 checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) 15679 } 15680 ieee754.write(buf, value, offset, littleEndian, 52, 8) 15681 return offset + 8 15682 } 15683 15684 Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { 15685 return writeDouble(this, value, offset, true, noAssert) 15686 } 15687 15688 Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { 15689 return writeDouble(this, value, offset, false, noAssert) 15690 } 15691 15692// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) 15693 Buffer.prototype.copy = function copy (target, targetStart, start, end) { 15694 if (!start) start = 0 15695 if (!end && end !== 0) end = this.length 15696 if (targetStart >= target.length) targetStart = target.length 15697 if (!targetStart) targetStart = 0 15698 if (end > 0 && end < start) end = start 15699 15700 // Copy 0 bytes; we're done 15701 if (end === start) return 0 15702 if (target.length === 0 || this.length === 0) return 0 15703 15704 // Fatal error conditions 15705 if (targetStart < 0) { 15706 throw new RangeError('targetStart out of bounds') 15707 } 15708 if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') 15709 if (end < 0) throw new RangeError('sourceEnd out of bounds') 15710 15711 // Are we oob? 15712 if (end > this.length) end = this.length 15713 if (target.length - targetStart < end - start) { 15714 end = target.length - targetStart + start 15715 } 15716 15717 var len = end - start 15718 var i 15719 15720 if (this === target && start < targetStart && targetStart < end) { 15721 // descending copy from end 15722 for (i = len - 1; i >= 0; --i) { 15723 target[i + targetStart] = this[i + start] 15724 } 15725 } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { 15726 // ascending copy from start 15727 for (i = 0; i < len; ++i) { 15728 target[i + targetStart] = this[i + start] 15729 } 15730 } else { 15731 Uint8Array.prototype.set.call( 15732 target, 15733 this.subarray(start, start + len), 15734 targetStart 15735 ) 15736 } 15737 15738 return len 15739 } 15740 15741// Usage: 15742// buffer.fill(number[, offset[, end]]) 15743// buffer.fill(buffer[, offset[, end]]) 15744// buffer.fill(string[, offset[, end]][, encoding]) 15745 Buffer.prototype.fill = function fill (val, start, end, encoding) { 15746 // Handle string cases: 15747 if (typeof val === 'string') { 15748 if (typeof start === 'string') { 15749 encoding = start 15750 start = 0 15751 end = this.length 15752 } else if (typeof end === 'string') { 15753 encoding = end 15754 end = this.length 15755 } 15756 if (val.length === 1) { 15757 var code = val.charCodeAt(0) 15758 if (code < 256) { 15759 val = code 15760 } 15761 } 15762 if (encoding !== undefined && typeof encoding !== 'string') { 15763 throw new TypeError('encoding must be a string') 15764 } 15765 if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { 15766 throw new TypeError('Unknown encoding: ' + encoding) 15767 } 15768 } else if (typeof val === 'number') { 15769 val = val & 255 15770 } 15771 15772 // Invalid ranges are not set to a default, so can range check early. 15773 if (start < 0 || this.length < start || this.length < end) { 15774 throw new RangeError('Out of range index') 15775 } 15776 15777 if (end <= start) { 15778 return this 15779 } 15780 15781 start = start >>> 0 15782 end = end === undefined ? this.length : end >>> 0 15783 15784 if (!val) val = 0 15785 15786 var i 15787 if (typeof val === 'number') { 15788 for (i = start; i < end; ++i) { 15789 this[i] = val 15790 } 15791 } else { 15792 var bytes = Buffer.isBuffer(val) 15793 ? val 15794 : utf8ToBytes(new Buffer(val, encoding).toString()) 15795 var len = bytes.length 15796 for (i = 0; i < end - start; ++i) { 15797 this[i + start] = bytes[i % len] 15798 } 15799 } 15800 15801 return this 15802 } 15803 15804// HELPER FUNCTIONS 15805// ================ 15806 15807 var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g 15808 15809 function base64clean (str) { 15810 // Node strips out invalid characters like \n and \t from the string, base64-js does not 15811 str = stringtrim(str).replace(INVALID_BASE64_RE, '') 15812 // Node converts strings with length < 2 to '' 15813 if (str.length < 2) return '' 15814 // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not 15815 while (str.length % 4 !== 0) { 15816 str = str + '=' 15817 } 15818 return str 15819 } 15820 15821 function stringtrim (str) { 15822 if (str.trim) return str.trim() 15823 return str.replace(/^\s+|\s+$/g, '') 15824 } 15825 15826 function toHex (n) { 15827 if (n < 16) return '0' + n.toString(16) 15828 return n.toString(16) 15829 } 15830 15831 function utf8ToBytes (string, units) { 15832 units = units || Infinity 15833 var codePoint 15834 var length = string.length 15835 var leadSurrogate = null 15836 var bytes = [] 15837 15838 for (var i = 0; i < length; ++i) { 15839 codePoint = string.charCodeAt(i) 15840 15841 // is surrogate component 15842 if (codePoint > 0xD7FF && codePoint < 0xE000) { 15843 // last char was a lead 15844 if (!leadSurrogate) { 15845 // no lead yet 15846 if (codePoint > 0xDBFF) { 15847 // unexpected trail 15848 if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) 15849 continue 15850 } else if (i + 1 === length) { 15851 // unpaired lead 15852 if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) 15853 continue 15854 } 15855 15856 // valid lead 15857 leadSurrogate = codePoint 15858 15859 continue 15860 } 15861 15862 // 2 leads in a row 15863 if (codePoint < 0xDC00) { 15864 if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) 15865 leadSurrogate = codePoint 15866 continue 15867 } 15868 15869 // valid surrogate pair 15870 codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 15871 } else if (leadSurrogate) { 15872 // valid bmp char, but last char was a lead 15873 if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) 15874 } 15875 15876 leadSurrogate = null 15877 15878 // encode utf8 15879 if (codePoint < 0x80) { 15880 if ((units -= 1) < 0) break 15881 bytes.push(codePoint) 15882 } else if (codePoint < 0x800) { 15883 if ((units -= 2) < 0) break 15884 bytes.push( 15885 codePoint >> 0x6 | 0xC0, 15886 codePoint & 0x3F | 0x80 15887 ) 15888 } else if (codePoint < 0x10000) { 15889 if ((units -= 3) < 0) break 15890 bytes.push( 15891 codePoint >> 0xC | 0xE0, 15892 codePoint >> 0x6 & 0x3F | 0x80, 15893 codePoint & 0x3F | 0x80 15894 ) 15895 } else if (codePoint < 0x110000) { 15896 if ((units -= 4) < 0) break 15897 bytes.push( 15898 codePoint >> 0x12 | 0xF0, 15899 codePoint >> 0xC & 0x3F | 0x80, 15900 codePoint >> 0x6 & 0x3F | 0x80, 15901 codePoint & 0x3F | 0x80 15902 ) 15903 } else { 15904 throw new Error('Invalid code point') 15905 } 15906 } 15907 15908 return bytes 15909 } 15910 15911 function asciiToBytes (str) { 15912 var byteArray = [] 15913 for (var i = 0; i < str.length; ++i) { 15914 // Node's code seems to be doing this and not & 0x7F.. 15915 byteArray.push(str.charCodeAt(i) & 0xFF) 15916 } 15917 return byteArray 15918 } 15919 15920 function utf16leToBytes (str, units) { 15921 var c, hi, lo 15922 var byteArray = [] 15923 for (var i = 0; i < str.length; ++i) { 15924 if ((units -= 2) < 0) break 15925 15926 c = str.charCodeAt(i) 15927 hi = c >> 8 15928 lo = c % 256 15929 byteArray.push(lo) 15930 byteArray.push(hi) 15931 } 15932 15933 return byteArray 15934 } 15935 15936 function base64ToBytes (str) { 15937 return base64.toByteArray(base64clean(str)) 15938 } 15939 15940 function blitBuffer (src, dst, offset, length) { 15941 for (var i = 0; i < length; ++i) { 15942 if ((i + offset >= dst.length) || (i >= src.length)) break 15943 dst[i + offset] = src[i] 15944 } 15945 return i 15946 } 15947 15948 function isnan (val) { 15949 return val !== val // eslint-disable-line no-self-compare 15950 } 15951 15952 15953 /***/ }), 15954 15955
vendor: 3,541 bytes, lines 15955-16050
15955/***/ "./node_modules/ieee754/index.js": 15956 /*!***************************************!*\ 15957 !*** ./node_modules/ieee754/index.js ***! 15958 \***************************************/ 15959 /***/ (function(__unused_webpack_module, exports) { 15960 15961 /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */ 15962 exports.read = function (buffer, offset, isLE, mLen, nBytes) { 15963 var e, m 15964 var eLen = (nBytes * 8) - mLen - 1 15965 var eMax = (1 << eLen) - 1 15966 var eBias = eMax >> 1 15967 var nBits = -7 15968 var i = isLE ? (nBytes - 1) : 0 15969 var d = isLE ? -1 : 1 15970 var s = buffer[offset + i] 15971 15972 i += d 15973 15974 e = s & ((1 << (-nBits)) - 1) 15975 s >>= (-nBits) 15976 nBits += eLen 15977 for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} 15978 15979 m = e & ((1 << (-nBits)) - 1) 15980 e >>= (-nBits) 15981 nBits += mLen 15982 for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} 15983 15984 if (e === 0) { 15985 e = 1 - eBias 15986 } else if (e === eMax) { 15987 return m ? NaN : ((s ? -1 : 1) * Infinity) 15988 } else { 15989 m = m + Math.pow(2, mLen) 15990 e = e - eBias 15991 } 15992 return (s ? -1 : 1) * m * Math.pow(2, e - mLen) 15993 } 15994 15995 exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { 15996 var e, m, c 15997 var eLen = (nBytes * 8) - mLen - 1 15998 var eMax = (1 << eLen) - 1 15999 var eBias = eMax >> 1 16000 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) 16001 var i = isLE ? 0 : (nBytes - 1) 16002 var d = isLE ? 1 : -1 16003 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 16004 16005 value = Math.abs(value) 16006 16007 if (isNaN(value) || value === Infinity) { 16008 m = isNaN(value) ? 1 : 0 16009 e = eMax 16010 } else { 16011 e = Math.floor(Math.log(value) / Math.LN2) 16012 if (value * (c = Math.pow(2, -e)) < 1) { 16013 e-- 16014 c *= 2 16015 } 16016 if (e + eBias >= 1) { 16017 value += rt / c 16018 } else { 16019 value += rt * Math.pow(2, 1 - eBias) 16020 } 16021 if (value * c >= 2) { 16022 e++ 16023 c /= 2 16024 } 16025 16026 if (e + eBias >= eMax) { 16027 m = 0 16028 e = eMax 16029 } else if (e + eBias >= 1) { 16030 m = ((value * c) - 1) * Math.pow(2, mLen) 16031 e = e + eBias 16032 } else { 16033 m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) 16034 e = 0 16035 } 16036 } 16037 16038 for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} 16039 16040 e = (e << mLen) | m 16041 eLen += mLen 16042 for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} 16043 16044 buffer[offset + i - d] |= s * 128 16045 } 16046 16047 16048 /***/ }), 16049 16050
vendor: 433 bytes, lines 16050-16065
16050/***/ "./node_modules/isarray/index.js": 16051 /*!***************************************!*\ 16052 !*** ./node_modules/isarray/index.js ***! 16053 \***************************************/ 16054 /***/ (function(module) { 16055 16056 var toString = {}.toString; 16057 16058 module.exports = Array.isArray || function (arr) { 16059 return toString.call(arr) == '[object Array]'; 16060 }; 16061 16062 16063 /***/ }), 16064 16065
vendor: 497,603 bytes, lines 16065-26792
16065/***/ "./node_modules/jquery/dist/jquery.js": 16066 /*!********************************************!*\ 16067 !*** ./node_modules/jquery/dist/jquery.js ***! 16068 \********************************************/ 16069 /***/ (function(module, exports) { 16070 16071 var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! 16072 * jQuery JavaScript Library v3.7.1 16073 * https://jquery.com/ 16074 * 16075 * Copyright OpenJS Foundation and other contributors 16076 * Released under the MIT license 16077 * https://jquery.org/license 16078 * 16079 * Date: 2023-08-28T13:37Z 16080 */ 16081 ( function( global, factory ) { 16082 16083 "use strict"; 16084 16085 if ( true && typeof module.exports === "object" ) { 16086 16087 // For CommonJS and CommonJS-like environments where a proper `window` 16088 // is present, execute the factory and get jQuery. 16089 // For environments that do not have a `window` with a `document` 16090 // (such as Node.js), expose a factory as module.exports. 16091 // This accentuates the need for the creation of a real `window`. 16092 // e.g. var jQuery = require("jquery")(window); 16093 // See ticket trac-14549 for more info. 16094 module.exports = global.document ? 16095 factory( global, true ) : 16096 function( w ) { 16097 if ( !w.document ) { 16098 throw new Error( "jQuery requires a window with a document" ); 16099 } 16100 return factory( w ); 16101 }; 16102 } else { 16103 factory( global ); 16104 } 16105 16106// Pass this if window is not defined yet 16107 } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 16108 16109// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 16110// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 16111// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 16112// enough that all such attempts are guarded in a try block. 16113 "use strict"; 16114 16115 var arr = []; 16116 16117 var getProto = Object.getPrototypeOf; 16118 16119 var slice = arr.slice; 16120 16121 var flat = arr.flat ? function( array ) { 16122 return arr.flat.call( array ); 16123 } : function( array ) { 16124 return arr.concat.apply( [], array ); 16125 }; 16126 16127 16128 var push = arr.push; 16129 16130 var indexOf = arr.indexOf; 16131 16132 var class2type = {}; 16133 16134 var toString = class2type.toString; 16135 16136 var hasOwn = class2type.hasOwnProperty; 16137 16138 var fnToString = hasOwn.toString; 16139 16140 var ObjectFunctionString = fnToString.call( Object ); 16141 16142 var support = {}; 16143 16144 var isFunction = function isFunction( obj ) { 16145 16146 // Support: Chrome <=57, Firefox <=52 16147 // In some browsers, typeof returns "function" for HTML <object> elements 16148 // (i.e., `typeof document.createElement( "object" ) === "function"`). 16149 // We don't want to classify *any* DOM node as a function. 16150 // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 16151 // Plus for old WebKit, typeof returns "function" for HTML collections 16152 // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) 16153 return typeof obj === "function" && typeof obj.nodeType !== "number" && 16154 typeof obj.item !== "function"; 16155 }; 16156 16157 16158 var isWindow = function isWindow( obj ) { 16159 return obj != null && obj === obj.window; 16160 }; 16161 16162 16163 var document = window.document; 16164 16165 16166 16167 var preservedScriptAttributes = { 16168 type: true, 16169 src: true, 16170 nonce: true, 16171 noModule: true 16172 }; 16173 16174 function DOMEval( code, node, doc ) { 16175 doc = doc || document; 16176 16177 var i, val, 16178 script = doc.createElement( "script" ); 16179 16180 script.text = code; 16181 if ( node ) { 16182 for ( i in preservedScriptAttributes ) { 16183 16184 // Support: Firefox 64+, Edge 18+ 16185 // Some browsers don't support the "nonce" property on scripts. 16186 // On the other hand, just using `getAttribute` is not enough as 16187 // the `nonce` attribute is reset to an empty string whenever it 16188 // becomes browsing-context connected. 16189 // See https://github.com/whatwg/html/issues/2369 16190 // See https://html.spec.whatwg.org/#nonce-attributes 16191 // The `node.getAttribute` check was added for the sake of 16192 // `jQuery.globalEval` so that it can fake a nonce-containing node 16193 // via an object. 16194 val = node[ i ] || node.getAttribute && node.getAttribute( i ); 16195 if ( val ) { 16196 script.setAttribute( i, val ); 16197 } 16198 } 16199 } 16200 doc.head.appendChild( script ).parentNode.removeChild( script ); 16201 } 16202 16203 16204 function toType( obj ) { 16205 if ( obj == null ) { 16206 return obj + ""; 16207 } 16208 16209 // Support: Android <=2.3 only (functionish RegExp) 16210 return typeof obj === "object" || typeof obj === "function" ? 16211 class2type[ toString.call( obj ) ] || "object" : 16212 typeof obj; 16213 } 16214 /* global Symbol */ 16215// Defining this global in .eslintrc.json would create a danger of using the global 16216// unguarded in another place, it seems safer to define global only for this module 16217 16218 16219 16220 var version = "3.7.1", 16221 16222 rhtmlSuffix = /HTML$/i, 16223 16224 // Define a local copy of jQuery 16225 jQuery = function( selector, context ) { 16226 16227 // The jQuery object is actually just the init constructor 'enhanced' 16228 // Need init if jQuery is called (just allow error to be thrown if not included) 16229 return new jQuery.fn.init( selector, context ); 16230 }; 16231 16232 jQuery.fn = jQuery.prototype = { 16233 16234 // The current version of jQuery being used 16235 jquery: version, 16236 16237 constructor: jQuery, 16238 16239 // The default length of a jQuery object is 0 16240 length: 0, 16241 16242 toArray: function() { 16243 return slice.call( this ); 16244 }, 16245 16246 // Get the Nth element in the matched element set OR 16247 // Get the whole matched element set as a clean array 16248 get: function( num ) { 16249 16250 // Return all the elements in a clean array 16251 if ( num == null ) { 16252 return slice.call( this ); 16253 } 16254 16255 // Return just the one element from the set 16256 return num < 0 ? this[ num + this.length ] : this[ num ]; 16257 }, 16258 16259 // Take an array of elements and push it onto the stack 16260 // (returning the new matched element set) 16261 pushStack: function( elems ) { 16262 16263 // Build a new jQuery matched element set 16264 var ret = jQuery.merge( this.constructor(), elems ); 16265 16266 // Add the old object onto the stack (as a reference) 16267 ret.prevObject = this; 16268 16269 // Return the newly-formed element set 16270 return ret; 16271 }, 16272 16273 // Execute a callback for every element in the matched set. 16274 each: function( callback ) { 16275 return jQuery.each( this, callback ); 16276 }, 16277 16278 map: function( callback ) { 16279 return this.pushStack( jQuery.map( this, function( elem, i ) { 16280 return callback.call( elem, i, elem ); 16281 } ) ); 16282 }, 16283 16284 slice: function() { 16285 return this.pushStack( slice.apply( this, arguments ) ); 16286 }, 16287 16288 first: function() { 16289 return this.eq( 0 ); 16290 }, 16291 16292 last: function() { 16293 return this.eq( -1 ); 16294 }, 16295 16296 even: function() { 16297 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 16298 return ( i + 1 ) % 2; 16299 } ) ); 16300 }, 16301 16302 odd: function() { 16303 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 16304 return i % 2; 16305 } ) ); 16306 }, 16307 16308 eq: function( i ) { 16309 var len = this.length, 16310 j = +i + ( i < 0 ? len : 0 ); 16311 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 16312 }, 16313 16314 end: function() { 16315 return this.prevObject || this.constructor(); 16316 }, 16317 16318 // For internal use only. 16319 // Behaves like an Array's method, not like a jQuery method. 16320 push: push, 16321 sort: arr.sort, 16322 splice: arr.splice 16323 }; 16324 16325 jQuery.extend = jQuery.fn.extend = function() { 16326 var options, name, src, copy, copyIsArray, clone, 16327 target = arguments[ 0 ] || {}, 16328 i = 1, 16329 length = arguments.length, 16330 deep = false; 16331 16332 // Handle a deep copy situation 16333 if ( typeof target === "boolean" ) { 16334 deep = target; 16335 16336 // Skip the boolean and the target 16337 target = arguments[ i ] || {}; 16338 i++; 16339 } 16340 16341 // Handle case when target is a string or something (possible in deep copy) 16342 if ( typeof target !== "object" && !isFunction( target ) ) { 16343 target = {}; 16344 } 16345 16346 // Extend jQuery itself if only one argument is passed 16347 if ( i === length ) { 16348 target = this; 16349 i--; 16350 } 16351 16352 for ( ; i < length; i++ ) { 16353 16354 // Only deal with non-null/undefined values 16355 if ( ( options = arguments[ i ] ) != null ) { 16356 16357 // Extend the base object 16358 for ( name in options ) { 16359 copy = options[ name ]; 16360 16361 // Prevent Object.prototype pollution 16362 // Prevent never-ending loop 16363 if ( name === "__proto__" || target === copy ) { 16364 continue; 16365 } 16366 16367 // Recurse if we're merging plain objects or arrays 16368 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 16369 ( copyIsArray = Array.isArray( copy ) ) ) ) { 16370 src = target[ name ]; 16371 16372 // Ensure proper type for the source value 16373 if ( copyIsArray && !Array.isArray( src ) ) { 16374 clone = []; 16375 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { 16376 clone = {}; 16377 } else { 16378 clone = src; 16379 } 16380 copyIsArray = false; 16381 16382 // Never move original objects, clone them 16383 target[ name ] = jQuery.extend( deep, clone, copy ); 16384 16385 // Don't bring in undefined values 16386 } else if ( copy !== undefined ) { 16387 target[ name ] = copy; 16388 } 16389 } 16390 } 16391 } 16392 16393 // Return the modified object 16394 return target; 16395 }; 16396 16397 jQuery.extend( { 16398 16399 // Unique for each copy of jQuery on the page 16400 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 16401 16402 // Assume jQuery is ready without the ready module 16403 isReady: true, 16404 16405 error: function( msg ) { 16406 throw new Error( msg ); 16407 }, 16408 16409 noop: function() {}, 16410 16411 isPlainObject: function( obj ) { 16412 var proto, Ctor; 16413 16414 // Detect obvious negatives 16415 // Use toString instead of jQuery.type to catch host objects 16416 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 16417 return false; 16418 } 16419 16420 proto = getProto( obj ); 16421 16422 // Objects with no prototype (e.g., `Object.create( null )`) are plain 16423 if ( !proto ) { 16424 return true; 16425 } 16426 16427 // Objects with prototype are plain iff they were constructed by a global Object function 16428 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; 16429 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; 16430 }, 16431 16432 isEmptyObject: function( obj ) { 16433 var name; 16434 16435 for ( name in obj ) { 16436 return false; 16437 } 16438 return true; 16439 }, 16440 16441 // Evaluates a script in a provided context; falls back to the global one 16442 // if not specified. 16443 globalEval: function( code, options, doc ) { 16444 DOMEval( code, { nonce: options && options.nonce }, doc ); 16445 }, 16446 16447 each: function( obj, callback ) { 16448 var length, i = 0; 16449 16450 if ( isArrayLike( obj ) ) { 16451 length = obj.length; 16452 for ( ; i < length; i++ ) { 16453 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 16454 break; 16455 } 16456 } 16457 } else { 16458 for ( i in obj ) { 16459 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 16460 break; 16461 } 16462 } 16463 } 16464 16465 return obj; 16466 }, 16467 16468 16469 // Retrieve the text value of an array of DOM nodes 16470 text: function( elem ) { 16471 var node, 16472 ret = "", 16473 i = 0, 16474 nodeType = elem.nodeType; 16475 16476 if ( !nodeType ) { 16477 16478 // If no nodeType, this is expected to be an array 16479 while ( ( node = elem[ i++ ] ) ) { 16480 16481 // Do not traverse comment nodes 16482 ret += jQuery.text( node ); 16483 } 16484 } 16485 if ( nodeType === 1 || nodeType === 11 ) { 16486 return elem.textContent; 16487 } 16488 if ( nodeType === 9 ) { 16489 return elem.documentElement.textContent; 16490 } 16491 if ( nodeType === 3 || nodeType === 4 ) { 16492 return elem.nodeValue; 16493 } 16494 16495 // Do not include comment or processing instruction nodes 16496 16497 return ret; 16498 }, 16499 16500 // results is for internal usage only 16501 makeArray: function( arr, results ) { 16502 var ret = results || []; 16503 16504 if ( arr != null ) { 16505 if ( isArrayLike( Object( arr ) ) ) { 16506 jQuery.merge( ret, 16507 typeof arr === "string" ? 16508 [ arr ] : arr 16509 ); 16510 } else { 16511 push.call( ret, arr ); 16512 } 16513 } 16514 16515 return ret; 16516 }, 16517 16518 inArray: function( elem, arr, i ) { 16519 return arr == null ? -1 : indexOf.call( arr, elem, i ); 16520 }, 16521 16522 isXMLDoc: function( elem ) { 16523 var namespace = elem && elem.namespaceURI, 16524 docElem = elem && ( elem.ownerDocument || elem ).documentElement; 16525 16526 // Assume HTML when documentElement doesn't yet exist, such as inside 16527 // document fragments. 16528 return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); 16529 }, 16530 16531 // Support: Android <=4.0 only, PhantomJS 1 only 16532 // push.apply(_, arraylike) throws on ancient WebKit 16533 merge: function( first, second ) { 16534 var len = +second.length, 16535 j = 0, 16536 i = first.length; 16537 16538 for ( ; j < len; j++ ) { 16539 first[ i++ ] = second[ j ]; 16540 } 16541 16542 first.length = i; 16543 16544 return first; 16545 }, 16546 16547 grep: function( elems, callback, invert ) { 16548 var callbackInverse, 16549 matches = [], 16550 i = 0, 16551 length = elems.length, 16552 callbackExpect = !invert; 16553 16554 // Go through the array, only saving the items 16555 // that pass the validator function 16556 for ( ; i < length; i++ ) { 16557 callbackInverse = !callback( elems[ i ], i ); 16558 if ( callbackInverse !== callbackExpect ) { 16559 matches.push( elems[ i ] ); 16560 } 16561 } 16562 16563 return matches; 16564 }, 16565 16566 // arg is for internal usage only 16567 map: function( elems, callback, arg ) { 16568 var length, value, 16569 i = 0, 16570 ret = []; 16571 16572 // Go through the array, translating each of the items to their new values 16573 if ( isArrayLike( elems ) ) { 16574 length = elems.length; 16575 for ( ; i < length; i++ ) { 16576 value = callback( elems[ i ], i, arg ); 16577 16578 if ( value != null ) { 16579 ret.push( value ); 16580 } 16581 } 16582 16583 // Go through every key on the object, 16584 } else { 16585 for ( i in elems ) { 16586 value = callback( elems[ i ], i, arg ); 16587 16588 if ( value != null ) { 16589 ret.push( value ); 16590 } 16591 } 16592 } 16593 16594 // Flatten any nested arrays 16595 return flat( ret ); 16596 }, 16597 16598 // A global GUID counter for objects 16599 guid: 1, 16600 16601 // jQuery.support is not used in Core but other projects attach their 16602 // properties to it so it needs to exist. 16603 support: support 16604 } ); 16605 16606 if ( typeof Symbol === "function" ) { 16607 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 16608 } 16609 16610// Populate the class2type map 16611 jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 16612 function( _i, name ) { 16613 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 16614 } ); 16615 16616 function isArrayLike( obj ) { 16617 16618 // Support: real iOS 8.2 only (not reproducible in simulator) 16619 // `in` check used to prevent JIT error (gh-2145) 16620 // hasOwn isn't used here due to false negatives 16621 // regarding Nodelist length in IE 16622 var length = !!obj && "length" in obj && obj.length, 16623 type = toType( obj ); 16624 16625 if ( isFunction( obj ) || isWindow( obj ) ) { 16626 return false; 16627 } 16628 16629 return type === "array" || length === 0 || 16630 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 16631 } 16632 16633 16634 function nodeName( elem, name ) { 16635 16636 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 16637 16638 } 16639 var pop = arr.pop; 16640 16641 16642 var sort = arr.sort; 16643 16644 16645 var splice = arr.splice; 16646 16647 16648 var whitespace = "[\\x20\\t\\r\\n\\f]"; 16649 16650 16651 var rtrimCSS = new RegExp( 16652 "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", 16653 "g" 16654 ); 16655 16656 16657 16658 16659// Note: an element does not contain itself 16660 jQuery.contains = function( a, b ) { 16661 var bup = b && b.parentNode; 16662 16663 return a === bup || !!( bup && bup.nodeType === 1 && ( 16664 16665 // Support: IE 9 - 11+ 16666 // IE doesn't have `contains` on SVG. 16667 a.contains ? 16668 a.contains( bup ) : 16669 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 16670 ) ); 16671 }; 16672 16673 16674 16675 16676// CSS string/identifier serialization 16677// https://drafts.csswg.org/cssom/#common-serializing-idioms 16678 var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; 16679 16680 function fcssescape( ch, asCodePoint ) { 16681 if ( asCodePoint ) { 16682 16683 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 16684 if ( ch === "\0" ) { 16685 return "\uFFFD"; 16686 } 16687 16688 // Control characters and (dependent upon position) numbers get escaped as code points 16689 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 16690 } 16691 16692 // Other potentially-special ASCII characters get backslash-escaped 16693 return "\\" + ch; 16694 } 16695 16696 jQuery.escapeSelector = function( sel ) { 16697 return ( sel + "" ).replace( rcssescape, fcssescape ); 16698 }; 16699 16700 16701 16702 16703 var preferredDoc = document, 16704 pushNative = push; 16705 16706 ( function() { 16707 16708 var i, 16709 Expr, 16710 outermostContext, 16711 sortInput, 16712 hasDuplicate, 16713 push = pushNative, 16714 16715 // Local document vars 16716 document, 16717 documentElement, 16718 documentIsHTML, 16719 rbuggyQSA, 16720 matches, 16721 16722 // Instance-specific data 16723 expando = jQuery.expando, 16724 dirruns = 0, 16725 done = 0, 16726 classCache = createCache(), 16727 tokenCache = createCache(), 16728 compilerCache = createCache(), 16729 nonnativeSelectorCache = createCache(), 16730 sortOrder = function( a, b ) { 16731 if ( a === b ) { 16732 hasDuplicate = true; 16733 } 16734 return 0; 16735 }, 16736 16737 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + 16738 "loop|multiple|open|readonly|required|scoped", 16739 16740 // Regular expressions 16741 16742 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram 16743 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + 16744 "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", 16745 16746 // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors 16747 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 16748 16749 // Operator (capture 2) 16750 "*([*^$|!~]?=)" + whitespace + 16751 16752 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" 16753 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + 16754 whitespace + "*\\]", 16755 16756 pseudos = ":(" + identifier + ")(?:\\((" + 16757 16758 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 16759 // 1. quoted (capture 3; capture 4 or capture 5) 16760 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 16761 16762 // 2. simple (capture 6) 16763 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 16764 16765 // 3. anything else (capture 2) 16766 ".*" + 16767 ")\\)|)", 16768 16769 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 16770 rwhitespace = new RegExp( whitespace + "+", "g" ), 16771 16772 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 16773 rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + 16774 whitespace + "*" ), 16775 rdescend = new RegExp( whitespace + "|>" ), 16776 16777 rpseudo = new RegExp( pseudos ), 16778 ridentifier = new RegExp( "^" + identifier + "$" ), 16779 16780 matchExpr = { 16781 ID: new RegExp( "^#(" + identifier + ")" ), 16782 CLASS: new RegExp( "^\\.(" + identifier + ")" ), 16783 TAG: new RegExp( "^(" + identifier + "|[*])" ), 16784 ATTR: new RegExp( "^" + attributes ), 16785 PSEUDO: new RegExp( "^" + pseudos ), 16786 CHILD: new RegExp( 16787 "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + 16788 whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + 16789 whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 16790 bool: new RegExp( "^(?:" + booleans + ")$", "i" ), 16791 16792 // For use in libraries implementing .is() 16793 // We use this for POS matching in `select` 16794 needsContext: new RegExp( "^" + whitespace + 16795 "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + 16796 "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 16797 }, 16798 16799 rinputs = /^(?:input|select|textarea|button)$/i, 16800 rheader = /^h\d$/i, 16801 16802 // Easily-parseable/retrievable ID or TAG or CLASS selectors 16803 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 16804 16805 rsibling = /[+~]/, 16806 16807 // CSS escapes 16808 // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters 16809 runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + 16810 "?|\\\\([^\\r\\n\\f])", "g" ), 16811 funescape = function( escape, nonHex ) { 16812 var high = "0x" + escape.slice( 1 ) - 0x10000; 16813 16814 if ( nonHex ) { 16815 16816 // Strip the backslash prefix from a non-hex escape sequence 16817 return nonHex; 16818 } 16819 16820 // Replace a hexadecimal escape sequence with the encoded Unicode code point 16821 // Support: IE <=11+ 16822 // For values outside the Basic Multilingual Plane (BMP), manually construct a 16823 // surrogate pair 16824 return high < 0 ? 16825 String.fromCharCode( high + 0x10000 ) : 16826 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 16827 }, 16828 16829 // Used for iframes; see `setDocument`. 16830 // Support: IE 9 - 11+, Edge 12 - 18+ 16831 // Removing the function wrapper causes a "Permission Denied" 16832 // error in IE/Edge. 16833 unloadHandler = function() { 16834 setDocument(); 16835 }, 16836 16837 inDisabledFieldset = addCombinator( 16838 function( elem ) { 16839 return elem.disabled === true && nodeName( elem, "fieldset" ); 16840 }, 16841 { dir: "parentNode", next: "legend" } 16842 ); 16843 16844// Support: IE <=9 only 16845// Accessing document.activeElement can throw unexpectedly 16846// https://bugs.jquery.com/ticket/13393 16847 function safeActiveElement() { 16848 try { 16849 return document.activeElement; 16850 } catch ( err ) { } 16851 } 16852 16853// Optimize for push.apply( _, NodeList ) 16854 try { 16855 push.apply( 16856 ( arr = slice.call( preferredDoc.childNodes ) ), 16857 preferredDoc.childNodes 16858 ); 16859 16860 // Support: Android <=4.0 16861 // Detect silently failing push.apply 16862 // eslint-disable-next-line no-unused-expressions 16863 arr[ preferredDoc.childNodes.length ].nodeType; 16864 } catch ( e ) { 16865 push = { 16866 apply: function( target, els ) { 16867 pushNative.apply( target, slice.call( els ) ); 16868 }, 16869 call: function( target ) { 16870 pushNative.apply( target, slice.call( arguments, 1 ) ); 16871 } 16872 }; 16873 } 16874 16875 function find( selector, context, results, seed ) { 16876 var m, i, elem, nid, match, groups, newSelector, 16877 newContext = context && context.ownerDocument, 16878 16879 // nodeType defaults to 9, since context defaults to document 16880 nodeType = context ? context.nodeType : 9; 16881 16882 results = results || []; 16883 16884 // Return early from calls with invalid selector or context 16885 if ( typeof selector !== "string" || !selector || 16886 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 16887 16888 return results; 16889 } 16890 16891 // Try to shortcut find operations (as opposed to filters) in HTML documents 16892 if ( !seed ) { 16893 setDocument( context ); 16894 context = context || document; 16895 16896 if ( documentIsHTML ) { 16897 16898 // If the selector is sufficiently simple, try using a "get*By*" DOM method 16899 // (excepting DocumentFragment context, where the methods don't exist) 16900 if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { 16901 16902 // ID selector 16903 if ( ( m = match[ 1 ] ) ) { 16904 16905 // Document context 16906 if ( nodeType === 9 ) { 16907 if ( ( elem = context.getElementById( m ) ) ) { 16908 16909 // Support: IE 9 only 16910 // getElementById can match elements by name instead of ID 16911 if ( elem.id === m ) { 16912 push.call( results, elem ); 16913 return results; 16914 } 16915 } else { 16916 return results; 16917 } 16918 16919 // Element context 16920 } else { 16921 16922 // Support: IE 9 only 16923 // getElementById can match elements by name instead of ID 16924 if ( newContext && ( elem = newContext.getElementById( m ) ) && 16925 find.contains( context, elem ) && 16926 elem.id === m ) { 16927 16928 push.call( results, elem ); 16929 return results; 16930 } 16931 } 16932 16933 // Type selector 16934 } else if ( match[ 2 ] ) { 16935 push.apply( results, context.getElementsByTagName( selector ) ); 16936 return results; 16937 16938 // Class selector 16939 } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { 16940 push.apply( results, context.getElementsByClassName( m ) ); 16941 return results; 16942 } 16943 } 16944 16945 // Take advantage of querySelectorAll 16946 if ( !nonnativeSelectorCache[ selector + " " ] && 16947 ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { 16948 16949 newSelector = selector; 16950 newContext = context; 16951 16952 // qSA considers elements outside a scoping root when evaluating child or 16953 // descendant combinators, which is not what we want. 16954 // In such cases, we work around the behavior by prefixing every selector in the 16955 // list with an ID selector referencing the scope context. 16956 // The technique has to be used as well when a leading combinator is used 16957 // as such selectors are not recognized by querySelectorAll. 16958 // Thanks to Andrew Dupont for this technique. 16959 if ( nodeType === 1 && 16960 ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { 16961 16962 // Expand context for sibling selectors 16963 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 16964 context; 16965 16966 // We can use :scope instead of the ID hack if the browser 16967 // supports it & if we're not changing the context. 16968 // Support: IE 11+, Edge 17 - 18+ 16969 // IE/Edge sometimes throw a "Permission denied" error when 16970 // strict-comparing two documents; shallow comparisons work. 16971 // eslint-disable-next-line eqeqeq 16972 if ( newContext != context || !support.scope ) { 16973 16974 // Capture the context ID, setting it first if necessary 16975 if ( ( nid = context.getAttribute( "id" ) ) ) { 16976 nid = jQuery.escapeSelector( nid ); 16977 } else { 16978 context.setAttribute( "id", ( nid = expando ) ); 16979 } 16980 } 16981 16982 // Prefix every selector in the list 16983 groups = tokenize( selector ); 16984 i = groups.length; 16985 while ( i-- ) { 16986 groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + 16987 toSelector( groups[ i ] ); 16988 } 16989 newSelector = groups.join( "," ); 16990 } 16991 16992 try { 16993 push.apply( results, 16994 newContext.querySelectorAll( newSelector ) 16995 ); 16996 return results; 16997 } catch ( qsaError ) { 16998 nonnativeSelectorCache( selector, true ); 16999 } finally { 17000 if ( nid === expando ) { 17001 context.removeAttribute( "id" ); 17002 } 17003 } 17004 } 17005 } 17006 } 17007 17008 // All others 17009 return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); 17010 } 17011 17012 /** 17013 * Create key-value caches of limited size 17014 * @returns {function(string, object)} Returns the Object data after storing it on itself with 17015 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 17016 * deleting the oldest entry 17017 */ 17018 function createCache() { 17019 var keys = []; 17020 17021 function cache( key, value ) { 17022 17023 // Use (key + " ") to avoid collision with native prototype properties 17024 // (see https://github.com/jquery/sizzle/issues/157) 17025 if ( keys.push( key + " " ) > Expr.cacheLength ) { 17026 17027 // Only keep the most recent entries 17028 delete cache[ keys.shift() ]; 17029 } 17030 return ( cache[ key + " " ] = value ); 17031 } 17032 return cache; 17033 } 17034 17035 /** 17036 * Mark a function for special use by jQuery selector module 17037 * @param {Function} fn The function to mark 17038 */ 17039 function markFunction( fn ) { 17040 fn[ expando ] = true; 17041 return fn; 17042 } 17043 17044 /** 17045 * Support testing using an element 17046 * @param {Function} fn Passed the created element and returns a boolean result 17047 */ 17048 function assert( fn ) { 17049 var el = document.createElement( "fieldset" ); 17050 17051 try { 17052 return !!fn( el ); 17053 } catch ( e ) { 17054 return false; 17055 } finally { 17056 17057 // Remove from its parent by default 17058 if ( el.parentNode ) { 17059 el.parentNode.removeChild( el ); 17060 } 17061 17062 // release memory in IE 17063 el = null; 17064 } 17065 } 17066 17067 /** 17068 * Returns a function to use in pseudos for input types 17069 * @param {String} type 17070 */ 17071 function createInputPseudo( type ) { 17072 return function( elem ) { 17073 return nodeName( elem, "input" ) && elem.type === type; 17074 }; 17075 } 17076 17077 /** 17078 * Returns a function to use in pseudos for buttons 17079 * @param {String} type 17080 */ 17081 function createButtonPseudo( type ) { 17082 return function( elem ) { 17083 return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && 17084 elem.type === type; 17085 }; 17086 } 17087 17088 /** 17089 * Returns a function to use in pseudos for :enabled/:disabled 17090 * @param {Boolean} disabled true for :disabled; false for :enabled 17091 */ 17092 function createDisabledPseudo( disabled ) { 17093 17094 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 17095 return function( elem ) { 17096 17097 // Only certain elements can match :enabled or :disabled 17098 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 17099 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 17100 if ( "form" in elem ) { 17101 17102 // Check for inherited disabledness on relevant non-disabled elements: 17103 // * listed form-associated elements in a disabled fieldset 17104 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 17105 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 17106 // * option elements in a disabled optgroup 17107 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 17108 // All such elements have a "form" property. 17109 if ( elem.parentNode && elem.disabled === false ) { 17110 17111 // Option elements defer to a parent optgroup if present 17112 if ( "label" in elem ) { 17113 if ( "label" in elem.parentNode ) { 17114 return elem.parentNode.disabled === disabled; 17115 } else { 17116 return elem.disabled === disabled; 17117 } 17118 } 17119 17120 // Support: IE 6 - 11+ 17121 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 17122 return elem.isDisabled === disabled || 17123 17124 // Where there is no isDisabled, check manually 17125 elem.isDisabled !== !disabled && 17126 inDisabledFieldset( elem ) === disabled; 17127 } 17128 17129 return elem.disabled === disabled; 17130 17131 // Try to winnow out elements that can't be disabled before trusting the disabled property. 17132 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 17133 // even exist on them, let alone have a boolean value. 17134 } else if ( "label" in elem ) { 17135 return elem.disabled === disabled; 17136 } 17137 17138 // Remaining elements are neither :enabled nor :disabled 17139 return false; 17140 }; 17141 } 17142 17143 /** 17144 * Returns a function to use in pseudos for positionals 17145 * @param {Function} fn 17146 */ 17147 function createPositionalPseudo( fn ) { 17148 return markFunction( function( argument ) { 17149 argument = +argument; 17150 return markFunction( function( seed, matches ) { 17151 var j, 17152 matchIndexes = fn( [], seed.length, argument ), 17153 i = matchIndexes.length; 17154 17155 // Match elements found at the specified indexes 17156 while ( i-- ) { 17157 if ( seed[ ( j = matchIndexes[ i ] ) ] ) { 17158 seed[ j ] = !( matches[ j ] = seed[ j ] ); 17159 } 17160 } 17161 } ); 17162 } ); 17163 } 17164 17165 /** 17166 * Checks a node for validity as a jQuery selector context 17167 * @param {Element|Object=} context 17168 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 17169 */ 17170 function testContext( context ) { 17171 return context && typeof context.getElementsByTagName !== "undefined" && context; 17172 } 17173 17174 /** 17175 * Sets document-related variables once based on the current document 17176 * @param {Element|Object} [node] An element or document object to use to set the document 17177 * @returns {Object} Returns the current document 17178 */ 17179 function setDocument( node ) { 17180 var subWindow, 17181 doc = node ? node.ownerDocument || node : preferredDoc; 17182 17183 // Return early if doc is invalid or already selected 17184 // Support: IE 11+, Edge 17 - 18+ 17185 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 17186 // two documents; shallow comparisons work. 17187 // eslint-disable-next-line eqeqeq 17188 if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { 17189 return document; 17190 } 17191 17192 // Update global variables 17193 document = doc; 17194 documentElement = document.documentElement; 17195 documentIsHTML = !jQuery.isXMLDoc( document ); 17196 17197 // Support: iOS 7 only, IE 9 - 11+ 17198 // Older browsers didn't support unprefixed `matches`. 17199 matches = documentElement.matches || 17200 documentElement.webkitMatchesSelector || 17201 documentElement.msMatchesSelector; 17202 17203 // Support: IE 9 - 11+, Edge 12 - 18+ 17204 // Accessing iframe documents after unload throws "permission denied" errors 17205 // (see trac-13936). 17206 // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, 17207 // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. 17208 if ( documentElement.msMatchesSelector && 17209 17210 // Support: IE 11+, Edge 17 - 18+ 17211 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 17212 // two documents; shallow comparisons work. 17213 // eslint-disable-next-line eqeqeq 17214 preferredDoc != document && 17215 ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { 17216 17217 // Support: IE 9 - 11+, Edge 12 - 18+ 17218 subWindow.addEventListener( "unload", unloadHandler ); 17219 } 17220 17221 // Support: IE <10 17222 // Check if getElementById returns elements by name 17223 // The broken getElementById methods don't pick up programmatically-set names, 17224 // so use a roundabout getElementsByName test 17225 support.getById = assert( function( el ) { 17226 documentElement.appendChild( el ).id = jQuery.expando; 17227 return !document.getElementsByName || 17228 !document.getElementsByName( jQuery.expando ).length; 17229 } ); 17230 17231 // Support: IE 9 only 17232 // Check to see if it's possible to do matchesSelector 17233 // on a disconnected node. 17234 support.disconnectedMatch = assert( function( el ) { 17235 return matches.call( el, "*" ); 17236 } ); 17237 17238 // Support: IE 9 - 11+, Edge 12 - 18+ 17239 // IE/Edge don't support the :scope pseudo-class. 17240 support.scope = assert( function() { 17241 return document.querySelectorAll( ":scope" ); 17242 } ); 17243 17244 // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only 17245 // Make sure the `:has()` argument is parsed unforgivingly. 17246 // We include `*` in the test to detect buggy implementations that are 17247 // _selectively_ forgiving (specifically when the list includes at least 17248 // one valid selector). 17249 // Note that we treat complete lack of support for `:has()` as if it were 17250 // spec-compliant support, which is fine because use of `:has()` in such 17251 // environments will fail in the qSA path and fall back to jQuery traversal 17252 // anyway. 17253 support.cssHas = assert( function() { 17254 try { 17255 document.querySelector( ":has(*,:jqfake)" ); 17256 return false; 17257 } catch ( e ) { 17258 return true; 17259 } 17260 } ); 17261 17262 // ID filter and find 17263 if ( support.getById ) { 17264 Expr.filter.ID = function( id ) { 17265 var attrId = id.replace( runescape, funescape ); 17266 return function( elem ) { 17267 return elem.getAttribute( "id" ) === attrId; 17268 }; 17269 }; 17270 Expr.find.ID = function( id, context ) { 17271 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 17272 var elem = context.getElementById( id ); 17273 return elem ? [ elem ] : []; 17274 } 17275 }; 17276 } else { 17277 Expr.filter.ID = function( id ) { 17278 var attrId = id.replace( runescape, funescape ); 17279 return function( elem ) { 17280 var node = typeof elem.getAttributeNode !== "undefined" && 17281 elem.getAttributeNode( "id" ); 17282 return node && node.value === attrId; 17283 }; 17284 }; 17285 17286 // Support: IE 6 - 7 only 17287 // getElementById is not reliable as a find shortcut 17288 Expr.find.ID = function( id, context ) { 17289 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 17290 var node, i, elems, 17291 elem = context.getElementById( id ); 17292 17293 if ( elem ) { 17294 17295 // Verify the id attribute 17296 node = elem.getAttributeNode( "id" ); 17297 if ( node && node.value === id ) { 17298 return [ elem ]; 17299 } 17300 17301 // Fall back on getElementsByName 17302 elems = context.getElementsByName( id ); 17303 i = 0; 17304 while ( ( elem = elems[ i++ ] ) ) { 17305 node = elem.getAttributeNode( "id" ); 17306 if ( node && node.value === id ) { 17307 return [ elem ]; 17308 } 17309 } 17310 } 17311 17312 return []; 17313 } 17314 }; 17315 } 17316 17317 // Tag 17318 Expr.find.TAG = function( tag, context ) { 17319 if ( typeof context.getElementsByTagName !== "undefined" ) { 17320 return context.getElementsByTagName( tag ); 17321 17322 // DocumentFragment nodes don't have gEBTN 17323 } else { 17324 return context.querySelectorAll( tag ); 17325 } 17326 }; 17327 17328 // Class 17329 Expr.find.CLASS = function( className, context ) { 17330 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 17331 return context.getElementsByClassName( className ); 17332 } 17333 }; 17334 17335 /* QSA/matchesSelector 17336 ---------------------------------------------------------------------- */ 17337 17338 // QSA and matchesSelector support 17339 17340 rbuggyQSA = []; 17341 17342 // Build QSA regex 17343 // Regex strategy adopted from Diego Perini 17344 assert( function( el ) { 17345 17346 var input; 17347 17348 documentElement.appendChild( el ).innerHTML = 17349 "<a id='" + expando + "' href='' disabled='disabled'></a>" + 17350 "<select id='" + expando + "-\r\\' disabled='disabled'>" + 17351 "<option selected=''></option></select>"; 17352 17353 // Support: iOS <=7 - 8 only 17354 // Boolean attributes and "value" are not treated correctly in some XML documents 17355 if ( !el.querySelectorAll( "[selected]" ).length ) { 17356 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 17357 } 17358 17359 // Support: iOS <=7 - 8 only 17360 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 17361 rbuggyQSA.push( "~=" ); 17362 } 17363 17364 // Support: iOS 8 only 17365 // https://bugs.webkit.org/show_bug.cgi?id=136851 17366 // In-page `selector#id sibling-combinator selector` fails 17367 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 17368 rbuggyQSA.push( ".#.+[+~]" ); 17369 } 17370 17371 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ 17372 // In some of the document kinds, these selectors wouldn't work natively. 17373 // This is probably OK but for backwards compatibility we want to maintain 17374 // handling them through jQuery traversal in jQuery 3.x. 17375 if ( !el.querySelectorAll( ":checked" ).length ) { 17376 rbuggyQSA.push( ":checked" ); 17377 } 17378 17379 // Support: Windows 8 Native Apps 17380 // The type and name attributes are restricted during .innerHTML assignment 17381 input = document.createElement( "input" ); 17382 input.setAttribute( "type", "hidden" ); 17383 el.appendChild( input ).setAttribute( "name", "D" ); 17384 17385 // Support: IE 9 - 11+ 17386 // IE's :disabled selector does not pick up the children of disabled fieldsets 17387 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ 17388 // In some of the document kinds, these selectors wouldn't work natively. 17389 // This is probably OK but for backwards compatibility we want to maintain 17390 // handling them through jQuery traversal in jQuery 3.x. 17391 documentElement.appendChild( el ).disabled = true; 17392 if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { 17393 rbuggyQSA.push( ":enabled", ":disabled" ); 17394 } 17395 17396 // Support: IE 11+, Edge 15 - 18+ 17397 // IE 11/Edge don't find elements on a `[name='']` query in some cases. 17398 // Adding a temporary attribute to the document before the selection works 17399 // around the issue. 17400 // Interestingly, IE 10 & older don't seem to have the issue. 17401 input = document.createElement( "input" ); 17402 input.setAttribute( "name", "" ); 17403 el.appendChild( input ); 17404 if ( !el.querySelectorAll( "[name='']" ).length ) { 17405 rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + 17406 whitespace + "*(?:''|\"\")" ); 17407 } 17408 } ); 17409 17410 if ( !support.cssHas ) { 17411 17412 // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ 17413 // Our regular `try-catch` mechanism fails to detect natively-unsupported 17414 // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) 17415 // in browsers that parse the `:has()` argument as a forgiving selector list. 17416 // https://drafts.csswg.org/selectors/#relational now requires the argument 17417 // to be parsed unforgivingly, but browsers have not yet fully adjusted. 17418 rbuggyQSA.push( ":has" ); 17419 } 17420 17421 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); 17422 17423 /* Sorting 17424 ---------------------------------------------------------------------- */ 17425 17426 // Document order sorting 17427 sortOrder = function( a, b ) { 17428 17429 // Flag for duplicate removal 17430 if ( a === b ) { 17431 hasDuplicate = true; 17432 return 0; 17433 } 17434 17435 // Sort on method existence if only one input has compareDocumentPosition 17436 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 17437 if ( compare ) { 17438 return compare; 17439 } 17440 17441 // Calculate position if both inputs belong to the same document 17442 // Support: IE 11+, Edge 17 - 18+ 17443 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 17444 // two documents; shallow comparisons work. 17445 // eslint-disable-next-line eqeqeq 17446 compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? 17447 a.compareDocumentPosition( b ) : 17448 17449 // Otherwise we know they are disconnected 17450 1; 17451 17452 // Disconnected nodes 17453 if ( compare & 1 || 17454 ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { 17455 17456 // Choose the first element that is related to our preferred document 17457 // Support: IE 11+, Edge 17 - 18+ 17458 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 17459 // two documents; shallow comparisons work. 17460 // eslint-disable-next-line eqeqeq 17461 if ( a === document || a.ownerDocument == preferredDoc && 17462 find.contains( preferredDoc, a ) ) { 17463 return -1; 17464 } 17465 17466 // Support: IE 11+, Edge 17 - 18+ 17467 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 17468 // two documents; shallow comparisons work. 17469 // eslint-disable-next-line eqeqeq 17470 if ( b === document || b.ownerDocument == preferredDoc && 17471 find.contains( preferredDoc, b ) ) { 17472 return 1; 17473 } 17474 17475 // Maintain original order 17476 return sortInput ? 17477 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 17478 0; 17479 } 17480 17481 return compare & 4 ? -1 : 1; 17482 }; 17483 17484 return document; 17485 } 17486 17487 find.matches = function( expr, elements ) { 17488 return find( expr, null, null, elements ); 17489 }; 17490 17491 find.matchesSelector = function( elem, expr ) { 17492 setDocument( elem ); 17493 17494 if ( documentIsHTML && 17495 !nonnativeSelectorCache[ expr + " " ] && 17496 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 17497 17498 try { 17499 var ret = matches.call( elem, expr ); 17500 17501 // IE 9's matchesSelector returns false on disconnected nodes 17502 if ( ret || support.disconnectedMatch || 17503 17504 // As well, disconnected nodes are said to be in a document 17505 // fragment in IE 9 17506 elem.document && elem.document.nodeType !== 11 ) { 17507 return ret; 17508 } 17509 } catch ( e ) { 17510 nonnativeSelectorCache( expr, true ); 17511 } 17512 } 17513 17514 return find( expr, document, null, [ elem ] ).length > 0; 17515 }; 17516 17517 find.contains = function( context, elem ) { 17518 17519 // Set document vars if needed 17520 // Support: IE 11+, Edge 17 - 18+ 17521 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 17522 // two documents; shallow comparisons work. 17523 // eslint-disable-next-line eqeqeq 17524 if ( ( context.ownerDocument || context ) != document ) { 17525 setDocument( context ); 17526 } 17527 return jQuery.contains( context, elem ); 17528 }; 17529 17530 17531 find.attr = function( elem, name ) { 17532 17533 // Set document vars if needed 17534 // Support: IE 11+, Edge 17 - 18+ 17535 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 17536 // two documents; shallow comparisons work. 17537 // eslint-disable-next-line eqeqeq 17538 if ( ( elem.ownerDocument || elem ) != document ) { 17539 setDocument( elem ); 17540 } 17541 17542 var fn = Expr.attrHandle[ name.toLowerCase() ], 17543 17544 // Don't get fooled by Object.prototype properties (see trac-13807) 17545 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 17546 fn( elem, name, !documentIsHTML ) : 17547 undefined; 17548 17549 if ( val !== undefined ) { 17550 return val; 17551 } 17552 17553 return elem.getAttribute( name ); 17554 }; 17555 17556 find.error = function( msg ) { 17557 throw new Error( "Syntax error, unrecognized expression: " + msg ); 17558 }; 17559 17560 /** 17561 * Document sorting and removing duplicates 17562 * @param {ArrayLike} results 17563 */ 17564 jQuery.uniqueSort = function( results ) { 17565 var elem, 17566 duplicates = [], 17567 j = 0, 17568 i = 0; 17569 17570 // Unless we *know* we can detect duplicates, assume their presence 17571 // 17572 // Support: Android <=4.0+ 17573 // Testing for detecting duplicates is unpredictable so instead assume we can't 17574 // depend on duplicate detection in all browsers without a stable sort. 17575 hasDuplicate = !support.sortStable; 17576 sortInput = !support.sortStable && slice.call( results, 0 ); 17577 sort.call( results, sortOrder ); 17578 17579 if ( hasDuplicate ) { 17580 while ( ( elem = results[ i++ ] ) ) { 17581 if ( elem === results[ i ] ) { 17582 j = duplicates.push( i ); 17583 } 17584 } 17585 while ( j-- ) { 17586 splice.call( results, duplicates[ j ], 1 ); 17587 } 17588 } 17589 17590 // Clear input after sorting to release objects 17591 // See https://github.com/jquery/sizzle/pull/225 17592 sortInput = null; 17593 17594 return results; 17595 }; 17596 17597 jQuery.fn.uniqueSort = function() { 17598 return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); 17599 }; 17600 17601 Expr = jQuery.expr = { 17602 17603 // Can be adjusted by the user 17604 cacheLength: 50, 17605 17606 createPseudo: markFunction, 17607 17608 match: matchExpr, 17609 17610 attrHandle: {}, 17611 17612 find: {}, 17613 17614 relative: { 17615 ">": { dir: "parentNode", first: true }, 17616 " ": { dir: "parentNode" }, 17617 "+": { dir: "previousSibling", first: true }, 17618 "~": { dir: "previousSibling" } 17619 }, 17620 17621 preFilter: { 17622 ATTR: function( match ) { 17623 match[ 1 ] = match[ 1 ].replace( runescape, funescape ); 17624 17625 // Move the given value to match[3] whether quoted or unquoted 17626 match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) 17627 .replace( runescape, funescape ); 17628 17629 if ( match[ 2 ] === "~=" ) { 17630 match[ 3 ] = " " + match[ 3 ] + " "; 17631 } 17632 17633 return match.slice( 0, 4 ); 17634 }, 17635 17636 CHILD: function( match ) { 17637 17638 /* matches from matchExpr["CHILD"] 17639 1 type (only|nth|...) 17640 2 what (child|of-type) 17641 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 17642 4 xn-component of xn+y argument ([+-]?\d*n|) 17643 5 sign of xn-component 17644 6 x of xn-component 17645 7 sign of y-component 17646 8 y of y-component 17647 */ 17648 match[ 1 ] = match[ 1 ].toLowerCase(); 17649 17650 if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { 17651 17652 // nth-* requires argument 17653 if ( !match[ 3 ] ) { 17654 find.error( match[ 0 ] ); 17655 } 17656 17657 // numeric x and y parameters for Expr.filter.CHILD 17658 // remember that false/true cast respectively to 0/1 17659 match[ 4 ] = +( match[ 4 ] ? 17660 match[ 5 ] + ( match[ 6 ] || 1 ) : 17661 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) 17662 ); 17663 match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); 17664 17665 // other types prohibit arguments 17666 } else if ( match[ 3 ] ) { 17667 find.error( match[ 0 ] ); 17668 } 17669 17670 return match; 17671 }, 17672 17673 PSEUDO: function( match ) { 17674 var excess, 17675 unquoted = !match[ 6 ] && match[ 2 ]; 17676 17677 if ( matchExpr.CHILD.test( match[ 0 ] ) ) { 17678 return null; 17679 } 17680 17681 // Accept quoted arguments as-is 17682 if ( match[ 3 ] ) { 17683 match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; 17684 17685 // Strip excess characters from unquoted arguments 17686 } else if ( unquoted && rpseudo.test( unquoted ) && 17687 17688 // Get excess from tokenize (recursively) 17689 ( excess = tokenize( unquoted, true ) ) && 17690 17691 // advance to the next closing parenthesis 17692 ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { 17693 17694 // excess is a negative index 17695 match[ 0 ] = match[ 0 ].slice( 0, excess ); 17696 match[ 2 ] = unquoted.slice( 0, excess ); 17697 } 17698 17699 // Return only captures needed by the pseudo filter method (type and argument) 17700 return match.slice( 0, 3 ); 17701 } 17702 }, 17703 17704 filter: { 17705 17706 TAG: function( nodeNameSelector ) { 17707 var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 17708 return nodeNameSelector === "*" ? 17709 function() { 17710 return true; 17711 } : 17712 function( elem ) { 17713 return nodeName( elem, expectedNodeName ); 17714 }; 17715 }, 17716 17717 CLASS: function( className ) { 17718 var pattern = classCache[ className + " " ]; 17719 17720 return pattern || 17721 ( pattern = new RegExp( "(^|" + whitespace + ")" + className + 17722 "(" + whitespace + "|$)" ) ) && 17723 classCache( className, function( elem ) { 17724 return pattern.test( 17725 typeof elem.className === "string" && elem.className || 17726 typeof elem.getAttribute !== "undefined" && 17727 elem.getAttribute( "class" ) || 17728 "" 17729 ); 17730 } ); 17731 }, 17732 17733 ATTR: function( name, operator, check ) { 17734 return function( elem ) { 17735 var result = find.attr( elem, name ); 17736 17737 if ( result == null ) { 17738 return operator === "!="; 17739 } 17740 if ( !operator ) { 17741 return true; 17742 } 17743 17744 result += ""; 17745 17746 if ( operator === "=" ) { 17747 return result === check; 17748 } 17749 if ( operator === "!=" ) { 17750 return result !== check; 17751 } 17752 if ( operator === "^=" ) { 17753 return check && result.indexOf( check ) === 0; 17754 } 17755 if ( operator === "*=" ) { 17756 return check && result.indexOf( check ) > -1; 17757 } 17758 if ( operator === "$=" ) { 17759 return check && result.slice( -check.length ) === check; 17760 } 17761 if ( operator === "~=" ) { 17762 return ( " " + result.replace( rwhitespace, " " ) + " " ) 17763 .indexOf( check ) > -1; 17764 } 17765 if ( operator === "|=" ) { 17766 return result === check || result.slice( 0, check.length + 1 ) === check + "-"; 17767 } 17768 17769 return false; 17770 }; 17771 }, 17772 17773 CHILD: function( type, what, _argument, first, last ) { 17774 var simple = type.slice( 0, 3 ) !== "nth", 17775 forward = type.slice( -4 ) !== "last", 17776 ofType = what === "of-type"; 17777 17778 return first === 1 && last === 0 ? 17779 17780 // Shortcut for :nth-*(n) 17781 function( elem ) { 17782 return !!elem.parentNode; 17783 } : 17784 17785 function( elem, _context, xml ) { 17786 var cache, outerCache, node, nodeIndex, start, 17787 dir = simple !== forward ? "nextSibling" : "previousSibling", 17788 parent = elem.parentNode, 17789 name = ofType && elem.nodeName.toLowerCase(), 17790 useCache = !xml && !ofType, 17791 diff = false; 17792 17793 if ( parent ) { 17794 17795 // :(first|last|only)-(child|of-type) 17796 if ( simple ) { 17797 while ( dir ) { 17798 node = elem; 17799 while ( ( node = node[ dir ] ) ) { 17800 if ( ofType ? 17801 nodeName( node, name ) : 17802 node.nodeType === 1 ) { 17803 17804 return false; 17805 } 17806 } 17807 17808 // Reverse direction for :only-* (if we haven't yet done so) 17809 start = dir = type === "only" && !start && "nextSibling"; 17810 } 17811 return true; 17812 } 17813 17814 start = [ forward ? parent.firstChild : parent.lastChild ]; 17815 17816 // non-xml :nth-child(...) stores cache data on `parent` 17817 if ( forward && useCache ) { 17818 17819 // Seek `elem` from a previously-cached index 17820 outerCache = parent[ expando ] || ( parent[ expando ] = {} ); 17821 cache = outerCache[ type ] || []; 17822 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 17823 diff = nodeIndex && cache[ 2 ]; 17824 node = nodeIndex && parent.childNodes[ nodeIndex ]; 17825 17826 while ( ( node = ++nodeIndex && node && node[ dir ] || 17827 17828 // Fallback to seeking `elem` from the start 17829 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 17830 17831 // When found, cache indexes on `parent` and break 17832 if ( node.nodeType === 1 && ++diff && node === elem ) { 17833 outerCache[ type ] = [ dirruns, nodeIndex, diff ]; 17834 break; 17835 } 17836 } 17837 17838 } else { 17839 17840 // Use previously-cached element index if available 17841 if ( useCache ) { 17842 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 17843 cache = outerCache[ type ] || []; 17844 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 17845 diff = nodeIndex; 17846 } 17847 17848 // xml :nth-child(...) 17849 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 17850 if ( diff === false ) { 17851 17852 // Use the same loop as above to seek `elem` from the start 17853 while ( ( node = ++nodeIndex && node && node[ dir ] || 17854 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 17855 17856 if ( ( ofType ? 17857 nodeName( node, name ) : 17858 node.nodeType === 1 ) && 17859 ++diff ) { 17860 17861 // Cache the index of each encountered element 17862 if ( useCache ) { 17863 outerCache = node[ expando ] || 17864 ( node[ expando ] = {} ); 17865 outerCache[ type ] = [ dirruns, diff ]; 17866 } 17867 17868 if ( node === elem ) { 17869 break; 17870 } 17871 } 17872 } 17873 } 17874 } 17875 17876 // Incorporate the offset, then check against cycle size 17877 diff -= last; 17878 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 17879 } 17880 }; 17881 }, 17882 17883 PSEUDO: function( pseudo, argument ) { 17884 17885 // pseudo-class names are case-insensitive 17886 // https://www.w3.org/TR/selectors/#pseudo-classes 17887 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 17888 // Remember that setFilters inherits from pseudos 17889 var args, 17890 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 17891 find.error( "unsupported pseudo: " + pseudo ); 17892 17893 // The user may use createPseudo to indicate that 17894 // arguments are needed to create the filter function 17895 // just as jQuery does 17896 if ( fn[ expando ] ) { 17897 return fn( argument ); 17898 } 17899 17900 // But maintain support for old signatures 17901 if ( fn.length > 1 ) { 17902 args = [ pseudo, pseudo, "", argument ]; 17903 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 17904 markFunction( function( seed, matches ) { 17905 var idx, 17906 matched = fn( seed, argument ), 17907 i = matched.length; 17908 while ( i-- ) { 17909 idx = indexOf.call( seed, matched[ i ] ); 17910 seed[ idx ] = !( matches[ idx ] = matched[ i ] ); 17911 } 17912 } ) : 17913 function( elem ) { 17914 return fn( elem, 0, args ); 17915 }; 17916 } 17917 17918 return fn; 17919 } 17920 }, 17921 17922 pseudos: { 17923 17924 // Potentially complex pseudos 17925 not: markFunction( function( selector ) { 17926 17927 // Trim the selector passed to compile 17928 // to avoid treating leading and trailing 17929 // spaces as combinators 17930 var input = [], 17931 results = [], 17932 matcher = compile( selector.replace( rtrimCSS, "$1" ) ); 17933 17934 return matcher[ expando ] ? 17935 markFunction( function( seed, matches, _context, xml ) { 17936 var elem, 17937 unmatched = matcher( seed, null, xml, [] ), 17938 i = seed.length; 17939 17940 // Match elements unmatched by `matcher` 17941 while ( i-- ) { 17942 if ( ( elem = unmatched[ i ] ) ) { 17943 seed[ i ] = !( matches[ i ] = elem ); 17944 } 17945 } 17946 } ) : 17947 function( elem, _context, xml ) { 17948 input[ 0 ] = elem; 17949 matcher( input, null, xml, results ); 17950 17951 // Don't keep the element 17952 // (see https://github.com/jquery/sizzle/issues/299) 17953 input[ 0 ] = null; 17954 return !results.pop(); 17955 }; 17956 } ), 17957 17958 has: markFunction( function( selector ) { 17959 return function( elem ) { 17960 return find( selector, elem ).length > 0; 17961 }; 17962 } ), 17963 17964 contains: markFunction( function( text ) { 17965 text = text.replace( runescape, funescape ); 17966 return function( elem ) { 17967 return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; 17968 }; 17969 } ), 17970 17971 // "Whether an element is represented by a :lang() selector 17972 // is based solely on the element's language value 17973 // being equal to the identifier C, 17974 // or beginning with the identifier C immediately followed by "-". 17975 // The matching of C against the element's language value is performed case-insensitively. 17976 // The identifier C does not have to be a valid language name." 17977 // https://www.w3.org/TR/selectors/#lang-pseudo 17978 lang: markFunction( function( lang ) { 17979 17980 // lang value must be a valid identifier 17981 if ( !ridentifier.test( lang || "" ) ) { 17982 find.error( "unsupported lang: " + lang ); 17983 } 17984 lang = lang.replace( runescape, funescape ).toLowerCase(); 17985 return function( elem ) { 17986 var elemLang; 17987 do { 17988 if ( ( elemLang = documentIsHTML ? 17989 elem.lang : 17990 elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { 17991 17992 elemLang = elemLang.toLowerCase(); 17993 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 17994 } 17995 } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); 17996 return false; 17997 }; 17998 } ), 17999 18000 // Miscellaneous 18001 target: function( elem ) { 18002 var hash = window.location && window.location.hash; 18003 return hash && hash.slice( 1 ) === elem.id; 18004 }, 18005 18006 root: function( elem ) { 18007 return elem === documentElement; 18008 }, 18009 18010 focus: function( elem ) { 18011 return elem === safeActiveElement() && 18012 document.hasFocus() && 18013 !!( elem.type || elem.href || ~elem.tabIndex ); 18014 }, 18015 18016 // Boolean properties 18017 enabled: createDisabledPseudo( false ), 18018 disabled: createDisabledPseudo( true ), 18019 18020 checked: function( elem ) { 18021 18022 // In CSS3, :checked should return both checked and selected elements 18023 // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 18024 return ( nodeName( elem, "input" ) && !!elem.checked ) || 18025 ( nodeName( elem, "option" ) && !!elem.selected ); 18026 }, 18027 18028 selected: function( elem ) { 18029 18030 // Support: IE <=11+ 18031 // Accessing the selectedIndex property 18032 // forces the browser to treat the default option as 18033 // selected when in an optgroup. 18034 if ( elem.parentNode ) { 18035 // eslint-disable-next-line no-unused-expressions 18036 elem.parentNode.selectedIndex; 18037 } 18038 18039 return elem.selected === true; 18040 }, 18041 18042 // Contents 18043 empty: function( elem ) { 18044 18045 // https://www.w3.org/TR/selectors/#empty-pseudo 18046 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 18047 // but not by others (comment: 8; processing instruction: 7; etc.) 18048 // nodeType < 6 works because attributes (2) do not appear as children 18049 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 18050 if ( elem.nodeType < 6 ) { 18051 return false; 18052 } 18053 } 18054 return true; 18055 }, 18056 18057 parent: function( elem ) { 18058 return !Expr.pseudos.empty( elem ); 18059 }, 18060 18061 // Element/input types 18062 header: function( elem ) { 18063 return rheader.test( elem.nodeName ); 18064 }, 18065 18066 input: function( elem ) { 18067 return rinputs.test( elem.nodeName ); 18068 }, 18069 18070 button: function( elem ) { 18071 return nodeName( elem, "input" ) && elem.type === "button" || 18072 nodeName( elem, "button" ); 18073 }, 18074 18075 text: function( elem ) { 18076 var attr; 18077 return nodeName( elem, "input" ) && elem.type === "text" && 18078 18079 // Support: IE <10 only 18080 // New HTML5 attribute values (e.g., "search") appear 18081 // with elem.type === "text" 18082 ( ( attr = elem.getAttribute( "type" ) ) == null || 18083 attr.toLowerCase() === "text" ); 18084 }, 18085 18086 // Position-in-collection 18087 first: createPositionalPseudo( function() { 18088 return [ 0 ]; 18089 } ), 18090 18091 last: createPositionalPseudo( function( _matchIndexes, length ) { 18092 return [ length - 1 ]; 18093 } ), 18094 18095 eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { 18096 return [ argument < 0 ? argument + length : argument ]; 18097 } ), 18098 18099 even: createPositionalPseudo( function( matchIndexes, length ) { 18100 var i = 0; 18101 for ( ; i < length; i += 2 ) { 18102 matchIndexes.push( i ); 18103 } 18104 return matchIndexes; 18105 } ), 18106 18107 odd: createPositionalPseudo( function( matchIndexes, length ) { 18108 var i = 1; 18109 for ( ; i < length; i += 2 ) { 18110 matchIndexes.push( i ); 18111 } 18112 return matchIndexes; 18113 } ), 18114 18115 lt: createPositionalPseudo( function( matchIndexes, length, argument ) { 18116 var i; 18117 18118 if ( argument < 0 ) { 18119 i = argument + length; 18120 } else if ( argument > length ) { 18121 i = length; 18122 } else { 18123 i = argument; 18124 } 18125 18126 for ( ; --i >= 0; ) { 18127 matchIndexes.push( i ); 18128 } 18129 return matchIndexes; 18130 } ), 18131 18132 gt: createPositionalPseudo( function( matchIndexes, length, argument ) { 18133 var i = argument < 0 ? argument + length : argument; 18134 for ( ; ++i < length; ) { 18135 matchIndexes.push( i ); 18136 } 18137 return matchIndexes; 18138 } ) 18139 } 18140 }; 18141 18142 Expr.pseudos.nth = Expr.pseudos.eq; 18143 18144// Add button/input type pseudos 18145 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 18146 Expr.pseudos[ i ] = createInputPseudo( i ); 18147 } 18148 for ( i in { submit: true, reset: true } ) { 18149 Expr.pseudos[ i ] = createButtonPseudo( i ); 18150 } 18151 18152// Easy API for creating new setFilters 18153 function setFilters() {} 18154 setFilters.prototype = Expr.filters = Expr.pseudos; 18155 Expr.setFilters = new setFilters(); 18156 18157 function tokenize( selector, parseOnly ) { 18158 var matched, match, tokens, type, 18159 soFar, groups, preFilters, 18160 cached = tokenCache[ selector + " " ]; 18161 18162 if ( cached ) { 18163 return parseOnly ? 0 : cached.slice( 0 ); 18164 } 18165 18166 soFar = selector; 18167 groups = []; 18168 preFilters = Expr.preFilter; 18169 18170 while ( soFar ) { 18171 18172 // Comma and first run 18173 if ( !matched || ( match = rcomma.exec( soFar ) ) ) { 18174 if ( match ) { 18175 18176 // Don't consume trailing commas as valid 18177 soFar = soFar.slice( match[ 0 ].length ) || soFar; 18178 } 18179 groups.push( ( tokens = [] ) ); 18180 } 18181 18182 matched = false; 18183 18184 // Combinators 18185 if ( ( match = rleadingCombinator.exec( soFar ) ) ) { 18186 matched = match.shift(); 18187 tokens.push( { 18188 value: matched, 18189 18190 // Cast descendant combinators to space 18191 type: match[ 0 ].replace( rtrimCSS, " " ) 18192 } ); 18193 soFar = soFar.slice( matched.length ); 18194 } 18195 18196 // Filters 18197 for ( type in Expr.filter ) { 18198 if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || 18199 ( match = preFilters[ type ]( match ) ) ) ) { 18200 matched = match.shift(); 18201 tokens.push( { 18202 value: matched, 18203 type: type, 18204 matches: match 18205 } ); 18206 soFar = soFar.slice( matched.length ); 18207 } 18208 } 18209 18210 if ( !matched ) { 18211 break; 18212 } 18213 } 18214 18215 // Return the length of the invalid excess 18216 // if we're just parsing 18217 // Otherwise, throw an error or return tokens 18218 if ( parseOnly ) { 18219 return soFar.length; 18220 } 18221 18222 return soFar ? 18223 find.error( selector ) : 18224 18225 // Cache the tokens 18226 tokenCache( selector, groups ).slice( 0 ); 18227 } 18228 18229 function toSelector( tokens ) { 18230 var i = 0, 18231 len = tokens.length, 18232 selector = ""; 18233 for ( ; i < len; i++ ) { 18234 selector += tokens[ i ].value; 18235 } 18236 return selector; 18237 } 18238 18239 function addCombinator( matcher, combinator, base ) { 18240 var dir = combinator.dir, 18241 skip = combinator.next, 18242 key = skip || dir, 18243 checkNonElements = base && key === "parentNode", 18244 doneName = done++; 18245 18246 return combinator.first ? 18247 18248 // Check against closest ancestor/preceding element 18249 function( elem, context, xml ) { 18250 while ( ( elem = elem[ dir ] ) ) { 18251 if ( elem.nodeType === 1 || checkNonElements ) { 18252 return matcher( elem, context, xml ); 18253 } 18254 } 18255 return false; 18256 } : 18257 18258 // Check against all ancestor/preceding elements 18259 function( elem, context, xml ) { 18260 var oldCache, outerCache, 18261 newCache = [ dirruns, doneName ]; 18262 18263 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 18264 if ( xml ) { 18265 while ( ( elem = elem[ dir ] ) ) { 18266 if ( elem.nodeType === 1 || checkNonElements ) { 18267 if ( matcher( elem, context, xml ) ) { 18268 return true; 18269 } 18270 } 18271 } 18272 } else { 18273 while ( ( elem = elem[ dir ] ) ) { 18274 if ( elem.nodeType === 1 || checkNonElements ) { 18275 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 18276 18277 if ( skip && nodeName( elem, skip ) ) { 18278 elem = elem[ dir ] || elem; 18279 } else if ( ( oldCache = outerCache[ key ] ) && 18280 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 18281 18282 // Assign to newCache so results back-propagate to previous elements 18283 return ( newCache[ 2 ] = oldCache[ 2 ] ); 18284 } else { 18285 18286 // Reuse newcache so results back-propagate to previous elements 18287 outerCache[ key ] = newCache; 18288 18289 // A match means we're done; a fail means we have to keep checking 18290 if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { 18291 return true; 18292 } 18293 } 18294 } 18295 } 18296 } 18297 return false; 18298 }; 18299 } 18300 18301 function elementMatcher( matchers ) { 18302 return matchers.length > 1 ? 18303 function( elem, context, xml ) { 18304 var i = matchers.length; 18305 while ( i-- ) { 18306 if ( !matchers[ i ]( elem, context, xml ) ) { 18307 return false; 18308 } 18309 } 18310 return true; 18311 } : 18312 matchers[ 0 ]; 18313 } 18314 18315 function multipleContexts( selector, contexts, results ) { 18316 var i = 0, 18317 len = contexts.length; 18318 for ( ; i < len; i++ ) { 18319 find( selector, contexts[ i ], results ); 18320 } 18321 return results; 18322 } 18323 18324 function condense( unmatched, map, filter, context, xml ) { 18325 var elem, 18326 newUnmatched = [], 18327 i = 0, 18328 len = unmatched.length, 18329 mapped = map != null; 18330 18331 for ( ; i < len; i++ ) { 18332 if ( ( elem = unmatched[ i ] ) ) { 18333 if ( !filter || filter( elem, context, xml ) ) { 18334 newUnmatched.push( elem ); 18335 if ( mapped ) { 18336 map.push( i ); 18337 } 18338 } 18339 } 18340 } 18341 18342 return newUnmatched; 18343 } 18344 18345 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 18346 if ( postFilter && !postFilter[ expando ] ) { 18347 postFilter = setMatcher( postFilter ); 18348 } 18349 if ( postFinder && !postFinder[ expando ] ) { 18350 postFinder = setMatcher( postFinder, postSelector ); 18351 } 18352 return markFunction( function( seed, results, context, xml ) { 18353 var temp, i, elem, matcherOut, 18354 preMap = [], 18355 postMap = [], 18356 preexisting = results.length, 18357 18358 // Get initial elements from seed or context 18359 elems = seed || 18360 multipleContexts( selector || "*", 18361 context.nodeType ? [ context ] : context, [] ), 18362 18363 // Prefilter to get matcher input, preserving a map for seed-results synchronization 18364 matcherIn = preFilter && ( seed || !selector ) ? 18365 condense( elems, preMap, preFilter, context, xml ) : 18366 elems; 18367 18368 if ( matcher ) { 18369 18370 // If we have a postFinder, or filtered seed, or non-seed postFilter 18371 // or preexisting results, 18372 matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 18373 18374 // ...intermediate processing is necessary 18375 [] : 18376 18377 // ...otherwise use results directly 18378 results; 18379 18380 // Find primary matches 18381 matcher( matcherIn, matcherOut, context, xml ); 18382 } else { 18383 matcherOut = matcherIn; 18384 } 18385 18386 // Apply postFilter 18387 if ( postFilter ) { 18388 temp = condense( matcherOut, postMap ); 18389 postFilter( temp, [], context, xml ); 18390 18391 // Un-match failing elements by moving them back to matcherIn 18392 i = temp.length; 18393 while ( i-- ) { 18394 if ( ( elem = temp[ i ] ) ) { 18395 matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); 18396 } 18397 } 18398 } 18399 18400 if ( seed ) { 18401 if ( postFinder || preFilter ) { 18402 if ( postFinder ) { 18403 18404 // Get the final matcherOut by condensing this intermediate into postFinder contexts 18405 temp = []; 18406 i = matcherOut.length; 18407 while ( i-- ) { 18408 if ( ( elem = matcherOut[ i ] ) ) { 18409 18410 // Restore matcherIn since elem is not yet a final match 18411 temp.push( ( matcherIn[ i ] = elem ) ); 18412 } 18413 } 18414 postFinder( null, ( matcherOut = [] ), temp, xml ); 18415 } 18416 18417 // Move matched elements from seed to results to keep them synchronized 18418 i = matcherOut.length; 18419 while ( i-- ) { 18420 if ( ( elem = matcherOut[ i ] ) && 18421 ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { 18422 18423 seed[ temp ] = !( results[ temp ] = elem ); 18424 } 18425 } 18426 } 18427 18428 // Add elements to results, through postFinder if defined 18429 } else { 18430 matcherOut = condense( 18431 matcherOut === results ? 18432 matcherOut.splice( preexisting, matcherOut.length ) : 18433 matcherOut 18434 ); 18435 if ( postFinder ) { 18436 postFinder( null, results, matcherOut, xml ); 18437 } else { 18438 push.apply( results, matcherOut ); 18439 } 18440 } 18441 } ); 18442 } 18443 18444 function matcherFromTokens( tokens ) { 18445 var checkContext, matcher, j, 18446 len = tokens.length, 18447 leadingRelative = Expr.relative[ tokens[ 0 ].type ], 18448 implicitRelative = leadingRelative || Expr.relative[ " " ], 18449 i = leadingRelative ? 1 : 0, 18450 18451 // The foundational matcher ensures that elements are reachable from top-level context(s) 18452 matchContext = addCombinator( function( elem ) { 18453 return elem === checkContext; 18454 }, implicitRelative, true ), 18455 matchAnyContext = addCombinator( function( elem ) { 18456 return indexOf.call( checkContext, elem ) > -1; 18457 }, implicitRelative, true ), 18458 matchers = [ function( elem, context, xml ) { 18459 18460 // Support: IE 11+, Edge 17 - 18+ 18461 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 18462 // two documents; shallow comparisons work. 18463 // eslint-disable-next-line eqeqeq 18464 var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( 18465 ( checkContext = context ).nodeType ? 18466 matchContext( elem, context, xml ) : 18467 matchAnyContext( elem, context, xml ) ); 18468 18469 // Avoid hanging onto element 18470 // (see https://github.com/jquery/sizzle/issues/299) 18471 checkContext = null; 18472 return ret; 18473 } ]; 18474 18475 for ( ; i < len; i++ ) { 18476 if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { 18477 matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; 18478 } else { 18479 matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); 18480 18481 // Return special upon seeing a positional matcher 18482 if ( matcher[ expando ] ) { 18483 18484 // Find the next relative operator (if any) for proper handling 18485 j = ++i; 18486 for ( ; j < len; j++ ) { 18487 if ( Expr.relative[ tokens[ j ].type ] ) { 18488 break; 18489 } 18490 } 18491 return setMatcher( 18492 i > 1 && elementMatcher( matchers ), 18493 i > 1 && toSelector( 18494 18495 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 18496 tokens.slice( 0, i - 1 ) 18497 .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) 18498 ).replace( rtrimCSS, "$1" ), 18499 matcher, 18500 i < j && matcherFromTokens( tokens.slice( i, j ) ), 18501 j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), 18502 j < len && toSelector( tokens ) 18503 ); 18504 } 18505 matchers.push( matcher ); 18506 } 18507 } 18508 18509 return elementMatcher( matchers ); 18510 } 18511 18512 function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 18513 var bySet = setMatchers.length > 0, 18514 byElement = elementMatchers.length > 0, 18515 superMatcher = function( seed, context, xml, results, outermost ) { 18516 var elem, j, matcher, 18517 matchedCount = 0, 18518 i = "0", 18519 unmatched = seed && [], 18520 setMatched = [], 18521 contextBackup = outermostContext, 18522 18523 // We must always have either seed elements or outermost context 18524 elems = seed || byElement && Expr.find.TAG( "*", outermost ), 18525 18526 // Use integer dirruns iff this is the outermost matcher 18527 dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), 18528 len = elems.length; 18529 18530 if ( outermost ) { 18531 18532 // Support: IE 11+, Edge 17 - 18+ 18533 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 18534 // two documents; shallow comparisons work. 18535 // eslint-disable-next-line eqeqeq 18536 outermostContext = context == document || context || outermost; 18537 } 18538 18539 // Add elements passing elementMatchers directly to results 18540 // Support: iOS <=7 - 9 only 18541 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching 18542 // elements by id. (see trac-14142) 18543 for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { 18544 if ( byElement && elem ) { 18545 j = 0; 18546 18547 // Support: IE 11+, Edge 17 - 18+ 18548 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 18549 // two documents; shallow comparisons work. 18550 // eslint-disable-next-line eqeqeq 18551 if ( !context && elem.ownerDocument != document ) { 18552 setDocument( elem ); 18553 xml = !documentIsHTML; 18554 } 18555 while ( ( matcher = elementMatchers[ j++ ] ) ) { 18556 if ( matcher( elem, context || document, xml ) ) { 18557 push.call( results, elem ); 18558 break; 18559 } 18560 } 18561 if ( outermost ) { 18562 dirruns = dirrunsUnique; 18563 } 18564 } 18565 18566 // Track unmatched elements for set filters 18567 if ( bySet ) { 18568 18569 // They will have gone through all possible matchers 18570 if ( ( elem = !matcher && elem ) ) { 18571 matchedCount--; 18572 } 18573 18574 // Lengthen the array for every element, matched or not 18575 if ( seed ) { 18576 unmatched.push( elem ); 18577 } 18578 } 18579 } 18580 18581 // `i` is now the count of elements visited above, and adding it to `matchedCount` 18582 // makes the latter nonnegative. 18583 matchedCount += i; 18584 18585 // Apply set filters to unmatched elements 18586 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 18587 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 18588 // no element matchers and no seed. 18589 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 18590 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 18591 // numerically zero. 18592 if ( bySet && i !== matchedCount ) { 18593 j = 0; 18594 while ( ( matcher = setMatchers[ j++ ] ) ) { 18595 matcher( unmatched, setMatched, context, xml ); 18596 } 18597 18598 if ( seed ) { 18599 18600 // Reintegrate element matches to eliminate the need for sorting 18601 if ( matchedCount > 0 ) { 18602 while ( i-- ) { 18603 if ( !( unmatched[ i ] || setMatched[ i ] ) ) { 18604 setMatched[ i ] = pop.call( results ); 18605 } 18606 } 18607 } 18608 18609 // Discard index placeholder values to get only actual matches 18610 setMatched = condense( setMatched ); 18611 } 18612 18613 // Add matches to results 18614 push.apply( results, setMatched ); 18615 18616 // Seedless set matches succeeding multiple successful matchers stipulate sorting 18617 if ( outermost && !seed && setMatched.length > 0 && 18618 ( matchedCount + setMatchers.length ) > 1 ) { 18619 18620 jQuery.uniqueSort( results ); 18621 } 18622 } 18623 18624 // Override manipulation of globals by nested matchers 18625 if ( outermost ) { 18626 dirruns = dirrunsUnique; 18627 outermostContext = contextBackup; 18628 } 18629 18630 return unmatched; 18631 }; 18632 18633 return bySet ? 18634 markFunction( superMatcher ) : 18635 superMatcher; 18636 } 18637 18638 function compile( selector, match /* Internal Use Only */ ) { 18639 var i, 18640 setMatchers = [], 18641 elementMatchers = [], 18642 cached = compilerCache[ selector + " " ]; 18643 18644 if ( !cached ) { 18645 18646 // Generate a function of recursive functions that can be used to check each element 18647 if ( !match ) { 18648 match = tokenize( selector ); 18649 } 18650 i = match.length; 18651 while ( i-- ) { 18652 cached = matcherFromTokens( match[ i ] ); 18653 if ( cached[ expando ] ) { 18654 setMatchers.push( cached ); 18655 } else { 18656 elementMatchers.push( cached ); 18657 } 18658 } 18659 18660 // Cache the compiled function 18661 cached = compilerCache( selector, 18662 matcherFromGroupMatchers( elementMatchers, setMatchers ) ); 18663 18664 // Save selector and tokenization 18665 cached.selector = selector; 18666 } 18667 return cached; 18668 } 18669 18670 /** 18671 * A low-level selection function that works with jQuery's compiled 18672 * selector functions 18673 * @param {String|Function} selector A selector or a pre-compiled 18674 * selector function built with jQuery selector compile 18675 * @param {Element} context 18676 * @param {Array} [results] 18677 * @param {Array} [seed] A set of elements to match against 18678 */ 18679 function select( selector, context, results, seed ) { 18680 var i, tokens, token, type, find, 18681 compiled = typeof selector === "function" && selector, 18682 match = !seed && tokenize( ( selector = compiled.selector || selector ) ); 18683 18684 results = results || []; 18685 18686 // Try to minimize operations if there is only one selector in the list and no seed 18687 // (the latter of which guarantees us context) 18688 if ( match.length === 1 ) { 18689 18690 // Reduce context if the leading compound selector is an ID 18691 tokens = match[ 0 ] = match[ 0 ].slice( 0 ); 18692 if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && 18693 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { 18694 18695 context = ( Expr.find.ID( 18696 token.matches[ 0 ].replace( runescape, funescape ), 18697 context 18698 ) || [] )[ 0 ]; 18699 if ( !context ) { 18700 return results; 18701 18702 // Precompiled matchers will still verify ancestry, so step up a level 18703 } else if ( compiled ) { 18704 context = context.parentNode; 18705 } 18706 18707 selector = selector.slice( tokens.shift().value.length ); 18708 } 18709 18710 // Fetch a seed set for right-to-left matching 18711 i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; 18712 while ( i-- ) { 18713 token = tokens[ i ]; 18714 18715 // Abort if we hit a combinator 18716 if ( Expr.relative[ ( type = token.type ) ] ) { 18717 break; 18718 } 18719 if ( ( find = Expr.find[ type ] ) ) { 18720 18721 // Search, expanding context for leading sibling combinators 18722 if ( ( seed = find( 18723 token.matches[ 0 ].replace( runescape, funescape ), 18724 rsibling.test( tokens[ 0 ].type ) && 18725 testContext( context.parentNode ) || context 18726 ) ) ) { 18727 18728 // If seed is empty or no tokens remain, we can return early 18729 tokens.splice( i, 1 ); 18730 selector = seed.length && toSelector( tokens ); 18731 if ( !selector ) { 18732 push.apply( results, seed ); 18733 return results; 18734 } 18735 18736 break; 18737 } 18738 } 18739 } 18740 } 18741 18742 // Compile and execute a filtering function if one is not provided 18743 // Provide `match` to avoid retokenization if we modified the selector above 18744 ( compiled || compile( selector, match ) )( 18745 seed, 18746 context, 18747 !documentIsHTML, 18748 results, 18749 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 18750 ); 18751 return results; 18752 } 18753 18754// One-time assignments 18755 18756// Support: Android <=4.0 - 4.1+ 18757// Sort stability 18758 support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; 18759 18760// Initialize against the default document 18761 setDocument(); 18762 18763// Support: Android <=4.0 - 4.1+ 18764// Detached nodes confoundingly follow *each other* 18765 support.sortDetached = assert( function( el ) { 18766 18767 // Should return 1, but returns 4 (following) 18768 return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; 18769 } ); 18770 18771 jQuery.find = find; 18772 18773// Deprecated 18774 jQuery.expr[ ":" ] = jQuery.expr.pseudos; 18775 jQuery.unique = jQuery.uniqueSort; 18776 18777// These have always been private, but they used to be documented as part of 18778// Sizzle so let's maintain them for now for backwards compatibility purposes. 18779 find.compile = compile; 18780 find.select = select; 18781 find.setDocument = setDocument; 18782 find.tokenize = tokenize; 18783 18784 find.escape = jQuery.escapeSelector; 18785 find.getText = jQuery.text; 18786 find.isXML = jQuery.isXMLDoc; 18787 find.selectors = jQuery.expr; 18788 find.support = jQuery.support; 18789 find.uniqueSort = jQuery.uniqueSort; 18790 18791 /* eslint-enable */ 18792 18793 } )(); 18794 18795 18796 var dir = function( elem, dir, until ) { 18797 var matched = [], 18798 truncate = until !== undefined; 18799 18800 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 18801 if ( elem.nodeType === 1 ) { 18802 if ( truncate && jQuery( elem ).is( until ) ) { 18803 break; 18804 } 18805 matched.push( elem ); 18806 } 18807 } 18808 return matched; 18809 }; 18810 18811 18812 var siblings = function( n, elem ) { 18813 var matched = []; 18814 18815 for ( ; n; n = n.nextSibling ) { 18816 if ( n.nodeType === 1 && n !== elem ) { 18817 matched.push( n ); 18818 } 18819 } 18820 18821 return matched; 18822 }; 18823 18824 18825 var rneedsContext = jQuery.expr.match.needsContext; 18826 18827 var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 18828 18829 18830 18831// Implement the identical functionality for filter and not 18832 function winnow( elements, qualifier, not ) { 18833 if ( isFunction( qualifier ) ) { 18834 return jQuery.grep( elements, function( elem, i ) { 18835 return !!qualifier.call( elem, i, elem ) !== not; 18836 } ); 18837 } 18838 18839 // Single element 18840 if ( qualifier.nodeType ) { 18841 return jQuery.grep( elements, function( elem ) { 18842 return ( elem === qualifier ) !== not; 18843 } ); 18844 } 18845 18846 // Arraylike of elements (jQuery, arguments, Array) 18847 if ( typeof qualifier !== "string" ) { 18848 return jQuery.grep( elements, function( elem ) { 18849 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 18850 } ); 18851 } 18852 18853 // Filtered directly for both simple and complex selectors 18854 return jQuery.filter( qualifier, elements, not ); 18855 } 18856 18857 jQuery.filter = function( expr, elems, not ) { 18858 var elem = elems[ 0 ]; 18859 18860 if ( not ) { 18861 expr = ":not(" + expr + ")"; 18862 } 18863 18864 if ( elems.length === 1 && elem.nodeType === 1 ) { 18865 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 18866 } 18867 18868 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 18869 return elem.nodeType === 1; 18870 } ) ); 18871 }; 18872 18873 jQuery.fn.extend( { 18874 find: function( selector ) { 18875 var i, ret, 18876 len = this.length, 18877 self = this; 18878 18879 if ( typeof selector !== "string" ) { 18880 return this.pushStack( jQuery( selector ).filter( function() { 18881 for ( i = 0; i < len; i++ ) { 18882 if ( jQuery.contains( self[ i ], this ) ) { 18883 return true; 18884 } 18885 } 18886 } ) ); 18887 } 18888 18889 ret = this.pushStack( [] ); 18890 18891 for ( i = 0; i < len; i++ ) { 18892 jQuery.find( selector, self[ i ], ret ); 18893 } 18894 18895 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 18896 }, 18897 filter: function( selector ) { 18898 return this.pushStack( winnow( this, selector || [], false ) ); 18899 }, 18900 not: function( selector ) { 18901 return this.pushStack( winnow( this, selector || [], true ) ); 18902 }, 18903 is: function( selector ) { 18904 return !!winnow( 18905 this, 18906 18907 // If this is a positional/relative selector, check membership in the returned set 18908 // so $("p:first").is("p:last") won't return true for a doc with two "p". 18909 typeof selector === "string" && rneedsContext.test( selector ) ? 18910 jQuery( selector ) : 18911 selector || [], 18912 false 18913 ).length; 18914 } 18915 } ); 18916 18917 18918// Initialize a jQuery object 18919 18920 18921// A central reference to the root jQuery(document) 18922 var rootjQuery, 18923 18924 // A simple way to check for HTML strings 18925 // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) 18926 // Strict HTML recognition (trac-11290: must start with <) 18927 // Shortcut simple #id case for speed 18928 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 18929 18930 init = jQuery.fn.init = function( selector, context, root ) { 18931 var match, elem; 18932 18933 // HANDLE: $(""), $(null), $(undefined), $(false) 18934 if ( !selector ) { 18935 return this; 18936 } 18937 18938 // Method init() accepts an alternate rootjQuery 18939 // so migrate can support jQuery.sub (gh-2101) 18940 root = root || rootjQuery; 18941 18942 // Handle HTML strings 18943 if ( typeof selector === "string" ) { 18944 if ( selector[ 0 ] === "<" && 18945 selector[ selector.length - 1 ] === ">" && 18946 selector.length >= 3 ) { 18947 18948 // Assume that strings that start and end with <> are HTML and skip the regex check 18949 match = [ null, selector, null ]; 18950 18951 } else { 18952 match = rquickExpr.exec( selector ); 18953 } 18954 18955 // Match html or make sure no context is specified for #id 18956 if ( match && ( match[ 1 ] || !context ) ) { 18957 18958 // HANDLE: $(html) -> $(array) 18959 if ( match[ 1 ] ) { 18960 context = context instanceof jQuery ? context[ 0 ] : context; 18961 18962 // Option to run scripts is true for back-compat 18963 // Intentionally let the error be thrown if parseHTML is not present 18964 jQuery.merge( this, jQuery.parseHTML( 18965 match[ 1 ], 18966 context && context.nodeType ? context.ownerDocument || context : document, 18967 true 18968 ) ); 18969 18970 // HANDLE: $(html, props) 18971 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 18972 for ( match in context ) { 18973 18974 // Properties of context are called as methods if possible 18975 if ( isFunction( this[ match ] ) ) { 18976 this[ match ]( context[ match ] ); 18977 18978 // ...and otherwise set as attributes 18979 } else { 18980 this.attr( match, context[ match ] ); 18981 } 18982 } 18983 } 18984 18985 return this; 18986 18987 // HANDLE: $(#id) 18988 } else { 18989 elem = document.getElementById( match[ 2 ] ); 18990 18991 if ( elem ) { 18992 18993 // Inject the element directly into the jQuery object 18994 this[ 0 ] = elem; 18995 this.length = 1; 18996 } 18997 return this; 18998 } 18999 19000 // HANDLE: $(expr, $(...)) 19001 } else if ( !context || context.jquery ) { 19002 return ( context || root ).find( selector ); 19003 19004 // HANDLE: $(expr, context) 19005 // (which is just equivalent to: $(context).find(expr) 19006 } else { 19007 return this.constructor( context ).find( selector ); 19008 } 19009 19010 // HANDLE: $(DOMElement) 19011 } else if ( selector.nodeType ) { 19012 this[ 0 ] = selector; 19013 this.length = 1; 19014 return this; 19015 19016 // HANDLE: $(function) 19017 // Shortcut for document ready 19018 } else if ( isFunction( selector ) ) { 19019 return root.ready !== undefined ? 19020 root.ready( selector ) : 19021 19022 // Execute immediately if ready is not present 19023 selector( jQuery ); 19024 } 19025 19026 return jQuery.makeArray( selector, this ); 19027 }; 19028 19029// Give the init function the jQuery prototype for later instantiation 19030 init.prototype = jQuery.fn; 19031 19032// Initialize central reference 19033 rootjQuery = jQuery( document ); 19034 19035 19036 var rparentsprev = /^(?:parents|prev(?:Until|All))/, 19037 19038 // Methods guaranteed to produce a unique set when starting from a unique set 19039 guaranteedUnique = { 19040 children: true, 19041 contents: true, 19042 next: true, 19043 prev: true 19044 }; 19045 19046 jQuery.fn.extend( { 19047 has: function( target ) { 19048 var targets = jQuery( target, this ), 19049 l = targets.length; 19050 19051 return this.filter( function() { 19052 var i = 0; 19053 for ( ; i < l; i++ ) { 19054 if ( jQuery.contains( this, targets[ i ] ) ) { 19055 return true; 19056 } 19057 } 19058 } ); 19059 }, 19060 19061 closest: function( selectors, context ) { 19062 var cur, 19063 i = 0, 19064 l = this.length, 19065 matched = [], 19066 targets = typeof selectors !== "string" && jQuery( selectors ); 19067 19068 // Positional selectors never match, since there's no _selection_ context 19069 if ( !rneedsContext.test( selectors ) ) { 19070 for ( ; i < l; i++ ) { 19071 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 19072 19073 // Always skip document fragments 19074 if ( cur.nodeType < 11 && ( targets ? 19075 targets.index( cur ) > -1 : 19076 19077 // Don't pass non-elements to jQuery#find 19078 cur.nodeType === 1 && 19079 jQuery.find.matchesSelector( cur, selectors ) ) ) { 19080 19081 matched.push( cur ); 19082 break; 19083 } 19084 } 19085 } 19086 } 19087 19088 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 19089 }, 19090 19091 // Determine the position of an element within the set 19092 index: function( elem ) { 19093 19094 // No argument, return index in parent 19095 if ( !elem ) { 19096 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 19097 } 19098 19099 // Index in selector 19100 if ( typeof elem === "string" ) { 19101 return indexOf.call( jQuery( elem ), this[ 0 ] ); 19102 } 19103 19104 // Locate the position of the desired element 19105 return indexOf.call( this, 19106 19107 // If it receives a jQuery object, the first element is used 19108 elem.jquery ? elem[ 0 ] : elem 19109 ); 19110 }, 19111 19112 add: function( selector, context ) { 19113 return this.pushStack( 19114 jQuery.uniqueSort( 19115 jQuery.merge( this.get(), jQuery( selector, context ) ) 19116 ) 19117 ); 19118 }, 19119 19120 addBack: function( selector ) { 19121 return this.add( selector == null ? 19122 this.prevObject : this.prevObject.filter( selector ) 19123 ); 19124 } 19125 } ); 19126 19127 function sibling( cur, dir ) { 19128 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 19129 return cur; 19130 } 19131 19132 jQuery.each( { 19133 parent: function( elem ) { 19134 var parent = elem.parentNode; 19135 return parent && parent.nodeType !== 11 ? parent : null; 19136 }, 19137 parents: function( elem ) { 19138 return dir( elem, "parentNode" ); 19139 }, 19140 parentsUntil: function( elem, _i, until ) { 19141 return dir( elem, "parentNode", until ); 19142 }, 19143 next: function( elem ) { 19144 return sibling( elem, "nextSibling" ); 19145 }, 19146 prev: function( elem ) { 19147 return sibling( elem, "previousSibling" ); 19148 }, 19149 nextAll: function( elem ) { 19150 return dir( elem, "nextSibling" ); 19151 }, 19152 prevAll: function( elem ) { 19153 return dir( elem, "previousSibling" ); 19154 }, 19155 nextUntil: function( elem, _i, until ) { 19156 return dir( elem, "nextSibling", until ); 19157 }, 19158 prevUntil: function( elem, _i, until ) { 19159 return dir( elem, "previousSibling", until ); 19160 }, 19161 siblings: function( elem ) { 19162 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 19163 }, 19164 children: function( elem ) { 19165 return siblings( elem.firstChild ); 19166 }, 19167 contents: function( elem ) { 19168 if ( elem.contentDocument != null && 19169 19170 // Support: IE 11+ 19171 // <object> elements with no `data` attribute has an object 19172 // `contentDocument` with a `null` prototype. 19173 getProto( elem.contentDocument ) ) { 19174 19175 return elem.contentDocument; 19176 } 19177 19178 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 19179 // Treat the template element as a regular one in browsers that 19180 // don't support it. 19181 if ( nodeName( elem, "template" ) ) { 19182 elem = elem.content || elem; 19183 } 19184 19185 return jQuery.merge( [], elem.childNodes ); 19186 } 19187 }, function( name, fn ) { 19188 jQuery.fn[ name ] = function( until, selector ) { 19189 var matched = jQuery.map( this, fn, until ); 19190 19191 if ( name.slice( -5 ) !== "Until" ) { 19192 selector = until; 19193 } 19194 19195 if ( selector && typeof selector === "string" ) { 19196 matched = jQuery.filter( selector, matched ); 19197 } 19198 19199 if ( this.length > 1 ) { 19200 19201 // Remove duplicates 19202 if ( !guaranteedUnique[ name ] ) { 19203 jQuery.uniqueSort( matched ); 19204 } 19205 19206 // Reverse order for parents* and prev-derivatives 19207 if ( rparentsprev.test( name ) ) { 19208 matched.reverse(); 19209 } 19210 } 19211 19212 return this.pushStack( matched ); 19213 }; 19214 } ); 19215 var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 19216 19217 19218 19219// Convert String-formatted options into Object-formatted ones 19220 function createOptions( options ) { 19221 var object = {}; 19222 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 19223 object[ flag ] = true; 19224 } ); 19225 return object; 19226 } 19227 19228 /* 19229 * Create a callback list using the following parameters: 19230 * 19231 * options: an optional list of space-separated options that will change how 19232 * the callback list behaves or a more traditional option object 19233 * 19234 * By default a callback list will act like an event callback list and can be 19235 * "fired" multiple times. 19236 * 19237 * Possible options: 19238 * 19239 * once: will ensure the callback list can only be fired once (like a Deferred) 19240 * 19241 * memory: will keep track of previous values and will call any callback added 19242 * after the list has been fired right away with the latest "memorized" 19243 * values (like a Deferred) 19244 * 19245 * unique: will ensure a callback can only be added once (no duplicate in the list) 19246 * 19247 * stopOnFalse: interrupt callings when a callback returns false 19248 * 19249 */ 19250 jQuery.Callbacks = function( options ) { 19251 19252 // Convert options from String-formatted to Object-formatted if needed 19253 // (we check in cache first) 19254 options = typeof options === "string" ? 19255 createOptions( options ) : 19256 jQuery.extend( {}, options ); 19257 19258 var // Flag to know if list is currently firing 19259 firing, 19260 19261 // Last fire value for non-forgettable lists 19262 memory, 19263 19264 // Flag to know if list was already fired 19265 fired, 19266 19267 // Flag to prevent firing 19268 locked, 19269 19270 // Actual callback list 19271 list = [], 19272 19273 // Queue of execution data for repeatable lists 19274 queue = [], 19275 19276 // Index of currently firing callback (modified by add/remove as needed) 19277 firingIndex = -1, 19278 19279 // Fire callbacks 19280 fire = function() { 19281 19282 // Enforce single-firing 19283 locked = locked || options.once; 19284 19285 // Execute callbacks for all pending executions, 19286 // respecting firingIndex overrides and runtime changes 19287 fired = firing = true; 19288 for ( ; queue.length; firingIndex = -1 ) { 19289 memory = queue.shift(); 19290 while ( ++firingIndex < list.length ) { 19291 19292 // Run callback and check for early termination 19293 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 19294 options.stopOnFalse ) { 19295 19296 // Jump to end and forget the data so .add doesn't re-fire 19297 firingIndex = list.length; 19298 memory = false; 19299 } 19300 } 19301 } 19302 19303 // Forget the data if we're done with it 19304 if ( !options.memory ) { 19305 memory = false; 19306 } 19307 19308 firing = false; 19309 19310 // Clean up if we're done firing for good 19311 if ( locked ) { 19312 19313 // Keep an empty list if we have data for future add calls 19314 if ( memory ) { 19315 list = []; 19316 19317 // Otherwise, this object is spent 19318 } else { 19319 list = ""; 19320 } 19321 } 19322 }, 19323 19324 // Actual Callbacks object 19325 self = { 19326 19327 // Add a callback or a collection of callbacks to the list 19328 add: function() { 19329 if ( list ) { 19330 19331 // If we have memory from a past run, we should fire after adding 19332 if ( memory && !firing ) { 19333 firingIndex = list.length - 1; 19334 queue.push( memory ); 19335 } 19336 19337 ( function add( args ) { 19338 jQuery.each( args, function( _, arg ) { 19339 if ( isFunction( arg ) ) { 19340 if ( !options.unique || !self.has( arg ) ) { 19341 list.push( arg ); 19342 } 19343 } else if ( arg && arg.length && toType( arg ) !== "string" ) { 19344 19345 // Inspect recursively 19346 add( arg ); 19347 } 19348 } ); 19349 } )( arguments ); 19350 19351 if ( memory && !firing ) { 19352 fire(); 19353 } 19354 } 19355 return this; 19356 }, 19357 19358 // Remove a callback from the list 19359 remove: function() { 19360 jQuery.each( arguments, function( _, arg ) { 19361 var index; 19362 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 19363 list.splice( index, 1 ); 19364 19365 // Handle firing indexes 19366 if ( index <= firingIndex ) { 19367 firingIndex--; 19368 } 19369 } 19370 } ); 19371 return this; 19372 }, 19373 19374 // Check if a given callback is in the list. 19375 // If no argument is given, return whether or not list has callbacks attached. 19376 has: function( fn ) { 19377 return fn ? 19378 jQuery.inArray( fn, list ) > -1 : 19379 list.length > 0; 19380 }, 19381 19382 // Remove all callbacks from the list 19383 empty: function() { 19384 if ( list ) { 19385 list = []; 19386 } 19387 return this; 19388 }, 19389 19390 // Disable .fire and .add 19391 // Abort any current/pending executions 19392 // Clear all callbacks and values 19393 disable: function() { 19394 locked = queue = []; 19395 list = memory = ""; 19396 return this; 19397 }, 19398 disabled: function() { 19399 return !list; 19400 }, 19401 19402 // Disable .fire 19403 // Also disable .add unless we have memory (since it would have no effect) 19404 // Abort any pending executions 19405 lock: function() { 19406 locked = queue = []; 19407 if ( !memory && !firing ) { 19408 list = memory = ""; 19409 } 19410 return this; 19411 }, 19412 locked: function() { 19413 return !!locked; 19414 }, 19415 19416 // Call all callbacks with the given context and arguments 19417 fireWith: function( context, args ) { 19418 if ( !locked ) { 19419 args = args || []; 19420 args = [ context, args.slice ? args.slice() : args ]; 19421 queue.push( args ); 19422 if ( !firing ) { 19423 fire(); 19424 } 19425 } 19426 return this; 19427 }, 19428 19429 // Call all the callbacks with the given arguments 19430 fire: function() { 19431 self.fireWith( this, arguments ); 19432 return this; 19433 }, 19434 19435 // To know if the callbacks have already been called at least once 19436 fired: function() { 19437 return !!fired; 19438 } 19439 }; 19440 19441 return self; 19442 }; 19443 19444 19445 function Identity( v ) { 19446 return v; 19447 } 19448 function Thrower( ex ) { 19449 throw ex; 19450 } 19451 19452 function adoptValue( value, resolve, reject, noValue ) { 19453 var method; 19454 19455 try { 19456 19457 // Check for promise aspect first to privilege synchronous behavior 19458 if ( value && isFunction( ( method = value.promise ) ) ) { 19459 method.call( value ).done( resolve ).fail( reject ); 19460 19461 // Other thenables 19462 } else if ( value && isFunction( ( method = value.then ) ) ) { 19463 method.call( value, resolve, reject ); 19464 19465 // Other non-thenables 19466 } else { 19467 19468 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 19469 // * false: [ value ].slice( 0 ) => resolve( value ) 19470 // * true: [ value ].slice( 1 ) => resolve() 19471 resolve.apply( undefined, [ value ].slice( noValue ) ); 19472 } 19473 19474 // For Promises/A+, convert exceptions into rejections 19475 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 19476 // Deferred#then to conditionally suppress rejection. 19477 } catch ( value ) { 19478 19479 // Support: Android 4.0 only 19480 // Strict mode functions invoked without .call/.apply get global-object context 19481 reject.apply( undefined, [ value ] ); 19482 } 19483 } 19484 19485 jQuery.extend( { 19486 19487 Deferred: function( func ) { 19488 var tuples = [ 19489 19490 // action, add listener, callbacks, 19491 // ... .then handlers, argument index, [final state] 19492 [ "notify", "progress", jQuery.Callbacks( "memory" ), 19493 jQuery.Callbacks( "memory" ), 2 ], 19494 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 19495 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 19496 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 19497 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 19498 ], 19499 state = "pending", 19500 promise = { 19501 state: function() { 19502 return state; 19503 }, 19504 always: function() { 19505 deferred.done( arguments ).fail( arguments ); 19506 return this; 19507 }, 19508 "catch": function( fn ) { 19509 return promise.then( null, fn ); 19510 }, 19511 19512 // Keep pipe for back-compat 19513 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 19514 var fns = arguments; 19515 19516 return jQuery.Deferred( function( newDefer ) { 19517 jQuery.each( tuples, function( _i, tuple ) { 19518 19519 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 19520 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 19521 19522 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 19523 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 19524 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 19525 deferred[ tuple[ 1 ] ]( function() { 19526 var returned = fn && fn.apply( this, arguments ); 19527 if ( returned && isFunction( returned.promise ) ) { 19528 returned.promise() 19529 .progress( newDefer.notify ) 19530 .done( newDefer.resolve ) 19531 .fail( newDefer.reject ); 19532 } else { 19533 newDefer[ tuple[ 0 ] + "With" ]( 19534 this, 19535 fn ? [ returned ] : arguments 19536 ); 19537 } 19538 } ); 19539 } ); 19540 fns = null; 19541 } ).promise(); 19542 }, 19543 then: function( onFulfilled, onRejected, onProgress ) { 19544 var maxDepth = 0; 19545 function resolve( depth, deferred, handler, special ) { 19546 return function() { 19547 var that = this, 19548 args = arguments, 19549 mightThrow = function() { 19550 var returned, then; 19551 19552 // Support: Promises/A+ section 2.3.3.3.3 19553 // https://promisesaplus.com/#point-59 19554 // Ignore double-resolution attempts 19555 if ( depth < maxDepth ) { 19556 return; 19557 } 19558 19559 returned = handler.apply( that, args ); 19560 19561 // Support: Promises/A+ section 2.3.1 19562 // https://promisesaplus.com/#point-48 19563 if ( returned === deferred.promise() ) { 19564 throw new TypeError( "Thenable self-resolution" ); 19565 } 19566 19567 // Support: Promises/A+ sections 2.3.3.1, 3.5 19568 // https://promisesaplus.com/#point-54 19569 // https://promisesaplus.com/#point-75 19570 // Retrieve `then` only once 19571 then = returned && 19572 19573 // Support: Promises/A+ section 2.3.4 19574 // https://promisesaplus.com/#point-64 19575 // Only check objects and functions for thenability 19576 ( typeof returned === "object" || 19577 typeof returned === "function" ) && 19578 returned.then; 19579 19580 // Handle a returned thenable 19581 if ( isFunction( then ) ) { 19582 19583 // Special processors (notify) just wait for resolution 19584 if ( special ) { 19585 then.call( 19586 returned, 19587 resolve( maxDepth, deferred, Identity, special ), 19588 resolve( maxDepth, deferred, Thrower, special ) 19589 ); 19590 19591 // Normal processors (resolve) also hook into progress 19592 } else { 19593 19594 // ...and disregard older resolution values 19595 maxDepth++; 19596 19597 then.call( 19598 returned, 19599 resolve( maxDepth, deferred, Identity, special ), 19600 resolve( maxDepth, deferred, Thrower, special ), 19601 resolve( maxDepth, deferred, Identity, 19602 deferred.notifyWith ) 19603 ); 19604 } 19605 19606 // Handle all other returned values 19607 } else { 19608 19609 // Only substitute handlers pass on context 19610 // and multiple values (non-spec behavior) 19611 if ( handler !== Identity ) { 19612 that = undefined; 19613 args = [ returned ]; 19614 } 19615 19616 // Process the value(s) 19617 // Default process is resolve 19618 ( special || deferred.resolveWith )( that, args ); 19619 } 19620 }, 19621 19622 // Only normal processors (resolve) catch and reject exceptions 19623 process = special ? 19624 mightThrow : 19625 function() { 19626 try { 19627 mightThrow(); 19628 } catch ( e ) { 19629 19630 if ( jQuery.Deferred.exceptionHook ) { 19631 jQuery.Deferred.exceptionHook( e, 19632 process.error ); 19633 } 19634 19635 // Support: Promises/A+ section 2.3.3.3.4.1 19636 // https://promisesaplus.com/#point-61 19637 // Ignore post-resolution exceptions 19638 if ( depth + 1 >= maxDepth ) { 19639 19640 // Only substitute handlers pass on context 19641 // and multiple values (non-spec behavior) 19642 if ( handler !== Thrower ) { 19643 that = undefined; 19644 args = [ e ]; 19645 } 19646 19647 deferred.rejectWith( that, args ); 19648 } 19649 } 19650 }; 19651 19652 // Support: Promises/A+ section 2.3.3.3.1 19653 // https://promisesaplus.com/#point-57 19654 // Re-resolve promises immediately to dodge false rejection from 19655 // subsequent errors 19656 if ( depth ) { 19657 process(); 19658 } else { 19659 19660 // Call an optional hook to record the error, in case of exception 19661 // since it's otherwise lost when execution goes async 19662 if ( jQuery.Deferred.getErrorHook ) { 19663 process.error = jQuery.Deferred.getErrorHook(); 19664 19665 // The deprecated alias of the above. While the name suggests 19666 // returning the stack, not an error instance, jQuery just passes 19667 // it directly to `console.warn` so both will work; an instance 19668 // just better cooperates with source maps. 19669 } else if ( jQuery.Deferred.getStackHook ) { 19670 process.error = jQuery.Deferred.getStackHook(); 19671 } 19672 window.setTimeout( process ); 19673 } 19674 }; 19675 } 19676 19677 return jQuery.Deferred( function( newDefer ) { 19678 19679 // progress_handlers.add( ... ) 19680 tuples[ 0 ][ 3 ].add( 19681 resolve( 19682 0, 19683 newDefer, 19684 isFunction( onProgress ) ? 19685 onProgress : 19686 Identity, 19687 newDefer.notifyWith 19688 ) 19689 ); 19690 19691 // fulfilled_handlers.add( ... ) 19692 tuples[ 1 ][ 3 ].add( 19693 resolve( 19694 0, 19695 newDefer, 19696 isFunction( onFulfilled ) ? 19697 onFulfilled : 19698 Identity 19699 ) 19700 ); 19701 19702 // rejected_handlers.add( ... ) 19703 tuples[ 2 ][ 3 ].add( 19704 resolve( 19705 0, 19706 newDefer, 19707 isFunction( onRejected ) ? 19708 onRejected : 19709 Thrower 19710 ) 19711 ); 19712 } ).promise(); 19713 }, 19714 19715 // Get a promise for this deferred 19716 // If obj is provided, the promise aspect is added to the object 19717 promise: function( obj ) { 19718 return obj != null ? jQuery.extend( obj, promise ) : promise; 19719 } 19720 }, 19721 deferred = {}; 19722 19723 // Add list-specific methods 19724 jQuery.each( tuples, function( i, tuple ) { 19725 var list = tuple[ 2 ], 19726 stateString = tuple[ 5 ]; 19727 19728 // promise.progress = list.add 19729 // promise.done = list.add 19730 // promise.fail = list.add 19731 promise[ tuple[ 1 ] ] = list.add; 19732 19733 // Handle state 19734 if ( stateString ) { 19735 list.add( 19736 function() { 19737 19738 // state = "resolved" (i.e., fulfilled) 19739 // state = "rejected" 19740 state = stateString; 19741 }, 19742 19743 // rejected_callbacks.disable 19744 // fulfilled_callbacks.disable 19745 tuples[ 3 - i ][ 2 ].disable, 19746 19747 // rejected_handlers.disable 19748 // fulfilled_handlers.disable 19749 tuples[ 3 - i ][ 3 ].disable, 19750 19751 // progress_callbacks.lock 19752 tuples[ 0 ][ 2 ].lock, 19753 19754 // progress_handlers.lock 19755 tuples[ 0 ][ 3 ].lock 19756 ); 19757 } 19758 19759 // progress_handlers.fire 19760 // fulfilled_handlers.fire 19761 // rejected_handlers.fire 19762 list.add( tuple[ 3 ].fire ); 19763 19764 // deferred.notify = function() { deferred.notifyWith(...) } 19765 // deferred.resolve = function() { deferred.resolveWith(...) } 19766 // deferred.reject = function() { deferred.rejectWith(...) } 19767 deferred[ tuple[ 0 ] ] = function() { 19768 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 19769 return this; 19770 }; 19771 19772 // deferred.notifyWith = list.fireWith 19773 // deferred.resolveWith = list.fireWith 19774 // deferred.rejectWith = list.fireWith 19775 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 19776 } ); 19777 19778 // Make the deferred a promise 19779 promise.promise( deferred ); 19780 19781 // Call given func if any 19782 if ( func ) { 19783 func.call( deferred, deferred ); 19784 } 19785 19786 // All done! 19787 return deferred; 19788 }, 19789 19790 // Deferred helper 19791 when: function( singleValue ) { 19792 var 19793 19794 // count of uncompleted subordinates 19795 remaining = arguments.length, 19796 19797 // count of unprocessed arguments 19798 i = remaining, 19799 19800 // subordinate fulfillment data 19801 resolveContexts = Array( i ), 19802 resolveValues = slice.call( arguments ), 19803 19804 // the primary Deferred 19805 primary = jQuery.Deferred(), 19806 19807 // subordinate callback factory 19808 updateFunc = function( i ) { 19809 return function( value ) { 19810 resolveContexts[ i ] = this; 19811 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 19812 if ( !( --remaining ) ) { 19813 primary.resolveWith( resolveContexts, resolveValues ); 19814 } 19815 }; 19816 }; 19817 19818 // Single- and empty arguments are adopted like Promise.resolve 19819 if ( remaining <= 1 ) { 19820 adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, 19821 !remaining ); 19822 19823 // Use .then() to unwrap secondary thenables (cf. gh-3000) 19824 if ( primary.state() === "pending" || 19825 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 19826 19827 return primary.then(); 19828 } 19829 } 19830 19831 // Multiple arguments are aggregated like Promise.all array elements 19832 while ( i-- ) { 19833 adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); 19834 } 19835 19836 return primary.promise(); 19837 } 19838 } ); 19839 19840 19841// These usually indicate a programmer mistake during development, 19842// warn about them ASAP rather than swallowing them by default. 19843 var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 19844 19845// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error 19846// captured before the async barrier to get the original error cause 19847// which may otherwise be hidden. 19848 jQuery.Deferred.exceptionHook = function( error, asyncError ) { 19849 19850 // Support: IE 8 - 9 only 19851 // Console exists when dev tools are open, which can happen at any time 19852 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 19853 window.console.warn( "jQuery.Deferred exception: " + error.message, 19854 error.stack, asyncError ); 19855 } 19856 }; 19857 19858 19859 19860 19861 jQuery.readyException = function( error ) { 19862 window.setTimeout( function() { 19863 throw error; 19864 } ); 19865 }; 19866 19867 19868 19869 19870// The deferred used on DOM ready 19871 var readyList = jQuery.Deferred(); 19872 19873 jQuery.fn.ready = function( fn ) { 19874 19875 readyList 19876 .then( fn ) 19877 19878 // Wrap jQuery.readyException in a function so that the lookup 19879 // happens at the time of error handling instead of callback 19880 // registration. 19881 .catch( function( error ) { 19882 jQuery.readyException( error ); 19883 } ); 19884 19885 return this; 19886 }; 19887 19888 jQuery.extend( { 19889 19890 // Is the DOM ready to be used? Set to true once it occurs. 19891 isReady: false, 19892 19893 // A counter to track how many items to wait for before 19894 // the ready event fires. See trac-6781 19895 readyWait: 1, 19896 19897 // Handle when the DOM is ready 19898 ready: function( wait ) { 19899 19900 // Abort if there are pending holds or we're already ready 19901 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 19902 return; 19903 } 19904 19905 // Remember that the DOM is ready 19906 jQuery.isReady = true; 19907 19908 // If a normal DOM Ready event fired, decrement, and wait if need be 19909 if ( wait !== true && --jQuery.readyWait > 0 ) { 19910 return; 19911 } 19912 19913 // If there are functions bound, to execute 19914 readyList.resolveWith( document, [ jQuery ] ); 19915 } 19916 } ); 19917 19918 jQuery.ready.then = readyList.then; 19919 19920// The ready event handler and self cleanup method 19921 function completed() { 19922 document.removeEventListener( "DOMContentLoaded", completed ); 19923 window.removeEventListener( "load", completed ); 19924 jQuery.ready(); 19925 } 19926 19927// Catch cases where $(document).ready() is called 19928// after the browser event has already occurred. 19929// Support: IE <=9 - 10 only 19930// Older IE sometimes signals "interactive" too soon 19931 if ( document.readyState === "complete" || 19932 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 19933 19934 // Handle it asynchronously to allow scripts the opportunity to delay ready 19935 window.setTimeout( jQuery.ready ); 19936 19937 } else { 19938 19939 // Use the handy event callback 19940 document.addEventListener( "DOMContentLoaded", completed ); 19941 19942 // A fallback to window.onload, that will always work 19943 window.addEventListener( "load", completed ); 19944 } 19945 19946 19947 19948 19949// Multifunctional method to get and set values of a collection 19950// The value/s can optionally be executed if it's a function 19951 var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 19952 var i = 0, 19953 len = elems.length, 19954 bulk = key == null; 19955 19956 // Sets many values 19957 if ( toType( key ) === "object" ) { 19958 chainable = true; 19959 for ( i in key ) { 19960 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 19961 } 19962 19963 // Sets one value 19964 } else if ( value !== undefined ) { 19965 chainable = true; 19966 19967 if ( !isFunction( value ) ) { 19968 raw = true; 19969 } 19970 19971 if ( bulk ) { 19972 19973 // Bulk operations run against the entire set 19974 if ( raw ) { 19975 fn.call( elems, value ); 19976 fn = null; 19977 19978 // ...except when executing function values 19979 } else { 19980 bulk = fn; 19981 fn = function( elem, _key, value ) { 19982 return bulk.call( jQuery( elem ), value ); 19983 }; 19984 } 19985 } 19986 19987 if ( fn ) { 19988 for ( ; i < len; i++ ) { 19989 fn( 19990 elems[ i ], key, raw ? 19991 value : 19992 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 19993 ); 19994 } 19995 } 19996 } 19997 19998 if ( chainable ) { 19999 return elems; 20000 } 20001 20002 // Gets 20003 if ( bulk ) { 20004 return fn.call( elems ); 20005 } 20006 20007 return len ? fn( elems[ 0 ], key ) : emptyGet; 20008 }; 20009 20010 20011// Matches dashed string for camelizing 20012 var rmsPrefix = /^-ms-/, 20013 rdashAlpha = /-([a-z])/g; 20014 20015// Used by camelCase as callback to replace() 20016 function fcamelCase( _all, letter ) { 20017 return letter.toUpperCase(); 20018 } 20019 20020// Convert dashed to camelCase; used by the css and data modules 20021// Support: IE <=9 - 11, Edge 12 - 15 20022// Microsoft forgot to hump their vendor prefix (trac-9572) 20023 function camelCase( string ) { 20024 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 20025 } 20026 var acceptData = function( owner ) { 20027 20028 // Accepts only: 20029 // - Node 20030 // - Node.ELEMENT_NODE 20031 // - Node.DOCUMENT_NODE 20032 // - Object 20033 // - Any 20034 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 20035 }; 20036 20037 20038 20039 20040 function Data() { 20041 this.expando = jQuery.expando + Data.uid++; 20042 } 20043 20044 Data.uid = 1; 20045 20046 Data.prototype = { 20047 20048 cache: function( owner ) { 20049 20050 // Check if the owner object already has a cache 20051 var value = owner[ this.expando ]; 20052 20053 // If not, create one 20054 if ( !value ) { 20055 value = {}; 20056 20057 // We can accept data for non-element nodes in modern browsers, 20058 // but we should not, see trac-8335. 20059 // Always return an empty object. 20060 if ( acceptData( owner ) ) { 20061 20062 // If it is a node unlikely to be stringify-ed or looped over 20063 // use plain assignment 20064 if ( owner.nodeType ) { 20065 owner[ this.expando ] = value; 20066 20067 // Otherwise secure it in a non-enumerable property 20068 // configurable must be true to allow the property to be 20069 // deleted when data is removed 20070 } else { 20071 Object.defineProperty( owner, this.expando, { 20072 value: value, 20073 configurable: true 20074 } ); 20075 } 20076 } 20077 } 20078 20079 return value; 20080 }, 20081 set: function( owner, data, value ) { 20082 var prop, 20083 cache = this.cache( owner ); 20084 20085 // Handle: [ owner, key, value ] args 20086 // Always use camelCase key (gh-2257) 20087 if ( typeof data === "string" ) { 20088 cache[ camelCase( data ) ] = value; 20089 20090 // Handle: [ owner, { properties } ] args 20091 } else { 20092 20093 // Copy the properties one-by-one to the cache object 20094 for ( prop in data ) { 20095 cache[ camelCase( prop ) ] = data[ prop ]; 20096 } 20097 } 20098 return cache; 20099 }, 20100 get: function( owner, key ) { 20101 return key === undefined ? 20102 this.cache( owner ) : 20103 20104 // Always use camelCase key (gh-2257) 20105 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; 20106 }, 20107 access: function( owner, key, value ) { 20108 20109 // In cases where either: 20110 // 20111 // 1. No key was specified 20112 // 2. A string key was specified, but no value provided 20113 // 20114 // Take the "read" path and allow the get method to determine 20115 // which value to return, respectively either: 20116 // 20117 // 1. The entire cache object 20118 // 2. The data stored at the key 20119 // 20120 if ( key === undefined || 20121 ( ( key && typeof key === "string" ) && value === undefined ) ) { 20122 20123 return this.get( owner, key ); 20124 } 20125 20126 // When the key is not a string, or both a key and value 20127 // are specified, set or extend (existing objects) with either: 20128 // 20129 // 1. An object of properties 20130 // 2. A key and value 20131 // 20132 this.set( owner, key, value ); 20133 20134 // Since the "set" path can have two possible entry points 20135 // return the expected data based on which path was taken[*] 20136 return value !== undefined ? value : key; 20137 }, 20138 remove: function( owner, key ) { 20139 var i, 20140 cache = owner[ this.expando ]; 20141 20142 if ( cache === undefined ) { 20143 return; 20144 } 20145 20146 if ( key !== undefined ) { 20147 20148 // Support array or space separated string of keys 20149 if ( Array.isArray( key ) ) { 20150 20151 // If key is an array of keys... 20152 // We always set camelCase keys, so remove that. 20153 key = key.map( camelCase ); 20154 } else { 20155 key = camelCase( key ); 20156 20157 // If a key with the spaces exists, use it. 20158 // Otherwise, create an array by matching non-whitespace 20159 key = key in cache ? 20160 [ key ] : 20161 ( key.match( rnothtmlwhite ) || [] ); 20162 } 20163 20164 i = key.length; 20165 20166 while ( i-- ) { 20167 delete cache[ key[ i ] ]; 20168 } 20169 } 20170 20171 // Remove the expando if there's no more data 20172 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 20173 20174 // Support: Chrome <=35 - 45 20175 // Webkit & Blink performance suffers when deleting properties 20176 // from DOM nodes, so set to undefined instead 20177 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 20178 if ( owner.nodeType ) { 20179 owner[ this.expando ] = undefined; 20180 } else { 20181 delete owner[ this.expando ]; 20182 } 20183 } 20184 }, 20185 hasData: function( owner ) { 20186 var cache = owner[ this.expando ]; 20187 return cache !== undefined && !jQuery.isEmptyObject( cache ); 20188 } 20189 }; 20190 var dataPriv = new Data(); 20191 20192 var dataUser = new Data(); 20193 20194 20195 20196// Implementation Summary 20197// 20198// 1. Enforce API surface and semantic compatibility with 1.9.x branch 20199// 2. Improve the module's maintainability by reducing the storage 20200// paths to a single mechanism. 20201// 3. Use the same single mechanism to support "private" and "user" data. 20202// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 20203// 5. Avoid exposing implementation details on user objects (eg. expando properties) 20204// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 20205 20206 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 20207 rmultiDash = /[A-Z]/g; 20208 20209 function getData( data ) { 20210 if ( data === "true" ) { 20211 return true; 20212 } 20213 20214 if ( data === "false" ) { 20215 return false; 20216 } 20217 20218 if ( data === "null" ) { 20219 return null; 20220 } 20221 20222 // Only convert to a number if it doesn't change the string 20223 if ( data === +data + "" ) { 20224 return +data; 20225 } 20226 20227 if ( rbrace.test( data ) ) { 20228 return JSON.parse( data ); 20229 } 20230 20231 return data; 20232 } 20233 20234 function dataAttr( elem, key, data ) { 20235 var name; 20236 20237 // If nothing was found internally, try to fetch any 20238 // data from the HTML5 data-* attribute 20239 if ( data === undefined && elem.nodeType === 1 ) { 20240 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 20241 data = elem.getAttribute( name ); 20242 20243 if ( typeof data === "string" ) { 20244 try { 20245 data = getData( data ); 20246 } catch ( e ) {} 20247 20248 // Make sure we set the data so it isn't changed later 20249 dataUser.set( elem, key, data ); 20250 } else { 20251 data = undefined; 20252 } 20253 } 20254 return data; 20255 } 20256 20257 jQuery.extend( { 20258 hasData: function( elem ) { 20259 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 20260 }, 20261 20262 data: function( elem, name, data ) { 20263 return dataUser.access( elem, name, data ); 20264 }, 20265 20266 removeData: function( elem, name ) { 20267 dataUser.remove( elem, name ); 20268 }, 20269 20270 // TODO: Now that all calls to _data and _removeData have been replaced 20271 // with direct calls to dataPriv methods, these can be deprecated. 20272 _data: function( elem, name, data ) { 20273 return dataPriv.access( elem, name, data ); 20274 }, 20275 20276 _removeData: function( elem, name ) { 20277 dataPriv.remove( elem, name ); 20278 } 20279 } ); 20280 20281 jQuery.fn.extend( { 20282 data: function( key, value ) { 20283 var i, name, data, 20284 elem = this[ 0 ], 20285 attrs = elem && elem.attributes; 20286 20287 // Gets all values 20288 if ( key === undefined ) { 20289 if ( this.length ) { 20290 data = dataUser.get( elem ); 20291 20292 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 20293 i = attrs.length; 20294 while ( i-- ) { 20295 20296 // Support: IE 11 only 20297 // The attrs elements can be null (trac-14894) 20298 if ( attrs[ i ] ) { 20299 name = attrs[ i ].name; 20300 if ( name.indexOf( "data-" ) === 0 ) { 20301 name = camelCase( name.slice( 5 ) ); 20302 dataAttr( elem, name, data[ name ] ); 20303 } 20304 } 20305 } 20306 dataPriv.set( elem, "hasDataAttrs", true ); 20307 } 20308 } 20309 20310 return data; 20311 } 20312 20313 // Sets multiple values 20314 if ( typeof key === "object" ) { 20315 return this.each( function() { 20316 dataUser.set( this, key ); 20317 } ); 20318 } 20319 20320 return access( this, function( value ) { 20321 var data; 20322 20323 // The calling jQuery object (element matches) is not empty 20324 // (and therefore has an element appears at this[ 0 ]) and the 20325 // `value` parameter was not undefined. An empty jQuery object 20326 // will result in `undefined` for elem = this[ 0 ] which will 20327 // throw an exception if an attempt to read a data cache is made. 20328 if ( elem && value === undefined ) { 20329 20330 // Attempt to get data from the cache 20331 // The key will always be camelCased in Data 20332 data = dataUser.get( elem, key ); 20333 if ( data !== undefined ) { 20334 return data; 20335 } 20336 20337 // Attempt to "discover" the data in 20338 // HTML5 custom data-* attrs 20339 data = dataAttr( elem, key ); 20340 if ( data !== undefined ) { 20341 return data; 20342 } 20343 20344 // We tried really hard, but the data doesn't exist. 20345 return; 20346 } 20347 20348 // Set the data... 20349 this.each( function() { 20350 20351 // We always store the camelCased key 20352 dataUser.set( this, key, value ); 20353 } ); 20354 }, null, value, arguments.length > 1, null, true ); 20355 }, 20356 20357 removeData: function( key ) { 20358 return this.each( function() { 20359 dataUser.remove( this, key ); 20360 } ); 20361 } 20362 } ); 20363 20364 20365 jQuery.extend( { 20366 queue: function( elem, type, data ) { 20367 var queue; 20368 20369 if ( elem ) { 20370 type = ( type || "fx" ) + "queue"; 20371 queue = dataPriv.get( elem, type ); 20372 20373 // Speed up dequeue by getting out quickly if this is just a lookup 20374 if ( data ) { 20375 if ( !queue || Array.isArray( data ) ) { 20376 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 20377 } else { 20378 queue.push( data ); 20379 } 20380 } 20381 return queue || []; 20382 } 20383 }, 20384 20385 dequeue: function( elem, type ) { 20386 type = type || "fx"; 20387 20388 var queue = jQuery.queue( elem, type ), 20389 startLength = queue.length, 20390 fn = queue.shift(), 20391 hooks = jQuery._queueHooks( elem, type ), 20392 next = function() { 20393 jQuery.dequeue( elem, type ); 20394 }; 20395 20396 // If the fx queue is dequeued, always remove the progress sentinel 20397 if ( fn === "inprogress" ) { 20398 fn = queue.shift(); 20399 startLength--; 20400 } 20401 20402 if ( fn ) { 20403 20404 // Add a progress sentinel to prevent the fx queue from being 20405 // automatically dequeued 20406 if ( type === "fx" ) { 20407 queue.unshift( "inprogress" ); 20408 } 20409 20410 // Clear up the last queue stop function 20411 delete hooks.stop; 20412 fn.call( elem, next, hooks ); 20413 } 20414 20415 if ( !startLength && hooks ) { 20416 hooks.empty.fire(); 20417 } 20418 }, 20419 20420 // Not public - generate a queueHooks object, or return the current one 20421 _queueHooks: function( elem, type ) { 20422 var key = type + "queueHooks"; 20423 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 20424 empty: jQuery.Callbacks( "once memory" ).add( function() { 20425 dataPriv.remove( elem, [ type + "queue", key ] ); 20426 } ) 20427 } ); 20428 } 20429 } ); 20430 20431 jQuery.fn.extend( { 20432 queue: function( type, data ) { 20433 var setter = 2; 20434 20435 if ( typeof type !== "string" ) { 20436 data = type; 20437 type = "fx"; 20438 setter--; 20439 } 20440 20441 if ( arguments.length < setter ) { 20442 return jQuery.queue( this[ 0 ], type ); 20443 } 20444 20445 return data === undefined ? 20446 this : 20447 this.each( function() { 20448 var queue = jQuery.queue( this, type, data ); 20449 20450 // Ensure a hooks for this queue 20451 jQuery._queueHooks( this, type ); 20452 20453 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 20454 jQuery.dequeue( this, type ); 20455 } 20456 } ); 20457 }, 20458 dequeue: function( type ) { 20459 return this.each( function() { 20460 jQuery.dequeue( this, type ); 20461 } ); 20462 }, 20463 clearQueue: function( type ) { 20464 return this.queue( type || "fx", [] ); 20465 }, 20466 20467 // Get a promise resolved when queues of a certain type 20468 // are emptied (fx is the type by default) 20469 promise: function( type, obj ) { 20470 var tmp, 20471 count = 1, 20472 defer = jQuery.Deferred(), 20473 elements = this, 20474 i = this.length, 20475 resolve = function() { 20476 if ( !( --count ) ) { 20477 defer.resolveWith( elements, [ elements ] ); 20478 } 20479 }; 20480 20481 if ( typeof type !== "string" ) { 20482 obj = type; 20483 type = undefined; 20484 } 20485 type = type || "fx"; 20486 20487 while ( i-- ) { 20488 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 20489 if ( tmp && tmp.empty ) { 20490 count++; 20491 tmp.empty.add( resolve ); 20492 } 20493 } 20494 resolve(); 20495 return defer.promise( obj ); 20496 } 20497 } ); 20498 var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 20499 20500 var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 20501 20502 20503 var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 20504 20505 var documentElement = document.documentElement; 20506 20507 20508 20509 var isAttached = function( elem ) { 20510 return jQuery.contains( elem.ownerDocument, elem ); 20511 }, 20512 composed = { composed: true }; 20513 20514 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only 20515 // Check attachment across shadow DOM boundaries when possible (gh-3504) 20516 // Support: iOS 10.0-10.2 only 20517 // Early iOS 10 versions support `attachShadow` but not `getRootNode`, 20518 // leading to errors. We need to check for `getRootNode`. 20519 if ( documentElement.getRootNode ) { 20520 isAttached = function( elem ) { 20521 return jQuery.contains( elem.ownerDocument, elem ) || 20522 elem.getRootNode( composed ) === elem.ownerDocument; 20523 }; 20524 } 20525 var isHiddenWithinTree = function( elem, el ) { 20526 20527 // isHiddenWithinTree might be called from jQuery#filter function; 20528 // in that case, element will be second argument 20529 elem = el || elem; 20530 20531 // Inline style trumps all 20532 return elem.style.display === "none" || 20533 elem.style.display === "" && 20534 20535 // Otherwise, check computed style 20536 // Support: Firefox <=43 - 45 20537 // Disconnected elements can have computed display: none, so first confirm that elem is 20538 // in the document. 20539 isAttached( elem ) && 20540 20541 jQuery.css( elem, "display" ) === "none"; 20542 }; 20543 20544 20545 20546 function adjustCSS( elem, prop, valueParts, tween ) { 20547 var adjusted, scale, 20548 maxIterations = 20, 20549 currentValue = tween ? 20550 function() { 20551 return tween.cur(); 20552 } : 20553 function() { 20554 return jQuery.css( elem, prop, "" ); 20555 }, 20556 initial = currentValue(), 20557 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 20558 20559 // Starting value computation is required for potential unit mismatches 20560 initialInUnit = elem.nodeType && 20561 ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 20562 rcssNum.exec( jQuery.css( elem, prop ) ); 20563 20564 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 20565 20566 // Support: Firefox <=54 20567 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 20568 initial = initial / 2; 20569 20570 // Trust units reported by jQuery.css 20571 unit = unit || initialInUnit[ 3 ]; 20572 20573 // Iteratively approximate from a nonzero starting point 20574 initialInUnit = +initial || 1; 20575 20576 while ( maxIterations-- ) { 20577 20578 // Evaluate and update our best guess (doubling guesses that zero out). 20579 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 20580 jQuery.style( elem, prop, initialInUnit + unit ); 20581 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { 20582 maxIterations = 0; 20583 } 20584 initialInUnit = initialInUnit / scale; 20585 20586 } 20587 20588 initialInUnit = initialInUnit * 2; 20589 jQuery.style( elem, prop, initialInUnit + unit ); 20590 20591 // Make sure we update the tween properties later on 20592 valueParts = valueParts || []; 20593 } 20594 20595 if ( valueParts ) { 20596 initialInUnit = +initialInUnit || +initial || 0; 20597 20598 // Apply relative offset (+=/-=) if specified 20599 adjusted = valueParts[ 1 ] ? 20600 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 20601 +valueParts[ 2 ]; 20602 if ( tween ) { 20603 tween.unit = unit; 20604 tween.start = initialInUnit; 20605 tween.end = adjusted; 20606 } 20607 } 20608 return adjusted; 20609 } 20610 20611 20612 var defaultDisplayMap = {}; 20613 20614 function getDefaultDisplay( elem ) { 20615 var temp, 20616 doc = elem.ownerDocument, 20617 nodeName = elem.nodeName, 20618 display = defaultDisplayMap[ nodeName ]; 20619 20620 if ( display ) { 20621 return display; 20622 } 20623 20624 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 20625 display = jQuery.css( temp, "display" ); 20626 20627 temp.parentNode.removeChild( temp ); 20628 20629 if ( display === "none" ) { 20630 display = "block"; 20631 } 20632 defaultDisplayMap[ nodeName ] = display; 20633 20634 return display; 20635 } 20636 20637 function showHide( elements, show ) { 20638 var display, elem, 20639 values = [], 20640 index = 0, 20641 length = elements.length; 20642 20643 // Determine new display value for elements that need to change 20644 for ( ; index < length; index++ ) { 20645 elem = elements[ index ]; 20646 if ( !elem.style ) { 20647 continue; 20648 } 20649 20650 display = elem.style.display; 20651 if ( show ) { 20652 20653 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 20654 // check is required in this first loop unless we have a nonempty display value (either 20655 // inline or about-to-be-restored) 20656 if ( display === "none" ) { 20657 values[ index ] = dataPriv.get( elem, "display" ) || null; 20658 if ( !values[ index ] ) { 20659 elem.style.display = ""; 20660 } 20661 } 20662 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 20663 values[ index ] = getDefaultDisplay( elem ); 20664 } 20665 } else { 20666 if ( display !== "none" ) { 20667 values[ index ] = "none"; 20668 20669 // Remember what we're overwriting 20670 dataPriv.set( elem, "display", display ); 20671 } 20672 } 20673 } 20674 20675 // Set the display of the elements in a second loop to avoid constant reflow 20676 for ( index = 0; index < length; index++ ) { 20677 if ( values[ index ] != null ) { 20678 elements[ index ].style.display = values[ index ]; 20679 } 20680 } 20681 20682 return elements; 20683 } 20684 20685 jQuery.fn.extend( { 20686 show: function() { 20687 return showHide( this, true ); 20688 }, 20689 hide: function() { 20690 return showHide( this ); 20691 }, 20692 toggle: function( state ) { 20693 if ( typeof state === "boolean" ) { 20694 return state ? this.show() : this.hide(); 20695 } 20696 20697 return this.each( function() { 20698 if ( isHiddenWithinTree( this ) ) { 20699 jQuery( this ).show(); 20700 } else { 20701 jQuery( this ).hide(); 20702 } 20703 } ); 20704 } 20705 } ); 20706 var rcheckableType = ( /^(?:checkbox|radio)$/i ); 20707 20708 var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); 20709 20710 var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); 20711 20712 20713 20714 ( function() { 20715 var fragment = document.createDocumentFragment(), 20716 div = fragment.appendChild( document.createElement( "div" ) ), 20717 input = document.createElement( "input" ); 20718 20719 // Support: Android 4.0 - 4.3 only 20720 // Check state lost if the name is set (trac-11217) 20721 // Support: Windows Web Apps (WWA) 20722 // `name` and `type` must use .setAttribute for WWA (trac-14901) 20723 input.setAttribute( "type", "radio" ); 20724 input.setAttribute( "checked", "checked" ); 20725 input.setAttribute( "name", "t" ); 20726 20727 div.appendChild( input ); 20728 20729 // Support: Android <=4.1 only 20730 // Older WebKit doesn't clone checked state correctly in fragments 20731 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 20732 20733 // Support: IE <=11 only 20734 // Make sure textarea (and checkbox) defaultValue is properly cloned 20735 div.innerHTML = "<textarea>x</textarea>"; 20736 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 20737 20738 // Support: IE <=9 only 20739 // IE <=9 replaces <option> tags with their contents when inserted outside of 20740 // the select element. 20741 div.innerHTML = "<option></option>"; 20742 support.option = !!div.lastChild; 20743 } )(); 20744 20745 20746// We have to close these tags to support XHTML (trac-13200) 20747 var wrapMap = { 20748 20749 // XHTML parsers do not magically insert elements in the 20750 // same way that tag soup parsers do. So we cannot shorten 20751 // this by omitting <tbody> or other required elements. 20752 thead: [ 1, "<table>", "</table>" ], 20753 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 20754 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 20755 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 20756 20757 _default: [ 0, "", "" ] 20758 }; 20759 20760 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 20761 wrapMap.th = wrapMap.td; 20762 20763// Support: IE <=9 only 20764 if ( !support.option ) { 20765 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; 20766 } 20767 20768 20769 function getAll( context, tag ) { 20770 20771 // Support: IE <=9 - 11 only 20772 // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) 20773 var ret; 20774 20775 if ( typeof context.getElementsByTagName !== "undefined" ) { 20776 ret = context.getElementsByTagName( tag || "*" ); 20777 20778 } else if ( typeof context.querySelectorAll !== "undefined" ) { 20779 ret = context.querySelectorAll( tag || "*" ); 20780 20781 } else { 20782 ret = []; 20783 } 20784 20785 if ( tag === undefined || tag && nodeName( context, tag ) ) { 20786 return jQuery.merge( [ context ], ret ); 20787 } 20788 20789 return ret; 20790 } 20791 20792 20793// Mark scripts as having already been evaluated 20794 function setGlobalEval( elems, refElements ) { 20795 var i = 0, 20796 l = elems.length; 20797 20798 for ( ; i < l; i++ ) { 20799 dataPriv.set( 20800 elems[ i ], 20801 "globalEval", 20802 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 20803 ); 20804 } 20805 } 20806 20807 20808 var rhtml = /<|&#?\w+;/; 20809 20810 function buildFragment( elems, context, scripts, selection, ignored ) { 20811 var elem, tmp, tag, wrap, attached, j, 20812 fragment = context.createDocumentFragment(), 20813 nodes = [], 20814 i = 0, 20815 l = elems.length; 20816 20817 for ( ; i < l; i++ ) { 20818 elem = elems[ i ]; 20819 20820 if ( elem || elem === 0 ) { 20821 20822 // Add nodes directly 20823 if ( toType( elem ) === "object" ) { 20824 20825 // Support: Android <=4.0 only, PhantomJS 1 only 20826 // push.apply(_, arraylike) throws on ancient WebKit 20827 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 20828 20829 // Convert non-html into a text node 20830 } else if ( !rhtml.test( elem ) ) { 20831 nodes.push( context.createTextNode( elem ) ); 20832 20833 // Convert html into DOM nodes 20834 } else { 20835 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 20836 20837 // Deserialize a standard representation 20838 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 20839 wrap = wrapMap[ tag ] || wrapMap._default; 20840 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 20841 20842 // Descend through wrappers to the right content 20843 j = wrap[ 0 ]; 20844 while ( j-- ) { 20845 tmp = tmp.lastChild; 20846 } 20847 20848 // Support: Android <=4.0 only, PhantomJS 1 only 20849 // push.apply(_, arraylike) throws on ancient WebKit 20850 jQuery.merge( nodes, tmp.childNodes ); 20851 20852 // Remember the top-level container 20853 tmp = fragment.firstChild; 20854 20855 // Ensure the created nodes are orphaned (trac-12392) 20856 tmp.textContent = ""; 20857 } 20858 } 20859 } 20860 20861 // Remove wrapper from fragment 20862 fragment.textContent = ""; 20863 20864 i = 0; 20865 while ( ( elem = nodes[ i++ ] ) ) { 20866 20867 // Skip elements already in the context collection (trac-4087) 20868 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 20869 if ( ignored ) { 20870 ignored.push( elem ); 20871 } 20872 continue; 20873 } 20874 20875 attached = isAttached( elem ); 20876 20877 // Append to fragment 20878 tmp = getAll( fragment.appendChild( elem ), "script" ); 20879 20880 // Preserve script evaluation history 20881 if ( attached ) { 20882 setGlobalEval( tmp ); 20883 } 20884 20885 // Capture executables 20886 if ( scripts ) { 20887 j = 0; 20888 while ( ( elem = tmp[ j++ ] ) ) { 20889 if ( rscriptType.test( elem.type || "" ) ) { 20890 scripts.push( elem ); 20891 } 20892 } 20893 } 20894 } 20895 20896 return fragment; 20897 } 20898 20899 20900 var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 20901 20902 function returnTrue() { 20903 return true; 20904 } 20905 20906 function returnFalse() { 20907 return false; 20908 } 20909 20910 function on( elem, types, selector, data, fn, one ) { 20911 var origFn, type; 20912 20913 // Types can be a map of types/handlers 20914 if ( typeof types === "object" ) { 20915 20916 // ( types-Object, selector, data ) 20917 if ( typeof selector !== "string" ) { 20918 20919 // ( types-Object, data ) 20920 data = data || selector; 20921 selector = undefined; 20922 } 20923 for ( type in types ) { 20924 on( elem, type, selector, data, types[ type ], one ); 20925 } 20926 return elem; 20927 } 20928 20929 if ( data == null && fn == null ) { 20930 20931 // ( types, fn ) 20932 fn = selector; 20933 data = selector = undefined; 20934 } else if ( fn == null ) { 20935 if ( typeof selector === "string" ) { 20936 20937 // ( types, selector, fn ) 20938 fn = data; 20939 data = undefined; 20940 } else { 20941 20942 // ( types, data, fn ) 20943 fn = data; 20944 data = selector; 20945 selector = undefined; 20946 } 20947 } 20948 if ( fn === false ) { 20949 fn = returnFalse; 20950 } else if ( !fn ) { 20951 return elem; 20952 } 20953 20954 if ( one === 1 ) { 20955 origFn = fn; 20956 fn = function( event ) { 20957 20958 // Can use an empty set, since event contains the info 20959 jQuery().off( event ); 20960 return origFn.apply( this, arguments ); 20961 }; 20962 20963 // Use same guid so caller can remove using origFn 20964 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 20965 } 20966 return elem.each( function() { 20967 jQuery.event.add( this, types, fn, data, selector ); 20968 } ); 20969 } 20970 20971 /* 20972 * Helper functions for managing events -- not part of the public interface. 20973 * Props to Dean Edwards' addEvent library for many of the ideas. 20974 */ 20975 jQuery.event = { 20976 20977 global: {}, 20978 20979 add: function( elem, types, handler, data, selector ) { 20980 20981 var handleObjIn, eventHandle, tmp, 20982 events, t, handleObj, 20983 special, handlers, type, namespaces, origType, 20984 elemData = dataPriv.get( elem ); 20985 20986 // Only attach events to objects that accept data 20987 if ( !acceptData( elem ) ) { 20988 return; 20989 } 20990 20991 // Caller can pass in an object of custom data in lieu of the handler 20992 if ( handler.handler ) { 20993 handleObjIn = handler; 20994 handler = handleObjIn.handler; 20995 selector = handleObjIn.selector; 20996 } 20997 20998 // Ensure that invalid selectors throw exceptions at attach time 20999 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 21000 if ( selector ) { 21001 jQuery.find.matchesSelector( documentElement, selector ); 21002 } 21003 21004 // Make sure that the handler has a unique ID, used to find/remove it later 21005 if ( !handler.guid ) { 21006 handler.guid = jQuery.guid++; 21007 } 21008 21009 // Init the element's event structure and main handler, if this is the first 21010 if ( !( events = elemData.events ) ) { 21011 events = elemData.events = Object.create( null ); 21012 } 21013 if ( !( eventHandle = elemData.handle ) ) { 21014 eventHandle = elemData.handle = function( e ) { 21015 21016 // Discard the second event of a jQuery.event.trigger() and 21017 // when an event is called after a page has unloaded 21018 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 21019 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 21020 }; 21021 } 21022 21023 // Handle multiple events separated by a space 21024 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 21025 t = types.length; 21026 while ( t-- ) { 21027 tmp = rtypenamespace.exec( types[ t ] ) || []; 21028 type = origType = tmp[ 1 ]; 21029 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 21030 21031 // There *must* be a type, no attaching namespace-only handlers 21032 if ( !type ) { 21033 continue; 21034 } 21035 21036 // If event changes its type, use the special event handlers for the changed type 21037 special = jQuery.event.special[ type ] || {}; 21038 21039 // If selector defined, determine special event api type, otherwise given type 21040 type = ( selector ? special.delegateType : special.bindType ) || type; 21041 21042 // Update special based on newly reset type 21043 special = jQuery.event.special[ type ] || {}; 21044 21045 // handleObj is passed to all event handlers 21046 handleObj = jQuery.extend( { 21047 type: type, 21048 origType: origType, 21049 data: data, 21050 handler: handler, 21051 guid: handler.guid, 21052 selector: selector, 21053 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 21054 namespace: namespaces.join( "." ) 21055 }, handleObjIn ); 21056 21057 // Init the event handler queue if we're the first 21058 if ( !( handlers = events[ type ] ) ) { 21059 handlers = events[ type ] = []; 21060 handlers.delegateCount = 0; 21061 21062 // Only use addEventListener if the special events handler returns false 21063 if ( !special.setup || 21064 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 21065 21066 if ( elem.addEventListener ) { 21067 elem.addEventListener( type, eventHandle ); 21068 } 21069 } 21070 } 21071 21072 if ( special.add ) { 21073 special.add.call( elem, handleObj ); 21074 21075 if ( !handleObj.handler.guid ) { 21076 handleObj.handler.guid = handler.guid; 21077 } 21078 } 21079 21080 // Add to the element's handler list, delegates in front 21081 if ( selector ) { 21082 handlers.splice( handlers.delegateCount++, 0, handleObj ); 21083 } else { 21084 handlers.push( handleObj ); 21085 } 21086 21087 // Keep track of which events have ever been used, for event optimization 21088 jQuery.event.global[ type ] = true; 21089 } 21090 21091 }, 21092 21093 // Detach an event or set of events from an element 21094 remove: function( elem, types, handler, selector, mappedTypes ) { 21095 21096 var j, origCount, tmp, 21097 events, t, handleObj, 21098 special, handlers, type, namespaces, origType, 21099 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 21100 21101 if ( !elemData || !( events = elemData.events ) ) { 21102 return; 21103 } 21104 21105 // Once for each type.namespace in types; type may be omitted 21106 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 21107 t = types.length; 21108 while ( t-- ) { 21109 tmp = rtypenamespace.exec( types[ t ] ) || []; 21110 type = origType = tmp[ 1 ]; 21111 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 21112 21113 // Unbind all events (on this namespace, if provided) for the element 21114 if ( !type ) { 21115 for ( type in events ) { 21116 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 21117 } 21118 continue; 21119 } 21120 21121 special = jQuery.event.special[ type ] || {}; 21122 type = ( selector ? special.delegateType : special.bindType ) || type; 21123 handlers = events[ type ] || []; 21124 tmp = tmp[ 2 ] && 21125 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 21126 21127 // Remove matching events 21128 origCount = j = handlers.length; 21129 while ( j-- ) { 21130 handleObj = handlers[ j ]; 21131 21132 if ( ( mappedTypes || origType === handleObj.origType ) && 21133 ( !handler || handler.guid === handleObj.guid ) && 21134 ( !tmp || tmp.test( handleObj.namespace ) ) && 21135 ( !selector || selector === handleObj.selector || 21136 selector === "**" && handleObj.selector ) ) { 21137 handlers.splice( j, 1 ); 21138 21139 if ( handleObj.selector ) { 21140 handlers.delegateCount--; 21141 } 21142 if ( special.remove ) { 21143 special.remove.call( elem, handleObj ); 21144 } 21145 } 21146 } 21147 21148 // Remove generic event handler if we removed something and no more handlers exist 21149 // (avoids potential for endless recursion during removal of special event handlers) 21150 if ( origCount && !handlers.length ) { 21151 if ( !special.teardown || 21152 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 21153 21154 jQuery.removeEvent( elem, type, elemData.handle ); 21155 } 21156 21157 delete events[ type ]; 21158 } 21159 } 21160 21161 // Remove data and the expando if it's no longer used 21162 if ( jQuery.isEmptyObject( events ) ) { 21163 dataPriv.remove( elem, "handle events" ); 21164 } 21165 }, 21166 21167 dispatch: function( nativeEvent ) { 21168 21169 var i, j, ret, matched, handleObj, handlerQueue, 21170 args = new Array( arguments.length ), 21171 21172 // Make a writable jQuery.Event from the native event object 21173 event = jQuery.event.fix( nativeEvent ), 21174 21175 handlers = ( 21176 dataPriv.get( this, "events" ) || Object.create( null ) 21177 )[ event.type ] || [], 21178 special = jQuery.event.special[ event.type ] || {}; 21179 21180 // Use the fix-ed jQuery.Event rather than the (read-only) native event 21181 args[ 0 ] = event; 21182 21183 for ( i = 1; i < arguments.length; i++ ) { 21184 args[ i ] = arguments[ i ]; 21185 } 21186 21187 event.delegateTarget = this; 21188 21189 // Call the preDispatch hook for the mapped type, and let it bail if desired 21190 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 21191 return; 21192 } 21193 21194 // Determine handlers 21195 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 21196 21197 // Run delegates first; they may want to stop propagation beneath us 21198 i = 0; 21199 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 21200 event.currentTarget = matched.elem; 21201 21202 j = 0; 21203 while ( ( handleObj = matched.handlers[ j++ ] ) && 21204 !event.isImmediatePropagationStopped() ) { 21205 21206 // If the event is namespaced, then each handler is only invoked if it is 21207 // specially universal or its namespaces are a superset of the event's. 21208 if ( !event.rnamespace || handleObj.namespace === false || 21209 event.rnamespace.test( handleObj.namespace ) ) { 21210 21211 event.handleObj = handleObj; 21212 event.data = handleObj.data; 21213 21214 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 21215 handleObj.handler ).apply( matched.elem, args ); 21216 21217 if ( ret !== undefined ) { 21218 if ( ( event.result = ret ) === false ) { 21219 event.preventDefault(); 21220 event.stopPropagation(); 21221 } 21222 } 21223 } 21224 } 21225 } 21226 21227 // Call the postDispatch hook for the mapped type 21228 if ( special.postDispatch ) { 21229 special.postDispatch.call( this, event ); 21230 } 21231 21232 return event.result; 21233 }, 21234 21235 handlers: function( event, handlers ) { 21236 var i, handleObj, sel, matchedHandlers, matchedSelectors, 21237 handlerQueue = [], 21238 delegateCount = handlers.delegateCount, 21239 cur = event.target; 21240 21241 // Find delegate handlers 21242 if ( delegateCount && 21243 21244 // Support: IE <=9 21245 // Black-hole SVG <use> instance trees (trac-13180) 21246 cur.nodeType && 21247 21248 // Support: Firefox <=42 21249 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 21250 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 21251 // Support: IE 11 only 21252 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 21253 !( event.type === "click" && event.button >= 1 ) ) { 21254 21255 for ( ; cur !== this; cur = cur.parentNode || this ) { 21256 21257 // Don't check non-elements (trac-13208) 21258 // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) 21259 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 21260 matchedHandlers = []; 21261 matchedSelectors = {}; 21262 for ( i = 0; i < delegateCount; i++ ) { 21263 handleObj = handlers[ i ]; 21264 21265 // Don't conflict with Object.prototype properties (trac-13203) 21266 sel = handleObj.selector + " "; 21267 21268 if ( matchedSelectors[ sel ] === undefined ) { 21269 matchedSelectors[ sel ] = handleObj.needsContext ? 21270 jQuery( sel, this ).index( cur ) > -1 : 21271 jQuery.find( sel, this, null, [ cur ] ).length; 21272 } 21273 if ( matchedSelectors[ sel ] ) { 21274 matchedHandlers.push( handleObj ); 21275 } 21276 } 21277 if ( matchedHandlers.length ) { 21278 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 21279 } 21280 } 21281 } 21282 } 21283 21284 // Add the remaining (directly-bound) handlers 21285 cur = this; 21286 if ( delegateCount < handlers.length ) { 21287 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 21288 } 21289 21290 return handlerQueue; 21291 }, 21292 21293 addProp: function( name, hook ) { 21294 Object.defineProperty( jQuery.Event.prototype, name, { 21295 enumerable: true, 21296 configurable: true, 21297 21298 get: isFunction( hook ) ? 21299 function() { 21300 if ( this.originalEvent ) { 21301 return hook( this.originalEvent ); 21302 } 21303 } : 21304 function() { 21305 if ( this.originalEvent ) { 21306 return this.originalEvent[ name ]; 21307 } 21308 }, 21309 21310 set: function( value ) { 21311 Object.defineProperty( this, name, { 21312 enumerable: true, 21313 configurable: true, 21314 writable: true, 21315 value: value 21316 } ); 21317 } 21318 } ); 21319 }, 21320 21321 fix: function( originalEvent ) { 21322 return originalEvent[ jQuery.expando ] ? 21323 originalEvent : 21324 new jQuery.Event( originalEvent ); 21325 }, 21326 21327 special: { 21328 load: { 21329 21330 // Prevent triggered image.load events from bubbling to window.load 21331 noBubble: true 21332 }, 21333 click: { 21334 21335 // Utilize native event to ensure correct state for checkable inputs 21336 setup: function( data ) { 21337 21338 // For mutual compressibility with _default, replace `this` access with a local var. 21339 // `|| data` is dead code meant only to preserve the variable through minification. 21340 var el = this || data; 21341 21342 // Claim the first handler 21343 if ( rcheckableType.test( el.type ) && 21344 el.click && nodeName( el, "input" ) ) { 21345 21346 // dataPriv.set( el, "click", ... ) 21347 leverageNative( el, "click", true ); 21348 } 21349 21350 // Return false to allow normal processing in the caller 21351 return false; 21352 }, 21353 trigger: function( data ) { 21354 21355 // For mutual compressibility with _default, replace `this` access with a local var. 21356 // `|| data` is dead code meant only to preserve the variable through minification. 21357 var el = this || data; 21358 21359 // Force setup before triggering a click 21360 if ( rcheckableType.test( el.type ) && 21361 el.click && nodeName( el, "input" ) ) { 21362 21363 leverageNative( el, "click" ); 21364 } 21365 21366 // Return non-false to allow normal event-path propagation 21367 return true; 21368 }, 21369 21370 // For cross-browser consistency, suppress native .click() on links 21371 // Also prevent it if we're currently inside a leveraged native-event stack 21372 _default: function( event ) { 21373 var target = event.target; 21374 return rcheckableType.test( target.type ) && 21375 target.click && nodeName( target, "input" ) && 21376 dataPriv.get( target, "click" ) || 21377 nodeName( target, "a" ); 21378 } 21379 }, 21380 21381 beforeunload: { 21382 postDispatch: function( event ) { 21383 21384 // Support: Firefox 20+ 21385 // Firefox doesn't alert if the returnValue field is not set. 21386 if ( event.result !== undefined && event.originalEvent ) { 21387 event.originalEvent.returnValue = event.result; 21388 } 21389 } 21390 } 21391 } 21392 }; 21393 21394// Ensure the presence of an event listener that handles manually-triggered 21395// synthetic events by interrupting progress until reinvoked in response to 21396// *native* events that it fires directly, ensuring that state changes have 21397// already occurred before other listeners are invoked. 21398 function leverageNative( el, type, isSetup ) { 21399 21400 // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add 21401 if ( !isSetup ) { 21402 if ( dataPriv.get( el, type ) === undefined ) { 21403 jQuery.event.add( el, type, returnTrue ); 21404 } 21405 return; 21406 } 21407 21408 // Register the controller as a special universal handler for all event namespaces 21409 dataPriv.set( el, type, false ); 21410 jQuery.event.add( el, type, { 21411 namespace: false, 21412 handler: function( event ) { 21413 var result, 21414 saved = dataPriv.get( this, type ); 21415 21416 if ( ( event.isTrigger & 1 ) && this[ type ] ) { 21417 21418 // Interrupt processing of the outer synthetic .trigger()ed event 21419 if ( !saved ) { 21420 21421 // Store arguments for use when handling the inner native event 21422 // There will always be at least one argument (an event object), so this array 21423 // will not be confused with a leftover capture object. 21424 saved = slice.call( arguments ); 21425 dataPriv.set( this, type, saved ); 21426 21427 // Trigger the native event and capture its result 21428 this[ type ](); 21429 result = dataPriv.get( this, type ); 21430 dataPriv.set( this, type, false ); 21431 21432 if ( saved !== result ) { 21433 21434 // Cancel the outer synthetic event 21435 event.stopImmediatePropagation(); 21436 event.preventDefault(); 21437 21438 return result; 21439 } 21440 21441 // If this is an inner synthetic event for an event with a bubbling surrogate 21442 // (focus or blur), assume that the surrogate already propagated from triggering 21443 // the native event and prevent that from happening again here. 21444 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the 21445 // bubbling surrogate propagates *after* the non-bubbling base), but that seems 21446 // less bad than duplication. 21447 } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { 21448 event.stopPropagation(); 21449 } 21450 21451 // If this is a native event triggered above, everything is now in order 21452 // Fire an inner synthetic event with the original arguments 21453 } else if ( saved ) { 21454 21455 // ...and capture the result 21456 dataPriv.set( this, type, jQuery.event.trigger( 21457 saved[ 0 ], 21458 saved.slice( 1 ), 21459 this 21460 ) ); 21461 21462 // Abort handling of the native event by all jQuery handlers while allowing 21463 // native handlers on the same element to run. On target, this is achieved 21464 // by stopping immediate propagation just on the jQuery event. However, 21465 // the native event is re-wrapped by a jQuery one on each level of the 21466 // propagation so the only way to stop it for jQuery is to stop it for 21467 // everyone via native `stopPropagation()`. This is not a problem for 21468 // focus/blur which don't bubble, but it does also stop click on checkboxes 21469 // and radios. We accept this limitation. 21470 event.stopPropagation(); 21471 event.isImmediatePropagationStopped = returnTrue; 21472 } 21473 } 21474 } ); 21475 } 21476 21477 jQuery.removeEvent = function( elem, type, handle ) { 21478 21479 // This "if" is needed for plain objects 21480 if ( elem.removeEventListener ) { 21481 elem.removeEventListener( type, handle ); 21482 } 21483 }; 21484 21485 jQuery.Event = function( src, props ) { 21486 21487 // Allow instantiation without the 'new' keyword 21488 if ( !( this instanceof jQuery.Event ) ) { 21489 return new jQuery.Event( src, props ); 21490 } 21491 21492 // Event object 21493 if ( src && src.type ) { 21494 this.originalEvent = src; 21495 this.type = src.type; 21496 21497 // Events bubbling up the document may have been marked as prevented 21498 // by a handler lower down the tree; reflect the correct value. 21499 this.isDefaultPrevented = src.defaultPrevented || 21500 src.defaultPrevented === undefined && 21501 21502 // Support: Android <=2.3 only 21503 src.returnValue === false ? 21504 returnTrue : 21505 returnFalse; 21506 21507 // Create target properties 21508 // Support: Safari <=6 - 7 only 21509 // Target should not be a text node (trac-504, trac-13143) 21510 this.target = ( src.target && src.target.nodeType === 3 ) ? 21511 src.target.parentNode : 21512 src.target; 21513 21514 this.currentTarget = src.currentTarget; 21515 this.relatedTarget = src.relatedTarget; 21516 21517 // Event type 21518 } else { 21519 this.type = src; 21520 } 21521 21522 // Put explicitly provided properties onto the event object 21523 if ( props ) { 21524 jQuery.extend( this, props ); 21525 } 21526 21527 // Create a timestamp if incoming event doesn't have one 21528 this.timeStamp = src && src.timeStamp || Date.now(); 21529 21530 // Mark it as fixed 21531 this[ jQuery.expando ] = true; 21532 }; 21533 21534// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 21535// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 21536 jQuery.Event.prototype = { 21537 constructor: jQuery.Event, 21538 isDefaultPrevented: returnFalse, 21539 isPropagationStopped: returnFalse, 21540 isImmediatePropagationStopped: returnFalse, 21541 isSimulated: false, 21542 21543 preventDefault: function() { 21544 var e = this.originalEvent; 21545 21546 this.isDefaultPrevented = returnTrue; 21547 21548 if ( e && !this.isSimulated ) { 21549 e.preventDefault(); 21550 } 21551 }, 21552 stopPropagation: function() { 21553 var e = this.originalEvent; 21554 21555 this.isPropagationStopped = returnTrue; 21556 21557 if ( e && !this.isSimulated ) { 21558 e.stopPropagation(); 21559 } 21560 }, 21561 stopImmediatePropagation: function() { 21562 var e = this.originalEvent; 21563 21564 this.isImmediatePropagationStopped = returnTrue; 21565 21566 if ( e && !this.isSimulated ) { 21567 e.stopImmediatePropagation(); 21568 } 21569 21570 this.stopPropagation(); 21571 } 21572 }; 21573 21574// Includes all common event props including KeyEvent and MouseEvent specific props 21575 jQuery.each( { 21576 altKey: true, 21577 bubbles: true, 21578 cancelable: true, 21579 changedTouches: true, 21580 ctrlKey: true, 21581 detail: true, 21582 eventPhase: true, 21583 metaKey: true, 21584 pageX: true, 21585 pageY: true, 21586 shiftKey: true, 21587 view: true, 21588 "char": true, 21589 code: true, 21590 charCode: true, 21591 key: true, 21592 keyCode: true, 21593 button: true, 21594 buttons: true, 21595 clientX: true, 21596 clientY: true, 21597 offsetX: true, 21598 offsetY: true, 21599 pointerId: true, 21600 pointerType: true, 21601 screenX: true, 21602 screenY: true, 21603 targetTouches: true, 21604 toElement: true, 21605 touches: true, 21606 which: true 21607 }, jQuery.event.addProp ); 21608 21609 jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { 21610 21611 function focusMappedHandler( nativeEvent ) { 21612 if ( document.documentMode ) { 21613 21614 // Support: IE 11+ 21615 // Attach a single focusin/focusout handler on the document while someone wants 21616 // focus/blur. This is because the former are synchronous in IE while the latter 21617 // are async. In other browsers, all those handlers are invoked synchronously. 21618 21619 // `handle` from private data would already wrap the event, but we need 21620 // to change the `type` here. 21621 var handle = dataPriv.get( this, "handle" ), 21622 event = jQuery.event.fix( nativeEvent ); 21623 event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; 21624 event.isSimulated = true; 21625 21626 // First, handle focusin/focusout 21627 handle( nativeEvent ); 21628 21629 // ...then, handle focus/blur 21630 // 21631 // focus/blur don't bubble while focusin/focusout do; simulate the former by only 21632 // invoking the handler at the lower level. 21633 if ( event.target === event.currentTarget ) { 21634 21635 // The setup part calls `leverageNative`, which, in turn, calls 21636 // `jQuery.event.add`, so event handle will already have been set 21637 // by this point. 21638 handle( event ); 21639 } 21640 } else { 21641 21642 // For non-IE browsers, attach a single capturing handler on the document 21643 // while someone wants focusin/focusout. 21644 jQuery.event.simulate( delegateType, nativeEvent.target, 21645 jQuery.event.fix( nativeEvent ) ); 21646 } 21647 } 21648 21649 jQuery.event.special[ type ] = { 21650 21651 // Utilize native event if possible so blur/focus sequence is correct 21652 setup: function() { 21653 21654 var attaches; 21655 21656 // Claim the first handler 21657 // dataPriv.set( this, "focus", ... ) 21658 // dataPriv.set( this, "blur", ... ) 21659 leverageNative( this, type, true ); 21660 21661 if ( document.documentMode ) { 21662 21663 // Support: IE 9 - 11+ 21664 // We use the same native handler for focusin & focus (and focusout & blur) 21665 // so we need to coordinate setup & teardown parts between those events. 21666 // Use `delegateType` as the key as `type` is already used by `leverageNative`. 21667 attaches = dataPriv.get( this, delegateType ); 21668 if ( !attaches ) { 21669 this.addEventListener( delegateType, focusMappedHandler ); 21670 } 21671 dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); 21672 } else { 21673 21674 // Return false to allow normal processing in the caller 21675 return false; 21676 } 21677 }, 21678 trigger: function() { 21679 21680 // Force setup before trigger 21681 leverageNative( this, type ); 21682 21683 // Return non-false to allow normal event-path propagation 21684 return true; 21685 }, 21686 21687 teardown: function() { 21688 var attaches; 21689 21690 if ( document.documentMode ) { 21691 attaches = dataPriv.get( this, delegateType ) - 1; 21692 if ( !attaches ) { 21693 this.removeEventListener( delegateType, focusMappedHandler ); 21694 dataPriv.remove( this, delegateType ); 21695 } else { 21696 dataPriv.set( this, delegateType, attaches ); 21697 } 21698 } else { 21699 21700 // Return false to indicate standard teardown should be applied 21701 return false; 21702 } 21703 }, 21704 21705 // Suppress native focus or blur if we're currently inside 21706 // a leveraged native-event stack 21707 _default: function( event ) { 21708 return dataPriv.get( event.target, type ); 21709 }, 21710 21711 delegateType: delegateType 21712 }; 21713 21714 // Support: Firefox <=44 21715 // Firefox doesn't have focus(in | out) events 21716 // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 21717 // 21718 // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 21719 // focus(in | out) events fire after focus & blur events, 21720 // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 21721 // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 21722 // 21723 // Support: IE 9 - 11+ 21724 // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, 21725 // attach a single handler for both events in IE. 21726 jQuery.event.special[ delegateType ] = { 21727 setup: function() { 21728 21729 // Handle: regular nodes (via `this.ownerDocument`), window 21730 // (via `this.document`) & document (via `this`). 21731 var doc = this.ownerDocument || this.document || this, 21732 dataHolder = document.documentMode ? this : doc, 21733 attaches = dataPriv.get( dataHolder, delegateType ); 21734 21735 // Support: IE 9 - 11+ 21736 // We use the same native handler for focusin & focus (and focusout & blur) 21737 // so we need to coordinate setup & teardown parts between those events. 21738 // Use `delegateType` as the key as `type` is already used by `leverageNative`. 21739 if ( !attaches ) { 21740 if ( document.documentMode ) { 21741 this.addEventListener( delegateType, focusMappedHandler ); 21742 } else { 21743 doc.addEventListener( type, focusMappedHandler, true ); 21744 } 21745 } 21746 dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); 21747 }, 21748 teardown: function() { 21749 var doc = this.ownerDocument || this.document || this, 21750 dataHolder = document.documentMode ? this : doc, 21751 attaches = dataPriv.get( dataHolder, delegateType ) - 1; 21752 21753 if ( !attaches ) { 21754 if ( document.documentMode ) { 21755 this.removeEventListener( delegateType, focusMappedHandler ); 21756 } else { 21757 doc.removeEventListener( type, focusMappedHandler, true ); 21758 } 21759 dataPriv.remove( dataHolder, delegateType ); 21760 } else { 21761 dataPriv.set( dataHolder, delegateType, attaches ); 21762 } 21763 } 21764 }; 21765 } ); 21766 21767// Create mouseenter/leave events using mouseover/out and event-time checks 21768// so that event delegation works in jQuery. 21769// Do the same for pointerenter/pointerleave and pointerover/pointerout 21770// 21771// Support: Safari 7 only 21772// Safari sends mouseenter too often; see: 21773// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 21774// for the description of the bug (it existed in older Chrome versions as well). 21775 jQuery.each( { 21776 mouseenter: "mouseover", 21777 mouseleave: "mouseout", 21778 pointerenter: "pointerover", 21779 pointerleave: "pointerout" 21780 }, function( orig, fix ) { 21781 jQuery.event.special[ orig ] = { 21782 delegateType: fix, 21783 bindType: fix, 21784 21785 handle: function( event ) { 21786 var ret, 21787 target = this, 21788 related = event.relatedTarget, 21789 handleObj = event.handleObj; 21790 21791 // For mouseenter/leave call the handler if related is outside the target. 21792 // NB: No relatedTarget if the mouse left/entered the browser window 21793 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 21794 event.type = handleObj.origType; 21795 ret = handleObj.handler.apply( this, arguments ); 21796 event.type = fix; 21797 } 21798 return ret; 21799 } 21800 }; 21801 } ); 21802 21803 jQuery.fn.extend( { 21804 21805 on: function( types, selector, data, fn ) { 21806 return on( this, types, selector, data, fn ); 21807 }, 21808 one: function( types, selector, data, fn ) { 21809 return on( this, types, selector, data, fn, 1 ); 21810 }, 21811 off: function( types, selector, fn ) { 21812 var handleObj, type; 21813 if ( types && types.preventDefault && types.handleObj ) { 21814 21815 // ( event ) dispatched jQuery.Event 21816 handleObj = types.handleObj; 21817 jQuery( types.delegateTarget ).off( 21818 handleObj.namespace ? 21819 handleObj.origType + "." + handleObj.namespace : 21820 handleObj.origType, 21821 handleObj.selector, 21822 handleObj.handler 21823 ); 21824 return this; 21825 } 21826 if ( typeof types === "object" ) { 21827 21828 // ( types-object [, selector] ) 21829 for ( type in types ) { 21830 this.off( type, selector, types[ type ] ); 21831 } 21832 return this; 21833 } 21834 if ( selector === false || typeof selector === "function" ) { 21835 21836 // ( types [, fn] ) 21837 fn = selector; 21838 selector = undefined; 21839 } 21840 if ( fn === false ) { 21841 fn = returnFalse; 21842 } 21843 return this.each( function() { 21844 jQuery.event.remove( this, types, fn, selector ); 21845 } ); 21846 } 21847 } ); 21848 21849 21850 var 21851 21852 // Support: IE <=10 - 11, Edge 12 - 13 only 21853 // In IE/Edge using regex groups here causes severe slowdowns. 21854 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 21855 rnoInnerhtml = /<script|<style|<link/i, 21856 21857 // checked="checked" or checked 21858 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 21859 21860 rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g; 21861 21862// Prefer a tbody over its parent table for containing new rows 21863 function manipulationTarget( elem, content ) { 21864 if ( nodeName( elem, "table" ) && 21865 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 21866 21867 return jQuery( elem ).children( "tbody" )[ 0 ] || elem; 21868 } 21869 21870 return elem; 21871 } 21872 21873// Replace/restore the type attribute of script elements for safe DOM manipulation 21874 function disableScript( elem ) { 21875 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 21876 return elem; 21877 } 21878 function restoreScript( elem ) { 21879 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { 21880 elem.type = elem.type.slice( 5 ); 21881 } else { 21882 elem.removeAttribute( "type" ); 21883 } 21884 21885 return elem; 21886 } 21887 21888 function cloneCopyEvent( src, dest ) { 21889 var i, l, type, pdataOld, udataOld, udataCur, events; 21890 21891 if ( dest.nodeType !== 1 ) { 21892 return; 21893 } 21894 21895 // 1. Copy private data: events, handlers, etc. 21896 if ( dataPriv.hasData( src ) ) { 21897 pdataOld = dataPriv.get( src ); 21898 events = pdataOld.events; 21899 21900 if ( events ) { 21901 dataPriv.remove( dest, "handle events" ); 21902 21903 for ( type in events ) { 21904 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 21905 jQuery.event.add( dest, type, events[ type ][ i ] ); 21906 } 21907 } 21908 } 21909 } 21910 21911 // 2. Copy user data 21912 if ( dataUser.hasData( src ) ) { 21913 udataOld = dataUser.access( src ); 21914 udataCur = jQuery.extend( {}, udataOld ); 21915 21916 dataUser.set( dest, udataCur ); 21917 } 21918 } 21919 21920// Fix IE bugs, see support tests 21921 function fixInput( src, dest ) { 21922 var nodeName = dest.nodeName.toLowerCase(); 21923 21924 // Fails to persist the checked state of a cloned checkbox or radio button. 21925 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 21926 dest.checked = src.checked; 21927 21928 // Fails to return the selected option to the default selected state when cloning options 21929 } else if ( nodeName === "input" || nodeName === "textarea" ) { 21930 dest.defaultValue = src.defaultValue; 21931 } 21932 } 21933 21934 function domManip( collection, args, callback, ignored ) { 21935 21936 // Flatten any nested arrays 21937 args = flat( args ); 21938 21939 var fragment, first, scripts, hasScripts, node, doc, 21940 i = 0, 21941 l = collection.length, 21942 iNoClone = l - 1, 21943 value = args[ 0 ], 21944 valueIsFunction = isFunction( value ); 21945 21946 // We can't cloneNode fragments that contain checked, in WebKit 21947 if ( valueIsFunction || 21948 ( l > 1 && typeof value === "string" && 21949 !support.checkClone && rchecked.test( value ) ) ) { 21950 return collection.each( function( index ) { 21951 var self = collection.eq( index ); 21952 if ( valueIsFunction ) { 21953 args[ 0 ] = value.call( this, index, self.html() ); 21954 } 21955 domManip( self, args, callback, ignored ); 21956 } ); 21957 } 21958 21959 if ( l ) { 21960 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 21961 first = fragment.firstChild; 21962 21963 if ( fragment.childNodes.length === 1 ) { 21964 fragment = first; 21965 } 21966 21967 // Require either new content or an interest in ignored elements to invoke the callback 21968 if ( first || ignored ) { 21969 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 21970 hasScripts = scripts.length; 21971 21972 // Use the original fragment for the last item 21973 // instead of the first because it can end up 21974 // being emptied incorrectly in certain situations (trac-8070). 21975 for ( ; i < l; i++ ) { 21976 node = fragment; 21977 21978 if ( i !== iNoClone ) { 21979 node = jQuery.clone( node, true, true ); 21980 21981 // Keep references to cloned scripts for later restoration 21982 if ( hasScripts ) { 21983 21984 // Support: Android <=4.0 only, PhantomJS 1 only 21985 // push.apply(_, arraylike) throws on ancient WebKit 21986 jQuery.merge( scripts, getAll( node, "script" ) ); 21987 } 21988 } 21989 21990 callback.call( collection[ i ], node, i ); 21991 } 21992 21993 if ( hasScripts ) { 21994 doc = scripts[ scripts.length - 1 ].ownerDocument; 21995 21996 // Re-enable scripts 21997 jQuery.map( scripts, restoreScript ); 21998 21999 // Evaluate executable scripts on first document insertion 22000 for ( i = 0; i < hasScripts; i++ ) { 22001 node = scripts[ i ]; 22002 if ( rscriptType.test( node.type || "" ) && 22003 !dataPriv.access( node, "globalEval" ) && 22004 jQuery.contains( doc, node ) ) { 22005 22006 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { 22007 22008 // Optional AJAX dependency, but won't run scripts if not present 22009 if ( jQuery._evalUrl && !node.noModule ) { 22010 jQuery._evalUrl( node.src, { 22011 nonce: node.nonce || node.getAttribute( "nonce" ) 22012 }, doc ); 22013 } 22014 } else { 22015 22016 // Unwrap a CDATA section containing script contents. This shouldn't be 22017 // needed as in XML documents they're already not visible when 22018 // inspecting element contents and in HTML documents they have no 22019 // meaning but we're preserving that logic for backwards compatibility. 22020 // This will be removed completely in 4.0. See gh-4904. 22021 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); 22022 } 22023 } 22024 } 22025 } 22026 } 22027 } 22028 22029 return collection; 22030 } 22031 22032 function remove( elem, selector, keepData ) { 22033 var node, 22034 nodes = selector ? jQuery.filter( selector, elem ) : elem, 22035 i = 0; 22036 22037 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 22038 if ( !keepData && node.nodeType === 1 ) { 22039 jQuery.cleanData( getAll( node ) ); 22040 } 22041 22042 if ( node.parentNode ) { 22043 if ( keepData && isAttached( node ) ) { 22044 setGlobalEval( getAll( node, "script" ) ); 22045 } 22046 node.parentNode.removeChild( node ); 22047 } 22048 } 22049 22050 return elem; 22051 } 22052 22053 jQuery.extend( { 22054 htmlPrefilter: function( html ) { 22055 return html; 22056 }, 22057 22058 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 22059 var i, l, srcElements, destElements, 22060 clone = elem.cloneNode( true ), 22061 inPage = isAttached( elem ); 22062 22063 // Fix IE cloning issues 22064 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 22065 !jQuery.isXMLDoc( elem ) ) { 22066 22067 // We eschew jQuery#find here for performance reasons: 22068 // https://jsperf.com/getall-vs-sizzle/2 22069 destElements = getAll( clone ); 22070 srcElements = getAll( elem ); 22071 22072 for ( i = 0, l = srcElements.length; i < l; i++ ) { 22073 fixInput( srcElements[ i ], destElements[ i ] ); 22074 } 22075 } 22076 22077 // Copy the events from the original to the clone 22078 if ( dataAndEvents ) { 22079 if ( deepDataAndEvents ) { 22080 srcElements = srcElements || getAll( elem ); 22081 destElements = destElements || getAll( clone ); 22082 22083 for ( i = 0, l = srcElements.length; i < l; i++ ) { 22084 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 22085 } 22086 } else { 22087 cloneCopyEvent( elem, clone ); 22088 } 22089 } 22090 22091 // Preserve script evaluation history 22092 destElements = getAll( clone, "script" ); 22093 if ( destElements.length > 0 ) { 22094 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 22095 } 22096 22097 // Return the cloned set 22098 return clone; 22099 }, 22100 22101 cleanData: function( elems ) { 22102 var data, elem, type, 22103 special = jQuery.event.special, 22104 i = 0; 22105 22106 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 22107 if ( acceptData( elem ) ) { 22108 if ( ( data = elem[ dataPriv.expando ] ) ) { 22109 if ( data.events ) { 22110 for ( type in data.events ) { 22111 if ( special[ type ] ) { 22112 jQuery.event.remove( elem, type ); 22113 22114 // This is a shortcut to avoid jQuery.event.remove's overhead 22115 } else { 22116 jQuery.removeEvent( elem, type, data.handle ); 22117 } 22118 } 22119 } 22120 22121 // Support: Chrome <=35 - 45+ 22122 // Assign undefined instead of using delete, see Data#remove 22123 elem[ dataPriv.expando ] = undefined; 22124 } 22125 if ( elem[ dataUser.expando ] ) { 22126 22127 // Support: Chrome <=35 - 45+ 22128 // Assign undefined instead of using delete, see Data#remove 22129 elem[ dataUser.expando ] = undefined; 22130 } 22131 } 22132 } 22133 } 22134 } ); 22135 22136 jQuery.fn.extend( { 22137 detach: function( selector ) { 22138 return remove( this, selector, true ); 22139 }, 22140 22141 remove: function( selector ) { 22142 return remove( this, selector ); 22143 }, 22144 22145 text: function( value ) { 22146 return access( this, function( value ) { 22147 return value === undefined ? 22148 jQuery.text( this ) : 22149 this.empty().each( function() { 22150 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 22151 this.textContent = value; 22152 } 22153 } ); 22154 }, null, value, arguments.length ); 22155 }, 22156 22157 append: function() { 22158 return domManip( this, arguments, function( elem ) { 22159 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 22160 var target = manipulationTarget( this, elem ); 22161 target.appendChild( elem ); 22162 } 22163 } ); 22164 }, 22165 22166 prepend: function() { 22167 return domManip( this, arguments, function( elem ) { 22168 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 22169 var target = manipulationTarget( this, elem ); 22170 target.insertBefore( elem, target.firstChild ); 22171 } 22172 } ); 22173 }, 22174 22175 before: function() { 22176 return domManip( this, arguments, function( elem ) { 22177 if ( this.parentNode ) { 22178 this.parentNode.insertBefore( elem, this ); 22179 } 22180 } ); 22181 }, 22182 22183 after: function() { 22184 return domManip( this, arguments, function( elem ) { 22185 if ( this.parentNode ) { 22186 this.parentNode.insertBefore( elem, this.nextSibling ); 22187 } 22188 } ); 22189 }, 22190 22191 empty: function() { 22192 var elem, 22193 i = 0; 22194 22195 for ( ; ( elem = this[ i ] ) != null; i++ ) { 22196 if ( elem.nodeType === 1 ) { 22197 22198 // Prevent memory leaks 22199 jQuery.cleanData( getAll( elem, false ) ); 22200 22201 // Remove any remaining nodes 22202 elem.textContent = ""; 22203 } 22204 } 22205 22206 return this; 22207 }, 22208 22209 clone: function( dataAndEvents, deepDataAndEvents ) { 22210 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 22211 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 22212 22213 return this.map( function() { 22214 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 22215 } ); 22216 }, 22217 22218 html: function( value ) { 22219 return access( this, function( value ) { 22220 var elem = this[ 0 ] || {}, 22221 i = 0, 22222 l = this.length; 22223 22224 if ( value === undefined && elem.nodeType === 1 ) { 22225 return elem.innerHTML; 22226 } 22227 22228 // See if we can take a shortcut and just use innerHTML 22229 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 22230 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 22231 22232 value = jQuery.htmlPrefilter( value ); 22233 22234 try { 22235 for ( ; i < l; i++ ) { 22236 elem = this[ i ] || {}; 22237 22238 // Remove element nodes and prevent memory leaks 22239 if ( elem.nodeType === 1 ) { 22240 jQuery.cleanData( getAll( elem, false ) ); 22241 elem.innerHTML = value; 22242 } 22243 } 22244 22245 elem = 0; 22246 22247 // If using innerHTML throws an exception, use the fallback method 22248 } catch ( e ) {} 22249 } 22250 22251 if ( elem ) { 22252 this.empty().append( value ); 22253 } 22254 }, null, value, arguments.length ); 22255 }, 22256 22257 replaceWith: function() { 22258 var ignored = []; 22259 22260 // Make the changes, replacing each non-ignored context element with the new content 22261 return domManip( this, arguments, function( elem ) { 22262 var parent = this.parentNode; 22263 22264 if ( jQuery.inArray( this, ignored ) < 0 ) { 22265 jQuery.cleanData( getAll( this ) ); 22266 if ( parent ) { 22267 parent.replaceChild( elem, this ); 22268 } 22269 } 22270 22271 // Force callback invocation 22272 }, ignored ); 22273 } 22274 } ); 22275 22276 jQuery.each( { 22277 appendTo: "append", 22278 prependTo: "prepend", 22279 insertBefore: "before", 22280 insertAfter: "after", 22281 replaceAll: "replaceWith" 22282 }, function( name, original ) { 22283 jQuery.fn[ name ] = function( selector ) { 22284 var elems, 22285 ret = [], 22286 insert = jQuery( selector ), 22287 last = insert.length - 1, 22288 i = 0; 22289 22290 for ( ; i <= last; i++ ) { 22291 elems = i === last ? this : this.clone( true ); 22292 jQuery( insert[ i ] )[ original ]( elems ); 22293 22294 // Support: Android <=4.0 only, PhantomJS 1 only 22295 // .get() because push.apply(_, arraylike) throws on ancient WebKit 22296 push.apply( ret, elems.get() ); 22297 } 22298 22299 return this.pushStack( ret ); 22300 }; 22301 } ); 22302 var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 22303 22304 var rcustomProp = /^--/; 22305 22306 22307 var getStyles = function( elem ) { 22308 22309 // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) 22310 // IE throws on elements created in popups 22311 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 22312 var view = elem.ownerDocument.defaultView; 22313 22314 if ( !view || !view.opener ) { 22315 view = window; 22316 } 22317 22318 return view.getComputedStyle( elem ); 22319 }; 22320 22321 var swap = function( elem, options, callback ) { 22322 var ret, name, 22323 old = {}; 22324 22325 // Remember the old values, and insert the new ones 22326 for ( name in options ) { 22327 old[ name ] = elem.style[ name ]; 22328 elem.style[ name ] = options[ name ]; 22329 } 22330 22331 ret = callback.call( elem ); 22332 22333 // Revert the old values 22334 for ( name in options ) { 22335 elem.style[ name ] = old[ name ]; 22336 } 22337 22338 return ret; 22339 }; 22340 22341 22342 var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); 22343 22344 22345 22346 ( function() { 22347 22348 // Executing both pixelPosition & boxSizingReliable tests require only one layout 22349 // so they're executed at the same time to save the second computation. 22350 function computeStyleTests() { 22351 22352 // This is a singleton, we need to execute it only once 22353 if ( !div ) { 22354 return; 22355 } 22356 22357 container.style.cssText = "position:absolute;left:-11111px;width:60px;" + 22358 "margin-top:1px;padding:0;border:0"; 22359 div.style.cssText = 22360 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + 22361 "margin:auto;border:1px;padding:1px;" + 22362 "width:60%;top:1%"; 22363 documentElement.appendChild( container ).appendChild( div ); 22364 22365 var divStyle = window.getComputedStyle( div ); 22366 pixelPositionVal = divStyle.top !== "1%"; 22367 22368 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 22369 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; 22370 22371 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 22372 // Some styles come back with percentage values, even though they shouldn't 22373 div.style.right = "60%"; 22374 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; 22375 22376 // Support: IE 9 - 11 only 22377 // Detect misreporting of content dimensions for box-sizing:border-box elements 22378 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; 22379 22380 // Support: IE 9 only 22381 // Detect overflow:scroll screwiness (gh-3699) 22382 // Support: Chrome <=64 22383 // Don't get tricked when zoom affects offsetWidth (gh-4029) 22384 div.style.position = "absolute"; 22385 scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; 22386 22387 documentElement.removeChild( container ); 22388 22389 // Nullify the div so it wouldn't be stored in the memory and 22390 // it will also be a sign that checks already performed 22391 div = null; 22392 } 22393 22394 function roundPixelMeasures( measure ) { 22395 return Math.round( parseFloat( measure ) ); 22396 } 22397 22398 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, 22399 reliableTrDimensionsVal, reliableMarginLeftVal, 22400 container = document.createElement( "div" ), 22401 div = document.createElement( "div" ); 22402 22403 // Finish early in limited (non-browser) environments 22404 if ( !div.style ) { 22405 return; 22406 } 22407 22408 // Support: IE <=9 - 11 only 22409 // Style of cloned element affects source element cloned (trac-8908) 22410 div.style.backgroundClip = "content-box"; 22411 div.cloneNode( true ).style.backgroundClip = ""; 22412 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 22413 22414 jQuery.extend( support, { 22415 boxSizingReliable: function() { 22416 computeStyleTests(); 22417 return boxSizingReliableVal; 22418 }, 22419 pixelBoxStyles: function() { 22420 computeStyleTests(); 22421 return pixelBoxStylesVal; 22422 }, 22423 pixelPosition: function() { 22424 computeStyleTests(); 22425 return pixelPositionVal; 22426 }, 22427 reliableMarginLeft: function() { 22428 computeStyleTests(); 22429 return reliableMarginLeftVal; 22430 }, 22431 scrollboxSize: function() { 22432 computeStyleTests(); 22433 return scrollboxSizeVal; 22434 }, 22435 22436 // Support: IE 9 - 11+, Edge 15 - 18+ 22437 // IE/Edge misreport `getComputedStyle` of table rows with width/height 22438 // set in CSS while `offset*` properties report correct values. 22439 // Behavior in IE 9 is more subtle than in newer versions & it passes 22440 // some versions of this test; make sure not to make it pass there! 22441 // 22442 // Support: Firefox 70+ 22443 // Only Firefox includes border widths 22444 // in computed dimensions. (gh-4529) 22445 reliableTrDimensions: function() { 22446 var table, tr, trChild, trStyle; 22447 if ( reliableTrDimensionsVal == null ) { 22448 table = document.createElement( "table" ); 22449 tr = document.createElement( "tr" ); 22450 trChild = document.createElement( "div" ); 22451 22452 table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; 22453 tr.style.cssText = "box-sizing:content-box;border:1px solid"; 22454 22455 // Support: Chrome 86+ 22456 // Height set through cssText does not get applied. 22457 // Computed height then comes back as 0. 22458 tr.style.height = "1px"; 22459 trChild.style.height = "9px"; 22460 22461 // Support: Android 8 Chrome 86+ 22462 // In our bodyBackground.html iframe, 22463 // display for all div elements is set to "inline", 22464 // which causes a problem only in Android 8 Chrome 86. 22465 // Ensuring the div is `display: block` 22466 // gets around this issue. 22467 trChild.style.display = "block"; 22468 22469 documentElement 22470 .appendChild( table ) 22471 .appendChild( tr ) 22472 .appendChild( trChild ); 22473 22474 trStyle = window.getComputedStyle( tr ); 22475 reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + 22476 parseInt( trStyle.borderTopWidth, 10 ) + 22477 parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; 22478 22479 documentElement.removeChild( table ); 22480 } 22481 return reliableTrDimensionsVal; 22482 } 22483 } ); 22484 } )(); 22485 22486 22487 function curCSS( elem, name, computed ) { 22488 var width, minWidth, maxWidth, ret, 22489 isCustomProp = rcustomProp.test( name ), 22490 22491 // Support: Firefox 51+ 22492 // Retrieving style before computed somehow 22493 // fixes an issue with getting wrong values 22494 // on detached elements 22495 style = elem.style; 22496 22497 computed = computed || getStyles( elem ); 22498 22499 // getPropertyValue is needed for: 22500 // .css('filter') (IE 9 only, trac-12537) 22501 // .css('--customProperty) (gh-3144) 22502 if ( computed ) { 22503 22504 // Support: IE <=9 - 11+ 22505 // IE only supports `"float"` in `getPropertyValue`; in computed styles 22506 // it's only available as `"cssFloat"`. We no longer modify properties 22507 // sent to `.css()` apart from camelCasing, so we need to check both. 22508 // Normally, this would create difference in behavior: if 22509 // `getPropertyValue` returns an empty string, the value returned 22510 // by `.css()` would be `undefined`. This is usually the case for 22511 // disconnected elements. However, in IE even disconnected elements 22512 // with no styles return `"none"` for `getPropertyValue( "float" )` 22513 ret = computed.getPropertyValue( name ) || computed[ name ]; 22514 22515 if ( isCustomProp && ret ) { 22516 22517 // Support: Firefox 105+, Chrome <=105+ 22518 // Spec requires trimming whitespace for custom properties (gh-4926). 22519 // Firefox only trims leading whitespace. Chrome just collapses 22520 // both leading & trailing whitespace to a single space. 22521 // 22522 // Fall back to `undefined` if empty string returned. 22523 // This collapses a missing definition with property defined 22524 // and set to an empty string but there's no standard API 22525 // allowing us to differentiate them without a performance penalty 22526 // and returning `undefined` aligns with older jQuery. 22527 // 22528 // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED 22529 // as whitespace while CSS does not, but this is not a problem 22530 // because CSS preprocessing replaces them with U+000A LINE FEED 22531 // (which *is* CSS whitespace) 22532 // https://www.w3.org/TR/css-syntax-3/#input-preprocessing 22533 ret = ret.replace( rtrimCSS, "$1" ) || undefined; 22534 } 22535 22536 if ( ret === "" && !isAttached( elem ) ) { 22537 ret = jQuery.style( elem, name ); 22538 } 22539 22540 // A tribute to the "awesome hack by Dean Edwards" 22541 // Android Browser returns percentage for some values, 22542 // but width seems to be reliably pixels. 22543 // This is against the CSSOM draft spec: 22544 // https://drafts.csswg.org/cssom/#resolved-values 22545 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { 22546 22547 // Remember the original values 22548 width = style.width; 22549 minWidth = style.minWidth; 22550 maxWidth = style.maxWidth; 22551 22552 // Put in the new values to get a computed value out 22553 style.minWidth = style.maxWidth = style.width = ret; 22554 ret = computed.width; 22555 22556 // Revert the changed values 22557 style.width = width; 22558 style.minWidth = minWidth; 22559 style.maxWidth = maxWidth; 22560 } 22561 } 22562 22563 return ret !== undefined ? 22564 22565 // Support: IE <=9 - 11 only 22566 // IE returns zIndex value as an integer. 22567 ret + "" : 22568 ret; 22569 } 22570 22571 22572 function addGetHookIf( conditionFn, hookFn ) { 22573 22574 // Define the hook, we'll check on the first run if it's really needed. 22575 return { 22576 get: function() { 22577 if ( conditionFn() ) { 22578 22579 // Hook not needed (or it's not possible to use it due 22580 // to missing dependency), remove it. 22581 delete this.get; 22582 return; 22583 } 22584 22585 // Hook needed; redefine it so that the support test is not executed again. 22586 return ( this.get = hookFn ).apply( this, arguments ); 22587 } 22588 }; 22589 } 22590 22591 22592 var cssPrefixes = [ "Webkit", "Moz", "ms" ], 22593 emptyStyle = document.createElement( "div" ).style, 22594 vendorProps = {}; 22595 22596// Return a vendor-prefixed property or undefined 22597 function vendorPropName( name ) { 22598 22599 // Check for vendor prefixed names 22600 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 22601 i = cssPrefixes.length; 22602 22603 while ( i-- ) { 22604 name = cssPrefixes[ i ] + capName; 22605 if ( name in emptyStyle ) { 22606 return name; 22607 } 22608 } 22609 } 22610 22611// Return a potentially-mapped jQuery.cssProps or vendor prefixed property 22612 function finalPropName( name ) { 22613 var final = jQuery.cssProps[ name ] || vendorProps[ name ]; 22614 22615 if ( final ) { 22616 return final; 22617 } 22618 if ( name in emptyStyle ) { 22619 return name; 22620 } 22621 return vendorProps[ name ] = vendorPropName( name ) || name; 22622 } 22623 22624 22625 var 22626 22627 // Swappable if display is none or starts with table 22628 // except "table", "table-cell", or "table-caption" 22629 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 22630 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 22631 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 22632 cssNormalTransform = { 22633 letterSpacing: "0", 22634 fontWeight: "400" 22635 }; 22636 22637 function setPositiveNumber( _elem, value, subtract ) { 22638 22639 // Any relative (+/-) values have already been 22640 // normalized at this point 22641 var matches = rcssNum.exec( value ); 22642 return matches ? 22643 22644 // Guard against undefined "subtract", e.g., when used as in cssHooks 22645 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 22646 value; 22647 } 22648 22649 function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { 22650 var i = dimension === "width" ? 1 : 0, 22651 extra = 0, 22652 delta = 0, 22653 marginDelta = 0; 22654 22655 // Adjustment may not be necessary 22656 if ( box === ( isBorderBox ? "border" : "content" ) ) { 22657 return 0; 22658 } 22659 22660 for ( ; i < 4; i += 2 ) { 22661 22662 // Both box models exclude margin 22663 // Count margin delta separately to only add it after scroll gutter adjustment. 22664 // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). 22665 if ( box === "margin" ) { 22666 marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); 22667 } 22668 22669 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 22670 if ( !isBorderBox ) { 22671 22672 // Add padding 22673 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 22674 22675 // For "border" or "margin", add border 22676 if ( box !== "padding" ) { 22677 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 22678 22679 // But still keep track of it otherwise 22680 } else { 22681 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 22682 } 22683 22684 // If we get here with a border-box (content + padding + border), we're seeking "content" or 22685 // "padding" or "margin" 22686 } else { 22687 22688 // For "content", subtract padding 22689 if ( box === "content" ) { 22690 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 22691 } 22692 22693 // For "content" or "padding", subtract border 22694 if ( box !== "margin" ) { 22695 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 22696 } 22697 } 22698 } 22699 22700 // Account for positive content-box scroll gutter when requested by providing computedVal 22701 if ( !isBorderBox && computedVal >= 0 ) { 22702 22703 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 22704 // Assuming integer scroll gutter, subtract the rest and round down 22705 delta += Math.max( 0, Math.ceil( 22706 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 22707 computedVal - 22708 delta - 22709 extra - 22710 0.5 22711 22712 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter 22713 // Use an explicit zero to avoid NaN (gh-3964) 22714 ) ) || 0; 22715 } 22716 22717 return delta + marginDelta; 22718 } 22719 22720 function getWidthOrHeight( elem, dimension, extra ) { 22721 22722 // Start with computed style 22723 var styles = getStyles( elem ), 22724 22725 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). 22726 // Fake content-box until we know it's needed to know the true value. 22727 boxSizingNeeded = !support.boxSizingReliable() || extra, 22728 isBorderBox = boxSizingNeeded && 22729 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 22730 valueIsBorderBox = isBorderBox, 22731 22732 val = curCSS( elem, dimension, styles ), 22733 offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); 22734 22735 // Support: Firefox <=54 22736 // Return a confounding non-pixel value or feign ignorance, as appropriate. 22737 if ( rnumnonpx.test( val ) ) { 22738 if ( !extra ) { 22739 return val; 22740 } 22741 val = "auto"; 22742 } 22743 22744 22745 // Support: IE 9 - 11 only 22746 // Use offsetWidth/offsetHeight for when box sizing is unreliable. 22747 // In those cases, the computed value can be trusted to be border-box. 22748 if ( ( !support.boxSizingReliable() && isBorderBox || 22749 22750 // Support: IE 10 - 11+, Edge 15 - 18+ 22751 // IE/Edge misreport `getComputedStyle` of table rows with width/height 22752 // set in CSS while `offset*` properties report correct values. 22753 // Interestingly, in some cases IE 9 doesn't suffer from this issue. 22754 !support.reliableTrDimensions() && nodeName( elem, "tr" ) || 22755 22756 // Fall back to offsetWidth/offsetHeight when value is "auto" 22757 // This happens for inline elements with no explicit setting (gh-3571) 22758 val === "auto" || 22759 22760 // Support: Android <=4.1 - 4.3 only 22761 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 22762 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && 22763 22764 // Make sure the element is visible & connected 22765 elem.getClientRects().length ) { 22766 22767 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 22768 22769 // Where available, offsetWidth/offsetHeight approximate border box dimensions. 22770 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the 22771 // retrieved value as a content box dimension. 22772 valueIsBorderBox = offsetProp in elem; 22773 if ( valueIsBorderBox ) { 22774 val = elem[ offsetProp ]; 22775 } 22776 } 22777 22778 // Normalize "" and auto 22779 val = parseFloat( val ) || 0; 22780 22781 // Adjust for the element's box model 22782 return ( val + 22783 boxModelAdjustment( 22784 elem, 22785 dimension, 22786 extra || ( isBorderBox ? "border" : "content" ), 22787 valueIsBorderBox, 22788 styles, 22789 22790 // Provide the current computed size to request scroll gutter calculation (gh-3589) 22791 val 22792 ) 22793 ) + "px"; 22794 } 22795 22796 jQuery.extend( { 22797 22798 // Add in style property hooks for overriding the default 22799 // behavior of getting and setting a style property 22800 cssHooks: { 22801 opacity: { 22802 get: function( elem, computed ) { 22803 if ( computed ) { 22804 22805 // We should always get a number back from opacity 22806 var ret = curCSS( elem, "opacity" ); 22807 return ret === "" ? "1" : ret; 22808 } 22809 } 22810 } 22811 }, 22812 22813 // Don't automatically add "px" to these possibly-unitless properties 22814 cssNumber: { 22815 animationIterationCount: true, 22816 aspectRatio: true, 22817 borderImageSlice: true, 22818 columnCount: true, 22819 flexGrow: true, 22820 flexShrink: true, 22821 fontWeight: true, 22822 gridArea: true, 22823 gridColumn: true, 22824 gridColumnEnd: true, 22825 gridColumnStart: true, 22826 gridRow: true, 22827 gridRowEnd: true, 22828 gridRowStart: true, 22829 lineHeight: true, 22830 opacity: true, 22831 order: true, 22832 orphans: true, 22833 scale: true, 22834 widows: true, 22835 zIndex: true, 22836 zoom: true, 22837 22838 // SVG-related 22839 fillOpacity: true, 22840 floodOpacity: true, 22841 stopOpacity: true, 22842 strokeMiterlimit: true, 22843 strokeOpacity: true 22844 }, 22845 22846 // Add in properties whose names you wish to fix before 22847 // setting or getting the value 22848 cssProps: {}, 22849 22850 // Get and set the style property on a DOM Node 22851 style: function( elem, name, value, extra ) { 22852 22853 // Don't set styles on text and comment nodes 22854 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 22855 return; 22856 } 22857 22858 // Make sure that we're working with the right name 22859 var ret, type, hooks, 22860 origName = camelCase( name ), 22861 isCustomProp = rcustomProp.test( name ), 22862 style = elem.style; 22863 22864 // Make sure that we're working with the right name. We don't 22865 // want to query the value if it is a CSS custom property 22866 // since they are user-defined. 22867 if ( !isCustomProp ) { 22868 name = finalPropName( origName ); 22869 } 22870 22871 // Gets hook for the prefixed version, then unprefixed version 22872 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 22873 22874 // Check if we're setting a value 22875 if ( value !== undefined ) { 22876 type = typeof value; 22877 22878 // Convert "+=" or "-=" to relative numbers (trac-7345) 22879 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 22880 value = adjustCSS( elem, name, ret ); 22881 22882 // Fixes bug trac-9237 22883 type = "number"; 22884 } 22885 22886 // Make sure that null and NaN values aren't set (trac-7116) 22887 if ( value == null || value !== value ) { 22888 return; 22889 } 22890 22891 // If a number was passed in, add the unit (except for certain CSS properties) 22892 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append 22893 // "px" to a few hardcoded values. 22894 if ( type === "number" && !isCustomProp ) { 22895 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 22896 } 22897 22898 // background-* props affect original clone's values 22899 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 22900 style[ name ] = "inherit"; 22901 } 22902 22903 // If a hook was provided, use that value, otherwise just set the specified value 22904 if ( !hooks || !( "set" in hooks ) || 22905 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 22906 22907 if ( isCustomProp ) { 22908 style.setProperty( name, value ); 22909 } else { 22910 style[ name ] = value; 22911 } 22912 } 22913 22914 } else { 22915 22916 // If a hook was provided get the non-computed value from there 22917 if ( hooks && "get" in hooks && 22918 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 22919 22920 return ret; 22921 } 22922 22923 // Otherwise just get the value from the style object 22924 return style[ name ]; 22925 } 22926 }, 22927 22928 css: function( elem, name, extra, styles ) { 22929 var val, num, hooks, 22930 origName = camelCase( name ), 22931 isCustomProp = rcustomProp.test( name ); 22932 22933 // Make sure that we're working with the right name. We don't 22934 // want to modify the value if it is a CSS custom property 22935 // since they are user-defined. 22936 if ( !isCustomProp ) { 22937 name = finalPropName( origName ); 22938 } 22939 22940 // Try prefixed name followed by the unprefixed name 22941 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 22942 22943 // If a hook was provided get the computed value from there 22944 if ( hooks && "get" in hooks ) { 22945 val = hooks.get( elem, true, extra ); 22946 } 22947 22948 // Otherwise, if a way to get the computed value exists, use that 22949 if ( val === undefined ) { 22950 val = curCSS( elem, name, styles ); 22951 } 22952 22953 // Convert "normal" to computed value 22954 if ( val === "normal" && name in cssNormalTransform ) { 22955 val = cssNormalTransform[ name ]; 22956 } 22957 22958 // Make numeric if forced or a qualifier was provided and val looks numeric 22959 if ( extra === "" || extra ) { 22960 num = parseFloat( val ); 22961 return extra === true || isFinite( num ) ? num || 0 : val; 22962 } 22963 22964 return val; 22965 } 22966 } ); 22967 22968 jQuery.each( [ "height", "width" ], function( _i, dimension ) { 22969 jQuery.cssHooks[ dimension ] = { 22970 get: function( elem, computed, extra ) { 22971 if ( computed ) { 22972 22973 // Certain elements can have dimension info if we invisibly show them 22974 // but it must have a current display style that would benefit 22975 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 22976 22977 // Support: Safari 8+ 22978 // Table columns in Safari have non-zero offsetWidth & zero 22979 // getBoundingClientRect().width unless display is changed. 22980 // Support: IE <=11 only 22981 // Running getBoundingClientRect on a disconnected node 22982 // in IE throws an error. 22983 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 22984 swap( elem, cssShow, function() { 22985 return getWidthOrHeight( elem, dimension, extra ); 22986 } ) : 22987 getWidthOrHeight( elem, dimension, extra ); 22988 } 22989 }, 22990 22991 set: function( elem, value, extra ) { 22992 var matches, 22993 styles = getStyles( elem ), 22994 22995 // Only read styles.position if the test has a chance to fail 22996 // to avoid forcing a reflow. 22997 scrollboxSizeBuggy = !support.scrollboxSize() && 22998 styles.position === "absolute", 22999 23000 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) 23001 boxSizingNeeded = scrollboxSizeBuggy || extra, 23002 isBorderBox = boxSizingNeeded && 23003 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 23004 subtract = extra ? 23005 boxModelAdjustment( 23006 elem, 23007 dimension, 23008 extra, 23009 isBorderBox, 23010 styles 23011 ) : 23012 0; 23013 23014 // Account for unreliable border-box dimensions by comparing offset* to computed and 23015 // faking a content-box to get border and padding (gh-3699) 23016 if ( isBorderBox && scrollboxSizeBuggy ) { 23017 subtract -= Math.ceil( 23018 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 23019 parseFloat( styles[ dimension ] ) - 23020 boxModelAdjustment( elem, dimension, "border", false, styles ) - 23021 0.5 23022 ); 23023 } 23024 23025 // Convert to pixels if value adjustment is needed 23026 if ( subtract && ( matches = rcssNum.exec( value ) ) && 23027 ( matches[ 3 ] || "px" ) !== "px" ) { 23028 23029 elem.style[ dimension ] = value; 23030 value = jQuery.css( elem, dimension ); 23031 } 23032 23033 return setPositiveNumber( elem, value, subtract ); 23034 } 23035 }; 23036 } ); 23037 23038 jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 23039 function( elem, computed ) { 23040 if ( computed ) { 23041 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 23042 elem.getBoundingClientRect().left - 23043 swap( elem, { marginLeft: 0 }, function() { 23044 return elem.getBoundingClientRect().left; 23045 } ) 23046 ) + "px"; 23047 } 23048 } 23049 ); 23050 23051// These hooks are used by animate to expand properties 23052 jQuery.each( { 23053 margin: "", 23054 padding: "", 23055 border: "Width" 23056 }, function( prefix, suffix ) { 23057 jQuery.cssHooks[ prefix + suffix ] = { 23058 expand: function( value ) { 23059 var i = 0, 23060 expanded = {}, 23061 23062 // Assumes a single number if not a string 23063 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 23064 23065 for ( ; i < 4; i++ ) { 23066 expanded[ prefix + cssExpand[ i ] + suffix ] = 23067 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 23068 } 23069 23070 return expanded; 23071 } 23072 }; 23073 23074 if ( prefix !== "margin" ) { 23075 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 23076 } 23077 } ); 23078 23079 jQuery.fn.extend( { 23080 css: function( name, value ) { 23081 return access( this, function( elem, name, value ) { 23082 var styles, len, 23083 map = {}, 23084 i = 0; 23085 23086 if ( Array.isArray( name ) ) { 23087 styles = getStyles( elem ); 23088 len = name.length; 23089 23090 for ( ; i < len; i++ ) { 23091 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 23092 } 23093 23094 return map; 23095 } 23096 23097 return value !== undefined ? 23098 jQuery.style( elem, name, value ) : 23099 jQuery.css( elem, name ); 23100 }, name, value, arguments.length > 1 ); 23101 } 23102 } ); 23103 23104 23105 function Tween( elem, options, prop, end, easing ) { 23106 return new Tween.prototype.init( elem, options, prop, end, easing ); 23107 } 23108 jQuery.Tween = Tween; 23109 23110 Tween.prototype = { 23111 constructor: Tween, 23112 init: function( elem, options, prop, end, easing, unit ) { 23113 this.elem = elem; 23114 this.prop = prop; 23115 this.easing = easing || jQuery.easing._default; 23116 this.options = options; 23117 this.start = this.now = this.cur(); 23118 this.end = end; 23119 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 23120 }, 23121 cur: function() { 23122 var hooks = Tween.propHooks[ this.prop ]; 23123 23124 return hooks && hooks.get ? 23125 hooks.get( this ) : 23126 Tween.propHooks._default.get( this ); 23127 }, 23128 run: function( percent ) { 23129 var eased, 23130 hooks = Tween.propHooks[ this.prop ]; 23131 23132 if ( this.options.duration ) { 23133 this.pos = eased = jQuery.easing[ this.easing ]( 23134 percent, this.options.duration * percent, 0, 1, this.options.duration 23135 ); 23136 } else { 23137 this.pos = eased = percent; 23138 } 23139 this.now = ( this.end - this.start ) * eased + this.start; 23140 23141 if ( this.options.step ) { 23142 this.options.step.call( this.elem, this.now, this ); 23143 } 23144 23145 if ( hooks && hooks.set ) { 23146 hooks.set( this ); 23147 } else { 23148 Tween.propHooks._default.set( this ); 23149 } 23150 return this; 23151 } 23152 }; 23153 23154 Tween.prototype.init.prototype = Tween.prototype; 23155 23156 Tween.propHooks = { 23157 _default: { 23158 get: function( tween ) { 23159 var result; 23160 23161 // Use a property on the element directly when it is not a DOM element, 23162 // or when there is no matching style property that exists. 23163 if ( tween.elem.nodeType !== 1 || 23164 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 23165 return tween.elem[ tween.prop ]; 23166 } 23167 23168 // Passing an empty string as a 3rd parameter to .css will automatically 23169 // attempt a parseFloat and fallback to a string if the parse fails. 23170 // Simple values such as "10px" are parsed to Float; 23171 // complex values such as "rotate(1rad)" are returned as-is. 23172 result = jQuery.css( tween.elem, tween.prop, "" ); 23173 23174 // Empty strings, null, undefined and "auto" are converted to 0. 23175 return !result || result === "auto" ? 0 : result; 23176 }, 23177 set: function( tween ) { 23178 23179 // Use step hook for back compat. 23180 // Use cssHook if its there. 23181 // Use .style if available and use plain properties where available. 23182 if ( jQuery.fx.step[ tween.prop ] ) { 23183 jQuery.fx.step[ tween.prop ]( tween ); 23184 } else if ( tween.elem.nodeType === 1 && ( 23185 jQuery.cssHooks[ tween.prop ] || 23186 tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { 23187 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 23188 } else { 23189 tween.elem[ tween.prop ] = tween.now; 23190 } 23191 } 23192 } 23193 }; 23194 23195// Support: IE <=9 only 23196// Panic based approach to setting things on disconnected nodes 23197 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 23198 set: function( tween ) { 23199 if ( tween.elem.nodeType && tween.elem.parentNode ) { 23200 tween.elem[ tween.prop ] = tween.now; 23201 } 23202 } 23203 }; 23204 23205 jQuery.easing = { 23206 linear: function( p ) { 23207 return p; 23208 }, 23209 swing: function( p ) { 23210 return 0.5 - Math.cos( p * Math.PI ) / 2; 23211 }, 23212 _default: "swing" 23213 }; 23214 23215 jQuery.fx = Tween.prototype.init; 23216 23217// Back compat <1.8 extension point 23218 jQuery.fx.step = {}; 23219 23220 23221 23222 23223 var 23224 fxNow, inProgress, 23225 rfxtypes = /^(?:toggle|show|hide)$/, 23226 rrun = /queueHooks$/; 23227 23228 function schedule() { 23229 if ( inProgress ) { 23230 if ( document.hidden === false && window.requestAnimationFrame ) { 23231 window.requestAnimationFrame( schedule ); 23232 } else { 23233 window.setTimeout( schedule, jQuery.fx.interval ); 23234 } 23235 23236 jQuery.fx.tick(); 23237 } 23238 } 23239 23240// Animations created synchronously will run synchronously 23241 function createFxNow() { 23242 window.setTimeout( function() { 23243 fxNow = undefined; 23244 } ); 23245 return ( fxNow = Date.now() ); 23246 } 23247 23248// Generate parameters to create a standard animation 23249 function genFx( type, includeWidth ) { 23250 var which, 23251 i = 0, 23252 attrs = { height: type }; 23253 23254 // If we include width, step value is 1 to do all cssExpand values, 23255 // otherwise step value is 2 to skip over Left and Right 23256 includeWidth = includeWidth ? 1 : 0; 23257 for ( ; i < 4; i += 2 - includeWidth ) { 23258 which = cssExpand[ i ]; 23259 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 23260 } 23261 23262 if ( includeWidth ) { 23263 attrs.opacity = attrs.width = type; 23264 } 23265 23266 return attrs; 23267 } 23268 23269 function createTween( value, prop, animation ) { 23270 var tween, 23271 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 23272 index = 0, 23273 length = collection.length; 23274 for ( ; index < length; index++ ) { 23275 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 23276 23277 // We're done with this property 23278 return tween; 23279 } 23280 } 23281 } 23282 23283 function defaultPrefilter( elem, props, opts ) { 23284 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 23285 isBox = "width" in props || "height" in props, 23286 anim = this, 23287 orig = {}, 23288 style = elem.style, 23289 hidden = elem.nodeType && isHiddenWithinTree( elem ), 23290 dataShow = dataPriv.get( elem, "fxshow" ); 23291 23292 // Queue-skipping animations hijack the fx hooks 23293 if ( !opts.queue ) { 23294 hooks = jQuery._queueHooks( elem, "fx" ); 23295 if ( hooks.unqueued == null ) { 23296 hooks.unqueued = 0; 23297 oldfire = hooks.empty.fire; 23298 hooks.empty.fire = function() { 23299 if ( !hooks.unqueued ) { 23300 oldfire(); 23301 } 23302 }; 23303 } 23304 hooks.unqueued++; 23305 23306 anim.always( function() { 23307 23308 // Ensure the complete handler is called before this completes 23309 anim.always( function() { 23310 hooks.unqueued--; 23311 if ( !jQuery.queue( elem, "fx" ).length ) { 23312 hooks.empty.fire(); 23313 } 23314 } ); 23315 } ); 23316 } 23317 23318 // Detect show/hide animations 23319 for ( prop in props ) { 23320 value = props[ prop ]; 23321 if ( rfxtypes.test( value ) ) { 23322 delete props[ prop ]; 23323 toggle = toggle || value === "toggle"; 23324 if ( value === ( hidden ? "hide" : "show" ) ) { 23325 23326 // Pretend to be hidden if this is a "show" and 23327 // there is still data from a stopped show/hide 23328 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 23329 hidden = true; 23330 23331 // Ignore all other no-op show/hide data 23332 } else { 23333 continue; 23334 } 23335 } 23336 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 23337 } 23338 } 23339 23340 // Bail out if this is a no-op like .hide().hide() 23341 propTween = !jQuery.isEmptyObject( props ); 23342 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 23343 return; 23344 } 23345 23346 // Restrict "overflow" and "display" styles during box animations 23347 if ( isBox && elem.nodeType === 1 ) { 23348 23349 // Support: IE <=9 - 11, Edge 12 - 15 23350 // Record all 3 overflow attributes because IE does not infer the shorthand 23351 // from identically-valued overflowX and overflowY and Edge just mirrors 23352 // the overflowX value there. 23353 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 23354 23355 // Identify a display type, preferring old show/hide data over the CSS cascade 23356 restoreDisplay = dataShow && dataShow.display; 23357 if ( restoreDisplay == null ) { 23358 restoreDisplay = dataPriv.get( elem, "display" ); 23359 } 23360 display = jQuery.css( elem, "display" ); 23361 if ( display === "none" ) { 23362 if ( restoreDisplay ) { 23363 display = restoreDisplay; 23364 } else { 23365 23366 // Get nonempty value(s) by temporarily forcing visibility 23367 showHide( [ elem ], true ); 23368 restoreDisplay = elem.style.display || restoreDisplay; 23369 display = jQuery.css( elem, "display" ); 23370 showHide( [ elem ] ); 23371 } 23372 } 23373 23374 // Animate inline elements as inline-block 23375 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 23376 if ( jQuery.css( elem, "float" ) === "none" ) { 23377 23378 // Restore the original display value at the end of pure show/hide animations 23379 if ( !propTween ) { 23380 anim.done( function() { 23381 style.display = restoreDisplay; 23382 } ); 23383 if ( restoreDisplay == null ) { 23384 display = style.display; 23385 restoreDisplay = display === "none" ? "" : display; 23386 } 23387 } 23388 style.display = "inline-block"; 23389 } 23390 } 23391 } 23392 23393 if ( opts.overflow ) { 23394 style.overflow = "hidden"; 23395 anim.always( function() { 23396 style.overflow = opts.overflow[ 0 ]; 23397 style.overflowX = opts.overflow[ 1 ]; 23398 style.overflowY = opts.overflow[ 2 ]; 23399 } ); 23400 } 23401 23402 // Implement show/hide animations 23403 propTween = false; 23404 for ( prop in orig ) { 23405 23406 // General show/hide setup for this element animation 23407 if ( !propTween ) { 23408 if ( dataShow ) { 23409 if ( "hidden" in dataShow ) { 23410 hidden = dataShow.hidden; 23411 } 23412 } else { 23413 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 23414 } 23415 23416 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 23417 if ( toggle ) { 23418 dataShow.hidden = !hidden; 23419 } 23420 23421 // Show elements before animating them 23422 if ( hidden ) { 23423 showHide( [ elem ], true ); 23424 } 23425 23426 /* eslint-disable no-loop-func */ 23427 23428 anim.done( function() { 23429 23430 /* eslint-enable no-loop-func */ 23431 23432 // The final step of a "hide" animation is actually hiding the element 23433 if ( !hidden ) { 23434 showHide( [ elem ] ); 23435 } 23436 dataPriv.remove( elem, "fxshow" ); 23437 for ( prop in orig ) { 23438 jQuery.style( elem, prop, orig[ prop ] ); 23439 } 23440 } ); 23441 } 23442 23443 // Per-property setup 23444 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 23445 if ( !( prop in dataShow ) ) { 23446 dataShow[ prop ] = propTween.start; 23447 if ( hidden ) { 23448 propTween.end = propTween.start; 23449 propTween.start = 0; 23450 } 23451 } 23452 } 23453 } 23454 23455 function propFilter( props, specialEasing ) { 23456 var index, name, easing, value, hooks; 23457 23458 // camelCase, specialEasing and expand cssHook pass 23459 for ( index in props ) { 23460 name = camelCase( index ); 23461 easing = specialEasing[ name ]; 23462 value = props[ index ]; 23463 if ( Array.isArray( value ) ) { 23464 easing = value[ 1 ]; 23465 value = props[ index ] = value[ 0 ]; 23466 } 23467 23468 if ( index !== name ) { 23469 props[ name ] = value; 23470 delete props[ index ]; 23471 } 23472 23473 hooks = jQuery.cssHooks[ name ]; 23474 if ( hooks && "expand" in hooks ) { 23475 value = hooks.expand( value ); 23476 delete props[ name ]; 23477 23478 // Not quite $.extend, this won't overwrite existing keys. 23479 // Reusing 'index' because we have the correct "name" 23480 for ( index in value ) { 23481 if ( !( index in props ) ) { 23482 props[ index ] = value[ index ]; 23483 specialEasing[ index ] = easing; 23484 } 23485 } 23486 } else { 23487 specialEasing[ name ] = easing; 23488 } 23489 } 23490 } 23491 23492 function Animation( elem, properties, options ) { 23493 var result, 23494 stopped, 23495 index = 0, 23496 length = Animation.prefilters.length, 23497 deferred = jQuery.Deferred().always( function() { 23498 23499 // Don't match elem in the :animated selector 23500 delete tick.elem; 23501 } ), 23502 tick = function() { 23503 if ( stopped ) { 23504 return false; 23505 } 23506 var currentTime = fxNow || createFxNow(), 23507 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 23508 23509 // Support: Android 2.3 only 23510 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) 23511 temp = remaining / animation.duration || 0, 23512 percent = 1 - temp, 23513 index = 0, 23514 length = animation.tweens.length; 23515 23516 for ( ; index < length; index++ ) { 23517 animation.tweens[ index ].run( percent ); 23518 } 23519 23520 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 23521 23522 // If there's more to do, yield 23523 if ( percent < 1 && length ) { 23524 return remaining; 23525 } 23526 23527 // If this was an empty animation, synthesize a final progress notification 23528 if ( !length ) { 23529 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 23530 } 23531 23532 // Resolve the animation and report its conclusion 23533 deferred.resolveWith( elem, [ animation ] ); 23534 return false; 23535 }, 23536 animation = deferred.promise( { 23537 elem: elem, 23538 props: jQuery.extend( {}, properties ), 23539 opts: jQuery.extend( true, { 23540 specialEasing: {}, 23541 easing: jQuery.easing._default 23542 }, options ), 23543 originalProperties: properties, 23544 originalOptions: options, 23545 startTime: fxNow || createFxNow(), 23546 duration: options.duration, 23547 tweens: [], 23548 createTween: function( prop, end ) { 23549 var tween = jQuery.Tween( elem, animation.opts, prop, end, 23550 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 23551 animation.tweens.push( tween ); 23552 return tween; 23553 }, 23554 stop: function( gotoEnd ) { 23555 var index = 0, 23556 23557 // If we are going to the end, we want to run all the tweens 23558 // otherwise we skip this part 23559 length = gotoEnd ? animation.tweens.length : 0; 23560 if ( stopped ) { 23561 return this; 23562 } 23563 stopped = true; 23564 for ( ; index < length; index++ ) { 23565 animation.tweens[ index ].run( 1 ); 23566 } 23567 23568 // Resolve when we played the last frame; otherwise, reject 23569 if ( gotoEnd ) { 23570 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 23571 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 23572 } else { 23573 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 23574 } 23575 return this; 23576 } 23577 } ), 23578 props = animation.props; 23579 23580 propFilter( props, animation.opts.specialEasing ); 23581 23582 for ( ; index < length; index++ ) { 23583 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 23584 if ( result ) { 23585 if ( isFunction( result.stop ) ) { 23586 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 23587 result.stop.bind( result ); 23588 } 23589 return result; 23590 } 23591 } 23592 23593 jQuery.map( props, createTween, animation ); 23594 23595 if ( isFunction( animation.opts.start ) ) { 23596 animation.opts.start.call( elem, animation ); 23597 } 23598 23599 // Attach callbacks from options 23600 animation 23601 .progress( animation.opts.progress ) 23602 .done( animation.opts.done, animation.opts.complete ) 23603 .fail( animation.opts.fail ) 23604 .always( animation.opts.always ); 23605 23606 jQuery.fx.timer( 23607 jQuery.extend( tick, { 23608 elem: elem, 23609 anim: animation, 23610 queue: animation.opts.queue 23611 } ) 23612 ); 23613 23614 return animation; 23615 } 23616 23617 jQuery.Animation = jQuery.extend( Animation, { 23618 23619 tweeners: { 23620 "*": [ function( prop, value ) { 23621 var tween = this.createTween( prop, value ); 23622 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 23623 return tween; 23624 } ] 23625 }, 23626 23627 tweener: function( props, callback ) { 23628 if ( isFunction( props ) ) { 23629 callback = props; 23630 props = [ "*" ]; 23631 } else { 23632 props = props.match( rnothtmlwhite ); 23633 } 23634 23635 var prop, 23636 index = 0, 23637 length = props.length; 23638 23639 for ( ; index < length; index++ ) { 23640 prop = props[ index ]; 23641 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 23642 Animation.tweeners[ prop ].unshift( callback ); 23643 } 23644 }, 23645 23646 prefilters: [ defaultPrefilter ], 23647 23648 prefilter: function( callback, prepend ) { 23649 if ( prepend ) { 23650 Animation.prefilters.unshift( callback ); 23651 } else { 23652 Animation.prefilters.push( callback ); 23653 } 23654 } 23655 } ); 23656 23657 jQuery.speed = function( speed, easing, fn ) { 23658 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 23659 complete: fn || !fn && easing || 23660 isFunction( speed ) && speed, 23661 duration: speed, 23662 easing: fn && easing || easing && !isFunction( easing ) && easing 23663 }; 23664 23665 // Go to the end state if fx are off 23666 if ( jQuery.fx.off ) { 23667 opt.duration = 0; 23668 23669 } else { 23670 if ( typeof opt.duration !== "number" ) { 23671 if ( opt.duration in jQuery.fx.speeds ) { 23672 opt.duration = jQuery.fx.speeds[ opt.duration ]; 23673 23674 } else { 23675 opt.duration = jQuery.fx.speeds._default; 23676 } 23677 } 23678 } 23679 23680 // Normalize opt.queue - true/undefined/null -> "fx" 23681 if ( opt.queue == null || opt.queue === true ) { 23682 opt.queue = "fx"; 23683 } 23684 23685 // Queueing 23686 opt.old = opt.complete; 23687 23688 opt.complete = function() { 23689 if ( isFunction( opt.old ) ) { 23690 opt.old.call( this ); 23691 } 23692 23693 if ( opt.queue ) { 23694 jQuery.dequeue( this, opt.queue ); 23695 } 23696 }; 23697 23698 return opt; 23699 }; 23700 23701 jQuery.fn.extend( { 23702 fadeTo: function( speed, to, easing, callback ) { 23703 23704 // Show any hidden elements after setting opacity to 0 23705 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 23706 23707 // Animate to the value specified 23708 .end().animate( { opacity: to }, speed, easing, callback ); 23709 }, 23710 animate: function( prop, speed, easing, callback ) { 23711 var empty = jQuery.isEmptyObject( prop ), 23712 optall = jQuery.speed( speed, easing, callback ), 23713 doAnimation = function() { 23714 23715 // Operate on a copy of prop so per-property easing won't be lost 23716 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 23717 23718 // Empty animations, or finishing resolves immediately 23719 if ( empty || dataPriv.get( this, "finish" ) ) { 23720 anim.stop( true ); 23721 } 23722 }; 23723 23724 doAnimation.finish = doAnimation; 23725 23726 return empty || optall.queue === false ? 23727 this.each( doAnimation ) : 23728 this.queue( optall.queue, doAnimation ); 23729 }, 23730 stop: function( type, clearQueue, gotoEnd ) { 23731 var stopQueue = function( hooks ) { 23732 var stop = hooks.stop; 23733 delete hooks.stop; 23734 stop( gotoEnd ); 23735 }; 23736 23737 if ( typeof type !== "string" ) { 23738 gotoEnd = clearQueue; 23739 clearQueue = type; 23740 type = undefined; 23741 } 23742 if ( clearQueue ) { 23743 this.queue( type || "fx", [] ); 23744 } 23745 23746 return this.each( function() { 23747 var dequeue = true, 23748 index = type != null && type + "queueHooks", 23749 timers = jQuery.timers, 23750 data = dataPriv.get( this ); 23751 23752 if ( index ) { 23753 if ( data[ index ] && data[ index ].stop ) { 23754 stopQueue( data[ index ] ); 23755 } 23756 } else { 23757 for ( index in data ) { 23758 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 23759 stopQueue( data[ index ] ); 23760 } 23761 } 23762 } 23763 23764 for ( index = timers.length; index--; ) { 23765 if ( timers[ index ].elem === this && 23766 ( type == null || timers[ index ].queue === type ) ) { 23767 23768 timers[ index ].anim.stop( gotoEnd ); 23769 dequeue = false; 23770 timers.splice( index, 1 ); 23771 } 23772 } 23773 23774 // Start the next in the queue if the last step wasn't forced. 23775 // Timers currently will call their complete callbacks, which 23776 // will dequeue but only if they were gotoEnd. 23777 if ( dequeue || !gotoEnd ) { 23778 jQuery.dequeue( this, type ); 23779 } 23780 } ); 23781 }, 23782 finish: function( type ) { 23783 if ( type !== false ) { 23784 type = type || "fx"; 23785 } 23786 return this.each( function() { 23787 var index, 23788 data = dataPriv.get( this ), 23789 queue = data[ type + "queue" ], 23790 hooks = data[ type + "queueHooks" ], 23791 timers = jQuery.timers, 23792 length = queue ? queue.length : 0; 23793 23794 // Enable finishing flag on private data 23795 data.finish = true; 23796 23797 // Empty the queue first 23798 jQuery.queue( this, type, [] ); 23799 23800 if ( hooks && hooks.stop ) { 23801 hooks.stop.call( this, true ); 23802 } 23803 23804 // Look for any active animations, and finish them 23805 for ( index = timers.length; index--; ) { 23806 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 23807 timers[ index ].anim.stop( true ); 23808 timers.splice( index, 1 ); 23809 } 23810 } 23811 23812 // Look for any animations in the old queue and finish them 23813 for ( index = 0; index < length; index++ ) { 23814 if ( queue[ index ] && queue[ index ].finish ) { 23815 queue[ index ].finish.call( this ); 23816 } 23817 } 23818 23819 // Turn off finishing flag 23820 delete data.finish; 23821 } ); 23822 } 23823 } ); 23824 23825 jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { 23826 var cssFn = jQuery.fn[ name ]; 23827 jQuery.fn[ name ] = function( speed, easing, callback ) { 23828 return speed == null || typeof speed === "boolean" ? 23829 cssFn.apply( this, arguments ) : 23830 this.animate( genFx( name, true ), speed, easing, callback ); 23831 }; 23832 } ); 23833 23834// Generate shortcuts for custom animations 23835 jQuery.each( { 23836 slideDown: genFx( "show" ), 23837 slideUp: genFx( "hide" ), 23838 slideToggle: genFx( "toggle" ), 23839 fadeIn: { opacity: "show" }, 23840 fadeOut: { opacity: "hide" }, 23841 fadeToggle: { opacity: "toggle" } 23842 }, function( name, props ) { 23843 jQuery.fn[ name ] = function( speed, easing, callback ) { 23844 return this.animate( props, speed, easing, callback ); 23845 }; 23846 } ); 23847 23848 jQuery.timers = []; 23849 jQuery.fx.tick = function() { 23850 var timer, 23851 i = 0, 23852 timers = jQuery.timers; 23853 23854 fxNow = Date.now(); 23855 23856 for ( ; i < timers.length; i++ ) { 23857 timer = timers[ i ]; 23858 23859 // Run the timer and safely remove it when done (allowing for external removal) 23860 if ( !timer() && timers[ i ] === timer ) { 23861 timers.splice( i--, 1 ); 23862 } 23863 } 23864 23865 if ( !timers.length ) { 23866 jQuery.fx.stop(); 23867 } 23868 fxNow = undefined; 23869 }; 23870 23871 jQuery.fx.timer = function( timer ) { 23872 jQuery.timers.push( timer ); 23873 jQuery.fx.start(); 23874 }; 23875 23876 jQuery.fx.interval = 13; 23877 jQuery.fx.start = function() { 23878 if ( inProgress ) { 23879 return; 23880 } 23881 23882 inProgress = true; 23883 schedule(); 23884 }; 23885 23886 jQuery.fx.stop = function() { 23887 inProgress = null; 23888 }; 23889 23890 jQuery.fx.speeds = { 23891 slow: 600, 23892 fast: 200, 23893 23894 // Default speed 23895 _default: 400 23896 }; 23897 23898 23899// Based off of the plugin by Clint Helfers, with permission. 23900 jQuery.fn.delay = function( time, type ) { 23901 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 23902 type = type || "fx"; 23903 23904 return this.queue( type, function( next, hooks ) { 23905 var timeout = window.setTimeout( next, time ); 23906 hooks.stop = function() { 23907 window.clearTimeout( timeout ); 23908 }; 23909 } ); 23910 }; 23911 23912 23913 ( function() { 23914 var input = document.createElement( "input" ), 23915 select = document.createElement( "select" ), 23916 opt = select.appendChild( document.createElement( "option" ) ); 23917 23918 input.type = "checkbox"; 23919 23920 // Support: Android <=4.3 only 23921 // Default value for a checkbox should be "on" 23922 support.checkOn = input.value !== ""; 23923 23924 // Support: IE <=11 only 23925 // Must access selectedIndex to make default options select 23926 support.optSelected = opt.selected; 23927 23928 // Support: IE <=11 only 23929 // An input loses its value after becoming a radio 23930 input = document.createElement( "input" ); 23931 input.value = "t"; 23932 input.type = "radio"; 23933 support.radioValue = input.value === "t"; 23934 } )(); 23935 23936 23937 var boolHook, 23938 attrHandle = jQuery.expr.attrHandle; 23939 23940 jQuery.fn.extend( { 23941 attr: function( name, value ) { 23942 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 23943 }, 23944 23945 removeAttr: function( name ) { 23946 return this.each( function() { 23947 jQuery.removeAttr( this, name ); 23948 } ); 23949 } 23950 } ); 23951 23952 jQuery.extend( { 23953 attr: function( elem, name, value ) { 23954 var ret, hooks, 23955 nType = elem.nodeType; 23956 23957 // Don't get/set attributes on text, comment and attribute nodes 23958 if ( nType === 3 || nType === 8 || nType === 2 ) { 23959 return; 23960 } 23961 23962 // Fallback to prop when attributes are not supported 23963 if ( typeof elem.getAttribute === "undefined" ) { 23964 return jQuery.prop( elem, name, value ); 23965 } 23966 23967 // Attribute hooks are determined by the lowercase version 23968 // Grab necessary hook if one is defined 23969 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 23970 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 23971 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 23972 } 23973 23974 if ( value !== undefined ) { 23975 if ( value === null ) { 23976 jQuery.removeAttr( elem, name ); 23977 return; 23978 } 23979 23980 if ( hooks && "set" in hooks && 23981 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 23982 return ret; 23983 } 23984 23985 elem.setAttribute( name, value + "" ); 23986 return value; 23987 } 23988 23989 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 23990 return ret; 23991 } 23992 23993 ret = jQuery.find.attr( elem, name ); 23994 23995 // Non-existent attributes return null, we normalize to undefined 23996 return ret == null ? undefined : ret; 23997 }, 23998 23999 attrHooks: { 24000 type: { 24001 set: function( elem, value ) { 24002 if ( !support.radioValue && value === "radio" && 24003 nodeName( elem, "input" ) ) { 24004 var val = elem.value; 24005 elem.setAttribute( "type", value ); 24006 if ( val ) { 24007 elem.value = val; 24008 } 24009 return value; 24010 } 24011 } 24012 } 24013 }, 24014 24015 removeAttr: function( elem, value ) { 24016 var name, 24017 i = 0, 24018 24019 // Attribute names can contain non-HTML whitespace characters 24020 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 24021 attrNames = value && value.match( rnothtmlwhite ); 24022 24023 if ( attrNames && elem.nodeType === 1 ) { 24024 while ( ( name = attrNames[ i++ ] ) ) { 24025 elem.removeAttribute( name ); 24026 } 24027 } 24028 } 24029 } ); 24030 24031// Hooks for boolean attributes 24032 boolHook = { 24033 set: function( elem, value, name ) { 24034 if ( value === false ) { 24035 24036 // Remove boolean attributes when set to false 24037 jQuery.removeAttr( elem, name ); 24038 } else { 24039 elem.setAttribute( name, name ); 24040 } 24041 return name; 24042 } 24043 }; 24044 24045 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { 24046 var getter = attrHandle[ name ] || jQuery.find.attr; 24047 24048 attrHandle[ name ] = function( elem, name, isXML ) { 24049 var ret, handle, 24050 lowercaseName = name.toLowerCase(); 24051 24052 if ( !isXML ) { 24053 24054 // Avoid an infinite loop by temporarily removing this function from the getter 24055 handle = attrHandle[ lowercaseName ]; 24056 attrHandle[ lowercaseName ] = ret; 24057 ret = getter( elem, name, isXML ) != null ? 24058 lowercaseName : 24059 null; 24060 attrHandle[ lowercaseName ] = handle; 24061 } 24062 return ret; 24063 }; 24064 } ); 24065 24066 24067 24068 24069 var rfocusable = /^(?:input|select|textarea|button)$/i, 24070 rclickable = /^(?:a|area)$/i; 24071 24072 jQuery.fn.extend( { 24073 prop: function( name, value ) { 24074 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 24075 }, 24076 24077 removeProp: function( name ) { 24078 return this.each( function() { 24079 delete this[ jQuery.propFix[ name ] || name ]; 24080 } ); 24081 } 24082 } ); 24083 24084 jQuery.extend( { 24085 prop: function( elem, name, value ) { 24086 var ret, hooks, 24087 nType = elem.nodeType; 24088 24089 // Don't get/set properties on text, comment and attribute nodes 24090 if ( nType === 3 || nType === 8 || nType === 2 ) { 24091 return; 24092 } 24093 24094 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 24095 24096 // Fix name and attach hooks 24097 name = jQuery.propFix[ name ] || name; 24098 hooks = jQuery.propHooks[ name ]; 24099 } 24100 24101 if ( value !== undefined ) { 24102 if ( hooks && "set" in hooks && 24103 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 24104 return ret; 24105 } 24106 24107 return ( elem[ name ] = value ); 24108 } 24109 24110 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 24111 return ret; 24112 } 24113 24114 return elem[ name ]; 24115 }, 24116 24117 propHooks: { 24118 tabIndex: { 24119 get: function( elem ) { 24120 24121 // Support: IE <=9 - 11 only 24122 // elem.tabIndex doesn't always return the 24123 // correct value when it hasn't been explicitly set 24124 // Use proper attribute retrieval (trac-12072) 24125 var tabindex = jQuery.find.attr( elem, "tabindex" ); 24126 24127 if ( tabindex ) { 24128 return parseInt( tabindex, 10 ); 24129 } 24130 24131 if ( 24132 rfocusable.test( elem.nodeName ) || 24133 rclickable.test( elem.nodeName ) && 24134 elem.href 24135 ) { 24136 return 0; 24137 } 24138 24139 return -1; 24140 } 24141 } 24142 }, 24143 24144 propFix: { 24145 "for": "htmlFor", 24146 "class": "className" 24147 } 24148 } ); 24149 24150// Support: IE <=11 only 24151// Accessing the selectedIndex property 24152// forces the browser to respect setting selected 24153// on the option 24154// The getter ensures a default option is selected 24155// when in an optgroup 24156// eslint rule "no-unused-expressions" is disabled for this code 24157// since it considers such accessions noop 24158 if ( !support.optSelected ) { 24159 jQuery.propHooks.selected = { 24160 get: function( elem ) { 24161 24162 /* eslint no-unused-expressions: "off" */ 24163 24164 var parent = elem.parentNode; 24165 if ( parent && parent.parentNode ) { 24166 parent.parentNode.selectedIndex; 24167 } 24168 return null; 24169 }, 24170 set: function( elem ) { 24171 24172 /* eslint no-unused-expressions: "off" */ 24173 24174 var parent = elem.parentNode; 24175 if ( parent ) { 24176 parent.selectedIndex; 24177 24178 if ( parent.parentNode ) { 24179 parent.parentNode.selectedIndex; 24180 } 24181 } 24182 } 24183 }; 24184 } 24185 24186 jQuery.each( [ 24187 "tabIndex", 24188 "readOnly", 24189 "maxLength", 24190 "cellSpacing", 24191 "cellPadding", 24192 "rowSpan", 24193 "colSpan", 24194 "useMap", 24195 "frameBorder", 24196 "contentEditable" 24197 ], function() { 24198 jQuery.propFix[ this.toLowerCase() ] = this; 24199 } ); 24200 24201 24202 24203 24204 // Strip and collapse whitespace according to HTML spec 24205 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 24206 function stripAndCollapse( value ) { 24207 var tokens = value.match( rnothtmlwhite ) || []; 24208 return tokens.join( " " ); 24209 } 24210 24211 24212 function getClass( elem ) { 24213 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 24214 } 24215 24216 function classesToArray( value ) { 24217 if ( Array.isArray( value ) ) { 24218 return value; 24219 } 24220 if ( typeof value === "string" ) { 24221 return value.match( rnothtmlwhite ) || []; 24222 } 24223 return []; 24224 } 24225 24226 jQuery.fn.extend( { 24227 addClass: function( value ) { 24228 var classNames, cur, curValue, className, i, finalValue; 24229 24230 if ( isFunction( value ) ) { 24231 return this.each( function( j ) { 24232 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 24233 } ); 24234 } 24235 24236 classNames = classesToArray( value ); 24237 24238 if ( classNames.length ) { 24239 return this.each( function() { 24240 curValue = getClass( this ); 24241 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 24242 24243 if ( cur ) { 24244 for ( i = 0; i < classNames.length; i++ ) { 24245 className = classNames[ i ]; 24246 if ( cur.indexOf( " " + className + " " ) < 0 ) { 24247 cur += className + " "; 24248 } 24249 } 24250 24251 // Only assign if different to avoid unneeded rendering. 24252 finalValue = stripAndCollapse( cur ); 24253 if ( curValue !== finalValue ) { 24254 this.setAttribute( "class", finalValue ); 24255 } 24256 } 24257 } ); 24258 } 24259 24260 return this; 24261 }, 24262 24263 removeClass: function( value ) { 24264 var classNames, cur, curValue, className, i, finalValue; 24265 24266 if ( isFunction( value ) ) { 24267 return this.each( function( j ) { 24268 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 24269 } ); 24270 } 24271 24272 if ( !arguments.length ) { 24273 return this.attr( "class", "" ); 24274 } 24275 24276 classNames = classesToArray( value ); 24277 24278 if ( classNames.length ) { 24279 return this.each( function() { 24280 curValue = getClass( this ); 24281 24282 // This expression is here for better compressibility (see addClass) 24283 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 24284 24285 if ( cur ) { 24286 for ( i = 0; i < classNames.length; i++ ) { 24287 className = classNames[ i ]; 24288 24289 // Remove *all* instances 24290 while ( cur.indexOf( " " + className + " " ) > -1 ) { 24291 cur = cur.replace( " " + className + " ", " " ); 24292 } 24293 } 24294 24295 // Only assign if different to avoid unneeded rendering. 24296 finalValue = stripAndCollapse( cur ); 24297 if ( curValue !== finalValue ) { 24298 this.setAttribute( "class", finalValue ); 24299 } 24300 } 24301 } ); 24302 } 24303 24304 return this; 24305 }, 24306 24307 toggleClass: function( value, stateVal ) { 24308 var classNames, className, i, self, 24309 type = typeof value, 24310 isValidValue = type === "string" || Array.isArray( value ); 24311 24312 if ( isFunction( value ) ) { 24313 return this.each( function( i ) { 24314 jQuery( this ).toggleClass( 24315 value.call( this, i, getClass( this ), stateVal ), 24316 stateVal 24317 ); 24318 } ); 24319 } 24320 24321 if ( typeof stateVal === "boolean" && isValidValue ) { 24322 return stateVal ? this.addClass( value ) : this.removeClass( value ); 24323 } 24324 24325 classNames = classesToArray( value ); 24326 24327 return this.each( function() { 24328 if ( isValidValue ) { 24329 24330 // Toggle individual class names 24331 self = jQuery( this ); 24332 24333 for ( i = 0; i < classNames.length; i++ ) { 24334 className = classNames[ i ]; 24335 24336 // Check each className given, space separated list 24337 if ( self.hasClass( className ) ) { 24338 self.removeClass( className ); 24339 } else { 24340 self.addClass( className ); 24341 } 24342 } 24343 24344 // Toggle whole class name 24345 } else if ( value === undefined || type === "boolean" ) { 24346 className = getClass( this ); 24347 if ( className ) { 24348 24349 // Store className if set 24350 dataPriv.set( this, "__className__", className ); 24351 } 24352 24353 // If the element has a class name or if we're passed `false`, 24354 // then remove the whole classname (if there was one, the above saved it). 24355 // Otherwise bring back whatever was previously saved (if anything), 24356 // falling back to the empty string if nothing was stored. 24357 if ( this.setAttribute ) { 24358 this.setAttribute( "class", 24359 className || value === false ? 24360 "" : 24361 dataPriv.get( this, "__className__" ) || "" 24362 ); 24363 } 24364 } 24365 } ); 24366 }, 24367 24368 hasClass: function( selector ) { 24369 var className, elem, 24370 i = 0; 24371 24372 className = " " + selector + " "; 24373 while ( ( elem = this[ i++ ] ) ) { 24374 if ( elem.nodeType === 1 && 24375 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 24376 return true; 24377 } 24378 } 24379 24380 return false; 24381 } 24382 } ); 24383 24384 24385 24386 24387 var rreturn = /\r/g; 24388 24389 jQuery.fn.extend( { 24390 val: function( value ) { 24391 var hooks, ret, valueIsFunction, 24392 elem = this[ 0 ]; 24393 24394 if ( !arguments.length ) { 24395 if ( elem ) { 24396 hooks = jQuery.valHooks[ elem.type ] || 24397 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 24398 24399 if ( hooks && 24400 "get" in hooks && 24401 ( ret = hooks.get( elem, "value" ) ) !== undefined 24402 ) { 24403 return ret; 24404 } 24405 24406 ret = elem.value; 24407 24408 // Handle most common string cases 24409 if ( typeof ret === "string" ) { 24410 return ret.replace( rreturn, "" ); 24411 } 24412 24413 // Handle cases where value is null/undef or number 24414 return ret == null ? "" : ret; 24415 } 24416 24417 return; 24418 } 24419 24420 valueIsFunction = isFunction( value ); 24421 24422 return this.each( function( i ) { 24423 var val; 24424 24425 if ( this.nodeType !== 1 ) { 24426 return; 24427 } 24428 24429 if ( valueIsFunction ) { 24430 val = value.call( this, i, jQuery( this ).val() ); 24431 } else { 24432 val = value; 24433 } 24434 24435 // Treat null/undefined as ""; convert numbers to string 24436 if ( val == null ) { 24437 val = ""; 24438 24439 } else if ( typeof val === "number" ) { 24440 val += ""; 24441 24442 } else if ( Array.isArray( val ) ) { 24443 val = jQuery.map( val, function( value ) { 24444 return value == null ? "" : value + ""; 24445 } ); 24446 } 24447 24448 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 24449 24450 // If set returns undefined, fall back to normal setting 24451 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 24452 this.value = val; 24453 } 24454 } ); 24455 } 24456 } ); 24457 24458 jQuery.extend( { 24459 valHooks: { 24460 option: { 24461 get: function( elem ) { 24462 24463 var val = jQuery.find.attr( elem, "value" ); 24464 return val != null ? 24465 val : 24466 24467 // Support: IE <=10 - 11 only 24468 // option.text throws exceptions (trac-14686, trac-14858) 24469 // Strip and collapse whitespace 24470 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 24471 stripAndCollapse( jQuery.text( elem ) ); 24472 } 24473 }, 24474 select: { 24475 get: function( elem ) { 24476 var value, option, i, 24477 options = elem.options, 24478 index = elem.selectedIndex, 24479 one = elem.type === "select-one", 24480 values = one ? null : [], 24481 max = one ? index + 1 : options.length; 24482 24483 if ( index < 0 ) { 24484 i = max; 24485 24486 } else { 24487 i = one ? index : 0; 24488 } 24489 24490 // Loop through all the selected options 24491 for ( ; i < max; i++ ) { 24492 option = options[ i ]; 24493 24494 // Support: IE <=9 only 24495 // IE8-9 doesn't update selected after form reset (trac-2551) 24496 if ( ( option.selected || i === index ) && 24497 24498 // Don't return options that are disabled or in a disabled optgroup 24499 !option.disabled && 24500 ( !option.parentNode.disabled || 24501 !nodeName( option.parentNode, "optgroup" ) ) ) { 24502 24503 // Get the specific value for the option 24504 value = jQuery( option ).val(); 24505 24506 // We don't need an array for one selects 24507 if ( one ) { 24508 return value; 24509 } 24510 24511 // Multi-Selects return an array 24512 values.push( value ); 24513 } 24514 } 24515 24516 return values; 24517 }, 24518 24519 set: function( elem, value ) { 24520 var optionSet, option, 24521 options = elem.options, 24522 values = jQuery.makeArray( value ), 24523 i = options.length; 24524 24525 while ( i-- ) { 24526 option = options[ i ]; 24527 24528 /* eslint-disable no-cond-assign */ 24529 24530 if ( option.selected = 24531 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 24532 ) { 24533 optionSet = true; 24534 } 24535 24536 /* eslint-enable no-cond-assign */ 24537 } 24538 24539 // Force browsers to behave consistently when non-matching value is set 24540 if ( !optionSet ) { 24541 elem.selectedIndex = -1; 24542 } 24543 return values; 24544 } 24545 } 24546 } 24547 } ); 24548 24549// Radios and checkboxes getter/setter 24550 jQuery.each( [ "radio", "checkbox" ], function() { 24551 jQuery.valHooks[ this ] = { 24552 set: function( elem, value ) { 24553 if ( Array.isArray( value ) ) { 24554 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 24555 } 24556 } 24557 }; 24558 if ( !support.checkOn ) { 24559 jQuery.valHooks[ this ].get = function( elem ) { 24560 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 24561 }; 24562 } 24563 } ); 24564 24565 24566 24567 24568// Return jQuery for attributes-only inclusion 24569 var location = window.location; 24570 24571 var nonce = { guid: Date.now() }; 24572 24573 var rquery = ( /\?/ ); 24574 24575 24576 24577// Cross-browser xml parsing 24578 jQuery.parseXML = function( data ) { 24579 var xml, parserErrorElem; 24580 if ( !data || typeof data !== "string" ) { 24581 return null; 24582 } 24583 24584 // Support: IE 9 - 11 only 24585 // IE throws on parseFromString with invalid input. 24586 try { 24587 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 24588 } catch ( e ) {} 24589 24590 parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; 24591 if ( !xml || parserErrorElem ) { 24592 jQuery.error( "Invalid XML: " + ( 24593 parserErrorElem ? 24594 jQuery.map( parserErrorElem.childNodes, function( el ) { 24595 return el.textContent; 24596 } ).join( "\n" ) : 24597 data 24598 ) ); 24599 } 24600 return xml; 24601 }; 24602 24603 24604 var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 24605 stopPropagationCallback = function( e ) { 24606 e.stopPropagation(); 24607 }; 24608 24609 jQuery.extend( jQuery.event, { 24610 24611 trigger: function( event, data, elem, onlyHandlers ) { 24612 24613 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, 24614 eventPath = [ elem || document ], 24615 type = hasOwn.call( event, "type" ) ? event.type : event, 24616 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 24617 24618 cur = lastElement = tmp = elem = elem || document; 24619 24620 // Don't do events on text and comment nodes 24621 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 24622 return; 24623 } 24624 24625 // focus/blur morphs to focusin/out; ensure we're not firing them right now 24626 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 24627 return; 24628 } 24629 24630 if ( type.indexOf( "." ) > -1 ) { 24631 24632 // Namespaced trigger; create a regexp to match event type in handle() 24633 namespaces = type.split( "." ); 24634 type = namespaces.shift(); 24635 namespaces.sort(); 24636 } 24637 ontype = type.indexOf( ":" ) < 0 && "on" + type; 24638 24639 // Caller can pass in a jQuery.Event object, Object, or just an event type string 24640 event = event[ jQuery.expando ] ? 24641 event : 24642 new jQuery.Event( type, typeof event === "object" && event ); 24643 24644 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 24645 event.isTrigger = onlyHandlers ? 2 : 3; 24646 event.namespace = namespaces.join( "." ); 24647 event.rnamespace = event.namespace ? 24648 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 24649 null; 24650 24651 // Clean up the event in case it is being reused 24652 event.result = undefined; 24653 if ( !event.target ) { 24654 event.target = elem; 24655 } 24656 24657 // Clone any incoming data and prepend the event, creating the handler arg list 24658 data = data == null ? 24659 [ event ] : 24660 jQuery.makeArray( data, [ event ] ); 24661 24662 // Allow special events to draw outside the lines 24663 special = jQuery.event.special[ type ] || {}; 24664 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 24665 return; 24666 } 24667 24668 // Determine event propagation path in advance, per W3C events spec (trac-9951) 24669 // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) 24670 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { 24671 24672 bubbleType = special.delegateType || type; 24673 if ( !rfocusMorph.test( bubbleType + type ) ) { 24674 cur = cur.parentNode; 24675 } 24676 for ( ; cur; cur = cur.parentNode ) { 24677 eventPath.push( cur ); 24678 tmp = cur; 24679 } 24680 24681 // Only add window if we got to document (e.g., not plain obj or detached DOM) 24682 if ( tmp === ( elem.ownerDocument || document ) ) { 24683 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 24684 } 24685 } 24686 24687 // Fire handlers on the event path 24688 i = 0; 24689 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 24690 lastElement = cur; 24691 event.type = i > 1 ? 24692 bubbleType : 24693 special.bindType || type; 24694 24695 // jQuery handler 24696 handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && 24697 dataPriv.get( cur, "handle" ); 24698 if ( handle ) { 24699 handle.apply( cur, data ); 24700 } 24701 24702 // Native handler 24703 handle = ontype && cur[ ontype ]; 24704 if ( handle && handle.apply && acceptData( cur ) ) { 24705 event.result = handle.apply( cur, data ); 24706 if ( event.result === false ) { 24707 event.preventDefault(); 24708 } 24709 } 24710 } 24711 event.type = type; 24712 24713 // If nobody prevented the default action, do it now 24714 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 24715 24716 if ( ( !special._default || 24717 special._default.apply( eventPath.pop(), data ) === false ) && 24718 acceptData( elem ) ) { 24719 24720 // Call a native DOM method on the target with the same name as the event. 24721 // Don't do default actions on window, that's where global variables be (trac-6170) 24722 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { 24723 24724 // Don't re-trigger an onFOO event when we call its FOO() method 24725 tmp = elem[ ontype ]; 24726 24727 if ( tmp ) { 24728 elem[ ontype ] = null; 24729 } 24730 24731 // Prevent re-triggering of the same event, since we already bubbled it above 24732 jQuery.event.triggered = type; 24733 24734 if ( event.isPropagationStopped() ) { 24735 lastElement.addEventListener( type, stopPropagationCallback ); 24736 } 24737 24738 elem[ type ](); 24739 24740 if ( event.isPropagationStopped() ) { 24741 lastElement.removeEventListener( type, stopPropagationCallback ); 24742 } 24743 24744 jQuery.event.triggered = undefined; 24745 24746 if ( tmp ) { 24747 elem[ ontype ] = tmp; 24748 } 24749 } 24750 } 24751 } 24752 24753 return event.result; 24754 }, 24755 24756 // Piggyback on a donor event to simulate a different one 24757 // Used only for `focus(in | out)` events 24758 simulate: function( type, elem, event ) { 24759 var e = jQuery.extend( 24760 new jQuery.Event(), 24761 event, 24762 { 24763 type: type, 24764 isSimulated: true 24765 } 24766 ); 24767 24768 jQuery.event.trigger( e, null, elem ); 24769 } 24770 24771 } ); 24772 24773 jQuery.fn.extend( { 24774 24775 trigger: function( type, data ) { 24776 return this.each( function() { 24777 jQuery.event.trigger( type, data, this ); 24778 } ); 24779 }, 24780 triggerHandler: function( type, data ) { 24781 var elem = this[ 0 ]; 24782 if ( elem ) { 24783 return jQuery.event.trigger( type, data, elem, true ); 24784 } 24785 } 24786 } ); 24787 24788 24789 var 24790 rbracket = /\[\]$/, 24791 rCRLF = /\r?\n/g, 24792 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 24793 rsubmittable = /^(?:input|select|textarea|keygen)/i; 24794 24795 function buildParams( prefix, obj, traditional, add ) { 24796 var name; 24797 24798 if ( Array.isArray( obj ) ) { 24799 24800 // Serialize array item. 24801 jQuery.each( obj, function( i, v ) { 24802 if ( traditional || rbracket.test( prefix ) ) { 24803 24804 // Treat each array item as a scalar. 24805 add( prefix, v ); 24806 24807 } else { 24808 24809 // Item is non-scalar (array or object), encode its numeric index. 24810 buildParams( 24811 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 24812 v, 24813 traditional, 24814 add 24815 ); 24816 } 24817 } ); 24818 24819 } else if ( !traditional && toType( obj ) === "object" ) { 24820 24821 // Serialize object item. 24822 for ( name in obj ) { 24823 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 24824 } 24825 24826 } else { 24827 24828 // Serialize scalar item. 24829 add( prefix, obj ); 24830 } 24831 } 24832 24833// Serialize an array of form elements or a set of 24834// key/values into a query string 24835 jQuery.param = function( a, traditional ) { 24836 var prefix, 24837 s = [], 24838 add = function( key, valueOrFunction ) { 24839 24840 // If value is a function, invoke it and use its return value 24841 var value = isFunction( valueOrFunction ) ? 24842 valueOrFunction() : 24843 valueOrFunction; 24844 24845 s[ s.length ] = encodeURIComponent( key ) + "=" + 24846 encodeURIComponent( value == null ? "" : value ); 24847 }; 24848 24849 if ( a == null ) { 24850 return ""; 24851 } 24852 24853 // If an array was passed in, assume that it is an array of form elements. 24854 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 24855 24856 // Serialize the form elements 24857 jQuery.each( a, function() { 24858 add( this.name, this.value ); 24859 } ); 24860 24861 } else { 24862 24863 // If traditional, encode the "old" way (the way 1.3.2 or older 24864 // did it), otherwise encode params recursively. 24865 for ( prefix in a ) { 24866 buildParams( prefix, a[ prefix ], traditional, add ); 24867 } 24868 } 24869 24870 // Return the resulting serialization 24871 return s.join( "&" ); 24872 }; 24873 24874 jQuery.fn.extend( { 24875 serialize: function() { 24876 return jQuery.param( this.serializeArray() ); 24877 }, 24878 serializeArray: function() { 24879 return this.map( function() { 24880 24881 // Can add propHook for "elements" to filter or add form elements 24882 var elements = jQuery.prop( this, "elements" ); 24883 return elements ? jQuery.makeArray( elements ) : this; 24884 } ).filter( function() { 24885 var type = this.type; 24886 24887 // Use .is( ":disabled" ) so that fieldset[disabled] works 24888 return this.name && !jQuery( this ).is( ":disabled" ) && 24889 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 24890 ( this.checked || !rcheckableType.test( type ) ); 24891 } ).map( function( _i, elem ) { 24892 var val = jQuery( this ).val(); 24893 24894 if ( val == null ) { 24895 return null; 24896 } 24897 24898 if ( Array.isArray( val ) ) { 24899 return jQuery.map( val, function( val ) { 24900 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 24901 } ); 24902 } 24903 24904 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 24905 } ).get(); 24906 } 24907 } ); 24908 24909 24910 var 24911 r20 = /%20/g, 24912 rhash = /#.*$/, 24913 rantiCache = /([?&])_=[^&]*/, 24914 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 24915 24916 // trac-7653, trac-8125, trac-8152: local protocol detection 24917 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 24918 rnoContent = /^(?:GET|HEAD)$/, 24919 rprotocol = /^\/\//, 24920 24921 /* Prefilters 24922 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 24923 * 2) These are called: 24924 * - BEFORE asking for a transport 24925 * - AFTER param serialization (s.data is a string if s.processData is true) 24926 * 3) key is the dataType 24927 * 4) the catchall symbol "*" can be used 24928 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 24929 */ 24930 prefilters = {}, 24931 24932 /* Transports bindings 24933 * 1) key is the dataType 24934 * 2) the catchall symbol "*" can be used 24935 * 3) selection will start with transport dataType and THEN go to "*" if needed 24936 */ 24937 transports = {}, 24938 24939 // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression 24940 allTypes = "*/".concat( "*" ), 24941 24942 // Anchor tag for parsing the document origin 24943 originAnchor = document.createElement( "a" ); 24944 24945 originAnchor.href = location.href; 24946 24947// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 24948 function addToPrefiltersOrTransports( structure ) { 24949 24950 // dataTypeExpression is optional and defaults to "*" 24951 return function( dataTypeExpression, func ) { 24952 24953 if ( typeof dataTypeExpression !== "string" ) { 24954 func = dataTypeExpression; 24955 dataTypeExpression = "*"; 24956 } 24957 24958 var dataType, 24959 i = 0, 24960 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 24961 24962 if ( isFunction( func ) ) { 24963 24964 // For each dataType in the dataTypeExpression 24965 while ( ( dataType = dataTypes[ i++ ] ) ) { 24966 24967 // Prepend if requested 24968 if ( dataType[ 0 ] === "+" ) { 24969 dataType = dataType.slice( 1 ) || "*"; 24970 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 24971 24972 // Otherwise append 24973 } else { 24974 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 24975 } 24976 } 24977 } 24978 }; 24979 } 24980 24981// Base inspection function for prefilters and transports 24982 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 24983 24984 var inspected = {}, 24985 seekingTransport = ( structure === transports ); 24986 24987 function inspect( dataType ) { 24988 var selected; 24989 inspected[ dataType ] = true; 24990 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 24991 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 24992 if ( typeof dataTypeOrTransport === "string" && 24993 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 24994 24995 options.dataTypes.unshift( dataTypeOrTransport ); 24996 inspect( dataTypeOrTransport ); 24997 return false; 24998 } else if ( seekingTransport ) { 24999 return !( selected = dataTypeOrTransport ); 25000 } 25001 } ); 25002 return selected; 25003 } 25004 25005 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 25006 } 25007 25008// A special extend for ajax options 25009// that takes "flat" options (not to be deep extended) 25010// Fixes trac-9887 25011 function ajaxExtend( target, src ) { 25012 var key, deep, 25013 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 25014 25015 for ( key in src ) { 25016 if ( src[ key ] !== undefined ) { 25017 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 25018 } 25019 } 25020 if ( deep ) { 25021 jQuery.extend( true, target, deep ); 25022 } 25023 25024 return target; 25025 } 25026 25027 /* Handles responses to an ajax request: 25028 * - finds the right dataType (mediates between content-type and expected dataType) 25029 * - returns the corresponding response 25030 */ 25031 function ajaxHandleResponses( s, jqXHR, responses ) { 25032 25033 var ct, type, finalDataType, firstDataType, 25034 contents = s.contents, 25035 dataTypes = s.dataTypes; 25036 25037 // Remove auto dataType and get content-type in the process 25038 while ( dataTypes[ 0 ] === "*" ) { 25039 dataTypes.shift(); 25040 if ( ct === undefined ) { 25041 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 25042 } 25043 } 25044 25045 // Check if we're dealing with a known content-type 25046 if ( ct ) { 25047 for ( type in contents ) { 25048 if ( contents[ type ] && contents[ type ].test( ct ) ) { 25049 dataTypes.unshift( type ); 25050 break; 25051 } 25052 } 25053 } 25054 25055 // Check to see if we have a response for the expected dataType 25056 if ( dataTypes[ 0 ] in responses ) { 25057 finalDataType = dataTypes[ 0 ]; 25058 } else { 25059 25060 // Try convertible dataTypes 25061 for ( type in responses ) { 25062 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 25063 finalDataType = type; 25064 break; 25065 } 25066 if ( !firstDataType ) { 25067 firstDataType = type; 25068 } 25069 } 25070 25071 // Or just use first one 25072 finalDataType = finalDataType || firstDataType; 25073 } 25074 25075 // If we found a dataType 25076 // We add the dataType to the list if needed 25077 // and return the corresponding response 25078 if ( finalDataType ) { 25079 if ( finalDataType !== dataTypes[ 0 ] ) { 25080 dataTypes.unshift( finalDataType ); 25081 } 25082 return responses[ finalDataType ]; 25083 } 25084 } 25085 25086 /* Chain conversions given the request and the original response 25087 * Also sets the responseXXX fields on the jqXHR instance 25088 */ 25089 function ajaxConvert( s, response, jqXHR, isSuccess ) { 25090 var conv2, current, conv, tmp, prev, 25091 converters = {}, 25092 25093 // Work with a copy of dataTypes in case we need to modify it for conversion 25094 dataTypes = s.dataTypes.slice(); 25095 25096 // Create converters map with lowercased keys 25097 if ( dataTypes[ 1 ] ) { 25098 for ( conv in s.converters ) { 25099 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 25100 } 25101 } 25102 25103 current = dataTypes.shift(); 25104 25105 // Convert to each sequential dataType 25106 while ( current ) { 25107 25108 if ( s.responseFields[ current ] ) { 25109 jqXHR[ s.responseFields[ current ] ] = response; 25110 } 25111 25112 // Apply the dataFilter if provided 25113 if ( !prev && isSuccess && s.dataFilter ) { 25114 response = s.dataFilter( response, s.dataType ); 25115 } 25116 25117 prev = current; 25118 current = dataTypes.shift(); 25119 25120 if ( current ) { 25121 25122 // There's only work to do if current dataType is non-auto 25123 if ( current === "*" ) { 25124 25125 current = prev; 25126 25127 // Convert response if prev dataType is non-auto and differs from current 25128 } else if ( prev !== "*" && prev !== current ) { 25129 25130 // Seek a direct converter 25131 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 25132 25133 // If none found, seek a pair 25134 if ( !conv ) { 25135 for ( conv2 in converters ) { 25136 25137 // If conv2 outputs current 25138 tmp = conv2.split( " " ); 25139 if ( tmp[ 1 ] === current ) { 25140 25141 // If prev can be converted to accepted input 25142 conv = converters[ prev + " " + tmp[ 0 ] ] || 25143 converters[ "* " + tmp[ 0 ] ]; 25144 if ( conv ) { 25145 25146 // Condense equivalence converters 25147 if ( conv === true ) { 25148 conv = converters[ conv2 ]; 25149 25150 // Otherwise, insert the intermediate dataType 25151 } else if ( converters[ conv2 ] !== true ) { 25152 current = tmp[ 0 ]; 25153 dataTypes.unshift( tmp[ 1 ] ); 25154 } 25155 break; 25156 } 25157 } 25158 } 25159 } 25160 25161 // Apply converter (if not an equivalence) 25162 if ( conv !== true ) { 25163 25164 // Unless errors are allowed to bubble, catch and return them 25165 if ( conv && s.throws ) { 25166 response = conv( response ); 25167 } else { 25168 try { 25169 response = conv( response ); 25170 } catch ( e ) { 25171 return { 25172 state: "parsererror", 25173 error: conv ? e : "No conversion from " + prev + " to " + current 25174 }; 25175 } 25176 } 25177 } 25178 } 25179 } 25180 } 25181 25182 return { state: "success", data: response }; 25183 } 25184 25185 jQuery.extend( { 25186 25187 // Counter for holding the number of active queries 25188 active: 0, 25189 25190 // Last-Modified header cache for next request 25191 lastModified: {}, 25192 etag: {}, 25193 25194 ajaxSettings: { 25195 url: location.href, 25196 type: "GET", 25197 isLocal: rlocalProtocol.test( location.protocol ), 25198 global: true, 25199 processData: true, 25200 async: true, 25201 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 25202 25203 /* 25204 timeout: 0, 25205 data: null, 25206 dataType: null, 25207 username: null, 25208 password: null, 25209 cache: null, 25210 throws: false, 25211 traditional: false, 25212 headers: {}, 25213 */ 25214 25215 accepts: { 25216 "*": allTypes, 25217 text: "text/plain", 25218 html: "text/html", 25219 xml: "application/xml, text/xml", 25220 json: "application/json, text/javascript" 25221 }, 25222 25223 contents: { 25224 xml: /\bxml\b/, 25225 html: /\bhtml/, 25226 json: /\bjson\b/ 25227 }, 25228 25229 responseFields: { 25230 xml: "responseXML", 25231 text: "responseText", 25232 json: "responseJSON" 25233 }, 25234 25235 // Data converters 25236 // Keys separate source (or catchall "*") and destination types with a single space 25237 converters: { 25238 25239 // Convert anything to text 25240 "* text": String, 25241 25242 // Text to html (true = no transformation) 25243 "text html": true, 25244 25245 // Evaluate text as a json expression 25246 "text json": JSON.parse, 25247 25248 // Parse text as xml 25249 "text xml": jQuery.parseXML 25250 }, 25251 25252 // For options that shouldn't be deep extended: 25253 // you can add your own custom options here if 25254 // and when you create one that shouldn't be 25255 // deep extended (see ajaxExtend) 25256 flatOptions: { 25257 url: true, 25258 context: true 25259 } 25260 }, 25261 25262 // Creates a full fledged settings object into target 25263 // with both ajaxSettings and settings fields. 25264 // If target is omitted, writes into ajaxSettings. 25265 ajaxSetup: function( target, settings ) { 25266 return settings ? 25267 25268 // Building a settings object 25269 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 25270 25271 // Extending ajaxSettings 25272 ajaxExtend( jQuery.ajaxSettings, target ); 25273 }, 25274 25275 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 25276 ajaxTransport: addToPrefiltersOrTransports( transports ), 25277 25278 // Main method 25279 ajax: function( url, options ) { 25280 25281 // If url is an object, simulate pre-1.5 signature 25282 if ( typeof url === "object" ) { 25283 options = url; 25284 url = undefined; 25285 } 25286 25287 // Force options to be an object 25288 options = options || {}; 25289 25290 var transport, 25291 25292 // URL without anti-cache param 25293 cacheURL, 25294 25295 // Response headers 25296 responseHeadersString, 25297 responseHeaders, 25298 25299 // timeout handle 25300 timeoutTimer, 25301 25302 // Url cleanup var 25303 urlAnchor, 25304 25305 // Request state (becomes false upon send and true upon completion) 25306 completed, 25307 25308 // To know if global events are to be dispatched 25309 fireGlobals, 25310 25311 // Loop variable 25312 i, 25313 25314 // uncached part of the url 25315 uncached, 25316 25317 // Create the final options object 25318 s = jQuery.ajaxSetup( {}, options ), 25319 25320 // Callbacks context 25321 callbackContext = s.context || s, 25322 25323 // Context for global events is callbackContext if it is a DOM node or jQuery collection 25324 globalEventContext = s.context && 25325 ( callbackContext.nodeType || callbackContext.jquery ) ? 25326 jQuery( callbackContext ) : 25327 jQuery.event, 25328 25329 // Deferreds 25330 deferred = jQuery.Deferred(), 25331 completeDeferred = jQuery.Callbacks( "once memory" ), 25332 25333 // Status-dependent callbacks 25334 statusCode = s.statusCode || {}, 25335 25336 // Headers (they are sent all at once) 25337 requestHeaders = {}, 25338 requestHeadersNames = {}, 25339 25340 // Default abort message 25341 strAbort = "canceled", 25342 25343 // Fake xhr 25344 jqXHR = { 25345 readyState: 0, 25346 25347 // Builds headers hashtable if needed 25348 getResponseHeader: function( key ) { 25349 var match; 25350 if ( completed ) { 25351 if ( !responseHeaders ) { 25352 responseHeaders = {}; 25353 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 25354 responseHeaders[ match[ 1 ].toLowerCase() + " " ] = 25355 ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) 25356 .concat( match[ 2 ] ); 25357 } 25358 } 25359 match = responseHeaders[ key.toLowerCase() + " " ]; 25360 } 25361 return match == null ? null : match.join( ", " ); 25362 }, 25363 25364 // Raw string 25365 getAllResponseHeaders: function() { 25366 return completed ? responseHeadersString : null; 25367 }, 25368 25369 // Caches the header 25370 setRequestHeader: function( name, value ) { 25371 if ( completed == null ) { 25372 name = requestHeadersNames[ name.toLowerCase() ] = 25373 requestHeadersNames[ name.toLowerCase() ] || name; 25374 requestHeaders[ name ] = value; 25375 } 25376 return this; 25377 }, 25378 25379 // Overrides response content-type header 25380 overrideMimeType: function( type ) { 25381 if ( completed == null ) { 25382 s.mimeType = type; 25383 } 25384 return this; 25385 }, 25386 25387 // Status-dependent callbacks 25388 statusCode: function( map ) { 25389 var code; 25390 if ( map ) { 25391 if ( completed ) { 25392 25393 // Execute the appropriate callbacks 25394 jqXHR.always( map[ jqXHR.status ] ); 25395 } else { 25396 25397 // Lazy-add the new callbacks in a way that preserves old ones 25398 for ( code in map ) { 25399 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 25400 } 25401 } 25402 } 25403 return this; 25404 }, 25405 25406 // Cancel the request 25407 abort: function( statusText ) { 25408 var finalText = statusText || strAbort; 25409 if ( transport ) { 25410 transport.abort( finalText ); 25411 } 25412 done( 0, finalText ); 25413 return this; 25414 } 25415 }; 25416 25417 // Attach deferreds 25418 deferred.promise( jqXHR ); 25419 25420 // Add protocol if not provided (prefilters might expect it) 25421 // Handle falsy url in the settings object (trac-10093: consistency with old signature) 25422 // We also use the url parameter if available 25423 s.url = ( ( url || s.url || location.href ) + "" ) 25424 .replace( rprotocol, location.protocol + "//" ); 25425 25426 // Alias method option to type as per ticket trac-12004 25427 s.type = options.method || options.type || s.method || s.type; 25428 25429 // Extract dataTypes list 25430 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 25431 25432 // A cross-domain request is in order when the origin doesn't match the current origin. 25433 if ( s.crossDomain == null ) { 25434 urlAnchor = document.createElement( "a" ); 25435 25436 // Support: IE <=8 - 11, Edge 12 - 15 25437 // IE throws exception on accessing the href property if url is malformed, 25438 // e.g. http://example.com:80x/ 25439 try { 25440 urlAnchor.href = s.url; 25441 25442 // Support: IE <=8 - 11 only 25443 // Anchor's host property isn't correctly set when s.url is relative 25444 urlAnchor.href = urlAnchor.href; 25445 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 25446 urlAnchor.protocol + "//" + urlAnchor.host; 25447 } catch ( e ) { 25448 25449 // If there is an error parsing the URL, assume it is crossDomain, 25450 // it can be rejected by the transport if it is invalid 25451 s.crossDomain = true; 25452 } 25453 } 25454 25455 // Convert data if not already a string 25456 if ( s.data && s.processData && typeof s.data !== "string" ) { 25457 s.data = jQuery.param( s.data, s.traditional ); 25458 } 25459 25460 // Apply prefilters 25461 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 25462 25463 // If request was aborted inside a prefilter, stop there 25464 if ( completed ) { 25465 return jqXHR; 25466 } 25467 25468 // We can fire global events as of now if asked to 25469 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) 25470 fireGlobals = jQuery.event && s.global; 25471 25472 // Watch for a new set of requests 25473 if ( fireGlobals && jQuery.active++ === 0 ) { 25474 jQuery.event.trigger( "ajaxStart" ); 25475 } 25476 25477 // Uppercase the type 25478 s.type = s.type.toUpperCase(); 25479 25480 // Determine if request has content 25481 s.hasContent = !rnoContent.test( s.type ); 25482 25483 // Save the URL in case we're toying with the If-Modified-Since 25484 // and/or If-None-Match header later on 25485 // Remove hash to simplify url manipulation 25486 cacheURL = s.url.replace( rhash, "" ); 25487 25488 // More options handling for requests with no content 25489 if ( !s.hasContent ) { 25490 25491 // Remember the hash so we can put it back 25492 uncached = s.url.slice( cacheURL.length ); 25493 25494 // If data is available and should be processed, append data to url 25495 if ( s.data && ( s.processData || typeof s.data === "string" ) ) { 25496 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 25497 25498 // trac-9682: remove data so that it's not used in an eventual retry 25499 delete s.data; 25500 } 25501 25502 // Add or update anti-cache param if needed 25503 if ( s.cache === false ) { 25504 cacheURL = cacheURL.replace( rantiCache, "$1" ); 25505 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + 25506 uncached; 25507 } 25508 25509 // Put hash and anti-cache on the URL that will be requested (gh-1732) 25510 s.url = cacheURL + uncached; 25511 25512 // Change '%20' to '+' if this is encoded form body content (gh-2658) 25513 } else if ( s.data && s.processData && 25514 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 25515 s.data = s.data.replace( r20, "+" ); 25516 } 25517 25518 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 25519 if ( s.ifModified ) { 25520 if ( jQuery.lastModified[ cacheURL ] ) { 25521 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 25522 } 25523 if ( jQuery.etag[ cacheURL ] ) { 25524 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 25525 } 25526 } 25527 25528 // Set the correct header, if data is being sent 25529 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 25530 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 25531 } 25532 25533 // Set the Accepts header for the server, depending on the dataType 25534 jqXHR.setRequestHeader( 25535 "Accept", 25536 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 25537 s.accepts[ s.dataTypes[ 0 ] ] + 25538 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 25539 s.accepts[ "*" ] 25540 ); 25541 25542 // Check for headers option 25543 for ( i in s.headers ) { 25544 jqXHR.setRequestHeader( i, s.headers[ i ] ); 25545 } 25546 25547 // Allow custom headers/mimetypes and early abort 25548 if ( s.beforeSend && 25549 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 25550 25551 // Abort if not done already and return 25552 return jqXHR.abort(); 25553 } 25554 25555 // Aborting is no longer a cancellation 25556 strAbort = "abort"; 25557 25558 // Install callbacks on deferreds 25559 completeDeferred.add( s.complete ); 25560 jqXHR.done( s.success ); 25561 jqXHR.fail( s.error ); 25562 25563 // Get transport 25564 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 25565 25566 // If no transport, we auto-abort 25567 if ( !transport ) { 25568 done( -1, "No Transport" ); 25569 } else { 25570 jqXHR.readyState = 1; 25571 25572 // Send global event 25573 if ( fireGlobals ) { 25574 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 25575 } 25576 25577 // If request was aborted inside ajaxSend, stop there 25578 if ( completed ) { 25579 return jqXHR; 25580 } 25581 25582 // Timeout 25583 if ( s.async && s.timeout > 0 ) { 25584 timeoutTimer = window.setTimeout( function() { 25585 jqXHR.abort( "timeout" ); 25586 }, s.timeout ); 25587 } 25588 25589 try { 25590 completed = false; 25591 transport.send( requestHeaders, done ); 25592 } catch ( e ) { 25593 25594 // Rethrow post-completion exceptions 25595 if ( completed ) { 25596 throw e; 25597 } 25598 25599 // Propagate others as results 25600 done( -1, e ); 25601 } 25602 } 25603 25604 // Callback for when everything is done 25605 function done( status, nativeStatusText, responses, headers ) { 25606 var isSuccess, success, error, response, modified, 25607 statusText = nativeStatusText; 25608 25609 // Ignore repeat invocations 25610 if ( completed ) { 25611 return; 25612 } 25613 25614 completed = true; 25615 25616 // Clear timeout if it exists 25617 if ( timeoutTimer ) { 25618 window.clearTimeout( timeoutTimer ); 25619 } 25620 25621 // Dereference transport for early garbage collection 25622 // (no matter how long the jqXHR object will be used) 25623 transport = undefined; 25624 25625 // Cache response headers 25626 responseHeadersString = headers || ""; 25627 25628 // Set readyState 25629 jqXHR.readyState = status > 0 ? 4 : 0; 25630 25631 // Determine if successful 25632 isSuccess = status >= 200 && status < 300 || status === 304; 25633 25634 // Get response data 25635 if ( responses ) { 25636 response = ajaxHandleResponses( s, jqXHR, responses ); 25637 } 25638 25639 // Use a noop converter for missing script but not if jsonp 25640 if ( !isSuccess && 25641 jQuery.inArray( "script", s.dataTypes ) > -1 && 25642 jQuery.inArray( "json", s.dataTypes ) < 0 ) { 25643 s.converters[ "text script" ] = function() {}; 25644 } 25645 25646 // Convert no matter what (that way responseXXX fields are always set) 25647 response = ajaxConvert( s, response, jqXHR, isSuccess ); 25648 25649 // If successful, handle type chaining 25650 if ( isSuccess ) { 25651 25652 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 25653 if ( s.ifModified ) { 25654 modified = jqXHR.getResponseHeader( "Last-Modified" ); 25655 if ( modified ) { 25656 jQuery.lastModified[ cacheURL ] = modified; 25657 } 25658 modified = jqXHR.getResponseHeader( "etag" ); 25659 if ( modified ) { 25660 jQuery.etag[ cacheURL ] = modified; 25661 } 25662 } 25663 25664 // if no content 25665 if ( status === 204 || s.type === "HEAD" ) { 25666 statusText = "nocontent"; 25667 25668 // if not modified 25669 } else if ( status === 304 ) { 25670 statusText = "notmodified"; 25671 25672 // If we have data, let's convert it 25673 } else { 25674 statusText = response.state; 25675 success = response.data; 25676 error = response.error; 25677 isSuccess = !error; 25678 } 25679 } else { 25680 25681 // Extract error from statusText and normalize for non-aborts 25682 error = statusText; 25683 if ( status || !statusText ) { 25684 statusText = "error"; 25685 if ( status < 0 ) { 25686 status = 0; 25687 } 25688 } 25689 } 25690 25691 // Set data for the fake xhr object 25692 jqXHR.status = status; 25693 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 25694 25695 // Success/Error 25696 if ( isSuccess ) { 25697 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 25698 } else { 25699 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 25700 } 25701 25702 // Status-dependent callbacks 25703 jqXHR.statusCode( statusCode ); 25704 statusCode = undefined; 25705 25706 if ( fireGlobals ) { 25707 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 25708 [ jqXHR, s, isSuccess ? success : error ] ); 25709 } 25710 25711 // Complete 25712 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 25713 25714 if ( fireGlobals ) { 25715 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 25716 25717 // Handle the global AJAX counter 25718 if ( !( --jQuery.active ) ) { 25719 jQuery.event.trigger( "ajaxStop" ); 25720 } 25721 } 25722 } 25723 25724 return jqXHR; 25725 }, 25726 25727 getJSON: function( url, data, callback ) { 25728 return jQuery.get( url, data, callback, "json" ); 25729 }, 25730 25731 getScript: function( url, callback ) { 25732 return jQuery.get( url, undefined, callback, "script" ); 25733 } 25734 } ); 25735 25736 jQuery.each( [ "get", "post" ], function( _i, method ) { 25737 jQuery[ method ] = function( url, data, callback, type ) { 25738 25739 // Shift arguments if data argument was omitted 25740 if ( isFunction( data ) ) { 25741 type = type || callback; 25742 callback = data; 25743 data = undefined; 25744 } 25745 25746 // The url can be an options object (which then must have .url) 25747 return jQuery.ajax( jQuery.extend( { 25748 url: url, 25749 type: method, 25750 dataType: type, 25751 data: data, 25752 success: callback 25753 }, jQuery.isPlainObject( url ) && url ) ); 25754 }; 25755 } ); 25756 25757 jQuery.ajaxPrefilter( function( s ) { 25758 var i; 25759 for ( i in s.headers ) { 25760 if ( i.toLowerCase() === "content-type" ) { 25761 s.contentType = s.headers[ i ] || ""; 25762 } 25763 } 25764 } ); 25765 25766 25767 jQuery._evalUrl = function( url, options, doc ) { 25768 return jQuery.ajax( { 25769 url: url, 25770 25771 // Make this explicit, since user can override this through ajaxSetup (trac-11264) 25772 type: "GET", 25773 dataType: "script", 25774 cache: true, 25775 async: false, 25776 global: false, 25777 25778 // Only evaluate the response if it is successful (gh-4126) 25779 // dataFilter is not invoked for failure responses, so using it instead 25780 // of the default converter is kludgy but it works. 25781 converters: { 25782 "text script": function() {} 25783 }, 25784 dataFilter: function( response ) { 25785 jQuery.globalEval( response, options, doc ); 25786 } 25787 } ); 25788 }; 25789 25790 25791 jQuery.fn.extend( { 25792 wrapAll: function( html ) { 25793 var wrap; 25794 25795 if ( this[ 0 ] ) { 25796 if ( isFunction( html ) ) { 25797 html = html.call( this[ 0 ] ); 25798 } 25799 25800 // The elements to wrap the target around 25801 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 25802 25803 if ( this[ 0 ].parentNode ) { 25804 wrap.insertBefore( this[ 0 ] ); 25805 } 25806 25807 wrap.map( function() { 25808 var elem = this; 25809 25810 while ( elem.firstElementChild ) { 25811 elem = elem.firstElementChild; 25812 } 25813 25814 return elem; 25815 } ).append( this ); 25816 } 25817 25818 return this; 25819 }, 25820 25821 wrapInner: function( html ) { 25822 if ( isFunction( html ) ) { 25823 return this.each( function( i ) { 25824 jQuery( this ).wrapInner( html.call( this, i ) ); 25825 } ); 25826 } 25827 25828 return this.each( function() { 25829 var self = jQuery( this ), 25830 contents = self.contents(); 25831 25832 if ( contents.length ) { 25833 contents.wrapAll( html ); 25834 25835 } else { 25836 self.append( html ); 25837 } 25838 } ); 25839 }, 25840 25841 wrap: function( html ) { 25842 var htmlIsFunction = isFunction( html ); 25843 25844 return this.each( function( i ) { 25845 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); 25846 } ); 25847 }, 25848 25849 unwrap: function( selector ) { 25850 this.parent( selector ).not( "body" ).each( function() { 25851 jQuery( this ).replaceWith( this.childNodes ); 25852 } ); 25853 return this; 25854 } 25855 } ); 25856 25857 25858 jQuery.expr.pseudos.hidden = function( elem ) { 25859 return !jQuery.expr.pseudos.visible( elem ); 25860 }; 25861 jQuery.expr.pseudos.visible = function( elem ) { 25862 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 25863 }; 25864 25865 25866 25867 25868 jQuery.ajaxSettings.xhr = function() { 25869 try { 25870 return new window.XMLHttpRequest(); 25871 } catch ( e ) {} 25872 }; 25873 25874 var xhrSuccessStatus = { 25875 25876 // File protocol always yields status code 0, assume 200 25877 0: 200, 25878 25879 // Support: IE <=9 only 25880 // trac-1450: sometimes IE returns 1223 when it should be 204 25881 1223: 204 25882 }, 25883 xhrSupported = jQuery.ajaxSettings.xhr(); 25884 25885 support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 25886 support.ajax = xhrSupported = !!xhrSupported; 25887 25888 jQuery.ajaxTransport( function( options ) { 25889 var callback, errorCallback; 25890 25891 // Cross domain only allowed if supported through XMLHttpRequest 25892 if ( support.cors || xhrSupported && !options.crossDomain ) { 25893 return { 25894 send: function( headers, complete ) { 25895 var i, 25896 xhr = options.xhr(); 25897 25898 xhr.open( 25899 options.type, 25900 options.url, 25901 options.async, 25902 options.username, 25903 options.password 25904 ); 25905 25906 // Apply custom fields if provided 25907 if ( options.xhrFields ) { 25908 for ( i in options.xhrFields ) { 25909 xhr[ i ] = options.xhrFields[ i ]; 25910 } 25911 } 25912 25913 // Override mime type if needed 25914 if ( options.mimeType && xhr.overrideMimeType ) { 25915 xhr.overrideMimeType( options.mimeType ); 25916 } 25917 25918 // X-Requested-With header 25919 // For cross-domain requests, seeing as conditions for a preflight are 25920 // akin to a jigsaw puzzle, we simply never set it to be sure. 25921 // (it can always be set on a per-request basis or even using ajaxSetup) 25922 // For same-domain requests, won't change header if already provided. 25923 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 25924 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 25925 } 25926 25927 // Set headers 25928 for ( i in headers ) { 25929 xhr.setRequestHeader( i, headers[ i ] ); 25930 } 25931 25932 // Callback 25933 callback = function( type ) { 25934 return function() { 25935 if ( callback ) { 25936 callback = errorCallback = xhr.onload = 25937 xhr.onerror = xhr.onabort = xhr.ontimeout = 25938 xhr.onreadystatechange = null; 25939 25940 if ( type === "abort" ) { 25941 xhr.abort(); 25942 } else if ( type === "error" ) { 25943 25944 // Support: IE <=9 only 25945 // On a manual native abort, IE9 throws 25946 // errors on any property access that is not readyState 25947 if ( typeof xhr.status !== "number" ) { 25948 complete( 0, "error" ); 25949 } else { 25950 complete( 25951 25952 // File: protocol always yields status 0; see trac-8605, trac-14207 25953 xhr.status, 25954 xhr.statusText 25955 ); 25956 } 25957 } else { 25958 complete( 25959 xhrSuccessStatus[ xhr.status ] || xhr.status, 25960 xhr.statusText, 25961 25962 // Support: IE <=9 only 25963 // IE9 has no XHR2 but throws on binary (trac-11426) 25964 // For XHR2 non-text, let the caller handle it (gh-2498) 25965 ( xhr.responseType || "text" ) !== "text" || 25966 typeof xhr.responseText !== "string" ? 25967 { binary: xhr.response } : 25968 { text: xhr.responseText }, 25969 xhr.getAllResponseHeaders() 25970 ); 25971 } 25972 } 25973 }; 25974 }; 25975 25976 // Listen to events 25977 xhr.onload = callback(); 25978 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); 25979 25980 // Support: IE 9 only 25981 // Use onreadystatechange to replace onabort 25982 // to handle uncaught aborts 25983 if ( xhr.onabort !== undefined ) { 25984 xhr.onabort = errorCallback; 25985 } else { 25986 xhr.onreadystatechange = function() { 25987 25988 // Check readyState before timeout as it changes 25989 if ( xhr.readyState === 4 ) { 25990 25991 // Allow onerror to be called first, 25992 // but that will not handle a native abort 25993 // Also, save errorCallback to a variable 25994 // as xhr.onerror cannot be accessed 25995 window.setTimeout( function() { 25996 if ( callback ) { 25997 errorCallback(); 25998 } 25999 } ); 26000 } 26001 }; 26002 } 26003 26004 // Create the abort callback 26005 callback = callback( "abort" ); 26006 26007 try { 26008 26009 // Do send the request (this may raise an exception) 26010 xhr.send( options.hasContent && options.data || null ); 26011 } catch ( e ) { 26012 26013 // trac-14683: Only rethrow if this hasn't been notified as an error yet 26014 if ( callback ) { 26015 throw e; 26016 } 26017 } 26018 }, 26019 26020 abort: function() { 26021 if ( callback ) { 26022 callback(); 26023 } 26024 } 26025 }; 26026 } 26027 } ); 26028 26029 26030 26031 26032// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 26033 jQuery.ajaxPrefilter( function( s ) { 26034 if ( s.crossDomain ) { 26035 s.contents.script = false; 26036 } 26037 } ); 26038 26039// Install script dataType 26040 jQuery.ajaxSetup( { 26041 accepts: { 26042 script: "text/javascript, application/javascript, " + 26043 "application/ecmascript, application/x-ecmascript" 26044 }, 26045 contents: { 26046 script: /\b(?:java|ecma)script\b/ 26047 }, 26048 converters: { 26049 "text script": function( text ) { 26050 jQuery.globalEval( text ); 26051 return text; 26052 } 26053 } 26054 } ); 26055 26056// Handle cache's special case and crossDomain 26057 jQuery.ajaxPrefilter( "script", function( s ) { 26058 if ( s.cache === undefined ) { 26059 s.cache = false; 26060 } 26061 if ( s.crossDomain ) { 26062 s.type = "GET"; 26063 } 26064 } ); 26065 26066// Bind script tag hack transport 26067 jQuery.ajaxTransport( "script", function( s ) { 26068 26069 // This transport only deals with cross domain or forced-by-attrs requests 26070 if ( s.crossDomain || s.scriptAttrs ) { 26071 var script, callback; 26072 return { 26073 send: function( _, complete ) { 26074 script = jQuery( "<script>" ) 26075 .attr( s.scriptAttrs || {} ) 26076 .prop( { charset: s.scriptCharset, src: s.url } ) 26077 .on( "load error", callback = function( evt ) { 26078 script.remove(); 26079 callback = null; 26080 if ( evt ) { 26081 complete( evt.type === "error" ? 404 : 200, evt.type ); 26082 } 26083 } ); 26084 26085 // Use native DOM manipulation to avoid our domManip AJAX trickery 26086 document.head.appendChild( script[ 0 ] ); 26087 }, 26088 abort: function() { 26089 if ( callback ) { 26090 callback(); 26091 } 26092 } 26093 }; 26094 } 26095 } ); 26096 26097 26098 26099 26100 var oldCallbacks = [], 26101 rjsonp = /(=)\?(?=&|$)|\?\?/; 26102 26103// Default jsonp settings 26104 jQuery.ajaxSetup( { 26105 jsonp: "callback", 26106 jsonpCallback: function() { 26107 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); 26108 this[ callback ] = true; 26109 return callback; 26110 } 26111 } ); 26112 26113// Detect, normalize options and install callbacks for jsonp requests 26114 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 26115 26116 var callbackName, overwritten, responseContainer, 26117 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 26118 "url" : 26119 typeof s.data === "string" && 26120 ( s.contentType || "" ) 26121 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 26122 rjsonp.test( s.data ) && "data" 26123 ); 26124 26125 // Handle iff the expected data type is "jsonp" or we have a parameter to set 26126 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 26127 26128 // Get callback name, remembering preexisting value associated with it 26129 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 26130 s.jsonpCallback() : 26131 s.jsonpCallback; 26132 26133 // Insert callback into url or form data 26134 if ( jsonProp ) { 26135 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 26136 } else if ( s.jsonp !== false ) { 26137 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 26138 } 26139 26140 // Use data converter to retrieve json after script execution 26141 s.converters[ "script json" ] = function() { 26142 if ( !responseContainer ) { 26143 jQuery.error( callbackName + " was not called" ); 26144 } 26145 return responseContainer[ 0 ]; 26146 }; 26147 26148 // Force json dataType 26149 s.dataTypes[ 0 ] = "json"; 26150 26151 // Install callback 26152 overwritten = window[ callbackName ]; 26153 window[ callbackName ] = function() { 26154 responseContainer = arguments; 26155 }; 26156 26157 // Clean-up function (fires after converters) 26158 jqXHR.always( function() { 26159 26160 // If previous value didn't exist - remove it 26161 if ( overwritten === undefined ) { 26162 jQuery( window ).removeProp( callbackName ); 26163 26164 // Otherwise restore preexisting value 26165 } else { 26166 window[ callbackName ] = overwritten; 26167 } 26168 26169 // Save back as free 26170 if ( s[ callbackName ] ) { 26171 26172 // Make sure that re-using the options doesn't screw things around 26173 s.jsonpCallback = originalSettings.jsonpCallback; 26174 26175 // Save the callback name for future use 26176 oldCallbacks.push( callbackName ); 26177 } 26178 26179 // Call if it was a function and we have a response 26180 if ( responseContainer && isFunction( overwritten ) ) { 26181 overwritten( responseContainer[ 0 ] ); 26182 } 26183 26184 responseContainer = overwritten = undefined; 26185 } ); 26186 26187 // Delegate to script 26188 return "script"; 26189 } 26190 } ); 26191 26192 26193 26194 26195// Support: Safari 8 only 26196// In Safari 8 documents created via document.implementation.createHTMLDocument 26197// collapse sibling forms: the second one becomes a child of the first one. 26198// Because of that, this security measure has to be disabled in Safari 8. 26199// https://bugs.webkit.org/show_bug.cgi?id=137337 26200 support.createHTMLDocument = ( function() { 26201 var body = document.implementation.createHTMLDocument( "" ).body; 26202 body.innerHTML = "<form></form><form></form>"; 26203 return body.childNodes.length === 2; 26204 } )(); 26205 26206 26207// Argument "data" should be string of html 26208// context (optional): If specified, the fragment will be created in this context, 26209// defaults to document 26210// keepScripts (optional): If true, will include scripts passed in the html string 26211 jQuery.parseHTML = function( data, context, keepScripts ) { 26212 if ( typeof data !== "string" ) { 26213 return []; 26214 } 26215 if ( typeof context === "boolean" ) { 26216 keepScripts = context; 26217 context = false; 26218 } 26219 26220 var base, parsed, scripts; 26221 26222 if ( !context ) { 26223 26224 // Stop scripts or inline event handlers from being executed immediately 26225 // by using document.implementation 26226 if ( support.createHTMLDocument ) { 26227 context = document.implementation.createHTMLDocument( "" ); 26228 26229 // Set the base href for the created document 26230 // so any parsed elements with URLs 26231 // are based on the document's URL (gh-2965) 26232 base = context.createElement( "base" ); 26233 base.href = document.location.href; 26234 context.head.appendChild( base ); 26235 } else { 26236 context = document; 26237 } 26238 } 26239 26240 parsed = rsingleTag.exec( data ); 26241 scripts = !keepScripts && []; 26242 26243 // Single tag 26244 if ( parsed ) { 26245 return [ context.createElement( parsed[ 1 ] ) ]; 26246 } 26247 26248 parsed = buildFragment( [ data ], context, scripts ); 26249 26250 if ( scripts && scripts.length ) { 26251 jQuery( scripts ).remove(); 26252 } 26253 26254 return jQuery.merge( [], parsed.childNodes ); 26255 }; 26256 26257 26258 /** 26259 * Load a url into a page 26260 */ 26261 jQuery.fn.load = function( url, params, callback ) { 26262 var selector, type, response, 26263 self = this, 26264 off = url.indexOf( " " ); 26265 26266 if ( off > -1 ) { 26267 selector = stripAndCollapse( url.slice( off ) ); 26268 url = url.slice( 0, off ); 26269 } 26270 26271 // If it's a function 26272 if ( isFunction( params ) ) { 26273 26274 // We assume that it's the callback 26275 callback = params; 26276 params = undefined; 26277 26278 // Otherwise, build a param string 26279 } else if ( params && typeof params === "object" ) { 26280 type = "POST"; 26281 } 26282 26283 // If we have elements to modify, make the request 26284 if ( self.length > 0 ) { 26285 jQuery.ajax( { 26286 url: url, 26287 26288 // If "type" variable is undefined, then "GET" method will be used. 26289 // Make value of this field explicit since 26290 // user can override it through ajaxSetup method 26291 type: type || "GET", 26292 dataType: "html", 26293 data: params 26294 } ).done( function( responseText ) { 26295 26296 // Save response for use in complete callback 26297 response = arguments; 26298 26299 self.html( selector ? 26300 26301 // If a selector was specified, locate the right elements in a dummy div 26302 // Exclude scripts to avoid IE 'Permission Denied' errors 26303 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 26304 26305 // Otherwise use the full result 26306 responseText ); 26307 26308 // If the request succeeds, this function gets "data", "status", "jqXHR" 26309 // but they are ignored because response was set above. 26310 // If it fails, this function gets "jqXHR", "status", "error" 26311 } ).always( callback && function( jqXHR, status ) { 26312 self.each( function() { 26313 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 26314 } ); 26315 } ); 26316 } 26317 26318 return this; 26319 }; 26320 26321 26322 26323 26324 jQuery.expr.pseudos.animated = function( elem ) { 26325 return jQuery.grep( jQuery.timers, function( fn ) { 26326 return elem === fn.elem; 26327 } ).length; 26328 }; 26329 26330 26331 26332 26333 jQuery.offset = { 26334 setOffset: function( elem, options, i ) { 26335 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 26336 position = jQuery.css( elem, "position" ), 26337 curElem = jQuery( elem ), 26338 props = {}; 26339 26340 // Set position first, in-case top/left are set even on static elem 26341 if ( position === "static" ) { 26342 elem.style.position = "relative"; 26343 } 26344 26345 curOffset = curElem.offset(); 26346 curCSSTop = jQuery.css( elem, "top" ); 26347 curCSSLeft = jQuery.css( elem, "left" ); 26348 calculatePosition = ( position === "absolute" || position === "fixed" ) && 26349 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 26350 26351 // Need to be able to calculate position if either 26352 // top or left is auto and position is either absolute or fixed 26353 if ( calculatePosition ) { 26354 curPosition = curElem.position(); 26355 curTop = curPosition.top; 26356 curLeft = curPosition.left; 26357 26358 } else { 26359 curTop = parseFloat( curCSSTop ) || 0; 26360 curLeft = parseFloat( curCSSLeft ) || 0; 26361 } 26362 26363 if ( isFunction( options ) ) { 26364 26365 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 26366 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 26367 } 26368 26369 if ( options.top != null ) { 26370 props.top = ( options.top - curOffset.top ) + curTop; 26371 } 26372 if ( options.left != null ) { 26373 props.left = ( options.left - curOffset.left ) + curLeft; 26374 } 26375 26376 if ( "using" in options ) { 26377 options.using.call( elem, props ); 26378 26379 } else { 26380 curElem.css( props ); 26381 } 26382 } 26383 }; 26384 26385 jQuery.fn.extend( { 26386 26387 // offset() relates an element's border box to the document origin 26388 offset: function( options ) { 26389 26390 // Preserve chaining for setter 26391 if ( arguments.length ) { 26392 return options === undefined ? 26393 this : 26394 this.each( function( i ) { 26395 jQuery.offset.setOffset( this, options, i ); 26396 } ); 26397 } 26398 26399 var rect, win, 26400 elem = this[ 0 ]; 26401 26402 if ( !elem ) { 26403 return; 26404 } 26405 26406 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 26407 // Support: IE <=11 only 26408 // Running getBoundingClientRect on a 26409 // disconnected node in IE throws an error 26410 if ( !elem.getClientRects().length ) { 26411 return { top: 0, left: 0 }; 26412 } 26413 26414 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 26415 rect = elem.getBoundingClientRect(); 26416 win = elem.ownerDocument.defaultView; 26417 return { 26418 top: rect.top + win.pageYOffset, 26419 left: rect.left + win.pageXOffset 26420 }; 26421 }, 26422 26423 // position() relates an element's margin box to its offset parent's padding box 26424 // This corresponds to the behavior of CSS absolute positioning 26425 position: function() { 26426 if ( !this[ 0 ] ) { 26427 return; 26428 } 26429 26430 var offsetParent, offset, doc, 26431 elem = this[ 0 ], 26432 parentOffset = { top: 0, left: 0 }; 26433 26434 // position:fixed elements are offset from the viewport, which itself always has zero offset 26435 if ( jQuery.css( elem, "position" ) === "fixed" ) { 26436 26437 // Assume position:fixed implies availability of getBoundingClientRect 26438 offset = elem.getBoundingClientRect(); 26439 26440 } else { 26441 offset = this.offset(); 26442 26443 // Account for the *real* offset parent, which can be the document or its root element 26444 // when a statically positioned element is identified 26445 doc = elem.ownerDocument; 26446 offsetParent = elem.offsetParent || doc.documentElement; 26447 while ( offsetParent && 26448 ( offsetParent === doc.body || offsetParent === doc.documentElement ) && 26449 jQuery.css( offsetParent, "position" ) === "static" ) { 26450 26451 offsetParent = offsetParent.parentNode; 26452 } 26453 if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { 26454 26455 // Incorporate borders into its offset, since they are outside its content origin 26456 parentOffset = jQuery( offsetParent ).offset(); 26457 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); 26458 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); 26459 } 26460 } 26461 26462 // Subtract parent offsets and element margins 26463 return { 26464 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 26465 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 26466 }; 26467 }, 26468 26469 // This method will return documentElement in the following cases: 26470 // 1) For the element inside the iframe without offsetParent, this method will return 26471 // documentElement of the parent window 26472 // 2) For the hidden or detached element 26473 // 3) For body or html element, i.e. in case of the html node - it will return itself 26474 // 26475 // but those exceptions were never presented as a real life use-cases 26476 // and might be considered as more preferable results. 26477 // 26478 // This logic, however, is not guaranteed and can change at any point in the future 26479 offsetParent: function() { 26480 return this.map( function() { 26481 var offsetParent = this.offsetParent; 26482 26483 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 26484 offsetParent = offsetParent.offsetParent; 26485 } 26486 26487 return offsetParent || documentElement; 26488 } ); 26489 } 26490 } ); 26491 26492// Create scrollLeft and scrollTop methods 26493 jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 26494 var top = "pageYOffset" === prop; 26495 26496 jQuery.fn[ method ] = function( val ) { 26497 return access( this, function( elem, method, val ) { 26498 26499 // Coalesce documents and windows 26500 var win; 26501 if ( isWindow( elem ) ) { 26502 win = elem; 26503 } else if ( elem.nodeType === 9 ) { 26504 win = elem.defaultView; 26505 } 26506 26507 if ( val === undefined ) { 26508 return win ? win[ prop ] : elem[ method ]; 26509 } 26510 26511 if ( win ) { 26512 win.scrollTo( 26513 !top ? val : win.pageXOffset, 26514 top ? val : win.pageYOffset 26515 ); 26516 26517 } else { 26518 elem[ method ] = val; 26519 } 26520 }, method, val, arguments.length ); 26521 }; 26522 } ); 26523 26524// Support: Safari <=7 - 9.1, Chrome <=37 - 49 26525// Add the top/left cssHooks using jQuery.fn.position 26526// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 26527// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 26528// getComputedStyle returns percent when specified for top/left/bottom/right; 26529// rather than make the css module depend on the offset module, just check for it here 26530 jQuery.each( [ "top", "left" ], function( _i, prop ) { 26531 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 26532 function( elem, computed ) { 26533 if ( computed ) { 26534 computed = curCSS( elem, prop ); 26535 26536 // If curCSS returns percentage, fallback to offset 26537 return rnumnonpx.test( computed ) ? 26538 jQuery( elem ).position()[ prop ] + "px" : 26539 computed; 26540 } 26541 } 26542 ); 26543 } ); 26544 26545 26546// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 26547 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 26548 jQuery.each( { 26549 padding: "inner" + name, 26550 content: type, 26551 "": "outer" + name 26552 }, function( defaultExtra, funcName ) { 26553 26554 // Margin is only for outerHeight, outerWidth 26555 jQuery.fn[ funcName ] = function( margin, value ) { 26556 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 26557 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 26558 26559 return access( this, function( elem, type, value ) { 26560 var doc; 26561 26562 if ( isWindow( elem ) ) { 26563 26564 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 26565 return funcName.indexOf( "outer" ) === 0 ? 26566 elem[ "inner" + name ] : 26567 elem.document.documentElement[ "client" + name ]; 26568 } 26569 26570 // Get document width or height 26571 if ( elem.nodeType === 9 ) { 26572 doc = elem.documentElement; 26573 26574 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 26575 // whichever is greatest 26576 return Math.max( 26577 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 26578 elem.body[ "offset" + name ], doc[ "offset" + name ], 26579 doc[ "client" + name ] 26580 ); 26581 } 26582 26583 return value === undefined ? 26584 26585 // Get width or height on the element, requesting but not forcing parseFloat 26586 jQuery.css( elem, type, extra ) : 26587 26588 // Set width or height on the element 26589 jQuery.style( elem, type, value, extra ); 26590 }, type, chainable ? margin : undefined, chainable ); 26591 }; 26592 } ); 26593 } ); 26594 26595 26596 jQuery.each( [ 26597 "ajaxStart", 26598 "ajaxStop", 26599 "ajaxComplete", 26600 "ajaxError", 26601 "ajaxSuccess", 26602 "ajaxSend" 26603 ], function( _i, type ) { 26604 jQuery.fn[ type ] = function( fn ) { 26605 return this.on( type, fn ); 26606 }; 26607 } ); 26608 26609 26610 26611 26612 jQuery.fn.extend( { 26613 26614 bind: function( types, data, fn ) { 26615 return this.on( types, null, data, fn ); 26616 }, 26617 unbind: function( types, fn ) { 26618 return this.off( types, null, fn ); 26619 }, 26620 26621 delegate: function( selector, types, data, fn ) { 26622 return this.on( types, selector, data, fn ); 26623 }, 26624 undelegate: function( selector, types, fn ) { 26625 26626 // ( namespace ) or ( selector, types [, fn] ) 26627 return arguments.length === 1 ? 26628 this.off( selector, "**" ) : 26629 this.off( types, selector || "**", fn ); 26630 }, 26631 26632 hover: function( fnOver, fnOut ) { 26633 return this 26634 .on( "mouseenter", fnOver ) 26635 .on( "mouseleave", fnOut || fnOver ); 26636 } 26637 } ); 26638 26639 jQuery.each( 26640 ( "blur focus focusin focusout resize scroll click dblclick " + 26641 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 26642 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 26643 function( _i, name ) { 26644 26645 // Handle event binding 26646 jQuery.fn[ name ] = function( data, fn ) { 26647 return arguments.length > 0 ? 26648 this.on( name, null, data, fn ) : 26649 this.trigger( name ); 26650 }; 26651 } 26652 ); 26653 26654 26655 26656 26657// Support: Android <=4.0 only 26658// Make sure we trim BOM and NBSP 26659// Require that the "whitespace run" starts from a non-whitespace 26660// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. 26661 var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; 26662 26663// Bind a function to a context, optionally partially applying any 26664// arguments. 26665// jQuery.proxy is deprecated to promote standards (specifically Function#bind) 26666// However, it is not slated for removal any time soon 26667 jQuery.proxy = function( fn, context ) { 26668 var tmp, args, proxy; 26669 26670 if ( typeof context === "string" ) { 26671 tmp = fn[ context ]; 26672 context = fn; 26673 fn = tmp; 26674 } 26675 26676 // Quick check to determine if target is callable, in the spec 26677 // this throws a TypeError, but we will just return undefined. 26678 if ( !isFunction( fn ) ) { 26679 return undefined; 26680 } 26681 26682 // Simulated bind 26683 args = slice.call( arguments, 2 ); 26684 proxy = function() { 26685 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 26686 }; 26687 26688 // Set the guid of unique handler to the same of original handler, so it can be removed 26689 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 26690 26691 return proxy; 26692 }; 26693 26694 jQuery.holdReady = function( hold ) { 26695 if ( hold ) { 26696 jQuery.readyWait++; 26697 } else { 26698 jQuery.ready( true ); 26699 } 26700 }; 26701 jQuery.isArray = Array.isArray; 26702 jQuery.parseJSON = JSON.parse; 26703 jQuery.nodeName = nodeName; 26704 jQuery.isFunction = isFunction; 26705 jQuery.isWindow = isWindow; 26706 jQuery.camelCase = camelCase; 26707 jQuery.type = toType; 26708 26709 jQuery.now = Date.now; 26710 26711 jQuery.isNumeric = function( obj ) { 26712 26713 // As of jQuery 3.0, isNumeric is limited to 26714 // strings and numbers (primitives or objects) 26715 // that can be coerced to finite numbers (gh-2662) 26716 var type = jQuery.type( obj ); 26717 return ( type === "number" || type === "string" ) && 26718 26719 // parseFloat NaNs numeric-cast false positives ("") 26720 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 26721 // subtraction forces infinities to NaN 26722 !isNaN( obj - parseFloat( obj ) ); 26723 }; 26724 26725 jQuery.trim = function( text ) { 26726 return text == null ? 26727 "" : 26728 ( text + "" ).replace( rtrim, "$1" ); 26729 }; 26730 26731 26732 26733// Register as a named AMD module, since jQuery can be concatenated with other 26734// files that may use define, but not via a proper concatenation script that 26735// understands anonymous AMD modules. A named AMD is safest and most robust 26736// way to register. Lowercase jquery is used because AMD module names are 26737// derived from file names, and jQuery is normally delivered in a lowercase 26738// file name. Do this after creating the global so that if an AMD module wants 26739// to call noConflict to hide this version of jQuery, it will work. 26740 26741// Note that for maximum portability, libraries that are not jQuery should 26742// declare themselves as anonymous modules, and avoid setting a global if an 26743// AMD loader is present. jQuery is a special case. For more information, see 26744// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 26745 26746 if ( true ) { 26747 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() { 26748 return jQuery; 26749 }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), 26750 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 26751 } 26752 26753 26754 26755 26756 var 26757 26758 // Map over jQuery in case of overwrite 26759 _jQuery = window.jQuery, 26760 26761 // Map over the $ in case of overwrite 26762 _$ = window.$; 26763 26764 jQuery.noConflict = function( deep ) { 26765 if ( window.$ === jQuery ) { 26766 window.$ = _$; 26767 } 26768 26769 if ( deep && window.jQuery === jQuery ) { 26770 window.jQuery = _jQuery; 26771 } 26772 26773 return jQuery; 26774 }; 26775 26776// Expose jQuery and $ identifiers, even in AMD 26777// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) 26778// and CommonJS for browser emulators (trac-13566) 26779 if ( typeof noGlobal === "undefined" ) { 26780 window.jQuery = window.$ = jQuery; 26781 } 26782 26783 26784 26785 26786 return jQuery; 26787 } ); 26788 26789 26790 /***/ }), 26791 26792
26792/***/ "./src/js/app.js": 26793 /*!***********************!*\ 26794 !*** ./src/js/app.js ***! 26795 \***********************/ 26796 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 26797 26798 "use strict"; 26799 __webpack_require__.r(__webpack_exports__); 26800 /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 26801 /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); 26802 /* harmony import */ var aos__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! aos */ "./node_modules/aos/dist/aos.js"); 26803 /* harmony import */ var aos__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(aos__WEBPACK_IMPORTED_MODULE_1__); 26804 /* harmony import */ var owl_carousel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! owl.carousel */ "./node_modules/owl.carousel/dist/owl.carousel.js"); 26805 /* harmony import */ var owl_carousel__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(owl_carousel__WEBPACK_IMPORTED_MODULE_2__); 26806 /* harmony import */ var _fancyapps_fancybox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fancyapps/fancybox */ "./node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js"); 26807 /* harmony import */ var _fancyapps_fancybox__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_fancyapps_fancybox__WEBPACK_IMPORTED_MODULE_3__); 26808 /* harmony import */ var bootstrap_js_dist_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! bootstrap/js/dist/button */ "./node_modules/bootstrap/js/dist/button.js"); 26809 /* harmony import */ var bootstrap_js_dist_button__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_button__WEBPACK_IMPORTED_MODULE_4__); 26810 /* harmony import */ var bootstrap_js_dist_dropdown__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! bootstrap/js/dist/dropdown */ "./node_modules/bootstrap/js/dist/dropdown.js"); 26811 /* harmony import */ var bootstrap_js_dist_dropdown__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_dropdown__WEBPACK_IMPORTED_MODULE_5__); 26812 /* harmony import */ var bootstrap_js_dist_scrollspy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! bootstrap/js/dist/scrollspy */ "./node_modules/bootstrap/js/dist/scrollspy.js"); 26813 /* harmony import */ var bootstrap_js_dist_scrollspy__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_scrollspy__WEBPACK_IMPORTED_MODULE_6__); 26814 /* harmony import */ var bootstrap_js_dist_tab__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! bootstrap/js/dist/tab */ "./node_modules/bootstrap/js/dist/tab.js"); 26815 /* harmony import */ var bootstrap_js_dist_tab__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_tab__WEBPACK_IMPORTED_MODULE_7__); 26816 /* harmony import */ var bootstrap_js_dist_tooltip__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! bootstrap/js/dist/tooltip */ "./node_modules/bootstrap/js/dist/tooltip.js"); 26817 /* harmony import */ var bootstrap_js_dist_tooltip__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_tooltip__WEBPACK_IMPORTED_MODULE_8__); 26818 /* harmony import */ var _modules_validate_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modules/_validate.mjs */ "./src/js/modules/_validate.mjs"); 26819 /* harmony import */ var _modules_serviceWorker_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modules/_serviceWorker.mjs */ "./src/js/modules/_serviceWorker.mjs"); 26820 /* harmony import */ var _modules_header_mjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modules/_header.mjs */ "./src/js/modules/_header.mjs"); 26821 /* harmony import */ var _modules_navbar_mjs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modules/_navbar.mjs */ "./src/js/modules/_navbar.mjs"); 26822 /* harmony import */ var _modules_animations_mjs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./modules/_animations.mjs */ "./src/js/modules/_animations.mjs"); 26823 /* harmony import */ var _modules_carousels_mjs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./modules/_carousels.mjs */ "./src/js/modules/_carousels.mjs"); 26824 /* harmony import */ var _modules_clipboard_mjs__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./modules/_clipboard.mjs */ "./src/js/modules/_clipboard.mjs"); 26825 /* harmony import */ var _modules_mobile_filters_sidebar_mjs__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./modules/_mobile-filters-sidebar.mjs */ "./src/js/modules/_mobile-filters-sidebar.mjs"); 26826 /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 26827 /**Load External Libraries**/ 26828 26829 26830 26831 26832 26833// import fontawesome 26834//import "@fortawesome/fontawesome-free/js/all"; 26835 26836 /**Load Bootstrap Javascript**/ 26837//import "bootstrap/js/dist/alert"; 26838 26839//import "bootstrap/js/dist/carousel"; 26840//import "bootstrap/js/dist/collapse"; 26841 26842//import "bootstrap/js/dist/modal"; 26843//import "bootstrap/js/dist/offcanvas"; 26844//import "bootstrap/js/dist/popover"; 26845 26846 26847//import "bootstrap/js/dist/toast"; 26848 26849 26850 /**Additional libraries**/ 26851 window._ = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js"); 26852 window.axios = __webpack_require__(/*! axios */ "./node_modules/axios/index.js"); //axios is only required for forms that have an input[type=file] field. 26853 window.Popper = (__webpack_require__(/*! @popperjs/core */ "./node_modules/@popperjs/core/lib/index.js")["default"]); //Popper is only required for Bootstrap Dropdowns, Popovers and Tooltips 26854 26855 /**Local Includes**/ 26856 26857 26858 26859 26860 26861 26862 26863 26864 26865 /**Initialize Functions**/ 26866 $(document).ready(function () { 26867 aos__WEBPACK_IMPORTED_MODULE_1___default().init(); 26868 (0,_modules_validate_mjs__WEBPACK_IMPORTED_MODULE_9__.validate)(); 26869 //serviceWorker(); 26870 //jarallax(document.querySelectorAll('.jarallax'), { speed: 0.8 }); 26871 //jarallaxVideo(); 26872 //searchbar(); 26873 (0,_modules_navbar_mjs__WEBPACK_IMPORTED_MODULE_12__.navbar)(); 26874 (0,_modules_animations_mjs__WEBPACK_IMPORTED_MODULE_13__.animateInView)(); 26875 (0,_modules_carousels_mjs__WEBPACK_IMPORTED_MODULE_14__.owl)(); 26876 //copyToClipboard(); 26877 //mobileFilterbar(); 26878 //toggleMobileFilterbar(); 26879 (0,_modules_navbar_mjs__WEBPACK_IMPORTED_MODULE_12__.mobileNav)(); 26880 }); 26881 26882// load window 26883 $(window).on("load", function () { 26884 $(".hero, .home-hero, .home-hero-logo-right, .home-hero-logo-left, .headerlogo-link, .header-right, .home-hero-cta, .scroll-indicator").addClass("loaded"); 26885 }); 26886 $('.btn-more').on('click touchstart', function (e) { 26887 var link = $(this).attr('href'); 26888 if (link == "#") { 26889 e.preventDefault(); 26890 $('html, body').animate({ 26891 scrollTop: $(this).offset().top 26892 }, 500); // for all browsers 26893 } 26894 }); 26895 let lastScrollTop = 0; 26896 26897 $(window).scroll(function () { 26898 var scroll = $(window).scrollTop(); 26899 26900 // Add/remove 'scroll' class based on threshold 26901 if (scroll >= 50) { 26902 $("body").addClass("scroll"); 26903 } else { 26904 $("body").removeClass("scroll"); 26905 } 26906 26907 $('.full-menu').hide(); 26908 $('.backdrop').removeClass('active'); 26909 26910 // Detect scroll direction only if difference is >= 10px 26911 if (Math.abs(scroll - lastScrollTop) >= 10) { 26912 if (scroll > lastScrollTop) { 26913 $("body").removeClass("up").addClass("down"); 26914 } else { 26915 $("body").removeClass("down").addClass("up"); 26916 } 26917 lastScrollTop = scroll; 26918 } 26919 }); 26920 $('[name=filter]').on('change', function () { 26921 var val = $(this).val(); 26922 if (val == '') { 26923 $('.categorie-item').show(); 26924 } else { 26925 $('.categorie-item').hide(); 26926 $('.' + val).show(); 26927 } 26928 }); 26929 $('[name=artikelen-filter]').on('change', function () { 26930 var val = $(this).val(); 26931 if (val == '') { 26932 $('.artikelen').show(); 26933 } else { 26934 $('.artikelen').hide(); 26935 $('.' + val).show(); 26936 } 26937 }); 26938 $(".icon").on('click touchstart', function (e) { 26939 $('body').toggleClass('no-scroll'); 26940 $('html').toggleClass('no-scroll'); 26941 $('body').toggleClass('open-nav'); 26942 $('.mobile-nav').toggleClass('active'); 26943 $('header nav ul').hide(); 26944 e.preventDefault(); 26945 }); 26946 $('.nav-back').on('click touchstart', function (e) { 26947 $('.mobile-nav').removeClass('showPage2'); 26948 e.preventDefault(); 26949 }); 26950 26951// window scroll 26952 $(window).on("scroll", function () { 26953 (0,_modules_navbar_mjs__WEBPACK_IMPORTED_MODULE_12__.navbar)(); 26954 (0,_modules_animations_mjs__WEBPACK_IMPORTED_MODULE_13__.animateInView)(); 26955 }); 26956 26957// resize window 26958 $(window).on("resize", function () { 26959 (0,_modules_mobile_filters_sidebar_mjs__WEBPACK_IMPORTED_MODULE_16__.mobileFilterbar)(); 26960 }); 26961 26962// Default Settings 26963 window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
26964 $.fancybox.defaults.hash = false; 26965 26966// document.addEventListener("touchstart", onTouchStart, { passive: true }); 26967 26968 var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); 26969 var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { 26970 return new (bootstrap_js_dist_tooltip__WEBPACK_IMPORTED_MODULE_8___default())(tooltipTriggerEl); 26971 }); 26972 $.expr[':'].external = function (obj) { 26973 return !obj.href.match(/^mailto\:/) && obj.hostname != location.hostname && !obj.href.match(/^javascript\:/) && !obj.href.match(/^$/); 26974 }; 26975 $('a:external').attr('target', '_blank'); 26976 26977 /***/ }), 26978 26979
vendor: 814,663 bytes, lines 26979-44191
26979/***/ "./node_modules/lodash/lodash.js": 26980 /*!***************************************!*\ 26981 !*** ./node_modules/lodash/lodash.js ***! 26982 \***************************************/ 26983 /***/ (function(module, exports, __webpack_require__) { 26984 26985 /* module decorator */ module = __webpack_require__.nmd(module); 26986 var __WEBPACK_AMD_DEFINE_RESULT__;/** 26987 * @license 26988 * Lodash <https://lodash.com/> 26989 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/> 26990 * Released under MIT license <https://lodash.com/license> 26991 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> 26992 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 26993 */ 26994 ;(function() { 26995 26996 /** Used as a safe reference for `undefined` in pre-ES5 environments. */ 26997 var undefined; 26998 26999 /** Used as the semantic version number. */ 27000 var VERSION = '4.17.21'; 27001 27002 /** Used as the size to enable large array optimizations. */ 27003 var LARGE_ARRAY_SIZE = 200; 27004 27005 /** Error message constants. */ 27006 var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', 27007 FUNC_ERROR_TEXT = 'Expected a function', 27008 INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`'; 27009 27010 /** Used to stand-in for `undefined` hash values. */ 27011 var HASH_UNDEFINED = '__lodash_hash_undefined__'; 27012 27013 /** Used as the maximum memoize cache size. */ 27014 var MAX_MEMOIZE_SIZE = 500; 27015 27016 /** Used as the internal argument placeholder. */ 27017 var PLACEHOLDER = '__lodash_placeholder__'; 27018 27019 /** Used to compose bitmasks for cloning. */ 27020 var CLONE_DEEP_FLAG = 1, 27021 CLONE_FLAT_FLAG = 2, 27022 CLONE_SYMBOLS_FLAG = 4; 27023 27024 /** Used to compose bitmasks for value comparisons. */ 27025 var COMPARE_PARTIAL_FLAG = 1, 27026 COMPARE_UNORDERED_FLAG = 2; 27027 27028 /** Used to compose bitmasks for function metadata. */ 27029 var WRAP_BIND_FLAG = 1, 27030 WRAP_BIND_KEY_FLAG = 2, 27031 WRAP_CURRY_BOUND_FLAG = 4, 27032 WRAP_CURRY_FLAG = 8, 27033 WRAP_CURRY_RIGHT_FLAG = 16, 27034 WRAP_PARTIAL_FLAG = 32, 27035 WRAP_PARTIAL_RIGHT_FLAG = 64, 27036 WRAP_ARY_FLAG = 128, 27037 WRAP_REARG_FLAG = 256, 27038 WRAP_FLIP_FLAG = 512; 27039 27040 /** Used as default options for `_.truncate`. */ 27041 var DEFAULT_TRUNC_LENGTH = 30, 27042 DEFAULT_TRUNC_OMISSION = '...'; 27043 27044 /** Used to detect hot functions by number of calls within a span of milliseconds. */ 27045 var HOT_COUNT = 800, 27046 HOT_SPAN = 16; 27047 27048 /** Used to indicate the type of lazy iteratees. */ 27049 var LAZY_FILTER_FLAG = 1, 27050 LAZY_MAP_FLAG = 2, 27051 LAZY_WHILE_FLAG = 3; 27052 27053 /** Used as references for various `Number` constants. */ 27054 var INFINITY = 1 / 0, 27055 MAX_SAFE_INTEGER = 9007199254740991, 27056 MAX_INTEGER = 1.7976931348623157e+308, 27057 NAN = 0 / 0; 27058 27059 /** Used as references for the maximum length and index of an array. */ 27060 var MAX_ARRAY_LENGTH = 4294967295, 27061 MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, 27062 HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; 27063 27064 /** Used to associate wrap methods with their bit flags. */ 27065 var wrapFlags = [ 27066 ['ary', WRAP_ARY_FLAG], 27067 ['bind', WRAP_BIND_FLAG], 27068 ['bindKey', WRAP_BIND_KEY_FLAG], 27069 ['curry', WRAP_CURRY_FLAG], 27070 ['curryRight', WRAP_CURRY_RIGHT_FLAG], 27071 ['flip', WRAP_FLIP_FLAG], 27072 ['partial', WRAP_PARTIAL_FLAG], 27073 ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], 27074 ['rearg', WRAP_REARG_FLAG] 27075 ]; 27076 27077 /** `Object#toString` result references. */ 27078 var argsTag = '[object Arguments]', 27079 arrayTag = '[object Array]', 27080 asyncTag = '[object AsyncFunction]', 27081 boolTag = '[object Boolean]', 27082 dateTag = '[object Date]', 27083 domExcTag = '[object DOMException]', 27084 errorTag = '[object Error]', 27085 funcTag = '[object Function]', 27086 genTag = '[object GeneratorFunction]', 27087 mapTag = '[object Map]', 27088 numberTag = '[object Number]', 27089 nullTag = '[object Null]', 27090 objectTag = '[object Object]', 27091 promiseTag = '[object Promise]', 27092 proxyTag = '[object Proxy]', 27093 regexpTag = '[object RegExp]', 27094 setTag = '[object Set]', 27095 stringTag = '[object String]', 27096 symbolTag = '[object Symbol]', 27097 undefinedTag = '[object Undefined]', 27098 weakMapTag = '[object WeakMap]', 27099 weakSetTag = '[object WeakSet]'; 27100 27101 var arrayBufferTag = '[object ArrayBuffer]', 27102 dataViewTag = '[object DataView]', 27103 float32Tag = '[object Float32Array]', 27104 float64Tag = '[object Float64Array]', 27105 int8Tag = '[object Int8Array]', 27106 int16Tag = '[object Int16Array]', 27107 int32Tag = '[object Int32Array]', 27108 uint8Tag = '[object Uint8Array]', 27109 uint8ClampedTag = '[object Uint8ClampedArray]', 27110 uint16Tag = '[object Uint16Array]', 27111 uint32Tag = '[object Uint32Array]'; 27112 27113 /** Used to match empty string literals in compiled template source. */ 27114 var reEmptyStringLeading = /\b__p \+= '';/g, 27115 reEmptyStringMiddle = /\b(__p \+=) '' \+/g, 27116 reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; 27117 27118 /** Used to match HTML entities and HTML characters. */ 27119 var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, 27120 reUnescapedHtml = /[&<>"']/g, 27121 reHasEscapedHtml = RegExp(reEscapedHtml.source), 27122 reHasUnescapedHtml = RegExp(reUnescapedHtml.source); 27123 27124 /** Used to match template delimiters. */ 27125 var reEscape = /<%-([\s\S]+?)%>/g, 27126 reEvaluate = /<%([\s\S]+?)%>/g, 27127 reInterpolate = /<%=([\s\S]+?)%>/g; 27128 27129 /** Used to match property names within property paths. */ 27130 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, 27131 reIsPlainProp = /^\w*$/, 27132 rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; 27133 27134 /** 27135 * Used to match `RegExp` 27136 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). 27137 */ 27138 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, 27139 reHasRegExpChar = RegExp(reRegExpChar.source); 27140 27141 /** Used to match leading whitespace. */ 27142 var reTrimStart = /^\s+/; 27143 27144 /** Used to match a single whitespace character. */ 27145 var reWhitespace = /\s/; 27146 27147 /** Used to match wrap detail comments. */ 27148 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, 27149 reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, 27150 reSplitDetails = /,? & /; 27151 27152 /** Used to match words composed of alphanumeric characters. */ 27153 var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; 27154 27155 /** 27156 * Used to validate the `validate` option in `_.template` variable. 27157 * 27158 * Forbids characters which could potentially change the meaning of the function argument definition: 27159 * - "()," (modification of function parameters) 27160 * - "=" (default value) 27161 * - "[]{}" (destructuring of function parameters) 27162 * - "/" (beginning of a comment) 27163 * - whitespace 27164 */ 27165 var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; 27166 27167 /** Used to match backslashes in property paths. */ 27168 var reEscapeChar = /\\(\\)?/g; 27169 27170 /** 27171 * Used to match 27172 * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). 27173 */ 27174 var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; 27175 27176 /** Used to match `RegExp` flags from their coerced string values. */ 27177 var reFlags = /\w*$/; 27178 27179 /** Used to detect bad signed hexadecimal string values. */ 27180 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; 27181 27182 /** Used to detect binary string values. */ 27183 var reIsBinary = /^0b[01]+$/i; 27184 27185 /** Used to detect host constructors (Safari). */ 27186 var reIsHostCtor = /^\[object .+?Constructor\]$/; 27187 27188 /** Used to detect octal string values. */ 27189 var reIsOctal = /^0o[0-7]+$/i; 27190 27191 /** Used to detect unsigned integer values. */ 27192 var reIsUint = /^(?:0|[1-9]\d*)$/; 27193 27194 /** Used to match Latin Unicode letters (excluding mathematical operators). */ 27195 var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; 27196 27197 /** Used to ensure capturing order of template delimiters. */ 27198 var reNoMatch = /($^)/; 27199 27200 /** Used to match unescaped characters in compiled string literals. */ 27201 var reUnescapedString = /['\n\r\u2028\u2029\\]/g; 27202 27203 /** Used to compose unicode character classes. */ 27204 var rsAstralRange = '\\ud800-\\udfff', 27205 rsComboMarksRange = '\\u0300-\\u036f', 27206 reComboHalfMarksRange = '\\ufe20-\\ufe2f', 27207 rsComboSymbolsRange = '\\u20d0-\\u20ff', 27208 rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, 27209 rsDingbatRange = '\\u2700-\\u27bf', 27210 rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', 27211 rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', 27212 rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', 27213 rsPunctuationRange = '\\u2000-\\u206f', 27214 rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', 27215 rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', 27216 rsVarRange = '\\ufe0e\\ufe0f', 27217 rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; 27218 27219 /** Used to compose unicode capture groups. */ 27220 var rsApos = "['\u2019]", 27221 rsAstral = '[' + rsAstralRange + ']', 27222 rsBreak = '[' + rsBreakRange + ']', 27223 rsCombo = '[' + rsComboRange + ']', 27224 rsDigits = '\\d+', 27225 rsDingbat = '[' + rsDingbatRange + ']', 27226 rsLower = '[' + rsLowerRange + ']', 27227 rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', 27228 rsFitz = '\\ud83c[\\udffb-\\udfff]', 27229 rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', 27230 rsNonAstral = '[^' + rsAstralRange + ']', 27231 rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', 27232 rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', 27233 rsUpper = '[' + rsUpperRange + ']', 27234 rsZWJ = '\\u200d'; 27235 27236 /** Used to compose unicode regexes. */ 27237 var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', 27238 rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', 27239 rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', 27240 rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', 27241 reOptMod = rsModifier + '?', 27242 rsOptVar = '[' + rsVarRange + ']?', 27243 rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', 27244 rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', 27245 rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', 27246 rsSeq = rsOptVar + reOptMod + rsOptJoin, 27247 rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, 27248 rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; 27249 27250 /** Used to match apostrophes. */ 27251 var reApos = RegExp(rsApos, 'g'); 27252 27253 /** 27254 * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and 27255 * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). 27256 */ 27257 var reComboMark = RegExp(rsCombo, 'g'); 27258 27259 /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ 27260 var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); 27261 27262 /** Used to match complex or compound words. */ 27263 var reUnicodeWord = RegExp([ 27264 rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', 27265 rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', 27266 rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, 27267 rsUpper + '+' + rsOptContrUpper, 27268 rsOrdUpper, 27269 rsOrdLower, 27270 rsDigits, 27271 rsEmoji 27272 ].join('|'), 'g'); 27273 27274 /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ 27275 var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); 27276 27277 /** Used to detect strings that need a more robust regexp to match words. */ 27278 var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; 27279 27280 /** Used to assign default `context` object properties. */ 27281 var contextProps = [ 27282 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', 27283 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', 27284 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', 27285 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', 27286 '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' 27287 ]; 27288 27289 /** Used to make template sourceURLs easier to identify. */ 27290 var templateCounter = -1; 27291 27292 /** Used to identify `toStringTag` values of typed arrays. */ 27293 var typedArrayTags = {}; 27294 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = 27295 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = 27296 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = 27297 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = 27298 typedArrayTags[uint32Tag] = true; 27299 typedArrayTags[argsTag] = typedArrayTags[arrayTag] = 27300 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = 27301 typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = 27302 typedArrayTags[errorTag] = typedArrayTags[funcTag] = 27303 typedArrayTags[mapTag] = typedArrayTags[numberTag] = 27304 typedArrayTags[objectTag] = typedArrayTags[regexpTag] = 27305 typedArrayTags[setTag] = typedArrayTags[stringTag] = 27306 typedArrayTags[weakMapTag] = false; 27307 27308 /** Used to identify `toStringTag` values supported by `_.clone`. */ 27309 var cloneableTags = {}; 27310 cloneableTags[argsTag] = cloneableTags[arrayTag] = 27311 cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = 27312 cloneableTags[boolTag] = cloneableTags[dateTag] = 27313 cloneableTags[float32Tag] = cloneableTags[float64Tag] = 27314 cloneableTags[int8Tag] = cloneableTags[int16Tag] = 27315 cloneableTags[int32Tag] = cloneableTags[mapTag] = 27316 cloneableTags[numberTag] = cloneableTags[objectTag] = 27317 cloneableTags[regexpTag] = cloneableTags[setTag] = 27318 cloneableTags[stringTag] = cloneableTags[symbolTag] = 27319 cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = 27320 cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; 27321 cloneableTags[errorTag] = cloneableTags[funcTag] = 27322 cloneableTags[weakMapTag] = false; 27323 27324 /** Used to map Latin Unicode letters to basic Latin letters. */ 27325 var deburredLetters = { 27326 // Latin-1 Supplement block. 27327 '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', 27328 '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', 27329 '\xc7': 'C', '\xe7': 'c', 27330 '\xd0': 'D', '\xf0': 'd', 27331 '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', 27332 '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', 27333 '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', 27334 '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', 27335 '\xd1': 'N', '\xf1': 'n', 27336 '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', 27337 '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', 27338 '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', 27339 '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', 27340 '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', 27341 '\xc6': 'Ae', '\xe6': 'ae', 27342 '\xde': 'Th', '\xfe': 'th', 27343 '\xdf': 'ss', 27344 // Latin Extended-A block. 27345 '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', 27346 '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', 27347 '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', 27348 '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', 27349 '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', 27350 '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', 27351 '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', 27352 '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', 27353 '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', 27354 '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', 27355 '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', 27356 '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', 27357 '\u0134': 'J', '\u0135': 'j', 27358 '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', 27359 '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', 27360 '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', 27361 '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', 27362 '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', 27363 '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', 27364 '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', 27365 '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', 27366 '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', 27367 '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', 27368 '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', 27369 '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', 27370 '\u0163': 't', '\u0165': 't', '\u0167': 't', 27371 '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', 27372 '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', 27373 '\u0174': 'W', '\u0175': 'w', 27374 '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', 27375 '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', 27376 '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', 27377 '\u0132': 'IJ', '\u0133': 'ij', 27378 '\u0152': 'Oe', '\u0153': 'oe', 27379 '\u0149': "'n", '\u017f': 's' 27380 }; 27381 27382 /** Used to map characters to HTML entities. */ 27383 var htmlEscapes = { 27384 '&': '&', 27385 '<': '<', 27386 '>': '>', 27387 '"': '"', 27388 "'": ''' 27389 }; 27390 27391 /** Used to map HTML entities to characters. */ 27392 var htmlUnescapes = { 27393 '&': '&', 27394 '<': '<', 27395 '>': '>', 27396 '"': '"', 27397 ''': "'" 27398 }; 27399 27400 /** Used to escape characters for inclusion in compiled string literals. */ 27401 var stringEscapes = { 27402 '\\': '\\', 27403 "'": "'", 27404 '\n': 'n', 27405 '\r': 'r', 27406 '\u2028': 'u2028', 27407 '\u2029': 'u2029' 27408 }; 27409 27410 /** Built-in method references without a dependency on `root`. */ 27411 var freeParseFloat = parseFloat, 27412 freeParseInt = parseInt; 27413 27414 /** Detect free variable `global` from Node.js. */ 27415 var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; 27416 27417 /** Detect free variable `self`. */ 27418 var freeSelf = typeof self == 'object' && self && self.Object === Object && self; 27419 27420 /** Used as a reference to the global object. */ 27421 var root = freeGlobal || freeSelf || Function('return this')(); 27422 27423 /** Detect free variable `exports`. */ 27424 var freeExports = true && exports && !exports.nodeType && exports; 27425 27426 /** Detect free variable `module`. */ 27427 var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; 27428 27429 /** Detect the popular CommonJS extension `module.exports`. */ 27430 var moduleExports = freeModule && freeModule.exports === freeExports; 27431 27432 /** Detect free variable `process` from Node.js. */ 27433 var freeProcess = moduleExports && freeGlobal.process; 27434 27435 /** Used to access faster Node.js helpers. */ 27436 var nodeUtil = (function() { 27437 try { 27438 // Use `util.types` for Node.js 10+. 27439 var types = freeModule && freeModule.require && freeModule.require('util').types; 27440 27441 if (types) { 27442 return types; 27443 } 27444 27445 // Legacy `process.binding('util')` for Node.js < 10. 27446 return freeProcess && freeProcess.binding && freeProcess.binding('util'); 27447 } catch (e) {} 27448 }()); 27449 27450 /* Node.js helper references. */ 27451 var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, 27452 nodeIsDate = nodeUtil && nodeUtil.isDate, 27453 nodeIsMap = nodeUtil && nodeUtil.isMap, 27454 nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, 27455 nodeIsSet = nodeUtil && nodeUtil.isSet, 27456 nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; 27457 27458 /*--------------------------------------------------------------------------*/ 27459 27460 /** 27461 * A faster alternative to `Function#apply`, this function invokes `func` 27462 * with the `this` binding of `thisArg` and the arguments of `args`. 27463 * 27464 * @private 27465 * @param {Function} func The function to invoke. 27466 * @param {*} thisArg The `this` binding of `func`. 27467 * @param {Array} args The arguments to invoke `func` with. 27468 * @returns {*} Returns the result of `func`. 27469 */ 27470 function apply(func, thisArg, args) { 27471 switch (args.length) { 27472 case 0: return func.call(thisArg); 27473 case 1: return func.call(thisArg, args[0]); 27474 case 2: return func.call(thisArg, args[0], args[1]); 27475 case 3: return func.call(thisArg, args[0], args[1], args[2]); 27476 } 27477 return func.apply(thisArg, args); 27478 } 27479 27480 /** 27481 * A specialized version of `baseAggregator` for arrays. 27482 * 27483 * @private 27484 * @param {Array} [array] The array to iterate over. 27485 * @param {Function} setter The function to set `accumulator` values. 27486 * @param {Function} iteratee The iteratee to transform keys. 27487 * @param {Object} accumulator The initial aggregated object. 27488 * @returns {Function} Returns `accumulator`. 27489 */ 27490 function arrayAggregator(array, setter, iteratee, accumulator) { 27491 var index = -1, 27492 length = array == null ? 0 : array.length; 27493 27494 while (++index < length) { 27495 var value = array[index]; 27496 setter(accumulator, value, iteratee(value), array); 27497 } 27498 return accumulator; 27499 } 27500 27501 /** 27502 * A specialized version of `_.forEach` for arrays without support for 27503 * iteratee shorthands. 27504 * 27505 * @private 27506 * @param {Array} [array] The array to iterate over. 27507 * @param {Function} iteratee The function invoked per iteration. 27508 * @returns {Array} Returns `array`. 27509 */ 27510 function arrayEach(array, iteratee) { 27511 var index = -1, 27512 length = array == null ? 0 : array.length; 27513 27514 while (++index < length) { 27515 if (iteratee(array[index], index, array) === false) { 27516 break; 27517 } 27518 } 27519 return array; 27520 } 27521 27522 /** 27523 * A specialized version of `_.forEachRight` for arrays without support for 27524 * iteratee shorthands. 27525 * 27526 * @private 27527 * @param {Array} [array] The array to iterate over. 27528 * @param {Function} iteratee The function invoked per iteration. 27529 * @returns {Array} Returns `array`. 27530 */ 27531 function arrayEachRight(array, iteratee) { 27532 var length = array == null ? 0 : array.length; 27533 27534 while (length--) { 27535 if (iteratee(array[length], length, array) === false) { 27536 break; 27537 } 27538 } 27539 return array; 27540 } 27541 27542 /** 27543 * A specialized version of `_.every` for arrays without support for 27544 * iteratee shorthands. 27545 * 27546 * @private 27547 * @param {Array} [array] The array to iterate over. 27548 * @param {Function} predicate The function invoked per iteration. 27549 * @returns {boolean} Returns `true` if all elements pass the predicate check, 27550 * else `false`. 27551 */ 27552 function arrayEvery(array, predicate) { 27553 var index = -1, 27554 length = array == null ? 0 : array.length; 27555 27556 while (++index < length) { 27557 if (!predicate(array[index], index, array)) { 27558 return false; 27559 } 27560 } 27561 return true; 27562 } 27563 27564 /** 27565 * A specialized version of `_.filter` for arrays without support for 27566 * iteratee shorthands. 27567 * 27568 * @private 27569 * @param {Array} [array] The array to iterate over. 27570 * @param {Function} predicate The function invoked per iteration. 27571 * @returns {Array} Returns the new filtered array. 27572 */ 27573 function arrayFilter(array, predicate) { 27574 var index = -1, 27575 length = array == null ? 0 : array.length, 27576 resIndex = 0, 27577 result = []; 27578 27579 while (++index < length) { 27580 var value = array[index]; 27581 if (predicate(value, index, array)) { 27582 result[resIndex++] = value; 27583 } 27584 } 27585 return result; 27586 } 27587 27588 /** 27589 * A specialized version of `_.includes` for arrays without support for 27590 * specifying an index to search from. 27591 * 27592 * @private 27593 * @param {Array} [array] The array to inspect. 27594 * @param {*} target The value to search for. 27595 * @returns {boolean} Returns `true` if `target` is found, else `false`. 27596 */ 27597 function arrayIncludes(array, value) { 27598 var length = array == null ? 0 : array.length; 27599 return !!length && baseIndexOf(array, value, 0) > -1; 27600 } 27601 27602 /** 27603 * This function is like `arrayIncludes` except that it accepts a comparator. 27604 * 27605 * @private 27606 * @param {Array} [array] The array to inspect. 27607 * @param {*} target The value to search for. 27608 * @param {Function} comparator The comparator invoked per element. 27609 * @returns {boolean} Returns `true` if `target` is found, else `false`. 27610 */ 27611 function arrayIncludesWith(array, value, comparator) { 27612 var index = -1, 27613 length = array == null ? 0 : array.length; 27614 27615 while (++index < length) { 27616 if (comparator(value, array[index])) { 27617 return true; 27618 } 27619 } 27620 return false; 27621 } 27622 27623 /** 27624 * A specialized version of `_.map` for arrays without support for iteratee 27625 * shorthands. 27626 * 27627 * @private 27628 * @param {Array} [array] The array to iterate over. 27629 * @param {Function} iteratee The function invoked per iteration. 27630 * @returns {Array} Returns the new mapped array. 27631 */ 27632 function arrayMap(array, iteratee) { 27633 var index = -1, 27634 length = array == null ? 0 : array.length, 27635 result = Array(length); 27636 27637 while (++index < length) { 27638 result[index] = iteratee(array[index], index, array); 27639 } 27640 return result; 27641 } 27642 27643 /** 27644 * Appends the elements of `values` to `array`. 27645 * 27646 * @private 27647 * @param {Array} array The array to modify. 27648 * @param {Array} values The values to append. 27649 * @returns {Array} Returns `array`. 27650 */ 27651 function arrayPush(array, values) { 27652 var index = -1, 27653 length = values.length, 27654 offset = array.length; 27655 27656 while (++index < length) { 27657 array[offset + index] = values[index]; 27658 } 27659 return array; 27660 } 27661 27662 /** 27663 * A specialized version of `_.reduce` for arrays without support for 27664 * iteratee shorthands. 27665 * 27666 * @private 27667 * @param {Array} [array] The array to iterate over. 27668 * @param {Function} iteratee The function invoked per iteration. 27669 * @param {*} [accumulator] The initial value. 27670 * @param {boolean} [initAccum] Specify using the first element of `array` as 27671 * the initial value. 27672 * @returns {*} Returns the accumulated value. 27673 */ 27674 function arrayReduce(array, iteratee, accumulator, initAccum) { 27675 var index = -1, 27676 length = array == null ? 0 : array.length; 27677 27678 if (initAccum && length) { 27679 accumulator = array[++index]; 27680 } 27681 while (++index < length) { 27682 accumulator = iteratee(accumulator, array[index], index, array); 27683 } 27684 return accumulator; 27685 } 27686 27687 /** 27688 * A specialized version of `_.reduceRight` for arrays without support for 27689 * iteratee shorthands. 27690 * 27691 * @private 27692 * @param {Array} [array] The array to iterate over. 27693 * @param {Function} iteratee The function invoked per iteration. 27694 * @param {*} [accumulator] The initial value. 27695 * @param {boolean} [initAccum] Specify using the last element of `array` as 27696 * the initial value. 27697 * @returns {*} Returns the accumulated value. 27698 */ 27699 function arrayReduceRight(array, iteratee, accumulator, initAccum) { 27700 var length = array == null ? 0 : array.length; 27701 if (initAccum && length) { 27702 accumulator = array[--length]; 27703 } 27704 while (length--) { 27705 accumulator = iteratee(accumulator, array[length], length, array); 27706 } 27707 return accumulator; 27708 } 27709 27710 /** 27711 * A specialized version of `_.some` for arrays without support for iteratee 27712 * shorthands. 27713 * 27714 * @private 27715 * @param {Array} [array] The array to iterate over. 27716 * @param {Function} predicate The function invoked per iteration. 27717 * @returns {boolean} Returns `true` if any element passes the predicate check, 27718 * else `false`. 27719 */ 27720 function arraySome(array, predicate) { 27721 var index = -1, 27722 length = array == null ? 0 : array.length; 27723 27724 while (++index < length) { 27725 if (predicate(array[index], index, array)) { 27726 return true; 27727 } 27728 } 27729 return false; 27730 } 27731 27732 /** 27733 * Gets the size of an ASCII `string`. 27734 * 27735 * @private 27736 * @param {string} string The string inspect. 27737 * @returns {number} Returns the string size. 27738 */ 27739 var asciiSize = baseProperty('length'); 27740 27741 /** 27742 * Converts an ASCII `string` to an array. 27743 * 27744 * @private 27745 * @param {string} string The string to convert. 27746 * @returns {Array} Returns the converted array. 27747 */ 27748 function asciiToArray(string) { 27749 return string.split(''); 27750 } 27751 27752 /** 27753 * Splits an ASCII `string` into an array of its words. 27754 * 27755 * @private 27756 * @param {string} The string to inspect. 27757 * @returns {Array} Returns the words of `string`. 27758 */ 27759 function asciiWords(string) { 27760 return string.match(reAsciiWord) || []; 27761 } 27762 27763 /** 27764 * The base implementation of methods like `_.findKey` and `_.findLastKey`, 27765 * without support for iteratee shorthands, which iterates over `collection` 27766 * using `eachFunc`. 27767 * 27768 * @private 27769 * @param {Array|Object} collection The collection to inspect. 27770 * @param {Function} predicate The function invoked per iteration. 27771 * @param {Function} eachFunc The function to iterate over `collection`. 27772 * @returns {*} Returns the found element or its key, else `undefined`. 27773 */ 27774 function baseFindKey(collection, predicate, eachFunc) { 27775 var result; 27776 eachFunc(collection, function(value, key, collection) { 27777 if (predicate(value, key, collection)) { 27778 result = key; 27779 return false; 27780 } 27781 }); 27782 return result; 27783 } 27784 27785 /** 27786 * The base implementation of `_.findIndex` and `_.findLastIndex` without 27787 * support for iteratee shorthands. 27788 * 27789 * @private 27790 * @param {Array} array The array to inspect. 27791 * @param {Function} predicate The function invoked per iteration. 27792 * @param {number} fromIndex The index to search from. 27793 * @param {boolean} [fromRight] Specify iterating from right to left. 27794 * @returns {number} Returns the index of the matched value, else `-1`. 27795 */ 27796 function baseFindIndex(array, predicate, fromIndex, fromRight) { 27797 var length = array.length, 27798 index = fromIndex + (fromRight ? 1 : -1); 27799 27800 while ((fromRight ? index-- : ++index < length)) { 27801 if (predicate(array[index], index, array)) { 27802 return index; 27803 } 27804 } 27805 return -1; 27806 } 27807 27808 /** 27809 * The base implementation of `_.indexOf` without `fromIndex` bounds checks. 27810 * 27811 * @private 27812 * @param {Array} array The array to inspect. 27813 * @param {*} value The value to search for. 27814 * @param {number} fromIndex The index to search from. 27815 * @returns {number} Returns the index of the matched value, else `-1`. 27816 */ 27817 function baseIndexOf(array, value, fromIndex) { 27818 return value === value 27819 ? strictIndexOf(array, value, fromIndex) 27820 : baseFindIndex(array, baseIsNaN, fromIndex); 27821 } 27822 27823 /** 27824 * This function is like `baseIndexOf` except that it accepts a comparator. 27825 * 27826 * @private 27827 * @param {Array} array The array to inspect. 27828 * @param {*} value The value to search for. 27829 * @param {number} fromIndex The index to search from. 27830 * @param {Function} comparator The comparator invoked per element. 27831 * @returns {number} Returns the index of the matched value, else `-1`. 27832 */ 27833 function baseIndexOfWith(array, value, fromIndex, comparator) { 27834 var index = fromIndex - 1, 27835 length = array.length; 27836 27837 while (++index < length) { 27838 if (comparator(array[index], value)) { 27839 return index; 27840 } 27841 } 27842 return -1; 27843 } 27844 27845 /** 27846 * The base implementation of `_.isNaN` without support for number objects. 27847 * 27848 * @private 27849 * @param {*} value The value to check. 27850 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. 27851 */ 27852 function baseIsNaN(value) { 27853 return value !== value; 27854 } 27855 27856 /** 27857 * The base implementation of `_.mean` and `_.meanBy` without support for 27858 * iteratee shorthands. 27859 * 27860 * @private 27861 * @param {Array} array The array to iterate over. 27862 * @param {Function} iteratee The function invoked per iteration. 27863 * @returns {number} Returns the mean. 27864 */ 27865 function baseMean(array, iteratee) { 27866 var length = array == null ? 0 : array.length; 27867 return length ? (baseSum(array, iteratee) / length) : NAN; 27868 } 27869 27870 /** 27871 * The base implementation of `_.property` without support for deep paths. 27872 * 27873 * @private 27874 * @param {string} key The key of the property to get. 27875 * @returns {Function} Returns the new accessor function. 27876 */ 27877 function baseProperty(key) { 27878 return function(object) { 27879 return object == null ? undefined : object[key]; 27880 }; 27881 } 27882 27883 /** 27884 * The base implementation of `_.propertyOf` without support for deep paths. 27885 * 27886 * @private 27887 * @param {Object} object The object to query. 27888 * @returns {Function} Returns the new accessor function. 27889 */ 27890 function basePropertyOf(object) { 27891 return function(key) { 27892 return object == null ? undefined : object[key]; 27893 }; 27894 } 27895 27896 /** 27897 * The base implementation of `_.reduce` and `_.reduceRight`, without support 27898 * for iteratee shorthands, which iterates over `collection` using `eachFunc`. 27899 * 27900 * @private 27901 * @param {Array|Object} collection The collection to iterate over. 27902 * @param {Function} iteratee The function invoked per iteration. 27903 * @param {*} accumulator The initial value. 27904 * @param {boolean} initAccum Specify using the first or last element of 27905 * `collection` as the initial value. 27906 * @param {Function} eachFunc The function to iterate over `collection`. 27907 * @returns {*} Returns the accumulated value. 27908 */ 27909 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { 27910 eachFunc(collection, function(value, index, collection) { 27911 accumulator = initAccum 27912 ? (initAccum = false, value) 27913 : iteratee(accumulator, value, index, collection); 27914 }); 27915 return accumulator; 27916 } 27917 27918 /** 27919 * The base implementation of `_.sortBy` which uses `comparer` to define the 27920 * sort order of `array` and replaces criteria objects with their corresponding 27921 * values. 27922 * 27923 * @private 27924 * @param {Array} array The array to sort. 27925 * @param {Function} comparer The function to define sort order. 27926 * @returns {Array} Returns `array`. 27927 */ 27928 function baseSortBy(array, comparer) { 27929 var length = array.length; 27930 27931 array.sort(comparer); 27932 while (length--) { 27933 array[length] = array[length].value; 27934 } 27935 return array; 27936 } 27937 27938 /** 27939 * The base implementation of `_.sum` and `_.sumBy` without support for 27940 * iteratee shorthands. 27941 * 27942 * @private 27943 * @param {Array} array The array to iterate over. 27944 * @param {Function} iteratee The function invoked per iteration. 27945 * @returns {number} Returns the sum. 27946 */ 27947 function baseSum(array, iteratee) { 27948 var result, 27949 index = -1, 27950 length = array.length; 27951 27952 while (++index < length) { 27953 var current = iteratee(array[index]); 27954 if (current !== undefined) { 27955 result = result === undefined ? current : (result + current); 27956 } 27957 } 27958 return result; 27959 } 27960 27961 /** 27962 * The base implementation of `_.times` without support for iteratee shorthands 27963 * or max array length checks. 27964 * 27965 * @private 27966 * @param {number} n The number of times to invoke `iteratee`. 27967 * @param {Function} iteratee The function invoked per iteration. 27968 * @returns {Array} Returns the array of results. 27969 */ 27970 function baseTimes(n, iteratee) { 27971 var index = -1, 27972 result = Array(n); 27973 27974 while (++index < n) { 27975 result[index] = iteratee(index); 27976 } 27977 return result; 27978 } 27979 27980 /** 27981 * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array 27982 * of key-value pairs for `object` corresponding to the property names of `props`. 27983 * 27984 * @private 27985 * @param {Object} object The object to query. 27986 * @param {Array} props The property names to get values for. 27987 * @returns {Object} Returns the key-value pairs. 27988 */ 27989 function baseToPairs(object, props) { 27990 return arrayMap(props, function(key) { 27991 return [key, object[key]]; 27992 }); 27993 } 27994 27995 /** 27996 * The base implementation of `_.trim`. 27997 * 27998 * @private 27999 * @param {string} string The string to trim. 28000 * @returns {string} Returns the trimmed string. 28001 */ 28002 function baseTrim(string) { 28003 return string 28004 ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') 28005 : string; 28006 } 28007 28008 /** 28009 * The base implementation of `_.unary` without support for storing metadata. 28010 * 28011 * @private 28012 * @param {Function} func The function to cap arguments for. 28013 * @returns {Function} Returns the new capped function. 28014 */ 28015 function baseUnary(func) { 28016 return function(value) { 28017 return func(value); 28018 }; 28019 } 28020 28021 /** 28022 * The base implementation of `_.values` and `_.valuesIn` which creates an 28023 * array of `object` property values corresponding to the property names 28024 * of `props`. 28025 * 28026 * @private 28027 * @param {Object} object The object to query. 28028 * @param {Array} props The property names to get values for. 28029 * @returns {Object} Returns the array of property values. 28030 */ 28031 function baseValues(object, props) { 28032 return arrayMap(props, function(key) { 28033 return object[key]; 28034 }); 28035 } 28036 28037 /** 28038 * Checks if a `cache` value for `key` exists. 28039 * 28040 * @private 28041 * @param {Object} cache The cache to query. 28042 * @param {string} key The key of the entry to check. 28043 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. 28044 */ 28045 function cacheHas(cache, key) { 28046 return cache.has(key); 28047 } 28048 28049 /** 28050 * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol 28051 * that is not found in the character symbols. 28052 * 28053 * @private 28054 * @param {Array} strSymbols The string symbols to inspect. 28055 * @param {Array} chrSymbols The character symbols to find. 28056 * @returns {number} Returns the index of the first unmatched string symbol. 28057 */ 28058 function charsStartIndex(strSymbols, chrSymbols) { 28059 var index = -1, 28060 length = strSymbols.length; 28061 28062 while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} 28063 return index; 28064 } 28065 28066 /** 28067 * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol 28068 * that is not found in the character symbols. 28069 * 28070 * @private 28071 * @param {Array} strSymbols The string symbols to inspect. 28072 * @param {Array} chrSymbols The character symbols to find. 28073 * @returns {number} Returns the index of the last unmatched string symbol. 28074 */ 28075 function charsEndIndex(strSymbols, chrSymbols) { 28076 var index = strSymbols.length; 28077 28078 while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} 28079 return index; 28080 } 28081 28082 /** 28083 * Gets the number of `placeholder` occurrences in `array`. 28084 * 28085 * @private 28086 * @param {Array} array The array to inspect. 28087 * @param {*} placeholder The placeholder to search for. 28088 * @returns {number} Returns the placeholder count. 28089 */ 28090 function countHolders(array, placeholder) { 28091 var length = array.length, 28092 result = 0; 28093 28094 while (length--) { 28095 if (array[length] === placeholder) { 28096 ++result; 28097 } 28098 } 28099 return result; 28100 } 28101 28102 /** 28103 * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A 28104 * letters to basic Latin letters. 28105 * 28106 * @private 28107 * @param {string} letter The matched letter to deburr. 28108 * @returns {string} Returns the deburred letter. 28109 */ 28110 var deburrLetter = basePropertyOf(deburredLetters); 28111 28112 /** 28113 * Used by `_.escape` to convert characters to HTML entities. 28114 * 28115 * @private 28116 * @param {string} chr The matched character to escape. 28117 * @returns {string} Returns the escaped character. 28118 */ 28119 var escapeHtmlChar = basePropertyOf(htmlEscapes); 28120 28121 /** 28122 * Used by `_.template` to escape characters for inclusion in compiled string literals. 28123 * 28124 * @private 28125 * @param {string} chr The matched character to escape. 28126 * @returns {string} Returns the escaped character. 28127 */ 28128 function escapeStringChar(chr) { 28129 return '\\' + stringEscapes[chr]; 28130 } 28131 28132 /** 28133 * Gets the value at `key` of `object`. 28134 * 28135 * @private 28136 * @param {Object} [object] The object to query. 28137 * @param {string} key The key of the property to get. 28138 * @returns {*} Returns the property value. 28139 */ 28140 function getValue(object, key) { 28141 return object == null ? undefined : object[key]; 28142 } 28143 28144 /** 28145 * Checks if `string` contains Unicode symbols. 28146 * 28147 * @private 28148 * @param {string} string The string to inspect. 28149 * @returns {boolean} Returns `true` if a symbol is found, else `false`. 28150 */ 28151 function hasUnicode(string) { 28152 return reHasUnicode.test(string); 28153 } 28154 28155 /** 28156 * Checks if `string` contains a word composed of Unicode symbols. 28157 * 28158 * @private 28159 * @param {string} string The string to inspect. 28160 * @returns {boolean} Returns `true` if a word is found, else `false`. 28161 */ 28162 function hasUnicodeWord(string) { 28163 return reHasUnicodeWord.test(string); 28164 } 28165 28166 /** 28167 * Converts `iterator` to an array. 28168 * 28169 * @private 28170 * @param {Object} iterator The iterator to convert. 28171 * @returns {Array} Returns the converted array. 28172 */ 28173 function iteratorToArray(iterator) { 28174 var data, 28175 result = []; 28176 28177 while (!(data = iterator.next()).done) { 28178 result.push(data.value); 28179 } 28180 return result; 28181 } 28182 28183 /** 28184 * Converts `map` to its key-value pairs. 28185 * 28186 * @private 28187 * @param {Object} map The map to convert. 28188 * @returns {Array} Returns the key-value pairs. 28189 */ 28190 function mapToArray(map) { 28191 var index = -1, 28192 result = Array(map.size); 28193 28194 map.forEach(function(value, key) { 28195 result[++index] = [key, value]; 28196 }); 28197 return result; 28198 } 28199 28200 /** 28201 * Creates a unary function that invokes `func` with its argument transformed. 28202 * 28203 * @private 28204 * @param {Function} func The function to wrap. 28205 * @param {Function} transform The argument transform. 28206 * @returns {Function} Returns the new function. 28207 */ 28208 function overArg(func, transform) { 28209 return function(arg) { 28210 return func(transform(arg)); 28211 }; 28212 } 28213 28214 /** 28215 * Replaces all `placeholder` elements in `array` with an internal placeholder 28216 * and returns an array of their indexes. 28217 * 28218 * @private 28219 * @param {Array} array The array to modify. 28220 * @param {*} placeholder The placeholder to replace. 28221 * @returns {Array} Returns the new array of placeholder indexes. 28222 */ 28223 function replaceHolders(array, placeholder) { 28224 var index = -1, 28225 length = array.length, 28226 resIndex = 0, 28227 result = []; 28228 28229 while (++index < length) { 28230 var value = array[index]; 28231 if (value === placeholder || value === PLACEHOLDER) { 28232 array[index] = PLACEHOLDER; 28233 result[resIndex++] = index; 28234 } 28235 } 28236 return result; 28237 } 28238 28239 /** 28240 * Converts `set` to an array of its values. 28241 * 28242 * @private 28243 * @param {Object} set The set to convert. 28244 * @returns {Array} Returns the values. 28245 */ 28246 function setToArray(set) { 28247 var index = -1, 28248 result = Array(set.size); 28249 28250 set.forEach(function(value) { 28251 result[++index] = value; 28252 }); 28253 return result; 28254 } 28255 28256 /** 28257 * Converts `set` to its value-value pairs. 28258 * 28259 * @private 28260 * @param {Object} set The set to convert. 28261 * @returns {Array} Returns the value-value pairs. 28262 */ 28263 function setToPairs(set) { 28264 var index = -1, 28265 result = Array(set.size); 28266 28267 set.forEach(function(value) { 28268 result[++index] = [value, value]; 28269 }); 28270 return result; 28271 } 28272 28273 /** 28274 * A specialized version of `_.indexOf` which performs strict equality 28275 * comparisons of values, i.e. `===`. 28276 * 28277 * @private 28278 * @param {Array} array The array to inspect. 28279 * @param {*} value The value to search for. 28280 * @param {number} fromIndex The index to search from. 28281 * @returns {number} Returns the index of the matched value, else `-1`. 28282 */ 28283 function strictIndexOf(array, value, fromIndex) { 28284 var index = fromIndex - 1, 28285 length = array.length; 28286 28287 while (++index < length) { 28288 if (array[index] === value) { 28289 return index; 28290 } 28291 } 28292 return -1; 28293 } 28294 28295 /** 28296 * A specialized version of `_.lastIndexOf` which performs strict equality 28297 * comparisons of values, i.e. `===`. 28298 * 28299 * @private 28300 * @param {Array} array The array to inspect. 28301 * @param {*} value The value to search for. 28302 * @param {number} fromIndex The index to search from. 28303 * @returns {number} Returns the index of the matched value, else `-1`. 28304 */ 28305 function strictLastIndexOf(array, value, fromIndex) { 28306 var index = fromIndex + 1; 28307 while (index--) { 28308 if (array[index] === value) { 28309 return index; 28310 } 28311 } 28312 return index; 28313 } 28314 28315 /** 28316 * Gets the number of symbols in `string`. 28317 * 28318 * @private 28319 * @param {string} string The string to inspect. 28320 * @returns {number} Returns the string size. 28321 */ 28322 function stringSize(string) { 28323 return hasUnicode(string) 28324 ? unicodeSize(string) 28325 : asciiSize(string); 28326 } 28327 28328 /** 28329 * Converts `string` to an array. 28330 * 28331 * @private 28332 * @param {string} string The string to convert. 28333 * @returns {Array} Returns the converted array. 28334 */ 28335 function stringToArray(string) { 28336 return hasUnicode(string) 28337 ? unicodeToArray(string) 28338 : asciiToArray(string); 28339 } 28340 28341 /** 28342 * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace 28343 * character of `string`. 28344 * 28345 * @private 28346 * @param {string} string The string to inspect. 28347 * @returns {number} Returns the index of the last non-whitespace character. 28348 */ 28349 function trimmedEndIndex(string) { 28350 var index = string.length; 28351 28352 while (index-- && reWhitespace.test(string.charAt(index))) {} 28353 return index; 28354 } 28355 28356 /** 28357 * Used by `_.unescape` to convert HTML entities to characters. 28358 * 28359 * @private 28360 * @param {string} chr The matched character to unescape. 28361 * @returns {string} Returns the unescaped character. 28362 */ 28363 var unescapeHtmlChar = basePropertyOf(htmlUnescapes); 28364 28365 /** 28366 * Gets the size of a Unicode `string`. 28367 * 28368 * @private 28369 * @param {string} string The string inspect. 28370 * @returns {number} Returns the string size. 28371 */ 28372 function unicodeSize(string) { 28373 var result = reUnicode.lastIndex = 0; 28374 while (reUnicode.test(string)) { 28375 ++result; 28376 } 28377 return result; 28378 } 28379 28380 /** 28381 * Converts a Unicode `string` to an array. 28382 * 28383 * @private 28384 * @param {string} string The string to convert. 28385 * @returns {Array} Returns the converted array. 28386 */ 28387 function unicodeToArray(string) { 28388 return string.match(reUnicode) || []; 28389 } 28390 28391 /** 28392 * Splits a Unicode `string` into an array of its words. 28393 * 28394 * @private 28395 * @param {string} The string to inspect. 28396 * @returns {Array} Returns the words of `string`. 28397 */ 28398 function unicodeWords(string) { 28399 return string.match(reUnicodeWord) || []; 28400 } 28401 28402 /*--------------------------------------------------------------------------*/ 28403 28404 /** 28405 * Create a new pristine `lodash` function using the `context` object. 28406 * 28407 * @static 28408 * @memberOf _ 28409 * @since 1.1.0 28410 * @category Util 28411 * @param {Object} [context=root] The context object. 28412 * @returns {Function} Returns a new `lodash` function. 28413 * @example 28414 * 28415 * _.mixin({ 'foo': _.constant('foo') }); 28416 * 28417 * var lodash = _.runInContext(); 28418 * lodash.mixin({ 'bar': lodash.constant('bar') }); 28419 * 28420 * _.isFunction(_.foo); 28421 * // => true 28422 * _.isFunction(_.bar); 28423 * // => false 28424 * 28425 * lodash.isFunction(lodash.foo); 28426 * // => false 28427 * lodash.isFunction(lodash.bar); 28428 * // => true 28429 * 28430 * // Create a suped-up `defer` in Node.js. 28431 * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; 28432 */ 28433 var runInContext = (function runInContext(context) { 28434 context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); 28435 28436 /** Built-in constructor references. */ 28437 var Array = context.Array, 28438 Date = context.Date, 28439 Error = context.Error, 28440 Function = context.Function, 28441 Math = context.Math, 28442 Object = context.Object, 28443 RegExp = context.RegExp, 28444 String = context.String, 28445 TypeError = context.TypeError; 28446 28447 /** Used for built-in method references. */ 28448 var arrayProto = Array.prototype, 28449 funcProto = Function.prototype, 28450 objectProto = Object.prototype; 28451 28452 /** Used to detect overreaching core-js shims. */ 28453 var coreJsData = context['__core-js_shared__']; 28454 28455 /** Used to resolve the decompiled source of functions. */ 28456 var funcToString = funcProto.toString; 28457 28458 /** Used to check objects for own properties. */ 28459 var hasOwnProperty = objectProto.hasOwnProperty; 28460 28461 /** Used to generate unique IDs. */ 28462 var idCounter = 0; 28463 28464 /** Used to detect methods masquerading as native. */ 28465 var maskSrcKey = (function() { 28466 var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); 28467 return uid ? ('Symbol(src)_1.' + uid) : ''; 28468 }()); 28469 28470 /** 28471 * Used to resolve the 28472 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) 28473 * of values. 28474 */ 28475 var nativeObjectToString = objectProto.toString; 28476 28477 /** Used to infer the `Object` constructor. */ 28478 var objectCtorString = funcToString.call(Object); 28479 28480 /** Used to restore the original `_` reference in `_.noConflict`. */ 28481 var oldDash = root._; 28482 28483 /** Used to detect if a method is native. */ 28484 var reIsNative = RegExp('^' + 28485 funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') 28486 .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' 28487 ); 28488 28489 /** Built-in value references. */ 28490 var Buffer = moduleExports ? context.Buffer : undefined, 28491 Symbol = context.Symbol, 28492 Uint8Array = context.Uint8Array, 28493 allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, 28494 getPrototype = overArg(Object.getPrototypeOf, Object), 28495 objectCreate = Object.create, 28496 propertyIsEnumerable = objectProto.propertyIsEnumerable, 28497 splice = arrayProto.splice, 28498 spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, 28499 symIterator = Symbol ? Symbol.iterator : undefined, 28500 symToStringTag = Symbol ? Symbol.toStringTag : undefined; 28501 28502 var defineProperty = (function() { 28503 try { 28504 var func = getNative(Object, 'defineProperty'); 28505 func({}, '', {}); 28506 return func; 28507 } catch (e) {} 28508 }()); 28509 28510 /** Mocked built-ins. */ 28511 var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, 28512 ctxNow = Date && Date.now !== root.Date.now && Date.now, 28513 ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; 28514 28515 /* Built-in method references for those with the same name as other `lodash` methods. */ 28516 var nativeCeil = Math.ceil, 28517 nativeFloor = Math.floor, 28518 nativeGetSymbols = Object.getOwnPropertySymbols, 28519 nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, 28520 nativeIsFinite = context.isFinite, 28521 nativeJoin = arrayProto.join, 28522 nativeKeys = overArg(Object.keys, Object), 28523 nativeMax = Math.max, 28524 nativeMin = Math.min, 28525 nativeNow = Date.now, 28526 nativeParseInt = context.parseInt, 28527 nativeRandom = Math.random, 28528 nativeReverse = arrayProto.reverse; 28529 28530 /* Built-in method references that are verified to be native. */ 28531 var DataView = getNative(context, 'DataView'), 28532 Map = getNative(context, 'Map'), 28533 Promise = getNative(context, 'Promise'), 28534 Set = getNative(context, 'Set'), 28535 WeakMap = getNative(context, 'WeakMap'), 28536 nativeCreate = getNative(Object, 'create'); 28537 28538 /** Used to store function metadata. */ 28539 var metaMap = WeakMap && new WeakMap; 28540 28541 /** Used to lookup unminified function names. */ 28542 var realNames = {}; 28543 28544 /** Used to detect maps, sets, and weakmaps. */ 28545 var dataViewCtorString = toSource(DataView), 28546 mapCtorString = toSource(Map), 28547 promiseCtorString = toSource(Promise), 28548 setCtorString = toSource(Set), 28549 weakMapCtorString = toSource(WeakMap); 28550 28551 /** Used to convert symbols to primitives and strings. */ 28552 var symbolProto = Symbol ? Symbol.prototype : undefined, 28553 symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, 28554 symbolToString = symbolProto ? symbolProto.toString : undefined; 28555 28556 /*------------------------------------------------------------------------*/ 28557 28558 /** 28559 * Creates a `lodash` object which wraps `value` to enable implicit method 28560 * chain sequences. Methods that operate on and return arrays, collections, 28561 * and functions can be chained together. Methods that retrieve a single value 28562 * or may return a primitive value will automatically end the chain sequence 28563 * and return the unwrapped value. Otherwise, the value must be unwrapped 28564 * with `_#value`. 28565 * 28566 * Explicit chain sequences, which must be unwrapped with `_#value`, may be 28567 * enabled using `_.chain`. 28568 * 28569 * The execution of chained methods is lazy, that is, it's deferred until 28570 * `_#value` is implicitly or explicitly called. 28571 * 28572 * Lazy evaluation allows several methods to support shortcut fusion. 28573 * Shortcut fusion is an optimization to merge iteratee calls; this avoids 28574 * the creation of intermediate arrays and can greatly reduce the number of 28575 * iteratee executions. Sections of a chain sequence qualify for shortcut 28576 * fusion if the section is applied to an array and iteratees accept only 28577 * one argument. The heuristic for whether a section qualifies for shortcut 28578 * fusion is subject to change. 28579 * 28580 * Chaining is supported in custom builds as long as the `_#value` method is 28581 * directly or indirectly included in the build. 28582 * 28583 * In addition to lodash methods, wrappers have `Array` and `String` methods. 28584 * 28585 * The wrapper `Array` methods are: 28586 * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` 28587 * 28588 * The wrapper `String` methods are: 28589 * `replace` and `split` 28590 * 28591 * The wrapper methods that support shortcut fusion are: 28592 * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, 28593 * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, 28594 * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` 28595 * 28596 * The chainable wrapper methods are: 28597 * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, 28598 * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, 28599 * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, 28600 * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, 28601 * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, 28602 * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, 28603 * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, 28604 * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, 28605 * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, 28606 * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, 28607 * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, 28608 * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, 28609 * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, 28610 * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, 28611 * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, 28612 * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, 28613 * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, 28614 * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, 28615 * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, 28616 * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, 28617 * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, 28618 * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, 28619 * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, 28620 * `zipObject`, `zipObjectDeep`, and `zipWith` 28621 * 28622 * The wrapper methods that are **not** chainable by default are: 28623 * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, 28624 * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, 28625 * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, 28626 * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, 28627 * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, 28628 * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, 28629 * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, 28630 * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, 28631 * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, 28632 * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, 28633 * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, 28634 * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, 28635 * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, 28636 * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, 28637 * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, 28638 * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, 28639 * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, 28640 * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, 28641 * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, 28642 * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, 28643 * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, 28644 * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, 28645 * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, 28646 * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, 28647 * `upperFirst`, `value`, and `words` 28648 * 28649 * @name _ 28650 * @constructor 28651 * @category Seq 28652 * @param {*} value The value to wrap in a `lodash` instance. 28653 * @returns {Object} Returns the new `lodash` wrapper instance. 28654 * @example 28655 * 28656 * function square(n) { 28657 * return n * n; 28658 * } 28659 * 28660 * var wrapped = _([1, 2, 3]); 28661 * 28662 * // Returns an unwrapped value. 28663 * wrapped.reduce(_.add); 28664 * // => 6 28665 * 28666 * // Returns a wrapped value. 28667 * var squares = wrapped.map(square); 28668 * 28669 * _.isArray(squares); 28670 * // => false 28671 * 28672 * _.isArray(squares.value()); 28673 * // => true 28674 */ 28675 function lodash(value) { 28676 if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { 28677 if (value instanceof LodashWrapper) { 28678 return value; 28679 } 28680 if (hasOwnProperty.call(value, '__wrapped__')) { 28681 return wrapperClone(value); 28682 } 28683 } 28684 return new LodashWrapper(value); 28685 } 28686 28687 /** 28688 * The base implementation of `_.create` without support for assigning 28689 * properties to the created object. 28690 * 28691 * @private 28692 * @param {Object} proto The object to inherit from. 28693 * @returns {Object} Returns the new object. 28694 */ 28695 var baseCreate = (function() { 28696 function object() {} 28697 return function(proto) { 28698 if (!isObject(proto)) { 28699 return {}; 28700 } 28701 if (objectCreate) { 28702 return objectCreate(proto); 28703 } 28704 object.prototype = proto; 28705 var result = new object; 28706 object.prototype = undefined; 28707 return result; 28708 }; 28709 }()); 28710 28711 /** 28712 * The function whose prototype chain sequence wrappers inherit from. 28713 * 28714 * @private 28715 */ 28716 function baseLodash() { 28717 // No operation performed. 28718 } 28719 28720 /** 28721 * The base constructor for creating `lodash` wrapper objects. 28722 * 28723 * @private 28724 * @param {*} value The value to wrap. 28725 * @param {boolean} [chainAll] Enable explicit method chain sequences. 28726 */ 28727 function LodashWrapper(value, chainAll) { 28728 this.__wrapped__ = value; 28729 this.__actions__ = []; 28730 this.__chain__ = !!chainAll; 28731 this.__index__ = 0; 28732 this.__values__ = undefined; 28733 } 28734 28735 /** 28736 * By default, the template delimiters used by lodash are like those in 28737 * embedded Ruby (ERB) as well as ES2015 template strings. Change the 28738 * following template settings to use alternative delimiters. 28739 * 28740 * @static 28741 * @memberOf _ 28742 * @type {Object} 28743 */ 28744 lodash.templateSettings = { 28745 28746 /** 28747 * Used to detect `data` property values to be HTML-escaped. 28748 * 28749 * @memberOf _.templateSettings 28750 * @type {RegExp} 28751 */ 28752 'escape': reEscape, 28753 28754 /** 28755 * Used to detect code to be evaluated. 28756 * 28757 * @memberOf _.templateSettings 28758 * @type {RegExp} 28759 */ 28760 'evaluate': reEvaluate, 28761 28762 /** 28763 * Used to detect `data` property values to inject. 28764 * 28765 * @memberOf _.templateSettings 28766 * @type {RegExp} 28767 */ 28768 'interpolate': reInterpolate, 28769 28770 /** 28771 * Used to reference the data object in the template text. 28772 * 28773 * @memberOf _.templateSettings 28774 * @type {string} 28775 */ 28776 'variable': '', 28777 28778 /** 28779 * Used to import variables into the compiled template. 28780 * 28781 * @memberOf _.templateSettings 28782 * @type {Object} 28783 */ 28784 'imports': { 28785 28786 /** 28787 * A reference to the `lodash` function. 28788 * 28789 * @memberOf _.templateSettings.imports 28790 * @type {Function} 28791 */ 28792 '_': lodash 28793 } 28794 }; 28795 28796 // Ensure wrappers are instances of `baseLodash`. 28797 lodash.prototype = baseLodash.prototype; 28798 lodash.prototype.constructor = lodash; 28799 28800 LodashWrapper.prototype = baseCreate(baseLodash.prototype); 28801 LodashWrapper.prototype.constructor = LodashWrapper; 28802 28803 /*------------------------------------------------------------------------*/ 28804 28805 /** 28806 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. 28807 * 28808 * @private 28809 * @constructor 28810 * @param {*} value The value to wrap. 28811 */ 28812 function LazyWrapper(value) { 28813 this.__wrapped__ = value; 28814 this.__actions__ = []; 28815 this.__dir__ = 1; 28816 this.__filtered__ = false; 28817 this.__iteratees__ = []; 28818 this.__takeCount__ = MAX_ARRAY_LENGTH; 28819 this.__views__ = []; 28820 } 28821 28822 /** 28823 * Creates a clone of the lazy wrapper object. 28824 * 28825 * @private 28826 * @name clone 28827 * @memberOf LazyWrapper 28828 * @returns {Object} Returns the cloned `LazyWrapper` object. 28829 */ 28830 function lazyClone() { 28831 var result = new LazyWrapper(this.__wrapped__); 28832 result.__actions__ = copyArray(this.__actions__); 28833 result.__dir__ = this.__dir__; 28834 result.__filtered__ = this.__filtered__; 28835 result.__iteratees__ = copyArray(this.__iteratees__); 28836 result.__takeCount__ = this.__takeCount__; 28837 result.__views__ = copyArray(this.__views__); 28838 return result; 28839 } 28840 28841 /** 28842 * Reverses the direction of lazy iteration. 28843 * 28844 * @private 28845 * @name reverse 28846 * @memberOf LazyWrapper 28847 * @returns {Object} Returns the new reversed `LazyWrapper` object. 28848 */ 28849 function lazyReverse() { 28850 if (this.__filtered__) { 28851 var result = new LazyWrapper(this); 28852 result.__dir__ = -1; 28853 result.__filtered__ = true; 28854 } else { 28855 result = this.clone(); 28856 result.__dir__ *= -1; 28857 } 28858 return result; 28859 } 28860 28861 /** 28862 * Extracts the unwrapped value from its lazy wrapper. 28863 * 28864 * @private 28865 * @name value 28866 * @memberOf LazyWrapper 28867 * @returns {*} Returns the unwrapped value. 28868 */ 28869 function lazyValue() { 28870 var array = this.__wrapped__.value(), 28871 dir = this.__dir__, 28872 isArr = isArray(array), 28873 isRight = dir < 0, 28874 arrLength = isArr ? array.length : 0, 28875 view = getView(0, arrLength, this.__views__), 28876 start = view.start, 28877 end = view.end, 28878 length = end - start, 28879 index = isRight ? end : (start - 1), 28880 iteratees = this.__iteratees__, 28881 iterLength = iteratees.length, 28882 resIndex = 0, 28883 takeCount = nativeMin(length, this.__takeCount__); 28884 28885 if (!isArr || (!isRight && arrLength == length && takeCount == length)) { 28886 return baseWrapperValue(array, this.__actions__); 28887 } 28888 var result = []; 28889 28890 outer: 28891 while (length-- && resIndex < takeCount) { 28892 index += dir; 28893 28894 var iterIndex = -1, 28895 value = array[index]; 28896 28897 while (++iterIndex < iterLength) { 28898 var data = iteratees[iterIndex], 28899 iteratee = data.iteratee, 28900 type = data.type, 28901 computed = iteratee(value); 28902 28903 if (type == LAZY_MAP_FLAG) { 28904 value = computed; 28905 } else if (!computed) { 28906 if (type == LAZY_FILTER_FLAG) { 28907 continue outer; 28908 } else { 28909 break outer; 28910 } 28911 } 28912 } 28913 result[resIndex++] = value; 28914 } 28915 return result; 28916 } 28917 28918 // Ensure `LazyWrapper` is an instance of `baseLodash`. 28919 LazyWrapper.prototype = baseCreate(baseLodash.prototype); 28920 LazyWrapper.prototype.constructor = LazyWrapper; 28921 28922 /*------------------------------------------------------------------------*/ 28923 28924 /** 28925 * Creates a hash object. 28926 * 28927 * @private 28928 * @constructor 28929 * @param {Array} [entries] The key-value pairs to cache. 28930 */ 28931 function Hash(entries) { 28932 var index = -1, 28933 length = entries == null ? 0 : entries.length; 28934 28935 this.clear(); 28936 while (++index < length) { 28937 var entry = entries[index]; 28938 this.set(entry[0], entry[1]); 28939 } 28940 } 28941 28942 /** 28943 * Removes all key-value entries from the hash. 28944 * 28945 * @private 28946 * @name clear 28947 * @memberOf Hash 28948 */ 28949 function hashClear() { 28950 this.__data__ = nativeCreate ? nativeCreate(null) : {}; 28951 this.size = 0; 28952 } 28953 28954 /** 28955 * Removes `key` and its value from the hash. 28956 * 28957 * @private 28958 * @name delete 28959 * @memberOf Hash 28960 * @param {Object} hash The hash to modify. 28961 * @param {string} key The key of the value to remove. 28962 * @returns {boolean} Returns `true` if the entry was removed, else `false`. 28963 */ 28964 function hashDelete(key) { 28965 var result = this.has(key) && delete this.__data__[key]; 28966 this.size -= result ? 1 : 0; 28967 return result; 28968 } 28969 28970 /** 28971 * Gets the hash value for `key`. 28972 * 28973 * @private 28974 * @name get 28975 * @memberOf Hash 28976 * @param {string} key The key of the value to get. 28977 * @returns {*} Returns the entry value. 28978 */ 28979 function hashGet(key) { 28980 var data = this.__data__; 28981 if (nativeCreate) { 28982 var result = data[key]; 28983 return result === HASH_UNDEFINED ? undefined : result; 28984 } 28985 return hasOwnProperty.call(data, key) ? data[key] : undefined; 28986 } 28987 28988 /** 28989 * Checks if a hash value for `key` exists. 28990 * 28991 * @private 28992 * @name has 28993 * @memberOf Hash 28994 * @param {string} key The key of the entry to check. 28995 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. 28996 */ 28997 function hashHas(key) { 28998 var data = this.__data__; 28999 return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); 29000 } 29001 29002 /** 29003 * Sets the hash `key` to `value`. 29004 * 29005 * @private 29006 * @name set 29007 * @memberOf Hash 29008 * @param {string} key The key of the value to set. 29009 * @param {*} value The value to set. 29010 * @returns {Object} Returns the hash instance. 29011 */ 29012 function hashSet(key, value) { 29013 var data = this.__data__; 29014 this.size += this.has(key) ? 0 : 1; 29015 data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; 29016 return this; 29017 } 29018 29019 // Add methods to `Hash`. 29020 Hash.prototype.clear = hashClear; 29021 Hash.prototype['delete'] = hashDelete; 29022 Hash.prototype.get = hashGet; 29023 Hash.prototype.has = hashHas; 29024 Hash.prototype.set = hashSet; 29025 29026 /*------------------------------------------------------------------------*/ 29027 29028 /** 29029 * Creates an list cache object. 29030 * 29031 * @private 29032 * @constructor 29033 * @param {Array} [entries] The key-value pairs to cache. 29034 */ 29035 function ListCache(entries) { 29036 var index = -1, 29037 length = entries == null ? 0 : entries.length; 29038 29039 this.clear(); 29040 while (++index < length) { 29041 var entry = entries[index]; 29042 this.set(entry[0], entry[1]); 29043 } 29044 } 29045 29046 /** 29047 * Removes all key-value entries from the list cache. 29048 * 29049 * @private 29050 * @name clear 29051 * @memberOf ListCache 29052 */ 29053 function listCacheClear() { 29054 this.__data__ = []; 29055 this.size = 0; 29056 } 29057 29058 /** 29059 * Removes `key` and its value from the list cache. 29060 * 29061 * @private 29062 * @name delete 29063 * @memberOf ListCache 29064 * @param {string} key The key of the value to remove. 29065 * @returns {boolean} Returns `true` if the entry was removed, else `false`. 29066 */ 29067 function listCacheDelete(key) { 29068 var data = this.__data__, 29069 index = assocIndexOf(data, key); 29070 29071 if (index < 0) { 29072 return false; 29073 } 29074 var lastIndex = data.length - 1; 29075 if (index == lastIndex) { 29076 data.pop(); 29077 } else { 29078 splice.call(data, index, 1); 29079 } 29080 --this.size; 29081 return true; 29082 } 29083 29084 /** 29085 * Gets the list cache value for `key`. 29086 * 29087 * @private 29088 * @name get 29089 * @memberOf ListCache 29090 * @param {string} key The key of the value to get. 29091 * @returns {*} Returns the entry value. 29092 */ 29093 function listCacheGet(key) { 29094 var data = this.__data__, 29095 index = assocIndexOf(data, key); 29096 29097 return index < 0 ? undefined : data[index][1]; 29098 } 29099 29100 /** 29101 * Checks if a list cache value for `key` exists. 29102 * 29103 * @private 29104 * @name has 29105 * @memberOf ListCache 29106 * @param {string} key The key of the entry to check. 29107 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. 29108 */ 29109 function listCacheHas(key) { 29110 return assocIndexOf(this.__data__, key) > -1; 29111 } 29112 29113 /** 29114 * Sets the list cache `key` to `value`. 29115 * 29116 * @private 29117 * @name set 29118 * @memberOf ListCache 29119 * @param {string} key The key of the value to set. 29120 * @param {*} value The value to set. 29121 * @returns {Object} Returns the list cache instance. 29122 */ 29123 function listCacheSet(key, value) { 29124 var data = this.__data__, 29125 index = assocIndexOf(data, key); 29126 29127 if (index < 0) { 29128 ++this.size; 29129 data.push([key, value]); 29130 } else { 29131 data[index][1] = value; 29132 } 29133 return this; 29134 } 29135 29136 // Add methods to `ListCache`. 29137 ListCache.prototype.clear = listCacheClear; 29138 ListCache.prototype['delete'] = listCacheDelete; 29139 ListCache.prototype.get = listCacheGet; 29140 ListCache.prototype.has = listCacheHas; 29141 ListCache.prototype.set = listCacheSet; 29142 29143 /*------------------------------------------------------------------------*/ 29144 29145 /** 29146 * Creates a map cache object to store key-value pairs. 29147 * 29148 * @private 29149 * @constructor 29150 * @param {Array} [entries] The key-value pairs to cache. 29151 */ 29152 function MapCache(entries) { 29153 var index = -1, 29154 length = entries == null ? 0 : entries.length; 29155 29156 this.clear(); 29157 while (++index < length) { 29158 var entry = entries[index]; 29159 this.set(entry[0], entry[1]); 29160 } 29161 } 29162 29163 /** 29164 * Removes all key-value entries from the map. 29165 * 29166 * @private 29167 * @name clear 29168 * @memberOf MapCache 29169 */ 29170 function mapCacheClear() { 29171 this.size = 0; 29172 this.__data__ = { 29173 'hash': new Hash, 29174 'map': new (Map || ListCache), 29175 'string': new Hash 29176 }; 29177 } 29178 29179 /** 29180 * Removes `key` and its value from the map. 29181 * 29182 * @private 29183 * @name delete 29184 * @memberOf MapCache 29185 * @param {string} key The key of the value to remove. 29186 * @returns {boolean} Returns `true` if the entry was removed, else `false`. 29187 */ 29188 function mapCacheDelete(key) { 29189 var result = getMapData(this, key)['delete'](key); 29190 this.size -= result ? 1 : 0; 29191 return result; 29192 } 29193 29194 /** 29195 * Gets the map value for `key`. 29196 * 29197 * @private 29198 * @name get 29199 * @memberOf MapCache 29200 * @param {string} key The key of the value to get. 29201 * @returns {*} Returns the entry value. 29202 */ 29203 function mapCacheGet(key) { 29204 return getMapData(this, key).get(key); 29205 } 29206 29207 /** 29208 * Checks if a map value for `key` exists. 29209 * 29210 * @private 29211 * @name has 29212 * @memberOf MapCache 29213 * @param {string} key The key of the entry to check. 29214 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. 29215 */ 29216 function mapCacheHas(key) { 29217 return getMapData(this, key).has(key); 29218 } 29219 29220 /** 29221 * Sets the map `key` to `value`. 29222 * 29223 * @private 29224 * @name set 29225 * @memberOf MapCache 29226 * @param {string} key The key of the value to set. 29227 * @param {*} value The value to set. 29228 * @returns {Object} Returns the map cache instance. 29229 */ 29230 function mapCacheSet(key, value) { 29231 var data = getMapData(this, key), 29232 size = data.size; 29233 29234 data.set(key, value); 29235 this.size += data.size == size ? 0 : 1; 29236 return this; 29237 } 29238 29239 // Add methods to `MapCache`. 29240 MapCache.prototype.clear = mapCacheClear; 29241 MapCache.prototype['delete'] = mapCacheDelete; 29242 MapCache.prototype.get = mapCacheGet; 29243 MapCache.prototype.has = mapCacheHas; 29244 MapCache.prototype.set = mapCacheSet; 29245 29246 /*------------------------------------------------------------------------*/ 29247 29248 /** 29249 * 29250 * Creates an array cache object to store unique values. 29251 * 29252 * @private 29253 * @constructor 29254 * @param {Array} [values] The values to cache. 29255 */ 29256 function SetCache(values) { 29257 var index = -1, 29258 length = values == null ? 0 : values.length; 29259 29260 this.__data__ = new MapCache; 29261 while (++index < length) { 29262 this.add(values[index]); 29263 } 29264 } 29265 29266 /** 29267 * Adds `value` to the array cache. 29268 * 29269 * @private 29270 * @name add 29271 * @memberOf SetCache 29272 * @alias push 29273 * @param {*} value The value to cache. 29274 * @returns {Object} Returns the cache instance. 29275 */ 29276 function setCacheAdd(value) { 29277 this.__data__.set(value, HASH_UNDEFINED); 29278 return this; 29279 } 29280 29281 /** 29282 * Checks if `value` is in the array cache. 29283 * 29284 * @private 29285 * @name has 29286 * @memberOf SetCache 29287 * @param {*} value The value to search for. 29288 * @returns {number} Returns `true` if `value` is found, else `false`. 29289 */ 29290 function setCacheHas(value) { 29291 return this.__data__.has(value); 29292 } 29293 29294 // Add methods to `SetCache`. 29295 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; 29296 SetCache.prototype.has = setCacheHas; 29297 29298 /*------------------------------------------------------------------------*/ 29299 29300 /** 29301 * Creates a stack cache object to store key-value pairs. 29302 * 29303 * @private 29304 * @constructor 29305 * @param {Array} [entries] The key-value pairs to cache. 29306 */ 29307 function Stack(entries) { 29308 var data = this.__data__ = new ListCache(entries); 29309 this.size = data.size; 29310 } 29311 29312 /** 29313 * Removes all key-value entries from the stack. 29314 * 29315 * @private 29316 * @name clear 29317 * @memberOf Stack 29318 */ 29319 function stackClear() { 29320 this.__data__ = new ListCache; 29321 this.size = 0; 29322 } 29323 29324 /** 29325 * Removes `key` and its value from the stack. 29326 * 29327 * @private 29328 * @name delete 29329 * @memberOf Stack 29330 * @param {string} key The key of the value to remove. 29331 * @returns {boolean} Returns `true` if the entry was removed, else `false`. 29332 */ 29333 function stackDelete(key) { 29334 var data = this.__data__, 29335 result = data['delete'](key); 29336 29337 this.size = data.size; 29338 return result; 29339 } 29340 29341 /** 29342 * Gets the stack value for `key`. 29343 * 29344 * @private 29345 * @name get 29346 * @memberOf Stack 29347 * @param {string} key The key of the value to get. 29348 * @returns {*} Returns the entry value. 29349 */ 29350 function stackGet(key) { 29351 return this.__data__.get(key); 29352 } 29353 29354 /** 29355 * Checks if a stack value for `key` exists. 29356 * 29357 * @private 29358 * @name has 29359 * @memberOf Stack 29360 * @param {string} key The key of the entry to check. 29361 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. 29362 */ 29363 function stackHas(key) { 29364 return this.__data__.has(key); 29365 } 29366 29367 /** 29368 * Sets the stack `key` to `value`. 29369 * 29370 * @private 29371 * @name set 29372 * @memberOf Stack 29373 * @param {string} key The key of the value to set. 29374 * @param {*} value The value to set. 29375 * @returns {Object} Returns the stack cache instance. 29376 */ 29377 function stackSet(key, value) { 29378 var data = this.__data__; 29379 if (data instanceof ListCache) { 29380 var pairs = data.__data__; 29381 if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { 29382 pairs.push([key, value]); 29383 this.size = ++data.size; 29384 return this; 29385 } 29386 data = this.__data__ = new MapCache(pairs); 29387 } 29388 data.set(key, value); 29389 this.size = data.size; 29390 return this; 29391 } 29392 29393 // Add methods to `Stack`. 29394 Stack.prototype.clear = stackClear; 29395 Stack.prototype['delete'] = stackDelete; 29396 Stack.prototype.get = stackGet; 29397 Stack.prototype.has = stackHas; 29398 Stack.prototype.set = stackSet; 29399 29400 /*------------------------------------------------------------------------*/ 29401 29402 /** 29403 * Creates an array of the enumerable property names of the array-like `value`. 29404 * 29405 * @private 29406 * @param {*} value The value to query. 29407 * @param {boolean} inherited Specify returning inherited property names. 29408 * @returns {Array} Returns the array of property names. 29409 */ 29410 function arrayLikeKeys(value, inherited) { 29411 var isArr = isArray(value), 29412 isArg = !isArr && isArguments(value), 29413 isBuff = !isArr && !isArg && isBuffer(value), 29414 isType = !isArr && !isArg && !isBuff && isTypedArray(value), 29415 skipIndexes = isArr || isArg || isBuff || isType, 29416 result = skipIndexes ? baseTimes(value.length, String) : [], 29417 length = result.length; 29418 29419 for (var key in value) { 29420 if ((inherited || hasOwnProperty.call(value, key)) && 29421 !(skipIndexes && ( 29422 // Safari 9 has enumerable `arguments.length` in strict mode. 29423 key == 'length' || 29424 // Node.js 0.10 has enumerable non-index properties on buffers. 29425 (isBuff && (key == 'offset' || key == 'parent')) || 29426 // PhantomJS 2 has enumerable non-index properties on typed arrays. 29427 (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || 29428 // Skip index properties. 29429 isIndex(key, length) 29430 ))) { 29431 result.push(key); 29432 } 29433 } 29434 return result; 29435 } 29436 29437 /** 29438 * A specialized version of `_.sample` for arrays. 29439 * 29440 * @private 29441 * @param {Array} array The array to sample. 29442 * @returns {*} Returns the random element. 29443 */ 29444 function arraySample(array) { 29445 var length = array.length; 29446 return length ? array[baseRandom(0, length - 1)] : undefined; 29447 } 29448 29449 /** 29450 * A specialized version of `_.sampleSize` for arrays. 29451 * 29452 * @private 29453 * @param {Array} array The array to sample. 29454 * @param {number} n The number of elements to sample. 29455 * @returns {Array} Returns the random elements. 29456 */ 29457 function arraySampleSize(array, n) { 29458 return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); 29459 } 29460 29461 /** 29462 * A specialized version of `_.shuffle` for arrays. 29463 * 29464 * @private 29465 * @param {Array} array The array to shuffle. 29466 * @returns {Array} Returns the new shuffled array. 29467 */ 29468 function arrayShuffle(array) { 29469 return shuffleSelf(copyArray(array)); 29470 } 29471 29472 /** 29473 * This function is like `assignValue` except that it doesn't assign 29474 * `undefined` values. 29475 * 29476 * @private 29477 * @param {Object} object The object to modify. 29478 * @param {string} key The key of the property to assign. 29479 * @param {*} value The value to assign. 29480 */ 29481 function assignMergeValue(object, key, value) { 29482 if ((value !== undefined && !eq(object[key], value)) || 29483 (value === undefined && !(key in object))) { 29484 baseAssignValue(object, key, value); 29485 } 29486 } 29487 29488 /** 29489 * Assigns `value` to `key` of `object` if the existing value is not equivalent 29490 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 29491 * for equality comparisons. 29492 * 29493 * @private 29494 * @param {Object} object The object to modify. 29495 * @param {string} key The key of the property to assign. 29496 * @param {*} value The value to assign. 29497 */ 29498 function assignValue(object, key, value) { 29499 var objValue = object[key]; 29500 if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || 29501 (value === undefined && !(key in object))) { 29502 baseAssignValue(object, key, value); 29503 } 29504 } 29505 29506 /** 29507 * Gets the index at which the `key` is found in `array` of key-value pairs. 29508 * 29509 * @private 29510 * @param {Array} array The array to inspect. 29511 * @param {*} key The key to search for. 29512 * @returns {number} Returns the index of the matched value, else `-1`. 29513 */ 29514 function assocIndexOf(array, key) { 29515 var length = array.length; 29516 while (length--) { 29517 if (eq(array[length][0], key)) { 29518 return length; 29519 } 29520 } 29521 return -1; 29522 } 29523 29524 /** 29525 * Aggregates elements of `collection` on `accumulator` with keys transformed 29526 * by `iteratee` and values set by `setter`. 29527 * 29528 * @private 29529 * @param {Array|Object} collection The collection to iterate over. 29530 * @param {Function} setter The function to set `accumulator` values. 29531 * @param {Function} iteratee The iteratee to transform keys. 29532 * @param {Object} accumulator The initial aggregated object. 29533 * @returns {Function} Returns `accumulator`. 29534 */ 29535 function baseAggregator(collection, setter, iteratee, accumulator) { 29536 baseEach(collection, function(value, key, collection) { 29537 setter(accumulator, value, iteratee(value), collection); 29538 }); 29539 return accumulator; 29540 } 29541 29542 /** 29543 * The base implementation of `_.assign` without support for multiple sources 29544 * or `customizer` functions. 29545 * 29546 * @private 29547 * @param {Object} object The destination object. 29548 * @param {Object} source The source object. 29549 * @returns {Object} Returns `object`. 29550 */ 29551 function baseAssign(object, source) { 29552 return object && copyObject(source, keys(source), object); 29553 } 29554 29555 /** 29556 * The base implementation of `_.assignIn` without support for multiple sources 29557 * or `customizer` functions. 29558 * 29559 * @private 29560 * @param {Object} object The destination object. 29561 * @param {Object} source The source object. 29562 * @returns {Object} Returns `object`. 29563 */ 29564 function baseAssignIn(object, source) { 29565 return object && copyObject(source, keysIn(source), object); 29566 } 29567 29568 /** 29569 * The base implementation of `assignValue` and `assignMergeValue` without 29570 * value checks. 29571 * 29572 * @private 29573 * @param {Object} object The object to modify. 29574 * @param {string} key The key of the property to assign. 29575 * @param {*} value The value to assign. 29576 */ 29577 function baseAssignValue(object, key, value) { 29578 if (key == '__proto__' && defineProperty) { 29579 defineProperty(object, key, { 29580 'configurable': true, 29581 'enumerable': true, 29582 'value': value, 29583 'writable': true 29584 }); 29585 } else { 29586 object[key] = value; 29587 } 29588 } 29589 29590 /** 29591 * The base implementation of `_.at` without support for individual paths. 29592 * 29593 * @private 29594 * @param {Object} object The object to iterate over. 29595 * @param {string[]} paths The property paths to pick. 29596 * @returns {Array} Returns the picked elements. 29597 */ 29598 function baseAt(object, paths) { 29599 var index = -1, 29600 length = paths.length, 29601 result = Array(length), 29602 skip = object == null; 29603 29604 while (++index < length) { 29605 result[index] = skip ? undefined : get(object, paths[index]); 29606 } 29607 return result; 29608 } 29609 29610 /** 29611 * The base implementation of `_.clamp` which doesn't coerce arguments. 29612 * 29613 * @private 29614 * @param {number} number The number to clamp. 29615 * @param {number} [lower] The lower bound. 29616 * @param {number} upper The upper bound. 29617 * @returns {number} Returns the clamped number. 29618 */ 29619 function baseClamp(number, lower, upper) { 29620 if (number === number) { 29621 if (upper !== undefined) { 29622 number = number <= upper ? number : upper; 29623 } 29624 if (lower !== undefined) { 29625 number = number >= lower ? number : lower; 29626 } 29627 } 29628 return number; 29629 } 29630 29631 /** 29632 * The base implementation of `_.clone` and `_.cloneDeep` which tracks 29633 * traversed objects. 29634 * 29635 * @private 29636 * @param {*} value The value to clone. 29637 * @param {boolean} bitmask The bitmask flags. 29638 * 1 - Deep clone 29639 * 2 - Flatten inherited properties 29640 * 4 - Clone symbols 29641 * @param {Function} [customizer] The function to customize cloning. 29642 * @param {string} [key] The key of `value`. 29643 * @param {Object} [object] The parent object of `value`. 29644 * @param {Object} [stack] Tracks traversed objects and their clone counterparts. 29645 * @returns {*} Returns the cloned value. 29646 */ 29647 function baseClone(value, bitmask, customizer, key, object, stack) { 29648 var result, 29649 isDeep = bitmask & CLONE_DEEP_FLAG, 29650 isFlat = bitmask & CLONE_FLAT_FLAG, 29651 isFull = bitmask & CLONE_SYMBOLS_FLAG; 29652 29653 if (customizer) { 29654 result = object ? customizer(value, key, object, stack) : customizer(value); 29655 } 29656 if (result !== undefined) { 29657 return result; 29658 } 29659 if (!isObject(value)) { 29660 return value; 29661 } 29662 var isArr = isArray(value); 29663 if (isArr) { 29664 result = initCloneArray(value); 29665 if (!isDeep) { 29666 return copyArray(value, result); 29667 } 29668 } else { 29669 var tag = getTag(value), 29670 isFunc = tag == funcTag || tag == genTag; 29671 29672 if (isBuffer(value)) { 29673 return cloneBuffer(value, isDeep); 29674 } 29675 if (tag == objectTag || tag == argsTag || (isFunc && !object)) { 29676 result = (isFlat || isFunc) ? {} : initCloneObject(value); 29677 if (!isDeep) { 29678 return isFlat 29679 ? copySymbolsIn(value, baseAssignIn(result, value)) 29680 : copySymbols(value, baseAssign(result, value)); 29681 } 29682 } else { 29683 if (!cloneableTags[tag]) { 29684 return object ? value : {}; 29685 } 29686 result = initCloneByTag(value, tag, isDeep); 29687 } 29688 } 29689 // Check for circular references and return its corresponding clone. 29690 stack || (stack = new Stack); 29691 var stacked = stack.get(value); 29692 if (stacked) { 29693 return stacked; 29694 } 29695 stack.set(value, result); 29696 29697 if (isSet(value)) { 29698 value.forEach(function(subValue) { 29699 result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); 29700 }); 29701 } else if (isMap(value)) { 29702 value.forEach(function(subValue, key) { 29703 result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); 29704 }); 29705 } 29706 29707 var keysFunc = isFull 29708 ? (isFlat ? getAllKeysIn : getAllKeys) 29709 : (isFlat ? keysIn : keys); 29710 29711 var props = isArr ? undefined : keysFunc(value); 29712 arrayEach(props || value, function(subValue, key) { 29713 if (props) { 29714 key = subValue; 29715 subValue = value[key]; 29716 } 29717 // Recursively populate clone (susceptible to call stack limits). 29718 assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); 29719 }); 29720 return result; 29721 } 29722 29723 /** 29724 * The base implementation of `_.conforms` which doesn't clone `source`. 29725 * 29726 * @private 29727 * @param {Object} source The object of property predicates to conform to. 29728 * @returns {Function} Returns the new spec function. 29729 */ 29730 function baseConforms(source) { 29731 var props = keys(source); 29732 return function(object) { 29733 return baseConformsTo(object, source, props); 29734 }; 29735 } 29736 29737 /** 29738 * The base implementation of `_.conformsTo` which accepts `props` to check. 29739 * 29740 * @private 29741 * @param {Object} object The object to inspect. 29742 * @param {Object} source The object of property predicates to conform to. 29743 * @returns {boolean} Returns `true` if `object` conforms, else `false`. 29744 */ 29745 function baseConformsTo(object, source, props) { 29746 var length = props.length; 29747 if (object == null) { 29748 return !length; 29749 } 29750 object = Object(object); 29751 while (length--) { 29752 var key = props[length], 29753 predicate = source[key], 29754 value = object[key]; 29755 29756 if ((value === undefined && !(key in object)) || !predicate(value)) { 29757 return false; 29758 } 29759 } 29760 return true; 29761 } 29762 29763 /** 29764 * The base implementation of `_.delay` and `_.defer` which accepts `args` 29765 * to provide to `func`. 29766 * 29767 * @private 29768 * @param {Function} func The function to delay. 29769 * @param {number} wait The number of milliseconds to delay invocation. 29770 * @param {Array} args The arguments to provide to `func`. 29771 * @returns {number|Object} Returns the timer id or timeout object. 29772 */ 29773 function baseDelay(func, wait, args) { 29774 if (typeof func != 'function') { 29775 throw new TypeError(FUNC_ERROR_TEXT); 29776 } 29777 return setTimeout(function() { func.apply(undefined, args); }, wait); 29778 } 29779 29780 /** 29781 * The base implementation of methods like `_.difference` without support 29782 * for excluding multiple arrays or iteratee shorthands. 29783 * 29784 * @private 29785 * @param {Array} array The array to inspect. 29786 * @param {Array} values The values to exclude. 29787 * @param {Function} [iteratee] The iteratee invoked per element. 29788 * @param {Function} [comparator] The comparator invoked per element. 29789 * @returns {Array} Returns the new array of filtered values. 29790 */ 29791 function baseDifference(array, values, iteratee, comparator) { 29792 var index = -1, 29793 includes = arrayIncludes, 29794 isCommon = true, 29795 length = array.length, 29796 result = [], 29797 valuesLength = values.length; 29798 29799 if (!length) { 29800 return result; 29801 } 29802 if (iteratee) { 29803 values = arrayMap(values, baseUnary(iteratee)); 29804 } 29805 if (comparator) { 29806 includes = arrayIncludesWith; 29807 isCommon = false; 29808 } 29809 else if (values.length >= LARGE_ARRAY_SIZE) { 29810 includes = cacheHas; 29811 isCommon = false; 29812 values = new SetCache(values); 29813 } 29814 outer: 29815 while (++index < length) { 29816 var value = array[index], 29817 computed = iteratee == null ? value : iteratee(value); 29818 29819 value = (comparator || value !== 0) ? value : 0; 29820 if (isCommon && computed === computed) { 29821 var valuesIndex = valuesLength; 29822 while (valuesIndex--) { 29823 if (values[valuesIndex] === computed) { 29824 continue outer; 29825 } 29826 } 29827 result.push(value); 29828 } 29829 else if (!includes(values, computed, comparator)) { 29830 result.push(value); 29831 } 29832 } 29833 return result; 29834 } 29835 29836 /** 29837 * The base implementation of `_.forEach` without support for iteratee shorthands. 29838 * 29839 * @private 29840 * @param {Array|Object} collection The collection to iterate over. 29841 * @param {Function} iteratee The function invoked per iteration. 29842 * @returns {Array|Object} Returns `collection`. 29843 */ 29844 var baseEach = createBaseEach(baseForOwn); 29845 29846 /** 29847 * The base implementation of `_.forEachRight` without support for iteratee shorthands. 29848 * 29849 * @private 29850 * @param {Array|Object} collection The collection to iterate over. 29851 * @param {Function} iteratee The function invoked per iteration. 29852 * @returns {Array|Object} Returns `collection`. 29853 */ 29854 var baseEachRight = createBaseEach(baseForOwnRight, true); 29855 29856 /** 29857 * The base implementation of `_.every` without support for iteratee shorthands. 29858 * 29859 * @private 29860 * @param {Array|Object} collection The collection to iterate over. 29861 * @param {Function} predicate The function invoked per iteration. 29862 * @returns {boolean} Returns `true` if all elements pass the predicate check, 29863 * else `false` 29864 */ 29865 function baseEvery(collection, predicate) { 29866 var result = true; 29867 baseEach(collection, function(value, index, collection) { 29868 result = !!predicate(value, index, collection); 29869 return result; 29870 }); 29871 return result; 29872 } 29873 29874 /** 29875 * The base implementation of methods like `_.max` and `_.min` which accepts a 29876 * `comparator` to determine the extremum value. 29877 * 29878 * @private 29879 * @param {Array} array The array to iterate over. 29880 * @param {Function} iteratee The iteratee invoked per iteration. 29881 * @param {Function} comparator The comparator used to compare values. 29882 * @returns {*} Returns the extremum value. 29883 */ 29884 function baseExtremum(array, iteratee, comparator) { 29885 var index = -1, 29886 length = array.length; 29887 29888 while (++index < length) { 29889 var value = array[index], 29890 current = iteratee(value); 29891 29892 if (current != null && (computed === undefined 29893 ? (current === current && !isSymbol(current)) 29894 : comparator(current, computed) 29895 )) { 29896 var computed = current, 29897 result = value; 29898 } 29899 } 29900 return result; 29901 } 29902 29903 /** 29904 * The base implementation of `_.fill` without an iteratee call guard. 29905 * 29906 * @private 29907 * @param {Array} array The array to fill. 29908 * @param {*} value The value to fill `array` with. 29909 * @param {number} [start=0] The start position. 29910 * @param {number} [end=array.length] The end position. 29911 * @returns {Array} Returns `array`. 29912 */ 29913 function baseFill(array, value, start, end) { 29914 var length = array.length; 29915 29916 start = toInteger(start); 29917 if (start < 0) { 29918 start = -start > length ? 0 : (length + start); 29919 } 29920 end = (end === undefined || end > length) ? length : toInteger(end); 29921 if (end < 0) { 29922 end += length; 29923 } 29924 end = start > end ? 0 : toLength(end); 29925 while (start < end) { 29926 array[start++] = value; 29927 } 29928 return array; 29929 } 29930 29931 /** 29932 * The base implementation of `_.filter` without support for iteratee shorthands. 29933 * 29934 * @private 29935 * @param {Array|Object} collection The collection to iterate over. 29936 * @param {Function} predicate The function invoked per iteration. 29937 * @returns {Array} Returns the new filtered array. 29938 */ 29939 function baseFilter(collection, predicate) { 29940 var result = []; 29941 baseEach(collection, function(value, index, collection) { 29942 if (predicate(value, index, collection)) { 29943 result.push(value); 29944 } 29945 }); 29946 return result; 29947 } 29948 29949 /** 29950 * The base implementation of `_.flatten` with support for restricting flattening. 29951 * 29952 * @private 29953 * @param {Array} array The array to flatten. 29954 * @param {number} depth The maximum recursion depth. 29955 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. 29956 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. 29957 * @param {Array} [result=[]] The initial result value. 29958 * @returns {Array} Returns the new flattened array. 29959 */ 29960 function baseFlatten(array, depth, predicate, isStrict, result) { 29961 var index = -1, 29962 length = array.length; 29963 29964 predicate || (predicate = isFlattenable); 29965 result || (result = []); 29966 29967 while (++index < length) { 29968 var value = array[index]; 29969 if (depth > 0 && predicate(value)) { 29970 if (depth > 1) { 29971 // Recursively flatten arrays (susceptible to call stack limits). 29972 baseFlatten(value, depth - 1, predicate, isStrict, result); 29973 } else { 29974 arrayPush(result, value); 29975 } 29976 } else if (!isStrict) { 29977 result[result.length] = value; 29978 } 29979 } 29980 return result; 29981 } 29982 29983 /** 29984 * The base implementation of `baseForOwn` which iterates over `object` 29985 * properties returned by `keysFunc` and invokes `iteratee` for each property. 29986 * Iteratee functions may exit iteration early by explicitly returning `false`. 29987 * 29988 * @private 29989 * @param {Object} object The object to iterate over. 29990 * @param {Function} iteratee The function invoked per iteration. 29991 * @param {Function} keysFunc The function to get the keys of `object`. 29992 * @returns {Object} Returns `object`. 29993 */ 29994 var baseFor = createBaseFor(); 29995 29996 /** 29997 * This function is like `baseFor` except that it iterates over properties 29998 * in the opposite order. 29999 * 30000 * @private 30001 * @param {Object} object The object to iterate over. 30002 * @param {Function} iteratee The function invoked per iteration. 30003 * @param {Function} keysFunc The function to get the keys of `object`. 30004 * @returns {Object} Returns `object`. 30005 */ 30006 var baseForRight = createBaseFor(true); 30007 30008 /** 30009 * The base implementation of `_.forOwn` without support for iteratee shorthands. 30010 * 30011 * @private 30012 * @param {Object} object The object to iterate over. 30013 * @param {Function} iteratee The function invoked per iteration. 30014 * @returns {Object} Returns `object`. 30015 */ 30016 function baseForOwn(object, iteratee) { 30017 return object && baseFor(object, iteratee, keys); 30018 } 30019 30020 /** 30021 * The base implementation of `_.forOwnRight` without support for iteratee shorthands. 30022 * 30023 * @private 30024 * @param {Object} object The object to iterate over. 30025 * @param {Function} iteratee The function invoked per iteration. 30026 * @returns {Object} Returns `object`. 30027 */ 30028 function baseForOwnRight(object, iteratee) { 30029 return object && baseForRight(object, iteratee, keys); 30030 } 30031 30032 /** 30033 * The base implementation of `_.functions` which creates an array of 30034 * `object` function property names filtered from `props`. 30035 * 30036 * @private 30037 * @param {Object} object The object to inspect. 30038 * @param {Array} props The property names to filter. 30039 * @returns {Array} Returns the function names. 30040 */ 30041 function baseFunctions(object, props) { 30042 return arrayFilter(props, function(key) { 30043 return isFunction(object[key]); 30044 }); 30045 } 30046 30047 /** 30048 * The base implementation of `_.get` without support for default values. 30049 * 30050 * @private 30051 * @param {Object} object The object to query. 30052 * @param {Array|string} path The path of the property to get. 30053 * @returns {*} Returns the resolved value. 30054 */ 30055 function baseGet(object, path) { 30056 path = castPath(path, object); 30057 30058 var index = 0, 30059 length = path.length; 30060 30061 while (object != null && index < length) { 30062 object = object[toKey(path[index++])]; 30063 } 30064 return (index && index == length) ? object : undefined; 30065 } 30066 30067 /** 30068 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses 30069 * `keysFunc` and `symbolsFunc` to get the enumerable property names and 30070 * symbols of `object`. 30071 * 30072 * @private 30073 * @param {Object} object The object to query. 30074 * @param {Function} keysFunc The function to get the keys of `object`. 30075 * @param {Function} symbolsFunc The function to get the symbols of `object`. 30076 * @returns {Array} Returns the array of property names and symbols. 30077 */ 30078 function baseGetAllKeys(object, keysFunc, symbolsFunc) { 30079 var result = keysFunc(object); 30080 return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); 30081 } 30082 30083 /** 30084 * The base implementation of `getTag` without fallbacks for buggy environments. 30085 * 30086 * @private 30087 * @param {*} value The value to query. 30088 * @returns {string} Returns the `toStringTag`. 30089 */ 30090 function baseGetTag(value) { 30091 if (value == null) { 30092 return value === undefined ? undefinedTag : nullTag; 30093 } 30094 return (symToStringTag && symToStringTag in Object(value)) 30095 ? getRawTag(value) 30096 : objectToString(value); 30097 } 30098 30099 /** 30100 * The base implementation of `_.gt` which doesn't coerce arguments. 30101 * 30102 * @private 30103 * @param {*} value The value to compare. 30104 * @param {*} other The other value to compare. 30105 * @returns {boolean} Returns `true` if `value` is greater than `other`, 30106 * else `false`. 30107 */ 30108 function baseGt(value, other) { 30109 return value > other; 30110 } 30111 30112 /** 30113 * The base implementation of `_.has` without support for deep paths. 30114 * 30115 * @private 30116 * @param {Object} [object] The object to query. 30117 * @param {Array|string} key The key to check. 30118 * @returns {boolean} Returns `true` if `key` exists, else `false`. 30119 */ 30120 function baseHas(object, key) { 30121 return object != null && hasOwnProperty.call(object, key); 30122 } 30123 30124 /** 30125 * The base implementation of `_.hasIn` without support for deep paths. 30126 * 30127 * @private 30128 * @param {Object} [object] The object to query. 30129 * @param {Array|string} key The key to check. 30130 * @returns {boolean} Returns `true` if `key` exists, else `false`. 30131 */ 30132 function baseHasIn(object, key) { 30133 return object != null && key in Object(object); 30134 } 30135 30136 /** 30137 * The base implementation of `_.inRange` which doesn't coerce arguments. 30138 * 30139 * @private 30140 * @param {number} number The number to check. 30141 * @param {number} start The start of the range. 30142 * @param {number} end The end of the range. 30143 * @returns {boolean} Returns `true` if `number` is in the range, else `false`. 30144 */ 30145 function baseInRange(number, start, end) { 30146 return number >= nativeMin(start, end) && number < nativeMax(start, end); 30147 } 30148 30149 /** 30150 * The base implementation of methods like `_.intersection`, without support 30151 * for iteratee shorthands, that accepts an array of arrays to inspect. 30152 * 30153 * @private 30154 * @param {Array} arrays The arrays to inspect. 30155 * @param {Function} [iteratee] The iteratee invoked per element. 30156 * @param {Function} [comparator] The comparator invoked per element. 30157 * @returns {Array} Returns the new array of shared values. 30158 */ 30159 function baseIntersection(arrays, iteratee, comparator) { 30160 var includes = comparator ? arrayIncludesWith : arrayIncludes, 30161 length = arrays[0].length, 30162 othLength = arrays.length, 30163 othIndex = othLength, 30164 caches = Array(othLength), 30165 maxLength = Infinity, 30166 result = []; 30167 30168 while (othIndex--) { 30169 var array = arrays[othIndex]; 30170 if (othIndex && iteratee) { 30171 array = arrayMap(array, baseUnary(iteratee)); 30172 } 30173 maxLength = nativeMin(array.length, maxLength); 30174 caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) 30175 ? new SetCache(othIndex && array) 30176 : undefined; 30177 } 30178 array = arrays[0]; 30179 30180 var index = -1, 30181 seen = caches[0]; 30182 30183 outer: 30184 while (++index < length && result.length < maxLength) { 30185 var value = array[index], 30186 computed = iteratee ? iteratee(value) : value; 30187 30188 value = (comparator || value !== 0) ? value : 0; 30189 if (!(seen 30190 ? cacheHas(seen, computed) 30191 : includes(result, computed, comparator) 30192 )) { 30193 othIndex = othLength; 30194 while (--othIndex) { 30195 var cache = caches[othIndex]; 30196 if (!(cache 30197 ? cacheHas(cache, computed) 30198 : includes(arrays[othIndex], computed, comparator)) 30199 ) { 30200 continue outer; 30201 } 30202 } 30203 if (seen) { 30204 seen.push(computed); 30205 } 30206 result.push(value); 30207 } 30208 } 30209 return result; 30210 } 30211 30212 /** 30213 * The base implementation of `_.invert` and `_.invertBy` which inverts 30214 * `object` with values transformed by `iteratee` and set by `setter`. 30215 * 30216 * @private 30217 * @param {Object} object The object to iterate over. 30218 * @param {Function} setter The function to set `accumulator` values. 30219 * @param {Function} iteratee The iteratee to transform values. 30220 * @param {Object} accumulator The initial inverted object. 30221 * @returns {Function} Returns `accumulator`. 30222 */ 30223 function baseInverter(object, setter, iteratee, accumulator) { 30224 baseForOwn(object, function(value, key, object) { 30225 setter(accumulator, iteratee(value), key, object); 30226 }); 30227 return accumulator; 30228 } 30229 30230 /** 30231 * The base implementation of `_.invoke` without support for individual 30232 * method arguments. 30233 * 30234 * @private 30235 * @param {Object} object The object to query. 30236 * @param {Array|string} path The path of the method to invoke. 30237 * @param {Array} args The arguments to invoke the method with. 30238 * @returns {*} Returns the result of the invoked method. 30239 */ 30240 function baseInvoke(object, path, args) { 30241 path = castPath(path, object); 30242 object = parent(object, path); 30243 var func = object == null ? object : object[toKey(last(path))]; 30244 return func == null ? undefined : apply(func, object, args); 30245 } 30246 30247 /** 30248 * The base implementation of `_.isArguments`. 30249 * 30250 * @private 30251 * @param {*} value The value to check. 30252 * @returns {boolean} Returns `true` if `value` is an `arguments` object, 30253 */ 30254 function baseIsArguments(value) { 30255 return isObjectLike(value) && baseGetTag(value) == argsTag; 30256 } 30257 30258 /** 30259 * The base implementation of `_.isArrayBuffer` without Node.js optimizations. 30260 * 30261 * @private 30262 * @param {*} value The value to check. 30263 * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. 30264 */ 30265 function baseIsArrayBuffer(value) { 30266 return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; 30267 } 30268 30269 /** 30270 * The base implementation of `_.isDate` without Node.js optimizations. 30271 * 30272 * @private 30273 * @param {*} value The value to check. 30274 * @returns {boolean} Returns `true` if `value` is a date object, else `false`. 30275 */ 30276 function baseIsDate(value) { 30277 return isObjectLike(value) && baseGetTag(value) == dateTag; 30278 } 30279 30280 /** 30281 * The base implementation of `_.isEqual` which supports partial comparisons 30282 * and tracks traversed objects. 30283 * 30284 * @private 30285 * @param {*} value The value to compare. 30286 * @param {*} other The other value to compare. 30287 * @param {boolean} bitmask The bitmask flags. 30288 * 1 - Unordered comparison 30289 * 2 - Partial comparison 30290 * @param {Function} [customizer] The function to customize comparisons. 30291 * @param {Object} [stack] Tracks traversed `value` and `other` objects. 30292 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. 30293 */ 30294 function baseIsEqual(value, other, bitmask, customizer, stack) { 30295 if (value === other) { 30296 return true; 30297 } 30298 if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { 30299 return value !== value && other !== other; 30300 } 30301 return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); 30302 } 30303 30304 /** 30305 * A specialized version of `baseIsEqual` for arrays and objects which performs 30306 * deep comparisons and tracks traversed objects enabling objects with circular 30307 * references to be compared. 30308 * 30309 * @private 30310 * @param {Object} object The object to compare. 30311 * @param {Object} other The other object to compare. 30312 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. 30313 * @param {Function} customizer The function to customize comparisons. 30314 * @param {Function} equalFunc The function to determine equivalents of values. 30315 * @param {Object} [stack] Tracks traversed `object` and `other` objects. 30316 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. 30317 */ 30318 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { 30319 var objIsArr = isArray(object), 30320 othIsArr = isArray(other), 30321 objTag = objIsArr ? arrayTag : getTag(object), 30322 othTag = othIsArr ? arrayTag : getTag(other); 30323 30324 objTag = objTag == argsTag ? objectTag : objTag; 30325 othTag = othTag == argsTag ? objectTag : othTag; 30326 30327 var objIsObj = objTag == objectTag, 30328 othIsObj = othTag == objectTag, 30329 isSameTag = objTag == othTag; 30330 30331 if (isSameTag && isBuffer(object)) { 30332 if (!isBuffer(other)) { 30333 return false; 30334 } 30335 objIsArr = true; 30336 objIsObj = false; 30337 } 30338 if (isSameTag && !objIsObj) { 30339 stack || (stack = new Stack); 30340 return (objIsArr || isTypedArray(object)) 30341 ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) 30342 : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); 30343 } 30344 if (!(bitmask & COMPARE_PARTIAL_FLAG)) { 30345 var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), 30346 othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); 30347 30348 if (objIsWrapped || othIsWrapped) { 30349 var objUnwrapped = objIsWrapped ? object.value() : object, 30350 othUnwrapped = othIsWrapped ? other.value() : other; 30351 30352 stack || (stack = new Stack); 30353 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); 30354 } 30355 } 30356 if (!isSameTag) { 30357 return false; 30358 } 30359 stack || (stack = new Stack); 30360 return equalObjects(object, other, bitmask, customizer, equalFunc, stack); 30361 } 30362 30363 /** 30364 * The base implementation of `_.isMap` without Node.js optimizations. 30365 * 30366 * @private 30367 * @param {*} value The value to check. 30368 * @returns {boolean} Returns `true` if `value` is a map, else `false`. 30369 */ 30370 function baseIsMap(value) { 30371 return isObjectLike(value) && getTag(value) == mapTag; 30372 } 30373 30374 /** 30375 * The base implementation of `_.isMatch` without support for iteratee shorthands. 30376 * 30377 * @private 30378 * @param {Object} object The object to inspect. 30379 * @param {Object} source The object of property values to match. 30380 * @param {Array} matchData The property names, values, and compare flags to match. 30381 * @param {Function} [customizer] The function to customize comparisons. 30382 * @returns {boolean} Returns `true` if `object` is a match, else `false`. 30383 */ 30384 function baseIsMatch(object, source, matchData, customizer) { 30385 var index = matchData.length, 30386 length = index, 30387 noCustomizer = !customizer; 30388 30389 if (object == null) { 30390 return !length; 30391 } 30392 object = Object(object); 30393 while (index--) { 30394 var data = matchData[index]; 30395 if ((noCustomizer && data[2]) 30396 ? data[1] !== object[data[0]] 30397 : !(data[0] in object) 30398 ) { 30399 return false; 30400 } 30401 } 30402 while (++index < length) { 30403 data = matchData[index]; 30404 var key = data[0], 30405 objValue = object[key], 30406 srcValue = data[1]; 30407 30408 if (noCustomizer && data[2]) { 30409 if (objValue === undefined && !(key in object)) { 30410 return false; 30411 } 30412 } else { 30413 var stack = new Stack; 30414 if (customizer) { 30415 var result = customizer(objValue, srcValue, key, object, source, stack); 30416 } 30417 if (!(result === undefined 30418 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) 30419 : result 30420 )) { 30421 return false; 30422 } 30423 } 30424 } 30425 return true; 30426 } 30427 30428 /** 30429 * The base implementation of `_.isNative` without bad shim checks. 30430 * 30431 * @private 30432 * @param {*} value The value to check. 30433 * @returns {boolean} Returns `true` if `value` is a native function, 30434 * else `false`. 30435 */ 30436 function baseIsNative(value) { 30437 if (!isObject(value) || isMasked(value)) { 30438 return false; 30439 } 30440 var pattern = isFunction(value) ? reIsNative : reIsHostCtor; 30441 return pattern.test(toSource(value)); 30442 } 30443 30444 /** 30445 * The base implementation of `_.isRegExp` without Node.js optimizations. 30446 * 30447 * @private 30448 * @param {*} value The value to check. 30449 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. 30450 */ 30451 function baseIsRegExp(value) { 30452 return isObjectLike(value) && baseGetTag(value) == regexpTag; 30453 } 30454 30455 /** 30456 * The base implementation of `_.isSet` without Node.js optimizations. 30457 * 30458 * @private 30459 * @param {*} value The value to check. 30460 * @returns {boolean} Returns `true` if `value` is a set, else `false`. 30461 */ 30462 function baseIsSet(value) { 30463 return isObjectLike(value) && getTag(value) == setTag; 30464 } 30465 30466 /** 30467 * The base implementation of `_.isTypedArray` without Node.js optimizations. 30468 * 30469 * @private 30470 * @param {*} value The value to check. 30471 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. 30472 */ 30473 function baseIsTypedArray(value) { 30474 return isObjectLike(value) && 30475 isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; 30476 } 30477 30478 /** 30479 * The base implementation of `_.iteratee`. 30480 * 30481 * @private 30482 * @param {*} [value=_.identity] The value to convert to an iteratee. 30483 * @returns {Function} Returns the iteratee. 30484 */ 30485 function baseIteratee(value) { 30486 // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. 30487 // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. 30488 if (typeof value == 'function') { 30489 return value; 30490 } 30491 if (value == null) { 30492 return identity; 30493 } 30494 if (typeof value == 'object') { 30495 return isArray(value) 30496 ? baseMatchesProperty(value[0], value[1]) 30497 : baseMatches(value); 30498 } 30499 return property(value); 30500 } 30501 30502 /** 30503 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. 30504 * 30505 * @private 30506 * @param {Object} object The object to query. 30507 * @returns {Array} Returns the array of property names. 30508 */ 30509 function baseKeys(object) { 30510 if (!isPrototype(object)) { 30511 return nativeKeys(object); 30512 } 30513 var result = []; 30514 for (var key in Object(object)) { 30515 if (hasOwnProperty.call(object, key) && key != 'constructor') { 30516 result.push(key); 30517 } 30518 } 30519 return result; 30520 } 30521 30522 /** 30523 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. 30524 * 30525 * @private 30526 * @param {Object} object The object to query. 30527 * @returns {Array} Returns the array of property names. 30528 */ 30529 function baseKeysIn(object) { 30530 if (!isObject(object)) { 30531 return nativeKeysIn(object); 30532 } 30533 var isProto = isPrototype(object), 30534 result = []; 30535 30536 for (var key in object) { 30537 if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { 30538 result.push(key); 30539 } 30540 } 30541 return result; 30542 } 30543 30544 /** 30545 * The base implementation of `_.lt` which doesn't coerce arguments. 30546 * 30547 * @private 30548 * @param {*} value The value to compare. 30549 * @param {*} other The other value to compare. 30550 * @returns {boolean} Returns `true` if `value` is less than `other`, 30551 * else `false`. 30552 */ 30553 function baseLt(value, other) { 30554 return value < other; 30555 } 30556 30557 /** 30558 * The base implementation of `_.map` without support for iteratee shorthands. 30559 * 30560 * @private 30561 * @param {Array|Object} collection The collection to iterate over. 30562 * @param {Function} iteratee The function invoked per iteration. 30563 * @returns {Array} Returns the new mapped array. 30564 */ 30565 function baseMap(collection, iteratee) { 30566 var index = -1, 30567 result = isArrayLike(collection) ? Array(collection.length) : []; 30568 30569 baseEach(collection, function(value, key, collection) { 30570 result[++index] = iteratee(value, key, collection); 30571 }); 30572 return result; 30573 } 30574 30575 /** 30576 * The base implementation of `_.matches` which doesn't clone `source`. 30577 * 30578 * @private 30579 * @param {Object} source The object of property values to match. 30580 * @returns {Function} Returns the new spec function. 30581 */ 30582 function baseMatches(source) { 30583 var matchData = getMatchData(source); 30584 if (matchData.length == 1 && matchData[0][2]) { 30585 return matchesStrictComparable(matchData[0][0], matchData[0][1]); 30586 } 30587 return function(object) { 30588 return object === source || baseIsMatch(object, source, matchData); 30589 }; 30590 } 30591 30592 /** 30593 * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. 30594 * 30595 * @private 30596 * @param {string} path The path of the property to get. 30597 * @param {*} srcValue The value to match. 30598 * @returns {Function} Returns the new spec function. 30599 */ 30600 function baseMatchesProperty(path, srcValue) { 30601 if (isKey(path) && isStrictComparable(srcValue)) { 30602 return matchesStrictComparable(toKey(path), srcValue); 30603 } 30604 return function(object) { 30605 var objValue = get(object, path); 30606 return (objValue === undefined && objValue === srcValue) 30607 ? hasIn(object, path) 30608 : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); 30609 }; 30610 } 30611 30612 /** 30613 * The base implementation of `_.merge` without support for multiple sources. 30614 * 30615 * @private 30616 * @param {Object} object The destination object. 30617 * @param {Object} source The source object. 30618 * @param {number} srcIndex The index of `source`. 30619 * @param {Function} [customizer] The function to customize merged values. 30620 * @param {Object} [stack] Tracks traversed source values and their merged 30621 * counterparts. 30622 */ 30623 function baseMerge(object, source, srcIndex, customizer, stack) { 30624 if (object === source) { 30625 return; 30626 } 30627 baseFor(source, function(srcValue, key) { 30628 stack || (stack = new Stack); 30629 if (isObject(srcValue)) { 30630 baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); 30631 } 30632 else { 30633 var newValue = customizer 30634 ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) 30635 : undefined; 30636 30637 if (newValue === undefined) { 30638 newValue = srcValue; 30639 } 30640 assignMergeValue(object, key, newValue); 30641 } 30642 }, keysIn); 30643 } 30644 30645 /** 30646 * A specialized version of `baseMerge` for arrays and objects which performs 30647 * deep merges and tracks traversed objects enabling objects with circular 30648 * references to be merged. 30649 * 30650 * @private 30651 * @param {Object} object The destination object. 30652 * @param {Object} source The source object. 30653 * @param {string} key The key of the value to merge. 30654 * @param {number} srcIndex The index of `source`. 30655 * @param {Function} mergeFunc The function to merge values. 30656 * @param {Function} [customizer] The function to customize assigned values. 30657 * @param {Object} [stack] Tracks traversed source values and their merged 30658 * counterparts. 30659 */ 30660 function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { 30661 var objValue = safeGet(object, key), 30662 srcValue = safeGet(source, key), 30663 stacked = stack.get(srcValue); 30664 30665 if (stacked) { 30666 assignMergeValue(object, key, stacked); 30667 return; 30668 } 30669 var newValue = customizer 30670 ? customizer(objValue, srcValue, (key + ''), object, source, stack) 30671 : undefined; 30672 30673 var isCommon = newValue === undefined; 30674 30675 if (isCommon) { 30676 var isArr = isArray(srcValue), 30677 isBuff = !isArr && isBuffer(srcValue), 30678 isTyped = !isArr && !isBuff && isTypedArray(srcValue); 30679 30680 newValue = srcValue; 30681 if (isArr || isBuff || isTyped) { 30682 if (isArray(objValue)) { 30683 newValue = objValue; 30684 } 30685 else if (isArrayLikeObject(objValue)) { 30686 newValue = copyArray(objValue); 30687 } 30688 else if (isBuff) { 30689 isCommon = false; 30690 newValue = cloneBuffer(srcValue, true); 30691 } 30692 else if (isTyped) { 30693 isCommon = false; 30694 newValue = cloneTypedArray(srcValue, true); 30695 } 30696 else { 30697 newValue = []; 30698 } 30699 } 30700 else if (isPlainObject(srcValue) || isArguments(srcValue)) { 30701 newValue = objValue; 30702 if (isArguments(objValue)) { 30703 newValue = toPlainObject(objValue); 30704 } 30705 else if (!isObject(objValue) || isFunction(objValue)) { 30706 newValue = initCloneObject(srcValue); 30707 } 30708 } 30709 else { 30710 isCommon = false; 30711 } 30712 } 30713 if (isCommon) { 30714 // Recursively merge objects and arrays (susceptible to call stack limits). 30715 stack.set(srcValue, newValue); 30716 mergeFunc(newValue, srcValue, srcIndex, customizer, stack); 30717 stack['delete'](srcValue); 30718 } 30719 assignMergeValue(object, key, newValue); 30720 } 30721 30722 /** 30723 * The base implementation of `_.nth` which doesn't coerce arguments. 30724 * 30725 * @private 30726 * @param {Array} array The array to query. 30727 * @param {number} n The index of the element to return. 30728 * @returns {*} Returns the nth element of `array`. 30729 */ 30730 function baseNth(array, n) { 30731 var length = array.length; 30732 if (!length) { 30733 return; 30734 } 30735 n += n < 0 ? length : 0; 30736 return isIndex(n, length) ? array[n] : undefined; 30737 } 30738 30739 /** 30740 * The base implementation of `_.orderBy` without param guards. 30741 * 30742 * @private 30743 * @param {Array|Object} collection The collection to iterate over. 30744 * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. 30745 * @param {string[]} orders The sort orders of `iteratees`. 30746 * @returns {Array} Returns the new sorted array. 30747 */ 30748 function baseOrderBy(collection, iteratees, orders) { 30749 if (iteratees.length) { 30750 iteratees = arrayMap(iteratees, function(iteratee) { 30751 if (isArray(iteratee)) { 30752 return function(value) { 30753 return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee); 30754 } 30755 } 30756 return iteratee; 30757 }); 30758 } else { 30759 iteratees = [identity]; 30760 } 30761 30762 var index = -1; 30763 iteratees = arrayMap(iteratees, baseUnary(getIteratee())); 30764 30765 var result = baseMap(collection, function(value, key, collection) { 30766 var criteria = arrayMap(iteratees, function(iteratee) { 30767 return iteratee(value); 30768 }); 30769 return { 'criteria': criteria, 'index': ++index, 'value': value }; 30770 }); 30771 30772 return baseSortBy(result, function(object, other) { 30773 return compareMultiple(object, other, orders); 30774 }); 30775 } 30776 30777 /** 30778 * The base implementation of `_.pick` without support for individual 30779 * property identifiers. 30780 * 30781 * @private 30782 * @param {Object} object The source object. 30783 * @param {string[]} paths The property paths to pick. 30784 * @returns {Object} Returns the new object. 30785 */ 30786 function basePick(object, paths) { 30787 return basePickBy(object, paths, function(value, path) { 30788 return hasIn(object, path); 30789 }); 30790 } 30791 30792 /** 30793 * The base implementation of `_.pickBy` without support for iteratee shorthands. 30794 * 30795 * @private 30796 * @param {Object} object The source object. 30797 * @param {string[]} paths The property paths to pick. 30798 * @param {Function} predicate The function invoked per property. 30799 * @returns {Object} Returns the new object. 30800 */ 30801 function basePickBy(object, paths, predicate) { 30802 var index = -1, 30803 length = paths.length, 30804 result = {}; 30805 30806 while (++index < length) { 30807 var path = paths[index], 30808 value = baseGet(object, path); 30809 30810 if (predicate(value, path)) { 30811 baseSet(result, castPath(path, object), value); 30812 } 30813 } 30814 return result; 30815 } 30816 30817 /** 30818 * A specialized version of `baseProperty` which supports deep paths. 30819 * 30820 * @private 30821 * @param {Array|string} path The path of the property to get. 30822 * @returns {Function} Returns the new accessor function. 30823 */ 30824 function basePropertyDeep(path) { 30825 return function(object) { 30826 return baseGet(object, path); 30827 }; 30828 } 30829 30830 /** 30831 * The base implementation of `_.pullAllBy` without support for iteratee 30832 * shorthands. 30833 * 30834 * @private 30835 * @param {Array} array The array to modify. 30836 * @param {Array} values The values to remove. 30837 * @param {Function} [iteratee] The iteratee invoked per element. 30838 * @param {Function} [comparator] The comparator invoked per element. 30839 * @returns {Array} Returns `array`. 30840 */ 30841 function basePullAll(array, values, iteratee, comparator) { 30842 var indexOf = comparator ? baseIndexOfWith : baseIndexOf, 30843 index = -1, 30844 length = values.length, 30845 seen = array; 30846 30847 if (array === values) { 30848 values = copyArray(values); 30849 } 30850 if (iteratee) { 30851 seen = arrayMap(array, baseUnary(iteratee)); 30852 } 30853 while (++index < length) { 30854 var fromIndex = 0, 30855 value = values[index], 30856 computed = iteratee ? iteratee(value) : value; 30857 30858 while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { 30859 if (seen !== array) { 30860 splice.call(seen, fromIndex, 1); 30861 } 30862 splice.call(array, fromIndex, 1); 30863 } 30864 } 30865 return array; 30866 } 30867 30868 /** 30869 * The base implementation of `_.pullAt` without support for individual 30870 * indexes or capturing the removed elements. 30871 * 30872 * @private 30873 * @param {Array} array The array to modify. 30874 * @param {number[]} indexes The indexes of elements to remove. 30875 * @returns {Array} Returns `array`. 30876 */ 30877 function basePullAt(array, indexes) { 30878 var length = array ? indexes.length : 0, 30879 lastIndex = length - 1; 30880 30881 while (length--) { 30882 var index = indexes[length]; 30883 if (length == lastIndex || index !== previous) { 30884 var previous = index; 30885 if (isIndex(index)) { 30886 splice.call(array, index, 1); 30887 } else { 30888 baseUnset(array, index); 30889 } 30890 } 30891 } 30892 return array; 30893 } 30894 30895 /** 30896 * The base implementation of `_.random` without support for returning 30897 * floating-point numbers. 30898 * 30899 * @private 30900 * @param {number} lower The lower bound. 30901 * @param {number} upper The upper bound. 30902 * @returns {number} Returns the random number. 30903 */ 30904 function baseRandom(lower, upper) { 30905 return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); 30906 } 30907 30908 /** 30909 * The base implementation of `_.range` and `_.rangeRight` which doesn't 30910 * coerce arguments. 30911 * 30912 * @private 30913 * @param {number} start The start of the range. 30914 * @param {number} end The end of the range. 30915 * @param {number} step The value to increment or decrement by. 30916 * @param {boolean} [fromRight] Specify iterating from right to left. 30917 * @returns {Array} Returns the range of numbers. 30918 */ 30919 function baseRange(start, end, step, fromRight) { 30920 var index = -1, 30921 length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), 30922 result = Array(length); 30923 30924 while (length--) { 30925 result[fromRight ? length : ++index] = start; 30926 start += step; 30927 } 30928 return result; 30929 } 30930 30931 /** 30932 * The base implementation of `_.repeat` which doesn't coerce arguments. 30933 * 30934 * @private 30935 * @param {string} string The string to repeat. 30936 * @param {number} n The number of times to repeat the string. 30937 * @returns {string} Returns the repeated string. 30938 */ 30939 function baseRepeat(string, n) { 30940 var result = ''; 30941 if (!string || n < 1 || n > MAX_SAFE_INTEGER) { 30942 return result; 30943 } 30944 // Leverage the exponentiation by squaring algorithm for a faster repeat. 30945 // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. 30946 do { 30947 if (n % 2) { 30948 result += string; 30949 } 30950 n = nativeFloor(n / 2); 30951 if (n) { 30952 string += string; 30953 } 30954 } while (n); 30955 30956 return result; 30957 } 30958 30959 /** 30960 * The base implementation of `_.rest` which doesn't validate or coerce arguments. 30961 * 30962 * @private 30963 * @param {Function} func The function to apply a rest parameter to. 30964 * @param {number} [start=func.length-1] The start position of the rest parameter. 30965 * @returns {Function} Returns the new function. 30966 */ 30967 function baseRest(func, start) { 30968 return setToString(overRest(func, start, identity), func + ''); 30969 } 30970 30971 /** 30972 * The base implementation of `_.sample`. 30973 * 30974 * @private 30975 * @param {Array|Object} collection The collection to sample. 30976 * @returns {*} Returns the random element. 30977 */ 30978 function baseSample(collection) { 30979 return arraySample(values(collection)); 30980 } 30981 30982 /** 30983 * The base implementation of `_.sampleSize` without param guards. 30984 * 30985 * @private 30986 * @param {Array|Object} collection The collection to sample. 30987 * @param {number} n The number of elements to sample. 30988 * @returns {Array} Returns the random elements. 30989 */ 30990 function baseSampleSize(collection, n) { 30991 var array = values(collection); 30992 return shuffleSelf(array, baseClamp(n, 0, array.length)); 30993 } 30994 30995 /** 30996 * The base implementation of `_.set`. 30997 * 30998 * @private 30999 * @param {Object} object The object to modify. 31000 * @param {Array|string} path The path of the property to set. 31001 * @param {*} value The value to set. 31002 * @param {Function} [customizer] The function to customize path creation. 31003 * @returns {Object} Returns `object`. 31004 */ 31005 function baseSet(object, path, value, customizer) { 31006 if (!isObject(object)) { 31007 return object; 31008 } 31009 path = castPath(path, object); 31010 31011 var index = -1, 31012 length = path.length, 31013 lastIndex = length - 1, 31014 nested = object; 31015 31016 while (nested != null && ++index < length) { 31017 var key = toKey(path[index]), 31018 newValue = value; 31019 31020 if (key === '__proto__' || key === 'constructor' || key === 'prototype') { 31021 return object; 31022 } 31023 31024 if (index != lastIndex) { 31025 var objValue = nested[key]; 31026 newValue = customizer ? customizer(objValue, key, nested) : undefined; 31027 if (newValue === undefined) { 31028 newValue = isObject(objValue) 31029 ? objValue 31030 : (isIndex(path[index + 1]) ? [] : {}); 31031 } 31032 } 31033 assignValue(nested, key, newValue); 31034 nested = nested[key]; 31035 } 31036 return object; 31037 } 31038 31039 /** 31040 * The base implementation of `setData` without support for hot loop shorting. 31041 * 31042 * @private 31043 * @param {Function} func The function to associate metadata with. 31044 * @param {*} data The metadata. 31045 * @returns {Function} Returns `func`. 31046 */ 31047 var baseSetData = !metaMap ? identity : function(func, data) { 31048 metaMap.set(func, data); 31049 return func; 31050 }; 31051 31052 /** 31053 * The base implementation of `setToString` without support for hot loop shorting. 31054 * 31055 * @private 31056 * @param {Function} func The function to modify. 31057 * @param {Function} string The `toString` result. 31058 * @returns {Function} Returns `func`. 31059 */ 31060 var baseSetToString = !defineProperty ? identity : function(func, string) { 31061 return defineProperty(func, 'toString', { 31062 'configurable': true, 31063 'enumerable': false, 31064 'value': constant(string), 31065 'writable': true 31066 }); 31067 }; 31068 31069 /** 31070 * The base implementation of `_.shuffle`. 31071 * 31072 * @private 31073 * @param {Array|Object} collection The collection to shuffle. 31074 * @returns {Array} Returns the new shuffled array. 31075 */ 31076 function baseShuffle(collection) { 31077 return shuffleSelf(values(collection)); 31078 } 31079 31080 /** 31081 * The base implementation of `_.slice` without an iteratee call guard. 31082 * 31083 * @private 31084 * @param {Array} array The array to slice. 31085 * @param {number} [start=0] The start position. 31086 * @param {number} [end=array.length] The end position. 31087 * @returns {Array} Returns the slice of `array`. 31088 */ 31089 function baseSlice(array, start, end) { 31090 var index = -1, 31091 length = array.length; 31092 31093 if (start < 0) { 31094 start = -start > length ? 0 : (length + start); 31095 } 31096 end = end > length ? length : end; 31097 if (end < 0) { 31098 end += length; 31099 } 31100 length = start > end ? 0 : ((end - start) >>> 0); 31101 start >>>= 0; 31102 31103 var result = Array(length); 31104 while (++index < length) { 31105 result[index] = array[index + start]; 31106 } 31107 return result; 31108 } 31109 31110 /** 31111 * The base implementation of `_.some` without support for iteratee shorthands. 31112 * 31113 * @private 31114 * @param {Array|Object} collection The collection to iterate over. 31115 * @param {Function} predicate The function invoked per iteration. 31116 * @returns {boolean} Returns `true` if any element passes the predicate check, 31117 * else `false`. 31118 */ 31119 function baseSome(collection, predicate) { 31120 var result; 31121 31122 baseEach(collection, function(value, index, collection) { 31123 result = predicate(value, index, collection); 31124 return !result; 31125 }); 31126 return !!result; 31127 } 31128 31129 /** 31130 * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which 31131 * performs a binary search of `array` to determine the index at which `value` 31132 * should be inserted into `array` in order to maintain its sort order. 31133 * 31134 * @private 31135 * @param {Array} array The sorted array to inspect. 31136 * @param {*} value The value to evaluate. 31137 * @param {boolean} [retHighest] Specify returning the highest qualified index. 31138 * @returns {number} Returns the index at which `value` should be inserted 31139 * into `array`. 31140 */ 31141 function baseSortedIndex(array, value, retHighest) { 31142 var low = 0, 31143 high = array == null ? low : array.length; 31144 31145 if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { 31146 while (low < high) { 31147 var mid = (low + high) >>> 1, 31148 computed = array[mid]; 31149 31150 if (computed !== null && !isSymbol(computed) && 31151 (retHighest ? (computed <= value) : (computed < value))) { 31152 low = mid + 1; 31153 } else { 31154 high = mid; 31155 } 31156 } 31157 return high; 31158 } 31159 return baseSortedIndexBy(array, value, identity, retHighest); 31160 } 31161 31162 /** 31163 * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` 31164 * which invokes `iteratee` for `value` and each element of `array` to compute 31165 * their sort ranking. The iteratee is invoked with one argument; (value). 31166 * 31167 * @private 31168 * @param {Array} array The sorted array to inspect. 31169 * @param {*} value The value to evaluate. 31170 * @param {Function} iteratee The iteratee invoked per element. 31171 * @param {boolean} [retHighest] Specify returning the highest qualified index. 31172 * @returns {number} Returns the index at which `value` should be inserted 31173 * into `array`. 31174 */ 31175 function baseSortedIndexBy(array, value, iteratee, retHighest) { 31176 var low = 0, 31177 high = array == null ? 0 : array.length; 31178 if (high === 0) { 31179 return 0; 31180 } 31181 31182 value = iteratee(value); 31183 var valIsNaN = value !== value, 31184 valIsNull = value === null, 31185 valIsSymbol = isSymbol(value), 31186 valIsUndefined = value === undefined; 31187 31188 while (low < high) { 31189 var mid = nativeFloor((low + high) / 2), 31190 computed = iteratee(array[mid]), 31191 othIsDefined = computed !== undefined, 31192 othIsNull = computed === null, 31193 othIsReflexive = computed === computed, 31194 othIsSymbol = isSymbol(computed); 31195 31196 if (valIsNaN) { 31197 var setLow = retHighest || othIsReflexive; 31198 } else if (valIsUndefined) { 31199 setLow = othIsReflexive && (retHighest || othIsDefined); 31200 } else if (valIsNull) { 31201 setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); 31202 } else if (valIsSymbol) { 31203 setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); 31204 } else if (othIsNull || othIsSymbol) { 31205 setLow = false; 31206 } else { 31207 setLow = retHighest ? (computed <= value) : (computed < value); 31208 } 31209 if (setLow) { 31210 low = mid + 1; 31211 } else { 31212 high = mid; 31213 } 31214 } 31215 return nativeMin(high, MAX_ARRAY_INDEX); 31216 } 31217 31218 /** 31219 * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without 31220 * support for iteratee shorthands. 31221 * 31222 * @private 31223 * @param {Array} array The array to inspect. 31224 * @param {Function} [iteratee] The iteratee invoked per element. 31225 * @returns {Array} Returns the new duplicate free array. 31226 */ 31227 function baseSortedUniq(array, iteratee) { 31228 var index = -1, 31229 length = array.length, 31230 resIndex = 0, 31231 result = []; 31232 31233 while (++index < length) { 31234 var value = array[index], 31235 computed = iteratee ? iteratee(value) : value; 31236 31237 if (!index || !eq(computed, seen)) { 31238 var seen = computed; 31239 result[resIndex++] = value === 0 ? 0 : value; 31240 } 31241 } 31242 return result; 31243 } 31244 31245 /** 31246 * The base implementation of `_.toNumber` which doesn't ensure correct 31247 * conversions of binary, hexadecimal, or octal string values. 31248 * 31249 * @private 31250 * @param {*} value The value to process. 31251 * @returns {number} Returns the number. 31252 */ 31253 function baseToNumber(value) { 31254 if (typeof value == 'number') { 31255 return value; 31256 } 31257 if (isSymbol(value)) { 31258 return NAN; 31259 } 31260 return +value; 31261 } 31262 31263 /** 31264 * The base implementation of `_.toString` which doesn't convert nullish 31265 * values to empty strings. 31266 * 31267 * @private 31268 * @param {*} value The value to process. 31269 * @returns {string} Returns the string. 31270 */ 31271 function baseToString(value) { 31272 // Exit early for strings to avoid a performance hit in some environments. 31273 if (typeof value == 'string') { 31274 return value; 31275 } 31276 if (isArray(value)) { 31277 // Recursively convert values (susceptible to call stack limits). 31278 return arrayMap(value, baseToString) + ''; 31279 } 31280 if (isSymbol(value)) { 31281 return symbolToString ? symbolToString.call(value) : ''; 31282 } 31283 var result = (value + ''); 31284 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; 31285 } 31286 31287 /** 31288 * The base implementation of `_.uniqBy` without support for iteratee shorthands. 31289 * 31290 * @private 31291 * @param {Array} array The array to inspect. 31292 * @param {Function} [iteratee] The iteratee invoked per element. 31293 * @param {Function} [comparator] The comparator invoked per element. 31294 * @returns {Array} Returns the new duplicate free array. 31295 */ 31296 function baseUniq(array, iteratee, comparator) { 31297 var index = -1, 31298 includes = arrayIncludes, 31299 length = array.length, 31300 isCommon = true, 31301 result = [], 31302 seen = result; 31303 31304 if (comparator) { 31305 isCommon = false; 31306 includes = arrayIncludesWith; 31307 } 31308 else if (length >= LARGE_ARRAY_SIZE) { 31309 var set = iteratee ? null : createSet(array); 31310 if (set) { 31311 return setToArray(set); 31312 } 31313 isCommon = false; 31314 includes = cacheHas; 31315 seen = new SetCache; 31316 } 31317 else { 31318 seen = iteratee ? [] : result; 31319 } 31320 outer: 31321 while (++index < length) { 31322 var value = array[index], 31323 computed = iteratee ? iteratee(value) : value; 31324 31325 value = (comparator || value !== 0) ? value : 0; 31326 if (isCommon && computed === computed) { 31327 var seenIndex = seen.length; 31328 while (seenIndex--) { 31329 if (seen[seenIndex] === computed) { 31330 continue outer; 31331 } 31332 } 31333 if (iteratee) { 31334 seen.push(computed); 31335 } 31336 result.push(value); 31337 } 31338 else if (!includes(seen, computed, comparator)) { 31339 if (seen !== result) { 31340 seen.push(computed); 31341 } 31342 result.push(value); 31343 } 31344 } 31345 return result; 31346 } 31347 31348 /** 31349 * The base implementation of `_.unset`. 31350 * 31351 * @private 31352 * @param {Object} object The object to modify. 31353 * @param {Array|string} path The property path to unset. 31354 * @returns {boolean} Returns `true` if the property is deleted, else `false`. 31355 */ 31356 function baseUnset(object, path) { 31357 path = castPath(path, object); 31358 object = parent(object, path); 31359 return object == null || delete object[toKey(last(path))]; 31360 } 31361 31362 /** 31363 * The base implementation of `_.update`. 31364 * 31365 * @private 31366 * @param {Object} object The object to modify. 31367 * @param {Array|string} path The path of the property to update. 31368 * @param {Function} updater The function to produce the updated value. 31369 * @param {Function} [customizer] The function to customize path creation. 31370 * @returns {Object} Returns `object`. 31371 */ 31372 function baseUpdate(object, path, updater, customizer) { 31373 return baseSet(object, path, updater(baseGet(object, path)), customizer); 31374 } 31375 31376 /** 31377 * The base implementation of methods like `_.dropWhile` and `_.takeWhile` 31378 * without support for iteratee shorthands. 31379 * 31380 * @private 31381 * @param {Array} array The array to query. 31382 * @param {Function} predicate The function invoked per iteration. 31383 * @param {boolean} [isDrop] Specify dropping elements instead of taking them. 31384 * @param {boolean} [fromRight] Specify iterating from right to left. 31385 * @returns {Array} Returns the slice of `array`. 31386 */ 31387 function baseWhile(array, predicate, isDrop, fromRight) { 31388 var length = array.length, 31389 index = fromRight ? length : -1; 31390 31391 while ((fromRight ? index-- : ++index < length) && 31392 predicate(array[index], index, array)) {} 31393 31394 return isDrop 31395 ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) 31396 : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); 31397 } 31398 31399 /** 31400 * The base implementation of `wrapperValue` which returns the result of 31401 * performing a sequence of actions on the unwrapped `value`, where each 31402 * successive action is supplied the return value of the previous. 31403 * 31404 * @private 31405 * @param {*} value The unwrapped value. 31406 * @param {Array} actions Actions to perform to resolve the unwrapped value. 31407 * @returns {*} Returns the resolved value. 31408 */ 31409 function baseWrapperValue(value, actions) { 31410 var result = value; 31411 if (result instanceof LazyWrapper) { 31412 result = result.value(); 31413 } 31414 return arrayReduce(actions, function(result, action) { 31415 return action.func.apply(action.thisArg, arrayPush([result], action.args)); 31416 }, result); 31417 } 31418 31419 /** 31420 * The base implementation of methods like `_.xor`, without support for 31421 * iteratee shorthands, that accepts an array of arrays to inspect. 31422 * 31423 * @private 31424 * @param {Array} arrays The arrays to inspect. 31425 * @param {Function} [iteratee] The iteratee invoked per element. 31426 * @param {Function} [comparator] The comparator invoked per element. 31427 * @returns {Array} Returns the new array of values. 31428 */ 31429 function baseXor(arrays, iteratee, comparator) { 31430 var length = arrays.length; 31431 if (length < 2) { 31432 return length ? baseUniq(arrays[0]) : []; 31433 } 31434 var index = -1, 31435 result = Array(length); 31436 31437 while (++index < length) { 31438 var array = arrays[index], 31439 othIndex = -1; 31440 31441 while (++othIndex < length) { 31442 if (othIndex != index) { 31443 result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); 31444 } 31445 } 31446 } 31447 return baseUniq(baseFlatten(result, 1), iteratee, comparator); 31448 } 31449 31450 /** 31451 * This base implementation of `_.zipObject` which assigns values using `assignFunc`. 31452 * 31453 * @private 31454 * @param {Array} props The property identifiers. 31455 * @param {Array} values The property values. 31456 * @param {Function} assignFunc The function to assign values. 31457 * @returns {Object} Returns the new object. 31458 */ 31459 function baseZipObject(props, values, assignFunc) { 31460 var index = -1, 31461 length = props.length, 31462 valsLength = values.length, 31463 result = {}; 31464 31465 while (++index < length) { 31466 var value = index < valsLength ? values[index] : undefined; 31467 assignFunc(result, props[index], value); 31468 } 31469 return result; 31470 } 31471 31472 /** 31473 * Casts `value` to an empty array if it's not an array like object. 31474 * 31475 * @private 31476 * @param {*} value The value to inspect. 31477 * @returns {Array|Object} Returns the cast array-like object. 31478 */ 31479 function castArrayLikeObject(value) { 31480 return isArrayLikeObject(value) ? value : []; 31481 } 31482 31483 /** 31484 * Casts `value` to `identity` if it's not a function. 31485 * 31486 * @private 31487 * @param {*} value The value to inspect. 31488 * @returns {Function} Returns cast function. 31489 */ 31490 function castFunction(value) { 31491 return typeof value == 'function' ? value : identity; 31492 } 31493 31494 /** 31495 * Casts `value` to a path array if it's not one. 31496 * 31497 * @private 31498 * @param {*} value The value to inspect. 31499 * @param {Object} [object] The object to query keys on. 31500 * @returns {Array} Returns the cast property path array. 31501 */ 31502 function castPath(value, object) { 31503 if (isArray(value)) { 31504 return value; 31505 } 31506 return isKey(value, object) ? [value] : stringToPath(toString(value)); 31507 } 31508 31509 /** 31510 * A `baseRest` alias which can be replaced with `identity` by module 31511 * replacement plugins. 31512 * 31513 * @private 31514 * @type {Function} 31515 * @param {Function} func The function to apply a rest parameter to. 31516 * @returns {Function} Returns the new function. 31517 */ 31518 var castRest = baseRest; 31519 31520 /** 31521 * Casts `array` to a slice if it's needed. 31522 * 31523 * @private 31524 * @param {Array} array The array to inspect. 31525 * @param {number} start The start position. 31526 * @param {number} [end=array.length] The end position. 31527 * @returns {Array} Returns the cast slice. 31528 */ 31529 function castSlice(array, start, end) { 31530 var length = array.length; 31531 end = end === undefined ? length : end; 31532 return (!start && end >= length) ? array : baseSlice(array, start, end); 31533 } 31534 31535 /** 31536 * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). 31537 * 31538 * @private 31539 * @param {number|Object} id The timer id or timeout object of the timer to clear. 31540 */ 31541 var clearTimeout = ctxClearTimeout || function(id) { 31542 return root.clearTimeout(id); 31543 }; 31544 31545 /** 31546 * Creates a clone of `buffer`. 31547 * 31548 * @private 31549 * @param {Buffer} buffer The buffer to clone. 31550 * @param {boolean} [isDeep] Specify a deep clone. 31551 * @returns {Buffer} Returns the cloned buffer. 31552 */ 31553 function cloneBuffer(buffer, isDeep) { 31554 if (isDeep) { 31555 return buffer.slice(); 31556 } 31557 var length = buffer.length, 31558 result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); 31559 31560 buffer.copy(result); 31561 return result; 31562 } 31563 31564 /** 31565 * Creates a clone of `arrayBuffer`. 31566 * 31567 * @private 31568 * @param {ArrayBuffer} arrayBuffer The array buffer to clone. 31569 * @returns {ArrayBuffer} Returns the cloned array buffer. 31570 */ 31571 function cloneArrayBuffer(arrayBuffer) { 31572 var result = new arrayBuffer.constructor(arrayBuffer.byteLength); 31573 new Uint8Array(result).set(new Uint8Array(arrayBuffer)); 31574 return result; 31575 } 31576 31577 /** 31578 * Creates a clone of `dataView`. 31579 * 31580 * @private 31581 * @param {Object} dataView The data view to clone. 31582 * @param {boolean} [isDeep] Specify a deep clone. 31583 * @returns {Object} Returns the cloned data view. 31584 */ 31585 function cloneDataView(dataView, isDeep) { 31586 var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; 31587 return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); 31588 } 31589 31590 /** 31591 * Creates a clone of `regexp`. 31592 * 31593 * @private 31594 * @param {Object} regexp The regexp to clone. 31595 * @returns {Object} Returns the cloned regexp. 31596 */ 31597 function cloneRegExp(regexp) { 31598 var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); 31599 result.lastIndex = regexp.lastIndex; 31600 return result; 31601 } 31602 31603 /** 31604 * Creates a clone of the `symbol` object. 31605 * 31606 * @private 31607 * @param {Object} symbol The symbol object to clone. 31608 * @returns {Object} Returns the cloned symbol object. 31609 */ 31610 function cloneSymbol(symbol) { 31611 return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; 31612 } 31613 31614 /** 31615 * Creates a clone of `typedArray`. 31616 * 31617 * @private 31618 * @param {Object} typedArray The typed array to clone. 31619 * @param {boolean} [isDeep] Specify a deep clone. 31620 * @returns {Object} Returns the cloned typed array. 31621 */ 31622 function cloneTypedArray(typedArray, isDeep) { 31623 var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; 31624 return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); 31625 } 31626 31627 /** 31628 * Compares values to sort them in ascending order. 31629 * 31630 * @private 31631 * @param {*} value The value to compare. 31632 * @param {*} other The other value to compare. 31633 * @returns {number} Returns the sort order indicator for `value`. 31634 */ 31635 function compareAscending(value, other) { 31636 if (value !== other) { 31637 var valIsDefined = value !== undefined, 31638 valIsNull = value === null, 31639 valIsReflexive = value === value, 31640 valIsSymbol = isSymbol(value); 31641 31642 var othIsDefined = other !== undefined, 31643 othIsNull = other === null, 31644 othIsReflexive = other === other, 31645 othIsSymbol = isSymbol(other); 31646 31647 if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || 31648 (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || 31649 (valIsNull && othIsDefined && othIsReflexive) || 31650 (!valIsDefined && othIsReflexive) || 31651 !valIsReflexive) { 31652 return 1; 31653 } 31654 if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || 31655 (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || 31656 (othIsNull && valIsDefined && valIsReflexive) || 31657 (!othIsDefined && valIsReflexive) || 31658 !othIsReflexive) { 31659 return -1; 31660 } 31661 } 31662 return 0; 31663 } 31664 31665 /** 31666 * Used by `_.orderBy` to compare multiple properties of a value to another 31667 * and stable sort them. 31668 * 31669 * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, 31670 * specify an order of "desc" for descending or "asc" for ascending sort order 31671 * of corresponding values. 31672 * 31673 * @private 31674 * @param {Object} object The object to compare. 31675 * @param {Object} other The other object to compare. 31676 * @param {boolean[]|string[]} orders The order to sort by for each property. 31677 * @returns {number} Returns the sort order indicator for `object`. 31678 */ 31679 function compareMultiple(object, other, orders) { 31680 var index = -1, 31681 objCriteria = object.criteria, 31682 othCriteria = other.criteria, 31683 length = objCriteria.length, 31684 ordersLength = orders.length; 31685 31686 while (++index < length) { 31687 var result = compareAscending(objCriteria[index], othCriteria[index]); 31688 if (result) { 31689 if (index >= ordersLength) { 31690 return result; 31691 } 31692 var order = orders[index]; 31693 return result * (order == 'desc' ? -1 : 1); 31694 } 31695 } 31696 // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications 31697 // that causes it, under certain circumstances, to provide the same value for 31698 // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 31699 // for more details. 31700 // 31701 // This also ensures a stable sort in V8 and other engines. 31702 // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. 31703 return object.index - other.index; 31704 } 31705 31706 /** 31707 * Creates an array that is the composition of partially applied arguments, 31708 * placeholders, and provided arguments into a single array of arguments. 31709 * 31710 * @private 31711 * @param {Array} args The provided arguments. 31712 * @param {Array} partials The arguments to prepend to those provided. 31713 * @param {Array} holders The `partials` placeholder indexes. 31714 * @params {boolean} [isCurried] Specify composing for a curried function. 31715 * @returns {Array} Returns the new array of composed arguments. 31716 */ 31717 function composeArgs(args, partials, holders, isCurried) { 31718 var argsIndex = -1, 31719 argsLength = args.length, 31720 holdersLength = holders.length, 31721 leftIndex = -1, 31722 leftLength = partials.length, 31723 rangeLength = nativeMax(argsLength - holdersLength, 0), 31724 result = Array(leftLength + rangeLength), 31725 isUncurried = !isCurried; 31726 31727 while (++leftIndex < leftLength) { 31728 result[leftIndex] = partials[leftIndex]; 31729 } 31730 while (++argsIndex < holdersLength) { 31731 if (isUncurried || argsIndex < argsLength) { 31732 result[holders[argsIndex]] = args[argsIndex]; 31733 } 31734 } 31735 while (rangeLength--) { 31736 result[leftIndex++] = args[argsIndex++]; 31737 } 31738 return result; 31739 } 31740 31741 /** 31742 * This function is like `composeArgs` except that the arguments composition 31743 * is tailored for `_.partialRight`. 31744 * 31745 * @private 31746 * @param {Array} args The provided arguments. 31747 * @param {Array} partials The arguments to append to those provided. 31748 * @param {Array} holders The `partials` placeholder indexes. 31749 * @params {boolean} [isCurried] Specify composing for a curried function. 31750 * @returns {Array} Returns the new array of composed arguments. 31751 */ 31752 function composeArgsRight(args, partials, holders, isCurried) { 31753 var argsIndex = -1, 31754 argsLength = args.length, 31755 holdersIndex = -1, 31756 holdersLength = holders.length, 31757 rightIndex = -1, 31758 rightLength = partials.length, 31759 rangeLength = nativeMax(argsLength - holdersLength, 0), 31760 result = Array(rangeLength + rightLength), 31761 isUncurried = !isCurried; 31762 31763 while (++argsIndex < rangeLength) { 31764 result[argsIndex] = args[argsIndex]; 31765 } 31766 var offset = argsIndex; 31767 while (++rightIndex < rightLength) { 31768 result[offset + rightIndex] = partials[rightIndex]; 31769 } 31770 while (++holdersIndex < holdersLength) { 31771 if (isUncurried || argsIndex < argsLength) { 31772 result[offset + holders[holdersIndex]] = args[argsIndex++]; 31773 } 31774 } 31775 return result; 31776 } 31777 31778 /** 31779 * Copies the values of `source` to `array`. 31780 * 31781 * @private 31782 * @param {Array} source The array to copy values from. 31783 * @param {Array} [array=[]] The array to copy values to. 31784 * @returns {Array} Returns `array`. 31785 */ 31786 function copyArray(source, array) { 31787 var index = -1, 31788 length = source.length; 31789 31790 array || (array = Array(length)); 31791 while (++index < length) { 31792 array[index] = source[index]; 31793 } 31794 return array; 31795 } 31796 31797 /** 31798 * Copies properties of `source` to `object`. 31799 * 31800 * @private 31801 * @param {Object} source The object to copy properties from. 31802 * @param {Array} props The property identifiers to copy. 31803 * @param {Object} [object={}] The object to copy properties to. 31804 * @param {Function} [customizer] The function to customize copied values. 31805 * @returns {Object} Returns `object`. 31806 */ 31807 function copyObject(source, props, object, customizer) { 31808 var isNew = !object; 31809 object || (object = {}); 31810 31811 var index = -1, 31812 length = props.length; 31813 31814 while (++index < length) { 31815 var key = props[index]; 31816 31817 var newValue = customizer 31818 ? customizer(object[key], source[key], key, object, source) 31819 : undefined; 31820 31821 if (newValue === undefined) { 31822 newValue = source[key]; 31823 } 31824 if (isNew) { 31825 baseAssignValue(object, key, newValue); 31826 } else { 31827 assignValue(object, key, newValue); 31828 } 31829 } 31830 return object; 31831 } 31832 31833 /** 31834 * Copies own symbols of `source` to `object`. 31835 * 31836 * @private 31837 * @param {Object} source The object to copy symbols from. 31838 * @param {Object} [object={}] The object to copy symbols to. 31839 * @returns {Object} Returns `object`. 31840 */ 31841 function copySymbols(source, object) { 31842 return copyObject(source, getSymbols(source), object); 31843 } 31844 31845 /** 31846 * Copies own and inherited symbols of `source` to `object`. 31847 * 31848 * @private 31849 * @param {Object} source The object to copy symbols from. 31850 * @param {Object} [object={}] The object to copy symbols to. 31851 * @returns {Object} Returns `object`. 31852 */ 31853 function copySymbolsIn(source, object) { 31854 return copyObject(source, getSymbolsIn(source), object); 31855 } 31856 31857 /** 31858 * Creates a function like `_.groupBy`. 31859 * 31860 * @private 31861 * @param {Function} setter The function to set accumulator values. 31862 * @param {Function} [initializer] The accumulator object initializer. 31863 * @returns {Function} Returns the new aggregator function. 31864 */ 31865 function createAggregator(setter, initializer) { 31866 return function(collection, iteratee) { 31867 var func = isArray(collection) ? arrayAggregator : baseAggregator, 31868 accumulator = initializer ? initializer() : {}; 31869 31870 return func(collection, setter, getIteratee(iteratee, 2), accumulator); 31871 }; 31872 } 31873 31874 /** 31875 * Creates a function like `_.assign`. 31876 * 31877 * @private 31878 * @param {Function} assigner The function to assign values. 31879 * @returns {Function} Returns the new assigner function. 31880 */ 31881 function createAssigner(assigner) { 31882 return baseRest(function(object, sources) { 31883 var index = -1, 31884 length = sources.length, 31885 customizer = length > 1 ? sources[length - 1] : undefined, 31886 guard = length > 2 ? sources[2] : undefined; 31887 31888 customizer = (assigner.length > 3 && typeof customizer == 'function') 31889 ? (length--, customizer) 31890 : undefined; 31891 31892 if (guard && isIterateeCall(sources[0], sources[1], guard)) { 31893 customizer = length < 3 ? undefined : customizer; 31894 length = 1; 31895 } 31896 object = Object(object); 31897 while (++index < length) { 31898 var source = sources[index]; 31899 if (source) { 31900 assigner(object, source, index, customizer); 31901 } 31902 } 31903 return object; 31904 }); 31905 } 31906 31907 /** 31908 * Creates a `baseEach` or `baseEachRight` function. 31909 * 31910 * @private 31911 * @param {Function} eachFunc The function to iterate over a collection. 31912 * @param {boolean} [fromRight] Specify iterating from right to left. 31913 * @returns {Function} Returns the new base function. 31914 */ 31915 function createBaseEach(eachFunc, fromRight) { 31916 return function(collection, iteratee) { 31917 if (collection == null) { 31918 return collection; 31919 } 31920 if (!isArrayLike(collection)) { 31921 return eachFunc(collection, iteratee); 31922 } 31923 var length = collection.length, 31924 index = fromRight ? length : -1, 31925 iterable = Object(collection); 31926 31927 while ((fromRight ? index-- : ++index < length)) { 31928 if (iteratee(iterable[index], index, iterable) === false) { 31929 break; 31930 } 31931 } 31932 return collection; 31933 }; 31934 } 31935 31936 /** 31937 * Creates a base function for methods like `_.forIn` and `_.forOwn`. 31938 * 31939 * @private 31940 * @param {boolean} [fromRight] Specify iterating from right to left. 31941 * @returns {Function} Returns the new base function. 31942 */ 31943 function createBaseFor(fromRight) { 31944 return function(object, iteratee, keysFunc) { 31945 var index = -1, 31946 iterable = Object(object), 31947 props = keysFunc(object), 31948 length = props.length; 31949 31950 while (length--) { 31951 var key = props[fromRight ? length : ++index]; 31952 if (iteratee(iterable[key], key, iterable) === false) { 31953 break; 31954 } 31955 } 31956 return object; 31957 }; 31958 } 31959 31960 /** 31961 * Creates a function that wraps `func` to invoke it with the optional `this` 31962 * binding of `thisArg`. 31963 * 31964 * @private 31965 * @param {Function} func The function to wrap. 31966 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. 31967 * @param {*} [thisArg] The `this` binding of `func`. 31968 * @returns {Function} Returns the new wrapped function. 31969 */ 31970 function createBind(func, bitmask, thisArg) { 31971 var isBind = bitmask & WRAP_BIND_FLAG, 31972 Ctor = createCtor(func); 31973 31974 function wrapper() { 31975 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; 31976 return fn.apply(isBind ? thisArg : this, arguments); 31977 } 31978 return wrapper; 31979 } 31980 31981 /** 31982 * Creates a function like `_.lowerFirst`. 31983 * 31984 * @private 31985 * @param {string} methodName The name of the `String` case method to use. 31986 * @returns {Function} Returns the new case function. 31987 */ 31988 function createCaseFirst(methodName) { 31989 return function(string) { 31990 string = toString(string); 31991 31992 var strSymbols = hasUnicode(string) 31993 ? stringToArray(string) 31994 : undefined; 31995 31996 var chr = strSymbols 31997 ? strSymbols[0] 31998 : string.charAt(0); 31999 32000 var trailing = strSymbols 32001 ? castSlice(strSymbols, 1).join('') 32002 : string.slice(1); 32003 32004 return chr[methodName]() + trailing; 32005 }; 32006 } 32007 32008 /** 32009 * Creates a function like `_.camelCase`. 32010 * 32011 * @private 32012 * @param {Function} callback The function to combine each word. 32013 * @returns {Function} Returns the new compounder function. 32014 */ 32015 function createCompounder(callback) { 32016 return function(string) { 32017 return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); 32018 }; 32019 } 32020 32021 /** 32022 * Creates a function that produces an instance of `Ctor` regardless of 32023 * whether it was invoked as part of a `new` expression or by `call` or `apply`. 32024 * 32025 * @private 32026 * @param {Function} Ctor The constructor to wrap. 32027 * @returns {Function} Returns the new wrapped function. 32028 */ 32029 function createCtor(Ctor) { 32030 return function() { 32031 // Use a `switch` statement to work with class constructors. See 32032 // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist 32033 // for more details. 32034 var args = arguments; 32035 switch (args.length) { 32036 case 0: return new Ctor; 32037 case 1: return new Ctor(args[0]); 32038 case 2: return new Ctor(args[0], args[1]); 32039 case 3: return new Ctor(args[0], args[1], args[2]); 32040 case 4: return new Ctor(args[0], args[1], args[2], args[3]); 32041 case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); 32042 case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); 32043 case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); 32044 } 32045 var thisBinding = baseCreate(Ctor.prototype), 32046 result = Ctor.apply(thisBinding, args); 32047 32048 // Mimic the constructor's `return` behavior. 32049 // See https://es5.github.io/#x13.2.2 for more details. 32050 return isObject(result) ? result : thisBinding; 32051 }; 32052 } 32053 32054 /** 32055 * Creates a function that wraps `func` to enable currying. 32056 * 32057 * @private 32058 * @param {Function} func The function to wrap. 32059 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. 32060 * @param {number} arity The arity of `func`. 32061 * @returns {Function} Returns the new wrapped function. 32062 */ 32063 function createCurry(func, bitmask, arity) { 32064 var Ctor = createCtor(func); 32065 32066 function wrapper() { 32067 var length = arguments.length, 32068 args = Array(length), 32069 index = length, 32070 placeholder = getHolder(wrapper); 32071 32072 while (index--) { 32073 args[index] = arguments[index]; 32074 } 32075 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) 32076 ? [] 32077 : replaceHolders(args, placeholder); 32078 32079 length -= holders.length; 32080 if (length < arity) { 32081 return createRecurry( 32082 func, bitmask, createHybrid, wrapper.placeholder, undefined, 32083 args, holders, undefined, undefined, arity - length); 32084 } 32085 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; 32086 return apply(fn, this, args); 32087 } 32088 return wrapper; 32089 } 32090 32091 /** 32092 * Creates a `_.find` or `_.findLast` function. 32093 * 32094 * @private 32095 * @param {Function} findIndexFunc The function to find the collection index. 32096 * @returns {Function} Returns the new find function. 32097 */ 32098 function createFind(findIndexFunc) { 32099 return function(collection, predicate, fromIndex) { 32100 var iterable = Object(collection); 32101 if (!isArrayLike(collection)) { 32102 var iteratee = getIteratee(predicate, 3); 32103 collection = keys(collection); 32104 predicate = function(key) { return iteratee(iterable[key], key, iterable); }; 32105 } 32106 var index = findIndexFunc(collection, predicate, fromIndex); 32107 return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; 32108 }; 32109 } 32110 32111 /** 32112 * Creates a `_.flow` or `_.flowRight` function. 32113 * 32114 * @private 32115 * @param {boolean} [fromRight] Specify iterating from right to left. 32116 * @returns {Function} Returns the new flow function. 32117 */ 32118 function createFlow(fromRight) { 32119 return flatRest(function(funcs) { 32120 var length = funcs.length, 32121 index = length, 32122 prereq = LodashWrapper.prototype.thru; 32123 32124 if (fromRight) { 32125 funcs.reverse(); 32126 } 32127 while (index--) { 32128 var func = funcs[index]; 32129 if (typeof func != 'function') { 32130 throw new TypeError(FUNC_ERROR_TEXT); 32131 } 32132 if (prereq && !wrapper && getFuncName(func) == 'wrapper') { 32133 var wrapper = new LodashWrapper([], true); 32134 } 32135 } 32136 index = wrapper ? index : length; 32137 while (++index < length) { 32138 func = funcs[index]; 32139 32140 var funcName = getFuncName(func), 32141 data = funcName == 'wrapper' ? getData(func) : undefined; 32142 32143 if (data && isLaziable(data[0]) && 32144 data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && 32145 !data[4].length && data[9] == 1 32146 ) { 32147 wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); 32148 } else { 32149 wrapper = (func.length == 1 && isLaziable(func)) 32150 ? wrapper[funcName]() 32151 : wrapper.thru(func); 32152 } 32153 } 32154 return function() { 32155 var args = arguments, 32156 value = args[0]; 32157 32158 if (wrapper && args.length == 1 && isArray(value)) { 32159 return wrapper.plant(value).value(); 32160 } 32161 var index = 0, 32162 result = length ? funcs[index].apply(this, args) : value; 32163 32164 while (++index < length) { 32165 result = funcs[index].call(this, result); 32166 } 32167 return result; 32168 }; 32169 }); 32170 } 32171 32172 /** 32173 * Creates a function that wraps `func` to invoke it with optional `this` 32174 * binding of `thisArg`, partial application, and currying. 32175 * 32176 * @private 32177 * @param {Function|string} func The function or method name to wrap. 32178 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. 32179 * @param {*} [thisArg] The `this` binding of `func`. 32180 * @param {Array} [partials] The arguments to prepend to those provided to 32181 * the new function. 32182 * @param {Array} [holders] The `partials` placeholder indexes. 32183 * @param {Array} [partialsRight] The arguments to append to those provided 32184 * to the new function. 32185 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. 32186 * @param {Array} [argPos] The argument positions of the new function. 32187 * @param {number} [ary] The arity cap of `func`. 32188 * @param {number} [arity] The arity of `func`. 32189 * @returns {Function} Returns the new wrapped function. 32190 */ 32191 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { 32192 var isAry = bitmask & WRAP_ARY_FLAG, 32193 isBind = bitmask & WRAP_BIND_FLAG, 32194 isBindKey = bitmask & WRAP_BIND_KEY_FLAG, 32195 isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), 32196 isFlip = bitmask & WRAP_FLIP_FLAG, 32197 Ctor = isBindKey ? undefined : createCtor(func); 32198 32199 function wrapper() { 32200 var length = arguments.length, 32201 args = Array(length), 32202 index = length; 32203 32204 while (index--) { 32205 args[index] = arguments[index]; 32206 } 32207 if (isCurried) { 32208 var placeholder = getHolder(wrapper), 32209 holdersCount = countHolders(args, placeholder); 32210 } 32211 if (partials) { 32212 args = composeArgs(args, partials, holders, isCurried); 32213 } 32214 if (partialsRight) { 32215 args = composeArgsRight(args, partialsRight, holdersRight, isCurried); 32216 } 32217 length -= holdersCount; 32218 if (isCurried && length < arity) { 32219 var newHolders = replaceHolders(args, placeholder); 32220 return createRecurry( 32221 func, bitmask, createHybrid, wrapper.placeholder, thisArg, 32222 args, newHolders, argPos, ary, arity - length 32223 ); 32224 } 32225 var thisBinding = isBind ? thisArg : this, 32226 fn = isBindKey ? thisBinding[func] : func; 32227 32228 length = args.length; 32229 if (argPos) { 32230 args = reorder(args, argPos); 32231 } else if (isFlip && length > 1) { 32232 args.reverse(); 32233 } 32234 if (isAry && ary < length) { 32235 args.length = ary; 32236 } 32237 if (this && this !== root && this instanceof wrapper) { 32238 fn = Ctor || createCtor(fn); 32239 } 32240 return fn.apply(thisBinding, args); 32241 } 32242 return wrapper; 32243 } 32244 32245 /** 32246 * Creates a function like `_.invertBy`. 32247 * 32248 * @private 32249 * @param {Function} setter The function to set accumulator values. 32250 * @param {Function} toIteratee The function to resolve iteratees. 32251 * @returns {Function} Returns the new inverter function. 32252 */ 32253 function createInverter(setter, toIteratee) { 32254 return function(object, iteratee) { 32255 return baseInverter(object, setter, toIteratee(iteratee), {}); 32256 }; 32257 } 32258 32259 /** 32260 * Creates a function that performs a mathematical operation on two values. 32261 * 32262 * @private 32263 * @param {Function} operator The function to perform the operation. 32264 * @param {number} [defaultValue] The value used for `undefined` arguments. 32265 * @returns {Function} Returns the new mathematical operation function. 32266 */ 32267 function createMathOperation(operator, defaultValue) { 32268 return function(value, other) { 32269 var result; 32270 if (value === undefined && other === undefined) { 32271 return defaultValue; 32272 } 32273 if (value !== undefined) { 32274 result = value; 32275 } 32276 if (other !== undefined) { 32277 if (result === undefined) { 32278 return other; 32279 } 32280 if (typeof value == 'string' || typeof other == 'string') { 32281 value = baseToString(value); 32282 other = baseToString(other); 32283 } else { 32284 value = baseToNumber(value); 32285 other = baseToNumber(other); 32286 } 32287 result = operator(value, other); 32288 } 32289 return result; 32290 }; 32291 } 32292 32293 /** 32294 * Creates a function like `_.over`. 32295 * 32296 * @private 32297 * @param {Function} arrayFunc The function to iterate over iteratees. 32298 * @returns {Function} Returns the new over function. 32299 */ 32300 function createOver(arrayFunc) { 32301 return flatRest(function(iteratees) { 32302 iteratees = arrayMap(iteratees, baseUnary(getIteratee())); 32303 return baseRest(function(args) { 32304 var thisArg = this; 32305 return arrayFunc(iteratees, function(iteratee) { 32306 return apply(iteratee, thisArg, args); 32307 }); 32308 }); 32309 }); 32310 } 32311 32312 /** 32313 * Creates the padding for `string` based on `length`. The `chars` string 32314 * is truncated if the number of characters exceeds `length`. 32315 * 32316 * @private 32317 * @param {number} length The padding length. 32318 * @param {string} [chars=' '] The string used as padding. 32319 * @returns {string} Returns the padding for `string`. 32320 */ 32321 function createPadding(length, chars) { 32322 chars = chars === undefined ? ' ' : baseToString(chars); 32323 32324 var charsLength = chars.length; 32325 if (charsLength < 2) { 32326 return charsLength ? baseRepeat(chars, length) : chars; 32327 } 32328 var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); 32329 return hasUnicode(chars) 32330 ? castSlice(stringToArray(result), 0, length).join('') 32331 : result.slice(0, length); 32332 } 32333 32334 /** 32335 * Creates a function that wraps `func` to invoke it with the `this` binding 32336 * of `thisArg` and `partials` prepended to the arguments it receives. 32337 * 32338 * @private 32339 * @param {Function} func The function to wrap. 32340 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. 32341 * @param {*} thisArg The `this` binding of `func`. 32342 * @param {Array} partials The arguments to prepend to those provided to 32343 * the new function. 32344 * @returns {Function} Returns the new wrapped function. 32345 */ 32346 function createPartial(func, bitmask, thisArg, partials) { 32347 var isBind = bitmask & WRAP_BIND_FLAG, 32348 Ctor = createCtor(func); 32349 32350 function wrapper() { 32351 var argsIndex = -1, 32352 argsLength = arguments.length, 32353 leftIndex = -1, 32354 leftLength = partials.length, 32355 args = Array(leftLength + argsLength), 32356 fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; 32357 32358 while (++leftIndex < leftLength) { 32359 args[leftIndex] = partials[leftIndex]; 32360 } 32361 while (argsLength--) { 32362 args[leftIndex++] = arguments[++argsIndex]; 32363 } 32364 return apply(fn, isBind ? thisArg : this, args); 32365 } 32366 return wrapper; 32367 } 32368 32369 /** 32370 * Creates a `_.range` or `_.rangeRight` function. 32371 * 32372 * @private 32373 * @param {boolean} [fromRight] Specify iterating from right to left. 32374 * @returns {Function} Returns the new range function. 32375 */ 32376 function createRange(fromRight) { 32377 return function(start, end, step) { 32378 if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { 32379 end = step = undefined; 32380 } 32381 // Ensure the sign of `-0` is preserved. 32382 start = toFinite(start); 32383 if (end === undefined) { 32384 end = start; 32385 start = 0; 32386 } else { 32387 end = toFinite(end); 32388 } 32389 step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); 32390 return baseRange(start, end, step, fromRight); 32391 }; 32392 } 32393 32394 /** 32395 * Creates a function that performs a relational operation on two values. 32396 * 32397 * @private 32398 * @param {Function} operator The function to perform the operation. 32399 * @returns {Function} Returns the new relational operation function. 32400 */ 32401 function createRelationalOperation(operator) { 32402 return function(value, other) { 32403 if (!(typeof value == 'string' && typeof other == 'string')) { 32404 value = toNumber(value); 32405 other = toNumber(other); 32406 } 32407 return operator(value, other); 32408 }; 32409 } 32410 32411 /** 32412 * Creates a function that wraps `func` to continue currying. 32413 * 32414 * @private 32415 * @param {Function} func The function to wrap. 32416 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. 32417 * @param {Function} wrapFunc The function to create the `func` wrapper. 32418 * @param {*} placeholder The placeholder value. 32419 * @param {*} [thisArg] The `this` binding of `func`. 32420 * @param {Array} [partials] The arguments to prepend to those provided to 32421 * the new function. 32422 * @param {Array} [holders] The `partials` placeholder indexes. 32423 * @param {Array} [argPos] The argument positions of the new function. 32424 * @param {number} [ary] The arity cap of `func`. 32425 * @param {number} [arity] The arity of `func`. 32426 * @returns {Function} Returns the new wrapped function. 32427 */ 32428 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { 32429 var isCurry = bitmask & WRAP_CURRY_FLAG, 32430 newHolders = isCurry ? holders : undefined, 32431 newHoldersRight = isCurry ? undefined : holders, 32432 newPartials = isCurry ? partials : undefined, 32433 newPartialsRight = isCurry ? undefined : partials; 32434 32435 bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); 32436 bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); 32437 32438 if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { 32439 bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); 32440 } 32441 var newData = [ 32442 func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, 32443 newHoldersRight, argPos, ary, arity 32444 ]; 32445 32446 var result = wrapFunc.apply(undefined, newData); 32447 if (isLaziable(func)) { 32448 setData(result, newData); 32449 } 32450 result.placeholder = placeholder; 32451 return setWrapToString(result, func, bitmask); 32452 } 32453 32454 /** 32455 * Creates a function like `_.round`. 32456 * 32457 * @private 32458 * @param {string} methodName The name of the `Math` method to use when rounding. 32459 * @returns {Function} Returns the new round function. 32460 */ 32461 function createRound(methodName) { 32462 var func = Math[methodName]; 32463 return function(number, precision) { 32464 number = toNumber(number); 32465 precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); 32466 if (precision && nativeIsFinite(number)) { 32467 // Shift with exponential notation to avoid floating-point issues. 32468 // See [MDN](https://mdn.io/round#Examples) for more details. 32469 var pair = (toString(number) + 'e').split('e'), 32470 value = func(pair[0] + 'e' + (+pair[1] + precision)); 32471 32472 pair = (toString(value) + 'e').split('e'); 32473 return +(pair[0] + 'e' + (+pair[1] - precision)); 32474 } 32475 return func(number); 32476 }; 32477 } 32478 32479 /** 32480 * Creates a set object of `values`. 32481 * 32482 * @private 32483 * @param {Array} values The values to add to the set. 32484 * @returns {Object} Returns the new set. 32485 */ 32486 var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { 32487 return new Set(values); 32488 }; 32489 32490 /** 32491 * Creates a `_.toPairs` or `_.toPairsIn` function. 32492 * 32493 * @private 32494 * @param {Function} keysFunc The function to get the keys of a given object. 32495 * @returns {Function} Returns the new pairs function. 32496 */ 32497 function createToPairs(keysFunc) { 32498 return function(object) { 32499 var tag = getTag(object); 32500 if (tag == mapTag) { 32501 return mapToArray(object); 32502 } 32503 if (tag == setTag) { 32504 return setToPairs(object); 32505 } 32506 return baseToPairs(object, keysFunc(object)); 32507 }; 32508 } 32509 32510 /** 32511 * Creates a function that either curries or invokes `func` with optional 32512 * `this` binding and partially applied arguments. 32513 * 32514 * @private 32515 * @param {Function|string} func The function or method name to wrap. 32516 * @param {number} bitmask The bitmask flags. 32517 * 1 - `_.bind` 32518 * 2 - `_.bindKey` 32519 * 4 - `_.curry` or `_.curryRight` of a bound function 32520 * 8 - `_.curry` 32521 * 16 - `_.curryRight` 32522 * 32 - `_.partial` 32523 * 64 - `_.partialRight` 32524 * 128 - `_.rearg` 32525 * 256 - `_.ary` 32526 * 512 - `_.flip` 32527 * @param {*} [thisArg] The `this` binding of `func`. 32528 * @param {Array} [partials] The arguments to be partially applied. 32529 * @param {Array} [holders] The `partials` placeholder indexes. 32530 * @param {Array} [argPos] The argument positions of the new function. 32531 * @param {number} [ary] The arity cap of `func`. 32532 * @param {number} [arity] The arity of `func`. 32533 * @returns {Function} Returns the new wrapped function. 32534 */ 32535 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { 32536 var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; 32537 if (!isBindKey && typeof func != 'function') { 32538 throw new TypeError(FUNC_ERROR_TEXT); 32539 } 32540 var length = partials ? partials.length : 0; 32541 if (!length) { 32542 bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); 32543 partials = holders = undefined; 32544 } 32545 ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); 32546 arity = arity === undefined ? arity : toInteger(arity); 32547 length -= holders ? holders.length : 0; 32548 32549 if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { 32550 var partialsRight = partials, 32551 holdersRight = holders; 32552 32553 partials = holders = undefined; 32554 } 32555 var data = isBindKey ? undefined : getData(func); 32556 32557 var newData = [ 32558 func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, 32559 argPos, ary, arity 32560 ]; 32561 32562 if (data) { 32563 mergeData(newData, data); 32564 } 32565 func = newData[0]; 32566 bitmask = newData[1]; 32567 thisArg = newData[2]; 32568 partials = newData[3]; 32569 holders = newData[4]; 32570 arity = newData[9] = newData[9] === undefined 32571 ? (isBindKey ? 0 : func.length) 32572 : nativeMax(newData[9] - length, 0); 32573 32574 if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { 32575 bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); 32576 } 32577 if (!bitmask || bitmask == WRAP_BIND_FLAG) { 32578 var result = createBind(func, bitmask, thisArg); 32579 } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { 32580 result = createCurry(func, bitmask, arity); 32581 } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { 32582 result = createPartial(func, bitmask, thisArg, partials); 32583 } else { 32584 result = createHybrid.apply(undefined, newData); 32585 } 32586 var setter = data ? baseSetData : setData; 32587 return setWrapToString(setter(result, newData), func, bitmask); 32588 } 32589 32590 /** 32591 * Used by `_.defaults` to customize its `_.assignIn` use to assign properties 32592 * of source objects to the destination object for all destination properties 32593 * that resolve to `undefined`. 32594 * 32595 * @private 32596 * @param {*} objValue The destination value. 32597 * @param {*} srcValue The source value. 32598 * @param {string} key The key of the property to assign. 32599 * @param {Object} object The parent object of `objValue`. 32600 * @returns {*} Returns the value to assign. 32601 */ 32602 function customDefaultsAssignIn(objValue, srcValue, key, object) { 32603 if (objValue === undefined || 32604 (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { 32605 return srcValue; 32606 } 32607 return objValue; 32608 } 32609 32610 /** 32611 * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source 32612 * objects into destination objects that are passed thru. 32613 * 32614 * @private 32615 * @param {*} objValue The destination value. 32616 * @param {*} srcValue The source value. 32617 * @param {string} key The key of the property to merge. 32618 * @param {Object} object The parent object of `objValue`. 32619 * @param {Object} source The parent object of `srcValue`. 32620 * @param {Object} [stack] Tracks traversed source values and their merged 32621 * counterparts. 32622 * @returns {*} Returns the value to assign. 32623 */ 32624 function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { 32625 if (isObject(objValue) && isObject(srcValue)) { 32626 // Recursively merge objects and arrays (susceptible to call stack limits). 32627 stack.set(srcValue, objValue); 32628 baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); 32629 stack['delete'](srcValue); 32630 } 32631 return objValue; 32632 } 32633 32634 /** 32635 * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain 32636 * objects. 32637 * 32638 * @private 32639 * @param {*} value The value to inspect. 32640 * @param {string} key The key of the property to inspect. 32641 * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. 32642 */ 32643 function customOmitClone(value) { 32644 return isPlainObject(value) ? undefined : value; 32645 } 32646 32647 /** 32648 * A specialized version of `baseIsEqualDeep` for arrays with support for 32649 * partial deep comparisons. 32650 * 32651 * @private 32652 * @param {Array} array The array to compare. 32653 * @param {Array} other The other array to compare. 32654 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. 32655 * @param {Function} customizer The function to customize comparisons. 32656 * @param {Function} equalFunc The function to determine equivalents of values. 32657 * @param {Object} stack Tracks traversed `array` and `other` objects. 32658 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. 32659 */ 32660 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { 32661 var isPartial = bitmask & COMPARE_PARTIAL_FLAG, 32662 arrLength = array.length, 32663 othLength = other.length; 32664 32665 if (arrLength != othLength && !(isPartial && othLength > arrLength)) { 32666 return false; 32667 } 32668 // Check that cyclic values are equal. 32669 var arrStacked = stack.get(array); 32670 var othStacked = stack.get(other); 32671 if (arrStacked && othStacked) { 32672 return arrStacked == other && othStacked == array; 32673 } 32674 var index = -1, 32675 result = true, 32676 seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; 32677 32678 stack.set(array, other); 32679 stack.set(other, array); 32680 32681 // Ignore non-index properties. 32682 while (++index < arrLength) { 32683 var arrValue = array[index], 32684 othValue = other[index]; 32685 32686 if (customizer) { 32687 var compared = isPartial 32688 ? customizer(othValue, arrValue, index, other, array, stack) 32689 : customizer(arrValue, othValue, index, array, other, stack); 32690 } 32691 if (compared !== undefined) { 32692 if (compared) { 32693 continue; 32694 } 32695 result = false; 32696 break; 32697 } 32698 // Recursively compare arrays (susceptible to call stack limits). 32699 if (seen) { 32700 if (!arraySome(other, function(othValue, othIndex) { 32701 if (!cacheHas(seen, othIndex) && 32702 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { 32703 return seen.push(othIndex); 32704 } 32705 })) { 32706 result = false; 32707 break; 32708 } 32709 } else if (!( 32710 arrValue === othValue || 32711 equalFunc(arrValue, othValue, bitmask, customizer, stack) 32712 )) { 32713 result = false; 32714 break; 32715 } 32716 } 32717 stack['delete'](array); 32718 stack['delete'](other); 32719 return result; 32720 } 32721 32722 /** 32723 * A specialized version of `baseIsEqualDeep` for comparing objects of 32724 * the same `toStringTag`. 32725 * 32726 * **Note:** This function only supports comparing values with tags of 32727 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. 32728 * 32729 * @private 32730 * @param {Object} object The object to compare. 32731 * @param {Object} other The other object to compare. 32732 * @param {string} tag The `toStringTag` of the objects to compare. 32733 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. 32734 * @param {Function} customizer The function to customize comparisons. 32735 * @param {Function} equalFunc The function to determine equivalents of values. 32736 * @param {Object} stack Tracks traversed `object` and `other` objects. 32737 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. 32738 */ 32739 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { 32740 switch (tag) { 32741 case dataViewTag: 32742 if ((object.byteLength != other.byteLength) || 32743 (object.byteOffset != other.byteOffset)) { 32744 return false; 32745 } 32746 object = object.buffer; 32747 other = other.buffer; 32748 32749 case arrayBufferTag: 32750 if ((object.byteLength != other.byteLength) || 32751 !equalFunc(new Uint8Array(object), new Uint8Array(other))) { 32752 return false; 32753 } 32754 return true; 32755 32756 case boolTag: 32757 case dateTag: 32758 case numberTag: 32759 // Coerce booleans to `1` or `0` and dates to milliseconds. 32760 // Invalid dates are coerced to `NaN`. 32761 return eq(+object, +other); 32762 32763 case errorTag: 32764 return object.name == other.name && object.message == other.message; 32765 32766 case regexpTag: 32767 case stringTag: 32768 // Coerce regexes to strings and treat strings, primitives and objects, 32769 // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring 32770 // for more details. 32771 return object == (other + ''); 32772 32773 case mapTag: 32774 var convert = mapToArray; 32775 32776 case setTag: 32777 var isPartial = bitmask & COMPARE_PARTIAL_FLAG; 32778 convert || (convert = setToArray); 32779 32780 if (object.size != other.size && !isPartial) { 32781 return false; 32782 } 32783 // Assume cyclic values are equal. 32784 var stacked = stack.get(object); 32785 if (stacked) { 32786 return stacked == other; 32787 } 32788 bitmask |= COMPARE_UNORDERED_FLAG; 32789 32790 // Recursively compare objects (susceptible to call stack limits). 32791 stack.set(object, other); 32792 var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); 32793 stack['delete'](object); 32794 return result; 32795 32796 case symbolTag: 32797 if (symbolValueOf) { 32798 return symbolValueOf.call(object) == symbolValueOf.call(other); 32799 } 32800 } 32801 return false; 32802 } 32803 32804 /** 32805 * A specialized version of `baseIsEqualDeep` for objects with support for 32806 * partial deep comparisons. 32807 * 32808 * @private 32809 * @param {Object} object The object to compare. 32810 * @param {Object} other The other object to compare. 32811 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. 32812 * @param {Function} customizer The function to customize comparisons. 32813 * @param {Function} equalFunc The function to determine equivalents of values. 32814 * @param {Object} stack Tracks traversed `object` and `other` objects. 32815 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. 32816 */ 32817 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { 32818 var isPartial = bitmask & COMPARE_PARTIAL_FLAG, 32819 objProps = getAllKeys(object), 32820 objLength = objProps.length, 32821 othProps = getAllKeys(other), 32822 othLength = othProps.length; 32823 32824 if (objLength != othLength && !isPartial) { 32825 return false; 32826 } 32827 var index = objLength; 32828 while (index--) { 32829 var key = objProps[index]; 32830 if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { 32831 return false; 32832 } 32833 } 32834 // Check that cyclic values are equal. 32835 var objStacked = stack.get(object); 32836 var othStacked = stack.get(other); 32837 if (objStacked && othStacked) { 32838 return objStacked == other && othStacked == object; 32839 } 32840 var result = true; 32841 stack.set(object, other); 32842 stack.set(other, object); 32843 32844 var skipCtor = isPartial; 32845 while (++index < objLength) { 32846 key = objProps[index]; 32847 var objValue = object[key], 32848 othValue = other[key]; 32849 32850 if (customizer) { 32851 var compared = isPartial 32852 ? customizer(othValue, objValue, key, other, object, stack) 32853 : customizer(objValue, othValue, key, object, other, stack); 32854 } 32855 // Recursively compare objects (susceptible to call stack limits). 32856 if (!(compared === undefined 32857 ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) 32858 : compared 32859 )) { 32860 result = false; 32861 break; 32862 } 32863 skipCtor || (skipCtor = key == 'constructor'); 32864 } 32865 if (result && !skipCtor) { 32866 var objCtor = object.constructor, 32867 othCtor = other.constructor; 32868 32869 // Non `Object` object instances with different constructors are not equal. 32870 if (objCtor != othCtor && 32871 ('constructor' in object && 'constructor' in other) && 32872 !(typeof objCtor == 'function' && objCtor instanceof objCtor && 32873 typeof othCtor == 'function' && othCtor instanceof othCtor)) { 32874 result = false; 32875 } 32876 } 32877 stack['delete'](object); 32878 stack['delete'](other); 32879 return result; 32880 } 32881 32882 /** 32883 * A specialized version of `baseRest` which flattens the rest array. 32884 * 32885 * @private 32886 * @param {Function} func The function to apply a rest parameter to. 32887 * @returns {Function} Returns the new function. 32888 */ 32889 function flatRest(func) { 32890 return setToString(overRest(func, undefined, flatten), func + ''); 32891 } 32892 32893 /** 32894 * Creates an array of own enumerable property names and symbols of `object`. 32895 * 32896 * @private 32897 * @param {Object} object The object to query. 32898 * @returns {Array} Returns the array of property names and symbols. 32899 */ 32900 function getAllKeys(object) { 32901 return baseGetAllKeys(object, keys, getSymbols); 32902 } 32903 32904 /** 32905 * Creates an array of own and inherited enumerable property names and 32906 * symbols of `object`. 32907 * 32908 * @private 32909 * @param {Object} object The object to query. 32910 * @returns {Array} Returns the array of property names and symbols. 32911 */ 32912 function getAllKeysIn(object) { 32913 return baseGetAllKeys(object, keysIn, getSymbolsIn); 32914 } 32915 32916 /** 32917 * Gets metadata for `func`. 32918 * 32919 * @private 32920 * @param {Function} func The function to query. 32921 * @returns {*} Returns the metadata for `func`. 32922 */ 32923 var getData = !metaMap ? noop : function(func) { 32924 return metaMap.get(func); 32925 }; 32926 32927 /** 32928 * Gets the name of `func`. 32929 * 32930 * @private 32931 * @param {Function} func The function to query. 32932 * @returns {string} Returns the function name. 32933 */ 32934 function getFuncName(func) { 32935 var result = (func.name + ''), 32936 array = realNames[result], 32937 length = hasOwnProperty.call(realNames, result) ? array.length : 0; 32938 32939 while (length--) { 32940 var data = array[length], 32941 otherFunc = data.func; 32942 if (otherFunc == null || otherFunc == func) { 32943 return data.name; 32944 } 32945 } 32946 return result; 32947 } 32948 32949 /** 32950 * Gets the argument placeholder value for `func`. 32951 * 32952 * @private 32953 * @param {Function} func The function to inspect. 32954 * @returns {*} Returns the placeholder value. 32955 */ 32956 function getHolder(func) { 32957 var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; 32958 return object.placeholder; 32959 } 32960 32961 /** 32962 * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, 32963 * this function returns the custom method, otherwise it returns `baseIteratee`. 32964 * If arguments are provided, the chosen function is invoked with them and 32965 * its result is returned. 32966 * 32967 * @private 32968 * @param {*} [value] The value to convert to an iteratee. 32969 * @param {number} [arity] The arity of the created iteratee. 32970 * @returns {Function} Returns the chosen function or its result. 32971 */ 32972 function getIteratee() { 32973 var result = lodash.iteratee || iteratee; 32974 result = result === iteratee ? baseIteratee : result; 32975 return arguments.length ? result(arguments[0], arguments[1]) : result; 32976 } 32977 32978 /** 32979 * Gets the data for `map`. 32980 * 32981 * @private 32982 * @param {Object} map The map to query. 32983 * @param {string} key The reference key. 32984 * @returns {*} Returns the map data. 32985 */ 32986 function getMapData(map, key) { 32987 var data = map.__data__; 32988 return isKeyable(key) 32989 ? data[typeof key == 'string' ? 'string' : 'hash'] 32990 : data.map; 32991 } 32992 32993 /** 32994 * Gets the property names, values, and compare flags of `object`. 32995 * 32996 * @private 32997 * @param {Object} object The object to query. 32998 * @returns {Array} Returns the match data of `object`. 32999 */ 33000 function getMatchData(object) { 33001 var result = keys(object), 33002 length = result.length; 33003 33004 while (length--) { 33005 var key = result[length], 33006 value = object[key]; 33007 33008 result[length] = [key, value, isStrictComparable(value)]; 33009 } 33010 return result; 33011 } 33012 33013 /** 33014 * Gets the native function at `key` of `object`. 33015 * 33016 * @private 33017 * @param {Object} object The object to query. 33018 * @param {string} key The key of the method to get. 33019 * @returns {*} Returns the function if it's native, else `undefined`. 33020 */ 33021 function getNative(object, key) { 33022 var value = getValue(object, key); 33023 return baseIsNative(value) ? value : undefined; 33024 } 33025 33026 /** 33027 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. 33028 * 33029 * @private 33030 * @param {*} value The value to query. 33031 * @returns {string} Returns the raw `toStringTag`. 33032 */ 33033 function getRawTag(value) { 33034 var isOwn = hasOwnProperty.call(value, symToStringTag), 33035 tag = value[symToStringTag]; 33036 33037 try { 33038 value[symToStringTag] = undefined; 33039 var unmasked = true; 33040 } catch (e) {} 33041 33042 var result = nativeObjectToString.call(value); 33043 if (unmasked) { 33044 if (isOwn) { 33045 value[symToStringTag] = tag; 33046 } else { 33047 delete value[symToStringTag]; 33048 } 33049 } 33050 return result; 33051 } 33052 33053 /** 33054 * Creates an array of the own enumerable symbols of `object`. 33055 * 33056 * @private 33057 * @param {Object} object The object to query. 33058 * @returns {Array} Returns the array of symbols. 33059 */ 33060 var getSymbols = !nativeGetSymbols ? stubArray : function(object) { 33061 if (object == null) { 33062 return []; 33063 } 33064 object = Object(object); 33065 return arrayFilter(nativeGetSymbols(object), function(symbol) { 33066 return propertyIsEnumerable.call(object, symbol); 33067 }); 33068 }; 33069 33070 /** 33071 * Creates an array of the own and inherited enumerable symbols of `object`. 33072 * 33073 * @private 33074 * @param {Object} object The object to query. 33075 * @returns {Array} Returns the array of symbols. 33076 */ 33077 var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { 33078 var result = []; 33079 while (object) { 33080 arrayPush(result, getSymbols(object)); 33081 object = getPrototype(object); 33082 } 33083 return result; 33084 }; 33085 33086 /** 33087 * Gets the `toStringTag` of `value`. 33088 * 33089 * @private 33090 * @param {*} value The value to query. 33091 * @returns {string} Returns the `toStringTag`. 33092 */ 33093 var getTag = baseGetTag; 33094 33095 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. 33096 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || 33097 (Map && getTag(new Map) != mapTag) || 33098 (Promise && getTag(Promise.resolve()) != promiseTag) || 33099 (Set && getTag(new Set) != setTag) || 33100 (WeakMap && getTag(new WeakMap) != weakMapTag)) { 33101 getTag = function(value) { 33102 var result = baseGetTag(value), 33103 Ctor = result == objectTag ? value.constructor : undefined, 33104 ctorString = Ctor ? toSource(Ctor) : ''; 33105 33106 if (ctorString) { 33107 switch (ctorString) { 33108 case dataViewCtorString: return dataViewTag; 33109 case mapCtorString: return mapTag; 33110 case promiseCtorString: return promiseTag; 33111 case setCtorString: return setTag; 33112 case weakMapCtorString: return weakMapTag; 33113 } 33114 } 33115 return result; 33116 }; 33117 } 33118 33119 /** 33120 * Gets the view, applying any `transforms` to the `start` and `end` positions. 33121 * 33122 * @private 33123 * @param {number} start The start of the view. 33124 * @param {number} end The end of the view. 33125 * @param {Array} transforms The transformations to apply to the view. 33126 * @returns {Object} Returns an object containing the `start` and `end` 33127 * positions of the view. 33128 */ 33129 function getView(start, end, transforms) { 33130 var index = -1, 33131 length = transforms.length; 33132 33133 while (++index < length) { 33134 var data = transforms[index], 33135 size = data.size; 33136 33137 switch (data.type) { 33138 case 'drop': start += size; break; 33139 case 'dropRight': end -= size; break; 33140 case 'take': end = nativeMin(end, start + size); break; 33141 case 'takeRight': start = nativeMax(start, end - size); break; 33142 } 33143 } 33144 return { 'start': start, 'end': end }; 33145 } 33146 33147 /** 33148 * Extracts wrapper details from the `source` body comment. 33149 * 33150 * @private 33151 * @param {string} source The source to inspect. 33152 * @returns {Array} Returns the wrapper details. 33153 */ 33154 function getWrapDetails(source) { 33155 var match = source.match(reWrapDetails); 33156 return match ? match[1].split(reSplitDetails) : []; 33157 } 33158 33159 /** 33160 * Checks if `path` exists on `object`. 33161 * 33162 * @private 33163 * @param {Object} object The object to query. 33164 * @param {Array|string} path The path to check. 33165 * @param {Function} hasFunc The function to check properties. 33166 * @returns {boolean} Returns `true` if `path` exists, else `false`. 33167 */ 33168 function hasPath(object, path, hasFunc) { 33169 path = castPath(path, object); 33170 33171 var index = -1, 33172 length = path.length, 33173 result = false; 33174 33175 while (++index < length) { 33176 var key = toKey(path[index]); 33177 if (!(result = object != null && hasFunc(object, key))) { 33178 break; 33179 } 33180 object = object[key]; 33181 } 33182 if (result || ++index != length) { 33183 return result; 33184 } 33185 length = object == null ? 0 : object.length; 33186 return !!length && isLength(length) && isIndex(key, length) && 33187 (isArray(object) || isArguments(object)); 33188 } 33189 33190 /** 33191 * Initializes an array clone. 33192 * 33193 * @private 33194 * @param {Array} array The array to clone. 33195 * @returns {Array} Returns the initialized clone. 33196 */ 33197 function initCloneArray(array) { 33198 var length = array.length, 33199 result = new array.constructor(length); 33200 33201 // Add properties assigned by `RegExp#exec`. 33202 if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { 33203 result.index = array.index; 33204 result.input = array.input; 33205 } 33206 return result; 33207 } 33208 33209 /** 33210 * Initializes an object clone. 33211 * 33212 * @private 33213 * @param {Object} object The object to clone. 33214 * @returns {Object} Returns the initialized clone. 33215 */ 33216 function initCloneObject(object) { 33217 return (typeof object.constructor == 'function' && !isPrototype(object)) 33218 ? baseCreate(getPrototype(object)) 33219 : {}; 33220 } 33221 33222 /** 33223 * Initializes an object clone based on its `toStringTag`. 33224 * 33225 * **Note:** This function only supports cloning values with tags of 33226 * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. 33227 * 33228 * @private 33229 * @param {Object} object The object to clone. 33230 * @param {string} tag The `toStringTag` of the object to clone. 33231 * @param {boolean} [isDeep] Specify a deep clone. 33232 * @returns {Object} Returns the initialized clone. 33233 */ 33234 function initCloneByTag(object, tag, isDeep) { 33235 var Ctor = object.constructor; 33236 switch (tag) { 33237 case arrayBufferTag: 33238 return cloneArrayBuffer(object); 33239 33240 case boolTag: 33241 case dateTag: 33242 return new Ctor(+object); 33243 33244 case dataViewTag: 33245 return cloneDataView(object, isDeep); 33246 33247 case float32Tag: case float64Tag: 33248 case int8Tag: case int16Tag: case int32Tag: 33249 case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: 33250 return cloneTypedArray(object, isDeep); 33251 33252 case mapTag: 33253 return new Ctor; 33254 33255 case numberTag: 33256 case stringTag: 33257 return new Ctor(object); 33258 33259 case regexpTag: 33260 return cloneRegExp(object); 33261 33262 case setTag: 33263 return new Ctor; 33264 33265 case symbolTag: 33266 return cloneSymbol(object); 33267 } 33268 } 33269 33270 /** 33271 * Inserts wrapper `details` in a comment at the top of the `source` body. 33272 * 33273 * @private 33274 * @param {string} source The source to modify. 33275 * @returns {Array} details The details to insert. 33276 * @returns {string} Returns the modified source. 33277 */ 33278 function insertWrapDetails(source, details) { 33279 var length = details.length; 33280 if (!length) { 33281 return source; 33282 } 33283 var lastIndex = length - 1; 33284 details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; 33285 details = details.join(length > 2 ? ', ' : ' '); 33286 return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); 33287 } 33288 33289 /** 33290 * Checks if `value` is a flattenable `arguments` object or array. 33291 * 33292 * @private 33293 * @param {*} value The value to check. 33294 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. 33295 */ 33296 function isFlattenable(value) { 33297 return isArray(value) || isArguments(value) || 33298 !!(spreadableSymbol && value && value[spreadableSymbol]); 33299 } 33300 33301 /** 33302 * Checks if `value` is a valid array-like index. 33303 * 33304 * @private 33305 * @param {*} value The value to check. 33306 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. 33307 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. 33308 */ 33309 function isIndex(value, length) { 33310 var type = typeof value; 33311 length = length == null ? MAX_SAFE_INTEGER : length; 33312 33313 return !!length && 33314 (type == 'number' || 33315 (type != 'symbol' && reIsUint.test(value))) && 33316 (value > -1 && value % 1 == 0 && value < length); 33317 } 33318 33319 /** 33320 * Checks if the given arguments are from an iteratee call. 33321 * 33322 * @private 33323 * @param {*} value The potential iteratee value argument. 33324 * @param {*} index The potential iteratee index or key argument. 33325 * @param {*} object The potential iteratee object argument. 33326 * @returns {boolean} Returns `true` if the arguments are from an iteratee call, 33327 * else `false`. 33328 */ 33329 function isIterateeCall(value, index, object) { 33330 if (!isObject(object)) { 33331 return false; 33332 } 33333 var type = typeof index; 33334 if (type == 'number' 33335 ? (isArrayLike(object) && isIndex(index, object.length)) 33336 : (type == 'string' && index in object) 33337 ) { 33338 return eq(object[index], value); 33339 } 33340 return false; 33341 } 33342 33343 /** 33344 * Checks if `value` is a property name and not a property path. 33345 * 33346 * @private 33347 * @param {*} value The value to check. 33348 * @param {Object} [object] The object to query keys on. 33349 * @returns {boolean} Returns `true` if `value` is a property name, else `false`. 33350 */ 33351 function isKey(value, object) { 33352 if (isArray(value)) { 33353 return false; 33354 } 33355 var type = typeof value; 33356 if (type == 'number' || type == 'symbol' || type == 'boolean' || 33357 value == null || isSymbol(value)) { 33358 return true; 33359 } 33360 return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || 33361 (object != null && value in Object(object)); 33362 } 33363 33364 /** 33365 * Checks if `value` is suitable for use as unique object key. 33366 * 33367 * @private 33368 * @param {*} value The value to check. 33369 * @returns {boolean} Returns `true` if `value` is suitable, else `false`. 33370 */ 33371 function isKeyable(value) { 33372 var type = typeof value; 33373 return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') 33374 ? (value !== '__proto__') 33375 : (value === null); 33376 } 33377 33378 /** 33379 * Checks if `func` has a lazy counterpart. 33380 * 33381 * @private 33382 * @param {Function} func The function to check. 33383 * @returns {boolean} Returns `true` if `func` has a lazy counterpart, 33384 * else `false`. 33385 */ 33386 function isLaziable(func) { 33387 var funcName = getFuncName(func), 33388 other = lodash[funcName]; 33389 33390 if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { 33391 return false; 33392 } 33393 if (func === other) { 33394 return true; 33395 } 33396 var data = getData(other); 33397 return !!data && func === data[0]; 33398 } 33399 33400 /** 33401 * Checks if `func` has its source masked. 33402 * 33403 * @private 33404 * @param {Function} func The function to check. 33405 * @returns {boolean} Returns `true` if `func` is masked, else `false`. 33406 */ 33407 function isMasked(func) { 33408 return !!maskSrcKey && (maskSrcKey in func); 33409 } 33410 33411 /** 33412 * Checks if `func` is capable of being masked. 33413 * 33414 * @private 33415 * @param {*} value The value to check. 33416 * @returns {boolean} Returns `true` if `func` is maskable, else `false`. 33417 */ 33418 var isMaskable = coreJsData ? isFunction : stubFalse; 33419 33420 /** 33421 * Checks if `value` is likely a prototype object. 33422 * 33423 * @private 33424 * @param {*} value The value to check. 33425 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. 33426 */ 33427 function isPrototype(value) { 33428 var Ctor = value && value.constructor, 33429 proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; 33430 33431 return value === proto; 33432 } 33433 33434 /** 33435 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. 33436 * 33437 * @private 33438 * @param {*} value The value to check. 33439 * @returns {boolean} Returns `true` if `value` if suitable for strict 33440 * equality comparisons, else `false`. 33441 */ 33442 function isStrictComparable(value) { 33443 return value === value && !isObject(value); 33444 } 33445 33446 /** 33447 * A specialized version of `matchesProperty` for source values suitable 33448 * for strict equality comparisons, i.e. `===`. 33449 * 33450 * @private 33451 * @param {string} key The key of the property to get. 33452 * @param {*} srcValue The value to match. 33453 * @returns {Function} Returns the new spec function. 33454 */ 33455 function matchesStrictComparable(key, srcValue) { 33456 return function(object) { 33457 if (object == null) { 33458 return false; 33459 } 33460 return object[key] === srcValue && 33461 (srcValue !== undefined || (key in Object(object))); 33462 }; 33463 } 33464 33465 /** 33466 * A specialized version of `_.memoize` which clears the memoized function's 33467 * cache when it exceeds `MAX_MEMOIZE_SIZE`. 33468 * 33469 * @private 33470 * @param {Function} func The function to have its output memoized. 33471 * @returns {Function} Returns the new memoized function. 33472 */ 33473 function memoizeCapped(func) { 33474 var result = memoize(func, function(key) { 33475 if (cache.size === MAX_MEMOIZE_SIZE) { 33476 cache.clear(); 33477 } 33478 return key; 33479 }); 33480 33481 var cache = result.cache; 33482 return result; 33483 } 33484 33485 /** 33486 * Merges the function metadata of `source` into `data`. 33487 * 33488 * Merging metadata reduces the number of wrappers used to invoke a function. 33489 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` 33490 * may be applied regardless of execution order. Methods like `_.ary` and 33491 * `_.rearg` modify function arguments, making the order in which they are 33492 * executed important, preventing the merging of metadata. However, we make 33493 * an exception for a safe combined case where curried functions have `_.ary` 33494 * and or `_.rearg` applied. 33495 * 33496 * @private 33497 * @param {Array} data The destination metadata. 33498 * @param {Array} source The source metadata. 33499 * @returns {Array} Returns `data`. 33500 */ 33501 function mergeData(data, source) { 33502 var bitmask = data[1], 33503 srcBitmask = source[1], 33504 newBitmask = bitmask | srcBitmask, 33505 isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); 33506 33507 var isCombo = 33508 ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || 33509 ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || 33510 ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); 33511 33512 // Exit early if metadata can't be merged. 33513 if (!(isCommon || isCombo)) { 33514 return data; 33515 } 33516 // Use source `thisArg` if available. 33517 if (srcBitmask & WRAP_BIND_FLAG) { 33518 data[2] = source[2]; 33519 // Set when currying a bound function. 33520 newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; 33521 } 33522 // Compose partial arguments. 33523 var value = source[3]; 33524 if (value) { 33525 var partials = data[3]; 33526 data[3] = partials ? composeArgs(partials, value, source[4]) : value; 33527 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; 33528 } 33529 // Compose partial right arguments. 33530 value = source[5]; 33531 if (value) { 33532 partials = data[5]; 33533 data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; 33534 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; 33535 } 33536 // Use source `argPos` if available. 33537 value = source[7]; 33538 if (value) { 33539 data[7] = value; 33540 } 33541 // Use source `ary` if it's smaller. 33542 if (srcBitmask & WRAP_ARY_FLAG) { 33543 data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); 33544 } 33545 // Use source `arity` if one is not provided. 33546 if (data[9] == null) { 33547 data[9] = source[9]; 33548 } 33549 // Use source `func` and merge bitmasks. 33550 data[0] = source[0]; 33551 data[1] = newBitmask; 33552 33553 return data; 33554 } 33555 33556 /** 33557 * This function is like 33558 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) 33559 * except that it includes inherited enumerable properties. 33560 * 33561 * @private 33562 * @param {Object} object The object to query. 33563 * @returns {Array} Returns the array of property names. 33564 */ 33565 function nativeKeysIn(object) { 33566 var result = []; 33567 if (object != null) { 33568 for (var key in Object(object)) { 33569 result.push(key); 33570 } 33571 } 33572 return result; 33573 } 33574 33575 /** 33576 * Converts `value` to a string using `Object.prototype.toString`. 33577 * 33578 * @private 33579 * @param {*} value The value to convert. 33580 * @returns {string} Returns the converted string. 33581 */ 33582 function objectToString(value) { 33583 return nativeObjectToString.call(value); 33584 } 33585 33586 /** 33587 * A specialized version of `baseRest` which transforms the rest array. 33588 * 33589 * @private 33590 * @param {Function} func The function to apply a rest parameter to. 33591 * @param {number} [start=func.length-1] The start position of the rest parameter. 33592 * @param {Function} transform The rest array transform. 33593 * @returns {Function} Returns the new function. 33594 */ 33595 function overRest(func, start, transform) { 33596 start = nativeMax(start === undefined ? (func.length - 1) : start, 0); 33597 return function() { 33598 var args = arguments, 33599 index = -1, 33600 length = nativeMax(args.length - start, 0), 33601 array = Array(length); 33602 33603 while (++index < length) { 33604 array[index] = args[start + index]; 33605 } 33606 index = -1; 33607 var otherArgs = Array(start + 1); 33608 while (++index < start) { 33609 otherArgs[index] = args[index]; 33610 } 33611 otherArgs[start] = transform(array); 33612 return apply(func, this, otherArgs); 33613 }; 33614 } 33615 33616 /** 33617 * Gets the parent value at `path` of `object`. 33618 * 33619 * @private 33620 * @param {Object} object The object to query. 33621 * @param {Array} path The path to get the parent value of. 33622 * @returns {*} Returns the parent value. 33623 */ 33624 function parent(object, path) { 33625 return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); 33626 } 33627 33628 /** 33629 * Reorder `array` according to the specified indexes where the element at 33630 * the first index is assigned as the first element, the element at 33631 * the second index is assigned as the second element, and so on. 33632 * 33633 * @private 33634 * @param {Array} array The array to reorder. 33635 * @param {Array} indexes The arranged array indexes. 33636 * @returns {Array} Returns `array`. 33637 */ 33638 function reorder(array, indexes) { 33639 var arrLength = array.length, 33640 length = nativeMin(indexes.length, arrLength), 33641 oldArray = copyArray(array); 33642 33643 while (length--) { 33644 var index = indexes[length]; 33645 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; 33646 } 33647 return array; 33648 } 33649 33650 /** 33651 * Gets the value at `key`, unless `key` is "__proto__" or "constructor". 33652 * 33653 * @private 33654 * @param {Object} object The object to query. 33655 * @param {string} key The key of the property to get. 33656 * @returns {*} Returns the property value. 33657 */ 33658 function safeGet(object, key) { 33659 if (key === 'constructor' && typeof object[key] === 'function') { 33660 return; 33661 } 33662 33663 if (key == '__proto__') { 33664 return; 33665 } 33666 33667 return object[key]; 33668 } 33669 33670 /** 33671 * Sets metadata for `func`. 33672 * 33673 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short 33674 * period of time, it will trip its breaker and transition to an identity 33675 * function to avoid garbage collection pauses in V8. See 33676 * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) 33677 * for more details. 33678 * 33679 * @private 33680 * @param {Function} func The function to associate metadata with. 33681 * @param {*} data The metadata. 33682 * @returns {Function} Returns `func`. 33683 */ 33684 var setData = shortOut(baseSetData); 33685 33686 /** 33687 * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). 33688 * 33689 * @private 33690 * @param {Function} func The function to delay. 33691 * @param {number} wait The number of milliseconds to delay invocation. 33692 * @returns {number|Object} Returns the timer id or timeout object. 33693 */ 33694 var setTimeout = ctxSetTimeout || function(func, wait) { 33695 return root.setTimeout(func, wait); 33696 }; 33697 33698 /** 33699 * Sets the `toString` method of `func` to return `string`. 33700 * 33701 * @private 33702 * @param {Function} func The function to modify. 33703 * @param {Function} string The `toString` result. 33704 * @returns {Function} Returns `func`. 33705 */ 33706 var setToString = shortOut(baseSetToString); 33707 33708 /** 33709 * Sets the `toString` method of `wrapper` to mimic the source of `reference` 33710 * with wrapper details in a comment at the top of the source body. 33711 * 33712 * @private 33713 * @param {Function} wrapper The function to modify. 33714 * @param {Function} reference The reference function. 33715 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. 33716 * @returns {Function} Returns `wrapper`. 33717 */ 33718 function setWrapToString(wrapper, reference, bitmask) { 33719 var source = (reference + ''); 33720 return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); 33721 } 33722 33723 /** 33724 * Creates a function that'll short out and invoke `identity` instead 33725 * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` 33726 * milliseconds. 33727 * 33728 * @private 33729 * @param {Function} func The function to restrict. 33730 * @returns {Function} Returns the new shortable function. 33731 */ 33732 function shortOut(func) { 33733 var count = 0, 33734 lastCalled = 0; 33735 33736 return function() { 33737 var stamp = nativeNow(), 33738 remaining = HOT_SPAN - (stamp - lastCalled); 33739 33740 lastCalled = stamp; 33741 if (remaining > 0) { 33742 if (++count >= HOT_COUNT) { 33743 return arguments[0]; 33744 } 33745 } else { 33746 count = 0; 33747 } 33748 return func.apply(undefined, arguments); 33749 }; 33750 } 33751 33752 /** 33753 * A specialized version of `_.shuffle` which mutates and sets the size of `array`. 33754 * 33755 * @private 33756 * @param {Array} array The array to shuffle. 33757 * @param {number} [size=array.length] The size of `array`. 33758 * @returns {Array} Returns `array`. 33759 */ 33760 function shuffleSelf(array, size) { 33761 var index = -1, 33762 length = array.length, 33763 lastIndex = length - 1; 33764 33765 size = size === undefined ? length : size; 33766 while (++index < size) { 33767 var rand = baseRandom(index, lastIndex), 33768 value = array[rand]; 33769 33770 array[rand] = array[index]; 33771 array[index] = value; 33772 } 33773 array.length = size; 33774 return array; 33775 } 33776 33777 /** 33778 * Converts `string` to a property path array. 33779 * 33780 * @private 33781 * @param {string} string The string to convert. 33782 * @returns {Array} Returns the property path array. 33783 */ 33784 var stringToPath = memoizeCapped(function(string) { 33785 var result = []; 33786 if (string.charCodeAt(0) === 46 /* . */) { 33787 result.push(''); 33788 } 33789 string.replace(rePropName, function(match, number, quote, subString) { 33790 result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); 33791 }); 33792 return result; 33793 }); 33794 33795 /** 33796 * Converts `value` to a string key if it's not a string or symbol. 33797 * 33798 * @private 33799 * @param {*} value The value to inspect. 33800 * @returns {string|symbol} Returns the key. 33801 */ 33802 function toKey(value) { 33803 if (typeof value == 'string' || isSymbol(value)) { 33804 return value; 33805 } 33806 var result = (value + ''); 33807 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; 33808 } 33809 33810 /** 33811 * Converts `func` to its source code. 33812 * 33813 * @private 33814 * @param {Function} func The function to convert. 33815 * @returns {string} Returns the source code. 33816 */ 33817 function toSource(func) { 33818 if (func != null) { 33819 try { 33820 return funcToString.call(func); 33821 } catch (e) {} 33822 try { 33823 return (func + ''); 33824 } catch (e) {} 33825 } 33826 return ''; 33827 } 33828 33829 /** 33830 * Updates wrapper `details` based on `bitmask` flags. 33831 * 33832 * @private 33833 * @returns {Array} details The details to modify. 33834 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. 33835 * @returns {Array} Returns `details`. 33836 */ 33837 function updateWrapDetails(details, bitmask) { 33838 arrayEach(wrapFlags, function(pair) { 33839 var value = '_.' + pair[0]; 33840 if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { 33841 details.push(value); 33842 } 33843 }); 33844 return details.sort(); 33845 } 33846 33847 /** 33848 * Creates a clone of `wrapper`. 33849 * 33850 * @private 33851 * @param {Object} wrapper The wrapper to clone. 33852 * @returns {Object} Returns the cloned wrapper. 33853 */ 33854 function wrapperClone(wrapper) { 33855 if (wrapper instanceof LazyWrapper) { 33856 return wrapper.clone(); 33857 } 33858 var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); 33859 result.__actions__ = copyArray(wrapper.__actions__); 33860 result.__index__ = wrapper.__index__; 33861 result.__values__ = wrapper.__values__; 33862 return result; 33863 } 33864 33865 /*------------------------------------------------------------------------*/ 33866 33867 /** 33868 * Creates an array of elements split into groups the length of `size`. 33869 * If `array` can't be split evenly, the final chunk will be the remaining 33870 * elements. 33871 * 33872 * @static 33873 * @memberOf _ 33874 * @since 3.0.0 33875 * @category Array 33876 * @param {Array} array The array to process. 33877 * @param {number} [size=1] The length of each chunk 33878 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 33879 * @returns {Array} Returns the new array of chunks. 33880 * @example 33881 * 33882 * _.chunk(['a', 'b', 'c', 'd'], 2); 33883 * // => [['a', 'b'], ['c', 'd']] 33884 * 33885 * _.chunk(['a', 'b', 'c', 'd'], 3); 33886 * // => [['a', 'b', 'c'], ['d']] 33887 */ 33888 function chunk(array, size, guard) { 33889 if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { 33890 size = 1; 33891 } else { 33892 size = nativeMax(toInteger(size), 0); 33893 } 33894 var length = array == null ? 0 : array.length; 33895 if (!length || size < 1) { 33896 return []; 33897 } 33898 var index = 0, 33899 resIndex = 0, 33900 result = Array(nativeCeil(length / size)); 33901 33902 while (index < length) { 33903 result[resIndex++] = baseSlice(array, index, (index += size)); 33904 } 33905 return result; 33906 } 33907 33908 /** 33909 * Creates an array with all falsey values removed. The values `false`, `null`, 33910 * `0`, `""`, `undefined`, and `NaN` are falsey. 33911 * 33912 * @static 33913 * @memberOf _ 33914 * @since 0.1.0 33915 * @category Array 33916 * @param {Array} array The array to compact. 33917 * @returns {Array} Returns the new array of filtered values. 33918 * @example 33919 * 33920 * _.compact([0, 1, false, 2, '', 3]); 33921 * // => [1, 2, 3] 33922 */ 33923 function compact(array) { 33924 var index = -1, 33925 length = array == null ? 0 : array.length, 33926 resIndex = 0, 33927 result = []; 33928 33929 while (++index < length) { 33930 var value = array[index]; 33931 if (value) { 33932 result[resIndex++] = value; 33933 } 33934 } 33935 return result; 33936 } 33937 33938 /** 33939 * Creates a new array concatenating `array` with any additional arrays 33940 * and/or values. 33941 * 33942 * @static 33943 * @memberOf _ 33944 * @since 4.0.0 33945 * @category Array 33946 * @param {Array} array The array to concatenate. 33947 * @param {...*} [values] The values to concatenate. 33948 * @returns {Array} Returns the new concatenated array. 33949 * @example 33950 * 33951 * var array = [1]; 33952 * var other = _.concat(array, 2, [3], [[4]]); 33953 * 33954 * console.log(other); 33955 * // => [1, 2, 3, [4]] 33956 * 33957 * console.log(array); 33958 * // => [1] 33959 */ 33960 function concat() { 33961 var length = arguments.length; 33962 if (!length) { 33963 return []; 33964 } 33965 var args = Array(length - 1), 33966 array = arguments[0], 33967 index = length; 33968 33969 while (index--) { 33970 args[index - 1] = arguments[index]; 33971 } 33972 return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); 33973 } 33974 33975 /** 33976 * Creates an array of `array` values not included in the other given arrays 33977 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 33978 * for equality comparisons. The order and references of result values are 33979 * determined by the first array. 33980 * 33981 * **Note:** Unlike `_.pullAll`, this method returns a new array. 33982 * 33983 * @static 33984 * @memberOf _ 33985 * @since 0.1.0 33986 * @category Array 33987 * @param {Array} array The array to inspect. 33988 * @param {...Array} [values] The values to exclude. 33989 * @returns {Array} Returns the new array of filtered values. 33990 * @see _.without, _.xor 33991 * @example 33992 * 33993 * _.difference([2, 1], [2, 3]); 33994 * // => [1] 33995 */ 33996 var difference = baseRest(function(array, values) { 33997 return isArrayLikeObject(array) 33998 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) 33999 : []; 34000 }); 34001 34002 /** 34003 * This method is like `_.difference` except that it accepts `iteratee` which 34004 * is invoked for each element of `array` and `values` to generate the criterion 34005 * by which they're compared. The order and references of result values are 34006 * determined by the first array. The iteratee is invoked with one argument: 34007 * (value). 34008 * 34009 * **Note:** Unlike `_.pullAllBy`, this method returns a new array. 34010 * 34011 * @static 34012 * @memberOf _ 34013 * @since 4.0.0 34014 * @category Array 34015 * @param {Array} array The array to inspect. 34016 * @param {...Array} [values] The values to exclude. 34017 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 34018 * @returns {Array} Returns the new array of filtered values. 34019 * @example 34020 * 34021 * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); 34022 * // => [1.2] 34023 * 34024 * // The `_.property` iteratee shorthand. 34025 * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); 34026 * // => [{ 'x': 2 }] 34027 */ 34028 var differenceBy = baseRest(function(array, values) { 34029 var iteratee = last(values); 34030 if (isArrayLikeObject(iteratee)) { 34031 iteratee = undefined; 34032 } 34033 return isArrayLikeObject(array) 34034 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) 34035 : []; 34036 }); 34037 34038 /** 34039 * This method is like `_.difference` except that it accepts `comparator` 34040 * which is invoked to compare elements of `array` to `values`. The order and 34041 * references of result values are determined by the first array. The comparator 34042 * is invoked with two arguments: (arrVal, othVal). 34043 * 34044 * **Note:** Unlike `_.pullAllWith`, this method returns a new array. 34045 * 34046 * @static 34047 * @memberOf _ 34048 * @since 4.0.0 34049 * @category Array 34050 * @param {Array} array The array to inspect. 34051 * @param {...Array} [values] The values to exclude. 34052 * @param {Function} [comparator] The comparator invoked per element. 34053 * @returns {Array} Returns the new array of filtered values. 34054 * @example 34055 * 34056 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; 34057 * 34058 * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); 34059 * // => [{ 'x': 2, 'y': 1 }] 34060 */ 34061 var differenceWith = baseRest(function(array, values) { 34062 var comparator = last(values); 34063 if (isArrayLikeObject(comparator)) { 34064 comparator = undefined; 34065 } 34066 return isArrayLikeObject(array) 34067 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) 34068 : []; 34069 }); 34070 34071 /** 34072 * Creates a slice of `array` with `n` elements dropped from the beginning. 34073 * 34074 * @static 34075 * @memberOf _ 34076 * @since 0.5.0 34077 * @category Array 34078 * @param {Array} array The array to query. 34079 * @param {number} [n=1] The number of elements to drop. 34080 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 34081 * @returns {Array} Returns the slice of `array`. 34082 * @example 34083 * 34084 * _.drop([1, 2, 3]); 34085 * // => [2, 3] 34086 * 34087 * _.drop([1, 2, 3], 2); 34088 * // => [3] 34089 * 34090 * _.drop([1, 2, 3], 5); 34091 * // => [] 34092 * 34093 * _.drop([1, 2, 3], 0); 34094 * // => [1, 2, 3] 34095 */ 34096 function drop(array, n, guard) { 34097 var length = array == null ? 0 : array.length; 34098 if (!length) { 34099 return []; 34100 } 34101 n = (guard || n === undefined) ? 1 : toInteger(n); 34102 return baseSlice(array, n < 0 ? 0 : n, length); 34103 } 34104 34105 /** 34106 * Creates a slice of `array` with `n` elements dropped from the end. 34107 * 34108 * @static 34109 * @memberOf _ 34110 * @since 3.0.0 34111 * @category Array 34112 * @param {Array} array The array to query. 34113 * @param {number} [n=1] The number of elements to drop. 34114 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 34115 * @returns {Array} Returns the slice of `array`. 34116 * @example 34117 * 34118 * _.dropRight([1, 2, 3]); 34119 * // => [1, 2] 34120 * 34121 * _.dropRight([1, 2, 3], 2); 34122 * // => [1] 34123 * 34124 * _.dropRight([1, 2, 3], 5); 34125 * // => [] 34126 * 34127 * _.dropRight([1, 2, 3], 0); 34128 * // => [1, 2, 3] 34129 */ 34130 function dropRight(array, n, guard) { 34131 var length = array == null ? 0 : array.length; 34132 if (!length) { 34133 return []; 34134 } 34135 n = (guard || n === undefined) ? 1 : toInteger(n); 34136 n = length - n; 34137 return baseSlice(array, 0, n < 0 ? 0 : n); 34138 } 34139 34140 /** 34141 * Creates a slice of `array` excluding elements dropped from the end. 34142 * Elements are dropped until `predicate` returns falsey. The predicate is 34143 * invoked with three arguments: (value, index, array). 34144 * 34145 * @static 34146 * @memberOf _ 34147 * @since 3.0.0 34148 * @category Array 34149 * @param {Array} array The array to query. 34150 * @param {Function} [predicate=_.identity] The function invoked per iteration. 34151 * @returns {Array} Returns the slice of `array`. 34152 * @example 34153 * 34154 * var users = [ 34155 * { 'user': 'barney', 'active': true }, 34156 * { 'user': 'fred', 'active': false }, 34157 * { 'user': 'pebbles', 'active': false } 34158 * ]; 34159 * 34160 * _.dropRightWhile(users, function(o) { return !o.active; }); 34161 * // => objects for ['barney'] 34162 * 34163 * // The `_.matches` iteratee shorthand. 34164 * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); 34165 * // => objects for ['barney', 'fred'] 34166 * 34167 * // The `_.matchesProperty` iteratee shorthand. 34168 * _.dropRightWhile(users, ['active', false]); 34169 * // => objects for ['barney'] 34170 * 34171 * // The `_.property` iteratee shorthand. 34172 * _.dropRightWhile(users, 'active'); 34173 * // => objects for ['barney', 'fred', 'pebbles'] 34174 */ 34175 function dropRightWhile(array, predicate) { 34176 return (array && array.length) 34177 ? baseWhile(array, getIteratee(predicate, 3), true, true) 34178 : []; 34179 } 34180 34181 /** 34182 * Creates a slice of `array` excluding elements dropped from the beginning. 34183 * Elements are dropped until `predicate` returns falsey. The predicate is 34184 * invoked with three arguments: (value, index, array). 34185 * 34186 * @static 34187 * @memberOf _ 34188 * @since 3.0.0 34189 * @category Array 34190 * @param {Array} array The array to query. 34191 * @param {Function} [predicate=_.identity] The function invoked per iteration. 34192 * @returns {Array} Returns the slice of `array`. 34193 * @example 34194 * 34195 * var users = [ 34196 * { 'user': 'barney', 'active': false }, 34197 * { 'user': 'fred', 'active': false }, 34198 * { 'user': 'pebbles', 'active': true } 34199 * ]; 34200 * 34201 * _.dropWhile(users, function(o) { return !o.active; }); 34202 * // => objects for ['pebbles'] 34203 * 34204 * // The `_.matches` iteratee shorthand. 34205 * _.dropWhile(users, { 'user': 'barney', 'active': false }); 34206 * // => objects for ['fred', 'pebbles'] 34207 * 34208 * // The `_.matchesProperty` iteratee shorthand. 34209 * _.dropWhile(users, ['active', false]); 34210 * // => objects for ['pebbles'] 34211 * 34212 * // The `_.property` iteratee shorthand. 34213 * _.dropWhile(users, 'active'); 34214 * // => objects for ['barney', 'fred', 'pebbles'] 34215 */ 34216 function dropWhile(array, predicate) { 34217 return (array && array.length) 34218 ? baseWhile(array, getIteratee(predicate, 3), true) 34219 : []; 34220 } 34221 34222 /** 34223 * Fills elements of `array` with `value` from `start` up to, but not 34224 * including, `end`. 34225 * 34226 * **Note:** This method mutates `array`. 34227 * 34228 * @static 34229 * @memberOf _ 34230 * @since 3.2.0 34231 * @category Array 34232 * @param {Array} array The array to fill. 34233 * @param {*} value The value to fill `array` with. 34234 * @param {number} [start=0] The start position. 34235 * @param {number} [end=array.length] The end position. 34236 * @returns {Array} Returns `array`. 34237 * @example 34238 * 34239 * var array = [1, 2, 3]; 34240 * 34241 * _.fill(array, 'a'); 34242 * console.log(array); 34243 * // => ['a', 'a', 'a'] 34244 * 34245 * _.fill(Array(3), 2); 34246 * // => [2, 2, 2] 34247 * 34248 * _.fill([4, 6, 8, 10], '*', 1, 3); 34249 * // => [4, '*', '*', 10] 34250 */ 34251 function fill(array, value, start, end) { 34252 var length = array == null ? 0 : array.length; 34253 if (!length) { 34254 return []; 34255 } 34256 if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { 34257 start = 0; 34258 end = length; 34259 } 34260 return baseFill(array, value, start, end); 34261 } 34262 34263 /** 34264 * This method is like `_.find` except that it returns the index of the first 34265 * element `predicate` returns truthy for instead of the element itself. 34266 * 34267 * @static 34268 * @memberOf _ 34269 * @since 1.1.0 34270 * @category Array 34271 * @param {Array} array The array to inspect. 34272 * @param {Function} [predicate=_.identity] The function invoked per iteration. 34273 * @param {number} [fromIndex=0] The index to search from. 34274 * @returns {number} Returns the index of the found element, else `-1`. 34275 * @example 34276 * 34277 * var users = [ 34278 * { 'user': 'barney', 'active': false }, 34279 * { 'user': 'fred', 'active': false }, 34280 * { 'user': 'pebbles', 'active': true } 34281 * ]; 34282 * 34283 * _.findIndex(users, function(o) { return o.user == 'barney'; }); 34284 * // => 0 34285 * 34286 * // The `_.matches` iteratee shorthand. 34287 * _.findIndex(users, { 'user': 'fred', 'active': false }); 34288 * // => 1 34289 * 34290 * // The `_.matchesProperty` iteratee shorthand. 34291 * _.findIndex(users, ['active', false]); 34292 * // => 0 34293 * 34294 * // The `_.property` iteratee shorthand. 34295 * _.findIndex(users, 'active'); 34296 * // => 2 34297 */ 34298 function findIndex(array, predicate, fromIndex) { 34299 var length = array == null ? 0 : array.length; 34300 if (!length) { 34301 return -1; 34302 } 34303 var index = fromIndex == null ? 0 : toInteger(fromIndex); 34304 if (index < 0) { 34305 index = nativeMax(length + index, 0); 34306 } 34307 return baseFindIndex(array, getIteratee(predicate, 3), index); 34308 } 34309 34310 /** 34311 * This method is like `_.findIndex` except that it iterates over elements 34312 * of `collection` from right to left. 34313 * 34314 * @static 34315 * @memberOf _ 34316 * @since 2.0.0 34317 * @category Array 34318 * @param {Array} array The array to inspect. 34319 * @param {Function} [predicate=_.identity] The function invoked per iteration. 34320 * @param {number} [fromIndex=array.length-1] The index to search from. 34321 * @returns {number} Returns the index of the found element, else `-1`. 34322 * @example 34323 * 34324 * var users = [ 34325 * { 'user': 'barney', 'active': true }, 34326 * { 'user': 'fred', 'active': false }, 34327 * { 'user': 'pebbles', 'active': false } 34328 * ]; 34329 * 34330 * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); 34331 * // => 2 34332 * 34333 * // The `_.matches` iteratee shorthand. 34334 * _.findLastIndex(users, { 'user': 'barney', 'active': true }); 34335 * // => 0 34336 * 34337 * // The `_.matchesProperty` iteratee shorthand. 34338 * _.findLastIndex(users, ['active', false]); 34339 * // => 2 34340 * 34341 * // The `_.property` iteratee shorthand. 34342 * _.findLastIndex(users, 'active'); 34343 * // => 0 34344 */ 34345 function findLastIndex(array, predicate, fromIndex) { 34346 var length = array == null ? 0 : array.length; 34347 if (!length) { 34348 return -1; 34349 } 34350 var index = length - 1; 34351 if (fromIndex !== undefined) { 34352 index = toInteger(fromIndex); 34353 index = fromIndex < 0 34354 ? nativeMax(length + index, 0) 34355 : nativeMin(index, length - 1); 34356 } 34357 return baseFindIndex(array, getIteratee(predicate, 3), index, true); 34358 } 34359 34360 /** 34361 * Flattens `array` a single level deep. 34362 * 34363 * @static 34364 * @memberOf _ 34365 * @since 0.1.0 34366 * @category Array 34367 * @param {Array} array The array to flatten. 34368 * @returns {Array} Returns the new flattened array. 34369 * @example 34370 * 34371 * _.flatten([1, [2, [3, [4]], 5]]); 34372 * // => [1, 2, [3, [4]], 5] 34373 */ 34374 function flatten(array) { 34375 var length = array == null ? 0 : array.length; 34376 return length ? baseFlatten(array, 1) : []; 34377 } 34378 34379 /** 34380 * Recursively flattens `array`. 34381 * 34382 * @static 34383 * @memberOf _ 34384 * @since 3.0.0 34385 * @category Array 34386 * @param {Array} array The array to flatten. 34387 * @returns {Array} Returns the new flattened array. 34388 * @example 34389 * 34390 * _.flattenDeep([1, [2, [3, [4]], 5]]); 34391 * // => [1, 2, 3, 4, 5] 34392 */ 34393 function flattenDeep(array) { 34394 var length = array == null ? 0 : array.length; 34395 return length ? baseFlatten(array, INFINITY) : []; 34396 } 34397 34398 /** 34399 * Recursively flatten `array` up to `depth` times. 34400 * 34401 * @static 34402 * @memberOf _ 34403 * @since 4.4.0 34404 * @category Array 34405 * @param {Array} array The array to flatten. 34406 * @param {number} [depth=1] The maximum recursion depth. 34407 * @returns {Array} Returns the new flattened array. 34408 * @example 34409 * 34410 * var array = [1, [2, [3, [4]], 5]]; 34411 * 34412 * _.flattenDepth(array, 1); 34413 * // => [1, 2, [3, [4]], 5] 34414 * 34415 * _.flattenDepth(array, 2); 34416 * // => [1, 2, 3, [4], 5] 34417 */ 34418 function flattenDepth(array, depth) { 34419 var length = array == null ? 0 : array.length; 34420 if (!length) { 34421 return []; 34422 } 34423 depth = depth === undefined ? 1 : toInteger(depth); 34424 return baseFlatten(array, depth); 34425 } 34426 34427 /** 34428 * The inverse of `_.toPairs`; this method returns an object composed 34429 * from key-value `pairs`. 34430 * 34431 * @static 34432 * @memberOf _ 34433 * @since 4.0.0 34434 * @category Array 34435 * @param {Array} pairs The key-value pairs. 34436 * @returns {Object} Returns the new object. 34437 * @example 34438 * 34439 * _.fromPairs([['a', 1], ['b', 2]]); 34440 * // => { 'a': 1, 'b': 2 } 34441 */ 34442 function fromPairs(pairs) { 34443 var index = -1, 34444 length = pairs == null ? 0 : pairs.length, 34445 result = {}; 34446 34447 while (++index < length) { 34448 var pair = pairs[index]; 34449 result[pair[0]] = pair[1]; 34450 } 34451 return result; 34452 } 34453 34454 /** 34455 * Gets the first element of `array`. 34456 * 34457 * @static 34458 * @memberOf _ 34459 * @since 0.1.0 34460 * @alias first 34461 * @category Array 34462 * @param {Array} array The array to query. 34463 * @returns {*} Returns the first element of `array`. 34464 * @example 34465 * 34466 * _.head([1, 2, 3]); 34467 * // => 1 34468 * 34469 * _.head([]); 34470 * // => undefined 34471 */ 34472 function head(array) { 34473 return (array && array.length) ? array[0] : undefined; 34474 } 34475 34476 /** 34477 * Gets the index at which the first occurrence of `value` is found in `array` 34478 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 34479 * for equality comparisons. If `fromIndex` is negative, it's used as the 34480 * offset from the end of `array`. 34481 * 34482 * @static 34483 * @memberOf _ 34484 * @since 0.1.0 34485 * @category Array 34486 * @param {Array} array The array to inspect. 34487 * @param {*} value The value to search for. 34488 * @param {number} [fromIndex=0] The index to search from. 34489 * @returns {number} Returns the index of the matched value, else `-1`. 34490 * @example 34491 * 34492 * _.indexOf([1, 2, 1, 2], 2); 34493 * // => 1 34494 * 34495 * // Search from the `fromIndex`. 34496 * _.indexOf([1, 2, 1, 2], 2, 2); 34497 * // => 3 34498 */ 34499 function indexOf(array, value, fromIndex) { 34500 var length = array == null ? 0 : array.length; 34501 if (!length) { 34502 return -1; 34503 } 34504 var index = fromIndex == null ? 0 : toInteger(fromIndex); 34505 if (index < 0) { 34506 index = nativeMax(length + index, 0); 34507 } 34508 return baseIndexOf(array, value, index); 34509 } 34510 34511 /** 34512 * Gets all but the last element of `array`. 34513 * 34514 * @static 34515 * @memberOf _ 34516 * @since 0.1.0 34517 * @category Array 34518 * @param {Array} array The array to query. 34519 * @returns {Array} Returns the slice of `array`. 34520 * @example 34521 * 34522 * _.initial([1, 2, 3]); 34523 * // => [1, 2] 34524 */ 34525 function initial(array) { 34526 var length = array == null ? 0 : array.length; 34527 return length ? baseSlice(array, 0, -1) : []; 34528 } 34529 34530 /** 34531 * Creates an array of unique values that are included in all given arrays 34532 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 34533 * for equality comparisons. The order and references of result values are 34534 * determined by the first array. 34535 * 34536 * @static 34537 * @memberOf _ 34538 * @since 0.1.0 34539 * @category Array 34540 * @param {...Array} [arrays] The arrays to inspect. 34541 * @returns {Array} Returns the new array of intersecting values. 34542 * @example 34543 * 34544 * _.intersection([2, 1], [2, 3]); 34545 * // => [2] 34546 */ 34547 var intersection = baseRest(function(arrays) { 34548 var mapped = arrayMap(arrays, castArrayLikeObject); 34549 return (mapped.length && mapped[0] === arrays[0]) 34550 ? baseIntersection(mapped) 34551 : []; 34552 }); 34553 34554 /** 34555 * This method is like `_.intersection` except that it accepts `iteratee` 34556 * which is invoked for each element of each `arrays` to generate the criterion 34557 * by which they're compared. The order and references of result values are 34558 * determined by the first array. The iteratee is invoked with one argument: 34559 * (value). 34560 * 34561 * @static 34562 * @memberOf _ 34563 * @since 4.0.0 34564 * @category Array 34565 * @param {...Array} [arrays] The arrays to inspect. 34566 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 34567 * @returns {Array} Returns the new array of intersecting values. 34568 * @example 34569 * 34570 * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); 34571 * // => [2.1] 34572 * 34573 * // The `_.property` iteratee shorthand. 34574 * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); 34575 * // => [{ 'x': 1 }] 34576 */ 34577 var intersectionBy = baseRest(function(arrays) { 34578 var iteratee = last(arrays), 34579 mapped = arrayMap(arrays, castArrayLikeObject); 34580 34581 if (iteratee === last(mapped)) { 34582 iteratee = undefined; 34583 } else { 34584 mapped.pop(); 34585 } 34586 return (mapped.length && mapped[0] === arrays[0]) 34587 ? baseIntersection(mapped, getIteratee(iteratee, 2)) 34588 : []; 34589 }); 34590 34591 /** 34592 * This method is like `_.intersection` except that it accepts `comparator` 34593 * which is invoked to compare elements of `arrays`. The order and references 34594 * of result values are determined by the first array. The comparator is 34595 * invoked with two arguments: (arrVal, othVal). 34596 * 34597 * @static 34598 * @memberOf _ 34599 * @since 4.0.0 34600 * @category Array 34601 * @param {...Array} [arrays] The arrays to inspect. 34602 * @param {Function} [comparator] The comparator invoked per element. 34603 * @returns {Array} Returns the new array of intersecting values. 34604 * @example 34605 * 34606 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; 34607 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; 34608 * 34609 * _.intersectionWith(objects, others, _.isEqual); 34610 * // => [{ 'x': 1, 'y': 2 }] 34611 */ 34612 var intersectionWith = baseRest(function(arrays) { 34613 var comparator = last(arrays), 34614 mapped = arrayMap(arrays, castArrayLikeObject); 34615 34616 comparator = typeof comparator == 'function' ? comparator : undefined; 34617 if (comparator) { 34618 mapped.pop(); 34619 } 34620 return (mapped.length && mapped[0] === arrays[0]) 34621 ? baseIntersection(mapped, undefined, comparator) 34622 : []; 34623 }); 34624 34625 /** 34626 * Converts all elements in `array` into a string separated by `separator`. 34627 * 34628 * @static 34629 * @memberOf _ 34630 * @since 4.0.0 34631 * @category Array 34632 * @param {Array} array The array to convert. 34633 * @param {string} [separator=','] The element separator. 34634 * @returns {string} Returns the joined string. 34635 * @example 34636 * 34637 * _.join(['a', 'b', 'c'], '~'); 34638 * // => 'a~b~c' 34639 */ 34640 function join(array, separator) { 34641 return array == null ? '' : nativeJoin.call(array, separator); 34642 } 34643 34644 /** 34645 * Gets the last element of `array`. 34646 * 34647 * @static 34648 * @memberOf _ 34649 * @since 0.1.0 34650 * @category Array 34651 * @param {Array} array The array to query. 34652 * @returns {*} Returns the last element of `array`. 34653 * @example 34654 * 34655 * _.last([1, 2, 3]); 34656 * // => 3 34657 */ 34658 function last(array) { 34659 var length = array == null ? 0 : array.length; 34660 return length ? array[length - 1] : undefined; 34661 } 34662 34663 /** 34664 * This method is like `_.indexOf` except that it iterates over elements of 34665 * `array` from right to left. 34666 * 34667 * @static 34668 * @memberOf _ 34669 * @since 0.1.0 34670 * @category Array 34671 * @param {Array} array The array to inspect. 34672 * @param {*} value The value to search for. 34673 * @param {number} [fromIndex=array.length-1] The index to search from. 34674 * @returns {number} Returns the index of the matched value, else `-1`. 34675 * @example 34676 * 34677 * _.lastIndexOf([1, 2, 1, 2], 2); 34678 * // => 3 34679 * 34680 * // Search from the `fromIndex`. 34681 * _.lastIndexOf([1, 2, 1, 2], 2, 2); 34682 * // => 1 34683 */ 34684 function lastIndexOf(array, value, fromIndex) { 34685 var length = array == null ? 0 : array.length; 34686 if (!length) { 34687 return -1; 34688 } 34689 var index = length; 34690 if (fromIndex !== undefined) { 34691 index = toInteger(fromIndex); 34692 index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); 34693 } 34694 return value === value 34695 ? strictLastIndexOf(array, value, index) 34696 : baseFindIndex(array, baseIsNaN, index, true); 34697 } 34698 34699 /** 34700 * Gets the element at index `n` of `array`. If `n` is negative, the nth 34701 * element from the end is returned. 34702 * 34703 * @static 34704 * @memberOf _ 34705 * @since 4.11.0 34706 * @category Array 34707 * @param {Array} array The array to query. 34708 * @param {number} [n=0] The index of the element to return. 34709 * @returns {*} Returns the nth element of `array`. 34710 * @example 34711 * 34712 * var array = ['a', 'b', 'c', 'd']; 34713 * 34714 * _.nth(array, 1); 34715 * // => 'b' 34716 * 34717 * _.nth(array, -2); 34718 * // => 'c'; 34719 */ 34720 function nth(array, n) { 34721 return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; 34722 } 34723 34724 /** 34725 * Removes all given values from `array` using 34726 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 34727 * for equality comparisons. 34728 * 34729 * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` 34730 * to remove elements from an array by predicate. 34731 * 34732 * @static 34733 * @memberOf _ 34734 * @since 2.0.0 34735 * @category Array 34736 * @param {Array} array The array to modify. 34737 * @param {...*} [values] The values to remove. 34738 * @returns {Array} Returns `array`. 34739 * @example 34740 * 34741 * var array = ['a', 'b', 'c', 'a', 'b', 'c']; 34742 * 34743 * _.pull(array, 'a', 'c'); 34744 * console.log(array); 34745 * // => ['b', 'b'] 34746 */ 34747 var pull = baseRest(pullAll); 34748 34749 /** 34750 * This method is like `_.pull` except that it accepts an array of values to remove. 34751 * 34752 * **Note:** Unlike `_.difference`, this method mutates `array`. 34753 * 34754 * @static 34755 * @memberOf _ 34756 * @since 4.0.0 34757 * @category Array 34758 * @param {Array} array The array to modify. 34759 * @param {Array} values The values to remove. 34760 * @returns {Array} Returns `array`. 34761 * @example 34762 * 34763 * var array = ['a', 'b', 'c', 'a', 'b', 'c']; 34764 * 34765 * _.pullAll(array, ['a', 'c']); 34766 * console.log(array); 34767 * // => ['b', 'b'] 34768 */ 34769 function pullAll(array, values) { 34770 return (array && array.length && values && values.length) 34771 ? basePullAll(array, values) 34772 : array; 34773 } 34774 34775 /** 34776 * This method is like `_.pullAll` except that it accepts `iteratee` which is 34777 * invoked for each element of `array` and `values` to generate the criterion 34778 * by which they're compared. The iteratee is invoked with one argument: (value). 34779 * 34780 * **Note:** Unlike `_.differenceBy`, this method mutates `array`. 34781 * 34782 * @static 34783 * @memberOf _ 34784 * @since 4.0.0 34785 * @category Array 34786 * @param {Array} array The array to modify. 34787 * @param {Array} values The values to remove. 34788 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 34789 * @returns {Array} Returns `array`. 34790 * @example 34791 * 34792 * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; 34793 * 34794 * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); 34795 * console.log(array); 34796 * // => [{ 'x': 2 }] 34797 */ 34798 function pullAllBy(array, values, iteratee) { 34799 return (array && array.length && values && values.length) 34800 ? basePullAll(array, values, getIteratee(iteratee, 2)) 34801 : array; 34802 } 34803 34804 /** 34805 * This method is like `_.pullAll` except that it accepts `comparator` which 34806 * is invoked to compare elements of `array` to `values`. The comparator is 34807 * invoked with two arguments: (arrVal, othVal). 34808 * 34809 * **Note:** Unlike `_.differenceWith`, this method mutates `array`. 34810 * 34811 * @static 34812 * @memberOf _ 34813 * @since 4.6.0 34814 * @category Array 34815 * @param {Array} array The array to modify. 34816 * @param {Array} values The values to remove. 34817 * @param {Function} [comparator] The comparator invoked per element. 34818 * @returns {Array} Returns `array`. 34819 * @example 34820 * 34821 * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; 34822 * 34823 * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); 34824 * console.log(array); 34825 * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] 34826 */ 34827 function pullAllWith(array, values, comparator) { 34828 return (array && array.length && values && values.length) 34829 ? basePullAll(array, values, undefined, comparator) 34830 : array; 34831 } 34832 34833 /** 34834 * Removes elements from `array` corresponding to `indexes` and returns an 34835 * array of removed elements. 34836 * 34837 * **Note:** Unlike `_.at`, this method mutates `array`. 34838 * 34839 * @static 34840 * @memberOf _ 34841 * @since 3.0.0 34842 * @category Array 34843 * @param {Array} array The array to modify. 34844 * @param {...(number|number[])} [indexes] The indexes of elements to remove. 34845 * @returns {Array} Returns the new array of removed elements. 34846 * @example 34847 * 34848 * var array = ['a', 'b', 'c', 'd']; 34849 * var pulled = _.pullAt(array, [1, 3]); 34850 * 34851 * console.log(array); 34852 * // => ['a', 'c'] 34853 * 34854 * console.log(pulled); 34855 * // => ['b', 'd'] 34856 */ 34857 var pullAt = flatRest(function(array, indexes) { 34858 var length = array == null ? 0 : array.length, 34859 result = baseAt(array, indexes); 34860 34861 basePullAt(array, arrayMap(indexes, function(index) { 34862 return isIndex(index, length) ? +index : index; 34863 }).sort(compareAscending)); 34864 34865 return result; 34866 }); 34867 34868 /** 34869 * Removes all elements from `array` that `predicate` returns truthy for 34870 * and returns an array of the removed elements. The predicate is invoked 34871 * with three arguments: (value, index, array). 34872 * 34873 * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` 34874 * to pull elements from an array by value. 34875 * 34876 * @static 34877 * @memberOf _ 34878 * @since 2.0.0 34879 * @category Array 34880 * @param {Array} array The array to modify. 34881 * @param {Function} [predicate=_.identity] The function invoked per iteration. 34882 * @returns {Array} Returns the new array of removed elements. 34883 * @example 34884 * 34885 * var array = [1, 2, 3, 4]; 34886 * var evens = _.remove(array, function(n) { 34887 * return n % 2 == 0; 34888 * }); 34889 * 34890 * console.log(array); 34891 * // => [1, 3] 34892 * 34893 * console.log(evens); 34894 * // => [2, 4] 34895 */ 34896 function remove(array, predicate) { 34897 var result = []; 34898 if (!(array && array.length)) { 34899 return result; 34900 } 34901 var index = -1, 34902 indexes = [], 34903 length = array.length; 34904 34905 predicate = getIteratee(predicate, 3); 34906 while (++index < length) { 34907 var value = array[index]; 34908 if (predicate(value, index, array)) { 34909 result.push(value); 34910 indexes.push(index); 34911 } 34912 } 34913 basePullAt(array, indexes); 34914 return result; 34915 } 34916 34917 /** 34918 * Reverses `array` so that the first element becomes the last, the second 34919 * element becomes the second to last, and so on. 34920 * 34921 * **Note:** This method mutates `array` and is based on 34922 * [`Array#reverse`](https://mdn.io/Array/reverse). 34923 * 34924 * @static 34925 * @memberOf _ 34926 * @since 4.0.0 34927 * @category Array 34928 * @param {Array} array The array to modify. 34929 * @returns {Array} Returns `array`. 34930 * @example 34931 * 34932 * var array = [1, 2, 3]; 34933 * 34934 * _.reverse(array); 34935 * // => [3, 2, 1] 34936 * 34937 * console.log(array); 34938 * // => [3, 2, 1] 34939 */ 34940 function reverse(array) { 34941 return array == null ? array : nativeReverse.call(array); 34942 } 34943 34944 /** 34945 * Creates a slice of `array` from `start` up to, but not including, `end`. 34946 * 34947 * **Note:** This method is used instead of 34948 * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are 34949 * returned. 34950 * 34951 * @static 34952 * @memberOf _ 34953 * @since 3.0.0 34954 * @category Array 34955 * @param {Array} array The array to slice. 34956 * @param {number} [start=0] The start position. 34957 * @param {number} [end=array.length] The end position. 34958 * @returns {Array} Returns the slice of `array`. 34959 */ 34960 function slice(array, start, end) { 34961 var length = array == null ? 0 : array.length; 34962 if (!length) { 34963 return []; 34964 } 34965 if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { 34966 start = 0; 34967 end = length; 34968 } 34969 else { 34970 start = start == null ? 0 : toInteger(start); 34971 end = end === undefined ? length : toInteger(end); 34972 } 34973 return baseSlice(array, start, end); 34974 } 34975 34976 /** 34977 * Uses a binary search to determine the lowest index at which `value` 34978 * should be inserted into `array` in order to maintain its sort order. 34979 * 34980 * @static 34981 * @memberOf _ 34982 * @since 0.1.0 34983 * @category Array 34984 * @param {Array} array The sorted array to inspect. 34985 * @param {*} value The value to evaluate. 34986 * @returns {number} Returns the index at which `value` should be inserted 34987 * into `array`. 34988 * @example 34989 * 34990 * _.sortedIndex([30, 50], 40); 34991 * // => 1 34992 */ 34993 function sortedIndex(array, value) { 34994 return baseSortedIndex(array, value); 34995 } 34996 34997 /** 34998 * This method is like `_.sortedIndex` except that it accepts `iteratee` 34999 * which is invoked for `value` and each element of `array` to compute their 35000 * sort ranking. The iteratee is invoked with one argument: (value). 35001 * 35002 * @static 35003 * @memberOf _ 35004 * @since 4.0.0 35005 * @category Array 35006 * @param {Array} array The sorted array to inspect. 35007 * @param {*} value The value to evaluate. 35008 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 35009 * @returns {number} Returns the index at which `value` should be inserted 35010 * into `array`. 35011 * @example 35012 * 35013 * var objects = [{ 'x': 4 }, { 'x': 5 }]; 35014 * 35015 * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); 35016 * // => 0 35017 * 35018 * // The `_.property` iteratee shorthand. 35019 * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); 35020 * // => 0 35021 */ 35022 function sortedIndexBy(array, value, iteratee) { 35023 return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); 35024 } 35025 35026 /** 35027 * This method is like `_.indexOf` except that it performs a binary 35028 * search on a sorted `array`. 35029 * 35030 * @static 35031 * @memberOf _ 35032 * @since 4.0.0 35033 * @category Array 35034 * @param {Array} array The array to inspect. 35035 * @param {*} value The value to search for. 35036 * @returns {number} Returns the index of the matched value, else `-1`. 35037 * @example 35038 * 35039 * _.sortedIndexOf([4, 5, 5, 5, 6], 5); 35040 * // => 1 35041 */ 35042 function sortedIndexOf(array, value) { 35043 var length = array == null ? 0 : array.length; 35044 if (length) { 35045 var index = baseSortedIndex(array, value); 35046 if (index < length && eq(array[index], value)) { 35047 return index; 35048 } 35049 } 35050 return -1; 35051 } 35052 35053 /** 35054 * This method is like `_.sortedIndex` except that it returns the highest 35055 * index at which `value` should be inserted into `array` in order to 35056 * maintain its sort order. 35057 * 35058 * @static 35059 * @memberOf _ 35060 * @since 3.0.0 35061 * @category Array 35062 * @param {Array} array The sorted array to inspect. 35063 * @param {*} value The value to evaluate. 35064 * @returns {number} Returns the index at which `value` should be inserted 35065 * into `array`. 35066 * @example 35067 * 35068 * _.sortedLastIndex([4, 5, 5, 5, 6], 5); 35069 * // => 4 35070 */ 35071 function sortedLastIndex(array, value) { 35072 return baseSortedIndex(array, value, true); 35073 } 35074 35075 /** 35076 * This method is like `_.sortedLastIndex` except that it accepts `iteratee` 35077 * which is invoked for `value` and each element of `array` to compute their 35078 * sort ranking. The iteratee is invoked with one argument: (value). 35079 * 35080 * @static 35081 * @memberOf _ 35082 * @since 4.0.0 35083 * @category Array 35084 * @param {Array} array The sorted array to inspect. 35085 * @param {*} value The value to evaluate. 35086 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 35087 * @returns {number} Returns the index at which `value` should be inserted 35088 * into `array`. 35089 * @example 35090 * 35091 * var objects = [{ 'x': 4 }, { 'x': 5 }]; 35092 * 35093 * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); 35094 * // => 1 35095 * 35096 * // The `_.property` iteratee shorthand. 35097 * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); 35098 * // => 1 35099 */ 35100 function sortedLastIndexBy(array, value, iteratee) { 35101 return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); 35102 } 35103 35104 /** 35105 * This method is like `_.lastIndexOf` except that it performs a binary 35106 * search on a sorted `array`. 35107 * 35108 * @static 35109 * @memberOf _ 35110 * @since 4.0.0 35111 * @category Array 35112 * @param {Array} array The array to inspect. 35113 * @param {*} value The value to search for. 35114 * @returns {number} Returns the index of the matched value, else `-1`. 35115 * @example 35116 * 35117 * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); 35118 * // => 3 35119 */ 35120 function sortedLastIndexOf(array, value) { 35121 var length = array == null ? 0 : array.length; 35122 if (length) { 35123 var index = baseSortedIndex(array, value, true) - 1; 35124 if (eq(array[index], value)) { 35125 return index; 35126 } 35127 } 35128 return -1; 35129 } 35130 35131 /** 35132 * This method is like `_.uniq` except that it's designed and optimized 35133 * for sorted arrays. 35134 * 35135 * @static 35136 * @memberOf _ 35137 * @since 4.0.0 35138 * @category Array 35139 * @param {Array} array The array to inspect. 35140 * @returns {Array} Returns the new duplicate free array. 35141 * @example 35142 * 35143 * _.sortedUniq([1, 1, 2]); 35144 * // => [1, 2] 35145 */ 35146 function sortedUniq(array) { 35147 return (array && array.length) 35148 ? baseSortedUniq(array) 35149 : []; 35150 } 35151 35152 /** 35153 * This method is like `_.uniqBy` except that it's designed and optimized 35154 * for sorted arrays. 35155 * 35156 * @static 35157 * @memberOf _ 35158 * @since 4.0.0 35159 * @category Array 35160 * @param {Array} array The array to inspect. 35161 * @param {Function} [iteratee] The iteratee invoked per element. 35162 * @returns {Array} Returns the new duplicate free array. 35163 * @example 35164 * 35165 * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); 35166 * // => [1.1, 2.3] 35167 */ 35168 function sortedUniqBy(array, iteratee) { 35169 return (array && array.length) 35170 ? baseSortedUniq(array, getIteratee(iteratee, 2)) 35171 : []; 35172 } 35173 35174 /** 35175 * Gets all but the first element of `array`. 35176 * 35177 * @static 35178 * @memberOf _ 35179 * @since 4.0.0 35180 * @category Array 35181 * @param {Array} array The array to query. 35182 * @returns {Array} Returns the slice of `array`. 35183 * @example 35184 * 35185 * _.tail([1, 2, 3]); 35186 * // => [2, 3] 35187 */ 35188 function tail(array) { 35189 var length = array == null ? 0 : array.length; 35190 return length ? baseSlice(array, 1, length) : []; 35191 } 35192 35193 /** 35194 * Creates a slice of `array` with `n` elements taken from the beginning. 35195 * 35196 * @static 35197 * @memberOf _ 35198 * @since 0.1.0 35199 * @category Array 35200 * @param {Array} array The array to query. 35201 * @param {number} [n=1] The number of elements to take. 35202 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 35203 * @returns {Array} Returns the slice of `array`. 35204 * @example 35205 * 35206 * _.take([1, 2, 3]); 35207 * // => [1] 35208 * 35209 * _.take([1, 2, 3], 2); 35210 * // => [1, 2] 35211 * 35212 * _.take([1, 2, 3], 5); 35213 * // => [1, 2, 3] 35214 * 35215 * _.take([1, 2, 3], 0); 35216 * // => [] 35217 */ 35218 function take(array, n, guard) { 35219 if (!(array && array.length)) { 35220 return []; 35221 } 35222 n = (guard || n === undefined) ? 1 : toInteger(n); 35223 return baseSlice(array, 0, n < 0 ? 0 : n); 35224 } 35225 35226 /** 35227 * Creates a slice of `array` with `n` elements taken from the end. 35228 * 35229 * @static 35230 * @memberOf _ 35231 * @since 3.0.0 35232 * @category Array 35233 * @param {Array} array The array to query. 35234 * @param {number} [n=1] The number of elements to take. 35235 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 35236 * @returns {Array} Returns the slice of `array`. 35237 * @example 35238 * 35239 * _.takeRight([1, 2, 3]); 35240 * // => [3] 35241 * 35242 * _.takeRight([1, 2, 3], 2); 35243 * // => [2, 3] 35244 * 35245 * _.takeRight([1, 2, 3], 5); 35246 * // => [1, 2, 3] 35247 * 35248 * _.takeRight([1, 2, 3], 0); 35249 * // => [] 35250 */ 35251 function takeRight(array, n, guard) { 35252 var length = array == null ? 0 : array.length; 35253 if (!length) { 35254 return []; 35255 } 35256 n = (guard || n === undefined) ? 1 : toInteger(n); 35257 n = length - n; 35258 return baseSlice(array, n < 0 ? 0 : n, length); 35259 } 35260 35261 /** 35262 * Creates a slice of `array` with elements taken from the end. Elements are 35263 * taken until `predicate` returns falsey. The predicate is invoked with 35264 * three arguments: (value, index, array). 35265 * 35266 * @static 35267 * @memberOf _ 35268 * @since 3.0.0 35269 * @category Array 35270 * @param {Array} array The array to query. 35271 * @param {Function} [predicate=_.identity] The function invoked per iteration. 35272 * @returns {Array} Returns the slice of `array`. 35273 * @example 35274 * 35275 * var users = [ 35276 * { 'user': 'barney', 'active': true }, 35277 * { 'user': 'fred', 'active': false }, 35278 * { 'user': 'pebbles', 'active': false } 35279 * ]; 35280 * 35281 * _.takeRightWhile(users, function(o) { return !o.active; }); 35282 * // => objects for ['fred', 'pebbles'] 35283 * 35284 * // The `_.matches` iteratee shorthand. 35285 * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); 35286 * // => objects for ['pebbles'] 35287 * 35288 * // The `_.matchesProperty` iteratee shorthand. 35289 * _.takeRightWhile(users, ['active', false]); 35290 * // => objects for ['fred', 'pebbles'] 35291 * 35292 * // The `_.property` iteratee shorthand. 35293 * _.takeRightWhile(users, 'active'); 35294 * // => [] 35295 */ 35296 function takeRightWhile(array, predicate) { 35297 return (array && array.length) 35298 ? baseWhile(array, getIteratee(predicate, 3), false, true) 35299 : []; 35300 } 35301 35302 /** 35303 * Creates a slice of `array` with elements taken from the beginning. Elements 35304 * are taken until `predicate` returns falsey. The predicate is invoked with 35305 * three arguments: (value, index, array). 35306 * 35307 * @static 35308 * @memberOf _ 35309 * @since 3.0.0 35310 * @category Array 35311 * @param {Array} array The array to query. 35312 * @param {Function} [predicate=_.identity] The function invoked per iteration. 35313 * @returns {Array} Returns the slice of `array`. 35314 * @example 35315 * 35316 * var users = [ 35317 * { 'user': 'barney', 'active': false }, 35318 * { 'user': 'fred', 'active': false }, 35319 * { 'user': 'pebbles', 'active': true } 35320 * ]; 35321 * 35322 * _.takeWhile(users, function(o) { return !o.active; }); 35323 * // => objects for ['barney', 'fred'] 35324 * 35325 * // The `_.matches` iteratee shorthand. 35326 * _.takeWhile(users, { 'user': 'barney', 'active': false }); 35327 * // => objects for ['barney'] 35328 * 35329 * // The `_.matchesProperty` iteratee shorthand. 35330 * _.takeWhile(users, ['active', false]); 35331 * // => objects for ['barney', 'fred'] 35332 * 35333 * // The `_.property` iteratee shorthand. 35334 * _.takeWhile(users, 'active'); 35335 * // => [] 35336 */ 35337 function takeWhile(array, predicate) { 35338 return (array && array.length) 35339 ? baseWhile(array, getIteratee(predicate, 3)) 35340 : []; 35341 } 35342 35343 /** 35344 * Creates an array of unique values, in order, from all given arrays using 35345 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 35346 * for equality comparisons. 35347 * 35348 * @static 35349 * @memberOf _ 35350 * @since 0.1.0 35351 * @category Array 35352 * @param {...Array} [arrays] The arrays to inspect. 35353 * @returns {Array} Returns the new array of combined values. 35354 * @example 35355 * 35356 * _.union([2], [1, 2]); 35357 * // => [2, 1] 35358 */ 35359 var union = baseRest(function(arrays) { 35360 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); 35361 }); 35362 35363 /** 35364 * This method is like `_.union` except that it accepts `iteratee` which is 35365 * invoked for each element of each `arrays` to generate the criterion by 35366 * which uniqueness is computed. Result values are chosen from the first 35367 * array in which the value occurs. The iteratee is invoked with one argument: 35368 * (value). 35369 * 35370 * @static 35371 * @memberOf _ 35372 * @since 4.0.0 35373 * @category Array 35374 * @param {...Array} [arrays] The arrays to inspect. 35375 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 35376 * @returns {Array} Returns the new array of combined values. 35377 * @example 35378 * 35379 * _.unionBy([2.1], [1.2, 2.3], Math.floor); 35380 * // => [2.1, 1.2] 35381 * 35382 * // The `_.property` iteratee shorthand. 35383 * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); 35384 * // => [{ 'x': 1 }, { 'x': 2 }] 35385 */ 35386 var unionBy = baseRest(function(arrays) { 35387 var iteratee = last(arrays); 35388 if (isArrayLikeObject(iteratee)) { 35389 iteratee = undefined; 35390 } 35391 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); 35392 }); 35393 35394 /** 35395 * This method is like `_.union` except that it accepts `comparator` which 35396 * is invoked to compare elements of `arrays`. Result values are chosen from 35397 * the first array in which the value occurs. The comparator is invoked 35398 * with two arguments: (arrVal, othVal). 35399 * 35400 * @static 35401 * @memberOf _ 35402 * @since 4.0.0 35403 * @category Array 35404 * @param {...Array} [arrays] The arrays to inspect. 35405 * @param {Function} [comparator] The comparator invoked per element. 35406 * @returns {Array} Returns the new array of combined values. 35407 * @example 35408 * 35409 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; 35410 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; 35411 * 35412 * _.unionWith(objects, others, _.isEqual); 35413 * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] 35414 */ 35415 var unionWith = baseRest(function(arrays) { 35416 var comparator = last(arrays); 35417 comparator = typeof comparator == 'function' ? comparator : undefined; 35418 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); 35419 }); 35420 35421 /** 35422 * Creates a duplicate-free version of an array, using 35423 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 35424 * for equality comparisons, in which only the first occurrence of each element 35425 * is kept. The order of result values is determined by the order they occur 35426 * in the array. 35427 * 35428 * @static 35429 * @memberOf _ 35430 * @since 0.1.0 35431 * @category Array 35432 * @param {Array} array The array to inspect. 35433 * @returns {Array} Returns the new duplicate free array. 35434 * @example 35435 * 35436 * _.uniq([2, 1, 2]); 35437 * // => [2, 1] 35438 */ 35439 function uniq(array) { 35440 return (array && array.length) ? baseUniq(array) : []; 35441 } 35442 35443 /** 35444 * This method is like `_.uniq` except that it accepts `iteratee` which is 35445 * invoked for each element in `array` to generate the criterion by which 35446 * uniqueness is computed. The order of result values is determined by the 35447 * order they occur in the array. The iteratee is invoked with one argument: 35448 * (value). 35449 * 35450 * @static 35451 * @memberOf _ 35452 * @since 4.0.0 35453 * @category Array 35454 * @param {Array} array The array to inspect. 35455 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 35456 * @returns {Array} Returns the new duplicate free array. 35457 * @example 35458 * 35459 * _.uniqBy([2.1, 1.2, 2.3], Math.floor); 35460 * // => [2.1, 1.2] 35461 * 35462 * // The `_.property` iteratee shorthand. 35463 * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); 35464 * // => [{ 'x': 1 }, { 'x': 2 }] 35465 */ 35466 function uniqBy(array, iteratee) { 35467 return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; 35468 } 35469 35470 /** 35471 * This method is like `_.uniq` except that it accepts `comparator` which 35472 * is invoked to compare elements of `array`. The order of result values is 35473 * determined by the order they occur in the array.The comparator is invoked 35474 * with two arguments: (arrVal, othVal). 35475 * 35476 * @static 35477 * @memberOf _ 35478 * @since 4.0.0 35479 * @category Array 35480 * @param {Array} array The array to inspect. 35481 * @param {Function} [comparator] The comparator invoked per element. 35482 * @returns {Array} Returns the new duplicate free array. 35483 * @example 35484 * 35485 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; 35486 * 35487 * _.uniqWith(objects, _.isEqual); 35488 * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] 35489 */ 35490 function uniqWith(array, comparator) { 35491 comparator = typeof comparator == 'function' ? comparator : undefined; 35492 return (array && array.length) ? baseUniq(array, undefined, comparator) : []; 35493 } 35494 35495 /** 35496 * This method is like `_.zip` except that it accepts an array of grouped 35497 * elements and creates an array regrouping the elements to their pre-zip 35498 * configuration. 35499 * 35500 * @static 35501 * @memberOf _ 35502 * @since 1.2.0 35503 * @category Array 35504 * @param {Array} array The array of grouped elements to process. 35505 * @returns {Array} Returns the new array of regrouped elements. 35506 * @example 35507 * 35508 * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); 35509 * // => [['a', 1, true], ['b', 2, false]] 35510 * 35511 * _.unzip(zipped); 35512 * // => [['a', 'b'], [1, 2], [true, false]] 35513 */ 35514 function unzip(array) { 35515 if (!(array && array.length)) { 35516 return []; 35517 } 35518 var length = 0; 35519 array = arrayFilter(array, function(group) { 35520 if (isArrayLikeObject(group)) { 35521 length = nativeMax(group.length, length); 35522 return true; 35523 } 35524 }); 35525 return baseTimes(length, function(index) { 35526 return arrayMap(array, baseProperty(index)); 35527 }); 35528 } 35529 35530 /** 35531 * This method is like `_.unzip` except that it accepts `iteratee` to specify 35532 * how regrouped values should be combined. The iteratee is invoked with the 35533 * elements of each group: (...group). 35534 * 35535 * @static 35536 * @memberOf _ 35537 * @since 3.8.0 35538 * @category Array 35539 * @param {Array} array The array of grouped elements to process. 35540 * @param {Function} [iteratee=_.identity] The function to combine 35541 * regrouped values. 35542 * @returns {Array} Returns the new array of regrouped elements. 35543 * @example 35544 * 35545 * var zipped = _.zip([1, 2], [10, 20], [100, 200]); 35546 * // => [[1, 10, 100], [2, 20, 200]] 35547 * 35548 * _.unzipWith(zipped, _.add); 35549 * // => [3, 30, 300] 35550 */ 35551 function unzipWith(array, iteratee) { 35552 if (!(array && array.length)) { 35553 return []; 35554 } 35555 var result = unzip(array); 35556 if (iteratee == null) { 35557 return result; 35558 } 35559 return arrayMap(result, function(group) { 35560 return apply(iteratee, undefined, group); 35561 }); 35562 } 35563 35564 /** 35565 * Creates an array excluding all given values using 35566 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 35567 * for equality comparisons. 35568 * 35569 * **Note:** Unlike `_.pull`, this method returns a new array. 35570 * 35571 * @static 35572 * @memberOf _ 35573 * @since 0.1.0 35574 * @category Array 35575 * @param {Array} array The array to inspect. 35576 * @param {...*} [values] The values to exclude. 35577 * @returns {Array} Returns the new array of filtered values. 35578 * @see _.difference, _.xor 35579 * @example 35580 * 35581 * _.without([2, 1, 2, 3], 1, 2); 35582 * // => [3] 35583 */ 35584 var without = baseRest(function(array, values) { 35585 return isArrayLikeObject(array) 35586 ? baseDifference(array, values) 35587 : []; 35588 }); 35589 35590 /** 35591 * Creates an array of unique values that is the 35592 * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) 35593 * of the given arrays. The order of result values is determined by the order 35594 * they occur in the arrays. 35595 * 35596 * @static 35597 * @memberOf _ 35598 * @since 2.4.0 35599 * @category Array 35600 * @param {...Array} [arrays] The arrays to inspect. 35601 * @returns {Array} Returns the new array of filtered values. 35602 * @see _.difference, _.without 35603 * @example 35604 * 35605 * _.xor([2, 1], [2, 3]); 35606 * // => [1, 3] 35607 */ 35608 var xor = baseRest(function(arrays) { 35609 return baseXor(arrayFilter(arrays, isArrayLikeObject)); 35610 }); 35611 35612 /** 35613 * This method is like `_.xor` except that it accepts `iteratee` which is 35614 * invoked for each element of each `arrays` to generate the criterion by 35615 * which by which they're compared. The order of result values is determined 35616 * by the order they occur in the arrays. The iteratee is invoked with one 35617 * argument: (value). 35618 * 35619 * @static 35620 * @memberOf _ 35621 * @since 4.0.0 35622 * @category Array 35623 * @param {...Array} [arrays] The arrays to inspect. 35624 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 35625 * @returns {Array} Returns the new array of filtered values. 35626 * @example 35627 * 35628 * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); 35629 * // => [1.2, 3.4] 35630 * 35631 * // The `_.property` iteratee shorthand. 35632 * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); 35633 * // => [{ 'x': 2 }] 35634 */ 35635 var xorBy = baseRest(function(arrays) { 35636 var iteratee = last(arrays); 35637 if (isArrayLikeObject(iteratee)) { 35638 iteratee = undefined; 35639 } 35640 return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); 35641 }); 35642 35643 /** 35644 * This method is like `_.xor` except that it accepts `comparator` which is 35645 * invoked to compare elements of `arrays`. The order of result values is 35646 * determined by the order they occur in the arrays. The comparator is invoked 35647 * with two arguments: (arrVal, othVal). 35648 * 35649 * @static 35650 * @memberOf _ 35651 * @since 4.0.0 35652 * @category Array 35653 * @param {...Array} [arrays] The arrays to inspect. 35654 * @param {Function} [comparator] The comparator invoked per element. 35655 * @returns {Array} Returns the new array of filtered values. 35656 * @example 35657 * 35658 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; 35659 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; 35660 * 35661 * _.xorWith(objects, others, _.isEqual); 35662 * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] 35663 */ 35664 var xorWith = baseRest(function(arrays) { 35665 var comparator = last(arrays); 35666 comparator = typeof comparator == 'function' ? comparator : undefined; 35667 return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); 35668 }); 35669 35670 /** 35671 * Creates an array of grouped elements, the first of which contains the 35672 * first elements of the given arrays, the second of which contains the 35673 * second elements of the given arrays, and so on. 35674 * 35675 * @static 35676 * @memberOf _ 35677 * @since 0.1.0 35678 * @category Array 35679 * @param {...Array} [arrays] The arrays to process. 35680 * @returns {Array} Returns the new array of grouped elements. 35681 * @example 35682 * 35683 * _.zip(['a', 'b'], [1, 2], [true, false]); 35684 * // => [['a', 1, true], ['b', 2, false]] 35685 */ 35686 var zip = baseRest(unzip); 35687 35688 /** 35689 * This method is like `_.fromPairs` except that it accepts two arrays, 35690 * one of property identifiers and one of corresponding values. 35691 * 35692 * @static 35693 * @memberOf _ 35694 * @since 0.4.0 35695 * @category Array 35696 * @param {Array} [props=[]] The property identifiers. 35697 * @param {Array} [values=[]] The property values. 35698 * @returns {Object} Returns the new object. 35699 * @example 35700 * 35701 * _.zipObject(['a', 'b'], [1, 2]); 35702 * // => { 'a': 1, 'b': 2 } 35703 */ 35704 function zipObject(props, values) { 35705 return baseZipObject(props || [], values || [], assignValue); 35706 } 35707 35708 /** 35709 * This method is like `_.zipObject` except that it supports property paths. 35710 * 35711 * @static 35712 * @memberOf _ 35713 * @since 4.1.0 35714 * @category Array 35715 * @param {Array} [props=[]] The property identifiers. 35716 * @param {Array} [values=[]] The property values. 35717 * @returns {Object} Returns the new object. 35718 * @example 35719 * 35720 * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); 35721 * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } 35722 */ 35723 function zipObjectDeep(props, values) { 35724 return baseZipObject(props || [], values || [], baseSet); 35725 } 35726 35727 /** 35728 * This method is like `_.zip` except that it accepts `iteratee` to specify 35729 * how grouped values should be combined. The iteratee is invoked with the 35730 * elements of each group: (...group). 35731 * 35732 * @static 35733 * @memberOf _ 35734 * @since 3.8.0 35735 * @category Array 35736 * @param {...Array} [arrays] The arrays to process. 35737 * @param {Function} [iteratee=_.identity] The function to combine 35738 * grouped values. 35739 * @returns {Array} Returns the new array of grouped elements. 35740 * @example 35741 * 35742 * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { 35743 * return a + b + c; 35744 * }); 35745 * // => [111, 222] 35746 */ 35747 var zipWith = baseRest(function(arrays) { 35748 var length = arrays.length, 35749 iteratee = length > 1 ? arrays[length - 1] : undefined; 35750 35751 iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; 35752 return unzipWith(arrays, iteratee); 35753 }); 35754 35755 /*------------------------------------------------------------------------*/ 35756 35757 /** 35758 * Creates a `lodash` wrapper instance that wraps `value` with explicit method 35759 * chain sequences enabled. The result of such sequences must be unwrapped 35760 * with `_#value`. 35761 * 35762 * @static 35763 * @memberOf _ 35764 * @since 1.3.0 35765 * @category Seq 35766 * @param {*} value The value to wrap. 35767 * @returns {Object} Returns the new `lodash` wrapper instance. 35768 * @example 35769 * 35770 * var users = [ 35771 * { 'user': 'barney', 'age': 36 }, 35772 * { 'user': 'fred', 'age': 40 }, 35773 * { 'user': 'pebbles', 'age': 1 } 35774 * ]; 35775 * 35776 * var youngest = _ 35777 * .chain(users) 35778 * .sortBy('age') 35779 * .map(function(o) { 35780 * return o.user + ' is ' + o.age; 35781 * }) 35782 * .head() 35783 * .value(); 35784 * // => 'pebbles is 1' 35785 */ 35786 function chain(value) { 35787 var result = lodash(value); 35788 result.__chain__ = true; 35789 return result; 35790 } 35791 35792 /** 35793 * This method invokes `interceptor` and returns `value`. The interceptor 35794 * is invoked with one argument; (value). The purpose of this method is to 35795 * "tap into" a method chain sequence in order to modify intermediate results. 35796 * 35797 * @static 35798 * @memberOf _ 35799 * @since 0.1.0 35800 * @category Seq 35801 * @param {*} value The value to provide to `interceptor`. 35802 * @param {Function} interceptor The function to invoke. 35803 * @returns {*} Returns `value`. 35804 * @example 35805 * 35806 * _([1, 2, 3]) 35807 * .tap(function(array) { 35808 * // Mutate input array. 35809 * array.pop(); 35810 * }) 35811 * .reverse() 35812 * .value(); 35813 * // => [2, 1] 35814 */ 35815 function tap(value, interceptor) { 35816 interceptor(value); 35817 return value; 35818 } 35819 35820 /** 35821 * This method is like `_.tap` except that it returns the result of `interceptor`. 35822 * The purpose of this method is to "pass thru" values replacing intermediate 35823 * results in a method chain sequence. 35824 * 35825 * @static 35826 * @memberOf _ 35827 * @since 3.0.0 35828 * @category Seq 35829 * @param {*} value The value to provide to `interceptor`. 35830 * @param {Function} interceptor The function to invoke. 35831 * @returns {*} Returns the result of `interceptor`. 35832 * @example 35833 * 35834 * _(' abc ') 35835 * .chain() 35836 * .trim() 35837 * .thru(function(value) { 35838 * return [value]; 35839 * }) 35840 * .value(); 35841 * // => ['abc'] 35842 */ 35843 function thru(value, interceptor) { 35844 return interceptor(value); 35845 } 35846 35847 /** 35848 * This method is the wrapper version of `_.at`. 35849 * 35850 * @name at 35851 * @memberOf _ 35852 * @since 1.0.0 35853 * @category Seq 35854 * @param {...(string|string[])} [paths] The property paths to pick. 35855 * @returns {Object} Returns the new `lodash` wrapper instance. 35856 * @example 35857 * 35858 * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; 35859 * 35860 * _(object).at(['a[0].b.c', 'a[1]']).value(); 35861 * // => [3, 4] 35862 */ 35863 var wrapperAt = flatRest(function(paths) { 35864 var length = paths.length, 35865 start = length ? paths[0] : 0, 35866 value = this.__wrapped__, 35867 interceptor = function(object) { return baseAt(object, paths); }; 35868 35869 if (length > 1 || this.__actions__.length || 35870 !(value instanceof LazyWrapper) || !isIndex(start)) { 35871 return this.thru(interceptor); 35872 } 35873 value = value.slice(start, +start + (length ? 1 : 0)); 35874 value.__actions__.push({ 35875 'func': thru, 35876 'args': [interceptor], 35877 'thisArg': undefined 35878 }); 35879 return new LodashWrapper(value, this.__chain__).thru(function(array) { 35880 if (length && !array.length) { 35881 array.push(undefined); 35882 } 35883 return array; 35884 }); 35885 }); 35886 35887 /** 35888 * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. 35889 * 35890 * @name chain 35891 * @memberOf _ 35892 * @since 0.1.0 35893 * @category Seq 35894 * @returns {Object} Returns the new `lodash` wrapper instance. 35895 * @example 35896 * 35897 * var users = [ 35898 * { 'user': 'barney', 'age': 36 }, 35899 * { 'user': 'fred', 'age': 40 } 35900 * ]; 35901 * 35902 * // A sequence without explicit chaining. 35903 * _(users).head(); 35904 * // => { 'user': 'barney', 'age': 36 } 35905 * 35906 * // A sequence with explicit chaining. 35907 * _(users) 35908 * .chain() 35909 * .head() 35910 * .pick('user') 35911 * .value(); 35912 * // => { 'user': 'barney' } 35913 */ 35914 function wrapperChain() { 35915 return chain(this); 35916 } 35917 35918 /** 35919 * Executes the chain sequence and returns the wrapped result. 35920 * 35921 * @name commit 35922 * @memberOf _ 35923 * @since 3.2.0 35924 * @category Seq 35925 * @returns {Object} Returns the new `lodash` wrapper instance. 35926 * @example 35927 * 35928 * var array = [1, 2]; 35929 * var wrapped = _(array).push(3); 35930 * 35931 * console.log(array); 35932 * // => [1, 2] 35933 * 35934 * wrapped = wrapped.commit(); 35935 * console.log(array); 35936 * // => [1, 2, 3] 35937 * 35938 * wrapped.last(); 35939 * // => 3 35940 * 35941 * console.log(array); 35942 * // => [1, 2, 3] 35943 */ 35944 function wrapperCommit() { 35945 return new LodashWrapper(this.value(), this.__chain__); 35946 } 35947 35948 /** 35949 * Gets the next value on a wrapped object following the 35950 * [iterator protocol](https://mdn.io/iteration_protocols#iterator). 35951 * 35952 * @name next 35953 * @memberOf _ 35954 * @since 4.0.0 35955 * @category Seq 35956 * @returns {Object} Returns the next iterator value. 35957 * @example 35958 * 35959 * var wrapped = _([1, 2]); 35960 * 35961 * wrapped.next(); 35962 * // => { 'done': false, 'value': 1 } 35963 * 35964 * wrapped.next(); 35965 * // => { 'done': false, 'value': 2 } 35966 * 35967 * wrapped.next(); 35968 * // => { 'done': true, 'value': undefined } 35969 */ 35970 function wrapperNext() { 35971 if (this.__values__ === undefined) { 35972 this.__values__ = toArray(this.value()); 35973 } 35974 var done = this.__index__ >= this.__values__.length, 35975 value = done ? undefined : this.__values__[this.__index__++]; 35976 35977 return { 'done': done, 'value': value }; 35978 } 35979 35980 /** 35981 * Enables the wrapper to be iterable. 35982 * 35983 * @name Symbol.iterator 35984 * @memberOf _ 35985 * @since 4.0.0 35986 * @category Seq 35987 * @returns {Object} Returns the wrapper object. 35988 * @example 35989 * 35990 * var wrapped = _([1, 2]); 35991 * 35992 * wrapped[Symbol.iterator]() === wrapped; 35993 * // => true 35994 * 35995 * Array.from(wrapped); 35996 * // => [1, 2] 35997 */ 35998 function wrapperToIterator() { 35999 return this; 36000 } 36001 36002 /** 36003 * Creates a clone of the chain sequence planting `value` as the wrapped value. 36004 * 36005 * @name plant 36006 * @memberOf _ 36007 * @since 3.2.0 36008 * @category Seq 36009 * @param {*} value The value to plant. 36010 * @returns {Object} Returns the new `lodash` wrapper instance. 36011 * @example 36012 * 36013 * function square(n) { 36014 * return n * n; 36015 * } 36016 * 36017 * var wrapped = _([1, 2]).map(square); 36018 * var other = wrapped.plant([3, 4]); 36019 * 36020 * other.value(); 36021 * // => [9, 16] 36022 * 36023 * wrapped.value(); 36024 * // => [1, 4] 36025 */ 36026 function wrapperPlant(value) { 36027 var result, 36028 parent = this; 36029 36030 while (parent instanceof baseLodash) { 36031 var clone = wrapperClone(parent); 36032 clone.__index__ = 0; 36033 clone.__values__ = undefined; 36034 if (result) { 36035 previous.__wrapped__ = clone; 36036 } else { 36037 result = clone; 36038 } 36039 var previous = clone; 36040 parent = parent.__wrapped__; 36041 } 36042 previous.__wrapped__ = value; 36043 return result; 36044 } 36045 36046 /** 36047 * This method is the wrapper version of `_.reverse`. 36048 * 36049 * **Note:** This method mutates the wrapped array. 36050 * 36051 * @name reverse 36052 * @memberOf _ 36053 * @since 0.1.0 36054 * @category Seq 36055 * @returns {Object} Returns the new `lodash` wrapper instance. 36056 * @example 36057 * 36058 * var array = [1, 2, 3]; 36059 * 36060 * _(array).reverse().value() 36061 * // => [3, 2, 1] 36062 * 36063 * console.log(array); 36064 * // => [3, 2, 1] 36065 */ 36066 function wrapperReverse() { 36067 var value = this.__wrapped__; 36068 if (value instanceof LazyWrapper) { 36069 var wrapped = value; 36070 if (this.__actions__.length) { 36071 wrapped = new LazyWrapper(this); 36072 } 36073 wrapped = wrapped.reverse(); 36074 wrapped.__actions__.push({ 36075 'func': thru, 36076 'args': [reverse], 36077 'thisArg': undefined 36078 }); 36079 return new LodashWrapper(wrapped, this.__chain__); 36080 } 36081 return this.thru(reverse); 36082 } 36083 36084 /** 36085 * Executes the chain sequence to resolve the unwrapped value. 36086 * 36087 * @name value 36088 * @memberOf _ 36089 * @since 0.1.0 36090 * @alias toJSON, valueOf 36091 * @category Seq 36092 * @returns {*} Returns the resolved unwrapped value. 36093 * @example 36094 * 36095 * _([1, 2, 3]).value(); 36096 * // => [1, 2, 3] 36097 */ 36098 function wrapperValue() { 36099 return baseWrapperValue(this.__wrapped__, this.__actions__); 36100 } 36101 36102 /*------------------------------------------------------------------------*/ 36103 36104 /** 36105 * Creates an object composed of keys generated from the results of running 36106 * each element of `collection` thru `iteratee`. The corresponding value of 36107 * each key is the number of times the key was returned by `iteratee`. The 36108 * iteratee is invoked with one argument: (value). 36109 * 36110 * @static 36111 * @memberOf _ 36112 * @since 0.5.0 36113 * @category Collection 36114 * @param {Array|Object} collection The collection to iterate over. 36115 * @param {Function} [iteratee=_.identity] The iteratee to transform keys. 36116 * @returns {Object} Returns the composed aggregate object. 36117 * @example 36118 * 36119 * _.countBy([6.1, 4.2, 6.3], Math.floor); 36120 * // => { '4': 1, '6': 2 } 36121 * 36122 * // The `_.property` iteratee shorthand. 36123 * _.countBy(['one', 'two', 'three'], 'length'); 36124 * // => { '3': 2, '5': 1 } 36125 */ 36126 var countBy = createAggregator(function(result, value, key) { 36127 if (hasOwnProperty.call(result, key)) { 36128 ++result[key]; 36129 } else { 36130 baseAssignValue(result, key, 1); 36131 } 36132 }); 36133 36134 /** 36135 * Checks if `predicate` returns truthy for **all** elements of `collection`. 36136 * Iteration is stopped once `predicate` returns falsey. The predicate is 36137 * invoked with three arguments: (value, index|key, collection). 36138 * 36139 * **Note:** This method returns `true` for 36140 * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because 36141 * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of 36142 * elements of empty collections. 36143 * 36144 * @static 36145 * @memberOf _ 36146 * @since 0.1.0 36147 * @category Collection 36148 * @param {Array|Object} collection The collection to iterate over. 36149 * @param {Function} [predicate=_.identity] The function invoked per iteration. 36150 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 36151 * @returns {boolean} Returns `true` if all elements pass the predicate check, 36152 * else `false`. 36153 * @example 36154 * 36155 * _.every([true, 1, null, 'yes'], Boolean); 36156 * // => false 36157 * 36158 * var users = [ 36159 * { 'user': 'barney', 'age': 36, 'active': false }, 36160 * { 'user': 'fred', 'age': 40, 'active': false } 36161 * ]; 36162 * 36163 * // The `_.matches` iteratee shorthand. 36164 * _.every(users, { 'user': 'barney', 'active': false }); 36165 * // => false 36166 * 36167 * // The `_.matchesProperty` iteratee shorthand. 36168 * _.every(users, ['active', false]); 36169 * // => true 36170 * 36171 * // The `_.property` iteratee shorthand. 36172 * _.every(users, 'active'); 36173 * // => false 36174 */ 36175 function every(collection, predicate, guard) { 36176 var func = isArray(collection) ? arrayEvery : baseEvery; 36177 if (guard && isIterateeCall(collection, predicate, guard)) { 36178 predicate = undefined; 36179 } 36180 return func(collection, getIteratee(predicate, 3)); 36181 } 36182 36183 /** 36184 * Iterates over elements of `collection`, returning an array of all elements 36185 * `predicate` returns truthy for. The predicate is invoked with three 36186 * arguments: (value, index|key, collection). 36187 * 36188 * **Note:** Unlike `_.remove`, this method returns a new array. 36189 * 36190 * @static 36191 * @memberOf _ 36192 * @since 0.1.0 36193 * @category Collection 36194 * @param {Array|Object} collection The collection to iterate over. 36195 * @param {Function} [predicate=_.identity] The function invoked per iteration. 36196 * @returns {Array} Returns the new filtered array. 36197 * @see _.reject 36198 * @example 36199 * 36200 * var users = [ 36201 * { 'user': 'barney', 'age': 36, 'active': true }, 36202 * { 'user': 'fred', 'age': 40, 'active': false } 36203 * ]; 36204 * 36205 * _.filter(users, function(o) { return !o.active; }); 36206 * // => objects for ['fred'] 36207 * 36208 * // The `_.matches` iteratee shorthand. 36209 * _.filter(users, { 'age': 36, 'active': true }); 36210 * // => objects for ['barney'] 36211 * 36212 * // The `_.matchesProperty` iteratee shorthand. 36213 * _.filter(users, ['active', false]); 36214 * // => objects for ['fred'] 36215 * 36216 * // The `_.property` iteratee shorthand. 36217 * _.filter(users, 'active'); 36218 * // => objects for ['barney'] 36219 * 36220 * // Combining several predicates using `_.overEvery` or `_.overSome`. 36221 * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); 36222 * // => objects for ['fred', 'barney'] 36223 */ 36224 function filter(collection, predicate) { 36225 var func = isArray(collection) ? arrayFilter : baseFilter; 36226 return func(collection, getIteratee(predicate, 3)); 36227 } 36228 36229 /** 36230 * Iterates over elements of `collection`, returning the first element 36231 * `predicate` returns truthy for. The predicate is invoked with three 36232 * arguments: (value, index|key, collection). 36233 * 36234 * @static 36235 * @memberOf _ 36236 * @since 0.1.0 36237 * @category Collection 36238 * @param {Array|Object} collection The collection to inspect. 36239 * @param {Function} [predicate=_.identity] The function invoked per iteration. 36240 * @param {number} [fromIndex=0] The index to search from. 36241 * @returns {*} Returns the matched element, else `undefined`. 36242 * @example 36243 * 36244 * var users = [ 36245 * { 'user': 'barney', 'age': 36, 'active': true }, 36246 * { 'user': 'fred', 'age': 40, 'active': false }, 36247 * { 'user': 'pebbles', 'age': 1, 'active': true } 36248 * ]; 36249 * 36250 * _.find(users, function(o) { return o.age < 40; }); 36251 * // => object for 'barney' 36252 * 36253 * // The `_.matches` iteratee shorthand. 36254 * _.find(users, { 'age': 1, 'active': true }); 36255 * // => object for 'pebbles' 36256 * 36257 * // The `_.matchesProperty` iteratee shorthand. 36258 * _.find(users, ['active', false]); 36259 * // => object for 'fred' 36260 * 36261 * // The `_.property` iteratee shorthand. 36262 * _.find(users, 'active'); 36263 * // => object for 'barney' 36264 */ 36265 var find = createFind(findIndex); 36266 36267 /** 36268 * This method is like `_.find` except that it iterates over elements of 36269 * `collection` from right to left. 36270 * 36271 * @static 36272 * @memberOf _ 36273 * @since 2.0.0 36274 * @category Collection 36275 * @param {Array|Object} collection The collection to inspect. 36276 * @param {Function} [predicate=_.identity] The function invoked per iteration. 36277 * @param {number} [fromIndex=collection.length-1] The index to search from. 36278 * @returns {*} Returns the matched element, else `undefined`. 36279 * @example 36280 * 36281 * _.findLast([1, 2, 3, 4], function(n) { 36282 * return n % 2 == 1; 36283 * }); 36284 * // => 3 36285 */ 36286 var findLast = createFind(findLastIndex); 36287 36288 /** 36289 * Creates a flattened array of values by running each element in `collection` 36290 * thru `iteratee` and flattening the mapped results. The iteratee is invoked 36291 * with three arguments: (value, index|key, collection). 36292 * 36293 * @static 36294 * @memberOf _ 36295 * @since 4.0.0 36296 * @category Collection 36297 * @param {Array|Object} collection The collection to iterate over. 36298 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 36299 * @returns {Array} Returns the new flattened array. 36300 * @example 36301 * 36302 * function duplicate(n) { 36303 * return [n, n]; 36304 * } 36305 * 36306 * _.flatMap([1, 2], duplicate); 36307 * // => [1, 1, 2, 2] 36308 */ 36309 function flatMap(collection, iteratee) { 36310 return baseFlatten(map(collection, iteratee), 1); 36311 } 36312 36313 /** 36314 * This method is like `_.flatMap` except that it recursively flattens the 36315 * mapped results. 36316 * 36317 * @static 36318 * @memberOf _ 36319 * @since 4.7.0 36320 * @category Collection 36321 * @param {Array|Object} collection The collection to iterate over. 36322 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 36323 * @returns {Array} Returns the new flattened array. 36324 * @example 36325 * 36326 * function duplicate(n) { 36327 * return [[[n, n]]]; 36328 * } 36329 * 36330 * _.flatMapDeep([1, 2], duplicate); 36331 * // => [1, 1, 2, 2] 36332 */ 36333 function flatMapDeep(collection, iteratee) { 36334 return baseFlatten(map(collection, iteratee), INFINITY); 36335 } 36336 36337 /** 36338 * This method is like `_.flatMap` except that it recursively flattens the 36339 * mapped results up to `depth` times. 36340 * 36341 * @static 36342 * @memberOf _ 36343 * @since 4.7.0 36344 * @category Collection 36345 * @param {Array|Object} collection The collection to iterate over. 36346 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 36347 * @param {number} [depth=1] The maximum recursion depth. 36348 * @returns {Array} Returns the new flattened array. 36349 * @example 36350 * 36351 * function duplicate(n) { 36352 * return [[[n, n]]]; 36353 * } 36354 * 36355 * _.flatMapDepth([1, 2], duplicate, 2); 36356 * // => [[1, 1], [2, 2]] 36357 */ 36358 function flatMapDepth(collection, iteratee, depth) { 36359 depth = depth === undefined ? 1 : toInteger(depth); 36360 return baseFlatten(map(collection, iteratee), depth); 36361 } 36362 36363 /** 36364 * Iterates over elements of `collection` and invokes `iteratee` for each element. 36365 * The iteratee is invoked with three arguments: (value, index|key, collection). 36366 * Iteratee functions may exit iteration early by explicitly returning `false`. 36367 * 36368 * **Note:** As with other "Collections" methods, objects with a "length" 36369 * property are iterated like arrays. To avoid this behavior use `_.forIn` 36370 * or `_.forOwn` for object iteration. 36371 * 36372 * @static 36373 * @memberOf _ 36374 * @since 0.1.0 36375 * @alias each 36376 * @category Collection 36377 * @param {Array|Object} collection The collection to iterate over. 36378 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 36379 * @returns {Array|Object} Returns `collection`. 36380 * @see _.forEachRight 36381 * @example 36382 * 36383 * _.forEach([1, 2], function(value) { 36384 * console.log(value); 36385 * }); 36386 * // => Logs `1` then `2`. 36387 * 36388 * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { 36389 * console.log(key); 36390 * }); 36391 * // => Logs 'a' then 'b' (iteration order is not guaranteed). 36392 */ 36393 function forEach(collection, iteratee) { 36394 var func = isArray(collection) ? arrayEach : baseEach; 36395 return func(collection, getIteratee(iteratee, 3)); 36396 } 36397 36398 /** 36399 * This method is like `_.forEach` except that it iterates over elements of 36400 * `collection` from right to left. 36401 * 36402 * @static 36403 * @memberOf _ 36404 * @since 2.0.0 36405 * @alias eachRight 36406 * @category Collection 36407 * @param {Array|Object} collection The collection to iterate over. 36408 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 36409 * @returns {Array|Object} Returns `collection`. 36410 * @see _.forEach 36411 * @example 36412 * 36413 * _.forEachRight([1, 2], function(value) { 36414 * console.log(value); 36415 * }); 36416 * // => Logs `2` then `1`. 36417 */ 36418 function forEachRight(collection, iteratee) { 36419 var func = isArray(collection) ? arrayEachRight : baseEachRight; 36420 return func(collection, getIteratee(iteratee, 3)); 36421 } 36422 36423 /** 36424 * Creates an object composed of keys generated from the results of running 36425 * each element of `collection` thru `iteratee`. The order of grouped values 36426 * is determined by the order they occur in `collection`. The corresponding 36427 * value of each key is an array of elements responsible for generating the 36428 * key. The iteratee is invoked with one argument: (value). 36429 * 36430 * @static 36431 * @memberOf _ 36432 * @since 0.1.0 36433 * @category Collection 36434 * @param {Array|Object} collection The collection to iterate over. 36435 * @param {Function} [iteratee=_.identity] The iteratee to transform keys. 36436 * @returns {Object} Returns the composed aggregate object. 36437 * @example 36438 * 36439 * _.groupBy([6.1, 4.2, 6.3], Math.floor); 36440 * // => { '4': [4.2], '6': [6.1, 6.3] } 36441 * 36442 * // The `_.property` iteratee shorthand. 36443 * _.groupBy(['one', 'two', 'three'], 'length'); 36444 * // => { '3': ['one', 'two'], '5': ['three'] } 36445 */ 36446 var groupBy = createAggregator(function(result, value, key) { 36447 if (hasOwnProperty.call(result, key)) { 36448 result[key].push(value); 36449 } else { 36450 baseAssignValue(result, key, [value]); 36451 } 36452 }); 36453 36454 /** 36455 * Checks if `value` is in `collection`. If `collection` is a string, it's 36456 * checked for a substring of `value`, otherwise 36457 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 36458 * is used for equality comparisons. If `fromIndex` is negative, it's used as 36459 * the offset from the end of `collection`. 36460 * 36461 * @static 36462 * @memberOf _ 36463 * @since 0.1.0 36464 * @category Collection 36465 * @param {Array|Object|string} collection The collection to inspect. 36466 * @param {*} value The value to search for. 36467 * @param {number} [fromIndex=0] The index to search from. 36468 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. 36469 * @returns {boolean} Returns `true` if `value` is found, else `false`. 36470 * @example 36471 * 36472 * _.includes([1, 2, 3], 1); 36473 * // => true 36474 * 36475 * _.includes([1, 2, 3], 1, 2); 36476 * // => false 36477 * 36478 * _.includes({ 'a': 1, 'b': 2 }, 1); 36479 * // => true 36480 * 36481 * _.includes('abcd', 'bc'); 36482 * // => true 36483 */ 36484 function includes(collection, value, fromIndex, guard) { 36485 collection = isArrayLike(collection) ? collection : values(collection); 36486 fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; 36487 36488 var length = collection.length; 36489 if (fromIndex < 0) { 36490 fromIndex = nativeMax(length + fromIndex, 0); 36491 } 36492 return isString(collection) 36493 ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) 36494 : (!!length && baseIndexOf(collection, value, fromIndex) > -1); 36495 } 36496 36497 /** 36498 * Invokes the method at `path` of each element in `collection`, returning 36499 * an array of the results of each invoked method. Any additional arguments 36500 * are provided to each invoked method. If `path` is a function, it's invoked 36501 * for, and `this` bound to, each element in `collection`. 36502 * 36503 * @static 36504 * @memberOf _ 36505 * @since 4.0.0 36506 * @category Collection 36507 * @param {Array|Object} collection The collection to iterate over. 36508 * @param {Array|Function|string} path The path of the method to invoke or 36509 * the function invoked per iteration. 36510 * @param {...*} [args] The arguments to invoke each method with. 36511 * @returns {Array} Returns the array of results. 36512 * @example 36513 * 36514 * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); 36515 * // => [[1, 5, 7], [1, 2, 3]] 36516 * 36517 * _.invokeMap([123, 456], String.prototype.split, ''); 36518 * // => [['1', '2', '3'], ['4', '5', '6']] 36519 */ 36520 var invokeMap = baseRest(function(collection, path, args) { 36521 var index = -1, 36522 isFunc = typeof path == 'function', 36523 result = isArrayLike(collection) ? Array(collection.length) : []; 36524 36525 baseEach(collection, function(value) { 36526 result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); 36527 }); 36528 return result; 36529 }); 36530 36531 /** 36532 * Creates an object composed of keys generated from the results of running 36533 * each element of `collection` thru `iteratee`. The corresponding value of 36534 * each key is the last element responsible for generating the key. The 36535 * iteratee is invoked with one argument: (value). 36536 * 36537 * @static 36538 * @memberOf _ 36539 * @since 4.0.0 36540 * @category Collection 36541 * @param {Array|Object} collection The collection to iterate over. 36542 * @param {Function} [iteratee=_.identity] The iteratee to transform keys. 36543 * @returns {Object} Returns the composed aggregate object. 36544 * @example 36545 * 36546 * var array = [ 36547 * { 'dir': 'left', 'code': 97 }, 36548 * { 'dir': 'right', 'code': 100 } 36549 * ]; 36550 * 36551 * _.keyBy(array, function(o) { 36552 * return String.fromCharCode(o.code); 36553 * }); 36554 * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } 36555 * 36556 * _.keyBy(array, 'dir'); 36557 * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } 36558 */ 36559 var keyBy = createAggregator(function(result, value, key) { 36560 baseAssignValue(result, key, value); 36561 }); 36562 36563 /** 36564 * Creates an array of values by running each element in `collection` thru 36565 * `iteratee`. The iteratee is invoked with three arguments: 36566 * (value, index|key, collection). 36567 * 36568 * Many lodash methods are guarded to work as iteratees for methods like 36569 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. 36570 * 36571 * The guarded methods are: 36572 * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, 36573 * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, 36574 * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, 36575 * `template`, `trim`, `trimEnd`, `trimStart`, and `words` 36576 * 36577 * @static 36578 * @memberOf _ 36579 * @since 0.1.0 36580 * @category Collection 36581 * @param {Array|Object} collection The collection to iterate over. 36582 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 36583 * @returns {Array} Returns the new mapped array. 36584 * @example 36585 * 36586 * function square(n) { 36587 * return n * n; 36588 * } 36589 * 36590 * _.map([4, 8], square); 36591 * // => [16, 64] 36592 * 36593 * _.map({ 'a': 4, 'b': 8 }, square); 36594 * // => [16, 64] (iteration order is not guaranteed) 36595 * 36596 * var users = [ 36597 * { 'user': 'barney' }, 36598 * { 'user': 'fred' } 36599 * ]; 36600 * 36601 * // The `_.property` iteratee shorthand. 36602 * _.map(users, 'user'); 36603 * // => ['barney', 'fred'] 36604 */ 36605 function map(collection, iteratee) { 36606 var func = isArray(collection) ? arrayMap : baseMap; 36607 return func(collection, getIteratee(iteratee, 3)); 36608 } 36609 36610 /** 36611 * This method is like `_.sortBy` except that it allows specifying the sort 36612 * orders of the iteratees to sort by. If `orders` is unspecified, all values 36613 * are sorted in ascending order. Otherwise, specify an order of "desc" for 36614 * descending or "asc" for ascending sort order of corresponding values. 36615 * 36616 * @static 36617 * @memberOf _ 36618 * @since 4.0.0 36619 * @category Collection 36620 * @param {Array|Object} collection The collection to iterate over. 36621 * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] 36622 * The iteratees to sort by. 36623 * @param {string[]} [orders] The sort orders of `iteratees`. 36624 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. 36625 * @returns {Array} Returns the new sorted array. 36626 * @example 36627 * 36628 * var users = [ 36629 * { 'user': 'fred', 'age': 48 }, 36630 * { 'user': 'barney', 'age': 34 }, 36631 * { 'user': 'fred', 'age': 40 }, 36632 * { 'user': 'barney', 'age': 36 } 36633 * ]; 36634 * 36635 * // Sort by `user` in ascending order and by `age` in descending order. 36636 * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); 36637 * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] 36638 */ 36639 function orderBy(collection, iteratees, orders, guard) { 36640 if (collection == null) { 36641 return []; 36642 } 36643 if (!isArray(iteratees)) { 36644 iteratees = iteratees == null ? [] : [iteratees]; 36645 } 36646 orders = guard ? undefined : orders; 36647 if (!isArray(orders)) { 36648 orders = orders == null ? [] : [orders]; 36649 } 36650 return baseOrderBy(collection, iteratees, orders); 36651 } 36652 36653 /** 36654 * Creates an array of elements split into two groups, the first of which 36655 * contains elements `predicate` returns truthy for, the second of which 36656 * contains elements `predicate` returns falsey for. The predicate is 36657 * invoked with one argument: (value). 36658 * 36659 * @static 36660 * @memberOf _ 36661 * @since 3.0.0 36662 * @category Collection 36663 * @param {Array|Object} collection The collection to iterate over. 36664 * @param {Function} [predicate=_.identity] The function invoked per iteration. 36665 * @returns {Array} Returns the array of grouped elements. 36666 * @example 36667 * 36668 * var users = [ 36669 * { 'user': 'barney', 'age': 36, 'active': false }, 36670 * { 'user': 'fred', 'age': 40, 'active': true }, 36671 * { 'user': 'pebbles', 'age': 1, 'active': false } 36672 * ]; 36673 * 36674 * _.partition(users, function(o) { return o.active; }); 36675 * // => objects for [['fred'], ['barney', 'pebbles']] 36676 * 36677 * // The `_.matches` iteratee shorthand. 36678 * _.partition(users, { 'age': 1, 'active': false }); 36679 * // => objects for [['pebbles'], ['barney', 'fred']] 36680 * 36681 * // The `_.matchesProperty` iteratee shorthand. 36682 * _.partition(users, ['active', false]); 36683 * // => objects for [['barney', 'pebbles'], ['fred']] 36684 * 36685 * // The `_.property` iteratee shorthand. 36686 * _.partition(users, 'active'); 36687 * // => objects for [['fred'], ['barney', 'pebbles']] 36688 */ 36689 var partition = createAggregator(function(result, value, key) { 36690 result[key ? 0 : 1].push(value); 36691 }, function() { return [[], []]; }); 36692 36693 /** 36694 * Reduces `collection` to a value which is the accumulated result of running 36695 * each element in `collection` thru `iteratee`, where each successive 36696 * invocation is supplied the return value of the previous. If `accumulator` 36697 * is not given, the first element of `collection` is used as the initial 36698 * value. The iteratee is invoked with four arguments: 36699 * (accumulator, value, index|key, collection). 36700 * 36701 * Many lodash methods are guarded to work as iteratees for methods like 36702 * `_.reduce`, `_.reduceRight`, and `_.transform`. 36703 * 36704 * The guarded methods are: 36705 * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, 36706 * and `sortBy` 36707 * 36708 * @static 36709 * @memberOf _ 36710 * @since 0.1.0 36711 * @category Collection 36712 * @param {Array|Object} collection The collection to iterate over. 36713 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 36714 * @param {*} [accumulator] The initial value. 36715 * @returns {*} Returns the accumulated value. 36716 * @see _.reduceRight 36717 * @example 36718 * 36719 * _.reduce([1, 2], function(sum, n) { 36720 * return sum + n; 36721 * }, 0); 36722 * // => 3 36723 * 36724 * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { 36725 * (result[value] || (result[value] = [])).push(key); 36726 * return result; 36727 * }, {}); 36728 * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) 36729 */ 36730 function reduce(collection, iteratee, accumulator) { 36731 var func = isArray(collection) ? arrayReduce : baseReduce, 36732 initAccum = arguments.length < 3; 36733 36734 return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); 36735 } 36736 36737 /** 36738 * This method is like `_.reduce` except that it iterates over elements of 36739 * `collection` from right to left. 36740 * 36741 * @static 36742 * @memberOf _ 36743 * @since 0.1.0 36744 * @category Collection 36745 * @param {Array|Object} collection The collection to iterate over. 36746 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 36747 * @param {*} [accumulator] The initial value. 36748 * @returns {*} Returns the accumulated value. 36749 * @see _.reduce 36750 * @example 36751 * 36752 * var array = [[0, 1], [2, 3], [4, 5]]; 36753 * 36754 * _.reduceRight(array, function(flattened, other) { 36755 * return flattened.concat(other); 36756 * }, []); 36757 * // => [4, 5, 2, 3, 0, 1] 36758 */ 36759 function reduceRight(collection, iteratee, accumulator) { 36760 var func = isArray(collection) ? arrayReduceRight : baseReduce, 36761 initAccum = arguments.length < 3; 36762 36763 return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); 36764 } 36765 36766 /** 36767 * The opposite of `_.filter`; this method returns the elements of `collection` 36768 * that `predicate` does **not** return truthy for. 36769 * 36770 * @static 36771 * @memberOf _ 36772 * @since 0.1.0 36773 * @category Collection 36774 * @param {Array|Object} collection The collection to iterate over. 36775 * @param {Function} [predicate=_.identity] The function invoked per iteration. 36776 * @returns {Array} Returns the new filtered array. 36777 * @see _.filter 36778 * @example 36779 * 36780 * var users = [ 36781 * { 'user': 'barney', 'age': 36, 'active': false }, 36782 * { 'user': 'fred', 'age': 40, 'active': true } 36783 * ]; 36784 * 36785 * _.reject(users, function(o) { return !o.active; }); 36786 * // => objects for ['fred'] 36787 * 36788 * // The `_.matches` iteratee shorthand. 36789 * _.reject(users, { 'age': 40, 'active': true }); 36790 * // => objects for ['barney'] 36791 * 36792 * // The `_.matchesProperty` iteratee shorthand. 36793 * _.reject(users, ['active', false]); 36794 * // => objects for ['fred'] 36795 * 36796 * // The `_.property` iteratee shorthand. 36797 * _.reject(users, 'active'); 36798 * // => objects for ['barney'] 36799 */ 36800 function reject(collection, predicate) { 36801 var func = isArray(collection) ? arrayFilter : baseFilter; 36802 return func(collection, negate(getIteratee(predicate, 3))); 36803 } 36804 36805 /** 36806 * Gets a random element from `collection`. 36807 * 36808 * @static 36809 * @memberOf _ 36810 * @since 2.0.0 36811 * @category Collection 36812 * @param {Array|Object} collection The collection to sample. 36813 * @returns {*} Returns the random element. 36814 * @example 36815 * 36816 * _.sample([1, 2, 3, 4]); 36817 * // => 2 36818 */ 36819 function sample(collection) { 36820 var func = isArray(collection) ? arraySample : baseSample; 36821 return func(collection); 36822 } 36823 36824 /** 36825 * Gets `n` random elements at unique keys from `collection` up to the 36826 * size of `collection`. 36827 * 36828 * @static 36829 * @memberOf _ 36830 * @since 4.0.0 36831 * @category Collection 36832 * @param {Array|Object} collection The collection to sample. 36833 * @param {number} [n=1] The number of elements to sample. 36834 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 36835 * @returns {Array} Returns the random elements. 36836 * @example 36837 * 36838 * _.sampleSize([1, 2, 3], 2); 36839 * // => [3, 1] 36840 * 36841 * _.sampleSize([1, 2, 3], 4); 36842 * // => [2, 3, 1] 36843 */ 36844 function sampleSize(collection, n, guard) { 36845 if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { 36846 n = 1; 36847 } else { 36848 n = toInteger(n); 36849 } 36850 var func = isArray(collection) ? arraySampleSize : baseSampleSize; 36851 return func(collection, n); 36852 } 36853 36854 /** 36855 * Creates an array of shuffled values, using a version of the 36856 * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). 36857 * 36858 * @static 36859 * @memberOf _ 36860 * @since 0.1.0 36861 * @category Collection 36862 * @param {Array|Object} collection The collection to shuffle. 36863 * @returns {Array} Returns the new shuffled array. 36864 * @example 36865 * 36866 * _.shuffle([1, 2, 3, 4]); 36867 * // => [4, 1, 3, 2] 36868 */ 36869 function shuffle(collection) { 36870 var func = isArray(collection) ? arrayShuffle : baseShuffle; 36871 return func(collection); 36872 } 36873 36874 /** 36875 * Gets the size of `collection` by returning its length for array-like 36876 * values or the number of own enumerable string keyed properties for objects. 36877 * 36878 * @static 36879 * @memberOf _ 36880 * @since 0.1.0 36881 * @category Collection 36882 * @param {Array|Object|string} collection The collection to inspect. 36883 * @returns {number} Returns the collection size. 36884 * @example 36885 * 36886 * _.size([1, 2, 3]); 36887 * // => 3 36888 * 36889 * _.size({ 'a': 1, 'b': 2 }); 36890 * // => 2 36891 * 36892 * _.size('pebbles'); 36893 * // => 7 36894 */ 36895 function size(collection) { 36896 if (collection == null) { 36897 return 0; 36898 } 36899 if (isArrayLike(collection)) { 36900 return isString(collection) ? stringSize(collection) : collection.length; 36901 } 36902 var tag = getTag(collection); 36903 if (tag == mapTag || tag == setTag) { 36904 return collection.size; 36905 } 36906 return baseKeys(collection).length; 36907 } 36908 36909 /** 36910 * Checks if `predicate` returns truthy for **any** element of `collection`. 36911 * Iteration is stopped once `predicate` returns truthy. The predicate is 36912 * invoked with three arguments: (value, index|key, collection). 36913 * 36914 * @static 36915 * @memberOf _ 36916 * @since 0.1.0 36917 * @category Collection 36918 * @param {Array|Object} collection The collection to iterate over. 36919 * @param {Function} [predicate=_.identity] The function invoked per iteration. 36920 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 36921 * @returns {boolean} Returns `true` if any element passes the predicate check, 36922 * else `false`. 36923 * @example 36924 * 36925 * _.some([null, 0, 'yes', false], Boolean); 36926 * // => true 36927 * 36928 * var users = [ 36929 * { 'user': 'barney', 'active': true }, 36930 * { 'user': 'fred', 'active': false } 36931 * ]; 36932 * 36933 * // The `_.matches` iteratee shorthand. 36934 * _.some(users, { 'user': 'barney', 'active': false }); 36935 * // => false 36936 * 36937 * // The `_.matchesProperty` iteratee shorthand. 36938 * _.some(users, ['active', false]); 36939 * // => true 36940 * 36941 * // The `_.property` iteratee shorthand. 36942 * _.some(users, 'active'); 36943 * // => true 36944 */ 36945 function some(collection, predicate, guard) { 36946 var func = isArray(collection) ? arraySome : baseSome; 36947 if (guard && isIterateeCall(collection, predicate, guard)) { 36948 predicate = undefined; 36949 } 36950 return func(collection, getIteratee(predicate, 3)); 36951 } 36952 36953 /** 36954 * Creates an array of elements, sorted in ascending order by the results of 36955 * running each element in a collection thru each iteratee. This method 36956 * performs a stable sort, that is, it preserves the original sort order of 36957 * equal elements. The iteratees are invoked with one argument: (value). 36958 * 36959 * @static 36960 * @memberOf _ 36961 * @since 0.1.0 36962 * @category Collection 36963 * @param {Array|Object} collection The collection to iterate over. 36964 * @param {...(Function|Function[])} [iteratees=[_.identity]] 36965 * The iteratees to sort by. 36966 * @returns {Array} Returns the new sorted array. 36967 * @example 36968 * 36969 * var users = [ 36970 * { 'user': 'fred', 'age': 48 }, 36971 * { 'user': 'barney', 'age': 36 }, 36972 * { 'user': 'fred', 'age': 30 }, 36973 * { 'user': 'barney', 'age': 34 } 36974 * ]; 36975 * 36976 * _.sortBy(users, [function(o) { return o.user; }]); 36977 * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] 36978 * 36979 * _.sortBy(users, ['user', 'age']); 36980 * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] 36981 */ 36982 var sortBy = baseRest(function(collection, iteratees) { 36983 if (collection == null) { 36984 return []; 36985 } 36986 var length = iteratees.length; 36987 if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { 36988 iteratees = []; 36989 } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { 36990 iteratees = [iteratees[0]]; 36991 } 36992 return baseOrderBy(collection, baseFlatten(iteratees, 1), []); 36993 }); 36994 36995 /*------------------------------------------------------------------------*/ 36996 36997 /** 36998 * Gets the timestamp of the number of milliseconds that have elapsed since 36999 * the Unix epoch (1 January 1970 00:00:00 UTC). 37000 * 37001 * @static 37002 * @memberOf _ 37003 * @since 2.4.0 37004 * @category Date 37005 * @returns {number} Returns the timestamp. 37006 * @example 37007 * 37008 * _.defer(function(stamp) { 37009 * console.log(_.now() - stamp); 37010 * }, _.now()); 37011 * // => Logs the number of milliseconds it took for the deferred invocation. 37012 */ 37013 var now = ctxNow || function() { 37014 return root.Date.now(); 37015 }; 37016 37017 /*------------------------------------------------------------------------*/ 37018 37019 /** 37020 * The opposite of `_.before`; this method creates a function that invokes 37021 * `func` once it's called `n` or more times. 37022 * 37023 * @static 37024 * @memberOf _ 37025 * @since 0.1.0 37026 * @category Function 37027 * @param {number} n The number of calls before `func` is invoked. 37028 * @param {Function} func The function to restrict. 37029 * @returns {Function} Returns the new restricted function. 37030 * @example 37031 * 37032 * var saves = ['profile', 'settings']; 37033 * 37034 * var done = _.after(saves.length, function() { 37035 * console.log('done saving!'); 37036 * }); 37037 * 37038 * _.forEach(saves, function(type) { 37039 * asyncSave({ 'type': type, 'complete': done }); 37040 * }); 37041 * // => Logs 'done saving!' after the two async saves have completed. 37042 */ 37043 function after(n, func) { 37044 if (typeof func != 'function') { 37045 throw new TypeError(FUNC_ERROR_TEXT); 37046 } 37047 n = toInteger(n); 37048 return function() { 37049 if (--n < 1) { 37050 return func.apply(this, arguments); 37051 } 37052 }; 37053 } 37054 37055 /** 37056 * Creates a function that invokes `func`, with up to `n` arguments, 37057 * ignoring any additional arguments. 37058 * 37059 * @static 37060 * @memberOf _ 37061 * @since 3.0.0 37062 * @category Function 37063 * @param {Function} func The function to cap arguments for. 37064 * @param {number} [n=func.length] The arity cap. 37065 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 37066 * @returns {Function} Returns the new capped function. 37067 * @example 37068 * 37069 * _.map(['6', '8', '10'], _.ary(parseInt, 1)); 37070 * // => [6, 8, 10] 37071 */ 37072 function ary(func, n, guard) { 37073 n = guard ? undefined : n; 37074 n = (func && n == null) ? func.length : n; 37075 return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); 37076 } 37077 37078 /** 37079 * Creates a function that invokes `func`, with the `this` binding and arguments 37080 * of the created function, while it's called less than `n` times. Subsequent 37081 * calls to the created function return the result of the last `func` invocation. 37082 * 37083 * @static 37084 * @memberOf _ 37085 * @since 3.0.0 37086 * @category Function 37087 * @param {number} n The number of calls at which `func` is no longer invoked. 37088 * @param {Function} func The function to restrict. 37089 * @returns {Function} Returns the new restricted function. 37090 * @example 37091 * 37092 * jQuery(element).on('click', _.before(5, addContactToList)); 37093 * // => Allows adding up to 4 contacts to the list. 37094 */ 37095 function before(n, func) { 37096 var result; 37097 if (typeof func != 'function') { 37098 throw new TypeError(FUNC_ERROR_TEXT); 37099 } 37100 n = toInteger(n); 37101 return function() { 37102 if (--n > 0) { 37103 result = func.apply(this, arguments); 37104 } 37105 if (n <= 1) { 37106 func = undefined; 37107 } 37108 return result; 37109 }; 37110 } 37111 37112 /** 37113 * Creates a function that invokes `func` with the `this` binding of `thisArg` 37114 * and `partials` prepended to the arguments it receives. 37115 * 37116 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, 37117 * may be used as a placeholder for partially applied arguments. 37118 * 37119 * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" 37120 * property of bound functions. 37121 * 37122 * @static 37123 * @memberOf _ 37124 * @since 0.1.0 37125 * @category Function 37126 * @param {Function} func The function to bind. 37127 * @param {*} thisArg The `this` binding of `func`. 37128 * @param {...*} [partials] The arguments to be partially applied. 37129 * @returns {Function} Returns the new bound function. 37130 * @example 37131 * 37132 * function greet(greeting, punctuation) { 37133 * return greeting + ' ' + this.user + punctuation; 37134 * } 37135 * 37136 * var object = { 'user': 'fred' }; 37137 * 37138 * var bound = _.bind(greet, object, 'hi'); 37139 * bound('!'); 37140 * // => 'hi fred!' 37141 * 37142 * // Bound with placeholders. 37143 * var bound = _.bind(greet, object, _, '!'); 37144 * bound('hi'); 37145 * // => 'hi fred!' 37146 */ 37147 var bind = baseRest(function(func, thisArg, partials) { 37148 var bitmask = WRAP_BIND_FLAG; 37149 if (partials.length) { 37150 var holders = replaceHolders(partials, getHolder(bind)); 37151 bitmask |= WRAP_PARTIAL_FLAG; 37152 } 37153 return createWrap(func, bitmask, thisArg, partials, holders); 37154 }); 37155 37156 /** 37157 * Creates a function that invokes the method at `object[key]` with `partials` 37158 * prepended to the arguments it receives. 37159 * 37160 * This method differs from `_.bind` by allowing bound functions to reference 37161 * methods that may be redefined or don't yet exist. See 37162 * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) 37163 * for more details. 37164 * 37165 * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic 37166 * builds, may be used as a placeholder for partially applied arguments. 37167 * 37168 * @static 37169 * @memberOf _ 37170 * @since 0.10.0 37171 * @category Function 37172 * @param {Object} object The object to invoke the method on. 37173 * @param {string} key The key of the method. 37174 * @param {...*} [partials] The arguments to be partially applied. 37175 * @returns {Function} Returns the new bound function. 37176 * @example 37177 * 37178 * var object = { 37179 * 'user': 'fred', 37180 * 'greet': function(greeting, punctuation) { 37181 * return greeting + ' ' + this.user + punctuation; 37182 * } 37183 * }; 37184 * 37185 * var bound = _.bindKey(object, 'greet', 'hi'); 37186 * bound('!'); 37187 * // => 'hi fred!' 37188 * 37189 * object.greet = function(greeting, punctuation) { 37190 * return greeting + 'ya ' + this.user + punctuation; 37191 * }; 37192 * 37193 * bound('!'); 37194 * // => 'hiya fred!' 37195 * 37196 * // Bound with placeholders. 37197 * var bound = _.bindKey(object, 'greet', _, '!'); 37198 * bound('hi'); 37199 * // => 'hiya fred!' 37200 */ 37201 var bindKey = baseRest(function(object, key, partials) { 37202 var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; 37203 if (partials.length) { 37204 var holders = replaceHolders(partials, getHolder(bindKey)); 37205 bitmask |= WRAP_PARTIAL_FLAG; 37206 } 37207 return createWrap(key, bitmask, object, partials, holders); 37208 }); 37209 37210 /** 37211 * Creates a function that accepts arguments of `func` and either invokes 37212 * `func` returning its result, if at least `arity` number of arguments have 37213 * been provided, or returns a function that accepts the remaining `func` 37214 * arguments, and so on. The arity of `func` may be specified if `func.length` 37215 * is not sufficient. 37216 * 37217 * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, 37218 * may be used as a placeholder for provided arguments. 37219 * 37220 * **Note:** This method doesn't set the "length" property of curried functions. 37221 * 37222 * @static 37223 * @memberOf _ 37224 * @since 2.0.0 37225 * @category Function 37226 * @param {Function} func The function to curry. 37227 * @param {number} [arity=func.length] The arity of `func`. 37228 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 37229 * @returns {Function} Returns the new curried function. 37230 * @example 37231 * 37232 * var abc = function(a, b, c) { 37233 * return [a, b, c]; 37234 * }; 37235 * 37236 * var curried = _.curry(abc); 37237 * 37238 * curried(1)(2)(3); 37239 * // => [1, 2, 3] 37240 * 37241 * curried(1, 2)(3); 37242 * // => [1, 2, 3] 37243 * 37244 * curried(1, 2, 3); 37245 * // => [1, 2, 3] 37246 * 37247 * // Curried with placeholders. 37248 * curried(1)(_, 3)(2); 37249 * // => [1, 2, 3] 37250 */ 37251 function curry(func, arity, guard) { 37252 arity = guard ? undefined : arity; 37253 var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); 37254 result.placeholder = curry.placeholder; 37255 return result; 37256 } 37257 37258 /** 37259 * This method is like `_.curry` except that arguments are applied to `func` 37260 * in the manner of `_.partialRight` instead of `_.partial`. 37261 * 37262 * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic 37263 * builds, may be used as a placeholder for provided arguments. 37264 * 37265 * **Note:** This method doesn't set the "length" property of curried functions. 37266 * 37267 * @static 37268 * @memberOf _ 37269 * @since 3.0.0 37270 * @category Function 37271 * @param {Function} func The function to curry. 37272 * @param {number} [arity=func.length] The arity of `func`. 37273 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 37274 * @returns {Function} Returns the new curried function. 37275 * @example 37276 * 37277 * var abc = function(a, b, c) { 37278 * return [a, b, c]; 37279 * }; 37280 * 37281 * var curried = _.curryRight(abc); 37282 * 37283 * curried(3)(2)(1); 37284 * // => [1, 2, 3] 37285 * 37286 * curried(2, 3)(1); 37287 * // => [1, 2, 3] 37288 * 37289 * curried(1, 2, 3); 37290 * // => [1, 2, 3] 37291 * 37292 * // Curried with placeholders. 37293 * curried(3)(1, _)(2); 37294 * // => [1, 2, 3] 37295 */ 37296 function curryRight(func, arity, guard) { 37297 arity = guard ? undefined : arity; 37298 var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); 37299 result.placeholder = curryRight.placeholder; 37300 return result; 37301 } 37302 37303 /** 37304 * Creates a debounced function that delays invoking `func` until after `wait` 37305 * milliseconds have elapsed since the last time the debounced function was 37306 * invoked. The debounced function comes with a `cancel` method to cancel 37307 * delayed `func` invocations and a `flush` method to immediately invoke them. 37308 * Provide `options` to indicate whether `func` should be invoked on the 37309 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked 37310 * with the last arguments provided to the debounced function. Subsequent 37311 * calls to the debounced function return the result of the last `func` 37312 * invocation. 37313 * 37314 * **Note:** If `leading` and `trailing` options are `true`, `func` is 37315 * invoked on the trailing edge of the timeout only if the debounced function 37316 * is invoked more than once during the `wait` timeout. 37317 * 37318 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred 37319 * until to the next tick, similar to `setTimeout` with a timeout of `0`. 37320 * 37321 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) 37322 * for details over the differences between `_.debounce` and `_.throttle`. 37323 * 37324 * @static 37325 * @memberOf _ 37326 * @since 0.1.0 37327 * @category Function 37328 * @param {Function} func The function to debounce. 37329 * @param {number} [wait=0] The number of milliseconds to delay. 37330 * @param {Object} [options={}] The options object. 37331 * @param {boolean} [options.leading=false] 37332 * Specify invoking on the leading edge of the timeout. 37333 * @param {number} [options.maxWait] 37334 * The maximum time `func` is allowed to be delayed before it's invoked. 37335 * @param {boolean} [options.trailing=true] 37336 * Specify invoking on the trailing edge of the timeout. 37337 * @returns {Function} Returns the new debounced function. 37338 * @example 37339 * 37340 * // Avoid costly calculations while the window size is in flux. 37341 * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); 37342 * 37343 * // Invoke `sendMail` when clicked, debouncing subsequent calls. 37344 * jQuery(element).on('click', _.debounce(sendMail, 300, { 37345 * 'leading': true, 37346 * 'trailing': false 37347 * })); 37348 * 37349 * // Ensure `batchLog` is invoked once after 1 second of debounced calls. 37350 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); 37351 * var source = new EventSource('/stream'); 37352 * jQuery(source).on('message', debounced); 37353 * 37354 * // Cancel the trailing debounced invocation. 37355 * jQuery(window).on('popstate', debounced.cancel); 37356 */ 37357 function debounce(func, wait, options) { 37358 var lastArgs, 37359 lastThis, 37360 maxWait, 37361 result, 37362 timerId, 37363 lastCallTime, 37364 lastInvokeTime = 0, 37365 leading = false, 37366 maxing = false, 37367 trailing = true; 37368 37369 if (typeof func != 'function') { 37370 throw new TypeError(FUNC_ERROR_TEXT); 37371 } 37372 wait = toNumber(wait) || 0; 37373 if (isObject(options)) { 37374 leading = !!options.leading; 37375 maxing = 'maxWait' in options; 37376 maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; 37377 trailing = 'trailing' in options ? !!options.trailing : trailing; 37378 } 37379 37380 function invokeFunc(time) { 37381 var args = lastArgs, 37382 thisArg = lastThis; 37383 37384 lastArgs = lastThis = undefined; 37385 lastInvokeTime = time; 37386 result = func.apply(thisArg, args); 37387 return result; 37388 } 37389 37390 function leadingEdge(time) { 37391 // Reset any `maxWait` timer. 37392 lastInvokeTime = time; 37393 // Start the timer for the trailing edge. 37394 timerId = setTimeout(timerExpired, wait); 37395 // Invoke the leading edge. 37396 return leading ? invokeFunc(time) : result; 37397 } 37398 37399 function remainingWait(time) { 37400 var timeSinceLastCall = time - lastCallTime, 37401 timeSinceLastInvoke = time - lastInvokeTime, 37402 timeWaiting = wait - timeSinceLastCall; 37403 37404 return maxing 37405 ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) 37406 : timeWaiting; 37407 } 37408 37409 function shouldInvoke(time) { 37410 var timeSinceLastCall = time - lastCallTime, 37411 timeSinceLastInvoke = time - lastInvokeTime; 37412 37413 // Either this is the first call, activity has stopped and we're at the 37414 // trailing edge, the system time has gone backwards and we're treating 37415 // it as the trailing edge, or we've hit the `maxWait` limit. 37416 return (lastCallTime === undefined || (timeSinceLastCall >= wait) || 37417 (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); 37418 } 37419 37420 function timerExpired() { 37421 var time = now(); 37422 if (shouldInvoke(time)) { 37423 return trailingEdge(time); 37424 } 37425 // Restart the timer. 37426 timerId = setTimeout(timerExpired, remainingWait(time)); 37427 } 37428 37429 function trailingEdge(time) { 37430 timerId = undefined; 37431 37432 // Only invoke if we have `lastArgs` which means `func` has been 37433 // debounced at least once. 37434 if (trailing && lastArgs) { 37435 return invokeFunc(time); 37436 } 37437 lastArgs = lastThis = undefined; 37438 return result; 37439 } 37440 37441 function cancel() { 37442 if (timerId !== undefined) { 37443 clearTimeout(timerId); 37444 } 37445 lastInvokeTime = 0; 37446 lastArgs = lastCallTime = lastThis = timerId = undefined; 37447 } 37448 37449 function flush() { 37450 return timerId === undefined ? result : trailingEdge(now()); 37451 } 37452 37453 function debounced() { 37454 var time = now(), 37455 isInvoking = shouldInvoke(time); 37456 37457 lastArgs = arguments; 37458 lastThis = this; 37459 lastCallTime = time; 37460 37461 if (isInvoking) { 37462 if (timerId === undefined) { 37463 return leadingEdge(lastCallTime); 37464 } 37465 if (maxing) { 37466 // Handle invocations in a tight loop. 37467 clearTimeout(timerId); 37468 timerId = setTimeout(timerExpired, wait); 37469 return invokeFunc(lastCallTime); 37470 } 37471 } 37472 if (timerId === undefined) { 37473 timerId = setTimeout(timerExpired, wait); 37474 } 37475 return result; 37476 } 37477 debounced.cancel = cancel; 37478 debounced.flush = flush; 37479 return debounced; 37480 } 37481 37482 /** 37483 * Defers invoking the `func` until the current call stack has cleared. Any 37484 * additional arguments are provided to `func` when it's invoked. 37485 * 37486 * @static 37487 * @memberOf _ 37488 * @since 0.1.0 37489 * @category Function 37490 * @param {Function} func The function to defer. 37491 * @param {...*} [args] The arguments to invoke `func` with. 37492 * @returns {number} Returns the timer id. 37493 * @example 37494 * 37495 * _.defer(function(text) { 37496 * console.log(text); 37497 * }, 'deferred'); 37498 * // => Logs 'deferred' after one millisecond. 37499 */ 37500 var defer = baseRest(function(func, args) { 37501 return baseDelay(func, 1, args); 37502 }); 37503 37504 /** 37505 * Invokes `func` after `wait` milliseconds. Any additional arguments are 37506 * provided to `func` when it's invoked. 37507 * 37508 * @static 37509 * @memberOf _ 37510 * @since 0.1.0 37511 * @category Function 37512 * @param {Function} func The function to delay. 37513 * @param {number} wait The number of milliseconds to delay invocation. 37514 * @param {...*} [args] The arguments to invoke `func` with. 37515 * @returns {number} Returns the timer id. 37516 * @example 37517 * 37518 * _.delay(function(text) { 37519 * console.log(text); 37520 * }, 1000, 'later'); 37521 * // => Logs 'later' after one second. 37522 */ 37523 var delay = baseRest(function(func, wait, args) { 37524 return baseDelay(func, toNumber(wait) || 0, args); 37525 }); 37526 37527 /** 37528 * Creates a function that invokes `func` with arguments reversed. 37529 * 37530 * @static 37531 * @memberOf _ 37532 * @since 4.0.0 37533 * @category Function 37534 * @param {Function} func The function to flip arguments for. 37535 * @returns {Function} Returns the new flipped function. 37536 * @example 37537 * 37538 * var flipped = _.flip(function() { 37539 * return _.toArray(arguments); 37540 * }); 37541 * 37542 * flipped('a', 'b', 'c', 'd'); 37543 * // => ['d', 'c', 'b', 'a'] 37544 */ 37545 function flip(func) { 37546 return createWrap(func, WRAP_FLIP_FLAG); 37547 } 37548 37549 /** 37550 * Creates a function that memoizes the result of `func`. If `resolver` is 37551 * provided, it determines the cache key for storing the result based on the 37552 * arguments provided to the memoized function. By default, the first argument 37553 * provided to the memoized function is used as the map cache key. The `func` 37554 * is invoked with the `this` binding of the memoized function. 37555 * 37556 * **Note:** The cache is exposed as the `cache` property on the memoized 37557 * function. Its creation may be customized by replacing the `_.memoize.Cache` 37558 * constructor with one whose instances implement the 37559 * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) 37560 * method interface of `clear`, `delete`, `get`, `has`, and `set`. 37561 * 37562 * @static 37563 * @memberOf _ 37564 * @since 0.1.0 37565 * @category Function 37566 * @param {Function} func The function to have its output memoized. 37567 * @param {Function} [resolver] The function to resolve the cache key. 37568 * @returns {Function} Returns the new memoized function. 37569 * @example 37570 * 37571 * var object = { 'a': 1, 'b': 2 }; 37572 * var other = { 'c': 3, 'd': 4 }; 37573 * 37574 * var values = _.memoize(_.values); 37575 * values(object); 37576 * // => [1, 2] 37577 * 37578 * values(other); 37579 * // => [3, 4] 37580 * 37581 * object.a = 2; 37582 * values(object); 37583 * // => [1, 2] 37584 * 37585 * // Modify the result cache. 37586 * values.cache.set(object, ['a', 'b']); 37587 * values(object); 37588 * // => ['a', 'b'] 37589 * 37590 * // Replace `_.memoize.Cache`. 37591 * _.memoize.Cache = WeakMap; 37592 */ 37593 function memoize(func, resolver) { 37594 if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { 37595 throw new TypeError(FUNC_ERROR_TEXT); 37596 } 37597 var memoized = function() { 37598 var args = arguments, 37599 key = resolver ? resolver.apply(this, args) : args[0], 37600 cache = memoized.cache; 37601 37602 if (cache.has(key)) { 37603 return cache.get(key); 37604 } 37605 var result = func.apply(this, args); 37606 memoized.cache = cache.set(key, result) || cache; 37607 return result; 37608 }; 37609 memoized.cache = new (memoize.Cache || MapCache); 37610 return memoized; 37611 } 37612 37613 // Expose `MapCache`. 37614 memoize.Cache = MapCache; 37615 37616 /** 37617 * Creates a function that negates the result of the predicate `func`. The 37618 * `func` predicate is invoked with the `this` binding and arguments of the 37619 * created function. 37620 * 37621 * @static 37622 * @memberOf _ 37623 * @since 3.0.0 37624 * @category Function 37625 * @param {Function} predicate The predicate to negate. 37626 * @returns {Function} Returns the new negated function. 37627 * @example 37628 * 37629 * function isEven(n) { 37630 * return n % 2 == 0; 37631 * } 37632 * 37633 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); 37634 * // => [1, 3, 5] 37635 */ 37636 function negate(predicate) { 37637 if (typeof predicate != 'function') { 37638 throw new TypeError(FUNC_ERROR_TEXT); 37639 } 37640 return function() { 37641 var args = arguments; 37642 switch (args.length) { 37643 case 0: return !predicate.call(this); 37644 case 1: return !predicate.call(this, args[0]); 37645 case 2: return !predicate.call(this, args[0], args[1]); 37646 case 3: return !predicate.call(this, args[0], args[1], args[2]); 37647 } 37648 return !predicate.apply(this, args); 37649 }; 37650 } 37651 37652 /** 37653 * Creates a function that is restricted to invoking `func` once. Repeat calls 37654 * to the function return the value of the first invocation. The `func` is 37655 * invoked with the `this` binding and arguments of the created function. 37656 * 37657 * @static 37658 * @memberOf _ 37659 * @since 0.1.0 37660 * @category Function 37661 * @param {Function} func The function to restrict. 37662 * @returns {Function} Returns the new restricted function. 37663 * @example 37664 * 37665 * var initialize = _.once(createApplication); 37666 * initialize(); 37667 * initialize(); 37668 * // => `createApplication` is invoked once 37669 */ 37670 function once(func) { 37671 return before(2, func); 37672 } 37673 37674 /** 37675 * Creates a function that invokes `func` with its arguments transformed. 37676 * 37677 * @static 37678 * @since 4.0.0 37679 * @memberOf _ 37680 * @category Function 37681 * @param {Function} func The function to wrap. 37682 * @param {...(Function|Function[])} [transforms=[_.identity]] 37683 * The argument transforms. 37684 * @returns {Function} Returns the new function. 37685 * @example 37686 * 37687 * function doubled(n) { 37688 * return n * 2; 37689 * } 37690 * 37691 * function square(n) { 37692 * return n * n; 37693 * } 37694 * 37695 * var func = _.overArgs(function(x, y) { 37696 * return [x, y]; 37697 * }, [square, doubled]); 37698 * 37699 * func(9, 3); 37700 * // => [81, 6] 37701 * 37702 * func(10, 5); 37703 * // => [100, 10] 37704 */ 37705 var overArgs = castRest(function(func, transforms) { 37706 transforms = (transforms.length == 1 && isArray(transforms[0])) 37707 ? arrayMap(transforms[0], baseUnary(getIteratee())) 37708 : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); 37709 37710 var funcsLength = transforms.length; 37711 return baseRest(function(args) { 37712 var index = -1, 37713 length = nativeMin(args.length, funcsLength); 37714 37715 while (++index < length) { 37716 args[index] = transforms[index].call(this, args[index]); 37717 } 37718 return apply(func, this, args); 37719 }); 37720 }); 37721 37722 /** 37723 * Creates a function that invokes `func` with `partials` prepended to the 37724 * arguments it receives. This method is like `_.bind` except it does **not** 37725 * alter the `this` binding. 37726 * 37727 * The `_.partial.placeholder` value, which defaults to `_` in monolithic 37728 * builds, may be used as a placeholder for partially applied arguments. 37729 * 37730 * **Note:** This method doesn't set the "length" property of partially 37731 * applied functions. 37732 * 37733 * @static 37734 * @memberOf _ 37735 * @since 0.2.0 37736 * @category Function 37737 * @param {Function} func The function to partially apply arguments to. 37738 * @param {...*} [partials] The arguments to be partially applied. 37739 * @returns {Function} Returns the new partially applied function. 37740 * @example 37741 * 37742 * function greet(greeting, name) { 37743 * return greeting + ' ' + name; 37744 * } 37745 * 37746 * var sayHelloTo = _.partial(greet, 'hello'); 37747 * sayHelloTo('fred'); 37748 * // => 'hello fred' 37749 * 37750 * // Partially applied with placeholders. 37751 * var greetFred = _.partial(greet, _, 'fred'); 37752 * greetFred('hi'); 37753 * // => 'hi fred' 37754 */ 37755 var partial = baseRest(function(func, partials) { 37756 var holders = replaceHolders(partials, getHolder(partial)); 37757 return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); 37758 }); 37759 37760 /** 37761 * This method is like `_.partial` except that partially applied arguments 37762 * are appended to the arguments it receives. 37763 * 37764 * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic 37765 * builds, may be used as a placeholder for partially applied arguments. 37766 * 37767 * **Note:** This method doesn't set the "length" property of partially 37768 * applied functions. 37769 * 37770 * @static 37771 * @memberOf _ 37772 * @since 1.0.0 37773 * @category Function 37774 * @param {Function} func The function to partially apply arguments to. 37775 * @param {...*} [partials] The arguments to be partially applied. 37776 * @returns {Function} Returns the new partially applied function. 37777 * @example 37778 * 37779 * function greet(greeting, name) { 37780 * return greeting + ' ' + name; 37781 * } 37782 * 37783 * var greetFred = _.partialRight(greet, 'fred'); 37784 * greetFred('hi'); 37785 * // => 'hi fred' 37786 * 37787 * // Partially applied with placeholders. 37788 * var sayHelloTo = _.partialRight(greet, 'hello', _); 37789 * sayHelloTo('fred'); 37790 * // => 'hello fred' 37791 */ 37792 var partialRight = baseRest(function(func, partials) { 37793 var holders = replaceHolders(partials, getHolder(partialRight)); 37794 return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); 37795 }); 37796 37797 /** 37798 * Creates a function that invokes `func` with arguments arranged according 37799 * to the specified `indexes` where the argument value at the first index is 37800 * provided as the first argument, the argument value at the second index is 37801 * provided as the second argument, and so on. 37802 * 37803 * @static 37804 * @memberOf _ 37805 * @since 3.0.0 37806 * @category Function 37807 * @param {Function} func The function to rearrange arguments for. 37808 * @param {...(number|number[])} indexes The arranged argument indexes. 37809 * @returns {Function} Returns the new function. 37810 * @example 37811 * 37812 * var rearged = _.rearg(function(a, b, c) { 37813 * return [a, b, c]; 37814 * }, [2, 0, 1]); 37815 * 37816 * rearged('b', 'c', 'a') 37817 * // => ['a', 'b', 'c'] 37818 */ 37819 var rearg = flatRest(function(func, indexes) { 37820 return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); 37821 }); 37822 37823 /** 37824 * Creates a function that invokes `func` with the `this` binding of the 37825 * created function and arguments from `start` and beyond provided as 37826 * an array. 37827 * 37828 * **Note:** This method is based on the 37829 * [rest parameter](https://mdn.io/rest_parameters). 37830 * 37831 * @static 37832 * @memberOf _ 37833 * @since 4.0.0 37834 * @category Function 37835 * @param {Function} func The function to apply a rest parameter to. 37836 * @param {number} [start=func.length-1] The start position of the rest parameter. 37837 * @returns {Function} Returns the new function. 37838 * @example 37839 * 37840 * var say = _.rest(function(what, names) { 37841 * return what + ' ' + _.initial(names).join(', ') + 37842 * (_.size(names) > 1 ? ', & ' : '') + _.last(names); 37843 * }); 37844 * 37845 * say('hello', 'fred', 'barney', 'pebbles'); 37846 * // => 'hello fred, barney, & pebbles' 37847 */ 37848 function rest(func, start) { 37849 if (typeof func != 'function') { 37850 throw new TypeError(FUNC_ERROR_TEXT); 37851 } 37852 start = start === undefined ? start : toInteger(start); 37853 return baseRest(func, start); 37854 } 37855 37856 /** 37857 * Creates a function that invokes `func` with the `this` binding of the 37858 * create function and an array of arguments much like 37859 * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). 37860 * 37861 * **Note:** This method is based on the 37862 * [spread operator](https://mdn.io/spread_operator). 37863 * 37864 * @static 37865 * @memberOf _ 37866 * @since 3.2.0 37867 * @category Function 37868 * @param {Function} func The function to spread arguments over. 37869 * @param {number} [start=0] The start position of the spread. 37870 * @returns {Function} Returns the new function. 37871 * @example 37872 * 37873 * var say = _.spread(function(who, what) { 37874 * return who + ' says ' + what; 37875 * }); 37876 * 37877 * say(['fred', 'hello']); 37878 * // => 'fred says hello' 37879 * 37880 * var numbers = Promise.all([ 37881 * Promise.resolve(40), 37882 * Promise.resolve(36) 37883 * ]); 37884 * 37885 * numbers.then(_.spread(function(x, y) { 37886 * return x + y; 37887 * })); 37888 * // => a Promise of 76 37889 */ 37890 function spread(func, start) { 37891 if (typeof func != 'function') { 37892 throw new TypeError(FUNC_ERROR_TEXT); 37893 } 37894 start = start == null ? 0 : nativeMax(toInteger(start), 0); 37895 return baseRest(function(args) { 37896 var array = args[start], 37897 otherArgs = castSlice(args, 0, start); 37898 37899 if (array) { 37900 arrayPush(otherArgs, array); 37901 } 37902 return apply(func, this, otherArgs); 37903 }); 37904 } 37905 37906 /** 37907 * Creates a throttled function that only invokes `func` at most once per 37908 * every `wait` milliseconds. The throttled function comes with a `cancel` 37909 * method to cancel delayed `func` invocations and a `flush` method to 37910 * immediately invoke them. Provide `options` to indicate whether `func` 37911 * should be invoked on the leading and/or trailing edge of the `wait` 37912 * timeout. The `func` is invoked with the last arguments provided to the 37913 * throttled function. Subsequent calls to the throttled function return the 37914 * result of the last `func` invocation. 37915 * 37916 * **Note:** If `leading` and `trailing` options are `true`, `func` is 37917 * invoked on the trailing edge of the timeout only if the throttled function 37918 * is invoked more than once during the `wait` timeout. 37919 * 37920 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred 37921 * until to the next tick, similar to `setTimeout` with a timeout of `0`. 37922 * 37923 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) 37924 * for details over the differences between `_.throttle` and `_.debounce`. 37925 * 37926 * @static 37927 * @memberOf _ 37928 * @since 0.1.0 37929 * @category Function 37930 * @param {Function} func The function to throttle. 37931 * @param {number} [wait=0] The number of milliseconds to throttle invocations to. 37932 * @param {Object} [options={}] The options object. 37933 * @param {boolean} [options.leading=true] 37934 * Specify invoking on the leading edge of the timeout. 37935 * @param {boolean} [options.trailing=true] 37936 * Specify invoking on the trailing edge of the timeout. 37937 * @returns {Function} Returns the new throttled function. 37938 * @example 37939 * 37940 * // Avoid excessively updating the position while scrolling. 37941 * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); 37942 * 37943 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. 37944 * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); 37945 * jQuery(element).on('click', throttled); 37946 * 37947 * // Cancel the trailing throttled invocation. 37948 * jQuery(window).on('popstate', throttled.cancel); 37949 */ 37950 function throttle(func, wait, options) { 37951 var leading = true, 37952 trailing = true; 37953 37954 if (typeof func != 'function') { 37955 throw new TypeError(FUNC_ERROR_TEXT); 37956 } 37957 if (isObject(options)) { 37958 leading = 'leading' in options ? !!options.leading : leading; 37959 trailing = 'trailing' in options ? !!options.trailing : trailing; 37960 } 37961 return debounce(func, wait, { 37962 'leading': leading, 37963 'maxWait': wait, 37964 'trailing': trailing 37965 }); 37966 } 37967 37968 /** 37969 * Creates a function that accepts up to one argument, ignoring any 37970 * additional arguments. 37971 * 37972 * @static 37973 * @memberOf _ 37974 * @since 4.0.0 37975 * @category Function 37976 * @param {Function} func The function to cap arguments for. 37977 * @returns {Function} Returns the new capped function. 37978 * @example 37979 * 37980 * _.map(['6', '8', '10'], _.unary(parseInt)); 37981 * // => [6, 8, 10] 37982 */ 37983 function unary(func) { 37984 return ary(func, 1); 37985 } 37986 37987 /** 37988 * Creates a function that provides `value` to `wrapper` as its first 37989 * argument. Any additional arguments provided to the function are appended 37990 * to those provided to the `wrapper`. The wrapper is invoked with the `this` 37991 * binding of the created function. 37992 * 37993 * @static 37994 * @memberOf _ 37995 * @since 0.1.0 37996 * @category Function 37997 * @param {*} value The value to wrap. 37998 * @param {Function} [wrapper=identity] The wrapper function. 37999 * @returns {Function} Returns the new function. 38000 * @example 38001 * 38002 * var p = _.wrap(_.escape, function(func, text) { 38003 * return '<p>' + func(text) + '</p>'; 38004 * }); 38005 * 38006 * p('fred, barney, & pebbles'); 38007 * // => '<p>fred, barney, & pebbles</p>' 38008 */ 38009 function wrap(value, wrapper) { 38010 return partial(castFunction(wrapper), value); 38011 } 38012 38013 /*------------------------------------------------------------------------*/ 38014 38015 /** 38016 * Casts `value` as an array if it's not one. 38017 * 38018 * @static 38019 * @memberOf _ 38020 * @since 4.4.0 38021 * @category Lang 38022 * @param {*} value The value to inspect. 38023 * @returns {Array} Returns the cast array. 38024 * @example 38025 * 38026 * _.castArray(1); 38027 * // => [1] 38028 * 38029 * _.castArray({ 'a': 1 }); 38030 * // => [{ 'a': 1 }] 38031 * 38032 * _.castArray('abc'); 38033 * // => ['abc'] 38034 * 38035 * _.castArray(null); 38036 * // => [null] 38037 * 38038 * _.castArray(undefined); 38039 * // => [undefined] 38040 * 38041 * _.castArray(); 38042 * // => [] 38043 * 38044 * var array = [1, 2, 3]; 38045 * console.log(_.castArray(array) === array); 38046 * // => true 38047 */ 38048 function castArray() { 38049 if (!arguments.length) { 38050 return []; 38051 } 38052 var value = arguments[0]; 38053 return isArray(value) ? value : [value]; 38054 } 38055 38056 /** 38057 * Creates a shallow clone of `value`. 38058 * 38059 * **Note:** This method is loosely based on the 38060 * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) 38061 * and supports cloning arrays, array buffers, booleans, date objects, maps, 38062 * numbers, `Object` objects, regexes, sets, strings, symbols, and typed 38063 * arrays. The own enumerable properties of `arguments` objects are cloned 38064 * as plain objects. An empty object is returned for uncloneable values such 38065 * as error objects, functions, DOM nodes, and WeakMaps. 38066 * 38067 * @static 38068 * @memberOf _ 38069 * @since 0.1.0 38070 * @category Lang 38071 * @param {*} value The value to clone. 38072 * @returns {*} Returns the cloned value. 38073 * @see _.cloneDeep 38074 * @example 38075 * 38076 * var objects = [{ 'a': 1 }, { 'b': 2 }]; 38077 * 38078 * var shallow = _.clone(objects); 38079 * console.log(shallow[0] === objects[0]); 38080 * // => true 38081 */ 38082 function clone(value) { 38083 return baseClone(value, CLONE_SYMBOLS_FLAG); 38084 } 38085 38086 /** 38087 * This method is like `_.clone` except that it accepts `customizer` which 38088 * is invoked to produce the cloned value. If `customizer` returns `undefined`, 38089 * cloning is handled by the method instead. The `customizer` is invoked with 38090 * up to four arguments; (value [, index|key, object, stack]). 38091 * 38092 * @static 38093 * @memberOf _ 38094 * @since 4.0.0 38095 * @category Lang 38096 * @param {*} value The value to clone. 38097 * @param {Function} [customizer] The function to customize cloning. 38098 * @returns {*} Returns the cloned value. 38099 * @see _.cloneDeepWith 38100 * @example 38101 * 38102 * function customizer(value) { 38103 * if (_.isElement(value)) { 38104 * return value.cloneNode(false); 38105 * } 38106 * } 38107 * 38108 * var el = _.cloneWith(document.body, customizer); 38109 * 38110 * console.log(el === document.body); 38111 * // => false 38112 * console.log(el.nodeName); 38113 * // => 'BODY' 38114 * console.log(el.childNodes.length); 38115 * // => 0 38116 */ 38117 function cloneWith(value, customizer) { 38118 customizer = typeof customizer == 'function' ? customizer : undefined; 38119 return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); 38120 } 38121 38122 /** 38123 * This method is like `_.clone` except that it recursively clones `value`. 38124 * 38125 * @static 38126 * @memberOf _ 38127 * @since 1.0.0 38128 * @category Lang 38129 * @param {*} value The value to recursively clone. 38130 * @returns {*} Returns the deep cloned value. 38131 * @see _.clone 38132 * @example 38133 * 38134 * var objects = [{ 'a': 1 }, { 'b': 2 }]; 38135 * 38136 * var deep = _.cloneDeep(objects); 38137 * console.log(deep[0] === objects[0]); 38138 * // => false 38139 */ 38140 function cloneDeep(value) { 38141 return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); 38142 } 38143 38144 /** 38145 * This method is like `_.cloneWith` except that it recursively clones `value`. 38146 * 38147 * @static 38148 * @memberOf _ 38149 * @since 4.0.0 38150 * @category Lang 38151 * @param {*} value The value to recursively clone. 38152 * @param {Function} [customizer] The function to customize cloning. 38153 * @returns {*} Returns the deep cloned value. 38154 * @see _.cloneWith 38155 * @example 38156 * 38157 * function customizer(value) { 38158 * if (_.isElement(value)) { 38159 * return value.cloneNode(true); 38160 * } 38161 * } 38162 * 38163 * var el = _.cloneDeepWith(document.body, customizer); 38164 * 38165 * console.log(el === document.body); 38166 * // => false 38167 * console.log(el.nodeName); 38168 * // => 'BODY' 38169 * console.log(el.childNodes.length); 38170 * // => 20 38171 */ 38172 function cloneDeepWith(value, customizer) { 38173 customizer = typeof customizer == 'function' ? customizer : undefined; 38174 return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); 38175 } 38176 38177 /** 38178 * Checks if `object` conforms to `source` by invoking the predicate 38179 * properties of `source` with the corresponding property values of `object`. 38180 * 38181 * **Note:** This method is equivalent to `_.conforms` when `source` is 38182 * partially applied. 38183 * 38184 * @static 38185 * @memberOf _ 38186 * @since 4.14.0 38187 * @category Lang 38188 * @param {Object} object The object to inspect. 38189 * @param {Object} source The object of property predicates to conform to. 38190 * @returns {boolean} Returns `true` if `object` conforms, else `false`. 38191 * @example 38192 * 38193 * var object = { 'a': 1, 'b': 2 }; 38194 * 38195 * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); 38196 * // => true 38197 * 38198 * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); 38199 * // => false 38200 */ 38201 function conformsTo(object, source) { 38202 return source == null || baseConformsTo(object, source, keys(source)); 38203 } 38204 38205 /** 38206 * Performs a 38207 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) 38208 * comparison between two values to determine if they are equivalent. 38209 * 38210 * @static 38211 * @memberOf _ 38212 * @since 4.0.0 38213 * @category Lang 38214 * @param {*} value The value to compare. 38215 * @param {*} other The other value to compare. 38216 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. 38217 * @example 38218 * 38219 * var object = { 'a': 1 }; 38220 * var other = { 'a': 1 }; 38221 * 38222 * _.eq(object, object); 38223 * // => true 38224 * 38225 * _.eq(object, other); 38226 * // => false 38227 * 38228 * _.eq('a', 'a'); 38229 * // => true 38230 * 38231 * _.eq('a', Object('a')); 38232 * // => false 38233 * 38234 * _.eq(NaN, NaN); 38235 * // => true 38236 */ 38237 function eq(value, other) { 38238 return value === other || (value !== value && other !== other); 38239 } 38240 38241 /** 38242 * Checks if `value` is greater than `other`. 38243 * 38244 * @static 38245 * @memberOf _ 38246 * @since 3.9.0 38247 * @category Lang 38248 * @param {*} value The value to compare. 38249 * @param {*} other The other value to compare. 38250 * @returns {boolean} Returns `true` if `value` is greater than `other`, 38251 * else `false`. 38252 * @see _.lt 38253 * @example 38254 * 38255 * _.gt(3, 1); 38256 * // => true 38257 * 38258 * _.gt(3, 3); 38259 * // => false 38260 * 38261 * _.gt(1, 3); 38262 * // => false 38263 */ 38264 var gt = createRelationalOperation(baseGt); 38265 38266 /** 38267 * Checks if `value` is greater than or equal to `other`. 38268 * 38269 * @static 38270 * @memberOf _ 38271 * @since 3.9.0 38272 * @category Lang 38273 * @param {*} value The value to compare. 38274 * @param {*} other The other value to compare. 38275 * @returns {boolean} Returns `true` if `value` is greater than or equal to 38276 * `other`, else `false`. 38277 * @see _.lte 38278 * @example 38279 * 38280 * _.gte(3, 1); 38281 * // => true 38282 * 38283 * _.gte(3, 3); 38284 * // => true 38285 * 38286 * _.gte(1, 3); 38287 * // => false 38288 */ 38289 var gte = createRelationalOperation(function(value, other) { 38290 return value >= other; 38291 }); 38292 38293 /** 38294 * Checks if `value` is likely an `arguments` object. 38295 * 38296 * @static 38297 * @memberOf _ 38298 * @since 0.1.0 38299 * @category Lang 38300 * @param {*} value The value to check. 38301 * @returns {boolean} Returns `true` if `value` is an `arguments` object, 38302 * else `false`. 38303 * @example 38304 * 38305 * _.isArguments(function() { return arguments; }()); 38306 * // => true 38307 * 38308 * _.isArguments([1, 2, 3]); 38309 * // => false 38310 */ 38311 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { 38312 return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && 38313 !propertyIsEnumerable.call(value, 'callee'); 38314 }; 38315 38316 /** 38317 * Checks if `value` is classified as an `Array` object. 38318 * 38319 * @static 38320 * @memberOf _ 38321 * @since 0.1.0 38322 * @category Lang 38323 * @param {*} value The value to check. 38324 * @returns {boolean} Returns `true` if `value` is an array, else `false`. 38325 * @example 38326 * 38327 * _.isArray([1, 2, 3]); 38328 * // => true 38329 * 38330 * _.isArray(document.body.children); 38331 * // => false 38332 * 38333 * _.isArray('abc'); 38334 * // => false 38335 * 38336 * _.isArray(_.noop); 38337 * // => false 38338 */ 38339 var isArray = Array.isArray; 38340 38341 /** 38342 * Checks if `value` is classified as an `ArrayBuffer` object. 38343 * 38344 * @static 38345 * @memberOf _ 38346 * @since 4.3.0 38347 * @category Lang 38348 * @param {*} value The value to check. 38349 * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. 38350 * @example 38351 * 38352 * _.isArrayBuffer(new ArrayBuffer(2)); 38353 * // => true 38354 * 38355 * _.isArrayBuffer(new Array(2)); 38356 * // => false 38357 */ 38358 var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; 38359 38360 /** 38361 * Checks if `value` is array-like. A value is considered array-like if it's 38362 * not a function and has a `value.length` that's an integer greater than or 38363 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. 38364 * 38365 * @static 38366 * @memberOf _ 38367 * @since 4.0.0 38368 * @category Lang 38369 * @param {*} value The value to check. 38370 * @returns {boolean} Returns `true` if `value` is array-like, else `false`. 38371 * @example 38372 * 38373 * _.isArrayLike([1, 2, 3]); 38374 * // => true 38375 * 38376 * _.isArrayLike(document.body.children); 38377 * // => true 38378 * 38379 * _.isArrayLike('abc'); 38380 * // => true 38381 * 38382 * _.isArrayLike(_.noop); 38383 * // => false 38384 */ 38385 function isArrayLike(value) { 38386 return value != null && isLength(value.length) && !isFunction(value); 38387 } 38388 38389 /** 38390 * This method is like `_.isArrayLike` except that it also checks if `value` 38391 * is an object. 38392 * 38393 * @static 38394 * @memberOf _ 38395 * @since 4.0.0 38396 * @category Lang 38397 * @param {*} value The value to check. 38398 * @returns {boolean} Returns `true` if `value` is an array-like object, 38399 * else `false`. 38400 * @example 38401 * 38402 * _.isArrayLikeObject([1, 2, 3]); 38403 * // => true 38404 * 38405 * _.isArrayLikeObject(document.body.children); 38406 * // => true 38407 * 38408 * _.isArrayLikeObject('abc'); 38409 * // => false 38410 * 38411 * _.isArrayLikeObject(_.noop); 38412 * // => false 38413 */ 38414 function isArrayLikeObject(value) { 38415 return isObjectLike(value) && isArrayLike(value); 38416 } 38417 38418 /** 38419 * Checks if `value` is classified as a boolean primitive or object. 38420 * 38421 * @static 38422 * @memberOf _ 38423 * @since 0.1.0 38424 * @category Lang 38425 * @param {*} value The value to check. 38426 * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. 38427 * @example 38428 * 38429 * _.isBoolean(false); 38430 * // => true 38431 * 38432 * _.isBoolean(null); 38433 * // => false 38434 */ 38435 function isBoolean(value) { 38436 return value === true || value === false || 38437 (isObjectLike(value) && baseGetTag(value) == boolTag); 38438 } 38439 38440 /** 38441 * Checks if `value` is a buffer. 38442 * 38443 * @static 38444 * @memberOf _ 38445 * @since 4.3.0 38446 * @category Lang 38447 * @param {*} value The value to check. 38448 * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. 38449 * @example 38450 * 38451 * _.isBuffer(new Buffer(2)); 38452 * // => true 38453 * 38454 * _.isBuffer(new Uint8Array(2)); 38455 * // => false 38456 */ 38457 var isBuffer = nativeIsBuffer || stubFalse; 38458 38459 /** 38460 * Checks if `value` is classified as a `Date` object. 38461 * 38462 * @static 38463 * @memberOf _ 38464 * @since 0.1.0 38465 * @category Lang 38466 * @param {*} value The value to check. 38467 * @returns {boolean} Returns `true` if `value` is a date object, else `false`. 38468 * @example 38469 * 38470 * _.isDate(new Date); 38471 * // => true 38472 * 38473 * _.isDate('Mon April 23 2012'); 38474 * // => false 38475 */ 38476 var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; 38477 38478 /** 38479 * Checks if `value` is likely a DOM element. 38480 * 38481 * @static 38482 * @memberOf _ 38483 * @since 0.1.0 38484 * @category Lang 38485 * @param {*} value The value to check. 38486 * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. 38487 * @example 38488 * 38489 * _.isElement(document.body); 38490 * // => true 38491 * 38492 * _.isElement('<body>'); 38493 * // => false 38494 */ 38495 function isElement(value) { 38496 return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); 38497 } 38498 38499 /** 38500 * Checks if `value` is an empty object, collection, map, or set. 38501 * 38502 * Objects are considered empty if they have no own enumerable string keyed 38503 * properties. 38504 * 38505 * Array-like values such as `arguments` objects, arrays, buffers, strings, or 38506 * jQuery-like collections are considered empty if they have a `length` of `0`. 38507 * Similarly, maps and sets are considered empty if they have a `size` of `0`. 38508 * 38509 * @static 38510 * @memberOf _ 38511 * @since 0.1.0 38512 * @category Lang 38513 * @param {*} value The value to check. 38514 * @returns {boolean} Returns `true` if `value` is empty, else `false`. 38515 * @example 38516 * 38517 * _.isEmpty(null); 38518 * // => true 38519 * 38520 * _.isEmpty(true); 38521 * // => true 38522 * 38523 * _.isEmpty(1); 38524 * // => true 38525 * 38526 * _.isEmpty([1, 2, 3]); 38527 * // => false 38528 * 38529 * _.isEmpty({ 'a': 1 }); 38530 * // => false 38531 */ 38532 function isEmpty(value) { 38533 if (value == null) { 38534 return true; 38535 } 38536 if (isArrayLike(value) && 38537 (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || 38538 isBuffer(value) || isTypedArray(value) || isArguments(value))) { 38539 return !value.length; 38540 } 38541 var tag = getTag(value); 38542 if (tag == mapTag || tag == setTag) { 38543 return !value.size; 38544 } 38545 if (isPrototype(value)) { 38546 return !baseKeys(value).length; 38547 } 38548 for (var key in value) { 38549 if (hasOwnProperty.call(value, key)) { 38550 return false; 38551 } 38552 } 38553 return true; 38554 } 38555 38556 /** 38557 * Performs a deep comparison between two values to determine if they are 38558 * equivalent. 38559 * 38560 * **Note:** This method supports comparing arrays, array buffers, booleans, 38561 * date objects, error objects, maps, numbers, `Object` objects, regexes, 38562 * sets, strings, symbols, and typed arrays. `Object` objects are compared 38563 * by their own, not inherited, enumerable properties. Functions and DOM 38564 * nodes are compared by strict equality, i.e. `===`. 38565 * 38566 * @static 38567 * @memberOf _ 38568 * @since 0.1.0 38569 * @category Lang 38570 * @param {*} value The value to compare. 38571 * @param {*} other The other value to compare. 38572 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. 38573 * @example 38574 * 38575 * var object = { 'a': 1 }; 38576 * var other = { 'a': 1 }; 38577 * 38578 * _.isEqual(object, other); 38579 * // => true 38580 * 38581 * object === other; 38582 * // => false 38583 */ 38584 function isEqual(value, other) { 38585 return baseIsEqual(value, other); 38586 } 38587 38588 /** 38589 * This method is like `_.isEqual` except that it accepts `customizer` which 38590 * is invoked to compare values. If `customizer` returns `undefined`, comparisons 38591 * are handled by the method instead. The `customizer` is invoked with up to 38592 * six arguments: (objValue, othValue [, index|key, object, other, stack]). 38593 * 38594 * @static 38595 * @memberOf _ 38596 * @since 4.0.0 38597 * @category Lang 38598 * @param {*} value The value to compare. 38599 * @param {*} other The other value to compare. 38600 * @param {Function} [customizer] The function to customize comparisons. 38601 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. 38602 * @example 38603 * 38604 * function isGreeting(value) { 38605 * return /^h(?:i|ello)$/.test(value); 38606 * } 38607 * 38608 * function customizer(objValue, othValue) { 38609 * if (isGreeting(objValue) && isGreeting(othValue)) { 38610 * return true; 38611 * } 38612 * } 38613 * 38614 * var array = ['hello', 'goodbye']; 38615 * var other = ['hi', 'goodbye']; 38616 * 38617 * _.isEqualWith(array, other, customizer); 38618 * // => true 38619 */ 38620 function isEqualWith(value, other, customizer) { 38621 customizer = typeof customizer == 'function' ? customizer : undefined; 38622 var result = customizer ? customizer(value, other) : undefined; 38623 return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; 38624 } 38625 38626 /** 38627 * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, 38628 * `SyntaxError`, `TypeError`, or `URIError` object. 38629 * 38630 * @static 38631 * @memberOf _ 38632 * @since 3.0.0 38633 * @category Lang 38634 * @param {*} value The value to check. 38635 * @returns {boolean} Returns `true` if `value` is an error object, else `false`. 38636 * @example 38637 * 38638 * _.isError(new Error); 38639 * // => true 38640 * 38641 * _.isError(Error); 38642 * // => false 38643 */ 38644 function isError(value) { 38645 if (!isObjectLike(value)) { 38646 return false; 38647 } 38648 var tag = baseGetTag(value); 38649 return tag == errorTag || tag == domExcTag || 38650 (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); 38651 } 38652 38653 /** 38654 * Checks if `value` is a finite primitive number. 38655 * 38656 * **Note:** This method is based on 38657 * [`Number.isFinite`](https://mdn.io/Number/isFinite). 38658 * 38659 * @static 38660 * @memberOf _ 38661 * @since 0.1.0 38662 * @category Lang 38663 * @param {*} value The value to check. 38664 * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. 38665 * @example 38666 * 38667 * _.isFinite(3); 38668 * // => true 38669 * 38670 * _.isFinite(Number.MIN_VALUE); 38671 * // => true 38672 * 38673 * _.isFinite(Infinity); 38674 * // => false 38675 * 38676 * _.isFinite('3'); 38677 * // => false 38678 */ 38679 function isFinite(value) { 38680 return typeof value == 'number' && nativeIsFinite(value); 38681 } 38682 38683 /** 38684 * Checks if `value` is classified as a `Function` object. 38685 * 38686 * @static 38687 * @memberOf _ 38688 * @since 0.1.0 38689 * @category Lang 38690 * @param {*} value The value to check. 38691 * @returns {boolean} Returns `true` if `value` is a function, else `false`. 38692 * @example 38693 * 38694 * _.isFunction(_); 38695 * // => true 38696 * 38697 * _.isFunction(/abc/); 38698 * // => false 38699 */ 38700 function isFunction(value) { 38701 if (!isObject(value)) { 38702 return false; 38703 } 38704 // The use of `Object#toString` avoids issues with the `typeof` operator 38705 // in Safari 9 which returns 'object' for typed arrays and other constructors. 38706 var tag = baseGetTag(value); 38707 return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; 38708 } 38709 38710 /** 38711 * Checks if `value` is an integer. 38712 * 38713 * **Note:** This method is based on 38714 * [`Number.isInteger`](https://mdn.io/Number/isInteger). 38715 * 38716 * @static 38717 * @memberOf _ 38718 * @since 4.0.0 38719 * @category Lang 38720 * @param {*} value The value to check. 38721 * @returns {boolean} Returns `true` if `value` is an integer, else `false`. 38722 * @example 38723 * 38724 * _.isInteger(3); 38725 * // => true 38726 * 38727 * _.isInteger(Number.MIN_VALUE); 38728 * // => false 38729 * 38730 * _.isInteger(Infinity); 38731 * // => false 38732 * 38733 * _.isInteger('3'); 38734 * // => false 38735 */ 38736 function isInteger(value) { 38737 return typeof value == 'number' && value == toInteger(value); 38738 } 38739 38740 /** 38741 * Checks if `value` is a valid array-like length. 38742 * 38743 * **Note:** This method is loosely based on 38744 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). 38745 * 38746 * @static 38747 * @memberOf _ 38748 * @since 4.0.0 38749 * @category Lang 38750 * @param {*} value The value to check. 38751 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. 38752 * @example 38753 * 38754 * _.isLength(3); 38755 * // => true 38756 * 38757 * _.isLength(Number.MIN_VALUE); 38758 * // => false 38759 * 38760 * _.isLength(Infinity); 38761 * // => false 38762 * 38763 * _.isLength('3'); 38764 * // => false 38765 */ 38766 function isLength(value) { 38767 return typeof value == 'number' && 38768 value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; 38769 } 38770 38771 /** 38772 * Checks if `value` is the 38773 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) 38774 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) 38775 * 38776 * @static 38777 * @memberOf _ 38778 * @since 0.1.0 38779 * @category Lang 38780 * @param {*} value The value to check. 38781 * @returns {boolean} Returns `true` if `value` is an object, else `false`. 38782 * @example 38783 * 38784 * _.isObject({}); 38785 * // => true 38786 * 38787 * _.isObject([1, 2, 3]); 38788 * // => true 38789 * 38790 * _.isObject(_.noop); 38791 * // => true 38792 * 38793 * _.isObject(null); 38794 * // => false 38795 */ 38796 function isObject(value) { 38797 var type = typeof value; 38798 return value != null && (type == 'object' || type == 'function'); 38799 } 38800 38801 /** 38802 * Checks if `value` is object-like. A value is object-like if it's not `null` 38803 * and has a `typeof` result of "object". 38804 * 38805 * @static 38806 * @memberOf _ 38807 * @since 4.0.0 38808 * @category Lang 38809 * @param {*} value The value to check. 38810 * @returns {boolean} Returns `true` if `value` is object-like, else `false`. 38811 * @example 38812 * 38813 * _.isObjectLike({}); 38814 * // => true 38815 * 38816 * _.isObjectLike([1, 2, 3]); 38817 * // => true 38818 * 38819 * _.isObjectLike(_.noop); 38820 * // => false 38821 * 38822 * _.isObjectLike(null); 38823 * // => false 38824 */ 38825 function isObjectLike(value) { 38826 return value != null && typeof value == 'object'; 38827 } 38828 38829 /** 38830 * Checks if `value` is classified as a `Map` object. 38831 * 38832 * @static 38833 * @memberOf _ 38834 * @since 4.3.0 38835 * @category Lang 38836 * @param {*} value The value to check. 38837 * @returns {boolean} Returns `true` if `value` is a map, else `false`. 38838 * @example 38839 * 38840 * _.isMap(new Map); 38841 * // => true 38842 * 38843 * _.isMap(new WeakMap); 38844 * // => false 38845 */ 38846 var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; 38847 38848 /** 38849 * Performs a partial deep comparison between `object` and `source` to 38850 * determine if `object` contains equivalent property values. 38851 * 38852 * **Note:** This method is equivalent to `_.matches` when `source` is 38853 * partially applied. 38854 * 38855 * Partial comparisons will match empty array and empty object `source` 38856 * values against any array or object value, respectively. See `_.isEqual` 38857 * for a list of supported value comparisons. 38858 * 38859 * @static 38860 * @memberOf _ 38861 * @since 3.0.0 38862 * @category Lang 38863 * @param {Object} object The object to inspect. 38864 * @param {Object} source The object of property values to match. 38865 * @returns {boolean} Returns `true` if `object` is a match, else `false`. 38866 * @example 38867 * 38868 * var object = { 'a': 1, 'b': 2 }; 38869 * 38870 * _.isMatch(object, { 'b': 2 }); 38871 * // => true 38872 * 38873 * _.isMatch(object, { 'b': 1 }); 38874 * // => false 38875 */ 38876 function isMatch(object, source) { 38877 return object === source || baseIsMatch(object, source, getMatchData(source)); 38878 } 38879 38880 /** 38881 * This method is like `_.isMatch` except that it accepts `customizer` which 38882 * is invoked to compare values. If `customizer` returns `undefined`, comparisons 38883 * are handled by the method instead. The `customizer` is invoked with five 38884 * arguments: (objValue, srcValue, index|key, object, source). 38885 * 38886 * @static 38887 * @memberOf _ 38888 * @since 4.0.0 38889 * @category Lang 38890 * @param {Object} object The object to inspect. 38891 * @param {Object} source The object of property values to match. 38892 * @param {Function} [customizer] The function to customize comparisons. 38893 * @returns {boolean} Returns `true` if `object` is a match, else `false`. 38894 * @example 38895 * 38896 * function isGreeting(value) { 38897 * return /^h(?:i|ello)$/.test(value); 38898 * } 38899 * 38900 * function customizer(objValue, srcValue) { 38901 * if (isGreeting(objValue) && isGreeting(srcValue)) { 38902 * return true; 38903 * } 38904 * } 38905 * 38906 * var object = { 'greeting': 'hello' }; 38907 * var source = { 'greeting': 'hi' }; 38908 * 38909 * _.isMatchWith(object, source, customizer); 38910 * // => true 38911 */ 38912 function isMatchWith(object, source, customizer) { 38913 customizer = typeof customizer == 'function' ? customizer : undefined; 38914 return baseIsMatch(object, source, getMatchData(source), customizer); 38915 } 38916 38917 /** 38918 * Checks if `value` is `NaN`. 38919 * 38920 * **Note:** This method is based on 38921 * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as 38922 * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for 38923 * `undefined` and other non-number values. 38924 * 38925 * @static 38926 * @memberOf _ 38927 * @since 0.1.0 38928 * @category Lang 38929 * @param {*} value The value to check. 38930 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. 38931 * @example 38932 * 38933 * _.isNaN(NaN); 38934 * // => true 38935 * 38936 * _.isNaN(new Number(NaN)); 38937 * // => true 38938 * 38939 * isNaN(undefined); 38940 * // => true 38941 * 38942 * _.isNaN(undefined); 38943 * // => false 38944 */ 38945 function isNaN(value) { 38946 // An `NaN` primitive is the only value that is not equal to itself. 38947 // Perform the `toStringTag` check first to avoid errors with some 38948 // ActiveX objects in IE. 38949 return isNumber(value) && value != +value; 38950 } 38951 38952 /** 38953 * Checks if `value` is a pristine native function. 38954 * 38955 * **Note:** This method can't reliably detect native functions in the presence 38956 * of the core-js package because core-js circumvents this kind of detection. 38957 * Despite multiple requests, the core-js maintainer has made it clear: any 38958 * attempt to fix the detection will be obstructed. As a result, we're left 38959 * with little choice but to throw an error. Unfortunately, this also affects 38960 * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), 38961 * which rely on core-js. 38962 * 38963 * @static 38964 * @memberOf _ 38965 * @since 3.0.0 38966 * @category Lang 38967 * @param {*} value The value to check. 38968 * @returns {boolean} Returns `true` if `value` is a native function, 38969 * else `false`. 38970 * @example 38971 * 38972 * _.isNative(Array.prototype.push); 38973 * // => true 38974 * 38975 * _.isNative(_); 38976 * // => false 38977 */ 38978 function isNative(value) { 38979 if (isMaskable(value)) { 38980 throw new Error(CORE_ERROR_TEXT); 38981 } 38982 return baseIsNative(value); 38983 } 38984 38985 /** 38986 * Checks if `value` is `null`. 38987 * 38988 * @static 38989 * @memberOf _ 38990 * @since 0.1.0 38991 * @category Lang 38992 * @param {*} value The value to check. 38993 * @returns {boolean} Returns `true` if `value` is `null`, else `false`. 38994 * @example 38995 * 38996 * _.isNull(null); 38997 * // => true 38998 * 38999 * _.isNull(void 0); 39000 * // => false 39001 */ 39002 function isNull(value) { 39003 return value === null; 39004 } 39005 39006 /** 39007 * Checks if `value` is `null` or `undefined`. 39008 * 39009 * @static 39010 * @memberOf _ 39011 * @since 4.0.0 39012 * @category Lang 39013 * @param {*} value The value to check. 39014 * @returns {boolean} Returns `true` if `value` is nullish, else `false`. 39015 * @example 39016 * 39017 * _.isNil(null); 39018 * // => true 39019 * 39020 * _.isNil(void 0); 39021 * // => true 39022 * 39023 * _.isNil(NaN); 39024 * // => false 39025 */ 39026 function isNil(value) { 39027 return value == null; 39028 } 39029 39030 /** 39031 * Checks if `value` is classified as a `Number` primitive or object. 39032 * 39033 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are 39034 * classified as numbers, use the `_.isFinite` method. 39035 * 39036 * @static 39037 * @memberOf _ 39038 * @since 0.1.0 39039 * @category Lang 39040 * @param {*} value The value to check. 39041 * @returns {boolean} Returns `true` if `value` is a number, else `false`. 39042 * @example 39043 * 39044 * _.isNumber(3); 39045 * // => true 39046 * 39047 * _.isNumber(Number.MIN_VALUE); 39048 * // => true 39049 * 39050 * _.isNumber(Infinity); 39051 * // => true 39052 * 39053 * _.isNumber('3'); 39054 * // => false 39055 */ 39056 function isNumber(value) { 39057 return typeof value == 'number' || 39058 (isObjectLike(value) && baseGetTag(value) == numberTag); 39059 } 39060 39061 /** 39062 * Checks if `value` is a plain object, that is, an object created by the 39063 * `Object` constructor or one with a `[[Prototype]]` of `null`. 39064 * 39065 * @static 39066 * @memberOf _ 39067 * @since 0.8.0 39068 * @category Lang 39069 * @param {*} value The value to check. 39070 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. 39071 * @example 39072 * 39073 * function Foo() { 39074 * this.a = 1; 39075 * } 39076 * 39077 * _.isPlainObject(new Foo); 39078 * // => false 39079 * 39080 * _.isPlainObject([1, 2, 3]); 39081 * // => false 39082 * 39083 * _.isPlainObject({ 'x': 0, 'y': 0 }); 39084 * // => true 39085 * 39086 * _.isPlainObject(Object.create(null)); 39087 * // => true 39088 */ 39089 function isPlainObject(value) { 39090 if (!isObjectLike(value) || baseGetTag(value) != objectTag) { 39091 return false; 39092 } 39093 var proto = getPrototype(value); 39094 if (proto === null) { 39095 return true; 39096 } 39097 var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; 39098 return typeof Ctor == 'function' && Ctor instanceof Ctor && 39099 funcToString.call(Ctor) == objectCtorString; 39100 } 39101 39102 /** 39103 * Checks if `value` is classified as a `RegExp` object. 39104 * 39105 * @static 39106 * @memberOf _ 39107 * @since 0.1.0 39108 * @category Lang 39109 * @param {*} value The value to check. 39110 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. 39111 * @example 39112 * 39113 * _.isRegExp(/abc/); 39114 * // => true 39115 * 39116 * _.isRegExp('/abc/'); 39117 * // => false 39118 */ 39119 var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; 39120 39121 /** 39122 * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 39123 * double precision number which isn't the result of a rounded unsafe integer. 39124 * 39125 * **Note:** This method is based on 39126 * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). 39127 * 39128 * @static 39129 * @memberOf _ 39130 * @since 4.0.0 39131 * @category Lang 39132 * @param {*} value The value to check. 39133 * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. 39134 * @example 39135 * 39136 * _.isSafeInteger(3); 39137 * // => true 39138 * 39139 * _.isSafeInteger(Number.MIN_VALUE); 39140 * // => false 39141 * 39142 * _.isSafeInteger(Infinity); 39143 * // => false 39144 * 39145 * _.isSafeInteger('3'); 39146 * // => false 39147 */ 39148 function isSafeInteger(value) { 39149 return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; 39150 } 39151 39152 /** 39153 * Checks if `value` is classified as a `Set` object. 39154 * 39155 * @static 39156 * @memberOf _ 39157 * @since 4.3.0 39158 * @category Lang 39159 * @param {*} value The value to check. 39160 * @returns {boolean} Returns `true` if `value` is a set, else `false`. 39161 * @example 39162 * 39163 * _.isSet(new Set); 39164 * // => true 39165 * 39166 * _.isSet(new WeakSet); 39167 * // => false 39168 */ 39169 var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; 39170 39171 /** 39172 * Checks if `value` is classified as a `String` primitive or object. 39173 * 39174 * @static 39175 * @since 0.1.0 39176 * @memberOf _ 39177 * @category Lang 39178 * @param {*} value The value to check. 39179 * @returns {boolean} Returns `true` if `value` is a string, else `false`. 39180 * @example 39181 * 39182 * _.isString('abc'); 39183 * // => true 39184 * 39185 * _.isString(1); 39186 * // => false 39187 */ 39188 function isString(value) { 39189 return typeof value == 'string' || 39190 (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); 39191 } 39192 39193 /** 39194 * Checks if `value` is classified as a `Symbol` primitive or object. 39195 * 39196 * @static 39197 * @memberOf _ 39198 * @since 4.0.0 39199 * @category Lang 39200 * @param {*} value The value to check. 39201 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. 39202 * @example 39203 * 39204 * _.isSymbol(Symbol.iterator); 39205 * // => true 39206 * 39207 * _.isSymbol('abc'); 39208 * // => false 39209 */ 39210 function isSymbol(value) { 39211 return typeof value == 'symbol' || 39212 (isObjectLike(value) && baseGetTag(value) == symbolTag); 39213 } 39214 39215 /** 39216 * Checks if `value` is classified as a typed array. 39217 * 39218 * @static 39219 * @memberOf _ 39220 * @since 3.0.0 39221 * @category Lang 39222 * @param {*} value The value to check. 39223 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. 39224 * @example 39225 * 39226 * _.isTypedArray(new Uint8Array); 39227 * // => true 39228 * 39229 * _.isTypedArray([]); 39230 * // => false 39231 */ 39232 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; 39233 39234 /** 39235 * Checks if `value` is `undefined`. 39236 * 39237 * @static 39238 * @since 0.1.0 39239 * @memberOf _ 39240 * @category Lang 39241 * @param {*} value The value to check. 39242 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. 39243 * @example 39244 * 39245 * _.isUndefined(void 0); 39246 * // => true 39247 * 39248 * _.isUndefined(null); 39249 * // => false 39250 */ 39251 function isUndefined(value) { 39252 return value === undefined; 39253 } 39254 39255 /** 39256 * Checks if `value` is classified as a `WeakMap` object. 39257 * 39258 * @static 39259 * @memberOf _ 39260 * @since 4.3.0 39261 * @category Lang 39262 * @param {*} value The value to check. 39263 * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. 39264 * @example 39265 * 39266 * _.isWeakMap(new WeakMap); 39267 * // => true 39268 * 39269 * _.isWeakMap(new Map); 39270 * // => false 39271 */ 39272 function isWeakMap(value) { 39273 return isObjectLike(value) && getTag(value) == weakMapTag; 39274 } 39275 39276 /** 39277 * Checks if `value` is classified as a `WeakSet` object. 39278 * 39279 * @static 39280 * @memberOf _ 39281 * @since 4.3.0 39282 * @category Lang 39283 * @param {*} value The value to check. 39284 * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. 39285 * @example 39286 * 39287 * _.isWeakSet(new WeakSet); 39288 * // => true 39289 * 39290 * _.isWeakSet(new Set); 39291 * // => false 39292 */ 39293 function isWeakSet(value) { 39294 return isObjectLike(value) && baseGetTag(value) == weakSetTag; 39295 } 39296 39297 /** 39298 * Checks if `value` is less than `other`. 39299 * 39300 * @static 39301 * @memberOf _ 39302 * @since 3.9.0 39303 * @category Lang 39304 * @param {*} value The value to compare. 39305 * @param {*} other The other value to compare. 39306 * @returns {boolean} Returns `true` if `value` is less than `other`, 39307 * else `false`. 39308 * @see _.gt 39309 * @example 39310 * 39311 * _.lt(1, 3); 39312 * // => true 39313 * 39314 * _.lt(3, 3); 39315 * // => false 39316 * 39317 * _.lt(3, 1); 39318 * // => false 39319 */ 39320 var lt = createRelationalOperation(baseLt); 39321 39322 /** 39323 * Checks if `value` is less than or equal to `other`. 39324 * 39325 * @static 39326 * @memberOf _ 39327 * @since 3.9.0 39328 * @category Lang 39329 * @param {*} value The value to compare. 39330 * @param {*} other The other value to compare. 39331 * @returns {boolean} Returns `true` if `value` is less than or equal to 39332 * `other`, else `false`. 39333 * @see _.gte 39334 * @example 39335 * 39336 * _.lte(1, 3); 39337 * // => true 39338 * 39339 * _.lte(3, 3); 39340 * // => true 39341 * 39342 * _.lte(3, 1); 39343 * // => false 39344 */ 39345 var lte = createRelationalOperation(function(value, other) { 39346 return value <= other; 39347 }); 39348 39349 /** 39350 * Converts `value` to an array. 39351 * 39352 * @static 39353 * @since 0.1.0 39354 * @memberOf _ 39355 * @category Lang 39356 * @param {*} value The value to convert. 39357 * @returns {Array} Returns the converted array. 39358 * @example 39359 * 39360 * _.toArray({ 'a': 1, 'b': 2 }); 39361 * // => [1, 2] 39362 * 39363 * _.toArray('abc'); 39364 * // => ['a', 'b', 'c'] 39365 * 39366 * _.toArray(1); 39367 * // => [] 39368 * 39369 * _.toArray(null); 39370 * // => [] 39371 */ 39372 function toArray(value) { 39373 if (!value) { 39374 return []; 39375 } 39376 if (isArrayLike(value)) { 39377 return isString(value) ? stringToArray(value) : copyArray(value); 39378 } 39379 if (symIterator && value[symIterator]) { 39380 return iteratorToArray(value[symIterator]()); 39381 } 39382 var tag = getTag(value), 39383 func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); 39384 39385 return func(value); 39386 } 39387 39388 /** 39389 * Converts `value` to a finite number. 39390 * 39391 * @static 39392 * @memberOf _ 39393 * @since 4.12.0 39394 * @category Lang 39395 * @param {*} value The value to convert. 39396 * @returns {number} Returns the converted number. 39397 * @example 39398 * 39399 * _.toFinite(3.2); 39400 * // => 3.2 39401 * 39402 * _.toFinite(Number.MIN_VALUE); 39403 * // => 5e-324 39404 * 39405 * _.toFinite(Infinity); 39406 * // => 1.7976931348623157e+308 39407 * 39408 * _.toFinite('3.2'); 39409 * // => 3.2 39410 */ 39411 function toFinite(value) { 39412 if (!value) { 39413 return value === 0 ? value : 0; 39414 } 39415 value = toNumber(value); 39416 if (value === INFINITY || value === -INFINITY) { 39417 var sign = (value < 0 ? -1 : 1); 39418 return sign * MAX_INTEGER; 39419 } 39420 return value === value ? value : 0; 39421 } 39422 39423 /** 39424 * Converts `value` to an integer. 39425 * 39426 * **Note:** This method is loosely based on 39427 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). 39428 * 39429 * @static 39430 * @memberOf _ 39431 * @since 4.0.0 39432 * @category Lang 39433 * @param {*} value The value to convert. 39434 * @returns {number} Returns the converted integer. 39435 * @example 39436 * 39437 * _.toInteger(3.2); 39438 * // => 3 39439 * 39440 * _.toInteger(Number.MIN_VALUE); 39441 * // => 0 39442 * 39443 * _.toInteger(Infinity); 39444 * // => 1.7976931348623157e+308 39445 * 39446 * _.toInteger('3.2'); 39447 * // => 3 39448 */ 39449 function toInteger(value) { 39450 var result = toFinite(value), 39451 remainder = result % 1; 39452 39453 return result === result ? (remainder ? result - remainder : result) : 0; 39454 } 39455 39456 /** 39457 * Converts `value` to an integer suitable for use as the length of an 39458 * array-like object. 39459 * 39460 * **Note:** This method is based on 39461 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). 39462 * 39463 * @static 39464 * @memberOf _ 39465 * @since 4.0.0 39466 * @category Lang 39467 * @param {*} value The value to convert. 39468 * @returns {number} Returns the converted integer. 39469 * @example 39470 * 39471 * _.toLength(3.2); 39472 * // => 3 39473 * 39474 * _.toLength(Number.MIN_VALUE); 39475 * // => 0 39476 * 39477 * _.toLength(Infinity); 39478 * // => 4294967295 39479 * 39480 * _.toLength('3.2'); 39481 * // => 3 39482 */ 39483 function toLength(value) { 39484 return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; 39485 } 39486 39487 /** 39488 * Converts `value` to a number. 39489 * 39490 * @static 39491 * @memberOf _ 39492 * @since 4.0.0 39493 * @category Lang 39494 * @param {*} value The value to process. 39495 * @returns {number} Returns the number. 39496 * @example 39497 * 39498 * _.toNumber(3.2); 39499 * // => 3.2 39500 * 39501 * _.toNumber(Number.MIN_VALUE); 39502 * // => 5e-324 39503 * 39504 * _.toNumber(Infinity); 39505 * // => Infinity 39506 * 39507 * _.toNumber('3.2'); 39508 * // => 3.2 39509 */ 39510 function toNumber(value) { 39511 if (typeof value == 'number') { 39512 return value; 39513 } 39514 if (isSymbol(value)) { 39515 return NAN; 39516 } 39517 if (isObject(value)) { 39518 var other = typeof value.valueOf == 'function' ? value.valueOf() : value; 39519 value = isObject(other) ? (other + '') : other; 39520 } 39521 if (typeof value != 'string') { 39522 return value === 0 ? value : +value; 39523 } 39524 value = baseTrim(value); 39525 var isBinary = reIsBinary.test(value); 39526 return (isBinary || reIsOctal.test(value)) 39527 ? freeParseInt(value.slice(2), isBinary ? 2 : 8) 39528 : (reIsBadHex.test(value) ? NAN : +value); 39529 } 39530 39531 /** 39532 * Converts `value` to a plain object flattening inherited enumerable string 39533 * keyed properties of `value` to own properties of the plain object. 39534 * 39535 * @static 39536 * @memberOf _ 39537 * @since 3.0.0 39538 * @category Lang 39539 * @param {*} value The value to convert. 39540 * @returns {Object} Returns the converted plain object. 39541 * @example 39542 * 39543 * function Foo() { 39544 * this.b = 2; 39545 * } 39546 * 39547 * Foo.prototype.c = 3; 39548 * 39549 * _.assign({ 'a': 1 }, new Foo); 39550 * // => { 'a': 1, 'b': 2 } 39551 * 39552 * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); 39553 * // => { 'a': 1, 'b': 2, 'c': 3 } 39554 */ 39555 function toPlainObject(value) { 39556 return copyObject(value, keysIn(value)); 39557 } 39558 39559 /** 39560 * Converts `value` to a safe integer. A safe integer can be compared and 39561 * represented correctly. 39562 * 39563 * @static 39564 * @memberOf _ 39565 * @since 4.0.0 39566 * @category Lang 39567 * @param {*} value The value to convert. 39568 * @returns {number} Returns the converted integer. 39569 * @example 39570 * 39571 * _.toSafeInteger(3.2); 39572 * // => 3 39573 * 39574 * _.toSafeInteger(Number.MIN_VALUE); 39575 * // => 0 39576 * 39577 * _.toSafeInteger(Infinity); 39578 * // => 9007199254740991 39579 * 39580 * _.toSafeInteger('3.2'); 39581 * // => 3 39582 */ 39583 function toSafeInteger(value) { 39584 return value 39585 ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) 39586 : (value === 0 ? value : 0); 39587 } 39588 39589 /** 39590 * Converts `value` to a string. An empty string is returned for `null` 39591 * and `undefined` values. The sign of `-0` is preserved. 39592 * 39593 * @static 39594 * @memberOf _ 39595 * @since 4.0.0 39596 * @category Lang 39597 * @param {*} value The value to convert. 39598 * @returns {string} Returns the converted string. 39599 * @example 39600 * 39601 * _.toString(null); 39602 * // => '' 39603 * 39604 * _.toString(-0); 39605 * // => '-0' 39606 * 39607 * _.toString([1, 2, 3]); 39608 * // => '1,2,3' 39609 */ 39610 function toString(value) { 39611 return value == null ? '' : baseToString(value); 39612 } 39613 39614 /*------------------------------------------------------------------------*/ 39615 39616 /** 39617 * Assigns own enumerable string keyed properties of source objects to the 39618 * destination object. Source objects are applied from left to right. 39619 * Subsequent sources overwrite property assignments of previous sources. 39620 * 39621 * **Note:** This method mutates `object` and is loosely based on 39622 * [`Object.assign`](https://mdn.io/Object/assign). 39623 * 39624 * @static 39625 * @memberOf _ 39626 * @since 0.10.0 39627 * @category Object 39628 * @param {Object} object The destination object. 39629 * @param {...Object} [sources] The source objects. 39630 * @returns {Object} Returns `object`. 39631 * @see _.assignIn 39632 * @example 39633 * 39634 * function Foo() { 39635 * this.a = 1; 39636 * } 39637 * 39638 * function Bar() { 39639 * this.c = 3; 39640 * } 39641 * 39642 * Foo.prototype.b = 2; 39643 * Bar.prototype.d = 4; 39644 * 39645 * _.assign({ 'a': 0 }, new Foo, new Bar); 39646 * // => { 'a': 1, 'c': 3 } 39647 */ 39648 var assign = createAssigner(function(object, source) { 39649 if (isPrototype(source) || isArrayLike(source)) { 39650 copyObject(source, keys(source), object); 39651 return; 39652 } 39653 for (var key in source) { 39654 if (hasOwnProperty.call(source, key)) { 39655 assignValue(object, key, source[key]); 39656 } 39657 } 39658 }); 39659 39660 /** 39661 * This method is like `_.assign` except that it iterates over own and 39662 * inherited source properties. 39663 * 39664 * **Note:** This method mutates `object`. 39665 * 39666 * @static 39667 * @memberOf _ 39668 * @since 4.0.0 39669 * @alias extend 39670 * @category Object 39671 * @param {Object} object The destination object. 39672 * @param {...Object} [sources] The source objects. 39673 * @returns {Object} Returns `object`. 39674 * @see _.assign 39675 * @example 39676 * 39677 * function Foo() { 39678 * this.a = 1; 39679 * } 39680 * 39681 * function Bar() { 39682 * this.c = 3; 39683 * } 39684 * 39685 * Foo.prototype.b = 2; 39686 * Bar.prototype.d = 4; 39687 * 39688 * _.assignIn({ 'a': 0 }, new Foo, new Bar); 39689 * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } 39690 */ 39691 var assignIn = createAssigner(function(object, source) { 39692 copyObject(source, keysIn(source), object); 39693 }); 39694 39695 /** 39696 * This method is like `_.assignIn` except that it accepts `customizer` 39697 * which is invoked to produce the assigned values. If `customizer` returns 39698 * `undefined`, assignment is handled by the method instead. The `customizer` 39699 * is invoked with five arguments: (objValue, srcValue, key, object, source). 39700 * 39701 * **Note:** This method mutates `object`. 39702 * 39703 * @static 39704 * @memberOf _ 39705 * @since 4.0.0 39706 * @alias extendWith 39707 * @category Object 39708 * @param {Object} object The destination object. 39709 * @param {...Object} sources The source objects. 39710 * @param {Function} [customizer] The function to customize assigned values. 39711 * @returns {Object} Returns `object`. 39712 * @see _.assignWith 39713 * @example 39714 * 39715 * function customizer(objValue, srcValue) { 39716 * return _.isUndefined(objValue) ? srcValue : objValue; 39717 * } 39718 * 39719 * var defaults = _.partialRight(_.assignInWith, customizer); 39720 * 39721 * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); 39722 * // => { 'a': 1, 'b': 2 } 39723 */ 39724 var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { 39725 copyObject(source, keysIn(source), object, customizer); 39726 }); 39727 39728 /** 39729 * This method is like `_.assign` except that it accepts `customizer` 39730 * which is invoked to produce the assigned values. If `customizer` returns 39731 * `undefined`, assignment is handled by the method instead. The `customizer` 39732 * is invoked with five arguments: (objValue, srcValue, key, object, source). 39733 * 39734 * **Note:** This method mutates `object`. 39735 * 39736 * @static 39737 * @memberOf _ 39738 * @since 4.0.0 39739 * @category Object 39740 * @param {Object} object The destination object. 39741 * @param {...Object} sources The source objects. 39742 * @param {Function} [customizer] The function to customize assigned values. 39743 * @returns {Object} Returns `object`. 39744 * @see _.assignInWith 39745 * @example 39746 * 39747 * function customizer(objValue, srcValue) { 39748 * return _.isUndefined(objValue) ? srcValue : objValue; 39749 * } 39750 * 39751 * var defaults = _.partialRight(_.assignWith, customizer); 39752 * 39753 * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); 39754 * // => { 'a': 1, 'b': 2 } 39755 */ 39756 var assignWith = createAssigner(function(object, source, srcIndex, customizer) { 39757 copyObject(source, keys(source), object, customizer); 39758 }); 39759 39760 /** 39761 * Creates an array of values corresponding to `paths` of `object`. 39762 * 39763 * @static 39764 * @memberOf _ 39765 * @since 1.0.0 39766 * @category Object 39767 * @param {Object} object The object to iterate over. 39768 * @param {...(string|string[])} [paths] The property paths to pick. 39769 * @returns {Array} Returns the picked values. 39770 * @example 39771 * 39772 * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; 39773 * 39774 * _.at(object, ['a[0].b.c', 'a[1]']); 39775 * // => [3, 4] 39776 */ 39777 var at = flatRest(baseAt); 39778 39779 /** 39780 * Creates an object that inherits from the `prototype` object. If a 39781 * `properties` object is given, its own enumerable string keyed properties 39782 * are assigned to the created object. 39783 * 39784 * @static 39785 * @memberOf _ 39786 * @since 2.3.0 39787 * @category Object 39788 * @param {Object} prototype The object to inherit from. 39789 * @param {Object} [properties] The properties to assign to the object. 39790 * @returns {Object} Returns the new object. 39791 * @example 39792 * 39793 * function Shape() { 39794 * this.x = 0; 39795 * this.y = 0; 39796 * } 39797 * 39798 * function Circle() { 39799 * Shape.call(this); 39800 * } 39801 * 39802 * Circle.prototype = _.create(Shape.prototype, { 39803 * 'constructor': Circle 39804 * }); 39805 * 39806 * var circle = new Circle; 39807 * circle instanceof Circle; 39808 * // => true 39809 * 39810 * circle instanceof Shape; 39811 * // => true 39812 */ 39813 function create(prototype, properties) { 39814 var result = baseCreate(prototype); 39815 return properties == null ? result : baseAssign(result, properties); 39816 } 39817 39818 /** 39819 * Assigns own and inherited enumerable string keyed properties of source 39820 * objects to the destination object for all destination properties that 39821 * resolve to `undefined`. Source objects are applied from left to right. 39822 * Once a property is set, additional values of the same property are ignored. 39823 * 39824 * **Note:** This method mutates `object`. 39825 * 39826 * @static 39827 * @since 0.1.0 39828 * @memberOf _ 39829 * @category Object 39830 * @param {Object} object The destination object. 39831 * @param {...Object} [sources] The source objects. 39832 * @returns {Object} Returns `object`. 39833 * @see _.defaultsDeep 39834 * @example 39835 * 39836 * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); 39837 * // => { 'a': 1, 'b': 2 } 39838 */ 39839 var defaults = baseRest(function(object, sources) { 39840 object = Object(object); 39841 39842 var index = -1; 39843 var length = sources.length; 39844 var guard = length > 2 ? sources[2] : undefined; 39845 39846 if (guard && isIterateeCall(sources[0], sources[1], guard)) { 39847 length = 1; 39848 } 39849 39850 while (++index < length) { 39851 var source = sources[index]; 39852 var props = keysIn(source); 39853 var propsIndex = -1; 39854 var propsLength = props.length; 39855 39856 while (++propsIndex < propsLength) { 39857 var key = props[propsIndex]; 39858 var value = object[key]; 39859 39860 if (value === undefined || 39861 (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { 39862 object[key] = source[key]; 39863 } 39864 } 39865 } 39866 39867 return object; 39868 }); 39869 39870 /** 39871 * This method is like `_.defaults` except that it recursively assigns 39872 * default properties. 39873 * 39874 * **Note:** This method mutates `object`. 39875 * 39876 * @static 39877 * @memberOf _ 39878 * @since 3.10.0 39879 * @category Object 39880 * @param {Object} object The destination object. 39881 * @param {...Object} [sources] The source objects. 39882 * @returns {Object} Returns `object`. 39883 * @see _.defaults 39884 * @example 39885 * 39886 * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); 39887 * // => { 'a': { 'b': 2, 'c': 3 } } 39888 */ 39889 var defaultsDeep = baseRest(function(args) { 39890 args.push(undefined, customDefaultsMerge); 39891 return apply(mergeWith, undefined, args); 39892 }); 39893 39894 /** 39895 * This method is like `_.find` except that it returns the key of the first 39896 * element `predicate` returns truthy for instead of the element itself. 39897 * 39898 * @static 39899 * @memberOf _ 39900 * @since 1.1.0 39901 * @category Object 39902 * @param {Object} object The object to inspect. 39903 * @param {Function} [predicate=_.identity] The function invoked per iteration. 39904 * @returns {string|undefined} Returns the key of the matched element, 39905 * else `undefined`. 39906 * @example 39907 * 39908 * var users = { 39909 * 'barney': { 'age': 36, 'active': true }, 39910 * 'fred': { 'age': 40, 'active': false }, 39911 * 'pebbles': { 'age': 1, 'active': true } 39912 * }; 39913 * 39914 * _.findKey(users, function(o) { return o.age < 40; }); 39915 * // => 'barney' (iteration order is not guaranteed) 39916 * 39917 * // The `_.matches` iteratee shorthand. 39918 * _.findKey(users, { 'age': 1, 'active': true }); 39919 * // => 'pebbles' 39920 * 39921 * // The `_.matchesProperty` iteratee shorthand. 39922 * _.findKey(users, ['active', false]); 39923 * // => 'fred' 39924 * 39925 * // The `_.property` iteratee shorthand. 39926 * _.findKey(users, 'active'); 39927 * // => 'barney' 39928 */ 39929 function findKey(object, predicate) { 39930 return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); 39931 } 39932 39933 /** 39934 * This method is like `_.findKey` except that it iterates over elements of 39935 * a collection in the opposite order. 39936 * 39937 * @static 39938 * @memberOf _ 39939 * @since 2.0.0 39940 * @category Object 39941 * @param {Object} object The object to inspect. 39942 * @param {Function} [predicate=_.identity] The function invoked per iteration. 39943 * @returns {string|undefined} Returns the key of the matched element, 39944 * else `undefined`. 39945 * @example 39946 * 39947 * var users = { 39948 * 'barney': { 'age': 36, 'active': true }, 39949 * 'fred': { 'age': 40, 'active': false }, 39950 * 'pebbles': { 'age': 1, 'active': true } 39951 * }; 39952 * 39953 * _.findLastKey(users, function(o) { return o.age < 40; }); 39954 * // => returns 'pebbles' assuming `_.findKey` returns 'barney' 39955 * 39956 * // The `_.matches` iteratee shorthand. 39957 * _.findLastKey(users, { 'age': 36, 'active': true }); 39958 * // => 'barney' 39959 * 39960 * // The `_.matchesProperty` iteratee shorthand. 39961 * _.findLastKey(users, ['active', false]); 39962 * // => 'fred' 39963 * 39964 * // The `_.property` iteratee shorthand. 39965 * _.findLastKey(users, 'active'); 39966 * // => 'pebbles' 39967 */ 39968 function findLastKey(object, predicate) { 39969 return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); 39970 } 39971 39972 /** 39973 * Iterates over own and inherited enumerable string keyed properties of an 39974 * object and invokes `iteratee` for each property. The iteratee is invoked 39975 * with three arguments: (value, key, object). Iteratee functions may exit 39976 * iteration early by explicitly returning `false`. 39977 * 39978 * @static 39979 * @memberOf _ 39980 * @since 0.3.0 39981 * @category Object 39982 * @param {Object} object The object to iterate over. 39983 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 39984 * @returns {Object} Returns `object`. 39985 * @see _.forInRight 39986 * @example 39987 * 39988 * function Foo() { 39989 * this.a = 1; 39990 * this.b = 2; 39991 * } 39992 * 39993 * Foo.prototype.c = 3; 39994 * 39995 * _.forIn(new Foo, function(value, key) { 39996 * console.log(key); 39997 * }); 39998 * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). 39999 */ 40000 function forIn(object, iteratee) { 40001 return object == null 40002 ? object 40003 : baseFor(object, getIteratee(iteratee, 3), keysIn); 40004 } 40005 40006 /** 40007 * This method is like `_.forIn` except that it iterates over properties of 40008 * `object` in the opposite order. 40009 * 40010 * @static 40011 * @memberOf _ 40012 * @since 2.0.0 40013 * @category Object 40014 * @param {Object} object The object to iterate over. 40015 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 40016 * @returns {Object} Returns `object`. 40017 * @see _.forIn 40018 * @example 40019 * 40020 * function Foo() { 40021 * this.a = 1; 40022 * this.b = 2; 40023 * } 40024 * 40025 * Foo.prototype.c = 3; 40026 * 40027 * _.forInRight(new Foo, function(value, key) { 40028 * console.log(key); 40029 * }); 40030 * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. 40031 */ 40032 function forInRight(object, iteratee) { 40033 return object == null 40034 ? object 40035 : baseForRight(object, getIteratee(iteratee, 3), keysIn); 40036 } 40037 40038 /** 40039 * Iterates over own enumerable string keyed properties of an object and 40040 * invokes `iteratee` for each property. The iteratee is invoked with three 40041 * arguments: (value, key, object). Iteratee functions may exit iteration 40042 * early by explicitly returning `false`. 40043 * 40044 * @static 40045 * @memberOf _ 40046 * @since 0.3.0 40047 * @category Object 40048 * @param {Object} object The object to iterate over. 40049 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 40050 * @returns {Object} Returns `object`. 40051 * @see _.forOwnRight 40052 * @example 40053 * 40054 * function Foo() { 40055 * this.a = 1; 40056 * this.b = 2; 40057 * } 40058 * 40059 * Foo.prototype.c = 3; 40060 * 40061 * _.forOwn(new Foo, function(value, key) { 40062 * console.log(key); 40063 * }); 40064 * // => Logs 'a' then 'b' (iteration order is not guaranteed). 40065 */ 40066 function forOwn(object, iteratee) { 40067 return object && baseForOwn(object, getIteratee(iteratee, 3)); 40068 } 40069 40070 /** 40071 * This method is like `_.forOwn` except that it iterates over properties of 40072 * `object` in the opposite order. 40073 * 40074 * @static 40075 * @memberOf _ 40076 * @since 2.0.0 40077 * @category Object 40078 * @param {Object} object The object to iterate over. 40079 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 40080 * @returns {Object} Returns `object`. 40081 * @see _.forOwn 40082 * @example 40083 * 40084 * function Foo() { 40085 * this.a = 1; 40086 * this.b = 2; 40087 * } 40088 * 40089 * Foo.prototype.c = 3; 40090 * 40091 * _.forOwnRight(new Foo, function(value, key) { 40092 * console.log(key); 40093 * }); 40094 * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. 40095 */ 40096 function forOwnRight(object, iteratee) { 40097 return object && baseForOwnRight(object, getIteratee(iteratee, 3)); 40098 } 40099 40100 /** 40101 * Creates an array of function property names from own enumerable properties 40102 * of `object`. 40103 * 40104 * @static 40105 * @since 0.1.0 40106 * @memberOf _ 40107 * @category Object 40108 * @param {Object} object The object to inspect. 40109 * @returns {Array} Returns the function names. 40110 * @see _.functionsIn 40111 * @example 40112 * 40113 * function Foo() { 40114 * this.a = _.constant('a'); 40115 * this.b = _.constant('b'); 40116 * } 40117 * 40118 * Foo.prototype.c = _.constant('c'); 40119 * 40120 * _.functions(new Foo); 40121 * // => ['a', 'b'] 40122 */ 40123 function functions(object) { 40124 return object == null ? [] : baseFunctions(object, keys(object)); 40125 } 40126 40127 /** 40128 * Creates an array of function property names from own and inherited 40129 * enumerable properties of `object`. 40130 * 40131 * @static 40132 * @memberOf _ 40133 * @since 4.0.0 40134 * @category Object 40135 * @param {Object} object The object to inspect. 40136 * @returns {Array} Returns the function names. 40137 * @see _.functions 40138 * @example 40139 * 40140 * function Foo() { 40141 * this.a = _.constant('a'); 40142 * this.b = _.constant('b'); 40143 * } 40144 * 40145 * Foo.prototype.c = _.constant('c'); 40146 * 40147 * _.functionsIn(new Foo); 40148 * // => ['a', 'b', 'c'] 40149 */ 40150 function functionsIn(object) { 40151 return object == null ? [] : baseFunctions(object, keysIn(object)); 40152 } 40153 40154 /** 40155 * Gets the value at `path` of `object`. If the resolved value is 40156 * `undefined`, the `defaultValue` is returned in its place. 40157 * 40158 * @static 40159 * @memberOf _ 40160 * @since 3.7.0 40161 * @category Object 40162 * @param {Object} object The object to query. 40163 * @param {Array|string} path The path of the property to get. 40164 * @param {*} [defaultValue] The value returned for `undefined` resolved values. 40165 * @returns {*} Returns the resolved value. 40166 * @example 40167 * 40168 * var object = { 'a': [{ 'b': { 'c': 3 } }] }; 40169 * 40170 * _.get(object, 'a[0].b.c'); 40171 * // => 3 40172 * 40173 * _.get(object, ['a', '0', 'b', 'c']); 40174 * // => 3 40175 * 40176 * _.get(object, 'a.b.c', 'default'); 40177 * // => 'default' 40178 */ 40179 function get(object, path, defaultValue) { 40180 var result = object == null ? undefined : baseGet(object, path); 40181 return result === undefined ? defaultValue : result; 40182 } 40183 40184 /** 40185 * Checks if `path` is a direct property of `object`. 40186 * 40187 * @static 40188 * @since 0.1.0 40189 * @memberOf _ 40190 * @category Object 40191 * @param {Object} object The object to query. 40192 * @param {Array|string} path The path to check. 40193 * @returns {boolean} Returns `true` if `path` exists, else `false`. 40194 * @example 40195 * 40196 * var object = { 'a': { 'b': 2 } }; 40197 * var other = _.create({ 'a': _.create({ 'b': 2 }) }); 40198 * 40199 * _.has(object, 'a'); 40200 * // => true 40201 * 40202 * _.has(object, 'a.b'); 40203 * // => true 40204 * 40205 * _.has(object, ['a', 'b']); 40206 * // => true 40207 * 40208 * _.has(other, 'a'); 40209 * // => false 40210 */ 40211 function has(object, path) { 40212 return object != null && hasPath(object, path, baseHas); 40213 } 40214 40215 /** 40216 * Checks if `path` is a direct or inherited property of `object`. 40217 * 40218 * @static 40219 * @memberOf _ 40220 * @since 4.0.0 40221 * @category Object 40222 * @param {Object} object The object to query. 40223 * @param {Array|string} path The path to check. 40224 * @returns {boolean} Returns `true` if `path` exists, else `false`. 40225 * @example 40226 * 40227 * var object = _.create({ 'a': _.create({ 'b': 2 }) }); 40228 * 40229 * _.hasIn(object, 'a'); 40230 * // => true 40231 * 40232 * _.hasIn(object, 'a.b'); 40233 * // => true 40234 * 40235 * _.hasIn(object, ['a', 'b']); 40236 * // => true 40237 * 40238 * _.hasIn(object, 'b'); 40239 * // => false 40240 */ 40241 function hasIn(object, path) { 40242 return object != null && hasPath(object, path, baseHasIn); 40243 } 40244 40245 /** 40246 * Creates an object composed of the inverted keys and values of `object`. 40247 * If `object` contains duplicate values, subsequent values overwrite 40248 * property assignments of previous values. 40249 * 40250 * @static 40251 * @memberOf _ 40252 * @since 0.7.0 40253 * @category Object 40254 * @param {Object} object The object to invert. 40255 * @returns {Object} Returns the new inverted object. 40256 * @example 40257 * 40258 * var object = { 'a': 1, 'b': 2, 'c': 1 }; 40259 * 40260 * _.invert(object); 40261 * // => { '1': 'c', '2': 'b' } 40262 */ 40263 var invert = createInverter(function(result, value, key) { 40264 if (value != null && 40265 typeof value.toString != 'function') { 40266 value = nativeObjectToString.call(value); 40267 } 40268 40269 result[value] = key; 40270 }, constant(identity)); 40271 40272 /** 40273 * This method is like `_.invert` except that the inverted object is generated 40274 * from the results of running each element of `object` thru `iteratee`. The 40275 * corresponding inverted value of each inverted key is an array of keys 40276 * responsible for generating the inverted value. The iteratee is invoked 40277 * with one argument: (value). 40278 * 40279 * @static 40280 * @memberOf _ 40281 * @since 4.1.0 40282 * @category Object 40283 * @param {Object} object The object to invert. 40284 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 40285 * @returns {Object} Returns the new inverted object. 40286 * @example 40287 * 40288 * var object = { 'a': 1, 'b': 2, 'c': 1 }; 40289 * 40290 * _.invertBy(object); 40291 * // => { '1': ['a', 'c'], '2': ['b'] } 40292 * 40293 * _.invertBy(object, function(value) { 40294 * return 'group' + value; 40295 * }); 40296 * // => { 'group1': ['a', 'c'], 'group2': ['b'] } 40297 */ 40298 var invertBy = createInverter(function(result, value, key) { 40299 if (value != null && 40300 typeof value.toString != 'function') { 40301 value = nativeObjectToString.call(value); 40302 } 40303 40304 if (hasOwnProperty.call(result, value)) { 40305 result[value].push(key); 40306 } else { 40307 result[value] = [key]; 40308 } 40309 }, getIteratee); 40310 40311 /** 40312 * Invokes the method at `path` of `object`. 40313 * 40314 * @static 40315 * @memberOf _ 40316 * @since 4.0.0 40317 * @category Object 40318 * @param {Object} object The object to query. 40319 * @param {Array|string} path The path of the method to invoke. 40320 * @param {...*} [args] The arguments to invoke the method with. 40321 * @returns {*} Returns the result of the invoked method. 40322 * @example 40323 * 40324 * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; 40325 * 40326 * _.invoke(object, 'a[0].b.c.slice', 1, 3); 40327 * // => [2, 3] 40328 */ 40329 var invoke = baseRest(baseInvoke); 40330 40331 /** 40332 * Creates an array of the own enumerable property names of `object`. 40333 * 40334 * **Note:** Non-object values are coerced to objects. See the 40335 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) 40336 * for more details. 40337 * 40338 * @static 40339 * @since 0.1.0 40340 * @memberOf _ 40341 * @category Object 40342 * @param {Object} object The object to query. 40343 * @returns {Array} Returns the array of property names. 40344 * @example 40345 * 40346 * function Foo() { 40347 * this.a = 1; 40348 * this.b = 2; 40349 * } 40350 * 40351 * Foo.prototype.c = 3; 40352 * 40353 * _.keys(new Foo); 40354 * // => ['a', 'b'] (iteration order is not guaranteed) 40355 * 40356 * _.keys('hi'); 40357 * // => ['0', '1'] 40358 */ 40359 function keys(object) { 40360 return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); 40361 } 40362 40363 /** 40364 * Creates an array of the own and inherited enumerable property names of `object`. 40365 * 40366 * **Note:** Non-object values are coerced to objects. 40367 * 40368 * @static 40369 * @memberOf _ 40370 * @since 3.0.0 40371 * @category Object 40372 * @param {Object} object The object to query. 40373 * @returns {Array} Returns the array of property names. 40374 * @example 40375 * 40376 * function Foo() { 40377 * this.a = 1; 40378 * this.b = 2; 40379 * } 40380 * 40381 * Foo.prototype.c = 3; 40382 * 40383 * _.keysIn(new Foo); 40384 * // => ['a', 'b', 'c'] (iteration order is not guaranteed) 40385 */ 40386 function keysIn(object) { 40387 return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); 40388 } 40389 40390 /** 40391 * The opposite of `_.mapValues`; this method creates an object with the 40392 * same values as `object` and keys generated by running each own enumerable 40393 * string keyed property of `object` thru `iteratee`. The iteratee is invoked 40394 * with three arguments: (value, key, object). 40395 * 40396 * @static 40397 * @memberOf _ 40398 * @since 3.8.0 40399 * @category Object 40400 * @param {Object} object The object to iterate over. 40401 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 40402 * @returns {Object} Returns the new mapped object. 40403 * @see _.mapValues 40404 * @example 40405 * 40406 * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { 40407 * return key + value; 40408 * }); 40409 * // => { 'a1': 1, 'b2': 2 } 40410 */ 40411 function mapKeys(object, iteratee) { 40412 var result = {}; 40413 iteratee = getIteratee(iteratee, 3); 40414 40415 baseForOwn(object, function(value, key, object) { 40416 baseAssignValue(result, iteratee(value, key, object), value); 40417 }); 40418 return result; 40419 } 40420 40421 /** 40422 * Creates an object with the same keys as `object` and values generated 40423 * by running each own enumerable string keyed property of `object` thru 40424 * `iteratee`. The iteratee is invoked with three arguments: 40425 * (value, key, object). 40426 * 40427 * @static 40428 * @memberOf _ 40429 * @since 2.4.0 40430 * @category Object 40431 * @param {Object} object The object to iterate over. 40432 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 40433 * @returns {Object} Returns the new mapped object. 40434 * @see _.mapKeys 40435 * @example 40436 * 40437 * var users = { 40438 * 'fred': { 'user': 'fred', 'age': 40 }, 40439 * 'pebbles': { 'user': 'pebbles', 'age': 1 } 40440 * }; 40441 * 40442 * _.mapValues(users, function(o) { return o.age; }); 40443 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) 40444 * 40445 * // The `_.property` iteratee shorthand. 40446 * _.mapValues(users, 'age'); 40447 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) 40448 */ 40449 function mapValues(object, iteratee) { 40450 var result = {}; 40451 iteratee = getIteratee(iteratee, 3); 40452 40453 baseForOwn(object, function(value, key, object) { 40454 baseAssignValue(result, key, iteratee(value, key, object)); 40455 }); 40456 return result; 40457 } 40458 40459 /** 40460 * This method is like `_.assign` except that it recursively merges own and 40461 * inherited enumerable string keyed properties of source objects into the 40462 * destination object. Source properties that resolve to `undefined` are 40463 * skipped if a destination value exists. Array and plain object properties 40464 * are merged recursively. Other objects and value types are overridden by 40465 * assignment. Source objects are applied from left to right. Subsequent 40466 * sources overwrite property assignments of previous sources. 40467 * 40468 * **Note:** This method mutates `object`. 40469 * 40470 * @static 40471 * @memberOf _ 40472 * @since 0.5.0 40473 * @category Object 40474 * @param {Object} object The destination object. 40475 * @param {...Object} [sources] The source objects. 40476 * @returns {Object} Returns `object`. 40477 * @example 40478 * 40479 * var object = { 40480 * 'a': [{ 'b': 2 }, { 'd': 4 }] 40481 * }; 40482 * 40483 * var other = { 40484 * 'a': [{ 'c': 3 }, { 'e': 5 }] 40485 * }; 40486 * 40487 * _.merge(object, other); 40488 * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } 40489 */ 40490 var merge = createAssigner(function(object, source, srcIndex) { 40491 baseMerge(object, source, srcIndex); 40492 }); 40493 40494 /** 40495 * This method is like `_.merge` except that it accepts `customizer` which 40496 * is invoked to produce the merged values of the destination and source 40497 * properties. If `customizer` returns `undefined`, merging is handled by the 40498 * method instead. The `customizer` is invoked with six arguments: 40499 * (objValue, srcValue, key, object, source, stack). 40500 * 40501 * **Note:** This method mutates `object`. 40502 * 40503 * @static 40504 * @memberOf _ 40505 * @since 4.0.0 40506 * @category Object 40507 * @param {Object} object The destination object. 40508 * @param {...Object} sources The source objects. 40509 * @param {Function} customizer The function to customize assigned values. 40510 * @returns {Object} Returns `object`. 40511 * @example 40512 * 40513 * function customizer(objValue, srcValue) { 40514 * if (_.isArray(objValue)) { 40515 * return objValue.concat(srcValue); 40516 * } 40517 * } 40518 * 40519 * var object = { 'a': [1], 'b': [2] }; 40520 * var other = { 'a': [3], 'b': [4] }; 40521 * 40522 * _.mergeWith(object, other, customizer); 40523 * // => { 'a': [1, 3], 'b': [2, 4] } 40524 */ 40525 var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { 40526 baseMerge(object, source, srcIndex, customizer); 40527 }); 40528 40529 /** 40530 * The opposite of `_.pick`; this method creates an object composed of the 40531 * own and inherited enumerable property paths of `object` that are not omitted. 40532 * 40533 * **Note:** This method is considerably slower than `_.pick`. 40534 * 40535 * @static 40536 * @since 0.1.0 40537 * @memberOf _ 40538 * @category Object 40539 * @param {Object} object The source object. 40540 * @param {...(string|string[])} [paths] The property paths to omit. 40541 * @returns {Object} Returns the new object. 40542 * @example 40543 * 40544 * var object = { 'a': 1, 'b': '2', 'c': 3 }; 40545 * 40546 * _.omit(object, ['a', 'c']); 40547 * // => { 'b': '2' } 40548 */ 40549 var omit = flatRest(function(object, paths) { 40550 var result = {}; 40551 if (object == null) { 40552 return result; 40553 } 40554 var isDeep = false; 40555 paths = arrayMap(paths, function(path) { 40556 path = castPath(path, object); 40557 isDeep || (isDeep = path.length > 1); 40558 return path; 40559 }); 40560 copyObject(object, getAllKeysIn(object), result); 40561 if (isDeep) { 40562 result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); 40563 } 40564 var length = paths.length; 40565 while (length--) { 40566 baseUnset(result, paths[length]); 40567 } 40568 return result; 40569 }); 40570 40571 /** 40572 * The opposite of `_.pickBy`; this method creates an object composed of 40573 * the own and inherited enumerable string keyed properties of `object` that 40574 * `predicate` doesn't return truthy for. The predicate is invoked with two 40575 * arguments: (value, key). 40576 * 40577 * @static 40578 * @memberOf _ 40579 * @since 4.0.0 40580 * @category Object 40581 * @param {Object} object The source object. 40582 * @param {Function} [predicate=_.identity] The function invoked per property. 40583 * @returns {Object} Returns the new object. 40584 * @example 40585 * 40586 * var object = { 'a': 1, 'b': '2', 'c': 3 }; 40587 * 40588 * _.omitBy(object, _.isNumber); 40589 * // => { 'b': '2' } 40590 */ 40591 function omitBy(object, predicate) { 40592 return pickBy(object, negate(getIteratee(predicate))); 40593 } 40594 40595 /** 40596 * Creates an object composed of the picked `object` properties. 40597 * 40598 * @static 40599 * @since 0.1.0 40600 * @memberOf _ 40601 * @category Object 40602 * @param {Object} object The source object. 40603 * @param {...(string|string[])} [paths] The property paths to pick. 40604 * @returns {Object} Returns the new object. 40605 * @example 40606 * 40607 * var object = { 'a': 1, 'b': '2', 'c': 3 }; 40608 * 40609 * _.pick(object, ['a', 'c']); 40610 * // => { 'a': 1, 'c': 3 } 40611 */ 40612 var pick = flatRest(function(object, paths) { 40613 return object == null ? {} : basePick(object, paths); 40614 }); 40615 40616 /** 40617 * Creates an object composed of the `object` properties `predicate` returns 40618 * truthy for. The predicate is invoked with two arguments: (value, key). 40619 * 40620 * @static 40621 * @memberOf _ 40622 * @since 4.0.0 40623 * @category Object 40624 * @param {Object} object The source object. 40625 * @param {Function} [predicate=_.identity] The function invoked per property. 40626 * @returns {Object} Returns the new object. 40627 * @example 40628 * 40629 * var object = { 'a': 1, 'b': '2', 'c': 3 }; 40630 * 40631 * _.pickBy(object, _.isNumber); 40632 * // => { 'a': 1, 'c': 3 } 40633 */ 40634 function pickBy(object, predicate) { 40635 if (object == null) { 40636 return {}; 40637 } 40638 var props = arrayMap(getAllKeysIn(object), function(prop) { 40639 return [prop]; 40640 }); 40641 predicate = getIteratee(predicate); 40642 return basePickBy(object, props, function(value, path) { 40643 return predicate(value, path[0]); 40644 }); 40645 } 40646 40647 /** 40648 * This method is like `_.get` except that if the resolved value is a 40649 * function it's invoked with the `this` binding of its parent object and 40650 * its result is returned. 40651 * 40652 * @static 40653 * @since 0.1.0 40654 * @memberOf _ 40655 * @category Object 40656 * @param {Object} object The object to query. 40657 * @param {Array|string} path The path of the property to resolve. 40658 * @param {*} [defaultValue] The value returned for `undefined` resolved values. 40659 * @returns {*} Returns the resolved value. 40660 * @example 40661 * 40662 * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; 40663 * 40664 * _.result(object, 'a[0].b.c1'); 40665 * // => 3 40666 * 40667 * _.result(object, 'a[0].b.c2'); 40668 * // => 4 40669 * 40670 * _.result(object, 'a[0].b.c3', 'default'); 40671 * // => 'default' 40672 * 40673 * _.result(object, 'a[0].b.c3', _.constant('default')); 40674 * // => 'default' 40675 */ 40676 function result(object, path, defaultValue) { 40677 path = castPath(path, object); 40678 40679 var index = -1, 40680 length = path.length; 40681 40682 // Ensure the loop is entered when path is empty. 40683 if (!length) { 40684 length = 1; 40685 object = undefined; 40686 } 40687 while (++index < length) { 40688 var value = object == null ? undefined : object[toKey(path[index])]; 40689 if (value === undefined) { 40690 index = length; 40691 value = defaultValue; 40692 } 40693 object = isFunction(value) ? value.call(object) : value; 40694 } 40695 return object; 40696 } 40697 40698 /** 40699 * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, 40700 * it's created. Arrays are created for missing index properties while objects 40701 * are created for all other missing properties. Use `_.setWith` to customize 40702 * `path` creation. 40703 * 40704 * **Note:** This method mutates `object`. 40705 * 40706 * @static 40707 * @memberOf _ 40708 * @since 3.7.0 40709 * @category Object 40710 * @param {Object} object The object to modify. 40711 * @param {Array|string} path The path of the property to set. 40712 * @param {*} value The value to set. 40713 * @returns {Object} Returns `object`. 40714 * @example 40715 * 40716 * var object = { 'a': [{ 'b': { 'c': 3 } }] }; 40717 * 40718 * _.set(object, 'a[0].b.c', 4); 40719 * console.log(object.a[0].b.c); 40720 * // => 4 40721 * 40722 * _.set(object, ['x', '0', 'y', 'z'], 5); 40723 * console.log(object.x[0].y.z); 40724 * // => 5 40725 */ 40726 function set(object, path, value) { 40727 return object == null ? object : baseSet(object, path, value); 40728 } 40729 40730 /** 40731 * This method is like `_.set` except that it accepts `customizer` which is 40732 * invoked to produce the objects of `path`. If `customizer` returns `undefined` 40733 * path creation is handled by the method instead. The `customizer` is invoked 40734 * with three arguments: (nsValue, key, nsObject). 40735 * 40736 * **Note:** This method mutates `object`. 40737 * 40738 * @static 40739 * @memberOf _ 40740 * @since 4.0.0 40741 * @category Object 40742 * @param {Object} object The object to modify. 40743 * @param {Array|string} path The path of the property to set. 40744 * @param {*} value The value to set. 40745 * @param {Function} [customizer] The function to customize assigned values. 40746 * @returns {Object} Returns `object`. 40747 * @example 40748 * 40749 * var object = {}; 40750 * 40751 * _.setWith(object, '[0][1]', 'a', Object); 40752 * // => { '0': { '1': 'a' } } 40753 */ 40754 function setWith(object, path, value, customizer) { 40755 customizer = typeof customizer == 'function' ? customizer : undefined; 40756 return object == null ? object : baseSet(object, path, value, customizer); 40757 } 40758 40759 /** 40760 * Creates an array of own enumerable string keyed-value pairs for `object` 40761 * which can be consumed by `_.fromPairs`. If `object` is a map or set, its 40762 * entries are returned. 40763 * 40764 * @static 40765 * @memberOf _ 40766 * @since 4.0.0 40767 * @alias entries 40768 * @category Object 40769 * @param {Object} object The object to query. 40770 * @returns {Array} Returns the key-value pairs. 40771 * @example 40772 * 40773 * function Foo() { 40774 * this.a = 1; 40775 * this.b = 2; 40776 * } 40777 * 40778 * Foo.prototype.c = 3; 40779 * 40780 * _.toPairs(new Foo); 40781 * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) 40782 */ 40783 var toPairs = createToPairs(keys); 40784 40785 /** 40786 * Creates an array of own and inherited enumerable string keyed-value pairs 40787 * for `object` which can be consumed by `_.fromPairs`. If `object` is a map 40788 * or set, its entries are returned. 40789 * 40790 * @static 40791 * @memberOf _ 40792 * @since 4.0.0 40793 * @alias entriesIn 40794 * @category Object 40795 * @param {Object} object The object to query. 40796 * @returns {Array} Returns the key-value pairs. 40797 * @example 40798 * 40799 * function Foo() { 40800 * this.a = 1; 40801 * this.b = 2; 40802 * } 40803 * 40804 * Foo.prototype.c = 3; 40805 * 40806 * _.toPairsIn(new Foo); 40807 * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) 40808 */ 40809 var toPairsIn = createToPairs(keysIn); 40810 40811 /** 40812 * An alternative to `_.reduce`; this method transforms `object` to a new 40813 * `accumulator` object which is the result of running each of its own 40814 * enumerable string keyed properties thru `iteratee`, with each invocation 40815 * potentially mutating the `accumulator` object. If `accumulator` is not 40816 * provided, a new object with the same `[[Prototype]]` will be used. The 40817 * iteratee is invoked with four arguments: (accumulator, value, key, object). 40818 * Iteratee functions may exit iteration early by explicitly returning `false`. 40819 * 40820 * @static 40821 * @memberOf _ 40822 * @since 1.3.0 40823 * @category Object 40824 * @param {Object} object The object to iterate over. 40825 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 40826 * @param {*} [accumulator] The custom accumulator value. 40827 * @returns {*} Returns the accumulated value. 40828 * @example 40829 * 40830 * _.transform([2, 3, 4], function(result, n) { 40831 * result.push(n *= n); 40832 * return n % 2 == 0; 40833 * }, []); 40834 * // => [4, 9] 40835 * 40836 * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { 40837 * (result[value] || (result[value] = [])).push(key); 40838 * }, {}); 40839 * // => { '1': ['a', 'c'], '2': ['b'] } 40840 */ 40841 function transform(object, iteratee, accumulator) { 40842 var isArr = isArray(object), 40843 isArrLike = isArr || isBuffer(object) || isTypedArray(object); 40844 40845 iteratee = getIteratee(iteratee, 4); 40846 if (accumulator == null) { 40847 var Ctor = object && object.constructor; 40848 if (isArrLike) { 40849 accumulator = isArr ? new Ctor : []; 40850 } 40851 else if (isObject(object)) { 40852 accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; 40853 } 40854 else { 40855 accumulator = {}; 40856 } 40857 } 40858 (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { 40859 return iteratee(accumulator, value, index, object); 40860 }); 40861 return accumulator; 40862 } 40863 40864 /** 40865 * Removes the property at `path` of `object`. 40866 * 40867 * **Note:** This method mutates `object`. 40868 * 40869 * @static 40870 * @memberOf _ 40871 * @since 4.0.0 40872 * @category Object 40873 * @param {Object} object The object to modify. 40874 * @param {Array|string} path The path of the property to unset. 40875 * @returns {boolean} Returns `true` if the property is deleted, else `false`. 40876 * @example 40877 * 40878 * var object = { 'a': [{ 'b': { 'c': 7 } }] }; 40879 * _.unset(object, 'a[0].b.c'); 40880 * // => true 40881 * 40882 * console.log(object); 40883 * // => { 'a': [{ 'b': {} }] }; 40884 * 40885 * _.unset(object, ['a', '0', 'b', 'c']); 40886 * // => true 40887 * 40888 * console.log(object); 40889 * // => { 'a': [{ 'b': {} }] }; 40890 */ 40891 function unset(object, path) { 40892 return object == null ? true : baseUnset(object, path); 40893 } 40894 40895 /** 40896 * This method is like `_.set` except that accepts `updater` to produce the 40897 * value to set. Use `_.updateWith` to customize `path` creation. The `updater` 40898 * is invoked with one argument: (value). 40899 * 40900 * **Note:** This method mutates `object`. 40901 * 40902 * @static 40903 * @memberOf _ 40904 * @since 4.6.0 40905 * @category Object 40906 * @param {Object} object The object to modify. 40907 * @param {Array|string} path The path of the property to set. 40908 * @param {Function} updater The function to produce the updated value. 40909 * @returns {Object} Returns `object`. 40910 * @example 40911 * 40912 * var object = { 'a': [{ 'b': { 'c': 3 } }] }; 40913 * 40914 * _.update(object, 'a[0].b.c', function(n) { return n * n; }); 40915 * console.log(object.a[0].b.c); 40916 * // => 9 40917 * 40918 * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); 40919 * console.log(object.x[0].y.z); 40920 * // => 0 40921 */ 40922 function update(object, path, updater) { 40923 return object == null ? object : baseUpdate(object, path, castFunction(updater)); 40924 } 40925 40926 /** 40927 * This method is like `_.update` except that it accepts `customizer` which is 40928 * invoked to produce the objects of `path`. If `customizer` returns `undefined` 40929 * path creation is handled by the method instead. The `customizer` is invoked 40930 * with three arguments: (nsValue, key, nsObject). 40931 * 40932 * **Note:** This method mutates `object`. 40933 * 40934 * @static 40935 * @memberOf _ 40936 * @since 4.6.0 40937 * @category Object 40938 * @param {Object} object The object to modify. 40939 * @param {Array|string} path The path of the property to set. 40940 * @param {Function} updater The function to produce the updated value. 40941 * @param {Function} [customizer] The function to customize assigned values. 40942 * @returns {Object} Returns `object`. 40943 * @example 40944 * 40945 * var object = {}; 40946 * 40947 * _.updateWith(object, '[0][1]', _.constant('a'), Object); 40948 * // => { '0': { '1': 'a' } } 40949 */ 40950 function updateWith(object, path, updater, customizer) { 40951 customizer = typeof customizer == 'function' ? customizer : undefined; 40952 return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); 40953 } 40954 40955 /** 40956 * Creates an array of the own enumerable string keyed property values of `object`. 40957 * 40958 * **Note:** Non-object values are coerced to objects. 40959 * 40960 * @static 40961 * @since 0.1.0 40962 * @memberOf _ 40963 * @category Object 40964 * @param {Object} object The object to query. 40965 * @returns {Array} Returns the array of property values. 40966 * @example 40967 * 40968 * function Foo() { 40969 * this.a = 1; 40970 * this.b = 2; 40971 * } 40972 * 40973 * Foo.prototype.c = 3; 40974 * 40975 * _.values(new Foo); 40976 * // => [1, 2] (iteration order is not guaranteed) 40977 * 40978 * _.values('hi'); 40979 * // => ['h', 'i'] 40980 */ 40981 function values(object) { 40982 return object == null ? [] : baseValues(object, keys(object)); 40983 } 40984 40985 /** 40986 * Creates an array of the own and inherited enumerable string keyed property 40987 * values of `object`. 40988 * 40989 * **Note:** Non-object values are coerced to objects. 40990 * 40991 * @static 40992 * @memberOf _ 40993 * @since 3.0.0 40994 * @category Object 40995 * @param {Object} object The object to query. 40996 * @returns {Array} Returns the array of property values. 40997 * @example 40998 * 40999 * function Foo() { 41000 * this.a = 1; 41001 * this.b = 2; 41002 * } 41003 * 41004 * Foo.prototype.c = 3; 41005 * 41006 * _.valuesIn(new Foo); 41007 * // => [1, 2, 3] (iteration order is not guaranteed) 41008 */ 41009 function valuesIn(object) { 41010 return object == null ? [] : baseValues(object, keysIn(object)); 41011 } 41012 41013 /*------------------------------------------------------------------------*/ 41014 41015 /** 41016 * Clamps `number` within the inclusive `lower` and `upper` bounds. 41017 * 41018 * @static 41019 * @memberOf _ 41020 * @since 4.0.0 41021 * @category Number 41022 * @param {number} number The number to clamp. 41023 * @param {number} [lower] The lower bound. 41024 * @param {number} upper The upper bound. 41025 * @returns {number} Returns the clamped number. 41026 * @example 41027 * 41028 * _.clamp(-10, -5, 5); 41029 * // => -5 41030 * 41031 * _.clamp(10, -5, 5); 41032 * // => 5 41033 */ 41034 function clamp(number, lower, upper) { 41035 if (upper === undefined) { 41036 upper = lower; 41037 lower = undefined; 41038 } 41039 if (upper !== undefined) { 41040 upper = toNumber(upper); 41041 upper = upper === upper ? upper : 0; 41042 } 41043 if (lower !== undefined) { 41044 lower = toNumber(lower); 41045 lower = lower === lower ? lower : 0; 41046 } 41047 return baseClamp(toNumber(number), lower, upper); 41048 } 41049 41050 /** 41051 * Checks if `n` is between `start` and up to, but not including, `end`. If 41052 * `end` is not specified, it's set to `start` with `start` then set to `0`. 41053 * If `start` is greater than `end` the params are swapped to support 41054 * negative ranges. 41055 * 41056 * @static 41057 * @memberOf _ 41058 * @since 3.3.0 41059 * @category Number 41060 * @param {number} number The number to check. 41061 * @param {number} [start=0] The start of the range. 41062 * @param {number} end The end of the range. 41063 * @returns {boolean} Returns `true` if `number` is in the range, else `false`. 41064 * @see _.range, _.rangeRight 41065 * @example 41066 * 41067 * _.inRange(3, 2, 4); 41068 * // => true 41069 * 41070 * _.inRange(4, 8); 41071 * // => true 41072 * 41073 * _.inRange(4, 2); 41074 * // => false 41075 * 41076 * _.inRange(2, 2); 41077 * // => false 41078 * 41079 * _.inRange(1.2, 2); 41080 * // => true 41081 * 41082 * _.inRange(5.2, 4); 41083 * // => false 41084 * 41085 * _.inRange(-3, -2, -6); 41086 * // => true 41087 */ 41088 function inRange(number, start, end) { 41089 start = toFinite(start); 41090 if (end === undefined) { 41091 end = start; 41092 start = 0; 41093 } else { 41094 end = toFinite(end); 41095 } 41096 number = toNumber(number); 41097 return baseInRange(number, start, end); 41098 } 41099 41100 /** 41101 * Produces a random number between the inclusive `lower` and `upper` bounds. 41102 * If only one argument is provided a number between `0` and the given number 41103 * is returned. If `floating` is `true`, or either `lower` or `upper` are 41104 * floats, a floating-point number is returned instead of an integer. 41105 * 41106 * **Note:** JavaScript follows the IEEE-754 standard for resolving 41107 * floating-point values which can produce unexpected results. 41108 * 41109 * @static 41110 * @memberOf _ 41111 * @since 0.7.0 41112 * @category Number 41113 * @param {number} [lower=0] The lower bound. 41114 * @param {number} [upper=1] The upper bound. 41115 * @param {boolean} [floating] Specify returning a floating-point number. 41116 * @returns {number} Returns the random number. 41117 * @example 41118 * 41119 * _.random(0, 5); 41120 * // => an integer between 0 and 5 41121 * 41122 * _.random(5); 41123 * // => also an integer between 0 and 5 41124 * 41125 * _.random(5, true); 41126 * // => a floating-point number between 0 and 5 41127 * 41128 * _.random(1.2, 5.2); 41129 * // => a floating-point number between 1.2 and 5.2 41130 */ 41131 function random(lower, upper, floating) { 41132 if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { 41133 upper = floating = undefined; 41134 } 41135 if (floating === undefined) { 41136 if (typeof upper == 'boolean') { 41137 floating = upper; 41138 upper = undefined; 41139 } 41140 else if (typeof lower == 'boolean') { 41141 floating = lower; 41142 lower = undefined; 41143 } 41144 } 41145 if (lower === undefined && upper === undefined) { 41146 lower = 0; 41147 upper = 1; 41148 } 41149 else { 41150 lower = toFinite(lower); 41151 if (upper === undefined) { 41152 upper = lower; 41153 lower = 0; 41154 } else { 41155 upper = toFinite(upper); 41156 } 41157 } 41158 if (lower > upper) { 41159 var temp = lower; 41160 lower = upper; 41161 upper = temp; 41162 } 41163 if (floating || lower % 1 || upper % 1) { 41164 var rand = nativeRandom(); 41165 return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); 41166 } 41167 return baseRandom(lower, upper); 41168 } 41169 41170 /*------------------------------------------------------------------------*/ 41171 41172 /** 41173 * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). 41174 * 41175 * @static 41176 * @memberOf _ 41177 * @since 3.0.0 41178 * @category String 41179 * @param {string} [string=''] The string to convert. 41180 * @returns {string} Returns the camel cased string. 41181 * @example 41182 * 41183 * _.camelCase('Foo Bar'); 41184 * // => 'fooBar' 41185 * 41186 * _.camelCase('--foo-bar--'); 41187 * // => 'fooBar' 41188 * 41189 * _.camelCase('__FOO_BAR__'); 41190 * // => 'fooBar' 41191 */ 41192 var camelCase = createCompounder(function(result, word, index) { 41193 word = word.toLowerCase(); 41194 return result + (index ? capitalize(word) : word); 41195 }); 41196 41197 /** 41198 * Converts the first character of `string` to upper case and the remaining 41199 * to lower case. 41200 * 41201 * @static 41202 * @memberOf _ 41203 * @since 3.0.0 41204 * @category String 41205 * @param {string} [string=''] The string to capitalize. 41206 * @returns {string} Returns the capitalized string. 41207 * @example 41208 * 41209 * _.capitalize('FRED'); 41210 * // => 'Fred' 41211 */ 41212 function capitalize(string) { 41213 return upperFirst(toString(string).toLowerCase()); 41214 } 41215 41216 /** 41217 * Deburrs `string` by converting 41218 * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) 41219 * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) 41220 * letters to basic Latin letters and removing 41221 * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). 41222 * 41223 * @static 41224 * @memberOf _ 41225 * @since 3.0.0 41226 * @category String 41227 * @param {string} [string=''] The string to deburr. 41228 * @returns {string} Returns the deburred string. 41229 * @example 41230 * 41231 * _.deburr('déjà vu'); 41232 * // => 'deja vu' 41233 */ 41234 function deburr(string) { 41235 string = toString(string); 41236 return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); 41237 } 41238 41239 /** 41240 * Checks if `string` ends with the given target string. 41241 * 41242 * @static 41243 * @memberOf _ 41244 * @since 3.0.0 41245 * @category String 41246 * @param {string} [string=''] The string to inspect. 41247 * @param {string} [target] The string to search for. 41248 * @param {number} [position=string.length] The position to search up to. 41249 * @returns {boolean} Returns `true` if `string` ends with `target`, 41250 * else `false`. 41251 * @example 41252 * 41253 * _.endsWith('abc', 'c'); 41254 * // => true 41255 * 41256 * _.endsWith('abc', 'b'); 41257 * // => false 41258 * 41259 * _.endsWith('abc', 'b', 2); 41260 * // => true 41261 */ 41262 function endsWith(string, target, position) { 41263 string = toString(string); 41264 target = baseToString(target); 41265 41266 var length = string.length; 41267 position = position === undefined 41268 ? length 41269 : baseClamp(toInteger(position), 0, length); 41270 41271 var end = position; 41272 position -= target.length; 41273 return position >= 0 && string.slice(position, end) == target; 41274 } 41275 41276 /** 41277 * Converts the characters "&", "<", ">", '"', and "'" in `string` to their 41278 * corresponding HTML entities. 41279 * 41280 * **Note:** No other characters are escaped. To escape additional 41281 * characters use a third-party library like [_he_](https://mths.be/he). 41282 * 41283 * Though the ">" character is escaped for symmetry, characters like 41284 * ">" and "/" don't need escaping in HTML and have no special meaning 41285 * unless they're part of a tag or unquoted attribute value. See 41286 * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) 41287 * (under "semi-related fun fact") for more details. 41288 * 41289 * When working with HTML you should always 41290 * [quote attribute values](http://wonko.com/post/html-escaping) to reduce 41291 * XSS vectors. 41292 * 41293 * @static 41294 * @since 0.1.0 41295 * @memberOf _ 41296 * @category String 41297 * @param {string} [string=''] The string to escape. 41298 * @returns {string} Returns the escaped string. 41299 * @example 41300 * 41301 * _.escape('fred, barney, & pebbles'); 41302 * // => 'fred, barney, & pebbles' 41303 */ 41304 function escape(string) { 41305 string = toString(string); 41306 return (string && reHasUnescapedHtml.test(string)) 41307 ? string.replace(reUnescapedHtml, escapeHtmlChar) 41308 : string; 41309 } 41310 41311 /** 41312 * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", 41313 * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. 41314 * 41315 * @static 41316 * @memberOf _ 41317 * @since 3.0.0 41318 * @category String 41319 * @param {string} [string=''] The string to escape. 41320 * @returns {string} Returns the escaped string. 41321 * @example 41322 * 41323 * _.escapeRegExp('[lodash](https://lodash.com/)'); 41324 * // => '\[lodash\]\(https://lodash\.com/\)' 41325 */ 41326 function escapeRegExp(string) { 41327 string = toString(string); 41328 return (string && reHasRegExpChar.test(string)) 41329 ? string.replace(reRegExpChar, '\\$&') 41330 : string; 41331 } 41332 41333 /** 41334 * Converts `string` to 41335 * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). 41336 * 41337 * @static 41338 * @memberOf _ 41339 * @since 3.0.0 41340 * @category String 41341 * @param {string} [string=''] The string to convert. 41342 * @returns {string} Returns the kebab cased string. 41343 * @example 41344 * 41345 * _.kebabCase('Foo Bar'); 41346 * // => 'foo-bar' 41347 * 41348 * _.kebabCase('fooBar'); 41349 * // => 'foo-bar' 41350 * 41351 * _.kebabCase('__FOO_BAR__'); 41352 * // => 'foo-bar' 41353 */ 41354 var kebabCase = createCompounder(function(result, word, index) { 41355 return result + (index ? '-' : '') + word.toLowerCase(); 41356 }); 41357 41358 /** 41359 * Converts `string`, as space separated words, to lower case. 41360 * 41361 * @static 41362 * @memberOf _ 41363 * @since 4.0.0 41364 * @category String 41365 * @param {string} [string=''] The string to convert. 41366 * @returns {string} Returns the lower cased string. 41367 * @example 41368 * 41369 * _.lowerCase('--Foo-Bar--'); 41370 * // => 'foo bar' 41371 * 41372 * _.lowerCase('fooBar'); 41373 * // => 'foo bar' 41374 * 41375 * _.lowerCase('__FOO_BAR__'); 41376 * // => 'foo bar' 41377 */ 41378 var lowerCase = createCompounder(function(result, word, index) { 41379 return result + (index ? ' ' : '') + word.toLowerCase(); 41380 }); 41381 41382 /** 41383 * Converts the first character of `string` to lower case. 41384 * 41385 * @static 41386 * @memberOf _ 41387 * @since 4.0.0 41388 * @category String 41389 * @param {string} [string=''] The string to convert. 41390 * @returns {string} Returns the converted string. 41391 * @example 41392 * 41393 * _.lowerFirst('Fred'); 41394 * // => 'fred' 41395 * 41396 * _.lowerFirst('FRED'); 41397 * // => 'fRED' 41398 */ 41399 var lowerFirst = createCaseFirst('toLowerCase'); 41400 41401 /** 41402 * Pads `string` on the left and right sides if it's shorter than `length`. 41403 * Padding characters are truncated if they can't be evenly divided by `length`. 41404 * 41405 * @static 41406 * @memberOf _ 41407 * @since 3.0.0 41408 * @category String 41409 * @param {string} [string=''] The string to pad. 41410 * @param {number} [length=0] The padding length. 41411 * @param {string} [chars=' '] The string used as padding. 41412 * @returns {string} Returns the padded string. 41413 * @example 41414 * 41415 * _.pad('abc', 8); 41416 * // => ' abc ' 41417 * 41418 * _.pad('abc', 8, '_-'); 41419 * // => '_-abc_-_' 41420 * 41421 * _.pad('abc', 3); 41422 * // => 'abc' 41423 */ 41424 function pad(string, length, chars) { 41425 string = toString(string); 41426 length = toInteger(length); 41427 41428 var strLength = length ? stringSize(string) : 0; 41429 if (!length || strLength >= length) { 41430 return string; 41431 } 41432 var mid = (length - strLength) / 2; 41433 return ( 41434 createPadding(nativeFloor(mid), chars) + 41435 string + 41436 createPadding(nativeCeil(mid), chars) 41437 ); 41438 } 41439 41440 /** 41441 * Pads `string` on the right side if it's shorter than `length`. Padding 41442 * characters are truncated if they exceed `length`. 41443 * 41444 * @static 41445 * @memberOf _ 41446 * @since 4.0.0 41447 * @category String 41448 * @param {string} [string=''] The string to pad. 41449 * @param {number} [length=0] The padding length. 41450 * @param {string} [chars=' '] The string used as padding. 41451 * @returns {string} Returns the padded string. 41452 * @example 41453 * 41454 * _.padEnd('abc', 6); 41455 * // => 'abc ' 41456 * 41457 * _.padEnd('abc', 6, '_-'); 41458 * // => 'abc_-_' 41459 * 41460 * _.padEnd('abc', 3); 41461 * // => 'abc' 41462 */ 41463 function padEnd(string, length, chars) { 41464 string = toString(string); 41465 length = toInteger(length); 41466 41467 var strLength = length ? stringSize(string) : 0; 41468 return (length && strLength < length) 41469 ? (string + createPadding(length - strLength, chars)) 41470 : string; 41471 } 41472 41473 /** 41474 * Pads `string` on the left side if it's shorter than `length`. Padding 41475 * characters are truncated if they exceed `length`. 41476 * 41477 * @static 41478 * @memberOf _ 41479 * @since 4.0.0 41480 * @category String 41481 * @param {string} [string=''] The string to pad. 41482 * @param {number} [length=0] The padding length. 41483 * @param {string} [chars=' '] The string used as padding. 41484 * @returns {string} Returns the padded string. 41485 * @example 41486 * 41487 * _.padStart('abc', 6); 41488 * // => ' abc' 41489 * 41490 * _.padStart('abc', 6, '_-'); 41491 * // => '_-_abc' 41492 * 41493 * _.padStart('abc', 3); 41494 * // => 'abc' 41495 */ 41496 function padStart(string, length, chars) { 41497 string = toString(string); 41498 length = toInteger(length); 41499 41500 var strLength = length ? stringSize(string) : 0; 41501 return (length && strLength < length) 41502 ? (createPadding(length - strLength, chars) + string) 41503 : string; 41504 } 41505 41506 /** 41507 * Converts `string` to an integer of the specified radix. If `radix` is 41508 * `undefined` or `0`, a `radix` of `10` is used unless `value` is a 41509 * hexadecimal, in which case a `radix` of `16` is used. 41510 * 41511 * **Note:** This method aligns with the 41512 * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. 41513 * 41514 * @static 41515 * @memberOf _ 41516 * @since 1.1.0 41517 * @category String 41518 * @param {string} string The string to convert. 41519 * @param {number} [radix=10] The radix to interpret `value` by. 41520 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 41521 * @returns {number} Returns the converted integer. 41522 * @example 41523 * 41524 * _.parseInt('08'); 41525 * // => 8 41526 * 41527 * _.map(['6', '08', '10'], _.parseInt); 41528 * // => [6, 8, 10] 41529 */ 41530 function parseInt(string, radix, guard) { 41531 if (guard || radix == null) { 41532 radix = 0; 41533 } else if (radix) { 41534 radix = +radix; 41535 } 41536 return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); 41537 } 41538 41539 /** 41540 * Repeats the given string `n` times. 41541 * 41542 * @static 41543 * @memberOf _ 41544 * @since 3.0.0 41545 * @category String 41546 * @param {string} [string=''] The string to repeat. 41547 * @param {number} [n=1] The number of times to repeat the string. 41548 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 41549 * @returns {string} Returns the repeated string. 41550 * @example 41551 * 41552 * _.repeat('*', 3); 41553 * // => '***' 41554 * 41555 * _.repeat('abc', 2); 41556 * // => 'abcabc' 41557 * 41558 * _.repeat('abc', 0); 41559 * // => '' 41560 */ 41561 function repeat(string, n, guard) { 41562 if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { 41563 n = 1; 41564 } else { 41565 n = toInteger(n); 41566 } 41567 return baseRepeat(toString(string), n); 41568 } 41569 41570 /** 41571 * Replaces matches for `pattern` in `string` with `replacement`. 41572 * 41573 * **Note:** This method is based on 41574 * [`String#replace`](https://mdn.io/String/replace). 41575 * 41576 * @static 41577 * @memberOf _ 41578 * @since 4.0.0 41579 * @category String 41580 * @param {string} [string=''] The string to modify. 41581 * @param {RegExp|string} pattern The pattern to replace. 41582 * @param {Function|string} replacement The match replacement. 41583 * @returns {string} Returns the modified string. 41584 * @example 41585 * 41586 * _.replace('Hi Fred', 'Fred', 'Barney'); 41587 * // => 'Hi Barney' 41588 */ 41589 function replace() { 41590 var args = arguments, 41591 string = toString(args[0]); 41592 41593 return args.length < 3 ? string : string.replace(args[1], args[2]); 41594 } 41595 41596 /** 41597 * Converts `string` to 41598 * [snake case](https://en.wikipedia.org/wiki/Snake_case). 41599 * 41600 * @static 41601 * @memberOf _ 41602 * @since 3.0.0 41603 * @category String 41604 * @param {string} [string=''] The string to convert. 41605 * @returns {string} Returns the snake cased string. 41606 * @example 41607 * 41608 * _.snakeCase('Foo Bar'); 41609 * // => 'foo_bar' 41610 * 41611 * _.snakeCase('fooBar'); 41612 * // => 'foo_bar' 41613 * 41614 * _.snakeCase('--FOO-BAR--'); 41615 * // => 'foo_bar' 41616 */ 41617 var snakeCase = createCompounder(function(result, word, index) { 41618 return result + (index ? '_' : '') + word.toLowerCase(); 41619 }); 41620 41621 /** 41622 * Splits `string` by `separator`. 41623 * 41624 * **Note:** This method is based on 41625 * [`String#split`](https://mdn.io/String/split). 41626 * 41627 * @static 41628 * @memberOf _ 41629 * @since 4.0.0 41630 * @category String 41631 * @param {string} [string=''] The string to split. 41632 * @param {RegExp|string} separator The separator pattern to split by. 41633 * @param {number} [limit] The length to truncate results to. 41634 * @returns {Array} Returns the string segments. 41635 * @example 41636 * 41637 * _.split('a-b-c', '-', 2); 41638 * // => ['a', 'b'] 41639 */ 41640 function split(string, separator, limit) { 41641 if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { 41642 separator = limit = undefined; 41643 } 41644 limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; 41645 if (!limit) { 41646 return []; 41647 } 41648 string = toString(string); 41649 if (string && ( 41650 typeof separator == 'string' || 41651 (separator != null && !isRegExp(separator)) 41652 )) { 41653 separator = baseToString(separator); 41654 if (!separator && hasUnicode(string)) { 41655 return castSlice(stringToArray(string), 0, limit); 41656 } 41657 } 41658 return string.split(separator, limit); 41659 } 41660 41661 /** 41662 * Converts `string` to 41663 * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). 41664 * 41665 * @static 41666 * @memberOf _ 41667 * @since 3.1.0 41668 * @category String 41669 * @param {string} [string=''] The string to convert. 41670 * @returns {string} Returns the start cased string. 41671 * @example 41672 * 41673 * _.startCase('--foo-bar--'); 41674 * // => 'Foo Bar' 41675 * 41676 * _.startCase('fooBar'); 41677 * // => 'Foo Bar' 41678 * 41679 * _.startCase('__FOO_BAR__'); 41680 * // => 'FOO BAR' 41681 */ 41682 var startCase = createCompounder(function(result, word, index) { 41683 return result + (index ? ' ' : '') + upperFirst(word); 41684 }); 41685 41686 /** 41687 * Checks if `string` starts with the given target string. 41688 * 41689 * @static 41690 * @memberOf _ 41691 * @since 3.0.0 41692 * @category String 41693 * @param {string} [string=''] The string to inspect. 41694 * @param {string} [target] The string to search for. 41695 * @param {number} [position=0] The position to search from. 41696 * @returns {boolean} Returns `true` if `string` starts with `target`, 41697 * else `false`. 41698 * @example 41699 * 41700 * _.startsWith('abc', 'a'); 41701 * // => true 41702 * 41703 * _.startsWith('abc', 'b'); 41704 * // => false 41705 * 41706 * _.startsWith('abc', 'b', 1); 41707 * // => true 41708 */ 41709 function startsWith(string, target, position) { 41710 string = toString(string); 41711 position = position == null 41712 ? 0 41713 : baseClamp(toInteger(position), 0, string.length); 41714 41715 target = baseToString(target); 41716 return string.slice(position, position + target.length) == target; 41717 } 41718 41719 /** 41720 * Creates a compiled template function that can interpolate data properties 41721 * in "interpolate" delimiters, HTML-escape interpolated data properties in 41722 * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data 41723 * properties may be accessed as free variables in the template. If a setting 41724 * object is given, it takes precedence over `_.templateSettings` values. 41725 * 41726 * **Note:** In the development build `_.template` utilizes 41727 * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) 41728 * for easier debugging. 41729 * 41730 * For more information on precompiling templates see 41731 * [lodash's custom builds documentation](https://lodash.com/custom-builds). 41732 * 41733 * For more information on Chrome extension sandboxes see 41734 * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). 41735 * 41736 * @static 41737 * @since 0.1.0 41738 * @memberOf _ 41739 * @category String 41740 * @param {string} [string=''] The template string. 41741 * @param {Object} [options={}] The options object. 41742 * @param {RegExp} [options.escape=_.templateSettings.escape] 41743 * The HTML "escape" delimiter. 41744 * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] 41745 * The "evaluate" delimiter. 41746 * @param {Object} [options.imports=_.templateSettings.imports] 41747 * An object to import into the template as free variables. 41748 * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] 41749 * The "interpolate" delimiter. 41750 * @param {string} [options.sourceURL='lodash.templateSources[n]'] 41751 * The sourceURL of the compiled template. 41752 * @param {string} [options.variable='obj'] 41753 * The data object variable name. 41754 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 41755 * @returns {Function} Returns the compiled template function. 41756 * @example 41757 * 41758 * // Use the "interpolate" delimiter to create a compiled template. 41759 * var compiled = _.template('hello <%= user %>!'); 41760 * compiled({ 'user': 'fred' }); 41761 * // => 'hello fred!' 41762 * 41763 * // Use the HTML "escape" delimiter to escape data property values. 41764 * var compiled = _.template('<b><%- value %></b>'); 41765 * compiled({ 'value': '<script>' }); 41766 * // => '<b><script></b>' 41767 * 41768 * // Use the "evaluate" delimiter to execute JavaScript and generate HTML. 41769 * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>'); 41770 * compiled({ 'users': ['fred', 'barney'] }); 41771 * // => '<li>fred</li><li>barney</li>' 41772 * 41773 * // Use the internal `print` function in "evaluate" delimiters. 41774 * var compiled = _.template('<% print("hello " + user); %>!'); 41775 * compiled({ 'user': 'barney' }); 41776 * // => 'hello barney!' 41777 * 41778 * // Use the ES template literal delimiter as an "interpolate" delimiter. 41779 * // Disable support by replacing the "interpolate" delimiter. 41780 * var compiled = _.template('hello ${ user }!'); 41781 * compiled({ 'user': 'pebbles' }); 41782 * // => 'hello pebbles!' 41783 * 41784 * // Use backslashes to treat delimiters as plain text. 41785 * var compiled = _.template('<%= "\\<%- value %\\>" %>'); 41786 * compiled({ 'value': 'ignored' }); 41787 * // => '<%- value %>' 41788 * 41789 * // Use the `imports` option to import `jQuery` as `jq`. 41790 * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>'; 41791 * var compiled = _.template(text, { 'imports': { 'jq': jQuery } }); 41792 * compiled({ 'users': ['fred', 'barney'] }); 41793 * // => '<li>fred</li><li>barney</li>' 41794 * 41795 * // Use the `sourceURL` option to specify a custom sourceURL for the template. 41796 * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' }); 41797 * compiled(data); 41798 * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector. 41799 * 41800 * // Use the `variable` option to ensure a with-statement isn't used in the compiled template. 41801 * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' }); 41802 * compiled.source; 41803 * // => function(data) { 41804 * // var __t, __p = ''; 41805 * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!'; 41806 * // return __p; 41807 * // } 41808 * 41809 * // Use custom template delimiters. 41810 * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g; 41811 * var compiled = _.template('hello {{ user }}!'); 41812 * compiled({ 'user': 'mustache' }); 41813 * // => 'hello mustache!' 41814 * 41815 * // Use the `source` property to inline compiled templates for meaningful 41816 * // line numbers in error messages and stack traces. 41817 * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\ 41818 * var JST = {\ 41819 * "main": ' + _.template(mainText).source + '\ 41820 * };\ 41821 * '); 41822 */ 41823 function template(string, options, guard) { 41824 // Based on John Resig's `tmpl` implementation 41825 // (http://ejohn.org/blog/javascript-micro-templating/) 41826 // and Laura Doktorova's doT.js (https://github.com/olado/doT). 41827 var settings = lodash.templateSettings; 41828 41829 if (guard && isIterateeCall(string, options, guard)) { 41830 options = undefined; 41831 } 41832 string = toString(string); 41833 options = assignInWith({}, options, settings, customDefaultsAssignIn); 41834 41835 var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn), 41836 importsKeys = keys(imports), 41837 importsValues = baseValues(imports, importsKeys); 41838 41839 var isEscaping, 41840 isEvaluating, 41841 index = 0, 41842 interpolate = options.interpolate || reNoMatch, 41843 source = "__p += '"; 41844 41845 // Compile the regexp to match each delimiter. 41846 var reDelimiters = RegExp( 41847 (options.escape || reNoMatch).source + '|' + 41848 interpolate.source + '|' + 41849 (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' + 41850 (options.evaluate || reNoMatch).source + '|$' 41851 , 'g'); 41852 41853 // Use a sourceURL for easier debugging. 41854 // The sourceURL gets injected into the source that's eval-ed, so be careful 41855 // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in 41856 // and escape the comment, thus injecting code that gets evaled. 41857 var sourceURL = '//# sourceURL=' + 41858 (hasOwnProperty.call(options, 'sourceURL') 41859 ? (options.sourceURL + '').replace(/\s/g, ' ') 41860 : ('lodash.templateSources[' + (++templateCounter) + ']') 41861 ) + '\n'; 41862 41863 string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) { 41864 interpolateValue || (interpolateValue = esTemplateValue); 41865 41866 // Escape characters that can't be included in string literals. 41867 source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar); 41868 41869 // Replace delimiters with snippets. 41870 if (escapeValue) { 41871 isEscaping = true; 41872 source += "' +\n__e(" + escapeValue + ") +\n'"; 41873 } 41874 if (evaluateValue) { 41875 isEvaluating = true; 41876 source += "';\n" + evaluateValue + ";\n__p += '"; 41877 } 41878 if (interpolateValue) { 41879 source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'"; 41880 } 41881 index = offset + match.length; 41882 41883 // The JS engine embedded in Adobe products needs `match` returned in 41884 // order to produce the correct `offset` value. 41885 return match; 41886 }); 41887 41888 source += "';\n"; 41889 41890 // If `variable` is not specified wrap a with-statement around the generated 41891 // code to add the data object to the top of the scope chain. 41892 var variable = hasOwnProperty.call(options, 'variable') && options.variable; 41893 if (!variable) { 41894 source = 'with (obj) {\n' + source + '\n}\n'; 41895 } 41896 // Throw an error if a forbidden character was found in `variable`, to prevent 41897 // potential command injection attacks. 41898 else if (reForbiddenIdentifierChars.test(variable)) { 41899 throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT); 41900 } 41901 41902 // Cleanup code by stripping empty strings. 41903 source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source) 41904 .replace(reEmptyStringMiddle, '$1') 41905 .replace(reEmptyStringTrailing, '$1;'); 41906 41907 // Frame code as the function body. 41908 source = 'function(' + (variable || 'obj') + ') {\n' + 41909 (variable 41910 ? '' 41911 : 'obj || (obj = {});\n' 41912 ) + 41913 "var __t, __p = ''" + 41914 (isEscaping 41915 ? ', __e = _.escape' 41916 : '' 41917 ) + 41918 (isEvaluating 41919 ? ', __j = Array.prototype.join;\n' + 41920 "function print() { __p += __j.call(arguments, '') }\n" 41921 : ';\n' 41922 ) + 41923 source + 41924 'return __p\n}'; 41925 41926 var result = attempt(function() { 41927 return Function(importsKeys, sourceURL + 'return ' + source) 41928 .apply(undefined, importsValues); 41929 }); 41930 41931 // Provide the compiled function's source by its `toString` method or 41932 // the `source` property as a convenience for inlining compiled templates. 41933 result.source = source; 41934 if (isError(result)) { 41935 throw result; 41936 } 41937 return result; 41938 } 41939 41940 /** 41941 * Converts `string`, as a whole, to lower case just like 41942 * [String#toLowerCase](https://mdn.io/toLowerCase). 41943 * 41944 * @static 41945 * @memberOf _ 41946 * @since 4.0.0 41947 * @category String 41948 * @param {string} [string=''] The string to convert. 41949 * @returns {string} Returns the lower cased string. 41950 * @example 41951 * 41952 * _.toLower('--Foo-Bar--'); 41953 * // => '--foo-bar--' 41954 * 41955 * _.toLower('fooBar'); 41956 * // => 'foobar' 41957 * 41958 * _.toLower('__FOO_BAR__'); 41959 * // => '__foo_bar__' 41960 */ 41961 function toLower(value) { 41962 return toString(value).toLowerCase(); 41963 } 41964 41965 /** 41966 * Converts `string`, as a whole, to upper case just like 41967 * [String#toUpperCase](https://mdn.io/toUpperCase). 41968 * 41969 * @static 41970 * @memberOf _ 41971 * @since 4.0.0 41972 * @category String 41973 * @param {string} [string=''] The string to convert. 41974 * @returns {string} Returns the upper cased string. 41975 * @example 41976 * 41977 * _.toUpper('--foo-bar--'); 41978 * // => '--FOO-BAR--' 41979 * 41980 * _.toUpper('fooBar'); 41981 * // => 'FOOBAR' 41982 * 41983 * _.toUpper('__foo_bar__'); 41984 * // => '__FOO_BAR__' 41985 */ 41986 function toUpper(value) { 41987 return toString(value).toUpperCase(); 41988 } 41989 41990 /** 41991 * Removes leading and trailing whitespace or specified characters from `string`. 41992 * 41993 * @static 41994 * @memberOf _ 41995 * @since 3.0.0 41996 * @category String 41997 * @param {string} [string=''] The string to trim. 41998 * @param {string} [chars=whitespace] The characters to trim. 41999 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 42000 * @returns {string} Returns the trimmed string. 42001 * @example 42002 * 42003 * _.trim(' abc '); 42004 * // => 'abc' 42005 * 42006 * _.trim('-_-abc-_-', '_-'); 42007 * // => 'abc' 42008 * 42009 * _.map([' foo ', ' bar '], _.trim); 42010 * // => ['foo', 'bar'] 42011 */ 42012 function trim(string, chars, guard) { 42013 string = toString(string); 42014 if (string && (guard || chars === undefined)) { 42015 return baseTrim(string); 42016 } 42017 if (!string || !(chars = baseToString(chars))) { 42018 return string; 42019 } 42020 var strSymbols = stringToArray(string), 42021 chrSymbols = stringToArray(chars), 42022 start = charsStartIndex(strSymbols, chrSymbols), 42023 end = charsEndIndex(strSymbols, chrSymbols) + 1; 42024 42025 return castSlice(strSymbols, start, end).join(''); 42026 } 42027 42028 /** 42029 * Removes trailing whitespace or specified characters from `string`. 42030 * 42031 * @static 42032 * @memberOf _ 42033 * @since 4.0.0 42034 * @category String 42035 * @param {string} [string=''] The string to trim. 42036 * @param {string} [chars=whitespace] The characters to trim. 42037 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 42038 * @returns {string} Returns the trimmed string. 42039 * @example 42040 * 42041 * _.trimEnd(' abc '); 42042 * // => ' abc' 42043 * 42044 * _.trimEnd('-_-abc-_-', '_-'); 42045 * // => '-_-abc' 42046 */ 42047 function trimEnd(string, chars, guard) { 42048 string = toString(string); 42049 if (string && (guard || chars === undefined)) { 42050 return string.slice(0, trimmedEndIndex(string) + 1); 42051 } 42052 if (!string || !(chars = baseToString(chars))) { 42053 return string; 42054 } 42055 var strSymbols = stringToArray(string), 42056 end = charsEndIndex(strSymbols, stringToArray(chars)) + 1; 42057 42058 return castSlice(strSymbols, 0, end).join(''); 42059 } 42060 42061 /** 42062 * Removes leading whitespace or specified characters from `string`. 42063 * 42064 * @static 42065 * @memberOf _ 42066 * @since 4.0.0 42067 * @category String 42068 * @param {string} [string=''] The string to trim. 42069 * @param {string} [chars=whitespace] The characters to trim. 42070 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 42071 * @returns {string} Returns the trimmed string. 42072 * @example 42073 * 42074 * _.trimStart(' abc '); 42075 * // => 'abc ' 42076 * 42077 * _.trimStart('-_-abc-_-', '_-'); 42078 * // => 'abc-_-' 42079 */ 42080 function trimStart(string, chars, guard) { 42081 string = toString(string); 42082 if (string && (guard || chars === undefined)) { 42083 return string.replace(reTrimStart, ''); 42084 } 42085 if (!string || !(chars = baseToString(chars))) { 42086 return string; 42087 } 42088 var strSymbols = stringToArray(string), 42089 start = charsStartIndex(strSymbols, stringToArray(chars)); 42090 42091 return castSlice(strSymbols, start).join(''); 42092 } 42093 42094 /** 42095 * Truncates `string` if it's longer than the given maximum string length. 42096 * The last characters of the truncated string are replaced with the omission 42097 * string which defaults to "...". 42098 * 42099 * @static 42100 * @memberOf _ 42101 * @since 4.0.0 42102 * @category String 42103 * @param {string} [string=''] The string to truncate. 42104 * @param {Object} [options={}] The options object. 42105 * @param {number} [options.length=30] The maximum string length. 42106 * @param {string} [options.omission='...'] The string to indicate text is omitted. 42107 * @param {RegExp|string} [options.separator] The separator pattern to truncate to. 42108 * @returns {string} Returns the truncated string. 42109 * @example 42110 * 42111 * _.truncate('hi-diddly-ho there, neighborino'); 42112 * // => 'hi-diddly-ho there, neighbo...' 42113 * 42114 * _.truncate('hi-diddly-ho there, neighborino', { 42115 * 'length': 24, 42116 * 'separator': ' ' 42117 * }); 42118 * // => 'hi-diddly-ho there,...' 42119 * 42120 * _.truncate('hi-diddly-ho there, neighborino', { 42121 * 'length': 24, 42122 * 'separator': /,? +/ 42123 * }); 42124 * // => 'hi-diddly-ho there...' 42125 * 42126 * _.truncate('hi-diddly-ho there, neighborino', { 42127 * 'omission': ' [...]' 42128 * }); 42129 * // => 'hi-diddly-ho there, neig [...]' 42130 */ 42131 function truncate(string, options) { 42132 var length = DEFAULT_TRUNC_LENGTH, 42133 omission = DEFAULT_TRUNC_OMISSION; 42134 42135 if (isObject(options)) { 42136 var separator = 'separator' in options ? options.separator : separator; 42137 length = 'length' in options ? toInteger(options.length) : length; 42138 omission = 'omission' in options ? baseToString(options.omission) : omission; 42139 } 42140 string = toString(string); 42141 42142 var strLength = string.length; 42143 if (hasUnicode(string)) { 42144 var strSymbols = stringToArray(string); 42145 strLength = strSymbols.length; 42146 } 42147 if (length >= strLength) { 42148 return string; 42149 } 42150 var end = length - stringSize(omission); 42151 if (end < 1) { 42152 return omission; 42153 } 42154 var result = strSymbols 42155 ? castSlice(strSymbols, 0, end).join('') 42156 : string.slice(0, end); 42157 42158 if (separator === undefined) { 42159 return result + omission; 42160 } 42161 if (strSymbols) { 42162 end += (result.length - end); 42163 } 42164 if (isRegExp(separator)) { 42165 if (string.slice(end).search(separator)) { 42166 var match, 42167 substring = result; 42168 42169 if (!separator.global) { 42170 separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g'); 42171 } 42172 separator.lastIndex = 0; 42173 while ((match = separator.exec(substring))) { 42174 var newEnd = match.index; 42175 } 42176 result = result.slice(0, newEnd === undefined ? end : newEnd); 42177 } 42178 } else if (string.indexOf(baseToString(separator), end) != end) { 42179 var index = result.lastIndexOf(separator); 42180 if (index > -1) { 42181 result = result.slice(0, index); 42182 } 42183 } 42184 return result + omission; 42185 } 42186 42187 /** 42188 * The inverse of `_.escape`; this method converts the HTML entities 42189 * `&`, `<`, `>`, `"`, and `'` in `string` to 42190 * their corresponding characters. 42191 * 42192 * **Note:** No other HTML entities are unescaped. To unescape additional 42193 * HTML entities use a third-party library like [_he_](https://mths.be/he). 42194 * 42195 * @static 42196 * @memberOf _ 42197 * @since 0.6.0 42198 * @category String 42199 * @param {string} [string=''] The string to unescape. 42200 * @returns {string} Returns the unescaped string. 42201 * @example 42202 * 42203 * _.unescape('fred, barney, & pebbles'); 42204 * // => 'fred, barney, & pebbles' 42205 */ 42206 function unescape(string) { 42207 string = toString(string); 42208 return (string && reHasEscapedHtml.test(string)) 42209 ? string.replace(reEscapedHtml, unescapeHtmlChar) 42210 : string; 42211 } 42212 42213 /** 42214 * Converts `string`, as space separated words, to upper case. 42215 * 42216 * @static 42217 * @memberOf _ 42218 * @since 4.0.0 42219 * @category String 42220 * @param {string} [string=''] The string to convert. 42221 * @returns {string} Returns the upper cased string. 42222 * @example 42223 * 42224 * _.upperCase('--foo-bar'); 42225 * // => 'FOO BAR' 42226 * 42227 * _.upperCase('fooBar'); 42228 * // => 'FOO BAR' 42229 * 42230 * _.upperCase('__foo_bar__'); 42231 * // => 'FOO BAR' 42232 */ 42233 var upperCase = createCompounder(function(result, word, index) { 42234 return result + (index ? ' ' : '') + word.toUpperCase(); 42235 }); 42236 42237 /** 42238 * Converts the first character of `string` to upper case. 42239 * 42240 * @static 42241 * @memberOf _ 42242 * @since 4.0.0 42243 * @category String 42244 * @param {string} [string=''] The string to convert. 42245 * @returns {string} Returns the converted string. 42246 * @example 42247 * 42248 * _.upperFirst('fred'); 42249 * // => 'Fred' 42250 * 42251 * _.upperFirst('FRED'); 42252 * // => 'FRED' 42253 */ 42254 var upperFirst = createCaseFirst('toUpperCase'); 42255 42256 /** 42257 * Splits `string` into an array of its words. 42258 * 42259 * @static 42260 * @memberOf _ 42261 * @since 3.0.0 42262 * @category String 42263 * @param {string} [string=''] The string to inspect. 42264 * @param {RegExp|string} [pattern] The pattern to match words. 42265 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 42266 * @returns {Array} Returns the words of `string`. 42267 * @example 42268 * 42269 * _.words('fred, barney, & pebbles'); 42270 * // => ['fred', 'barney', 'pebbles'] 42271 * 42272 * _.words('fred, barney, & pebbles', /[^, ]+/g); 42273 * // => ['fred', 'barney', '&', 'pebbles'] 42274 */ 42275 function words(string, pattern, guard) { 42276 string = toString(string); 42277 pattern = guard ? undefined : pattern; 42278 42279 if (pattern === undefined) { 42280 return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); 42281 } 42282 return string.match(pattern) || []; 42283 } 42284 42285 /*------------------------------------------------------------------------*/ 42286 42287 /** 42288 * Attempts to invoke `func`, returning either the result or the caught error 42289 * object. Any additional arguments are provided to `func` when it's invoked. 42290 * 42291 * @static 42292 * @memberOf _ 42293 * @since 3.0.0 42294 * @category Util 42295 * @param {Function} func The function to attempt. 42296 * @param {...*} [args] The arguments to invoke `func` with. 42297 * @returns {*} Returns the `func` result or error object. 42298 * @example 42299 * 42300 * // Avoid throwing errors for invalid selectors. 42301 * var elements = _.attempt(function(selector) { 42302 * return document.querySelectorAll(selector); 42303 * }, '>_>'); 42304 * 42305 * if (_.isError(elements)) { 42306 * elements = []; 42307 * } 42308 */ 42309 var attempt = baseRest(function(func, args) { 42310 try { 42311 return apply(func, undefined, args); 42312 } catch (e) { 42313 return isError(e) ? e : new Error(e); 42314 } 42315 }); 42316 42317 /** 42318 * Binds methods of an object to the object itself, overwriting the existing 42319 * method. 42320 * 42321 * **Note:** This method doesn't set the "length" property of bound functions. 42322 * 42323 * @static 42324 * @since 0.1.0 42325 * @memberOf _ 42326 * @category Util 42327 * @param {Object} object The object to bind and assign the bound methods to. 42328 * @param {...(string|string[])} methodNames The object method names to bind. 42329 * @returns {Object} Returns `object`. 42330 * @example 42331 * 42332 * var view = { 42333 * 'label': 'docs', 42334 * 'click': function() { 42335 * console.log('clicked ' + this.label); 42336 * } 42337 * }; 42338 * 42339 * _.bindAll(view, ['click']); 42340 * jQuery(element).on('click', view.click); 42341 * // => Logs 'clicked docs' when clicked. 42342 */ 42343 var bindAll = flatRest(function(object, methodNames) { 42344 arrayEach(methodNames, function(key) { 42345 key = toKey(key); 42346 baseAssignValue(object, key, bind(object[key], object)); 42347 }); 42348 return object; 42349 }); 42350 42351 /** 42352 * Creates a function that iterates over `pairs` and invokes the corresponding 42353 * function of the first predicate to return truthy. The predicate-function 42354 * pairs are invoked with the `this` binding and arguments of the created 42355 * function. 42356 * 42357 * @static 42358 * @memberOf _ 42359 * @since 4.0.0 42360 * @category Util 42361 * @param {Array} pairs The predicate-function pairs. 42362 * @returns {Function} Returns the new composite function. 42363 * @example 42364 * 42365 * var func = _.cond([ 42366 * [_.matches({ 'a': 1 }), _.constant('matches A')], 42367 * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')], 42368 * [_.stubTrue, _.constant('no match')] 42369 * ]); 42370 * 42371 * func({ 'a': 1, 'b': 2 }); 42372 * // => 'matches A' 42373 * 42374 * func({ 'a': 0, 'b': 1 }); 42375 * // => 'matches B' 42376 * 42377 * func({ 'a': '1', 'b': '2' }); 42378 * // => 'no match' 42379 */ 42380 function cond(pairs) { 42381 var length = pairs == null ? 0 : pairs.length, 42382 toIteratee = getIteratee(); 42383 42384 pairs = !length ? [] : arrayMap(pairs, function(pair) { 42385 if (typeof pair[1] != 'function') { 42386 throw new TypeError(FUNC_ERROR_TEXT); 42387 } 42388 return [toIteratee(pair[0]), pair[1]]; 42389 }); 42390 42391 return baseRest(function(args) { 42392 var index = -1; 42393 while (++index < length) { 42394 var pair = pairs[index]; 42395 if (apply(pair[0], this, args)) { 42396 return apply(pair[1], this, args); 42397 } 42398 } 42399 }); 42400 } 42401 42402 /** 42403 * Creates a function that invokes the predicate properties of `source` with 42404 * the corresponding property values of a given object, returning `true` if 42405 * all predicates return truthy, else `false`. 42406 * 42407 * **Note:** The created function is equivalent to `_.conformsTo` with 42408 * `source` partially applied. 42409 * 42410 * @static 42411 * @memberOf _ 42412 * @since 4.0.0 42413 * @category Util 42414 * @param {Object} source The object of property predicates to conform to. 42415 * @returns {Function} Returns the new spec function. 42416 * @example 42417 * 42418 * var objects = [ 42419 * { 'a': 2, 'b': 1 }, 42420 * { 'a': 1, 'b': 2 } 42421 * ]; 42422 * 42423 * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } })); 42424 * // => [{ 'a': 1, 'b': 2 }] 42425 */ 42426 function conforms(source) { 42427 return baseConforms(baseClone(source, CLONE_DEEP_FLAG)); 42428 } 42429 42430 /** 42431 * Creates a function that returns `value`. 42432 * 42433 * @static 42434 * @memberOf _ 42435 * @since 2.4.0 42436 * @category Util 42437 * @param {*} value The value to return from the new function. 42438 * @returns {Function} Returns the new constant function. 42439 * @example 42440 * 42441 * var objects = _.times(2, _.constant({ 'a': 1 })); 42442 * 42443 * console.log(objects); 42444 * // => [{ 'a': 1 }, { 'a': 1 }] 42445 * 42446 * console.log(objects[0] === objects[1]); 42447 * // => true 42448 */ 42449 function constant(value) { 42450 return function() { 42451 return value; 42452 }; 42453 } 42454 42455 /** 42456 * Checks `value` to determine whether a default value should be returned in 42457 * its place. The `defaultValue` is returned if `value` is `NaN`, `null`, 42458 * or `undefined`. 42459 * 42460 * @static 42461 * @memberOf _ 42462 * @since 4.14.0 42463 * @category Util 42464 * @param {*} value The value to check. 42465 * @param {*} defaultValue The default value. 42466 * @returns {*} Returns the resolved value. 42467 * @example 42468 * 42469 * _.defaultTo(1, 10); 42470 * // => 1 42471 * 42472 * _.defaultTo(undefined, 10); 42473 * // => 10 42474 */ 42475 function defaultTo(value, defaultValue) { 42476 return (value == null || value !== value) ? defaultValue : value; 42477 } 42478 42479 /** 42480 * Creates a function that returns the result of invoking the given functions 42481 * with the `this` binding of the created function, where each successive 42482 * invocation is supplied the return value of the previous. 42483 * 42484 * @static 42485 * @memberOf _ 42486 * @since 3.0.0 42487 * @category Util 42488 * @param {...(Function|Function[])} [funcs] The functions to invoke. 42489 * @returns {Function} Returns the new composite function. 42490 * @see _.flowRight 42491 * @example 42492 * 42493 * function square(n) { 42494 * return n * n; 42495 * } 42496 * 42497 * var addSquare = _.flow([_.add, square]); 42498 * addSquare(1, 2); 42499 * // => 9 42500 */ 42501 var flow = createFlow(); 42502 42503 /** 42504 * This method is like `_.flow` except that it creates a function that 42505 * invokes the given functions from right to left. 42506 * 42507 * @static 42508 * @since 3.0.0 42509 * @memberOf _ 42510 * @category Util 42511 * @param {...(Function|Function[])} [funcs] The functions to invoke. 42512 * @returns {Function} Returns the new composite function. 42513 * @see _.flow 42514 * @example 42515 * 42516 * function square(n) { 42517 * return n * n; 42518 * } 42519 * 42520 * var addSquare = _.flowRight([square, _.add]); 42521 * addSquare(1, 2); 42522 * // => 9 42523 */ 42524 var flowRight = createFlow(true); 42525 42526 /** 42527 * This method returns the first argument it receives. 42528 * 42529 * @static 42530 * @since 0.1.0 42531 * @memberOf _ 42532 * @category Util 42533 * @param {*} value Any value. 42534 * @returns {*} Returns `value`. 42535 * @example 42536 * 42537 * var object = { 'a': 1 }; 42538 * 42539 * console.log(_.identity(object) === object); 42540 * // => true 42541 */ 42542 function identity(value) { 42543 return value; 42544 } 42545 42546 /** 42547 * Creates a function that invokes `func` with the arguments of the created 42548 * function. If `func` is a property name, the created function returns the 42549 * property value for a given element. If `func` is an array or object, the 42550 * created function returns `true` for elements that contain the equivalent 42551 * source properties, otherwise it returns `false`. 42552 * 42553 * @static 42554 * @since 4.0.0 42555 * @memberOf _ 42556 * @category Util 42557 * @param {*} [func=_.identity] The value to convert to a callback. 42558 * @returns {Function} Returns the callback. 42559 * @example 42560 * 42561 * var users = [ 42562 * { 'user': 'barney', 'age': 36, 'active': true }, 42563 * { 'user': 'fred', 'age': 40, 'active': false } 42564 * ]; 42565 * 42566 * // The `_.matches` iteratee shorthand. 42567 * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true })); 42568 * // => [{ 'user': 'barney', 'age': 36, 'active': true }] 42569 * 42570 * // The `_.matchesProperty` iteratee shorthand. 42571 * _.filter(users, _.iteratee(['user', 'fred'])); 42572 * // => [{ 'user': 'fred', 'age': 40 }] 42573 * 42574 * // The `_.property` iteratee shorthand. 42575 * _.map(users, _.iteratee('user')); 42576 * // => ['barney', 'fred'] 42577 * 42578 * // Create custom iteratee shorthands. 42579 * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) { 42580 * return !_.isRegExp(func) ? iteratee(func) : function(string) { 42581 * return func.test(string); 42582 * }; 42583 * }); 42584 * 42585 * _.filter(['abc', 'def'], /ef/); 42586 * // => ['def'] 42587 */ 42588 function iteratee(func) { 42589 return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG)); 42590 } 42591 42592 /** 42593 * Creates a function that performs a partial deep comparison between a given 42594 * object and `source`, returning `true` if the given object has equivalent 42595 * property values, else `false`. 42596 * 42597 * **Note:** The created function is equivalent to `_.isMatch` with `source` 42598 * partially applied. 42599 * 42600 * Partial comparisons will match empty array and empty object `source` 42601 * values against any array or object value, respectively. See `_.isEqual` 42602 * for a list of supported value comparisons. 42603 * 42604 * **Note:** Multiple values can be checked by combining several matchers 42605 * using `_.overSome` 42606 * 42607 * @static 42608 * @memberOf _ 42609 * @since 3.0.0 42610 * @category Util 42611 * @param {Object} source The object of property values to match. 42612 * @returns {Function} Returns the new spec function. 42613 * @example 42614 * 42615 * var objects = [ 42616 * { 'a': 1, 'b': 2, 'c': 3 }, 42617 * { 'a': 4, 'b': 5, 'c': 6 } 42618 * ]; 42619 * 42620 * _.filter(objects, _.matches({ 'a': 4, 'c': 6 })); 42621 * // => [{ 'a': 4, 'b': 5, 'c': 6 }] 42622 * 42623 * // Checking for several possible values 42624 * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })])); 42625 * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }] 42626 */ 42627 function matches(source) { 42628 return baseMatches(baseClone(source, CLONE_DEEP_FLAG)); 42629 } 42630 42631 /** 42632 * Creates a function that performs a partial deep comparison between the 42633 * value at `path` of a given object to `srcValue`, returning `true` if the 42634 * object value is equivalent, else `false`. 42635 * 42636 * **Note:** Partial comparisons will match empty array and empty object 42637 * `srcValue` values against any array or object value, respectively. See 42638 * `_.isEqual` for a list of supported value comparisons. 42639 * 42640 * **Note:** Multiple values can be checked by combining several matchers 42641 * using `_.overSome` 42642 * 42643 * @static 42644 * @memberOf _ 42645 * @since 3.2.0 42646 * @category Util 42647 * @param {Array|string} path The path of the property to get. 42648 * @param {*} srcValue The value to match. 42649 * @returns {Function} Returns the new spec function. 42650 * @example 42651 * 42652 * var objects = [ 42653 * { 'a': 1, 'b': 2, 'c': 3 }, 42654 * { 'a': 4, 'b': 5, 'c': 6 } 42655 * ]; 42656 * 42657 * _.find(objects, _.matchesProperty('a', 4)); 42658 * // => { 'a': 4, 'b': 5, 'c': 6 } 42659 * 42660 * // Checking for several possible values 42661 * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)])); 42662 * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }] 42663 */ 42664 function matchesProperty(path, srcValue) { 42665 return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG)); 42666 } 42667 42668 /** 42669 * Creates a function that invokes the method at `path` of a given object. 42670 * Any additional arguments are provided to the invoked method. 42671 * 42672 * @static 42673 * @memberOf _ 42674 * @since 3.7.0 42675 * @category Util 42676 * @param {Array|string} path The path of the method to invoke. 42677 * @param {...*} [args] The arguments to invoke the method with. 42678 * @returns {Function} Returns the new invoker function. 42679 * @example 42680 * 42681 * var objects = [ 42682 * { 'a': { 'b': _.constant(2) } }, 42683 * { 'a': { 'b': _.constant(1) } } 42684 * ]; 42685 * 42686 * _.map(objects, _.method('a.b')); 42687 * // => [2, 1] 42688 * 42689 * _.map(objects, _.method(['a', 'b'])); 42690 * // => [2, 1] 42691 */ 42692 var method = baseRest(function(path, args) { 42693 return function(object) { 42694 return baseInvoke(object, path, args); 42695 }; 42696 }); 42697 42698 /** 42699 * The opposite of `_.method`; this method creates a function that invokes 42700 * the method at a given path of `object`. Any additional arguments are 42701 * provided to the invoked method. 42702 * 42703 * @static 42704 * @memberOf _ 42705 * @since 3.7.0 42706 * @category Util 42707 * @param {Object} object The object to query. 42708 * @param {...*} [args] The arguments to invoke the method with. 42709 * @returns {Function} Returns the new invoker function. 42710 * @example 42711 * 42712 * var array = _.times(3, _.constant), 42713 * object = { 'a': array, 'b': array, 'c': array }; 42714 * 42715 * _.map(['a[2]', 'c[0]'], _.methodOf(object)); 42716 * // => [2, 0] 42717 * 42718 * _.map([['a', '2'], ['c', '0']], _.methodOf(object)); 42719 * // => [2, 0] 42720 */ 42721 var methodOf = baseRest(function(object, args) { 42722 return function(path) { 42723 return baseInvoke(object, path, args); 42724 }; 42725 }); 42726 42727 /** 42728 * Adds all own enumerable string keyed function properties of a source 42729 * object to the destination object. If `object` is a function, then methods 42730 * are added to its prototype as well. 42731 * 42732 * **Note:** Use `_.runInContext` to create a pristine `lodash` function to 42733 * avoid conflicts caused by modifying the original. 42734 * 42735 * @static 42736 * @since 0.1.0 42737 * @memberOf _ 42738 * @category Util 42739 * @param {Function|Object} [object=lodash] The destination object. 42740 * @param {Object} source The object of functions to add. 42741 * @param {Object} [options={}] The options object. 42742 * @param {boolean} [options.chain=true] Specify whether mixins are chainable. 42743 * @returns {Function|Object} Returns `object`. 42744 * @example 42745 * 42746 * function vowels(string) { 42747 * return _.filter(string, function(v) { 42748 * return /[aeiou]/i.test(v); 42749 * }); 42750 * } 42751 * 42752 * _.mixin({ 'vowels': vowels }); 42753 * _.vowels('fred'); 42754 * // => ['e'] 42755 * 42756 * _('fred').vowels().value(); 42757 * // => ['e'] 42758 * 42759 * _.mixin({ 'vowels': vowels }, { 'chain': false }); 42760 * _('fred').vowels(); 42761 * // => ['e'] 42762 */ 42763 function mixin(object, source, options) { 42764 var props = keys(source), 42765 methodNames = baseFunctions(source, props); 42766 42767 if (options == null && 42768 !(isObject(source) && (methodNames.length || !props.length))) { 42769 options = source; 42770 source = object; 42771 object = this; 42772 methodNames = baseFunctions(source, keys(source)); 42773 } 42774 var chain = !(isObject(options) && 'chain' in options) || !!options.chain, 42775 isFunc = isFunction(object); 42776 42777 arrayEach(methodNames, function(methodName) { 42778 var func = source[methodName]; 42779 object[methodName] = func; 42780 if (isFunc) { 42781 object.prototype[methodName] = function() { 42782 var chainAll = this.__chain__; 42783 if (chain || chainAll) { 42784 var result = object(this.__wrapped__), 42785 actions = result.__actions__ = copyArray(this.__actions__); 42786 42787 actions.push({ 'func': func, 'args': arguments, 'thisArg': object }); 42788 result.__chain__ = chainAll; 42789 return result; 42790 } 42791 return func.apply(object, arrayPush([this.value()], arguments)); 42792 }; 42793 } 42794 }); 42795 42796 return object; 42797 } 42798 42799 /** 42800 * Reverts the `_` variable to its previous value and returns a reference to 42801 * the `lodash` function. 42802 * 42803 * @static 42804 * @since 0.1.0 42805 * @memberOf _ 42806 * @category Util 42807 * @returns {Function} Returns the `lodash` function. 42808 * @example 42809 * 42810 * var lodash = _.noConflict(); 42811 */ 42812 function noConflict() { 42813 if (root._ === this) { 42814 root._ = oldDash; 42815 } 42816 return this; 42817 } 42818 42819 /** 42820 * This method returns `undefined`. 42821 * 42822 * @static 42823 * @memberOf _ 42824 * @since 2.3.0 42825 * @category Util 42826 * @example 42827 * 42828 * _.times(2, _.noop); 42829 * // => [undefined, undefined] 42830 */ 42831 function noop() { 42832 // No operation performed. 42833 } 42834 42835 /** 42836 * Creates a function that gets the argument at index `n`. If `n` is negative, 42837 * the nth argument from the end is returned. 42838 * 42839 * @static 42840 * @memberOf _ 42841 * @since 4.0.0 42842 * @category Util 42843 * @param {number} [n=0] The index of the argument to return. 42844 * @returns {Function} Returns the new pass-thru function. 42845 * @example 42846 * 42847 * var func = _.nthArg(1); 42848 * func('a', 'b', 'c', 'd'); 42849 * // => 'b' 42850 * 42851 * var func = _.nthArg(-2); 42852 * func('a', 'b', 'c', 'd'); 42853 * // => 'c' 42854 */ 42855 function nthArg(n) { 42856 n = toInteger(n); 42857 return baseRest(function(args) { 42858 return baseNth(args, n); 42859 }); 42860 } 42861 42862 /** 42863 * Creates a function that invokes `iteratees` with the arguments it receives 42864 * and returns their results. 42865 * 42866 * @static 42867 * @memberOf _ 42868 * @since 4.0.0 42869 * @category Util 42870 * @param {...(Function|Function[])} [iteratees=[_.identity]] 42871 * The iteratees to invoke. 42872 * @returns {Function} Returns the new function. 42873 * @example 42874 * 42875 * var func = _.over([Math.max, Math.min]); 42876 * 42877 * func(1, 2, 3, 4); 42878 * // => [4, 1] 42879 */ 42880 var over = createOver(arrayMap); 42881 42882 /** 42883 * Creates a function that checks if **all** of the `predicates` return 42884 * truthy when invoked with the arguments it receives. 42885 * 42886 * Following shorthands are possible for providing predicates. 42887 * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate. 42888 * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them. 42889 * 42890 * @static 42891 * @memberOf _ 42892 * @since 4.0.0 42893 * @category Util 42894 * @param {...(Function|Function[])} [predicates=[_.identity]] 42895 * The predicates to check. 42896 * @returns {Function} Returns the new function. 42897 * @example 42898 * 42899 * var func = _.overEvery([Boolean, isFinite]); 42900 * 42901 * func('1'); 42902 * // => true 42903 * 42904 * func(null); 42905 * // => false 42906 * 42907 * func(NaN); 42908 * // => false 42909 */ 42910 var overEvery = createOver(arrayEvery); 42911 42912 /** 42913 * Creates a function that checks if **any** of the `predicates` return 42914 * truthy when invoked with the arguments it receives. 42915 * 42916 * Following shorthands are possible for providing predicates. 42917 * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate. 42918 * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them. 42919 * 42920 * @static 42921 * @memberOf _ 42922 * @since 4.0.0 42923 * @category Util 42924 * @param {...(Function|Function[])} [predicates=[_.identity]] 42925 * The predicates to check. 42926 * @returns {Function} Returns the new function. 42927 * @example 42928 * 42929 * var func = _.overSome([Boolean, isFinite]); 42930 * 42931 * func('1'); 42932 * // => true 42933 * 42934 * func(null); 42935 * // => true 42936 * 42937 * func(NaN); 42938 * // => false 42939 * 42940 * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }]) 42941 * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]]) 42942 */ 42943 var overSome = createOver(arraySome); 42944 42945 /** 42946 * Creates a function that returns the value at `path` of a given object. 42947 * 42948 * @static 42949 * @memberOf _ 42950 * @since 2.4.0 42951 * @category Util 42952 * @param {Array|string} path The path of the property to get. 42953 * @returns {Function} Returns the new accessor function. 42954 * @example 42955 * 42956 * var objects = [ 42957 * { 'a': { 'b': 2 } }, 42958 * { 'a': { 'b': 1 } } 42959 * ]; 42960 * 42961 * _.map(objects, _.property('a.b')); 42962 * // => [2, 1] 42963 * 42964 * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); 42965 * // => [1, 2] 42966 */ 42967 function property(path) { 42968 return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); 42969 } 42970 42971 /** 42972 * The opposite of `_.property`; this method creates a function that returns 42973 * the value at a given path of `object`. 42974 * 42975 * @static 42976 * @memberOf _ 42977 * @since 3.0.0 42978 * @category Util 42979 * @param {Object} object The object to query. 42980 * @returns {Function} Returns the new accessor function. 42981 * @example 42982 * 42983 * var array = [0, 1, 2], 42984 * object = { 'a': array, 'b': array, 'c': array }; 42985 * 42986 * _.map(['a[2]', 'c[0]'], _.propertyOf(object)); 42987 * // => [2, 0] 42988 * 42989 * _.map([['a', '2'], ['c', '0']], _.propertyOf(object)); 42990 * // => [2, 0] 42991 */ 42992 function propertyOf(object) { 42993 return function(path) { 42994 return object == null ? undefined : baseGet(object, path); 42995 }; 42996 } 42997 42998 /** 42999 * Creates an array of numbers (positive and/or negative) progressing from 43000 * `start` up to, but not including, `end`. A step of `-1` is used if a negative 43001 * `start` is specified without an `end` or `step`. If `end` is not specified, 43002 * it's set to `start` with `start` then set to `0`. 43003 * 43004 * **Note:** JavaScript follows the IEEE-754 standard for resolving 43005 * floating-point values which can produce unexpected results. 43006 * 43007 * @static 43008 * @since 0.1.0 43009 * @memberOf _ 43010 * @category Util 43011 * @param {number} [start=0] The start of the range. 43012 * @param {number} end The end of the range. 43013 * @param {number} [step=1] The value to increment or decrement by. 43014 * @returns {Array} Returns the range of numbers. 43015 * @see _.inRange, _.rangeRight 43016 * @example 43017 * 43018 * _.range(4); 43019 * // => [0, 1, 2, 3] 43020 * 43021 * _.range(-4); 43022 * // => [0, -1, -2, -3] 43023 * 43024 * _.range(1, 5); 43025 * // => [1, 2, 3, 4] 43026 * 43027 * _.range(0, 20, 5); 43028 * // => [0, 5, 10, 15] 43029 * 43030 * _.range(0, -4, -1); 43031 * // => [0, -1, -2, -3] 43032 * 43033 * _.range(1, 4, 0); 43034 * // => [1, 1, 1] 43035 * 43036 * _.range(0); 43037 * // => [] 43038 */ 43039 var range = createRange(); 43040 43041 /** 43042 * This method is like `_.range` except that it populates values in 43043 * descending order. 43044 * 43045 * @static 43046 * @memberOf _ 43047 * @since 4.0.0 43048 * @category Util 43049 * @param {number} [start=0] The start of the range. 43050 * @param {number} end The end of the range. 43051 * @param {number} [step=1] The value to increment or decrement by. 43052 * @returns {Array} Returns the range of numbers. 43053 * @see _.inRange, _.range 43054 * @example 43055 * 43056 * _.rangeRight(4); 43057 * // => [3, 2, 1, 0] 43058 * 43059 * _.rangeRight(-4); 43060 * // => [-3, -2, -1, 0] 43061 * 43062 * _.rangeRight(1, 5); 43063 * // => [4, 3, 2, 1] 43064 * 43065 * _.rangeRight(0, 20, 5); 43066 * // => [15, 10, 5, 0] 43067 * 43068 * _.rangeRight(0, -4, -1); 43069 * // => [-3, -2, -1, 0] 43070 * 43071 * _.rangeRight(1, 4, 0); 43072 * // => [1, 1, 1] 43073 * 43074 * _.rangeRight(0); 43075 * // => [] 43076 */ 43077 var rangeRight = createRange(true); 43078 43079 /** 43080 * This method returns a new empty array. 43081 * 43082 * @static 43083 * @memberOf _ 43084 * @since 4.13.0 43085 * @category Util 43086 * @returns {Array} Returns the new empty array. 43087 * @example 43088 * 43089 * var arrays = _.times(2, _.stubArray); 43090 * 43091 * console.log(arrays); 43092 * // => [[], []] 43093 * 43094 * console.log(arrays[0] === arrays[1]); 43095 * // => false 43096 */ 43097 function stubArray() { 43098 return []; 43099 } 43100 43101 /** 43102 * This method returns `false`. 43103 * 43104 * @static 43105 * @memberOf _ 43106 * @since 4.13.0 43107 * @category Util 43108 * @returns {boolean} Returns `false`. 43109 * @example 43110 * 43111 * _.times(2, _.stubFalse); 43112 * // => [false, false] 43113 */ 43114 function stubFalse() { 43115 return false; 43116 } 43117 43118 /** 43119 * This method returns a new empty object. 43120 * 43121 * @static 43122 * @memberOf _ 43123 * @since 4.13.0 43124 * @category Util 43125 * @returns {Object} Returns the new empty object. 43126 * @example 43127 * 43128 * var objects = _.times(2, _.stubObject); 43129 * 43130 * console.log(objects); 43131 * // => [{}, {}] 43132 * 43133 * console.log(objects[0] === objects[1]); 43134 * // => false 43135 */ 43136 function stubObject() { 43137 return {}; 43138 } 43139 43140 /** 43141 * This method returns an empty string. 43142 * 43143 * @static 43144 * @memberOf _ 43145 * @since 4.13.0 43146 * @category Util 43147 * @returns {string} Returns the empty string. 43148 * @example 43149 * 43150 * _.times(2, _.stubString); 43151 * // => ['', ''] 43152 */ 43153 function stubString() { 43154 return ''; 43155 } 43156 43157 /** 43158 * This method returns `true`. 43159 * 43160 * @static 43161 * @memberOf _ 43162 * @since 4.13.0 43163 * @category Util 43164 * @returns {boolean} Returns `true`. 43165 * @example 43166 * 43167 * _.times(2, _.stubTrue); 43168 * // => [true, true] 43169 */ 43170 function stubTrue() { 43171 return true; 43172 } 43173 43174 /** 43175 * Invokes the iteratee `n` times, returning an array of the results of 43176 * each invocation. The iteratee is invoked with one argument; (index). 43177 * 43178 * @static 43179 * @since 0.1.0 43180 * @memberOf _ 43181 * @category Util 43182 * @param {number} n The number of times to invoke `iteratee`. 43183 * @param {Function} [iteratee=_.identity] The function invoked per iteration. 43184 * @returns {Array} Returns the array of results. 43185 * @example 43186 * 43187 * _.times(3, String); 43188 * // => ['0', '1', '2'] 43189 * 43190 * _.times(4, _.constant(0)); 43191 * // => [0, 0, 0, 0] 43192 */ 43193 function times(n, iteratee) { 43194 n = toInteger(n); 43195 if (n < 1 || n > MAX_SAFE_INTEGER) { 43196 return []; 43197 } 43198 var index = MAX_ARRAY_LENGTH, 43199 length = nativeMin(n, MAX_ARRAY_LENGTH); 43200 43201 iteratee = getIteratee(iteratee); 43202 n -= MAX_ARRAY_LENGTH; 43203 43204 var result = baseTimes(length, iteratee); 43205 while (++index < n) { 43206 iteratee(index); 43207 } 43208 return result; 43209 } 43210 43211 /** 43212 * Converts `value` to a property path array. 43213 * 43214 * @static 43215 * @memberOf _ 43216 * @since 4.0.0 43217 * @category Util 43218 * @param {*} value The value to convert. 43219 * @returns {Array} Returns the new property path array. 43220 * @example 43221 * 43222 * _.toPath('a.b.c'); 43223 * // => ['a', 'b', 'c'] 43224 * 43225 * _.toPath('a[0].b.c'); 43226 * // => ['a', '0', 'b', 'c'] 43227 */ 43228 function toPath(value) { 43229 if (isArray(value)) { 43230 return arrayMap(value, toKey); 43231 } 43232 return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value))); 43233 } 43234 43235 /** 43236 * Generates a unique ID. If `prefix` is given, the ID is appended to it. 43237 * 43238 * @static 43239 * @since 0.1.0 43240 * @memberOf _ 43241 * @category Util 43242 * @param {string} [prefix=''] The value to prefix the ID with. 43243 * @returns {string} Returns the unique ID. 43244 * @example 43245 * 43246 * _.uniqueId('contact_'); 43247 * // => 'contact_104' 43248 * 43249 * _.uniqueId(); 43250 * // => '105' 43251 */ 43252 function uniqueId(prefix) { 43253 var id = ++idCounter; 43254 return toString(prefix) + id; 43255 } 43256 43257 /*------------------------------------------------------------------------*/ 43258 43259 /** 43260 * Adds two numbers. 43261 * 43262 * @static 43263 * @memberOf _ 43264 * @since 3.4.0 43265 * @category Math 43266 * @param {number} augend The first number in an addition. 43267 * @param {number} addend The second number in an addition. 43268 * @returns {number} Returns the total. 43269 * @example 43270 * 43271 * _.add(6, 4); 43272 * // => 10 43273 */ 43274 var add = createMathOperation(function(augend, addend) { 43275 return augend + addend; 43276 }, 0); 43277 43278 /** 43279 * Computes `number` rounded up to `precision`. 43280 * 43281 * @static 43282 * @memberOf _ 43283 * @since 3.10.0 43284 * @category Math 43285 * @param {number} number The number to round up. 43286 * @param {number} [precision=0] The precision to round up to. 43287 * @returns {number} Returns the rounded up number. 43288 * @example 43289 * 43290 * _.ceil(4.006); 43291 * // => 5 43292 * 43293 * _.ceil(6.004, 2); 43294 * // => 6.01 43295 * 43296 * _.ceil(6040, -2); 43297 * // => 6100 43298 */ 43299 var ceil = createRound('ceil'); 43300 43301 /** 43302 * Divide two numbers. 43303 * 43304 * @static 43305 * @memberOf _ 43306 * @since 4.7.0 43307 * @category Math 43308 * @param {number} dividend The first number in a division. 43309 * @param {number} divisor The second number in a division. 43310 * @returns {number} Returns the quotient. 43311 * @example 43312 * 43313 * _.divide(6, 4); 43314 * // => 1.5 43315 */ 43316 var divide = createMathOperation(function(dividend, divisor) { 43317 return dividend / divisor; 43318 }, 1); 43319 43320 /** 43321 * Computes `number` rounded down to `precision`. 43322 * 43323 * @static 43324 * @memberOf _ 43325 * @since 3.10.0 43326 * @category Math 43327 * @param {number} number The number to round down. 43328 * @param {number} [precision=0] The precision to round down to. 43329 * @returns {number} Returns the rounded down number. 43330 * @example 43331 * 43332 * _.floor(4.006); 43333 * // => 4 43334 * 43335 * _.floor(0.046, 2); 43336 * // => 0.04 43337 * 43338 * _.floor(4060, -2); 43339 * // => 4000 43340 */ 43341 var floor = createRound('floor'); 43342 43343 /** 43344 * Computes the maximum value of `array`. If `array` is empty or falsey, 43345 * `undefined` is returned. 43346 * 43347 * @static 43348 * @since 0.1.0 43349 * @memberOf _ 43350 * @category Math 43351 * @param {Array} array The array to iterate over. 43352 * @returns {*} Returns the maximum value. 43353 * @example 43354 * 43355 * _.max([4, 2, 8, 6]); 43356 * // => 8 43357 * 43358 * _.max([]); 43359 * // => undefined 43360 */ 43361 function max(array) { 43362 return (array && array.length) 43363 ? baseExtremum(array, identity, baseGt) 43364 : undefined; 43365 } 43366 43367 /** 43368 * This method is like `_.max` except that it accepts `iteratee` which is 43369 * invoked for each element in `array` to generate the criterion by which 43370 * the value is ranked. The iteratee is invoked with one argument: (value). 43371 * 43372 * @static 43373 * @memberOf _ 43374 * @since 4.0.0 43375 * @category Math 43376 * @param {Array} array The array to iterate over. 43377 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 43378 * @returns {*} Returns the maximum value. 43379 * @example 43380 * 43381 * var objects = [{ 'n': 1 }, { 'n': 2 }]; 43382 * 43383 * _.maxBy(objects, function(o) { return o.n; }); 43384 * // => { 'n': 2 } 43385 * 43386 * // The `_.property` iteratee shorthand. 43387 * _.maxBy(objects, 'n'); 43388 * // => { 'n': 2 } 43389 */ 43390 function maxBy(array, iteratee) { 43391 return (array && array.length) 43392 ? baseExtremum(array, getIteratee(iteratee, 2), baseGt) 43393 : undefined; 43394 } 43395 43396 /** 43397 * Computes the mean of the values in `array`. 43398 * 43399 * @static 43400 * @memberOf _ 43401 * @since 4.0.0 43402 * @category Math 43403 * @param {Array} array The array to iterate over. 43404 * @returns {number} Returns the mean. 43405 * @example 43406 * 43407 * _.mean([4, 2, 8, 6]); 43408 * // => 5 43409 */ 43410 function mean(array) { 43411 return baseMean(array, identity); 43412 } 43413 43414 /** 43415 * This method is like `_.mean` except that it accepts `iteratee` which is 43416 * invoked for each element in `array` to generate the value to be averaged. 43417 * The iteratee is invoked with one argument: (value). 43418 * 43419 * @static 43420 * @memberOf _ 43421 * @since 4.7.0 43422 * @category Math 43423 * @param {Array} array The array to iterate over. 43424 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 43425 * @returns {number} Returns the mean. 43426 * @example 43427 * 43428 * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }]; 43429 * 43430 * _.meanBy(objects, function(o) { return o.n; }); 43431 * // => 5 43432 * 43433 * // The `_.property` iteratee shorthand. 43434 * _.meanBy(objects, 'n'); 43435 * // => 5 43436 */ 43437 function meanBy(array, iteratee) { 43438 return baseMean(array, getIteratee(iteratee, 2)); 43439 } 43440 43441 /** 43442 * Computes the minimum value of `array`. If `array` is empty or falsey, 43443 * `undefined` is returned. 43444 * 43445 * @static 43446 * @since 0.1.0 43447 * @memberOf _ 43448 * @category Math 43449 * @param {Array} array The array to iterate over. 43450 * @returns {*} Returns the minimum value. 43451 * @example 43452 * 43453 * _.min([4, 2, 8, 6]); 43454 * // => 2 43455 * 43456 * _.min([]); 43457 * // => undefined 43458 */ 43459 function min(array) { 43460 return (array && array.length) 43461 ? baseExtremum(array, identity, baseLt) 43462 : undefined; 43463 } 43464 43465 /** 43466 * This method is like `_.min` except that it accepts `iteratee` which is 43467 * invoked for each element in `array` to generate the criterion by which 43468 * the value is ranked. The iteratee is invoked with one argument: (value). 43469 * 43470 * @static 43471 * @memberOf _ 43472 * @since 4.0.0 43473 * @category Math 43474 * @param {Array} array The array to iterate over. 43475 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 43476 * @returns {*} Returns the minimum value. 43477 * @example 43478 * 43479 * var objects = [{ 'n': 1 }, { 'n': 2 }]; 43480 * 43481 * _.minBy(objects, function(o) { return o.n; }); 43482 * // => { 'n': 1 } 43483 * 43484 * // The `_.property` iteratee shorthand. 43485 * _.minBy(objects, 'n'); 43486 * // => { 'n': 1 } 43487 */ 43488 function minBy(array, iteratee) { 43489 return (array && array.length) 43490 ? baseExtremum(array, getIteratee(iteratee, 2), baseLt) 43491 : undefined; 43492 } 43493 43494 /** 43495 * Multiply two numbers. 43496 * 43497 * @static 43498 * @memberOf _ 43499 * @since 4.7.0 43500 * @category Math 43501 * @param {number} multiplier The first number in a multiplication. 43502 * @param {number} multiplicand The second number in a multiplication. 43503 * @returns {number} Returns the product. 43504 * @example 43505 * 43506 * _.multiply(6, 4); 43507 * // => 24 43508 */ 43509 var multiply = createMathOperation(function(multiplier, multiplicand) { 43510 return multiplier * multiplicand; 43511 }, 1); 43512 43513 /** 43514 * Computes `number` rounded to `precision`. 43515 * 43516 * @static 43517 * @memberOf _ 43518 * @since 3.10.0 43519 * @category Math 43520 * @param {number} number The number to round. 43521 * @param {number} [precision=0] The precision to round to. 43522 * @returns {number} Returns the rounded number. 43523 * @example 43524 * 43525 * _.round(4.006); 43526 * // => 4 43527 * 43528 * _.round(4.006, 2); 43529 * // => 4.01 43530 * 43531 * _.round(4060, -2); 43532 * // => 4100 43533 */ 43534 var round = createRound('round'); 43535 43536 /** 43537 * Subtract two numbers. 43538 * 43539 * @static 43540 * @memberOf _ 43541 * @since 4.0.0 43542 * @category Math 43543 * @param {number} minuend The first number in a subtraction. 43544 * @param {number} subtrahend The second number in a subtraction. 43545 * @returns {number} Returns the difference. 43546 * @example 43547 * 43548 * _.subtract(6, 4); 43549 * // => 2 43550 */ 43551 var subtract = createMathOperation(function(minuend, subtrahend) { 43552 return minuend - subtrahend; 43553 }, 0); 43554 43555 /** 43556 * Computes the sum of the values in `array`. 43557 * 43558 * @static 43559 * @memberOf _ 43560 * @since 3.4.0 43561 * @category Math 43562 * @param {Array} array The array to iterate over. 43563 * @returns {number} Returns the sum. 43564 * @example 43565 * 43566 * _.sum([4, 2, 8, 6]); 43567 * // => 20 43568 */ 43569 function sum(array) { 43570 return (array && array.length) 43571 ? baseSum(array, identity) 43572 : 0; 43573 } 43574 43575 /** 43576 * This method is like `_.sum` except that it accepts `iteratee` which is 43577 * invoked for each element in `array` to generate the value to be summed. 43578 * The iteratee is invoked with one argument: (value). 43579 * 43580 * @static 43581 * @memberOf _ 43582 * @since 4.0.0 43583 * @category Math 43584 * @param {Array} array The array to iterate over. 43585 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. 43586 * @returns {number} Returns the sum. 43587 * @example 43588 * 43589 * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }]; 43590 * 43591 * _.sumBy(objects, function(o) { return o.n; }); 43592 * // => 20 43593 * 43594 * // The `_.property` iteratee shorthand. 43595 * _.sumBy(objects, 'n'); 43596 * // => 20 43597 */ 43598 function sumBy(array, iteratee) { 43599 return (array && array.length) 43600 ? baseSum(array, getIteratee(iteratee, 2)) 43601 : 0; 43602 } 43603 43604 /*------------------------------------------------------------------------*/ 43605 43606 // Add methods that return wrapped values in chain sequences. 43607 lodash.after = after; 43608 lodash.ary = ary; 43609 lodash.assign = assign; 43610 lodash.assignIn = assignIn; 43611 lodash.assignInWith = assignInWith; 43612 lodash.assignWith = assignWith; 43613 lodash.at = at; 43614 lodash.before = before; 43615 lodash.bind = bind; 43616 lodash.bindAll = bindAll; 43617 lodash.bindKey = bindKey; 43618 lodash.castArray = castArray; 43619 lodash.chain = chain; 43620 lodash.chunk = chunk; 43621 lodash.compact = compact; 43622 lodash.concat = concat; 43623 lodash.cond = cond; 43624 lodash.conforms = conforms; 43625 lodash.constant = constant; 43626 lodash.countBy = countBy; 43627 lodash.create = create; 43628 lodash.curry = curry; 43629 lodash.curryRight = curryRight; 43630 lodash.debounce = debounce; 43631 lodash.defaults = defaults; 43632 lodash.defaultsDeep = defaultsDeep; 43633 lodash.defer = defer; 43634 lodash.delay = delay; 43635 lodash.difference = difference; 43636 lodash.differenceBy = differenceBy; 43637 lodash.differenceWith = differenceWith; 43638 lodash.drop = drop; 43639 lodash.dropRight = dropRight; 43640 lodash.dropRightWhile = dropRightWhile; 43641 lodash.dropWhile = dropWhile; 43642 lodash.fill = fill; 43643 lodash.filter = filter; 43644 lodash.flatMap = flatMap; 43645 lodash.flatMapDeep = flatMapDeep; 43646 lodash.flatMapDepth = flatMapDepth; 43647 lodash.flatten = flatten; 43648 lodash.flattenDeep = flattenDeep; 43649 lodash.flattenDepth = flattenDepth; 43650 lodash.flip = flip; 43651 lodash.flow = flow; 43652 lodash.flowRight = flowRight; 43653 lodash.fromPairs = fromPairs; 43654 lodash.functions = functions; 43655 lodash.functionsIn = functionsIn; 43656 lodash.groupBy = groupBy; 43657 lodash.initial = initial; 43658 lodash.intersection = intersection; 43659 lodash.intersectionBy = intersectionBy; 43660 lodash.intersectionWith = intersectionWith; 43661 lodash.invert = invert; 43662 lodash.invertBy = invertBy; 43663 lodash.invokeMap = invokeMap; 43664 lodash.iteratee = iteratee; 43665 lodash.keyBy = keyBy; 43666 lodash.keys = keys; 43667 lodash.keysIn = keysIn; 43668 lodash.map = map; 43669 lodash.mapKeys = mapKeys; 43670 lodash.mapValues = mapValues; 43671 lodash.matches = matches; 43672 lodash.matchesProperty = matchesProperty; 43673 lodash.memoize = memoize; 43674 lodash.merge = merge; 43675 lodash.mergeWith = mergeWith; 43676 lodash.method = method; 43677 lodash.methodOf = methodOf; 43678 lodash.mixin = mixin; 43679 lodash.negate = negate; 43680 lodash.nthArg = nthArg; 43681 lodash.omit = omit; 43682 lodash.omitBy = omitBy; 43683 lodash.once = once; 43684 lodash.orderBy = orderBy; 43685 lodash.over = over; 43686 lodash.overArgs = overArgs; 43687 lodash.overEvery = overEvery; 43688 lodash.overSome = overSome; 43689 lodash.partial = partial; 43690 lodash.partialRight = partialRight; 43691 lodash.partition = partition; 43692 lodash.pick = pick; 43693 lodash.pickBy = pickBy; 43694 lodash.property = property; 43695 lodash.propertyOf = propertyOf; 43696 lodash.pull = pull; 43697 lodash.pullAll = pullAll; 43698 lodash.pullAllBy = pullAllBy; 43699 lodash.pullAllWith = pullAllWith; 43700 lodash.pullAt = pullAt; 43701 lodash.range = range; 43702 lodash.rangeRight = rangeRight; 43703 lodash.rearg = rearg; 43704 lodash.reject = reject; 43705 lodash.remove = remove; 43706 lodash.rest = rest; 43707 lodash.reverse = reverse; 43708 lodash.sampleSize = sampleSize; 43709 lodash.set = set; 43710 lodash.setWith = setWith; 43711 lodash.shuffle = shuffle; 43712 lodash.slice = slice; 43713 lodash.sortBy = sortBy; 43714 lodash.sortedUniq = sortedUniq; 43715 lodash.sortedUniqBy = sortedUniqBy; 43716 lodash.split = split; 43717 lodash.spread = spread; 43718 lodash.tail = tail; 43719 lodash.take = take; 43720 lodash.takeRight = takeRight; 43721 lodash.takeRightWhile = takeRightWhile; 43722 lodash.takeWhile = takeWhile; 43723 lodash.tap = tap; 43724 lodash.throttle = throttle; 43725 lodash.thru = thru; 43726 lodash.toArray = toArray; 43727 lodash.toPairs = toPairs; 43728 lodash.toPairsIn = toPairsIn; 43729 lodash.toPath = toPath; 43730 lodash.toPlainObject = toPlainObject; 43731 lodash.transform = transform; 43732 lodash.unary = unary; 43733 lodash.union = union; 43734 lodash.unionBy = unionBy; 43735 lodash.unionWith = unionWith; 43736 lodash.uniq = uniq; 43737 lodash.uniqBy = uniqBy; 43738 lodash.uniqWith = uniqWith; 43739 lodash.unset = unset; 43740 lodash.unzip = unzip; 43741 lodash.unzipWith = unzipWith; 43742 lodash.update = update; 43743 lodash.updateWith = updateWith; 43744 lodash.values = values; 43745 lodash.valuesIn = valuesIn; 43746 lodash.without = without; 43747 lodash.words = words; 43748 lodash.wrap = wrap; 43749 lodash.xor = xor; 43750 lodash.xorBy = xorBy; 43751 lodash.xorWith = xorWith; 43752 lodash.zip = zip; 43753 lodash.zipObject = zipObject; 43754 lodash.zipObjectDeep = zipObjectDeep; 43755 lodash.zipWith = zipWith; 43756 43757 // Add aliases. 43758 lodash.entries = toPairs; 43759 lodash.entriesIn = toPairsIn; 43760 lodash.extend = assignIn; 43761 lodash.extendWith = assignInWith; 43762 43763 // Add methods to `lodash.prototype`. 43764 mixin(lodash, lodash); 43765 43766 /*------------------------------------------------------------------------*/ 43767 43768 // Add methods that return unwrapped values in chain sequences. 43769 lodash.add = add; 43770 lodash.attempt = attempt; 43771 lodash.camelCase = camelCase; 43772 lodash.capitalize = capitalize; 43773 lodash.ceil = ceil; 43774 lodash.clamp = clamp; 43775 lodash.clone = clone; 43776 lodash.cloneDeep = cloneDeep; 43777 lodash.cloneDeepWith = cloneDeepWith; 43778 lodash.cloneWith = cloneWith; 43779 lodash.conformsTo = conformsTo; 43780 lodash.deburr = deburr; 43781 lodash.defaultTo = defaultTo; 43782 lodash.divide = divide; 43783 lodash.endsWith = endsWith; 43784 lodash.eq = eq; 43785 lodash.escape = escape; 43786 lodash.escapeRegExp = escapeRegExp; 43787 lodash.every = every; 43788 lodash.find = find; 43789 lodash.findIndex = findIndex; 43790 lodash.findKey = findKey; 43791 lodash.findLast = findLast; 43792 lodash.findLastIndex = findLastIndex; 43793 lodash.findLastKey = findLastKey; 43794 lodash.floor = floor; 43795 lodash.forEach = forEach; 43796 lodash.forEachRight = forEachRight; 43797 lodash.forIn = forIn; 43798 lodash.forInRight = forInRight; 43799 lodash.forOwn = forOwn; 43800 lodash.forOwnRight = forOwnRight; 43801 lodash.get = get; 43802 lodash.gt = gt; 43803 lodash.gte = gte; 43804 lodash.has = has; 43805 lodash.hasIn = hasIn; 43806 lodash.head = head; 43807 lodash.identity = identity; 43808 lodash.includes = includes; 43809 lodash.indexOf = indexOf; 43810 lodash.inRange = inRange; 43811 lodash.invoke = invoke; 43812 lodash.isArguments = isArguments; 43813 lodash.isArray = isArray; 43814 lodash.isArrayBuffer = isArrayBuffer; 43815 lodash.isArrayLike = isArrayLike; 43816 lodash.isArrayLikeObject = isArrayLikeObject; 43817 lodash.isBoolean = isBoolean; 43818 lodash.isBuffer = isBuffer; 43819 lodash.isDate = isDate; 43820 lodash.isElement = isElement; 43821 lodash.isEmpty = isEmpty; 43822 lodash.isEqual = isEqual; 43823 lodash.isEqualWith = isEqualWith; 43824 lodash.isError = isError; 43825 lodash.isFinite = isFinite; 43826 lodash.isFunction = isFunction; 43827 lodash.isInteger = isInteger; 43828 lodash.isLength = isLength; 43829 lodash.isMap = isMap; 43830 lodash.isMatch = isMatch; 43831 lodash.isMatchWith = isMatchWith; 43832 lodash.isNaN = isNaN; 43833 lodash.isNative = isNative; 43834 lodash.isNil = isNil; 43835 lodash.isNull = isNull; 43836 lodash.isNumber = isNumber; 43837 lodash.isObject = isObject; 43838 lodash.isObjectLike = isObjectLike; 43839 lodash.isPlainObject = isPlainObject; 43840 lodash.isRegExp = isRegExp; 43841 lodash.isSafeInteger = isSafeInteger; 43842 lodash.isSet = isSet; 43843 lodash.isString = isString; 43844 lodash.isSymbol = isSymbol; 43845 lodash.isTypedArray = isTypedArray; 43846 lodash.isUndefined = isUndefined; 43847 lodash.isWeakMap = isWeakMap; 43848 lodash.isWeakSet = isWeakSet; 43849 lodash.join = join; 43850 lodash.kebabCase = kebabCase; 43851 lodash.last = last; 43852 lodash.lastIndexOf = lastIndexOf; 43853 lodash.lowerCase = lowerCase; 43854 lodash.lowerFirst = lowerFirst; 43855 lodash.lt = lt; 43856 lodash.lte = lte; 43857 lodash.max = max; 43858 lodash.maxBy = maxBy; 43859 lodash.mean = mean; 43860 lodash.meanBy = meanBy; 43861 lodash.min = min; 43862 lodash.minBy = minBy; 43863 lodash.stubArray = stubArray; 43864 lodash.stubFalse = stubFalse; 43865 lodash.stubObject = stubObject; 43866 lodash.stubString = stubString; 43867 lodash.stubTrue = stubTrue; 43868 lodash.multiply = multiply; 43869 lodash.nth = nth; 43870 lodash.noConflict = noConflict; 43871 lodash.noop = noop; 43872 lodash.now = now; 43873 lodash.pad = pad; 43874 lodash.padEnd = padEnd; 43875 lodash.padStart = padStart; 43876 lodash.parseInt = parseInt; 43877 lodash.random = random; 43878 lodash.reduce = reduce; 43879 lodash.reduceRight = reduceRight; 43880 lodash.repeat = repeat; 43881 lodash.replace = replace; 43882 lodash.result = result; 43883 lodash.round = round; 43884 lodash.runInContext = runInContext; 43885 lodash.sample = sample; 43886 lodash.size = size; 43887 lodash.snakeCase = snakeCase; 43888 lodash.some = some; 43889 lodash.sortedIndex = sortedIndex; 43890 lodash.sortedIndexBy = sortedIndexBy; 43891 lodash.sortedIndexOf = sortedIndexOf; 43892 lodash.sortedLastIndex = sortedLastIndex; 43893 lodash.sortedLastIndexBy = sortedLastIndexBy; 43894 lodash.sortedLastIndexOf = sortedLastIndexOf; 43895 lodash.startCase = startCase; 43896 lodash.startsWith = startsWith; 43897 lodash.subtract = subtract; 43898 lodash.sum = sum; 43899 lodash.sumBy = sumBy; 43900 lodash.template = template; 43901 lodash.times = times; 43902 lodash.toFinite = toFinite; 43903 lodash.toInteger = toInteger; 43904 lodash.toLength = toLength; 43905 lodash.toLower = toLower; 43906 lodash.toNumber = toNumber; 43907 lodash.toSafeInteger = toSafeInteger; 43908 lodash.toString = toString; 43909 lodash.toUpper = toUpper; 43910 lodash.trim = trim; 43911 lodash.trimEnd = trimEnd; 43912 lodash.trimStart = trimStart; 43913 lodash.truncate = truncate; 43914 lodash.unescape = unescape; 43915 lodash.uniqueId = uniqueId; 43916 lodash.upperCase = upperCase; 43917 lodash.upperFirst = upperFirst; 43918 43919 // Add aliases. 43920 lodash.each = forEach; 43921 lodash.eachRight = forEachRight; 43922 lodash.first = head; 43923 43924 mixin(lodash, (function() { 43925 var source = {}; 43926 baseForOwn(lodash, function(func, methodName) { 43927 if (!hasOwnProperty.call(lodash.prototype, methodName)) { 43928 source[methodName] = func; 43929 } 43930 }); 43931 return source; 43932 }()), { 'chain': false }); 43933 43934 /*------------------------------------------------------------------------*/ 43935 43936 /** 43937 * The semantic version number. 43938 * 43939 * @static 43940 * @memberOf _ 43941 * @type {string} 43942 */ 43943 lodash.VERSION = VERSION; 43944 43945 // Assign default placeholders. 43946 arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) { 43947 lodash[methodName].placeholder = lodash; 43948 }); 43949 43950 // Add `LazyWrapper` methods for `_.drop` and `_.take` variants. 43951 arrayEach(['drop', 'take'], function(methodName, index) { 43952 LazyWrapper.prototype[methodName] = function(n) { 43953 n = n === undefined ? 1 : nativeMax(toInteger(n), 0); 43954 43955 var result = (this.__filtered__ && !index) 43956 ? new LazyWrapper(this) 43957 : this.clone(); 43958 43959 if (result.__filtered__) { 43960 result.__takeCount__ = nativeMin(n, result.__takeCount__); 43961 } else { 43962 result.__views__.push({ 43963 'size': nativeMin(n, MAX_ARRAY_LENGTH), 43964 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') 43965 }); 43966 } 43967 return result; 43968 }; 43969 43970 LazyWrapper.prototype[methodName + 'Right'] = function(n) { 43971 return this.reverse()[methodName](n).reverse(); 43972 }; 43973 }); 43974 43975 // Add `LazyWrapper` methods that accept an `iteratee` value. 43976 arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) { 43977 var type = index + 1, 43978 isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG; 43979 43980 LazyWrapper.prototype[methodName] = function(iteratee) { 43981 var result = this.clone(); 43982 result.__iteratees__.push({ 43983 'iteratee': getIteratee(iteratee, 3), 43984 'type': type 43985 }); 43986 result.__filtered__ = result.__filtered__ || isFilter; 43987 return result; 43988 }; 43989 }); 43990 43991 // Add `LazyWrapper` methods for `_.head` and `_.last`. 43992 arrayEach(['head', 'last'], function(methodName, index) { 43993 var takeName = 'take' + (index ? 'Right' : ''); 43994 43995 LazyWrapper.prototype[methodName] = function() { 43996 return this[takeName](1).value()[0]; 43997 }; 43998 }); 43999 44000 // Add `LazyWrapper` methods for `_.initial` and `_.tail`. 44001 arrayEach(['initial', 'tail'], function(methodName, index) { 44002 var dropName = 'drop' + (index ? '' : 'Right'); 44003 44004 LazyWrapper.prototype[methodName] = function() { 44005 return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1); 44006 }; 44007 }); 44008 44009 LazyWrapper.prototype.compact = function() { 44010 return this.filter(identity); 44011 }; 44012 44013 LazyWrapper.prototype.find = function(predicate) { 44014 return this.filter(predicate).head(); 44015 }; 44016 44017 LazyWrapper.prototype.findLast = function(predicate) { 44018 return this.reverse().find(predicate); 44019 }; 44020 44021 LazyWrapper.prototype.invokeMap = baseRest(function(path, args) { 44022 if (typeof path == 'function') { 44023 return new LazyWrapper(this); 44024 } 44025 return this.map(function(value) { 44026 return baseInvoke(value, path, args); 44027 }); 44028 }); 44029 44030 LazyWrapper.prototype.reject = function(predicate) { 44031 return this.filter(negate(getIteratee(predicate))); 44032 }; 44033 44034 LazyWrapper.prototype.slice = function(start, end) { 44035 start = toInteger(start); 44036 44037 var result = this; 44038 if (result.__filtered__ && (start > 0 || end < 0)) { 44039 return new LazyWrapper(result); 44040 } 44041 if (start < 0) { 44042 result = result.takeRight(-start); 44043 } else if (start) { 44044 result = result.drop(start); 44045 } 44046 if (end !== undefined) { 44047 end = toInteger(end); 44048 result = end < 0 ? result.dropRight(-end) : result.take(end - start); 44049 } 44050 return result; 44051 }; 44052 44053 LazyWrapper.prototype.takeRightWhile = function(predicate) { 44054 return this.reverse().takeWhile(predicate).reverse(); 44055 }; 44056 44057 LazyWrapper.prototype.toArray = function() { 44058 return this.take(MAX_ARRAY_LENGTH); 44059 }; 44060 44061 // Add `LazyWrapper` methods to `lodash.prototype`. 44062 baseForOwn(LazyWrapper.prototype, function(func, methodName) { 44063 var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), 44064 isTaker = /^(?:head|last)$/.test(methodName), 44065 lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName], 44066 retUnwrapped = isTaker || /^find/.test(methodName); 44067 44068 if (!lodashFunc) { 44069 return; 44070 } 44071 lodash.prototype[methodName] = function() { 44072 var value = this.__wrapped__, 44073 args = isTaker ? [1] : arguments, 44074 isLazy = value instanceof LazyWrapper, 44075 iteratee = args[0], 44076 useLazy = isLazy || isArray(value); 44077 44078 var interceptor = function(value) { 44079 var result = lodashFunc.apply(lodash, arrayPush([value], args)); 44080 return (isTaker && chainAll) ? result[0] : result; 44081 }; 44082 44083 if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) { 44084 // Avoid lazy use if the iteratee has a "length" value other than `1`. 44085 isLazy = useLazy = false; 44086 } 44087 var chainAll = this.__chain__, 44088 isHybrid = !!this.__actions__.length, 44089 isUnwrapped = retUnwrapped && !chainAll, 44090 onlyLazy = isLazy && !isHybrid; 44091 44092 if (!retUnwrapped && useLazy) { 44093 value = onlyLazy ? value : new LazyWrapper(this); 44094 var result = func.apply(value, args); 44095 result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined }); 44096 return new LodashWrapper(result, chainAll); 44097 } 44098 if (isUnwrapped && onlyLazy) { 44099 return func.apply(this, args); 44100 } 44101 result = this.thru(interceptor); 44102 return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result; 44103 }; 44104 }); 44105 44106 // Add `Array` methods to `lodash.prototype`. 44107 arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) { 44108 var func = arrayProto[methodName], 44109 chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru', 44110 retUnwrapped = /^(?:pop|shift)$/.test(methodName); 44111 44112 lodash.prototype[methodName] = function() { 44113 var args = arguments; 44114 if (retUnwrapped && !this.__chain__) { 44115 var value = this.value(); 44116 return func.apply(isArray(value) ? value : [], args); 44117 } 44118 return this[chainName](function(value) { 44119 return func.apply(isArray(value) ? value : [], args); 44120 }); 44121 }; 44122 }); 44123 44124 // Map minified method names to their real names. 44125 baseForOwn(LazyWrapper.prototype, function(func, methodName) { 44126 var lodashFunc = lodash[methodName]; 44127 if (lodashFunc) { 44128 var key = lodashFunc.name + ''; 44129 if (!hasOwnProperty.call(realNames, key)) { 44130 realNames[key] = []; 44131 } 44132 realNames[key].push({ 'name': methodName, 'func': lodashFunc }); 44133 } 44134 }); 44135 44136 realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{ 44137 'name': 'wrapper', 44138 'func': undefined 44139 }]; 44140 44141 // Add methods to `LazyWrapper`. 44142 LazyWrapper.prototype.clone = lazyClone; 44143 LazyWrapper.prototype.reverse = lazyReverse; 44144 LazyWrapper.prototype.value = lazyValue; 44145 44146 // Add chain sequence methods to the `lodash` wrapper. 44147 lodash.prototype.at = wrapperAt; 44148 lodash.prototype.chain = wrapperChain; 44149 lodash.prototype.commit = wrapperCommit; 44150 lodash.prototype.next = wrapperNext; 44151 lodash.prototype.plant = wrapperPlant; 44152 lodash.prototype.reverse = wrapperReverse; 44153 lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; 44154 44155 // Add lazy aliases. 44156 lodash.prototype.first = lodash.prototype.head; 44157 44158 if (symIterator) { 44159 lodash.prototype[symIterator] = wrapperToIterator; 44160 } 44161 return lodash; 44162 }); 44163 44164 /*--------------------------------------------------------------------------*/ 44165 44166 // Export lodash. 44167 var _ = runInContext(); 44168 44169 // Some AMD build optimizers, like r.js, check for condition patterns like: 44170 if (true) { 44171 // Expose Lodash on the global object to prevent errors when Lodash is 44172 // loaded by a script tag in the presence of an AMD loader. 44173 // See http://requirejs.org/docs/errors.html#mismatch for more details. 44174 // Use `_.noConflict` to remove Lodash from the global object. 44175 root._ = _; 44176 44177 // Define as an anonymous module so, through path mapping, it can be 44178 // referenced as the "underscore" module. 44179 !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { 44180 return _; 44181 }).call(exports, __webpack_require__, exports, module), 44182 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 44183 } 44184 // Check for `exports` after `define` in case a build optimizer adds it. 44185 else {} 44186 }.call(this)); 44187 44188 44189 /***/ }), 44190 44191
44191/***/ "./src/sass/style.scss": 44192 /*!*****************************!*\ 44193 !*** ./src/sass/style.scss ***! 44194 \*****************************/ 44195 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 44196 44197 "use strict"; 44198 __webpack_require__.r(__webpack_exports__); 44199// extracted by mini-css-extract-plugin 44200 44201 44202 /***/ }), 44203 44204
vendor: 145,634 bytes, lines 44204-47664
44204/***/ "./node_modules/owl.carousel/dist/owl.carousel.js": 44205 /*!********************************************************!*\ 44206 !*** ./node_modules/owl.carousel/dist/owl.carousel.js ***! 44207 \********************************************************/ 44208 /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { 44209 44210 /* provided dependency */ var jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 44211 /* provided dependency */ var __webpack_provided_window_dot_jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 44212 /** 44213 * Owl Carousel v2.3.4 44214 * Copyright 2013-2018 David Deutsch 44215 * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE 44216 */ 44217 /** 44218 * Owl carousel 44219 * @version 2.3.4 44220 * @author Bartosz Wojciechowski 44221 * @author David Deutsch 44222 * @license The MIT License (MIT) 44223 * @todo Lazy Load Icon 44224 * @todo prevent animationend bubling 44225 * @todo itemsScaleUp 44226 * @todo Test Zepto 44227 * @todo stagePadding calculate wrong active classes 44228 */ 44229 ;(function($, window, document, undefined) { 44230 44231 /** 44232 * Creates a carousel. 44233 * @class The Owl Carousel. 44234 * @public 44235 * @param {HTMLElement|jQuery} element - The element to create the carousel for. 44236 * @param {Object} [options] - The options 44237 */ 44238 function Owl(element, options) { 44239 44240 /** 44241 * Current settings for the carousel. 44242 * @public 44243 */ 44244 this.settings = null; 44245 44246 /** 44247 * Current options set by the caller including defaults. 44248 * @public 44249 */ 44250 this.options = $.extend({}, Owl.Defaults, options); 44251 44252 /** 44253 * Plugin element. 44254 * @public 44255 */ 44256 this.$element = $(element); 44257 44258 /** 44259 * Proxied event handlers. 44260 * @protected 44261 */ 44262 this._handlers = {}; 44263 44264 /** 44265 * References to the running plugins of this carousel. 44266 * @protected 44267 */ 44268 this._plugins = {}; 44269 44270 /** 44271 * Currently suppressed events to prevent them from being retriggered. 44272 * @protected 44273 */ 44274 this._supress = {}; 44275 44276 /** 44277 * Absolute current position. 44278 * @protected 44279 */ 44280 this._current = null; 44281 44282 /** 44283 * Animation speed in milliseconds. 44284 * @protected 44285 */ 44286 this._speed = null; 44287 44288 /** 44289 * Coordinates of all items in pixel. 44290 * @todo The name of this member is missleading. 44291 * @protected 44292 */ 44293 this._coordinates = []; 44294 44295 /** 44296 * Current breakpoint. 44297 * @todo Real media queries would be nice. 44298 * @protected 44299 */ 44300 this._breakpoint = null; 44301 44302 /** 44303 * Current width of the plugin element. 44304 */ 44305 this._width = null; 44306 44307 /** 44308 * All real items. 44309 * @protected 44310 */ 44311 this._items = []; 44312 44313 /** 44314 * All cloned items. 44315 * @protected 44316 */ 44317 this._clones = []; 44318 44319 /** 44320 * Merge values of all items. 44321 * @todo Maybe this could be part of a plugin. 44322 * @protected 44323 */ 44324 this._mergers = []; 44325 44326 /** 44327 * Widths of all items. 44328 */ 44329 this._widths = []; 44330 44331 /** 44332 * Invalidated parts within the update process. 44333 * @protected 44334 */ 44335 this._invalidated = {}; 44336 44337 /** 44338 * Ordered list of workers for the update process. 44339 * @protected 44340 */ 44341 this._pipe = []; 44342 44343 /** 44344 * Current state information for the drag operation. 44345 * @todo #261 44346 * @protected 44347 */ 44348 this._drag = { 44349 time: null, 44350 target: null, 44351 pointer: null, 44352 stage: { 44353 start: null, 44354 current: null 44355 }, 44356 direction: null 44357 }; 44358 44359 /** 44360 * Current state information and their tags. 44361 * @type {Object} 44362 * @protected 44363 */ 44364 this._states = { 44365 current: {}, 44366 tags: { 44367 'initializing': [ 'busy' ], 44368 'animating': [ 'busy' ], 44369 'dragging': [ 'interacting' ] 44370 } 44371 }; 44372 44373 $.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) { 44374 this._handlers[handler] = $.proxy(this[handler], this); 44375 }, this)); 44376 44377 $.each(Owl.Plugins, $.proxy(function(key, plugin) { 44378 this._plugins[key.charAt(0).toLowerCase() + key.slice(1)] 44379 = new plugin(this); 44380 }, this)); 44381 44382 $.each(Owl.Workers, $.proxy(function(priority, worker) { 44383 this._pipe.push({ 44384 'filter': worker.filter, 44385 'run': $.proxy(worker.run, this) 44386 }); 44387 }, this)); 44388 44389 this.setup(); 44390 this.initialize(); 44391 } 44392 44393 /** 44394 * Default options for the carousel. 44395 * @public 44396 */ 44397 Owl.Defaults = { 44398 items: 3, 44399 loop: false, 44400 center: false, 44401 rewind: false, 44402 checkVisibility: true, 44403 44404 mouseDrag: true, 44405 touchDrag: true, 44406 pullDrag: true, 44407 freeDrag: false, 44408 44409 margin: 0, 44410 stagePadding: 0, 44411 44412 merge: false, 44413 mergeFit: true, 44414 autoWidth: false, 44415 44416 startPosition: 0, 44417 rtl: false, 44418 44419 smartSpeed: 250, 44420 fluidSpeed: false, 44421 dragEndSpeed: false, 44422 44423 responsive: {}, 44424 responsiveRefreshRate: 200, 44425 responsiveBaseElement: window, 44426 44427 fallbackEasing: 'swing', 44428 slideTransition: '', 44429 44430 info: false, 44431 44432 nestedItemSelector: false, 44433 itemElement: 'div', 44434 stageElement: 'div', 44435 44436 refreshClass: 'owl-refresh', 44437 loadedClass: 'owl-loaded', 44438 loadingClass: 'owl-loading', 44439 rtlClass: 'owl-rtl', 44440 responsiveClass: 'owl-responsive', 44441 dragClass: 'owl-drag', 44442 itemClass: 'owl-item', 44443 stageClass: 'owl-stage', 44444 stageOuterClass: 'owl-stage-outer', 44445 grabClass: 'owl-grab' 44446 }; 44447 44448 /** 44449 * Enumeration for width. 44450 * @public 44451 * @readonly 44452 * @enum {String} 44453 */ 44454 Owl.Width = { 44455 Default: 'default', 44456 Inner: 'inner', 44457 Outer: 'outer' 44458 }; 44459 44460 /** 44461 * Enumeration for types. 44462 * @public 44463 * @readonly 44464 * @enum {String} 44465 */ 44466 Owl.Type = { 44467 Event: 'event', 44468 State: 'state' 44469 }; 44470 44471 /** 44472 * Contains all registered plugins. 44473 * @public 44474 */ 44475 Owl.Plugins = {}; 44476 44477 /** 44478 * List of workers involved in the update process. 44479 */ 44480 Owl.Workers = [ { 44481 filter: [ 'width', 'settings' ], 44482 run: function() { 44483 this._width = this.$element.width(); 44484 } 44485 }, { 44486 filter: [ 'width', 'items', 'settings' ], 44487 run: function(cache) { 44488 cache.current = this._items && this._items[this.relative(this._current)]; 44489 } 44490 }, { 44491 filter: [ 'items', 'settings' ], 44492 run: function() { 44493 this.$stage.children('.cloned').remove(); 44494 } 44495 }, { 44496 filter: [ 'width', 'items', 'settings' ], 44497 run: function(cache) { 44498 var margin = this.settings.margin || '', 44499 grid = !this.settings.autoWidth, 44500 rtl = this.settings.rtl, 44501 css = { 44502 'width': 'auto', 44503 'margin-left': rtl ? margin : '', 44504 'margin-right': rtl ? '' : margin 44505 }; 44506 44507 !grid && this.$stage.children().css(css); 44508 44509 cache.css = css; 44510 } 44511 }, { 44512 filter: [ 'width', 'items', 'settings' ], 44513 run: function(cache) { 44514 var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin, 44515 merge = null, 44516 iterator = this._items.length, 44517 grid = !this.settings.autoWidth, 44518 widths = []; 44519 44520 cache.items = { 44521 merge: false, 44522 width: width 44523 }; 44524 44525 while (iterator--) { 44526 merge = this._mergers[iterator]; 44527 merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge; 44528 44529 cache.items.merge = merge > 1 || cache.items.merge; 44530 44531 widths[iterator] = !grid ? this._items[iterator].width() : width * merge; 44532 } 44533 44534 this._widths = widths; 44535 } 44536 }, { 44537 filter: [ 'items', 'settings' ], 44538 run: function() { 44539 var clones = [], 44540 items = this._items, 44541 settings = this.settings, 44542 // TODO: Should be computed from number of min width items in stage 44543 view = Math.max(settings.items * 2, 4), 44544 size = Math.ceil(items.length / 2) * 2, 44545 repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0, 44546 append = '', 44547 prepend = ''; 44548 44549 repeat /= 2; 44550 44551 while (repeat > 0) { 44552 // Switch to only using appended clones 44553 clones.push(this.normalize(clones.length / 2, true)); 44554 append = append + items[clones[clones.length - 1]][0].outerHTML; 44555 clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true)); 44556 prepend = items[clones[clones.length - 1]][0].outerHTML + prepend; 44557 repeat -= 1; 44558 } 44559 44560 this._clones = clones; 44561 44562 $(append).addClass('cloned').appendTo(this.$stage); 44563 $(prepend).addClass('cloned').prependTo(this.$stage); 44564 } 44565 }, { 44566 filter: [ 'width', 'items', 'settings' ], 44567 run: function() { 44568 var rtl = this.settings.rtl ? 1 : -1, 44569 size = this._clones.length + this._items.length, 44570 iterator = -1, 44571 previous = 0, 44572 current = 0, 44573 coordinates = []; 44574 44575 while (++iterator < size) { 44576 previous = coordinates[iterator - 1] || 0; 44577 current = this._widths[this.relative(iterator)] + this.settings.margin; 44578 coordinates.push(previous + current * rtl); 44579 } 44580 44581 this._coordinates = coordinates; 44582 } 44583 }, { 44584 filter: [ 'width', 'items', 'settings' ], 44585 run: function() { 44586 var padding = this.settings.stagePadding, 44587 coordinates = this._coordinates, 44588 css = { 44589 'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2, 44590 'padding-left': padding || '', 44591 'padding-right': padding || '' 44592 }; 44593 44594 this.$stage.css(css); 44595 } 44596 }, { 44597 filter: [ 'width', 'items', 'settings' ], 44598 run: function(cache) { 44599 var iterator = this._coordinates.length, 44600 grid = !this.settings.autoWidth, 44601 items = this.$stage.children(); 44602 44603 if (grid && cache.items.merge) { 44604 while (iterator--) { 44605 cache.css.width = this._widths[this.relative(iterator)]; 44606 items.eq(iterator).css(cache.css); 44607 } 44608 } else if (grid) { 44609 cache.css.width = cache.items.width; 44610 items.css(cache.css); 44611 } 44612 } 44613 }, { 44614 filter: [ 'items' ], 44615 run: function() { 44616 this._coordinates.length < 1 && this.$stage.removeAttr('style'); 44617 } 44618 }, { 44619 filter: [ 'width', 'items', 'settings' ], 44620 run: function(cache) { 44621 cache.current = cache.current ? this.$stage.children().index(cache.current) : 0; 44622 cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current)); 44623 this.reset(cache.current); 44624 } 44625 }, { 44626 filter: [ 'position' ], 44627 run: function() { 44628 this.animate(this.coordinates(this._current)); 44629 } 44630 }, { 44631 filter: [ 'width', 'position', 'items', 'settings' ], 44632 run: function() { 44633 var rtl = this.settings.rtl ? 1 : -1, 44634 padding = this.settings.stagePadding * 2, 44635 begin = this.coordinates(this.current()) + padding, 44636 end = begin + this.width() * rtl, 44637 inner, outer, matches = [], i, n; 44638 44639 for (i = 0, n = this._coordinates.length; i < n; i++) { 44640 inner = this._coordinates[i - 1] || 0; 44641 outer = Math.abs(this._coordinates[i]) + padding * rtl; 44642 44643 if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end))) 44644 || (this.op(outer, '<', begin) && this.op(outer, '>', end))) { 44645 matches.push(i); 44646 } 44647 } 44648 44649 this.$stage.children('.active').removeClass('active'); 44650 this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active'); 44651 44652 this.$stage.children('.center').removeClass('center'); 44653 if (this.settings.center) { 44654 this.$stage.children().eq(this.current()).addClass('center'); 44655 } 44656 } 44657 } ]; 44658 44659 /** 44660 * Create the stage DOM element 44661 */ 44662 Owl.prototype.initializeStage = function() { 44663 this.$stage = this.$element.find('.' + this.settings.stageClass); 44664 44665 // if the stage is already in the DOM, grab it and skip stage initialization 44666 if (this.$stage.length) { 44667 return; 44668 } 44669 44670 this.$element.addClass(this.options.loadingClass); 44671 44672 // create stage 44673 this.$stage = $('<' + this.settings.stageElement + '>', { 44674 "class": this.settings.stageClass 44675 }).wrap( $( '<div/>', { 44676 "class": this.settings.stageOuterClass 44677 })); 44678 44679 // append stage 44680 this.$element.append(this.$stage.parent()); 44681 }; 44682 44683 /** 44684 * Create item DOM elements 44685 */ 44686 Owl.prototype.initializeItems = function() { 44687 var $items = this.$element.find('.owl-item'); 44688 44689 // if the items are already in the DOM, grab them and skip item initialization 44690 if ($items.length) { 44691 this._items = $items.get().map(function(item) { 44692 return $(item); 44693 }); 44694 44695 this._mergers = this._items.map(function() { 44696 return 1; 44697 }); 44698 44699 this.refresh(); 44700 44701 return; 44702 } 44703 44704 // append content 44705 this.replace(this.$element.children().not(this.$stage.parent())); 44706 44707 // check visibility 44708 if (this.isVisible()) { 44709 // update view 44710 this.refresh(); 44711 } else { 44712 // invalidate width 44713 this.invalidate('width'); 44714 } 44715 44716 this.$element 44717 .removeClass(this.options.loadingClass) 44718 .addClass(this.options.loadedClass); 44719 }; 44720 44721 /** 44722 * Initializes the carousel. 44723 * @protected 44724 */ 44725 Owl.prototype.initialize = function() { 44726 this.enter('initializing'); 44727 this.trigger('initialize'); 44728 44729 this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl); 44730 44731 if (this.settings.autoWidth && !this.is('pre-loading')) { 44732 var imgs, nestedSelector, width; 44733 imgs = this.$element.find('img'); 44734 nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined; 44735 width = this.$element.children(nestedSelector).width(); 44736 44737 if (imgs.length && width <= 0) { 44738 this.preloadAutoWidthImages(imgs); 44739 } 44740 } 44741 44742 this.initializeStage(); 44743 this.initializeItems(); 44744 44745 // register event handlers 44746 this.registerEventHandlers(); 44747 44748 this.leave('initializing'); 44749 this.trigger('initialized'); 44750 }; 44751 44752 /** 44753 * @returns {Boolean} visibility of $element 44754 * if you know the carousel will always be visible you can set `checkVisibility` to `false` to 44755 * prevent the expensive browser layout forced reflow the $element.is(':visible') does 44756 */ 44757 Owl.prototype.isVisible = function() { 44758 return this.settings.checkVisibility 44759 ? this.$element.is(':visible') 44760 : true; 44761 }; 44762 44763 /** 44764 * Setups the current settings. 44765 * @todo Remove responsive classes. Why should adaptive designs be brought into IE8? 44766 * @todo Support for media queries by using `matchMedia` would be nice. 44767 * @public 44768 */ 44769 Owl.prototype.setup = function() { 44770 var viewport = this.viewport(), 44771 overwrites = this.options.responsive, 44772 match = -1, 44773 settings = null; 44774 44775 if (!overwrites) { 44776 settings = $.extend({}, this.options); 44777 } else { 44778 $.each(overwrites, function(breakpoint) { 44779 if (breakpoint <= viewport && breakpoint > match) { 44780 match = Number(breakpoint); 44781 } 44782 }); 44783 44784 settings = $.extend({}, this.options, overwrites[match]); 44785 if (typeof settings.stagePadding === 'function') { 44786 settings.stagePadding = settings.stagePadding(); 44787 } 44788 delete settings.responsive; 44789 44790 // responsive class 44791 if (settings.responsiveClass) { 44792 this.$element.attr('class', 44793 this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match) 44794 ); 44795 } 44796 } 44797 44798 this.trigger('change', { property: { name: 'settings', value: settings } }); 44799 this._breakpoint = match; 44800 this.settings = settings; 44801 this.invalidate('settings'); 44802 this.trigger('changed', { property: { name: 'settings', value: this.settings } }); 44803 }; 44804 44805 /** 44806 * Updates option logic if necessery. 44807 * @protected 44808 */ 44809 Owl.prototype.optionsLogic = function() { 44810 if (this.settings.autoWidth) { 44811 this.settings.stagePadding = false; 44812 this.settings.merge = false; 44813 } 44814 }; 44815 44816 /** 44817 * Prepares an item before add. 44818 * @todo Rename event parameter `content` to `item`. 44819 * @protected 44820 * @returns {jQuery|HTMLElement} - The item container. 44821 */ 44822 Owl.prototype.prepare = function(item) { 44823 var event = this.trigger('prepare', { content: item }); 44824 44825 if (!event.data) { 44826 event.data = $('<' + this.settings.itemElement + '/>') 44827 .addClass(this.options.itemClass).append(item) 44828 } 44829 44830 this.trigger('prepared', { content: event.data }); 44831 44832 return event.data; 44833 }; 44834 44835 /** 44836 * Updates the view. 44837 * @public 44838 */ 44839 Owl.prototype.update = function() { 44840 var i = 0, 44841 n = this._pipe.length, 44842 filter = $.proxy(function(p) { return this[p] }, this._invalidated), 44843 cache = {}; 44844 44845 while (i < n) { 44846 if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) { 44847 this._pipe[i].run(cache); 44848 } 44849 i++; 44850 } 44851 44852 this._invalidated = {}; 44853 44854 !this.is('valid') && this.enter('valid'); 44855 }; 44856 44857 /** 44858 * Gets the width of the view. 44859 * @public 44860 * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return. 44861 * @returns {Number} - The width of the view in pixel. 44862 */ 44863 Owl.prototype.width = function(dimension) { 44864 dimension = dimension || Owl.Width.Default; 44865 switch (dimension) { 44866 case Owl.Width.Inner: 44867 case Owl.Width.Outer: 44868 return this._width; 44869 default: 44870 return this._width - this.settings.stagePadding * 2 + this.settings.margin; 44871 } 44872 }; 44873 44874 /** 44875 * Refreshes the carousel primarily for adaptive purposes. 44876 * @public 44877 */ 44878 Owl.prototype.refresh = function() { 44879 this.enter('refreshing'); 44880 this.trigger('refresh'); 44881 44882 this.setup(); 44883 44884 this.optionsLogic(); 44885 44886 this.$element.addClass(this.options.refreshClass); 44887 44888 this.update(); 44889 44890 this.$element.removeClass(this.options.refreshClass); 44891 44892 this.leave('refreshing'); 44893 this.trigger('refreshed'); 44894 }; 44895 44896 /** 44897 * Checks window `resize` event. 44898 * @protected 44899 */ 44900 Owl.prototype.onThrottledResize = function() { 44901 window.clearTimeout(this.resizeTimer); 44902 this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate); 44903 }; 44904 44905 /** 44906 * Checks window `resize` event. 44907 * @protected 44908 */ 44909 Owl.prototype.onResize = function() { 44910 if (!this._items.length) { 44911 return false; 44912 } 44913 44914 if (this._width === this.$element.width()) { 44915 return false; 44916 } 44917 44918 if (!this.isVisible()) { 44919 return false; 44920 } 44921 44922 this.enter('resizing'); 44923 44924 if (this.trigger('resize').isDefaultPrevented()) { 44925 this.leave('resizing'); 44926 return false; 44927 } 44928 44929 this.invalidate('width'); 44930 44931 this.refresh(); 44932 44933 this.leave('resizing'); 44934 this.trigger('resized'); 44935 }; 44936 44937 /** 44938 * Registers event handlers. 44939 * @todo Check `msPointerEnabled` 44940 * @todo #261 44941 * @protected 44942 */ 44943 Owl.prototype.registerEventHandlers = function() { 44944 if ($.support.transition) { 44945 this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this)); 44946 } 44947 44948 if (this.settings.responsive !== false) { 44949 this.on(window, 'resize', this._handlers.onThrottledResize); 44950 } 44951 44952 if (this.settings.mouseDrag) { 44953 this.$element.addClass(this.options.dragClass); 44954 this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this)); 44955 this.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false }); 44956 } 44957 44958 if (this.settings.touchDrag){ 44959 this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this)); 44960 this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this)); 44961 } 44962 }; 44963 44964 /** 44965 * Handles `touchstart` and `mousedown` events. 44966 * @todo Horizontal swipe threshold as option 44967 * @todo #261 44968 * @protected 44969 * @param {Event} event - The event arguments. 44970 */ 44971 Owl.prototype.onDragStart = function(event) { 44972 var stage = null; 44973 44974 if (event.which === 3) { 44975 return; 44976 } 44977 44978 if ($.support.transform) { 44979 stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(','); 44980 stage = { 44981 x: stage[stage.length === 16 ? 12 : 4], 44982 y: stage[stage.length === 16 ? 13 : 5] 44983 }; 44984 } else { 44985 stage = this.$stage.position(); 44986 stage = { 44987 x: this.settings.rtl ? 44988 stage.left + this.$stage.width() - this.width() + this.settings.margin : 44989 stage.left, 44990 y: stage.top 44991 }; 44992 } 44993 44994 if (this.is('animating')) { 44995 $.support.transform ? this.animate(stage.x) : this.$stage.stop() 44996 this.invalidate('position'); 44997 } 44998 44999 this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown'); 45000 45001 this.speed(0); 45002 45003 this._drag.time = new Date().getTime(); 45004 this._drag.target = $(event.target); 45005 this._drag.stage.start = stage; 45006 this._drag.stage.current = stage; 45007 this._drag.pointer = this.pointer(event); 45008 45009 $(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this)); 45010 45011 $(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) { 45012 var delta = this.difference(this._drag.pointer, this.pointer(event)); 45013 45014 $(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this)); 45015 45016 if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) { 45017 return; 45018 } 45019 45020 event.preventDefault(); 45021 45022 this.enter('dragging'); 45023 this.trigger('drag'); 45024 }, this)); 45025 }; 45026 45027 /** 45028 * Handles the `touchmove` and `mousemove` events. 45029 * @todo #261 45030 * @protected 45031 * @param {Event} event - The event arguments. 45032 */ 45033 Owl.prototype.onDragMove = function(event) { 45034 var minimum = null, 45035 maximum = null, 45036 pull = null, 45037 delta = this.difference(this._drag.pointer, this.pointer(event)), 45038 stage = this.difference(this._drag.stage.start, delta); 45039 45040 if (!this.is('dragging')) { 45041 return; 45042 } 45043 45044 event.preventDefault(); 45045 45046 if (this.settings.loop) { 45047 minimum = this.coordinates(this.minimum()); 45048 maximum = this.coordinates(this.maximum() + 1) - minimum; 45049 stage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum; 45050 } else { 45051 minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum()); 45052 maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum()); 45053 pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0; 45054 stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull); 45055 } 45056 45057 this._drag.stage.current = stage; 45058 45059 this.animate(stage.x); 45060 }; 45061 45062 /** 45063 * Handles the `touchend` and `mouseup` events. 45064 * @todo #261 45065 * @todo Threshold for click event 45066 * @protected 45067 * @param {Event} event - The event arguments. 45068 */ 45069 Owl.prototype.onDragEnd = function(event) { 45070 var delta = this.difference(this._drag.pointer, this.pointer(event)), 45071 stage = this._drag.stage.current, 45072 direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right'; 45073 45074 $(document).off('.owl.core'); 45075 45076 this.$element.removeClass(this.options.grabClass); 45077 45078 if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) { 45079 this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed); 45080 this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction)); 45081 this.invalidate('position'); 45082 this.update(); 45083 45084 this._drag.direction = direction; 45085 45086 if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) { 45087 this._drag.target.one('click.owl.core', function() { return false; }); 45088 } 45089 } 45090 45091 if (!this.is('dragging')) { 45092 return; 45093 } 45094 45095 this.leave('dragging'); 45096 this.trigger('dragged'); 45097 }; 45098 45099 /** 45100 * Gets absolute position of the closest item for a coordinate. 45101 * @todo Setting `freeDrag` makes `closest` not reusable. See #165. 45102 * @protected 45103 * @param {Number} coordinate - The coordinate in pixel. 45104 * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`. 45105 * @return {Number} - The absolute position of the closest item. 45106 */ 45107 Owl.prototype.closest = function(coordinate, direction) { 45108 var position = -1, 45109 pull = 30, 45110 width = this.width(), 45111 coordinates = this.coordinates(); 45112 45113 if (!this.settings.freeDrag) { 45114 // check closest item 45115 $.each(coordinates, $.proxy(function(index, value) { 45116 // on a left pull, check on current index 45117 if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) { 45118 position = index; 45119 // on a right pull, check on previous index 45120 // to do so, subtract width from value and set position = index + 1 45121 } else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) { 45122 position = index + 1; 45123 } else if (this.op(coordinate, '<', value) 45124 && this.op(coordinate, '>', coordinates[index + 1] !== undefined ? coordinates[index + 1] : value - width)) { 45125 position = direction === 'left' ? index + 1 : index; 45126 } 45127 return position === -1; 45128 }, this)); 45129 } 45130 45131 if (!this.settings.loop) { 45132 // non loop boundries 45133 if (this.op(coordinate, '>', coordinates[this.minimum()])) { 45134 position = coordinate = this.minimum(); 45135 } else if (this.op(coordinate, '<', coordinates[this.maximum()])) { 45136 position = coordinate = this.maximum(); 45137 } 45138 } 45139 45140 return position; 45141 }; 45142 45143 /** 45144 * Animates the stage. 45145 * @todo #270 45146 * @public 45147 * @param {Number} coordinate - The coordinate in pixels. 45148 */ 45149 Owl.prototype.animate = function(coordinate) { 45150 var animate = this.speed() > 0; 45151 45152 this.is('animating') && this.onTransitionEnd(); 45153 45154 if (animate) { 45155 this.enter('animating'); 45156 this.trigger('translate'); 45157 } 45158 45159 if ($.support.transform3d && $.support.transition) { 45160 this.$stage.css({ 45161 transform: 'translate3d(' + coordinate + 'px,0px,0px)', 45162 transition: (this.speed() / 1000) + 's' + ( 45163 this.settings.slideTransition ? ' ' + this.settings.slideTransition : '' 45164 ) 45165 }); 45166 } else if (animate) { 45167 this.$stage.animate({ 45168 left: coordinate + 'px' 45169 }, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this)); 45170 } else { 45171 this.$stage.css({ 45172 left: coordinate + 'px' 45173 }); 45174 } 45175 }; 45176 45177 /** 45178 * Checks whether the carousel is in a specific state or not. 45179 * @param {String} state - The state to check. 45180 * @returns {Boolean} - The flag which indicates if the carousel is busy. 45181 */ 45182 Owl.prototype.is = function(state) { 45183 return this._states.current[state] && this._states.current[state] > 0; 45184 }; 45185 45186 /** 45187 * Sets the absolute position of the current item. 45188 * @public 45189 * @param {Number} [position] - The new absolute position or nothing to leave it unchanged. 45190 * @returns {Number} - The absolute position of the current item. 45191 */ 45192 Owl.prototype.current = function(position) { 45193 if (position === undefined) { 45194 return this._current; 45195 } 45196 45197 if (this._items.length === 0) { 45198 return undefined; 45199 } 45200 45201 position = this.normalize(position); 45202 45203 if (this._current !== position) { 45204 var event = this.trigger('change', { property: { name: 'position', value: position } }); 45205 45206 if (event.data !== undefined) { 45207 position = this.normalize(event.data); 45208 } 45209 45210 this._current = position; 45211 45212 this.invalidate('position'); 45213 45214 this.trigger('changed', { property: { name: 'position', value: this._current } }); 45215 } 45216 45217 return this._current; 45218 }; 45219 45220 /** 45221 * Invalidates the given part of the update routine. 45222 * @param {String} [part] - The part to invalidate. 45223 * @returns {Array.<String>} - The invalidated parts. 45224 */ 45225 Owl.prototype.invalidate = function(part) { 45226 if ($.type(part) === 'string') { 45227 this._invalidated[part] = true; 45228 this.is('valid') && this.leave('valid'); 45229 } 45230 return $.map(this._invalidated, function(v, i) { return i }); 45231 }; 45232 45233 /** 45234 * Resets the absolute position of the current item. 45235 * @public 45236 * @param {Number} position - The absolute position of the new item. 45237 */ 45238 Owl.prototype.reset = function(position) { 45239 position = this.normalize(position); 45240 45241 if (position === undefined) { 45242 return; 45243 } 45244 45245 this._speed = 0; 45246 this._current = position; 45247 45248 this.suppress([ 'translate', 'translated' ]); 45249 45250 this.animate(this.coordinates(position)); 45251 45252 this.release([ 'translate', 'translated' ]); 45253 }; 45254 45255 /** 45256 * Normalizes an absolute or a relative position of an item. 45257 * @public 45258 * @param {Number} position - The absolute or relative position to normalize. 45259 * @param {Boolean} [relative=false] - Whether the given position is relative or not. 45260 * @returns {Number} - The normalized position. 45261 */ 45262 Owl.prototype.normalize = function(position, relative) { 45263 var n = this._items.length, 45264 m = relative ? 0 : this._clones.length; 45265 45266 if (!this.isNumeric(position) || n < 1) { 45267 position = undefined; 45268 } else if (position < 0 || position >= n + m) { 45269 position = ((position - m / 2) % n + n) % n + m / 2; 45270 } 45271 45272 return position; 45273 }; 45274 45275 /** 45276 * Converts an absolute position of an item into a relative one. 45277 * @public 45278 * @param {Number} position - The absolute position to convert. 45279 * @returns {Number} - The converted position. 45280 */ 45281 Owl.prototype.relative = function(position) { 45282 position -= this._clones.length / 2; 45283 return this.normalize(position, true); 45284 }; 45285 45286 /** 45287 * Gets the maximum position for the current item. 45288 * @public 45289 * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position. 45290 * @returns {Number} 45291 */ 45292 Owl.prototype.maximum = function(relative) { 45293 var settings = this.settings, 45294 maximum = this._coordinates.length, 45295 iterator, 45296 reciprocalItemsWidth, 45297 elementWidth; 45298 45299 if (settings.loop) { 45300 maximum = this._clones.length / 2 + this._items.length - 1; 45301 } else if (settings.autoWidth || settings.merge) { 45302 iterator = this._items.length; 45303 if (iterator) { 45304 reciprocalItemsWidth = this._items[--iterator].width(); 45305 elementWidth = this.$element.width(); 45306 while (iterator--) { 45307 reciprocalItemsWidth += this._items[iterator].width() + this.settings.margin; 45308 if (reciprocalItemsWidth > elementWidth) { 45309 break; 45310 } 45311 } 45312 } 45313 maximum = iterator + 1; 45314 } else if (settings.center) { 45315 maximum = this._items.length - 1; 45316 } else { 45317 maximum = this._items.length - settings.items; 45318 } 45319 45320 if (relative) { 45321 maximum -= this._clones.length / 2; 45322 } 45323 45324 return Math.max(maximum, 0); 45325 }; 45326 45327 /** 45328 * Gets the minimum position for the current item. 45329 * @public 45330 * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position. 45331 * @returns {Number} 45332 */ 45333 Owl.prototype.minimum = function(relative) { 45334 return relative ? 0 : this._clones.length / 2; 45335 }; 45336 45337 /** 45338 * Gets an item at the specified relative position. 45339 * @public 45340 * @param {Number} [position] - The relative position of the item. 45341 * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given. 45342 */ 45343 Owl.prototype.items = function(position) { 45344 if (position === undefined) { 45345 return this._items.slice(); 45346 } 45347 45348 position = this.normalize(position, true); 45349 return this._items[position]; 45350 }; 45351 45352 /** 45353 * Gets an item at the specified relative position. 45354 * @public 45355 * @param {Number} [position] - The relative position of the item. 45356 * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given. 45357 */ 45358 Owl.prototype.mergers = function(position) { 45359 if (position === undefined) { 45360 return this._mergers.slice(); 45361 } 45362 45363 position = this.normalize(position, true); 45364 return this._mergers[position]; 45365 }; 45366 45367 /** 45368 * Gets the absolute positions of clones for an item. 45369 * @public 45370 * @param {Number} [position] - The relative position of the item. 45371 * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given. 45372 */ 45373 Owl.prototype.clones = function(position) { 45374 var odd = this._clones.length / 2, 45375 even = odd + this._items.length, 45376 map = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 }; 45377 45378 if (position === undefined) { 45379 return $.map(this._clones, function(v, i) { return map(i) }); 45380 } 45381 45382 return $.map(this._clones, function(v, i) { return v === position ? map(i) : null }); 45383 }; 45384 45385 /** 45386 * Sets the current animation speed. 45387 * @public 45388 * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged. 45389 * @returns {Number} - The current animation speed in milliseconds. 45390 */ 45391 Owl.prototype.speed = function(speed) { 45392 if (speed !== undefined) { 45393 this._speed = speed; 45394 } 45395 45396 return this._speed; 45397 }; 45398 45399 /** 45400 * Gets the coordinate of an item. 45401 * @todo The name of this method is missleanding. 45402 * @public 45403 * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`. 45404 * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates. 45405 */ 45406 Owl.prototype.coordinates = function(position) { 45407 var multiplier = 1, 45408 newPosition = position - 1, 45409 coordinate; 45410 45411 if (position === undefined) { 45412 return $.map(this._coordinates, $.proxy(function(coordinate, index) { 45413 return this.coordinates(index); 45414 }, this)); 45415 } 45416 45417 if (this.settings.center) { 45418 if (this.settings.rtl) { 45419 multiplier = -1; 45420 newPosition = position + 1; 45421 } 45422 45423 coordinate = this._coordinates[position]; 45424 coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier; 45425 } else { 45426 coordinate = this._coordinates[newPosition] || 0; 45427 } 45428 45429 coordinate = Math.ceil(coordinate); 45430 45431 return coordinate; 45432 }; 45433 45434 /** 45435 * Calculates the speed for a translation. 45436 * @protected 45437 * @param {Number} from - The absolute position of the start item. 45438 * @param {Number} to - The absolute position of the target item. 45439 * @param {Number} [factor=undefined] - The time factor in milliseconds. 45440 * @returns {Number} - The time in milliseconds for the translation. 45441 */ 45442 Owl.prototype.duration = function(from, to, factor) { 45443 if (factor === 0) { 45444 return 0; 45445 } 45446 45447 return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed)); 45448 }; 45449 45450 /** 45451 * Slides to the specified item. 45452 * @public 45453 * @param {Number} position - The position of the item. 45454 * @param {Number} [speed] - The time in milliseconds for the transition. 45455 */ 45456 Owl.prototype.to = function(position, speed) { 45457 var current = this.current(), 45458 revert = null, 45459 distance = position - this.relative(current), 45460 direction = (distance > 0) - (distance < 0), 45461 items = this._items.length, 45462 minimum = this.minimum(), 45463 maximum = this.maximum(); 45464 45465 if (this.settings.loop) { 45466 if (!this.settings.rewind && Math.abs(distance) > items / 2) { 45467 distance += direction * -1 * items; 45468 } 45469 45470 position = current + distance; 45471 revert = ((position - minimum) % items + items) % items + minimum; 45472 45473 if (revert !== position && revert - distance <= maximum && revert - distance > 0) { 45474 current = revert - distance; 45475 position = revert; 45476 this.reset(current); 45477 } 45478 } else if (this.settings.rewind) { 45479 maximum += 1; 45480 position = (position % maximum + maximum) % maximum; 45481 } else { 45482 position = Math.max(minimum, Math.min(maximum, position)); 45483 } 45484 45485 this.speed(this.duration(current, position, speed)); 45486 this.current(position); 45487 45488 if (this.isVisible()) { 45489 this.update(); 45490 } 45491 }; 45492 45493 /** 45494 * Slides to the next item. 45495 * @public 45496 * @param {Number} [speed] - The time in milliseconds for the transition. 45497 */ 45498 Owl.prototype.next = function(speed) { 45499 speed = speed || false; 45500 this.to(this.relative(this.current()) + 1, speed); 45501 }; 45502 45503 /** 45504 * Slides to the previous item. 45505 * @public 45506 * @param {Number} [speed] - The time in milliseconds for the transition. 45507 */ 45508 Owl.prototype.prev = function(speed) { 45509 speed = speed || false; 45510 this.to(this.relative(this.current()) - 1, speed); 45511 }; 45512 45513 /** 45514 * Handles the end of an animation. 45515 * @protected 45516 * @param {Event} event - The event arguments. 45517 */ 45518 Owl.prototype.onTransitionEnd = function(event) { 45519 45520 // if css2 animation then event object is undefined 45521 if (event !== undefined) { 45522 event.stopPropagation(); 45523 45524 // Catch only owl-stage transitionEnd event 45525 if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) { 45526 return false; 45527 } 45528 } 45529 45530 this.leave('animating'); 45531 this.trigger('translated'); 45532 }; 45533 45534 /** 45535 * Gets viewport width. 45536 * @protected 45537 * @return {Number} - The width in pixel. 45538 */ 45539 Owl.prototype.viewport = function() { 45540 var width; 45541 if (this.options.responsiveBaseElement !== window) { 45542 width = $(this.options.responsiveBaseElement).width(); 45543 } else if (window.innerWidth) { 45544 width = window.innerWidth; 45545 } else if (document.documentElement && document.documentElement.clientWidth) { 45546 width = document.documentElement.clientWidth; 45547 } else { 45548 console.warn('Can not detect viewport width.'); 45549 } 45550 return width; 45551 }; 45552 45553 /** 45554 * Replaces the current content. 45555 * @public 45556 * @param {HTMLElement|jQuery|String} content - The new content. 45557 */ 45558 Owl.prototype.replace = function(content) { 45559 this.$stage.empty(); 45560 this._items = []; 45561 45562 if (content) { 45563 content = (content instanceof jQuery) ? content : $(content); 45564 } 45565 45566 if (this.settings.nestedItemSelector) { 45567 content = content.find('.' + this.settings.nestedItemSelector); 45568 } 45569 45570 content.filter(function() { 45571 return this.nodeType === 1; 45572 }).each($.proxy(function(index, item) { 45573 item = this.prepare(item); 45574 this.$stage.append(item); 45575 this._items.push(item); 45576 this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); 45577 }, this)); 45578 45579 this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0); 45580 45581 this.invalidate('items'); 45582 }; 45583 45584 /** 45585 * Adds an item. 45586 * @todo Use `item` instead of `content` for the event arguments. 45587 * @public 45588 * @param {HTMLElement|jQuery|String} content - The item content to add. 45589 * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end. 45590 */ 45591 Owl.prototype.add = function(content, position) { 45592 var current = this.relative(this._current); 45593 45594 position = position === undefined ? this._items.length : this.normalize(position, true); 45595 content = content instanceof jQuery ? content : $(content); 45596 45597 this.trigger('add', { content: content, position: position }); 45598 45599 content = this.prepare(content); 45600 45601 if (this._items.length === 0 || position === this._items.length) { 45602 this._items.length === 0 && this.$stage.append(content); 45603 this._items.length !== 0 && this._items[position - 1].after(content); 45604 this._items.push(content); 45605 this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); 45606 } else { 45607 this._items[position].before(content); 45608 this._items.splice(position, 0, content); 45609 this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); 45610 } 45611 45612 this._items[current] && this.reset(this._items[current].index()); 45613 45614 this.invalidate('items'); 45615 45616 this.trigger('added', { content: content, position: position }); 45617 }; 45618 45619 /** 45620 * Removes an item by its position. 45621 * @todo Use `item` instead of `content` for the event arguments. 45622 * @public 45623 * @param {Number} position - The relative position of the item to remove. 45624 */ 45625 Owl.prototype.remove = function(position) { 45626 position = this.normalize(position, true); 45627 45628 if (position === undefined) { 45629 return; 45630 } 45631 45632 this.trigger('remove', { content: this._items[position], position: position }); 45633 45634 this._items[position].remove(); 45635 this._items.splice(position, 1); 45636 this._mergers.splice(position, 1); 45637 45638 this.invalidate('items'); 45639 45640 this.trigger('removed', { content: null, position: position }); 45641 }; 45642 45643 /** 45644 * Preloads images with auto width. 45645 * @todo Replace by a more generic approach 45646 * @protected 45647 */ 45648 Owl.prototype.preloadAutoWidthImages = function(images) { 45649 images.each($.proxy(function(i, element) { 45650 this.enter('pre-loading'); 45651 element = $(element); 45652 $(new Image()).one('load', $.proxy(function(e) { 45653 element.attr('src', e.target.src); 45654 element.css('opacity', 1); 45655 this.leave('pre-loading'); 45656 !this.is('pre-loading') && !this.is('initializing') && this.refresh(); 45657 }, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina')); 45658 }, this)); 45659 }; 45660 45661 /** 45662 * Destroys the carousel. 45663 * @public 45664 */ 45665 Owl.prototype.destroy = function() { 45666 45667 this.$element.off('.owl.core'); 45668 this.$stage.off('.owl.core'); 45669 $(document).off('.owl.core'); 45670 45671 if (this.settings.responsive !== false) { 45672 window.clearTimeout(this.resizeTimer); 45673 this.off(window, 'resize', this._handlers.onThrottledResize); 45674 } 45675 45676 for (var i in this._plugins) { 45677 this._plugins[i].destroy(); 45678 } 45679 45680 this.$stage.children('.cloned').remove(); 45681 45682 this.$stage.unwrap(); 45683 this.$stage.children().contents().unwrap(); 45684 this.$stage.children().unwrap(); 45685 this.$stage.remove(); 45686 this.$element 45687 .removeClass(this.options.refreshClass) 45688 .removeClass(this.options.loadingClass) 45689 .removeClass(this.options.loadedClass) 45690 .removeClass(this.options.rtlClass) 45691 .removeClass(this.options.dragClass) 45692 .removeClass(this.options.grabClass) 45693 .attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), '')) 45694 .removeData('owl.carousel'); 45695 }; 45696 45697 /** 45698 * Operators to calculate right-to-left and left-to-right. 45699 * @protected 45700 * @param {Number} [a] - The left side operand. 45701 * @param {String} [o] - The operator. 45702 * @param {Number} [b] - The right side operand. 45703 */ 45704 Owl.prototype.op = function(a, o, b) { 45705 var rtl = this.settings.rtl; 45706 switch (o) { 45707 case '<': 45708 return rtl ? a > b : a < b; 45709 case '>': 45710 return rtl ? a < b : a > b; 45711 case '>=': 45712 return rtl ? a <= b : a >= b; 45713 case '<=': 45714 return rtl ? a >= b : a <= b; 45715 default: 45716 break; 45717 } 45718 }; 45719 45720 /** 45721 * Attaches to an internal event. 45722 * @protected 45723 * @param {HTMLElement} element - The event source. 45724 * @param {String} event - The event name. 45725 * @param {Function} listener - The event handler to attach. 45726 * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not. 45727 */ 45728 Owl.prototype.on = function(element, event, listener, capture) { 45729 if (element.addEventListener) { 45730 element.addEventListener(event, listener, capture); 45731 } else if (element.attachEvent) { 45732 element.attachEvent('on' + event, listener); 45733 } 45734 }; 45735 45736 /** 45737 * Detaches from an internal event. 45738 * @protected 45739 * @param {HTMLElement} element - The event source. 45740 * @param {String} event - The event name. 45741 * @param {Function} listener - The attached event handler to detach. 45742 * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not. 45743 */ 45744 Owl.prototype.off = function(element, event, listener, capture) { 45745 if (element.removeEventListener) { 45746 element.removeEventListener(event, listener, capture); 45747 } else if (element.detachEvent) { 45748 element.detachEvent('on' + event, listener); 45749 } 45750 }; 45751 45752 /** 45753 * Triggers a public event. 45754 * @todo Remove `status`, `relatedTarget` should be used instead. 45755 * @protected 45756 * @param {String} name - The event name. 45757 * @param {*} [data=null] - The event data. 45758 * @param {String} [namespace=carousel] - The event namespace. 45759 * @param {String} [state] - The state which is associated with the event. 45760 * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not. 45761 * @returns {Event} - The event arguments. 45762 */ 45763 Owl.prototype.trigger = function(name, data, namespace, state, enter) { 45764 var status = { 45765 item: { count: this._items.length, index: this.current() } 45766 }, handler = $.camelCase( 45767 $.grep([ 'on', name, namespace ], function(v) { return v }) 45768 .join('-').toLowerCase() 45769 ), event = $.Event( 45770 [ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(), 45771 $.extend({ relatedTarget: this }, status, data) 45772 ); 45773 45774 if (!this._supress[name]) { 45775 $.each(this._plugins, function(name, plugin) { 45776 if (plugin.onTrigger) { 45777 plugin.onTrigger(event); 45778 } 45779 }); 45780 45781 this.register({ type: Owl.Type.Event, name: name }); 45782 this.$element.trigger(event); 45783 45784 if (this.settings && typeof this.settings[handler] === 'function') { 45785 this.settings[handler].call(this, event); 45786 } 45787 } 45788 45789 return event; 45790 }; 45791 45792 /** 45793 * Enters a state. 45794 * @param name - The state name. 45795 */ 45796 Owl.prototype.enter = function(name) { 45797 $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) { 45798 if (this._states.current[name] === undefined) { 45799 this._states.current[name] = 0; 45800 } 45801 45802 this._states.current[name]++; 45803 }, this)); 45804 }; 45805 45806 /** 45807 * Leaves a state. 45808 * @param name - The state name. 45809 */ 45810 Owl.prototype.leave = function(name) { 45811 $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) { 45812 this._states.current[name]--; 45813 }, this)); 45814 }; 45815 45816 /** 45817 * Registers an event or state. 45818 * @public 45819 * @param {Object} object - The event or state to register. 45820 */ 45821 Owl.prototype.register = function(object) { 45822 if (object.type === Owl.Type.Event) { 45823 if (!$.event.special[object.name]) { 45824 $.event.special[object.name] = {}; 45825 } 45826 45827 if (!$.event.special[object.name].owl) { 45828 var _default = $.event.special[object.name]._default; 45829 $.event.special[object.name]._default = function(e) { 45830 if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) { 45831 return _default.apply(this, arguments); 45832 } 45833 return e.namespace && e.namespace.indexOf('owl') > -1; 45834 }; 45835 $.event.special[object.name].owl = true; 45836 } 45837 } else if (object.type === Owl.Type.State) { 45838 if (!this._states.tags[object.name]) { 45839 this._states.tags[object.name] = object.tags; 45840 } else { 45841 this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags); 45842 } 45843 45844 this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) { 45845 return $.inArray(tag, this._states.tags[object.name]) === i; 45846 }, this)); 45847 } 45848 }; 45849 45850 /** 45851 * Suppresses events. 45852 * @protected 45853 * @param {Array.<String>} events - The events to suppress. 45854 */ 45855 Owl.prototype.suppress = function(events) { 45856 $.each(events, $.proxy(function(index, event) { 45857 this._supress[event] = true; 45858 }, this)); 45859 }; 45860 45861 /** 45862 * Releases suppressed events. 45863 * @protected 45864 * @param {Array.<String>} events - The events to release. 45865 */ 45866 Owl.prototype.release = function(events) { 45867 $.each(events, $.proxy(function(index, event) { 45868 delete this._supress[event]; 45869 }, this)); 45870 }; 45871 45872 /** 45873 * Gets unified pointer coordinates from event. 45874 * @todo #261 45875 * @protected 45876 * @param {Event} - The `mousedown` or `touchstart` event. 45877 * @returns {Object} - Contains `x` and `y` coordinates of current pointer position. 45878 */ 45879 Owl.prototype.pointer = function(event) { 45880 var result = { x: null, y: null }; 45881 45882 event = event.originalEvent || event || window.event; 45883 45884 event = event.touches && event.touches.length ? 45885 event.touches[0] : event.changedTouches && event.changedTouches.length ? 45886 event.changedTouches[0] : event; 45887 45888 if (event.pageX) { 45889 result.x = event.pageX; 45890 result.y = event.pageY; 45891 } else { 45892 result.x = event.clientX; 45893 result.y = event.clientY; 45894 } 45895 45896 return result; 45897 }; 45898 45899 /** 45900 * Determines if the input is a Number or something that can be coerced to a Number 45901 * @protected 45902 * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested 45903 * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number 45904 */ 45905 Owl.prototype.isNumeric = function(number) { 45906 return !isNaN(parseFloat(number)); 45907 }; 45908 45909 /** 45910 * Gets the difference of two vectors. 45911 * @todo #261 45912 * @protected 45913 * @param {Object} - The first vector. 45914 * @param {Object} - The second vector. 45915 * @returns {Object} - The difference. 45916 */ 45917 Owl.prototype.difference = function(first, second) { 45918 return { 45919 x: first.x - second.x, 45920 y: first.y - second.y 45921 }; 45922 }; 45923 45924 /** 45925 * The jQuery Plugin for the Owl Carousel 45926 * @todo Navigation plugin `next` and `prev` 45927 * @public 45928 */ 45929 $.fn.owlCarousel = function(option) { 45930 var args = Array.prototype.slice.call(arguments, 1); 45931 45932 return this.each(function() { 45933 var $this = $(this), 45934 data = $this.data('owl.carousel'); 45935 45936 if (!data) { 45937 data = new Owl(this, typeof option == 'object' && option); 45938 $this.data('owl.carousel', data); 45939 45940 $.each([ 45941 'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove' 45942 ], function(i, event) { 45943 data.register({ type: Owl.Type.Event, name: event }); 45944 data.$element.on(event + '.owl.carousel.core', $.proxy(function(e) { 45945 if (e.namespace && e.relatedTarget !== this) { 45946 this.suppress([ event ]); 45947 data[event].apply(this, [].slice.call(arguments, 1)); 45948 this.release([ event ]); 45949 } 45950 }, data)); 45951 }); 45952 } 45953 45954 if (typeof option == 'string' && option.charAt(0) !== '_') { 45955 data[option].apply(data, args); 45956 } 45957 }); 45958 }; 45959 45960 /** 45961 * The constructor for the jQuery Plugin 45962 * @public 45963 */ 45964 $.fn.owlCarousel.Constructor = Owl; 45965 45966 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 45967 45968 /** 45969 * AutoRefresh Plugin 45970 * @version 2.3.4 45971 * @author Artus Kolanowski 45972 * @author David Deutsch 45973 * @license The MIT License (MIT) 45974 */ 45975 ;(function($, window, document, undefined) { 45976 45977 /** 45978 * Creates the auto refresh plugin. 45979 * @class The Auto Refresh Plugin 45980 * @param {Owl} carousel - The Owl Carousel 45981 */ 45982 var AutoRefresh = function(carousel) { 45983 /** 45984 * Reference to the core. 45985 * @protected 45986 * @type {Owl} 45987 */ 45988 this._core = carousel; 45989 45990 /** 45991 * Refresh interval. 45992 * @protected 45993 * @type {number} 45994 */ 45995 this._interval = null; 45996 45997 /** 45998 * Whether the element is currently visible or not. 45999 * @protected 46000 * @type {Boolean} 46001 */ 46002 this._visible = null; 46003 46004 /** 46005 * All event handlers. 46006 * @protected 46007 * @type {Object} 46008 */ 46009 this._handlers = { 46010 'initialized.owl.carousel': $.proxy(function(e) { 46011 if (e.namespace && this._core.settings.autoRefresh) { 46012 this.watch(); 46013 } 46014 }, this) 46015 }; 46016 46017 // set default options 46018 this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options); 46019 46020 // register event handlers 46021 this._core.$element.on(this._handlers); 46022 }; 46023 46024 /** 46025 * Default options. 46026 * @public 46027 */ 46028 AutoRefresh.Defaults = { 46029 autoRefresh: true, 46030 autoRefreshInterval: 500 46031 }; 46032 46033 /** 46034 * Watches the element. 46035 */ 46036 AutoRefresh.prototype.watch = function() { 46037 if (this._interval) { 46038 return; 46039 } 46040 46041 this._visible = this._core.isVisible(); 46042 this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval); 46043 }; 46044 46045 /** 46046 * Refreshes the element. 46047 */ 46048 AutoRefresh.prototype.refresh = function() { 46049 if (this._core.isVisible() === this._visible) { 46050 return; 46051 } 46052 46053 this._visible = !this._visible; 46054 46055 this._core.$element.toggleClass('owl-hidden', !this._visible); 46056 46057 this._visible && (this._core.invalidate('width') && this._core.refresh()); 46058 }; 46059 46060 /** 46061 * Destroys the plugin. 46062 */ 46063 AutoRefresh.prototype.destroy = function() { 46064 var handler, property; 46065 46066 window.clearInterval(this._interval); 46067 46068 for (handler in this._handlers) { 46069 this._core.$element.off(handler, this._handlers[handler]); 46070 } 46071 for (property in Object.getOwnPropertyNames(this)) { 46072 typeof this[property] != 'function' && (this[property] = null); 46073 } 46074 }; 46075 46076 $.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh; 46077 46078 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 46079 46080 /** 46081 * Lazy Plugin 46082 * @version 2.3.4 46083 * @author Bartosz Wojciechowski 46084 * @author David Deutsch 46085 * @license The MIT License (MIT) 46086 */ 46087 ;(function($, window, document, undefined) { 46088 46089 /** 46090 * Creates the lazy plugin. 46091 * @class The Lazy Plugin 46092 * @param {Owl} carousel - The Owl Carousel 46093 */ 46094 var Lazy = function(carousel) { 46095 46096 /** 46097 * Reference to the core. 46098 * @protected 46099 * @type {Owl} 46100 */ 46101 this._core = carousel; 46102 46103 /** 46104 * Already loaded items. 46105 * @protected 46106 * @type {Array.<jQuery>} 46107 */ 46108 this._loaded = []; 46109 46110 /** 46111 * Event handlers. 46112 * @protected 46113 * @type {Object} 46114 */ 46115 this._handlers = { 46116 'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) { 46117 if (!e.namespace) { 46118 return; 46119 } 46120 46121 if (!this._core.settings || !this._core.settings.lazyLoad) { 46122 return; 46123 } 46124 46125 if ((e.property && e.property.name == 'position') || e.type == 'initialized') { 46126 var settings = this._core.settings, 46127 n = (settings.center && Math.ceil(settings.items / 2) || settings.items), 46128 i = ((settings.center && n * -1) || 0), 46129 position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i, 46130 clones = this._core.clones().length, 46131 load = $.proxy(function(i, v) { this.load(v) }, this); 46132 //TODO: Need documentation for this new option 46133 if (settings.lazyLoadEager > 0) { 46134 n += settings.lazyLoadEager; 46135 // If the carousel is looping also preload images that are to the "left" 46136 if (settings.loop) { 46137 position -= settings.lazyLoadEager; 46138 n++; 46139 } 46140 } 46141 46142 while (i++ < n) { 46143 this.load(clones / 2 + this._core.relative(position)); 46144 clones && $.each(this._core.clones(this._core.relative(position)), load); 46145 position++; 46146 } 46147 } 46148 }, this) 46149 }; 46150 46151 // set the default options 46152 this._core.options = $.extend({}, Lazy.Defaults, this._core.options); 46153 46154 // register event handler 46155 this._core.$element.on(this._handlers); 46156 }; 46157 46158 /** 46159 * Default options. 46160 * @public 46161 */ 46162 Lazy.Defaults = { 46163 lazyLoad: false, 46164 lazyLoadEager: 0 46165 }; 46166 46167 /** 46168 * Loads all resources of an item at the specified position. 46169 * @param {Number} position - The absolute position of the item. 46170 * @protected 46171 */ 46172 Lazy.prototype.load = function(position) { 46173 var $item = this._core.$stage.children().eq(position), 46174 $elements = $item && $item.find('.owl-lazy'); 46175 46176 if (!$elements || $.inArray($item.get(0), this._loaded) > -1) { 46177 return; 46178 } 46179 46180 $elements.each($.proxy(function(index, element) { 46181 var $element = $(element), image, 46182 url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src') || $element.attr('data-srcset'); 46183 46184 this._core.trigger('load', { element: $element, url: url }, 'lazy'); 46185 46186 if ($element.is('img')) { 46187 $element.one('load.owl.lazy', $.proxy(function() { 46188 $element.css('opacity', 1); 46189 this._core.trigger('loaded', { element: $element, url: url }, 'lazy'); 46190 }, this)).attr('src', url); 46191 } else if ($element.is('source')) { 46192 $element.one('load.owl.lazy', $.proxy(function() { 46193 this._core.trigger('loaded', { element: $element, url: url }, 'lazy'); 46194 }, this)).attr('srcset', url); 46195 } else { 46196 image = new Image(); 46197 image.onload = $.proxy(function() { 46198 $element.css({ 46199 'background-image': 'url("' + url + '")', 46200 'opacity': '1' 46201 }); 46202 this._core.trigger('loaded', { element: $element, url: url }, 'lazy'); 46203 }, this); 46204 image.src = url; 46205 } 46206 }, this)); 46207 46208 this._loaded.push($item.get(0)); 46209 }; 46210 46211 /** 46212 * Destroys the plugin. 46213 * @public 46214 */ 46215 Lazy.prototype.destroy = function() { 46216 var handler, property; 46217 46218 for (handler in this.handlers) { 46219 this._core.$element.off(handler, this.handlers[handler]); 46220 } 46221 for (property in Object.getOwnPropertyNames(this)) { 46222 typeof this[property] != 'function' && (this[property] = null); 46223 } 46224 }; 46225 46226 $.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy; 46227 46228 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 46229 46230 /** 46231 * AutoHeight Plugin 46232 * @version 2.3.4 46233 * @author Bartosz Wojciechowski 46234 * @author David Deutsch 46235 * @license The MIT License (MIT) 46236 */ 46237 ;(function($, window, document, undefined) { 46238 46239 /** 46240 * Creates the auto height plugin. 46241 * @class The Auto Height Plugin 46242 * @param {Owl} carousel - The Owl Carousel 46243 */ 46244 var AutoHeight = function(carousel) { 46245 /** 46246 * Reference to the core. 46247 * @protected 46248 * @type {Owl} 46249 */ 46250 this._core = carousel; 46251 46252 this._previousHeight = null; 46253 46254 /** 46255 * All event handlers. 46256 * @protected 46257 * @type {Object} 46258 */ 46259 this._handlers = { 46260 'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) { 46261 if (e.namespace && this._core.settings.autoHeight) { 46262 this.update(); 46263 } 46264 }, this), 46265 'changed.owl.carousel': $.proxy(function(e) { 46266 if (e.namespace && this._core.settings.autoHeight && e.property.name === 'position'){ 46267 this.update(); 46268 } 46269 }, this), 46270 'loaded.owl.lazy': $.proxy(function(e) { 46271 if (e.namespace && this._core.settings.autoHeight 46272 && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) { 46273 this.update(); 46274 } 46275 }, this) 46276 }; 46277 46278 // set default options 46279 this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options); 46280 46281 // register event handlers 46282 this._core.$element.on(this._handlers); 46283 this._intervalId = null; 46284 var refThis = this; 46285 46286 // These changes have been taken from a PR by gavrochelegnou proposed in #1575 46287 // and have been made compatible with the latest jQuery version 46288 $(window).on('load', function() { 46289 if (refThis._core.settings.autoHeight) { 46290 refThis.update(); 46291 } 46292 }); 46293 46294 // Autoresize the height of the carousel when window is resized 46295 // When carousel has images, the height is dependent on the width 46296 // and should also change on resize 46297 $(window).resize(function() { 46298 if (refThis._core.settings.autoHeight) { 46299 if (refThis._intervalId != null) { 46300 clearTimeout(refThis._intervalId); 46301 } 46302 46303 refThis._intervalId = setTimeout(function() { 46304 refThis.update(); 46305 }, 250); 46306 } 46307 }); 46308 46309 }; 46310 46311 /** 46312 * Default options. 46313 * @public 46314 */ 46315 AutoHeight.Defaults = { 46316 autoHeight: false, 46317 autoHeightClass: 'owl-height' 46318 }; 46319 46320 /** 46321 * Updates the view. 46322 */ 46323 AutoHeight.prototype.update = function() { 46324 var start = this._core._current, 46325 end = start + this._core.settings.items, 46326 lazyLoadEnabled = this._core.settings.lazyLoad, 46327 visible = this._core.$stage.children().toArray().slice(start, end), 46328 heights = [], 46329 maxheight = 0; 46330 46331 $.each(visible, function(index, item) { 46332 heights.push($(item).height()); 46333 }); 46334 46335 maxheight = Math.max.apply(null, heights); 46336 46337 if (maxheight <= 1 && lazyLoadEnabled && this._previousHeight) { 46338 maxheight = this._previousHeight; 46339 } 46340 46341 this._previousHeight = maxheight; 46342 46343 this._core.$stage.parent() 46344 .height(maxheight) 46345 .addClass(this._core.settings.autoHeightClass); 46346 }; 46347 46348 AutoHeight.prototype.destroy = function() { 46349 var handler, property; 46350 46351 for (handler in this._handlers) { 46352 this._core.$element.off(handler, this._handlers[handler]); 46353 } 46354 for (property in Object.getOwnPropertyNames(this)) { 46355 typeof this[property] !== 'function' && (this[property] = null); 46356 } 46357 }; 46358 46359 $.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight; 46360 46361 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 46362 46363 /** 46364 * Video Plugin 46365 * @version 2.3.4 46366 * @author Bartosz Wojciechowski 46367 * @author David Deutsch 46368 * @license The MIT License (MIT) 46369 */ 46370 ;(function($, window, document, undefined) { 46371 46372 /** 46373 * Creates the video plugin. 46374 * @class The Video Plugin 46375 * @param {Owl} carousel - The Owl Carousel 46376 */ 46377 var Video = function(carousel) { 46378 /** 46379 * Reference to the core. 46380 * @protected 46381 * @type {Owl} 46382 */ 46383 this._core = carousel; 46384 46385 /** 46386 * Cache all video URLs. 46387 * @protected 46388 * @type {Object} 46389 */ 46390 this._videos = {}; 46391 46392 /** 46393 * Current playing item. 46394 * @protected 46395 * @type {jQuery} 46396 */ 46397 this._playing = null; 46398 46399 /** 46400 * All event handlers. 46401 * @todo The cloned content removale is too late 46402 * @protected 46403 * @type {Object} 46404 */ 46405 this._handlers = { 46406 'initialized.owl.carousel': $.proxy(function(e) { 46407 if (e.namespace) { 46408 this._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] }); 46409 } 46410 }, this), 46411 'resize.owl.carousel': $.proxy(function(e) { 46412 if (e.namespace && this._core.settings.video && this.isInFullScreen()) { 46413 e.preventDefault(); 46414 } 46415 }, this), 46416 'refreshed.owl.carousel': $.proxy(function(e) { 46417 if (e.namespace && this._core.is('resizing')) { 46418 this._core.$stage.find('.cloned .owl-video-frame').remove(); 46419 } 46420 }, this), 46421 'changed.owl.carousel': $.proxy(function(e) { 46422 if (e.namespace && e.property.name === 'position' && this._playing) { 46423 this.stop(); 46424 } 46425 }, this), 46426 'prepared.owl.carousel': $.proxy(function(e) { 46427 if (!e.namespace) { 46428 return; 46429 } 46430 46431 var $element = $(e.content).find('.owl-video'); 46432 46433 if ($element.length) { 46434 $element.css('display', 'none'); 46435 this.fetch($element, $(e.content)); 46436 } 46437 }, this) 46438 }; 46439 46440 // set default options 46441 this._core.options = $.extend({}, Video.Defaults, this._core.options); 46442 46443 // register event handlers 46444 this._core.$element.on(this._handlers); 46445 46446 this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) { 46447 this.play(e); 46448 }, this)); 46449 }; 46450 46451 /** 46452 * Default options. 46453 * @public 46454 */ 46455 Video.Defaults = { 46456 video: false, 46457 videoHeight: false, 46458 videoWidth: false 46459 }; 46460 46461 /** 46462 * Gets the video ID and the type (YouTube/Vimeo/vzaar only). 46463 * @protected 46464 * @param {jQuery} target - The target containing the video data. 46465 * @param {jQuery} item - The item containing the video. 46466 */ 46467 Video.prototype.fetch = function(target, item) { 46468 var type = (function() { 46469 if (target.attr('data-vimeo-id')) { 46470 return 'vimeo'; 46471 } else if (target.attr('data-vzaar-id')) { 46472 return 'vzaar' 46473 } else { 46474 return 'youtube'; 46475 } 46476 })(), 46477 id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'), 46478 width = target.attr('data-width') || this._core.settings.videoWidth, 46479 height = target.attr('data-height') || this._core.settings.videoHeight, 46480 url = target.attr('href'); 46481 46482 if (url) { 46483 46484 /* 46485 Parses the id's out of the following urls (and probably more): 46486 https://www.youtube.com/watch?v=:id 46487 https://youtu.be/:id 46488 https://vimeo.com/:id 46489 https://vimeo.com/channels/:channel/:id 46490 https://vimeo.com/groups/:group/videos/:id 46491 https://app.vzaar.com/videos/:id 46492 46493 Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F 46494 */ 46495 46496 id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com|be\-nocookie\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/); 46497 46498 if (id[3].indexOf('youtu') > -1) { 46499 type = 'youtube'; 46500 } else if (id[3].indexOf('vimeo') > -1) { 46501 type = 'vimeo'; 46502 } else if (id[3].indexOf('vzaar') > -1) { 46503 type = 'vzaar'; 46504 } else { 46505 throw new Error('Video URL not supported.'); 46506 } 46507 id = id[6]; 46508 } else { 46509 throw new Error('Missing video URL.'); 46510 } 46511 46512 this._videos[url] = { 46513 type: type, 46514 id: id, 46515 width: width, 46516 height: height 46517 }; 46518 46519 item.attr('data-video', url); 46520 46521 this.thumbnail(target, this._videos[url]); 46522 }; 46523 46524 /** 46525 * Creates video thumbnail. 46526 * @protected 46527 * @param {jQuery} target - The target containing the video data. 46528 * @param {Object} info - The video info object. 46529 * @see `fetch` 46530 */ 46531 Video.prototype.thumbnail = function(target, video) { 46532 var tnLink, 46533 icon, 46534 path, 46535 dimensions = video.width && video.height ? 'width:' + video.width + 'px;height:' + video.height + 'px;' : '', 46536 customTn = target.find('img'), 46537 srcType = 'src', 46538 lazyClass = '', 46539 settings = this._core.settings, 46540 create = function(path) { 46541 icon = '<div class="owl-video-play-icon"></div>'; 46542 46543 if (settings.lazyLoad) { 46544 tnLink = $('<div/>',{ 46545 "class": 'owl-video-tn ' + lazyClass, 46546 "srcType": path 46547 }); 46548 } else { 46549 tnLink = $( '<div/>', { 46550 "class": "owl-video-tn", 46551 "style": 'opacity:1;background-image:url(' + path + ')' 46552 }); 46553 } 46554 target.after(tnLink); 46555 target.after(icon); 46556 }; 46557 46558 // wrap video content into owl-video-wrapper div 46559 target.wrap( $( '<div/>', { 46560 "class": "owl-video-wrapper", 46561 "style": dimensions 46562 })); 46563 46564 if (this._core.settings.lazyLoad) { 46565 srcType = 'data-src'; 46566 lazyClass = 'owl-lazy'; 46567 } 46568 46569 // custom thumbnail 46570 if (customTn.length) { 46571 create(customTn.attr(srcType)); 46572 customTn.remove(); 46573 return false; 46574 } 46575 46576 if (video.type === 'youtube') { 46577 path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg"; 46578 create(path); 46579 } else if (video.type === 'vimeo') { 46580 $.ajax({ 46581 type: 'GET', 46582 url: '//vimeo.com/api/v2/video/' + video.id + '.json', 46583 jsonp: 'callback', 46584 dataType: 'jsonp', 46585 success: function(data) { 46586 path = data[0].thumbnail_large; 46587 create(path); 46588 } 46589 }); 46590 } else if (video.type === 'vzaar') { 46591 $.ajax({ 46592 type: 'GET', 46593 url: '//vzaar.com/api/videos/' + video.id + '.json', 46594 jsonp: 'callback', 46595 dataType: 'jsonp', 46596 success: function(data) { 46597 path = data.framegrab_url; 46598 create(path); 46599 } 46600 }); 46601 } 46602 }; 46603 46604 /** 46605 * Stops the current video. 46606 * @public 46607 */ 46608 Video.prototype.stop = function() { 46609 this._core.trigger('stop', null, 'video'); 46610 this._playing.find('.owl-video-frame').remove(); 46611 this._playing.removeClass('owl-video-playing'); 46612 this._playing = null; 46613 this._core.leave('playing'); 46614 this._core.trigger('stopped', null, 'video'); 46615 }; 46616 46617 /** 46618 * Starts the current video. 46619 * @public 46620 * @param {Event} event - The event arguments. 46621 */ 46622 Video.prototype.play = function(event) { 46623 var target = $(event.target), 46624 item = target.closest('.' + this._core.settings.itemClass), 46625 video = this._videos[item.attr('data-video')], 46626 width = video.width || '100%', 46627 height = video.height || this._core.$stage.height(), 46628 html, 46629 iframe; 46630 46631 if (this._playing) { 46632 return; 46633 } 46634 46635 this._core.enter('playing'); 46636 this._core.trigger('play', null, 'video'); 46637 46638 item = this._core.items(this._core.relative(item.index())); 46639 46640 this._core.reset(item.index()); 46641 46642 html = $( '<iframe frameborder="0" allowfullscreen mozallowfullscreen webkitAllowFullScreen ></iframe>' ); 46643 html.attr( 'height', height ); 46644 html.attr( 'width', width ); 46645 if (video.type === 'youtube') { 46646 html.attr( 'src', '//www.youtube.com/embed/' + video.id + '?autoplay=1&rel=0&v=' + video.id ); 46647 } else if (video.type === 'vimeo') { 46648 html.attr( 'src', '//player.vimeo.com/video/' + video.id + '?autoplay=1' ); 46649 } else if (video.type === 'vzaar') { 46650 html.attr( 'src', '//view.vzaar.com/' + video.id + '/player?autoplay=true' ); 46651 } 46652 46653 iframe = $(html).wrap( '<div class="owl-video-frame" />' ).insertAfter(item.find('.owl-video')); 46654 46655 this._playing = item.addClass('owl-video-playing'); 46656 }; 46657 46658 /** 46659 * Checks whether an video is currently in full screen mode or not. 46660 * @todo Bad style because looks like a readonly method but changes members. 46661 * @protected 46662 * @returns {Boolean} 46663 */ 46664 Video.prototype.isInFullScreen = function() { 46665 var element = document.fullscreenElement || document.mozFullScreenElement || 46666 document.webkitFullscreenElement; 46667 46668 return element && $(element).parent().hasClass('owl-video-frame'); 46669 }; 46670 46671 /** 46672 * Destroys the plugin. 46673 */ 46674 Video.prototype.destroy = function() { 46675 var handler, property; 46676 46677 this._core.$element.off('click.owl.video'); 46678 46679 for (handler in this._handlers) { 46680 this._core.$element.off(handler, this._handlers[handler]); 46681 } 46682 for (property in Object.getOwnPropertyNames(this)) { 46683 typeof this[property] != 'function' && (this[property] = null); 46684 } 46685 }; 46686 46687 $.fn.owlCarousel.Constructor.Plugins.Video = Video; 46688 46689 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 46690 46691 /** 46692 * Animate Plugin 46693 * @version 2.3.4 46694 * @author Bartosz Wojciechowski 46695 * @author David Deutsch 46696 * @license The MIT License (MIT) 46697 */ 46698 ;(function($, window, document, undefined) { 46699 46700 /** 46701 * Creates the animate plugin. 46702 * @class The Navigation Plugin 46703 * @param {Owl} scope - The Owl Carousel 46704 */ 46705 var Animate = function(scope) { 46706 this.core = scope; 46707 this.core.options = $.extend({}, Animate.Defaults, this.core.options); 46708 this.swapping = true; 46709 this.previous = undefined; 46710 this.next = undefined; 46711 46712 this.handlers = { 46713 'change.owl.carousel': $.proxy(function(e) { 46714 if (e.namespace && e.property.name == 'position') { 46715 this.previous = this.core.current(); 46716 this.next = e.property.value; 46717 } 46718 }, this), 46719 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) { 46720 if (e.namespace) { 46721 this.swapping = e.type == 'translated'; 46722 } 46723 }, this), 46724 'translate.owl.carousel': $.proxy(function(e) { 46725 if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) { 46726 this.swap(); 46727 } 46728 }, this) 46729 }; 46730 46731 this.core.$element.on(this.handlers); 46732 }; 46733 46734 /** 46735 * Default options. 46736 * @public 46737 */ 46738 Animate.Defaults = { 46739 animateOut: false, 46740 animateIn: false 46741 }; 46742 46743 /** 46744 * Toggles the animation classes whenever an translations starts. 46745 * @protected 46746 * @returns {Boolean|undefined} 46747 */ 46748 Animate.prototype.swap = function() { 46749 46750 if (this.core.settings.items !== 1) { 46751 return; 46752 } 46753 46754 if (!$.support.animation || !$.support.transition) { 46755 return; 46756 } 46757 46758 this.core.speed(0); 46759 46760 var left, 46761 clear = $.proxy(this.clear, this), 46762 previous = this.core.$stage.children().eq(this.previous), 46763 next = this.core.$stage.children().eq(this.next), 46764 incoming = this.core.settings.animateIn, 46765 outgoing = this.core.settings.animateOut; 46766 46767 if (this.core.current() === this.previous) { 46768 return; 46769 } 46770 46771 if (outgoing) { 46772 left = this.core.coordinates(this.previous) - this.core.coordinates(this.next); 46773 previous.one($.support.animation.end, clear) 46774 .css( { 'left': left + 'px' } ) 46775 .addClass('animated owl-animated-out') 46776 .addClass(outgoing); 46777 } 46778 46779 if (incoming) { 46780 next.one($.support.animation.end, clear) 46781 .addClass('animated owl-animated-in') 46782 .addClass(incoming); 46783 } 46784 }; 46785 46786 Animate.prototype.clear = function(e) { 46787 $(e.target).css( { 'left': '' } ) 46788 .removeClass('animated owl-animated-out owl-animated-in') 46789 .removeClass(this.core.settings.animateIn) 46790 .removeClass(this.core.settings.animateOut); 46791 this.core.onTransitionEnd(); 46792 }; 46793 46794 /** 46795 * Destroys the plugin. 46796 * @public 46797 */ 46798 Animate.prototype.destroy = function() { 46799 var handler, property; 46800 46801 for (handler in this.handlers) { 46802 this.core.$element.off(handler, this.handlers[handler]); 46803 } 46804 for (property in Object.getOwnPropertyNames(this)) { 46805 typeof this[property] != 'function' && (this[property] = null); 46806 } 46807 }; 46808 46809 $.fn.owlCarousel.Constructor.Plugins.Animate = Animate; 46810 46811 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 46812 46813 /** 46814 * Autoplay Plugin 46815 * @version 2.3.4 46816 * @author Bartosz Wojciechowski 46817 * @author Artus Kolanowski 46818 * @author David Deutsch 46819 * @author Tom De Caluwé 46820 * @license The MIT License (MIT) 46821 */ 46822 ;(function($, window, document, undefined) { 46823 46824 /** 46825 * Creates the autoplay plugin. 46826 * @class The Autoplay Plugin 46827 * @param {Owl} scope - The Owl Carousel 46828 */ 46829 var Autoplay = function(carousel) { 46830 /** 46831 * Reference to the core. 46832 * @protected 46833 * @type {Owl} 46834 */ 46835 this._core = carousel; 46836 46837 /** 46838 * The autoplay timeout id. 46839 * @type {Number} 46840 */ 46841 this._call = null; 46842 46843 /** 46844 * Depending on the state of the plugin, this variable contains either 46845 * the start time of the timer or the current timer value if it's 46846 * paused. Since we start in a paused state we initialize the timer 46847 * value. 46848 * @type {Number} 46849 */ 46850 this._time = 0; 46851 46852 /** 46853 * Stores the timeout currently used. 46854 * @type {Number} 46855 */ 46856 this._timeout = 0; 46857 46858 /** 46859 * Indicates whenever the autoplay is paused. 46860 * @type {Boolean} 46861 */ 46862 this._paused = true; 46863 46864 /** 46865 * All event handlers. 46866 * @protected 46867 * @type {Object} 46868 */ 46869 this._handlers = { 46870 'changed.owl.carousel': $.proxy(function(e) { 46871 if (e.namespace && e.property.name === 'settings') { 46872 if (this._core.settings.autoplay) { 46873 this.play(); 46874 } else { 46875 this.stop(); 46876 } 46877 } else if (e.namespace && e.property.name === 'position' && this._paused) { 46878 // Reset the timer. This code is triggered when the position 46879 // of the carousel was changed through user interaction. 46880 this._time = 0; 46881 } 46882 }, this), 46883 'initialized.owl.carousel': $.proxy(function(e) { 46884 if (e.namespace && this._core.settings.autoplay) { 46885 this.play(); 46886 } 46887 }, this), 46888 'play.owl.autoplay': $.proxy(function(e, t, s) { 46889 if (e.namespace) { 46890 this.play(t, s); 46891 } 46892 }, this), 46893 'stop.owl.autoplay': $.proxy(function(e) { 46894 if (e.namespace) { 46895 this.stop(); 46896 } 46897 }, this), 46898 'mouseover.owl.autoplay': $.proxy(function() { 46899 if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { 46900 this.pause(); 46901 } 46902 }, this), 46903 'mouseleave.owl.autoplay': $.proxy(function() { 46904 if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { 46905 this.play(); 46906 } 46907 }, this), 46908 'touchstart.owl.core': $.proxy(function() { 46909 if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { 46910 this.pause(); 46911 } 46912 }, this), 46913 'touchend.owl.core': $.proxy(function() { 46914 if (this._core.settings.autoplayHoverPause) { 46915 this.play(); 46916 } 46917 }, this) 46918 }; 46919 46920 // register event handlers 46921 this._core.$element.on(this._handlers); 46922 46923 // set default options 46924 this._core.options = $.extend({}, Autoplay.Defaults, this._core.options); 46925 }; 46926 46927 /** 46928 * Default options. 46929 * @public 46930 */ 46931 Autoplay.Defaults = { 46932 autoplay: false, 46933 autoplayTimeout: 5000, 46934 autoplayHoverPause: false, 46935 autoplaySpeed: false 46936 }; 46937 46938 /** 46939 * Transition to the next slide and set a timeout for the next transition. 46940 * @private 46941 * @param {Number} [speed] - The animation speed for the animations. 46942 */ 46943 Autoplay.prototype._next = function(speed) { 46944 this._call = window.setTimeout( 46945 $.proxy(this._next, this, speed), 46946 this._timeout * (Math.round(this.read() / this._timeout) + 1) - this.read() 46947 ); 46948 46949 if (this._core.is('interacting') || document.hidden) { 46950 return; 46951 } 46952 this._core.next(speed || this._core.settings.autoplaySpeed); 46953 } 46954 46955 /** 46956 * Reads the current timer value when the timer is playing. 46957 * @public 46958 */ 46959 Autoplay.prototype.read = function() { 46960 return new Date().getTime() - this._time; 46961 }; 46962 46963 /** 46964 * Starts the autoplay. 46965 * @public 46966 * @param {Number} [timeout] - The interval before the next animation starts. 46967 * @param {Number} [speed] - The animation speed for the animations. 46968 */ 46969 Autoplay.prototype.play = function(timeout, speed) { 46970 var elapsed; 46971 46972 if (!this._core.is('rotating')) { 46973 this._core.enter('rotating'); 46974 } 46975 46976 timeout = timeout || this._core.settings.autoplayTimeout; 46977 46978 // Calculate the elapsed time since the last transition. If the carousel 46979 // wasn't playing this calculation will yield zero. 46980 elapsed = Math.min(this._time % (this._timeout || timeout), timeout); 46981 46982 if (this._paused) { 46983 // Start the clock. 46984 this._time = this.read(); 46985 this._paused = false; 46986 } else { 46987 // Clear the active timeout to allow replacement. 46988 window.clearTimeout(this._call); 46989 } 46990 46991 // Adjust the origin of the timer to match the new timeout value. 46992 this._time += this.read() % timeout - elapsed; 46993 46994 this._timeout = timeout; 46995 this._call = window.setTimeout($.proxy(this._next, this, speed), timeout - elapsed); 46996 }; 46997 46998 /** 46999 * Stops the autoplay. 47000 * @public 47001 */ 47002 Autoplay.prototype.stop = function() { 47003 if (this._core.is('rotating')) { 47004 // Reset the clock. 47005 this._time = 0; 47006 this._paused = true; 47007 47008 window.clearTimeout(this._call); 47009 this._core.leave('rotating'); 47010 } 47011 }; 47012 47013 /** 47014 * Pauses the autoplay. 47015 * @public 47016 */ 47017 Autoplay.prototype.pause = function() { 47018 if (this._core.is('rotating') && !this._paused) { 47019 // Pause the clock. 47020 this._time = this.read(); 47021 this._paused = true; 47022 47023 window.clearTimeout(this._call); 47024 } 47025 }; 47026 47027 /** 47028 * Destroys the plugin. 47029 */ 47030 Autoplay.prototype.destroy = function() { 47031 var handler, property; 47032 47033 this.stop(); 47034 47035 for (handler in this._handlers) { 47036 this._core.$element.off(handler, this._handlers[handler]); 47037 } 47038 for (property in Object.getOwnPropertyNames(this)) { 47039 typeof this[property] != 'function' && (this[property] = null); 47040 } 47041 }; 47042 47043 $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay; 47044 47045 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 47046 47047 /** 47048 * Navigation Plugin 47049 * @version 2.3.4 47050 * @author Artus Kolanowski 47051 * @author David Deutsch 47052 * @license The MIT License (MIT) 47053 */ 47054 ;(function($, window, document, undefined) { 47055 'use strict'; 47056 47057 /** 47058 * Creates the navigation plugin. 47059 * @class The Navigation Plugin 47060 * @param {Owl} carousel - The Owl Carousel. 47061 */ 47062 var Navigation = function(carousel) { 47063 /** 47064 * Reference to the core. 47065 * @protected 47066 * @type {Owl} 47067 */ 47068 this._core = carousel; 47069 47070 /** 47071 * Indicates whether the plugin is initialized or not. 47072 * @protected 47073 * @type {Boolean} 47074 */ 47075 this._initialized = false; 47076 47077 /** 47078 * The current paging indexes. 47079 * @protected 47080 * @type {Array} 47081 */ 47082 this._pages = []; 47083 47084 /** 47085 * All DOM elements of the user interface. 47086 * @protected 47087 * @type {Object} 47088 */ 47089 this._controls = {}; 47090 47091 /** 47092 * Markup for an indicator. 47093 * @protected 47094 * @type {Array.<String>} 47095 */ 47096 this._templates = []; 47097 47098 /** 47099 * The carousel element. 47100 * @type {jQuery} 47101 */ 47102 this.$element = this._core.$element; 47103 47104 /** 47105 * Overridden methods of the carousel. 47106 * @protected 47107 * @type {Object} 47108 */ 47109 this._overrides = { 47110 next: this._core.next, 47111 prev: this._core.prev, 47112 to: this._core.to 47113 }; 47114 47115 /** 47116 * All event handlers. 47117 * @protected 47118 * @type {Object} 47119 */ 47120 this._handlers = { 47121 'prepared.owl.carousel': $.proxy(function(e) { 47122 if (e.namespace && this._core.settings.dotsData) { 47123 this._templates.push('<div class="' + this._core.settings.dotClass + '">' + 47124 $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>'); 47125 } 47126 }, this), 47127 'added.owl.carousel': $.proxy(function(e) { 47128 if (e.namespace && this._core.settings.dotsData) { 47129 this._templates.splice(e.position, 0, this._templates.pop()); 47130 } 47131 }, this), 47132 'remove.owl.carousel': $.proxy(function(e) { 47133 if (e.namespace && this._core.settings.dotsData) { 47134 this._templates.splice(e.position, 1); 47135 } 47136 }, this), 47137 'changed.owl.carousel': $.proxy(function(e) { 47138 if (e.namespace && e.property.name == 'position') { 47139 this.draw(); 47140 } 47141 }, this), 47142 'initialized.owl.carousel': $.proxy(function(e) { 47143 if (e.namespace && !this._initialized) { 47144 this._core.trigger('initialize', null, 'navigation'); 47145 this.initialize(); 47146 this.update(); 47147 this.draw(); 47148 this._initialized = true; 47149 this._core.trigger('initialized', null, 'navigation'); 47150 } 47151 }, this), 47152 'refreshed.owl.carousel': $.proxy(function(e) { 47153 if (e.namespace && this._initialized) { 47154 this._core.trigger('refresh', null, 'navigation'); 47155 this.update(); 47156 this.draw(); 47157 this._core.trigger('refreshed', null, 'navigation'); 47158 } 47159 }, this) 47160 }; 47161 47162 // set default options 47163 this._core.options = $.extend({}, Navigation.Defaults, this._core.options); 47164 47165 // register event handlers 47166 this.$element.on(this._handlers); 47167 }; 47168 47169 /** 47170 * Default options. 47171 * @public 47172 * @todo Rename `slideBy` to `navBy` 47173 */ 47174 Navigation.Defaults = { 47175 nav: false, 47176 navText: [ 47177 '<span aria-label="' + 'Previous' + '">‹</span>', 47178 '<span aria-label="' + 'Next' + '">›</span>' 47179 ], 47180 navSpeed: false, 47181 navElement: 'button type="button" role="presentation"', 47182 navContainer: false, 47183 navContainerClass: 'owl-nav', 47184 navClass: [ 47185 'owl-prev', 47186 'owl-next' 47187 ], 47188 slideBy: 1, 47189 dotClass: 'owl-dot', 47190 dotsClass: 'owl-dots', 47191 dots: true, 47192 dotsEach: false, 47193 dotsData: false, 47194 dotsSpeed: false, 47195 dotsContainer: false 47196 }; 47197 47198 /** 47199 * Initializes the layout of the plugin and extends the carousel. 47200 * @protected 47201 */ 47202 Navigation.prototype.initialize = function() { 47203 var override, 47204 settings = this._core.settings; 47205 47206 // create DOM structure for relative navigation 47207 this._controls.$relative = (settings.navContainer ? $(settings.navContainer) 47208 : $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled'); 47209 47210 this._controls.$previous = $('<' + settings.navElement + '>') 47211 .addClass(settings.navClass[0]) 47212 .html(settings.navText[0]) 47213 .prependTo(this._controls.$relative) 47214 .on('click', $.proxy(function(e) { 47215 this.prev(settings.navSpeed); 47216 }, this)); 47217 this._controls.$next = $('<' + settings.navElement + '>') 47218 .addClass(settings.navClass[1]) 47219 .html(settings.navText[1]) 47220 .appendTo(this._controls.$relative) 47221 .on('click', $.proxy(function(e) { 47222 this.next(settings.navSpeed); 47223 }, this)); 47224 47225 // create DOM structure for absolute navigation 47226 if (!settings.dotsData) { 47227 this._templates = [ $('<button role="button">') 47228 .addClass(settings.dotClass) 47229 .append($('<span>')) 47230 .prop('outerHTML') ]; 47231 } 47232 47233 this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer) 47234 : $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled'); 47235 47236 this._controls.$absolute.on('click', 'button', $.proxy(function(e) { 47237 var index = $(e.target).parent().is(this._controls.$absolute) 47238 ? $(e.target).index() : $(e.target).parent().index(); 47239 47240 e.preventDefault(); 47241 47242 this.to(index, settings.dotsSpeed); 47243 }, this)); 47244 47245 /*$el.on('focusin', function() { 47246 $(document).off(".carousel"); 47247 47248 $(document).on('keydown.carousel', function(e) { 47249 if(e.keyCode == 37) { 47250 $el.trigger('prev.owl') 47251 } 47252 if(e.keyCode == 39) { 47253 $el.trigger('next.owl') 47254 } 47255 }); 47256 });*/ 47257 47258 // override public methods of the carousel 47259 for (override in this._overrides) { 47260 this._core[override] = $.proxy(this[override], this); 47261 } 47262 }; 47263 47264 /** 47265 * Destroys the plugin. 47266 * @protected 47267 */ 47268 Navigation.prototype.destroy = function() { 47269 var handler, control, property, override, settings; 47270 settings = this._core.settings; 47271 47272 for (handler in this._handlers) { 47273 this.$element.off(handler, this._handlers[handler]); 47274 } 47275 for (control in this._controls) { 47276 if (control === '$relative' && settings.navContainer) { 47277 this._controls[control].html(''); 47278 } else { 47279 this._controls[control].remove(); 47280 } 47281 } 47282 for (override in this.overides) { 47283 this._core[override] = this._overrides[override]; 47284 } 47285 for (property in Object.getOwnPropertyNames(this)) { 47286 typeof this[property] != 'function' && (this[property] = null); 47287 } 47288 }; 47289 47290 /** 47291 * Updates the internal state. 47292 * @protected 47293 */ 47294 Navigation.prototype.update = function() { 47295 var i, j, k, 47296 lower = this._core.clones().length / 2, 47297 upper = lower + this._core.items().length, 47298 maximum = this._core.maximum(true), 47299 settings = this._core.settings, 47300 size = settings.center || settings.autoWidth || settings.dotsData 47301 ? 1 : settings.dotsEach || settings.items; 47302 47303 if (settings.slideBy !== 'page') { 47304 settings.slideBy = Math.min(settings.slideBy, settings.items); 47305 } 47306 47307 if (settings.dots || settings.slideBy == 'page') { 47308 this._pages = []; 47309 47310 for (i = lower, j = 0, k = 0; i < upper; i++) { 47311 if (j >= size || j === 0) { 47312 this._pages.push({ 47313 start: Math.min(maximum, i - lower), 47314 end: i - lower + size - 1 47315 }); 47316 if (Math.min(maximum, i - lower) === maximum) { 47317 break; 47318 } 47319 j = 0, ++k; 47320 } 47321 j += this._core.mergers(this._core.relative(i)); 47322 } 47323 } 47324 }; 47325 47326 /** 47327 * Draws the user interface. 47328 * @todo The option `dotsData` wont work. 47329 * @protected 47330 */ 47331 Navigation.prototype.draw = function() { 47332 var difference, 47333 settings = this._core.settings, 47334 disabled = this._core.items().length <= settings.items, 47335 index = this._core.relative(this._core.current()), 47336 loop = settings.loop || settings.rewind; 47337 47338 this._controls.$relative.toggleClass('disabled', !settings.nav || disabled); 47339 47340 if (settings.nav) { 47341 this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true)); 47342 this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true)); 47343 } 47344 47345 this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled); 47346 47347 if (settings.dots) { 47348 difference = this._pages.length - this._controls.$absolute.children().length; 47349 47350 if (settings.dotsData && difference !== 0) { 47351 this._controls.$absolute.html(this._templates.join('')); 47352 } else if (difference > 0) { 47353 this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0])); 47354 } else if (difference < 0) { 47355 this._controls.$absolute.children().slice(difference).remove(); 47356 } 47357 47358 this._controls.$absolute.find('.active').removeClass('active'); 47359 this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active'); 47360 } 47361 }; 47362 47363 /** 47364 * Extends event data. 47365 * @protected 47366 * @param {Event} event - The event object which gets thrown. 47367 */ 47368 Navigation.prototype.onTrigger = function(event) { 47369 var settings = this._core.settings; 47370 47371 event.page = { 47372 index: $.inArray(this.current(), this._pages), 47373 count: this._pages.length, 47374 size: settings && (settings.center || settings.autoWidth || settings.dotsData 47375 ? 1 : settings.dotsEach || settings.items) 47376 }; 47377 }; 47378 47379 /** 47380 * Gets the current page position of the carousel. 47381 * @protected 47382 * @returns {Number} 47383 */ 47384 Navigation.prototype.current = function() { 47385 var current = this._core.relative(this._core.current()); 47386 return $.grep(this._pages, $.proxy(function(page, index) { 47387 return page.start <= current && page.end >= current; 47388 }, this)).pop(); 47389 }; 47390 47391 /** 47392 * Gets the current succesor/predecessor position. 47393 * @protected 47394 * @returns {Number} 47395 */ 47396 Navigation.prototype.getPosition = function(successor) { 47397 var position, length, 47398 settings = this._core.settings; 47399 47400 if (settings.slideBy == 'page') { 47401 position = $.inArray(this.current(), this._pages); 47402 length = this._pages.length; 47403 successor ? ++position : --position; 47404 position = this._pages[((position % length) + length) % length].start; 47405 } else { 47406 position = this._core.relative(this._core.current()); 47407 length = this._core.items().length; 47408 successor ? position += settings.slideBy : position -= settings.slideBy; 47409 } 47410 47411 return position; 47412 }; 47413 47414 /** 47415 * Slides to the next item or page. 47416 * @public 47417 * @param {Number} [speed=false] - The time in milliseconds for the transition. 47418 */ 47419 Navigation.prototype.next = function(speed) { 47420 $.proxy(this._overrides.to, this._core)(this.getPosition(true), speed); 47421 }; 47422 47423 /** 47424 * Slides to the previous item or page. 47425 * @public 47426 * @param {Number} [speed=false] - The time in milliseconds for the transition. 47427 */ 47428 Navigation.prototype.prev = function(speed) { 47429 $.proxy(this._overrides.to, this._core)(this.getPosition(false), speed); 47430 }; 47431 47432 /** 47433 * Slides to the specified item or page. 47434 * @public 47435 * @param {Number} position - The position of the item or page. 47436 * @param {Number} [speed] - The time in milliseconds for the transition. 47437 * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not. 47438 */ 47439 Navigation.prototype.to = function(position, speed, standard) { 47440 var length; 47441 47442 if (!standard && this._pages.length) { 47443 length = this._pages.length; 47444 $.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed); 47445 } else { 47446 $.proxy(this._overrides.to, this._core)(position, speed); 47447 } 47448 }; 47449 47450 $.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation; 47451 47452 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 47453 47454 /** 47455 * Hash Plugin 47456 * @version 2.3.4 47457 * @author Artus Kolanowski 47458 * @author David Deutsch 47459 * @license The MIT License (MIT) 47460 */ 47461 ;(function($, window, document, undefined) { 47462 'use strict'; 47463 47464 /** 47465 * Creates the hash plugin. 47466 * @class The Hash Plugin 47467 * @param {Owl} carousel - The Owl Carousel 47468 */ 47469 var Hash = function(carousel) { 47470 /** 47471 * Reference to the core. 47472 * @protected 47473 * @type {Owl} 47474 */ 47475 this._core = carousel; 47476 47477 /** 47478 * Hash index for the items. 47479 * @protected 47480 * @type {Object} 47481 */ 47482 this._hashes = {}; 47483 47484 /** 47485 * The carousel element. 47486 * @type {jQuery} 47487 */ 47488 this.$element = this._core.$element; 47489 47490 /** 47491 * All event handlers. 47492 * @protected 47493 * @type {Object} 47494 */ 47495 this._handlers = { 47496 'initialized.owl.carousel': $.proxy(function(e) { 47497 if (e.namespace && this._core.settings.startPosition === 'URLHash') { 47498 $(window).trigger('hashchange.owl.navigation'); 47499 } 47500 }, this), 47501 'prepared.owl.carousel': $.proxy(function(e) { 47502 if (e.namespace) { 47503 var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash'); 47504 47505 if (!hash) { 47506 return; 47507 } 47508 47509 this._hashes[hash] = e.content; 47510 } 47511 }, this), 47512 'changed.owl.carousel': $.proxy(function(e) { 47513 if (e.namespace && e.property.name === 'position') { 47514 var current = this._core.items(this._core.relative(this._core.current())), 47515 hash = $.map(this._hashes, function(item, hash) { 47516 return item === current ? hash : null; 47517 }).join(); 47518 47519 if (!hash || window.location.hash.slice(1) === hash) { 47520 return; 47521 } 47522 47523 window.location.hash = hash; 47524 } 47525 }, this) 47526 }; 47527 47528 // set default options 47529 this._core.options = $.extend({}, Hash.Defaults, this._core.options); 47530 47531 // register the event handlers 47532 this.$element.on(this._handlers); 47533 47534 // register event listener for hash navigation 47535 $(window).on('hashchange.owl.navigation', $.proxy(function(e) { 47536 var hash = window.location.hash.substring(1), 47537 items = this._core.$stage.children(), 47538 position = this._hashes[hash] && items.index(this._hashes[hash]); 47539 47540 if (position === undefined || position === this._core.current()) { 47541 return; 47542 } 47543 47544 this._core.to(this._core.relative(position), false, true); 47545 }, this)); 47546 }; 47547 47548 /** 47549 * Default options. 47550 * @public 47551 */ 47552 Hash.Defaults = { 47553 URLhashListener: false 47554 }; 47555 47556 /** 47557 * Destroys the plugin. 47558 * @public 47559 */ 47560 Hash.prototype.destroy = function() { 47561 var handler, property; 47562 47563 $(window).off('hashchange.owl.navigation'); 47564 47565 for (handler in this._handlers) { 47566 this._core.$element.off(handler, this._handlers[handler]); 47567 } 47568 for (property in Object.getOwnPropertyNames(this)) { 47569 typeof this[property] != 'function' && (this[property] = null); 47570 } 47571 }; 47572 47573 $.fn.owlCarousel.Constructor.Plugins.Hash = Hash; 47574 47575 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 47576 47577 /** 47578 * Support Plugin 47579 * 47580 * @version 2.3.4 47581 * @author Vivid Planet Software GmbH 47582 * @author Artus Kolanowski 47583 * @author David Deutsch 47584 * @license The MIT License (MIT) 47585 */ 47586 ;(function($, window, document, undefined) { 47587 47588 var style = $('<support>').get(0).style, 47589 prefixes = 'Webkit Moz O ms'.split(' '), 47590 events = { 47591 transition: { 47592 end: { 47593 WebkitTransition: 'webkitTransitionEnd', 47594 MozTransition: 'transitionend', 47595 OTransition: 'oTransitionEnd', 47596 transition: 'transitionend' 47597 } 47598 }, 47599 animation: { 47600 end: { 47601 WebkitAnimation: 'webkitAnimationEnd', 47602 MozAnimation: 'animationend', 47603 OAnimation: 'oAnimationEnd', 47604 animation: 'animationend' 47605 } 47606 } 47607 }, 47608 tests = { 47609 csstransforms: function() { 47610 return !!test('transform'); 47611 }, 47612 csstransforms3d: function() { 47613 return !!test('perspective'); 47614 }, 47615 csstransitions: function() { 47616 return !!test('transition'); 47617 }, 47618 cssanimations: function() { 47619 return !!test('animation'); 47620 } 47621 }; 47622 47623 function test(property, prefixed) { 47624 var result = false, 47625 upper = property.charAt(0).toUpperCase() + property.slice(1); 47626 47627 $.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) { 47628 if (style[property] !== undefined) { 47629 result = prefixed ? property : true; 47630 return false; 47631 } 47632 }); 47633 47634 return result; 47635 } 47636 47637 function prefixed(property) { 47638 return test(property, true); 47639 } 47640 47641 if (tests.csstransitions()) { 47642 /* jshint -W053 */ 47643 $.support.transition = new String(prefixed('transition')) 47644 $.support.transition.end = events.transition.end[ $.support.transition ]; 47645 } 47646 47647 if (tests.cssanimations()) { 47648 /* jshint -W053 */ 47649 $.support.animation = new String(prefixed('animation')) 47650 $.support.animation.end = events.animation.end[ $.support.animation ]; 47651 } 47652 47653 if (tests.csstransforms()) { 47654 /* jshint -W053 */ 47655 $.support.transform = new String(prefixed('transform')); 47656 $.support.transform3d = tests.csstransforms3d(); 47657 } 47658 47659 })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document); 47660 47661 47662 /***/ }), 47663 47664
vendor: 7,597 bytes, lines 47664-47858
47664/***/ "./node_modules/process/browser.js": 47665 /*!*****************************************!*\ 47666 !*** ./node_modules/process/browser.js ***! 47667 \*****************************************/ 47668 /***/ (function(module) { 47669 47670// shim for using process in browser 47671 var process = module.exports = {}; 47672 47673// cached from whatever global is present so that test runners that stub it 47674// don't break things. But we need to wrap it in a try catch in case it is 47675// wrapped in strict mode code which doesn't define any globals. It's inside a 47676// function because try/catches deoptimize in certain engines. 47677 47678 var cachedSetTimeout; 47679 var cachedClearTimeout; 47680 47681 function defaultSetTimout() { 47682 throw new Error('setTimeout has not been defined'); 47683 } 47684 function defaultClearTimeout () { 47685 throw new Error('clearTimeout has not been defined'); 47686 } 47687 (function () { 47688 try { 47689 if (typeof setTimeout === 'function') { 47690 cachedSetTimeout = setTimeout; 47691 } else { 47692 cachedSetTimeout = defaultSetTimout; 47693 } 47694 } catch (e) { 47695 cachedSetTimeout = defaultSetTimout; 47696 } 47697 try { 47698 if (typeof clearTimeout === 'function') { 47699 cachedClearTimeout = clearTimeout; 47700 } else { 47701 cachedClearTimeout = defaultClearTimeout; 47702 } 47703 } catch (e) { 47704 cachedClearTimeout = defaultClearTimeout; 47705 } 47706 } ()) 47707 function runTimeout(fun) { 47708 if (cachedSetTimeout === setTimeout) { 47709 //normal enviroments in sane situations 47710 return setTimeout(fun, 0); 47711 } 47712 // if setTimeout wasn't available but was latter defined 47713 if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { 47714 cachedSetTimeout = setTimeout; 47715 return setTimeout(fun, 0); 47716 } 47717 try { 47718 // when when somebody has screwed with setTimeout but no I.E. maddness 47719 return cachedSetTimeout(fun, 0); 47720 } catch(e){ 47721 try { 47722 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 47723 return cachedSetTimeout.call(null, fun, 0); 47724 } catch(e){ 47725 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error 47726 return cachedSetTimeout.call(this, fun, 0); 47727 } 47728 } 47729 47730 47731 } 47732 function runClearTimeout(marker) { 47733 if (cachedClearTimeout === clearTimeout) { 47734 //normal enviroments in sane situations 47735 return clearTimeout(marker); 47736 } 47737 // if clearTimeout wasn't available but was latter defined 47738 if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { 47739 cachedClearTimeout = clearTimeout; 47740 return clearTimeout(marker); 47741 } 47742 try { 47743 // when when somebody has screwed with setTimeout but no I.E. maddness 47744 return cachedClearTimeout(marker); 47745 } catch (e){ 47746 try { 47747 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 47748 return cachedClearTimeout.call(null, marker); 47749 } catch (e){ 47750 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. 47751 // Some versions of I.E. have different rules for clearTimeout vs setTimeout 47752 return cachedClearTimeout.call(this, marker); 47753 } 47754 } 47755 47756 47757 47758 } 47759 var queue = []; 47760 var draining = false; 47761 var currentQueue; 47762 var queueIndex = -1; 47763 47764 function cleanUpNextTick() { 47765 if (!draining || !currentQueue) { 47766 return; 47767 } 47768 draining = false; 47769 if (currentQueue.length) { 47770 queue = currentQueue.concat(queue); 47771 } else { 47772 queueIndex = -1; 47773 } 47774 if (queue.length) { 47775 drainQueue(); 47776 } 47777 } 47778 47779 function drainQueue() { 47780 if (draining) { 47781 return; 47782 } 47783 var timeout = runTimeout(cleanUpNextTick); 47784 draining = true; 47785 47786 var len = queue.length; 47787 while(len) { 47788 currentQueue = queue; 47789 queue = []; 47790 while (++queueIndex < len) { 47791 if (currentQueue) { 47792 currentQueue[queueIndex].run(); 47793 } 47794 } 47795 queueIndex = -1; 47796 len = queue.length; 47797 } 47798 currentQueue = null; 47799 draining = false; 47800 runClearTimeout(timeout); 47801 } 47802 47803 process.nextTick = function (fun) { 47804 var args = new Array(arguments.length - 1); 47805 if (arguments.length > 1) { 47806 for (var i = 1; i < arguments.length; i++) { 47807 args[i - 1] = arguments[i]; 47808 } 47809 } 47810 queue.push(new Item(fun, args)); 47811 if (queue.length === 1 && !draining) { 47812 runTimeout(drainQueue); 47813 } 47814 }; 47815 47816// v8 likes predictible objects 47817 function Item(fun, array) { 47818 this.fun = fun; 47819 this.array = array; 47820 } 47821 Item.prototype.run = function () { 47822 this.fun.apply(null, this.array); 47823 }; 47824 process.title = 'browser'; 47825 process.browser = true; 47826 process.env = {}; 47827 process.argv = []; 47828 process.version = ''; // empty string to avoid regexp issues 47829 process.versions = {}; 47830 47831 function noop() {} 47832 47833 process.on = noop; 47834 process.addListener = noop; 47835 process.once = noop; 47836 process.off = noop; 47837 process.removeListener = noop; 47838 process.removeAllListeners = noop; 47839 process.emit = noop; 47840 process.prependListener = noop; 47841 process.prependOnceListener = noop; 47842 47843 process.listeners = function (name) { return [] } 47844 47845 process.binding = function (name) { 47846 throw new Error('process.binding is not supported'); 47847 }; 47848 47849 process.cwd = function () { return '/' }; 47850 process.chdir = function (dir) { 47851 throw new Error('process.chdir is not supported'); 47852 }; 47853 process.umask = function() { return 0; }; 47854 47855 47856 /***/ }), 47857 47858
vendor: 3,220 bytes, lines 47858-47900
47858/***/ "./src/js/modules/_animations.mjs": 47859 /*!****************************************!*\ 47860 !*** ./src/js/modules/_animations.mjs ***! 47861 \****************************************/ 47862 /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { 47863 47864 "use strict"; 47865 __webpack_require__.r(__webpack_exports__); 47866 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 47867 /* harmony export */ animateInView: function() { return /* binding */ animateInView; } 47868 /* harmony export */ }); 47869 function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } 47870 function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } 47871 function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 47872 function animateInView() { 47873 // isInViewport 47874 function isInViewport(elem) { 47875 var bounding = elem.getBoundingClientRect(); 47876 return bounding.top >= 0 && bounding.left >= 0 && bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) && bounding.right <= (window.innerWidth || document.documentElement.clientWidth); 47877 } 47878 47879 // if section is in view, add class in-view 47880 var sections = document.querySelectorAll("section"); 47881 var _iterator = _createForOfIteratorHelper(sections), 47882 _step; 47883 try { 47884 for (_iterator.s(); !(_step = _iterator.n()).done;) { 47885 var section = _step.value; 47886 var s = section; 47887 if (isInViewport(s)) { 47888 s.classList.add("in-view"); 47889 } 47890 } 47891 } catch (err) { 47892 _iterator.e(err); 47893 } finally { 47894 _iterator.f(); 47895 } 47896 } 47897 47898 /***/ }), 47899 47900
47900/***/ "./src/js/modules/_carousels.mjs": 47901 /*!***************************************!*\ 47902 !*** ./src/js/modules/_carousels.mjs ***! 47903 \***************************************/ 47904 /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { 47905 47906 "use strict"; 47907 __webpack_require__.r(__webpack_exports__); 47908 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 47909 /* harmony export */ owl: function() { return /* binding */ owl; } 47910 /* harmony export */ }); 47911 /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 47912 function owl() { 47913 // owl carousel photoalbum 47914 $(".photoalbum").owlCarousel({ 47915 loop: true, 47916 margin: 20, 47917 nav: true, 47918 dots: true, 47919 items: 4, 47920 navText: ['<svg width="27" height="43" viewBox="0 0 57 43" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M39.389 6.88699e-06L-3.71092e-06 21.224L39.389 42.447L39.389 30.6L21.189 20.8L39.389 11L39.389 6.88699e-06Z" fill="#E1A8C9"/><path d="M39.3252 21.2227L56.2602 30.3478L56.2602 12.0938L39.3252 21.2227Z" fill="#E1A8C9"/></svg>', '<svg width="27" height="43" viewBox="0 0 57 43" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.8708 42.4473L56.2598 21.2233L16.8708 0.000267029V11.8473L35.0708 21.6473L16.8708 31.4473V42.4473Z" fill="#E1A8C9"/><path d="M16.9346 21.2245L-0.000427246 12.0995L-0.000427246 30.3535L16.9346 21.2245Z" fill="#E1A8C9"/></svg>'], 47921 responsive: { 47922 0: { 47923 items: 1 47924 }, 47925 600: { 47926 items: 2 47927 }, 47928 1000: { 47929 items: 4 47930 } 47931 } 47932 }); 47933 $('.owl-hero').owlCarousel({ 47934 loop: true, 47935 margin: 0, 47936 dots: false, 47937 items: 1, 47938 nav: true, 47939 navText: ["", ""], 47940 smartSpeed: 2000, 47941 autoplay: true, 47942 autoplayTimeout: 5000, 47943 autoplayHoverPause: true 47944 }); 47945 $('.owl-one').owlCarousel({ 47946 loop: true, 47947 margin: 0, 47948 dots: false, 47949 items: 1, 47950 nav: false, 47951 smartSpeed: 2000, 47952 autoplay: true, 47953 autoplayTimeout: 3000, 47954 autoplayHoverPause: true 47955 }); 47956 $('.owl-4').owlCarousel({ 47957 loop: true, 47958 margin: 20, 47959 nav: true, 47960 navText: ['', ''], 47961 dots: false, 47962 responsive: { 47963 0: { 47964 items: 1.3, 47965 dots: true, 47966 loop: true 47967 }, 47968 600: { 47969 items: 3, 47970 loop: true 47971 }, 47972 1000: { 47973 items: 2.3, 47974 loop: true 47975 }, 47976 1600: { 47977 items: 3.3, 47978 loop: true 47979 } 47980 } 47981 }); 47982 $('.owl-3').owlCarousel({ 47983 loop: true, 47984 margin: 20, 47985 nav: true, 47986 navText: ['', ''], 47987 dots: false, 47988 responsive: { 47989 0: { 47990 items: 1, 47991 dots: true, 47992 loop: true 47993 }, 47994 600: { 47995 items: 2, 47996 loop: true 47997 }, 47998 1000: { 47999 items: 2, 48000 loop: true 48001 }, 48002 1600: { 48003 items: 3, 48004 loop: true 48005 } 48006 } 48007 }); 48008 $('.owl-uitgelicht').owlCarousel({ 48009 loop: true, 48010 margin: 20, 48011 nav: true, 48012 navText: ['', ''], 48013 dots: false, 48014 responsive: { 48015 0: { 48016 items: 1.3, 48017 dots: true, 48018 loop: true 48019 }, 48020 1000: { 48021 items: 2.3, 48022 loop: true 48023 }, 48024 1600: { 48025 items: 3.3, 48026 loop: true 48027 } 48028 } 48029 }); 48030 } 48031 48032 /***/ }), 48033 48034
48034/***/ "./src/js/modules/_clipboard.mjs": 48035 /*!***************************************!*\ 48036 !*** ./src/js/modules/_clipboard.mjs ***! 48037 \***************************************/ 48038 /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { 48039 48040 "use strict"; 48041 __webpack_require__.r(__webpack_exports__); 48042 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 48043 /* harmony export */ copyToClipboard: function() { return /* binding */ copyToClipboard; } 48044 /* harmony export */ }); 48045 /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 48046 function copyToClipboard() { 48047 var toastTrigger = document.getElementById("liveToastBtn"); 48048 var toastLiveExample = document.getElementById("liveToast"); 48049 $("#copylink").on("click", function () { 48050 var link = $(this).data("link"); 48051 navigator.clipboard.writeText(link).then(function () { 48052 console.log("Async: Copying to clipboard was successful!"); 48053 console.log(link); 48054 var toast = new bootstrap.Toast(toastLiveExample); 48055 toast.show(); 48056 }, function (err) { 48057 console.error("Async: Could not copy text: ", err); 48058 48059 // Fallback if browser doesn't support async clipboard API 48060 var textArea = document.createElement("textarea"); 48061 textArea.value = link; 48062 document.body.appendChild(textArea); 48063 textArea.focus(); 48064 textArea.select(); 48065 try { 48066 document.execCommand("copy"); 48067 alert("Copied!"); 48068 } catch (err) { 48069 console.log("Oops, unable to copy"); 48070 } 48071 }); 48072 }); 48073 } 48074 48075 /***/ }), 48076 48077
48077/***/ "./src/js/modules/_header.mjs": 48078 /*!************************************!*\ 48079 !*** ./src/js/modules/_header.mjs ***! 48080 \************************************/ 48081 /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { 48082 48083 "use strict"; 48084 __webpack_require__.r(__webpack_exports__); 48085 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 48086 /* harmony export */ searchbar: function() { return /* binding */ searchbar; } 48087 /* harmony export */ }); 48088 /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 48089 function searchbar() { 48090 $('.js-search-trigger').on('click', function () { 48091 $(this).toggleClass('active'); 48092 $('.js-search-target').toggleClass('active'); 48093 $('.js-search-target input').focus(); 48094 }); 48095 } 48096 48097 /***/ }), 48098 48099
48099/***/ "./src/js/modules/_mobile-filters-sidebar.mjs": 48100 /*!****************************************************!*\ 48101 !*** ./src/js/modules/_mobile-filters-sidebar.mjs ***! 48102 \****************************************************/ 48103 /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { 48104 48105 "use strict"; 48106 __webpack_require__.r(__webpack_exports__); 48107 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 48108 /* harmony export */ mobileFilterbar: function() { return /* binding */ mobileFilterbar; }, 48109 /* harmony export */ toggleMobileFilterbar: function() { return /* binding */ toggleMobileFilterbar; } 48110 /* harmony export */ }); 48111 /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 48112 function mobileFilterbar() { 48113 if ($(window).width() < 992) { 48114 $(".move-filters-here").prepend($(".filter-sidebar")); 48115 } else { 48116 $(".wrapper").prepend($(".filter-sidebar")); 48117 } 48118 } 48119 function toggleMobileFilterbar() { 48120 $("#mobile_filter").on("click", function () { 48121 console.log('clicked'); 48122 $(".mobile-filter-bar").toggleClass("active"); 48123 }); 48124 } 48125 48126 /***/ }), 48127 48128
48128/***/ "./src/js/modules/_navbar.mjs": 48129 /*!************************************!*\ 48130 !*** ./src/js/modules/_navbar.mjs ***! 48131 \************************************/ 48132 /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { 48133 48134 "use strict"; 48135 __webpack_require__.r(__webpack_exports__); 48136 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 48137 /* harmony export */ mobileNav: function() { return /* binding */ mobileNav; }, 48138 /* harmony export */ navbar: function() { return /* binding */ navbar; } 48139 /* harmony export */ }); 48140 /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 48141 function navbar() { 48142 // if scrolled 100px from top, add class to navbar 48143 if (window.scrollY > 100) { 48144 $(".page-header").addClass("scrolled"); 48145 } 48146 // if scrolled less than 100px from top, remove class from navbar 48147 else { 48148 $(".page-header").removeClass("scrolled"); 48149 } 48150 } 48151 function mobileNav() { 48152 // new mobile menu 48153 // $('.mobile-menu-submenu').prepend('<li class="back"><span>Terug</span></li>'); 48154 48155 $('.mobile-menu-trigger').click(function () { 48156 $(this).toggleClass('active'); 48157 $('.mobile-menu').toggleClass('active'); 48158 }); 48159 $('.has-submenu').click(function () { 48160 $(this).addClass('active'); 48161 $(this).find(' > .mobile-menu-submenu').addClass('active'); 48162 }); 48163 $('.has-submenu').each(function () { 48164 var submenutitle = $(this).find('.dropdown-title').html(); 48165 $(this).find('.mobile-menu-submenu').prepend('<li class="back" role="presentation"><span>' + submenutitle + '</span><hr></li>'); 48166 $(this).find('.back').click(function () { 48167 $(this).parent().removeClass('active'); 48168 $(this).parent().parent().removeClass('active'); 48169 return false; 48170 }); 48171 }); 48172 } 48173 48174 /***/ }), 48175 48176
48176/***/ "./src/js/modules/_serviceWorker.mjs": 48177 /*!*******************************************!*\ 48178 !*** ./src/js/modules/_serviceWorker.mjs ***! 48179 \*******************************************/ 48180 /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { 48181 48182 "use strict"; 48183 __webpack_require__.r(__webpack_exports__); 48184 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 48185 /* harmony export */ serviceWorker: function() { return /* binding */ serviceWorker; } 48186 /* harmony export */ }); 48187 /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 48188 function serviceWorker() { 48189 $(document).ready(function (e) { 48190 if ('serviceWorker' in navigator) { 48191 navigator.serviceWorker.register('/serviceWorker.js').then(function (registration) { 48192 // Registration was successful 48193 //console.log('ServiceWorker registration successful with scope: ', registration.scope); 48194 })["catch"](function (err) { 48195 // registration failed 48196 console.log('ServiceWorker registration failed: ', err); 48197 }); 48198 } 48199 }); 48200 return 'serviceWorker'; 48201 } 48202 48203 /***/ }), 48204 48205
48205/***/ "./src/js/modules/_validate.mjs": 48206 /*!**************************************!*\ 48207 !*** ./src/js/modules/_validate.mjs ***! 48208 \**************************************/ 48209 /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { 48210 48211 "use strict"; 48212 __webpack_require__.r(__webpack_exports__); 48213 /* harmony export */ __webpack_require__.d(__webpack_exports__, { 48214 /* harmony export */ validate: function() { return /* binding */ validate; } 48215 /* harmony export */ }); 48216 /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 48217 function validate() { 48218 var language = navigator.language || navigator.userLanguage; 48219 $('form.validate').submit(function (e) { 48220 e.preventDefault(); 48221 var form = $(this); 48222 if (form.find('input[name="gender"]').length === 0) { 48223 alert('Honeypot field is missing...'); 48224 return false; 48225 } 48226 if (form.find('.feedback').length === 0) { 48227 alert("<div> with class '.feedback' is missing..."); 48228 return false; 48229 } 48230 var button = form.find('button[type="submit"]'); 48231 var url = form.attr('action'); 48232 var data = new FormData(this); 48233 var feedback = form.find('.feedback'); 48234 var alert_message = feedback.find('.alert'); 48235 var html = ''; 48236 //var tooltip = form.find('.invalid-tooltip'); 48237 48238 var defaultButtonText = button.html(); 48239 var temporaryButtonValue = '<span class="loader"></span>'; 48240 button.html(temporaryButtonValue); 48241 var controls = form.find('input[name!=gender], textarea, select'); 48242 $('.is-valid').each(function (index, value) { 48243 $(this).removeClass('is-valid'); 48244 }); 48245 $('.is-invalid').each(function (index, value) { 48246 $(this).removeClass('is-invalid'); 48247 }); 48248 48249 //tooltip.remove(); 48250 48251 feedback.hide(200, function () { 48252 alert_message.remove(); 48253 }); 48254 axios.post(url, data, { 48255 headers: { 48256 'Content-Type': 'multipart/form-data' 48257 } 48258 }).then(function (response) { 48259 var status = response.data.status; 48260 var warnings = response.data.warnings; 48261 var hasError = response.data.hasError; 48262 var message = response.data.message; 48263 if (response.data.redirect) { 48264 window.location = response.data.redirect; 48265 return false; 48266 } 48267 form.addClass('was-validated'); //uncomment and add required attribute to required fields for real-time client-side validation 48268 48269 if (status === 'error') { 48270 html += '<div class="alert alert-danger" role="alert">' + message + '</div>'; 48271 } 48272 if (status === 'success') { 48273 html += '<div class="alert alert-success" role="alert">' + message + '</div>'; 48274 } 48275 feedback.html(html).show(200); 48276 if (response.data.clear) { 48277 form.trigger('reset'); 48278 } 48279 })["catch"](function (error) { 48280 console.log(error); 48281 alert('Er is iets misgegaan, neem alstublieft contact op met de beheerder!'); 48282 }); 48283 button.html(defaultButtonText).attr('disabled', false); 48284 }); 48285 $(document).on("DOMNodeInserted", ".btn-feedback-dismiss", function () { 48286 $(this).click(function () { 48287 $(this).parents('.feedback').hide(200, function () { 48288 $(this).find('.alert').remove(); 48289 }); 48290 }); 48291 }); 48292 $(document).on("click", ".btn-feedback-dismiss", function () { 48293 $(this).parents('.feedback').hide(200, function () { 48294 $(this).find('.alert').remove(); 48295 $(this).closest('form').removeClass('was-validated'); 48296 $(this).closest('form').find('.is-invalid, .
48296is-valid').removeClass('is-invalid is-valid'); 48297 }); 48298 }); 48299 $('[id^=file-input]').change(function () { 48300 var el = $(this); 48301 var files = el[0].files; 48302 var translation; 48303 var label; 48304 var translations = {}; 48305 translations['en-EN'] = 'files choosen'; 48306 translations['nl-NL'] = 'bestanden gekozen'; 48307 if (translations[language]) { 48308 translation = translations[language]; 48309 } else { 48310 translation = translations['en-EN']; 48311 } 48312 if (files.length > 1) { 48313 label = files.length + ' ' + translation; 48314 } else { 48315 label = files[0].name; 48316 } 48317 $(this).prev('label').text(label); 48318 }); 48319 return 'validate'; 48320 } 48321 48322 /***/ })
48322 48323 48324 /******/ }); 48325 /************************************************************************/ 48326 /******/ // The module cache 48327 /******/ var __webpack_module_cache__ = {}; 48328 /******/ 48329 /******/ // The require function 48330 /******/ function __webpack_require__(moduleId) { 48331 /******/ // Check if module is in cache 48332 /******/ var cachedModule = __webpack_module_cache__[moduleId]; 48333 /******/ if (cachedModule !== undefined) { 48334 /******/ return cachedModule.exports; 48335 /******/ } 48336 /******/ // Create a new module (and put it into the cache) 48337 /******/ var module = __webpack_module_cache__[moduleId] = { 48338 /******/ id: moduleId, 48339 /******/ loaded: false, 48340 /******/ exports: {} 48341 /******/ }; 48342 /******/ 48343 /******/ // Execute the module function 48344 /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); 48345 /******/ 48346 /******/ // Flag the module as loaded 48347 /******/ module.loaded = true; 48348 /******/ 48349 /******/ // Return the exports of the module 48350 /******/ return module.exports; 48351 /******/ } 48352 /******/ 48353 /******/ // expose the modules object (__webpack_modules__) 48354 /******/ __webpack_require__.m = __webpack_modules__; 48355 /******/ 48356 /************************************************************************/ 48357 /******/ /* webpack/runtime/chunk loaded */ 48358 /******/ !function() { 48359 /******/ var deferred = []; 48360 /******/ __webpack_require__.O = function(result, chunkIds, fn, priority) { 48361 /******/ if(chunkIds) { 48362 /******/ priority = priority || 0; 48363 /******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; 48364 /******/ deferred[i] = [chunkIds, fn, priority]; 48365 /******/ return; 48366 /******/ } 48367 /******/ var notFulfilled = Infinity; 48368 /******/ for (var i = 0; i < deferred.length; i++) { 48369 /******/ var chunkIds = deferred[i][0]; 48370 /******/ var fn = deferred[i][1]; 48371 /******/ var priority = deferred[i][2]; 48372 /******/ var fulfilled = true; 48373 /******/ for (var j = 0; j < chunkIds.length; j++) { 48374 /******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) { 48375 /******/ chunkIds.splice(j--, 1); 48376 /******/ } else { 48377 /******/ fulfilled = false; 48378 /******/ if(priority < notFulfilled) notFulfilled = priority; 48379 /******/ } 48380 /******/ } 48381 /******/ if(fulfilled) { 48382 /******/ deferred.splice(i--, 1) 48383 /******/ var r = fn(); 48384 /******/ if (r !== undefined) result = r; 48385 /******/ } 48386 /******/ } 48387 /******/ return result; 48388 /******/ }; 48389 /******/ }(); 48390 /******/ 48391 /******/ /* webpack/runtime/compat get default export */ 48392 /******/ !function() { 48393 /******/ // getDefaultExport function for compatibility with non-harmony modules 48394 /******/ __webpack_require__.n = function(module) { 48395 /******/ var getter = module && module.__esModule ? 48396 /******/ function() { return module['default']; } : 48397 /******/ function() { return module; }; 48398 /******/ __webpack_require__.d(getter, { a: getter }); 48399 /******/ return getter; 48400 /******/ }; 48401 /******/ }(); 48402 /******/ 48403 /******/ /* webpack/runtime/define property getters */ 48404 /******/ !function() { 48405 /******/ // define getter functions for harmony exports 48406 /******/ __webpack_require__.d = function(exports, definition) { 48407 /******/ for(var key in definition) { 48408 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 48409 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 48410 /******/ } 48411 /******/ } 48412 /******/ }; 48413 /******/ }(); 48414 /******/ 48415 /******/ /* webpack/runtime/global */ 48416 /******/ !function() { 48417 /******/ __webpack_require__.g = (function() { 48418 /******/ if (typeof globalThis === 'object') return globalThis; 48419 /******/ try { 48420 /******/ return this || new Function('return this')(); 48421 /******/ } catch (e) { 48422 /******/ if (typeof window === 'object') return window; 48423 /******/ } 48424 /******/ })(); 48425 /******/ }(); 48426 /******/ 48427 /******/ /* webpack/runtime/hasOwnProperty shorthand */ 48428 /******/ !function() { 48429 /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } 48430 /******/ }(); 48431 /******/ 48432 /******/ /* webpack/runtime/make namespace object */ 48433 /******/ !function() { 48434 /******/ // define __esModule on exports 48435 /******/ __webpack_require__.r = function(exports) { 48436 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 48437 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 48438 /******/ } 48439 /******/ Object.defineProperty(exports, '__esModule', { value: true }); 48440 /******/ }; 48441 /******/ }(); 48442 /******/ 48443 /******/ /* webpack/runtime/node module decorator */ 48444 /******/ !function() { 48445 /******/ __webpack_require__.nmd = function(module) { 48446 /******/ module.paths = []; 48447 /******/ if (!module.children) module.children = []; 48448 /******/ return module; 48449 /******/ }; 48450 /******/ }(); 48451 /******/ 48452 /******/ /* webpack/runtime/jsonp chunk loading */ 48453 /******/ !function() { 48454 /******/ // no baseURI 48455 /******/ 48456 /******/ // object to store loaded and loading chunks 48457 /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched 48458 /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded 48459 /******/ var installedChunks = { 48460 /******/ "/assets/js/bundle": 0, 48461 /******/ "assets/css/style": 0 48462 /******/ }; 48463 /******/ 48464 /******/ // no chunk on demand loading 48465 /******/ 48466 /******/ // no prefetching 48467 /******/ 48468 /******/ // no preloaded 48469 /******/ 48470 /******/ // no HMR 48471 /******/ 48472 /******/ // no HMR manifest 48473 /******/ 48474 /******/ __webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; }; 48475 /******/ 48476 /******/ // install a JSONP callback for chunk loading 48477 /******/ var webpackJsonpCallback = function(parentChunkLoadingFunction, data) { 48478 /******/ var chunkIds = data[0]; 48479 /******/ var moreModules = data[1]; 48480 /******/ var runtime = data[2]; 48481 /******/ // add "moreModules" to the modules object, 48482 /******/ // then flag all "chunkIds" as loaded and fire callback 48483 /******/ var moduleId, chunkId, i = 0; 48484 /******/ if(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) { 48485 /******/ for(moduleId in moreModules) { 48486 /******/ if(__webpack_require__.o(moreModules, moduleId)) { 48487 /******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; 48488 /******/ } 48489 /******/ } 48490 /******/ if(runtime) var result = runtime(__webpack_require__); 48491 /******/ } 48492 /******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); 48493 /******/ for(;i < chunkIds.length; i++) { 48494 /******/ chunkId = chunkIds[i]; 48495 /******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { 48496 /******/ installedChunks[chunkId][0](); 48497 /******/ } 48498 /******/ installedChunks[chunkId] = 0; 48499 /******/ } 48500 /******/ return __webpack_require__.O(result); 48501 /******/ } 48502 /******/ 48503 /******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; 48504 /******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); 48505 /******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); 48506 /******/ }(); 48507 /******/ 48508 /************************************************************************/ 48509 /******/ 48510 /******/ // startup 48511 /******/ // Load entry module and return exports 48512 /******/ // This entry module depends on other loaded chunks and execution need to be delayed 48513 /******/ __webpack_require__.O(undefined, ["assets/css/style"], function() { return __webpack_require__("./src/js/app.js"); }) 48514 /******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["assets/css/style"], function() { return __webpack_require__("./src/sass/style.scss"); }) 48515 /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); 48516 /******/ 48517 /******/ })() 48518; 48519 48520$('.zoek-form').keyup(function(){ 48521 var keyword = $(this).val(); // Get the keyword entered in the input 48522 if (keyword.length > 2) { // Only search if keyword length > 2 48523 $.ajax({ 48524 url: '/Search/find', // PHP endpoint to handle the request 48525 method: 'POST', 48526 data: { keyword: keyword }, // Send the keyword as data 48527 dataType: 'json', // Expect JSON data from the server 48528 success: function (response) { 48529 console.log(response); 48530 // Clear the previous results 48531 $('#zoek-resultaten').empty(); 48532 48533 // Check if there are any results 48534 if (response.length > 0) { 48535 // Loop through the results and append them to the <ul> 48536 $.each(response, function (index, item) { 48537 $('#zoek-resultaten').append('<li>' + item + '</li>'); 48538 }); 48539 } else { 48540 $('#zoek-resultaten').append('<li>No results found</li>'); 48541 } 48542 }, 48543 error: function () { 48544 console.log('An error occurred.'); 48545 } 48546 }); 48547 } else { 48548 $('#zoek-resultaten').empty(); // Clear results if input is cleared 48549 } 48550}); 48551$('[data-mega]').click(function(e){ 48552 e.preventDefault(); 48553 $('.full-menu').show(); 48554 $('.submenu').hide(); 48555 var id = $(this).data('mega'); 48556 var color = $(this).data('color'); 48557 $('.full-menu').removeClass('white'); 48558 $('.full-menu').removeClass('yellow'); 48559 $('.full-menu').removeClass('blue'); 48560 $('.full-menu').removeClass('red'); 48561 $('.full-menu').addClass(color); 48562 $('.mobile-nav').addClass('showPage2'); 48563 $('#' + id).show(); 48564 $('.backdrop').addClass('active'); 48565}); 48566 48567$('.backdrop').click(function(){ 48568 $('.full-menu').hide(); 48569 $('.backdrop').removeClass('active'); 48570}); 48571 48572$('.closeMenu').click(function(e){ 48573 e.preventDefault(); 48574 $('.full-menu').hide(); 48575 $('.backdrop').removeClass('active'); 48576}); 48577 48578function toggleFullSearch(){ 48579 search(); 48580 $('.nav-items').addClass('isZoeken'); 48581} 48582 48583 48584// Escape text from the search JSON before it is concatenated into HTML.
48585// item.preview is the exception: it is HTML that Search.php escapes itself. 48586function escapeHtml(value) { 48587 return String(value == null ? '' : value).replace(/[&<>"']/g, function (c) { 48588 return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]; 48589 }); 48590} 48591 48592function search(query){ 48593 $.ajax({ 48594 url: '/search/find', // Replace with your endpoint 48595 method: 'POST', 48596 data: { search: query }, // Send the input data 48597 success: function (response) { 48598 // Clear previous results 48599 $('#zoek-resultaten').empty(); 48600 $('#zoek-suggesties').empty(); 48601 48602 let zoekresultaten; 48603 zoekresultaten = response.search; 48604 if (zoekresultaten) { 48605 zoekresultaten.forEach(function (item) { 48606 if( item.type ) { 48607 $('#zoek-resultaten').append('<li><a href="' + escapeHtml(item.url) + '"><div class="type">' + escapeHtml(item.type) + '</div><div class="title">' + escapeHtml(item.title) + '</div><small class="preview">' + item.preview + '</small></a></li>'); 48608 }else{ 48609 $('#zoek-resultaten').append('<li><a href="' + escapeHtml(item.url) + '"><div class="title">' + escapeHtml(item.title) + '</div><small class="preview">' + item.preview + '</small></a></li>'); 48610 } 48611 }); 48612 } 48613 let suggesties; 48614 suggesties = response.suggesties; 48615 suggesties.forEach(function (item) { 48616 $('#zoek-suggesties').append('<li><a href="' + escapeHtml(item.url) + '">' + escapeHtml(item.title) + '</a></li>'); 48617 }); 48618 48619 if (suggesties.length == 0){ 48620 $('#suggesties-container').hide(); 48621 }else{ 48622 $('#suggesties-container').show(); 48623 } 48624 48625 }, 48626 error: function (xhr) { 48627 console.error('Error:', xhr.responseText); // Log any error 48628 } 48629 }); 48630} 48631 48632 48633$('.searchInputFull').keyup(function () { 48634 $.ajax({ 48635 url: '/search/find', // Replace with your endpoint 48636 method: 'POST', 48637 data: { search: $('.searchInputFull').val() }, // Send the input data 48638 success: function (response) { 48639 // Clear previous results 48640 48641 let zoekresultaten; 48642 zoekresultaten = response.search; 48643 if (zoekresultaten) {
48644 zoekresultaten.forEach(function (item) { 48645 if( item.type ) { 48646 $('#full-search').append('<li><a href="' + escapeHtml(item.url) + '"><div class="type">' + escapeHtml(item.type) + '</div><div class="title">' + escapeHtml(item.title) + '</div><small class="preview">' + item.preview + '</small></a></li>'); 48647 }else{ 48648 $('#full-search').append('<li><a href="' + escapeHtml(item.url) + '"><div class="title">' + escapeHtml(item.title) + '</div><small class="preview">' + item.preview + '</small></a></li>'); 48649 } 48650 }); 48651 } 48652 } 48653 }); 48654}); 48655$('.zoekveld-input').keyup(function () { 48656 48657 let query = $(this).val(); // Get the value of the input field 48658 if (query.length > 0) { $('.nav-items').addClass('isZoeken');} 48659 $('.zoek-resultaten').show(); 48660 if (query.length > 1) { 48661 $('#zoek-suggesties').addClass('small'); 48662 $('#title-suggesties').hide(); 48663 $('header nav ul').show(); 48664 48665 $('.zoekveld-header').val($(this).val()).focus(); 48666 search(query); 48667 }else{ 48668 $('#zoek-suggesties').removeClass('small'); 48669 $('#title-suggesties').show(); 48670 } 48671}); 48672 48673$(document).click(function(event) { 48674 if (!$(event.target).closest('.nav-items').length) { 48675 // Your code to execute when body is clicked, except .zoek-resultaten 48676 48677 $('.nav-items').removeClass('isZoeken'); 48678 } 48679}); 48680
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.