1 <!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" class="" lang="nl-NL"> 3 <!-- 4 Realisatie: 5 Bureau Max 6 Apeldoorn 7 W: https://max.nl 8 E: [email protected] 9 T: 055-5270270 10 --> 11 <head> 12 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 13 <title>IMAGEM</title> 14<link data-rocket-prefetch href="https://www.googletagmanager.com" rel="dns-prefetch"> 15<link data-rocket-prefetch href="https://kit.fontawesome.com" rel="dns-prefetch"> 16<link data-rocket-prefetch href="https://cdn.bureaumax.nl" rel="dns-prefetch"> 17<link data-rocket-prefetch href="https://player.vimeo.com" rel="dns-prefetch"> 18<style id="wpr-usedcss">img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}:root{--wp--preset--font-size--normal:16px;
18--wp--preset--font-size--huge:42px}:root .has-text-align-center{text-align:center}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-color]){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background{padding:1.25em 2.375em}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}.wp-block-columns{box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns{align-items:normal!important}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-spacer{clear:both}:root{--wp--preset--aspect-ratio--square:1;--wp--preset--aspect-ratio--4-3:4/3;--wp--preset--aspect-ratio--3-4:3/4;--wp--preset--aspect-ratio--3-2:3/2;--wp--preset--aspect-ratio--2-3:2/3;--wp--preset--aspect-ratio--16-9:16/9;--wp--preset--aspect-ratio--9-16:9/16;--wp--preset--color--black:#000;--wp--preset--color--cyan-bluish-gray:#abb8c3;--wp--preset--color--white:#FFF;--wp--preset--color--pale-pink:#f78da7;--wp--preset--color--vivid-red:#cf2e2e;--wp--preset--color--luminous-vivid-orange:#ff6900;--wp--preset--color--luminous-vivid-amber:#fcb900;--wp--preset--color--light-green-cyan:#7bdcb5;--wp--preset--color--vivid-green-cyan:#00d084;--wp--preset--color--pale-cyan-blue:#8ed1fc;
18--wp--preset--color--vivid-cyan-blue:#0693e3;--wp--preset--color--vivid-purple:#9b51e0;--wp--preset--color--1-light:var(--color-1-light);--wp--preset--color--2-light:var(--color-2-light);--wp--preset--color--2-lighter:var(--color-2-lighter);--wp--preset--color--grey-light:var(--color-grey-light);--wp--preset--color--dark-light:var(--color-grey-dark);--wp--preset--color--body:#222222;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple:linear-gradient(135deg,rgb(6, 147, 227) 0%,rgb(155, 81, 224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan:linear-gradient(135deg,rgb(122, 220, 180) 0%,rgb(0, 208, 130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange:linear-gradient(135deg,rgb(252, 185, 0) 0%,rgb(255, 105, 0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red:linear-gradient(135deg,rgb(255, 105, 0) 0%,rgb(207, 46, 46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray:linear-gradient(135deg,rgb(238, 238, 238) 0%,rgb(169, 184, 195) 100%);
18--wp--preset--gradient--cool-to-warm-spectrum:linear-gradient(135deg,rgb(74, 234, 220) 0%,rgb(151, 120, 209) 20%,rgb(207, 42, 186) 40%,rgb(238, 44, 130) 60%,rgb(251, 105, 98) 80%,rgb(254, 248, 76) 100%);--wp--preset--gradient--blush-light-purple:linear-gradient(135deg,rgb(255, 206, 236) 0%,rgb(152, 150, 240) 100%);--wp--preset--gradient--blush-bordeaux:linear-gradient(135deg,rgb(254, 205, 165) 0%,rgb(254, 45, 45) 50%,rgb(107, 0, 62) 100%);--wp--preset--gradient--luminous-dusk:linear-gradient(135deg,rgb(255, 203, 112) 0%,rgb(199, 81, 192) 50%,rgb(65, 88, 208) 100%);--wp--preset--gradient--pale-ocean:linear-gradient(135deg,rgb(255, 245, 203) 0%,rgb(182, 227, 212) 50%,rgb(51, 167, 181) 100%);--wp--preset--gradient--electric-grass:linear-gradient(135deg,rgb(202, 248, 128) 0%,rgb(113, 206, 126) 100%);--wp--preset--gradient--midnight:linear-gradient(135deg,rgb(2, 3, 129) 0%,rgb(40, 116, 252) 100%);--wp--preset--font-size--small:13px;--wp--preset--font-size--medium:20px;--wp--preset--font-size--large:36px;--wp--preset--font-size--x-large:42px;--wp--preset--font-size--size-6:18px;--wp--preset--font-size--size-5:20px;--wp--preset--font-size--size-4:24px;--wp--preset--font-size--size-3:32px;--wp--preset--font-size--size-2:40px;--wp--preset--font-size--size-1:48px;--wp--preset--spacing--20:0.44rem;--wp--preset--spacing--30:0.67rem;--wp--preset--spacing--40:1rem;--wp--preset--spacing--50:1.5rem;--wp--preset--spacing--60:2.25rem;--wp--preset--spacing--70:3.38rem;--wp--preset--spacing--80:5.06rem;--wp--preset--shadow--natural:6px 6px 9px rgba(0, 0, 0, .2);--wp--preset--shadow--deep:12px 12px 50px rgba(0, 0, 0, .4);--wp--preset--shadow--sharp:6px 6px 0px rgba(0, 0, 0, .2);--wp--preset--shadow--outlined:6px 6px 0px -3px rgb(255, 255, 255),6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp:6px 6px 0px rgb(0, 0, 0)}:where(body){margin:0}:where(.is-layout-flex){gap:.5em}:where(.is-layout-grid){gap:.5em}body .is-layout-flex{display:flex}.is-layout-flex{flex-wrap:wrap;align-items:center}.is-layout-flex>:is(*,div){margin:0}body{padding-top:0;padding-right:0;padding-bottom:0;padding-left:0}:root :where(.wp-element-button,.wp-block-button__link){background-color:#32373c;border-width:0;color:#fff;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;padding-top:calc(.667em + 2px);padding-right:calc(1.333em + 2px);
18padding-bottom:calc(.667em + 2px);padding-left:calc(1.333em + 2px);text-decoration:none;text-transform:inherit}.has-size-5-font-size{font-size:var(--wp--preset--font-size--size-5)!important}.has-size-2-font-size{font-size:var(--wp--preset--font-size--size-2)!important}:where(.wp-block-columns.is-layout-flex){gap:2em}:where(.wp-block-columns.is-layout-grid){gap:2em}.cmplz-blocked-content-notice{display:none}.cmplz-blocked-content-container,.cmplz-wp-video{animation-name:cmplz-fadein;animation-duration:.6s;background:#fff;border:0;border-radius:3px;box-shadow:0 0 1px 0 rgba(0,0,0,.5),0 1px 10px 0 rgba(0,0,0,.15);display:flex;justify-content:center;align-items:center;background-repeat:no-repeat!important;background-size:cover!important;height:inherit;position:relative}.cmplz-blocked-content-container iframe,.cmplz-wp-video iframe{visibility:hidden;max-height:100%;border:0!important}.cmplz-blocked-content-container .cmplz-blocked-content-notice,.cmplz-wp-video .cmplz-blocked-content-notice{white-space:normal;text-transform:initial;position:absolute!important;width:100%;top:50%;left:50%;transform:translate(-50%,-50%);max-width:300px;font-size:14px;padding:10px;background-color:rgba(0,0,0,.5);color:#fff;text-align:center;z-index:98;line-height:23px}.cmplz-blocked-content-container .cmplz-blocked-content-notice .cmplz-links,.cmplz-wp-video .cmplz-blocked-content-notice .cmplz-links{display:block;margin-bottom:10px}.cmplz-blocked-content-container .cmplz-blocked-content-notice .cmplz-links a,.cmplz-wp-video .cmplz-blocked-content-notice .cmplz-links a{color:#fff}.cmplz-blocked-content-container div div{display:none}.cmplz-wp-video .cmplz-placeholder-element{width:100%;height:inherit}@keyframes cmplz-fadein{from{opacity:0}to{opacity:1}}.country-selector{z-index:9999;text-align:left;position:relative;display:inline-block;width:auto}.country-selector a{padding:0 10px;outline:0;text-decoration:none;float:none!important;white-space:nowrap;font-weight:400;cursor:pointer;color:#000;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.country-selector a:focus{outline:0}.country-selector ul{padding:0;z-index:1010;list-style:none;margin:0}.country-selector li{margin:0;padding:0}.country-selector.weglot-custom-switcher-ajax{display:none}.country-selector.weglot-dropdown{background-color:#fff}.country-selector.weglot-dropdown a,.country-selector.weglot-dropdown span{display:block;height:37px;line-height:36px;font-size:13px;padding:0 10px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;font-weight:400}.country-selector.weglot-dropdown a:hover,.country-selector.weglot-dropdown span:hover{cursor:pointer}.country-selector.weglot-dropdown .wgcurrent{border:1px solid #e0e0e0;list-style:none;display:block;margin:0}.country-selector.weglot-dropdown .wgcurrent a,.country-selector.weglot-dropdown .wgcurrent span{padding-right:60px}.country-selector.weglot-dropdown .wgcurrent:after{display:inline-block;position:absolute;top:17px;right:8px;width:13px;height:7px;-ms-interpolation-mode:nearest-neighbor;image-rendering:-webkit-optimize-contrast;image-rendering:pixelated;background:url("https://imagem.nl/wp-content/plugins/weglot/dist/images/wgarrowdown.png") no-repeat;content:"";-webkit-transition:.2s;transition:all .2s;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.country-selector.weglot-dropdown ul{position:absolute;min-width:100%;border:1px solid #ebeef0;background:#fff;left:0;top:initial;-webkit-box-sizing:border-box;box-sizing:border-box;display:none;padding:0}.country-selector.weglot-dropdown input:checked~ul{display:block}.country-selector.weglot-dropdown input:checked~.wgcurrent:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.country-selector.weglot-dropdown li{width:100%}.country-selector.weglot-dropdown.weglot-invert ul{bottom:38px}.country-selector.weglot-dropdown.weglot-invert input:checked~.wgcurrent:after{-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.country-selector.weglot-default{position:fixed;bottom:0;right:40px}.country-selector input{display:none!important}[data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="800"],body[data-aos-duration="800"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay="800"],body[data-aos-delay="800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="800"].aos-animate,body[data-aos-delay="800"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration="1000"],body[data-aos-duration="1000"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay="1000"],body[data-aos-delay="1000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1000"].aos-animate,body[data-aos-delay="1000"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,transform}[data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;transform:translateZ(0)}[data-aos=fade-up]{transform:translate3d(0,100px,0)}[data-aos=fade-right]{transform:translate3d(-100px,0,0)}[data-aos=fade-left]{transform:translate3d(100px,0,0)}[data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,transform}[data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;transform:translateZ(0) scale(1)}[data-aos^=slide][data-aos^=slide]{transition-property:transform}[data-aos^=slide][data-aos^=slide].aos-animate{transform:translateZ(0)}[data-aos^=flip][data-aos^=flip]{backface-visibility:hidden;transition-property:transform}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}a{background-color:rgba(0,0,0,0)}strong{font-weight:700}code{font-family:monospace,monospace;font-size:1em}ul{list-style:none;padding:0;margin:0}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px;outline:0}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}template{display:none}[hidden]{display:none}:root{--font-title:"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif";--font-body:"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif";--font-extra:"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif";--body-size:18px;--body-size-small:16px;--body-weight:400;--body-line-height:1.6;--title-weight:700;--title-line-height:1.2;--font-size-1:50px;--font-size-2:40px;--font-size-3:35px;--font-size-4:25px;--font-size-5:20px;--font-size-6:18px}:root{--color-1:#87AB26;--color-2:#0094B5;--color-3:#E3241C;--color-4:#F09300;--color-5:#F1C400;--color-white:#ffffff;--color-white-blur:rgba(255, 255, 255, .7);--color-black:#000000}:root{--color-1-light:#BAD978;--color-2-light:#82C4D4;--color-2-lighter:#EFF3F6;--color-3-light:color-mix(in srgb, var(--color-white, #ffffff) 90%, var(--color-3, #
18E3241C));--color-4-light:color-mix(in srgb, var(--color-white, #ffffff) 90%, var(--color-4, #F09300));--color-5-light:#FFF5E6;--color-1-dark:#718C1E;--color-2-dark:#07495A;--color-2-darker:#0E3C48;--color-3-dark:color-mix(in srgb, var(--color-black, #000000) 70%, var(--color-3, #E3241C));--color-4-dark:color-mix(in srgb, var(--color-black, #000000) 70%, var(--color-4, #F09300));--color-5-dark:color-mix(in srgb, var(--color-black, #000000) 70%, var(--color-4, #F09300))}:root{--bg-body:#FFFFFF;--color-body:#1E1E1E;--color-title:#1E1E1E;--color-meta:#87888A;--color-link:var(--color-2-dark, #07495A);--color-link-hover:#1E1E1E;--admin-color-1:var(--color-1, #87AB26);--admin-color-2:var(--color-white, #ffffff)}:root{--color-grey-light:#C6C7C8;--color-grey-dark:#87888A}:root{--gradient-hero:linear-gradient(0deg, rgba(0, 0, 0, .8) 0%, rgba(0, 0, 0, .55) 100%) no-repeat;--gradient-hero-page:linear-gradient(0deg, rgba(0, 0, 0, .8) 0%, rgba(0, 0, 0, .55) 100%) no-repeat;--gradient-header:linear-gradient(rgba(0, 0, 0, .3) 0%, transparent 100%) no-repeat;--gradient-start:linear-gradient(90deg, rgba(0, 0, 0, .3) 0%, transparent 100%) no-repeat;--gradient-center:linear-gradient(90deg, transparent 0%, rgba(0, 0, 0, .3) 40%, rgba(0, 0, 0, .3) 60%, transparent 100%) no-repeat;--gradient-end:linear-gradient(90deg, transparent 0%, rgba(0, 0, 0, .3) 100%) no-repeat}:root{--border-radius-sm:8px;--border-radius-lg:10px}:root{--breadcrumb-link:var(--color-body, #1E1E1E);--breadcrumb-link-hover:var(--color-1, #87AB26);--breadcrumb-last:var(--color-grey-dark, #87888A);--breadcrumb-divider:var(--color-body, #1E1E1E)}:root{--button-bg:var(--color-2-light, #82C4D4);--button-bg-hover:var(--color-1-light, #BAD978);--button-color:var(--color-body, #1E1E1E);--button-color-hover:var(--color-body, #1E1E1E);--button-size:19px;--button-font:var(--font-title, "Basis Grotesque Pro", "Helvetica Neue", "Arial", "sans-serif");--button-weight:700;--button-border-radius:50px;--button-padding:0.7em 1em}:root{--header-bg:var(--color-white, #ffffff);--header-border:transparent;--header-height-lg:110px;--header-height-md:90px;--header-height-sm:70px;--searchbar-bg:var(--color-2-lighter, #EFF3F6)}:root{--menu-main-font:var(--font-title, "Basis Grotesque Pro", "Helvetica Neue", "Arial", "sans-serif");--menu-main-font-size:18px;--menu-main-font-weight:700;--menu-main-text-transform:none;--menu-main-submenu-font:var(--font-title, "Basis Grotesque Pro", "Helvetica Neue", "Arial", "sans-serif");--menu-main-submenu-font-size:17px;--menu-main-color:var(--color-body, #1E1E1E);--menu-main-color-hover:var(--color-body, #1E1E1E);--menu-main-color-active:var(--color-body, #1E1E1E);--menu-main-submenu-color:var(--color-body, #1E1E1E);--menu-main-submenu-bg:var(--color-white, #ffffff);--menu-main-submenu-color-hover:var(--color-body, #1E1E1E);--menu-main-submenu-bg-hover:var(--color-1-light, #BAD978);--menu-main-submenu-color-active:var(--color-body, #1E1E1E);--menu-main-submenu-bg-active:var(--color-1-light, #BAD978)}:root{--menu-top-font:var(--font-title, "Basis Grotesque Pro", "Helvetica Neue", "Arial", "sans-serif");--menu-top-font-size:16px;--menu-top-font-weight:400;--menu-top-text-transform:none;--menu-top-color:var(--color-body, #1E1E1E);--menu-top-color-hover:var(--color-body, #1E1E1E);--menu-top-color-active:var(--color-body, #1E1E1E);--menu-top-bg:transparent}:root{--menu-mobile-hamburger-color:var(--color-white, #ffffff);--menu-mobile-bg:var(--color-2-lighter, #EFF3F6);--menu-mobile-bg-active:transparent;--menu-mobile-font:var(--font-title, "Basis Grotesque Pro", "Helvetica Neue", "Arial", "sans-serif");--menu-mobile-font-size:20px;--menu-mobile-font-weight:600;--menu-mobile-text-transform:none;--menu-mobile-color:var(--color-body, #1E1E1E);--menu-mobile-color-active:var(--color-2, #0094B5);--menu-mobile-submenu-font:var(--font-title, "Basis Grotesque Pro", "Helvetica Neue", "Arial", "sans-serif");--menu-mobile-submenu-font-size:17px;--menu-mobile-submenu-font-weight:400;--menu-mobile-submenu-text-transform:none;--menu-mobile-submenu-color:var(--color-white, #ffffff);--menu-mobile-submenu-bg:transparent;--menu-mobile-submenu-color-active:var(--color-white, #ffffff);--menu-mobile-submenu-bg-active:transparent}:root{--hero-text-color:var(--color-white, #ffffff);--hero-text-size:19px;--hero-title-color:var(--color-white, #ffffff);--hero-title-size:48px;--hero-title-home-size:48px;--hero-link-color:var(--color-white, #ffffff);--hero-link-color-hover:var(--color-white, #ffffff);--hero-button-color:var(--color-body, #1E1E1E);--hero-button-color-hover:var(--color-body, #1E1E1E);--hero-button-bg:var(--color-2-light, #82C4D4);--hero-button-bg-hover:var(--color-1-light, #BAD978);--hero-height:600px;--hero-height-home:80vh}:root{--social-size:50px;--social-border-radius:50%;--social-bg:var(--color-2-lighter, #EFF3F6);--social-bg-hover:var(--color-2-light, #82C4D4);--social-color:var(--color-body, #1E1E1E);--social-color-hover:var(--color-body, #1E1E1E);--social-share-bg:var(--color-2-lighter, #EFF3F6);--social-share-bg-hover:var(--color-2-light, #82C4D4);--social-share-color:var(--color-body, #1E1E1E);--social-share-color-hover:var(--color-body, #1E1E1E)}:root{--footer-bg:var(--color-white, #ffffff);--footer-color:var(--color-body, #1E1E1E);--footer-link-color:var(--color-body, #1E1E1E)}.container{width:100%;margin:0 auto;padding:0 1rem}@media(min-width:576px){.container{max-width:540px}.row:has(>[class*=col-sm-]){grid-template-columns:repeat(12,minmax(0,1fr));column-gap:2rem}}@media(min-width:783px){.container{max-width:720px}.col-md-6{grid-column-start:auto;grid-column-end:span 6}}@media(min-width:992px){.container{max-width:960px}.col-lg-4{grid-column-start:auto;grid-column-end:span 4}.col-lg-5{grid-column-start:auto;grid-column-end:span 5}.col-lg-6{grid-column-start:auto;grid-column-end:span 6}.col-lg-7{grid-column-start:auto;grid-column-end:span 7}.col-lg-8{grid-column-start:auto;grid-column-end:span 8}.col-lg-10{grid-column-start:auto;grid-column-end:span 10}.col-lg-12{grid-column-start:auto;grid-column-end:span 12}}@media(min-width:1200px){.container{max-width:1140px}.col-xl-4{grid-column-start:auto;grid-column-end:span 4}.col-xl-8{grid-column-start:auto;grid-column-end:span 8}}.row{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));row-gap:2rem;column-gap:0;box-sizing:border-box}.row>:not([class*=col-]){grid-column:span 1;box-sizing:border-box}.row>[class*=col-]{box-sizing:border-box}@media(min-width:1400px){.container{max-width:1340px}.row:has(>[class*=col-xxl-]){grid-template-columns:repeat(12,minmax(0,1fr));column-gap:2rem}}@media(min-width:0){.gy-0{row-gap:0!important}.gap-1{gap:clamp(.4rem,calc(.4rem + 2vw),.5rem)!important}.gap-2{gap:clamp(.8rem,calc(.8rem + 2vw),1rem)!important}.gap-3{gap:clamp(1.2rem,calc(1.2rem + 2vw),1.5rem)!important}.gap-column-3,.gx-3{column-gap:clamp(1.2rem,calc(1.2rem + 2vw),1.5rem)!important}.gap-row-3{row-gap:clamp(1.2rem,calc(1.2rem + 2vw),1.5rem)!important}.gap-4{gap:clamp(1.6rem,calc(1.6rem + 2vw),2rem)!important}.gx-4{column-gap:clamp(1.6rem,calc(1.6rem + 2vw),2rem)!important}}.color-2{color:var(--color-2,#0094b5);
18fill:var(--color-2,#0094B5)}a.color-2,a.color-2:focus,a.color-2:visited{color:var(--color-2,#0094b5);fill:var(--color-2,#0094B5)}a.color-2:focus:hover,a.color-2:hover,a.color-2:visited:hover{color:color-mix(in srgb,#fff 10%,var(--color-2,#0094b5));fill:color-mix(in srgb,#fff 10%,var(--color-2,#0094B5))}.bg-2-light{background-color:var(--color-2-light,#82c4d4);fill:var(--color-body,#1E1E1E);color:var(--color-body,#1e1e1e);--color-title:var(--color-title, #1E1E1E);--color-link:var(--color-link, var(--color-2-dark, #07495A));--color-link-hover:var(--color-link-hover, #1E1E1E);--button-color:var(--button-color);--button-color-hover:var(--button-color-hover);--button-bg:var(--button-bg);--button-bg-hover:var(--button-bg-hover)}.bg-2-lighter{background-color:var(--color-2-lighter,#eff3f6);fill:var(--color-body,#1E1E1E);color:var(--color-body,#1e1e1e);--color-title:var(--color-title, #1E1E1E);--color-link:var(--color-link, var(--color-2-dark, #07495A));--color-link-hover:var(--color-link-hover, #1E1E1E);--button-color:var(--button-color);--button-color-hover:var(--button-color-hover);--button-bg:var(--button-bg);--button-bg-hover:var(--button-bg-hover)}.bg-2-dark{background-color:var(--color-2-dark,#07495a);fill:var(--color-white,#ffffff);color:var(--color-white,#fff);--color-title:var(--color-white, #ffffff);--color-link:var(--color-link, var(--color-2-dark, #07495A));--color-link-hover:var(--color-link-hover, #1E1E1E);--button-color:var(--button-color);--button-color-hover:var(--button-color-hover);--button-bg:var(--button-bg);--button-bg-hover:var(--button-bg-hover)}.bg-image{background-color:rgba(0,0,0,0);
18fill:var(--color-white,#ffffff);color:var(--color-white,#fff);--color-title:var(--color-white, #ffffff);--color-link:var(--color-white, #ffffff);--color-link-hover:var(--color-white, #ffffff);--button-color:var(--button-color);--button-color-hover:var(--button-color-hover);--button-bg:var(--button-bg);--button-bg-hover:var(--button-bg-hover)}.bg-white{background-color:var(--color-white,#fff);fill:var(--color-body,#1E1E1E);color:var(--color-body,#1e1e1e);--color-title:var(--color-title, #1E1E1E);--color-link:var(--color-link, var(--color-2-dark, #07495A));--color-link-hover:var(--color-link-hover, #1E1E1E);--button-color:var(--button-color);--button-color-hover:var(--button-color-hover);--button-bg:var(--button-bg);--button-bg-hover:var(--button-bg-hover)}.bg-white-blur{background-color:var(--color-white-blur,rgba(255,255,255,.7));fill:var(--color-body,#1E1E1E);color:var(--color-body,#1e1e1e);--color-title:var(--color-title, #1E1E1E);--color-link:var(--color-link, var(--color-2-dark, #07495A));--color-link-hover:var(--color-link-hover, #1E1E1E);--button-color:var(--button-color);--button-color-hover:var(--button-color-hover);--button-bg:var(--button-bg);--button-bg-hover:var(--button-bg-hover)}.bg-black{background-color:var(--color-black,#000);fill:var(--color-white,#ffffff);color:var(--color-white,#fff);--color-title:var(--color-white, #ffffff);--color-link:var(--color-white, #ffffff);--color-link-hover:var(--color-white, #ffffff);--button-color:var(--button-color);--button-color-hover:var(--button-color-hover);--button-bg:var(--button-bg);--button-bg-hover:var(--button-bg-hover)}.bg-white-blur{backdrop-filter:blur(2.5px)}:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:0.9999999992rem}:root{--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, .175);--bs-border-radius:0.375rem;--bs-border-radius-sm:var(--border-radius-sm, 8px);--bs-border-radius-lg:var(--border-radius-lg, 10px);--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:rgb(10, 88, 202);--bs-code-color:#d63384;--bs-highlight-bg:rgb(255, 243, 205)}.d-block{display:block!important}.d-flex{display:flex!important}.d-none{display:none!important}.flex-column{flex-direction:column!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-wrap{flex-wrap:wrap!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.my-3{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.mt-2{margin-top:1rem!important}.mt-3{margin-top:1.5rem!important}.mt-4{margin-top:2rem!important}.mt-auto{margin-top:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.5rem!important}.mb-2{margin-bottom:1rem!important}.mb-3{margin-bottom:1.5rem!important}.ms-1{margin-left:.5rem!important}.p-1{padding:.5rem!important}.p-3{padding:1.5rem!important}.px-2{padding-right:1rem!important;padding-left:1rem!important}.px-3{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-4{padding-right:2rem!important;padding-left:2rem!important}.py-1{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-4{padding-top:2rem!important;padding-bottom:2rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.pt-1{padding-top:.5rem!important}.pt-4{padding-top:2rem!important}.pb-3{padding-bottom:1.5rem!important}.pb-4{padding-bottom:2rem!important}@media(min-width:783px){.row:has(>[class*=col-md-]){grid-template-columns:repeat(12,minmax(0,1fr));column-gap:2rem}.flex-md-row{flex-direction:row!important}.justify-content-md-between{justify-content:space-between!important}.p-md-2{padding:1rem!important}.box-hover:hover{transform:translateY(-3px);z-index:1;-webkit-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);
18-khtms-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);-moz-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);-ms-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);-o-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);box-shadow:0 2px 10px 0 rgba(0,0,0,.2)}}@media(min-width:992px){.row:has(>[class*=col-lg-]){grid-template-columns:repeat(12,minmax(0,1fr));column-gap:2rem}.offset-lg-1{grid-column-start:2!important}.gx-lg-6{column-gap:clamp(2.4rem,calc(2.4rem + 2vw),3rem)!important}.order-lg-first{order:-1!important}.order-lg-last{order:6!important}.my-lg-4{margin-top:2rem!important;margin-bottom:2rem!important}.mt-lg-0{margin-top:0!important}.px-lg-6{padding-right:3rem!important;padding-left:3rem!important}.py-lg-6{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pb-lg-6{padding-bottom:3rem!important}}@font-face{font-family:"Basis Grotesque Pro";src:url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro/3ddd0e3d1a076e112b27d8d9b7e20200.eot");src:url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro/3ddd0e3d1a076e112b27d8d9b7e20200.eot?#iefix") format("embedded-opentype"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro/3ddd0e3d1a076e112b27d8d9b7e20200.woff2") format("woff2"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro/3ddd0e3d1a076e112b27d8d9b7e20200.woff") format("woff"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro/3ddd0e3d1a076e112b27d8d9b7e20200.ttf") format("truetype"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro/3ddd0e3d1a076e112b27d8d9b7e20200.svg#BasisGrotesquePro-Regular") format("svg");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:"Basis Grotesque Pro";src:url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Italic/8ce60fb425a6d82095ccc5ec72e15f7a.eot");src:url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Italic/8ce60fb425a6d82095ccc5ec72e15f7a.eot?#iefix") format("embedded-opentype"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Italic/8ce60fb425a6d82095ccc5ec72e15f7a.woff2") format("woff2"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Italic/8ce60fb425a6d82095ccc5ec72e15f7a.woff") format("woff"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Italic/8ce60fb425a6d82095ccc5ec72e15f7a.ttf") format("truetype"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Italic/8ce60fb425a6d82095ccc5ec72e15f7a.svg#BasisGrotesquePro-Italic") format("svg");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:"Basis Grotesque Pro";src:url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold/98a34676ba814c4848424f733521ea58.eot");src:url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold/98a34676ba814c4848424f733521ea58.eot?#iefix") format("embedded-opentype"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold/98a34676ba814c4848424f733521ea58.woff2") format("woff2"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold/98a34676ba814c4848424f733521ea58.woff") format("woff"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold/98a34676ba814c4848424f733521ea58.ttf") format("truetype"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20B
18old/98a34676ba814c4848424f733521ea58.svg#BasisGrotesquePro-Bold") format("svg");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:"Basis Grotesque Pro";src:url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold%20Italic/d4b94d05a5205e34fbe37e855b9270c4.eot");src:url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold%20Italic/d4b94d05a5205e34fbe37e855b9270c4.eot?#iefix") format("embedded-opentype"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold%20Italic/d4b94d05a5205e34fbe37e855b9270c4.woff2") format("woff2"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold%20Italic/d4b94d05a5205e34fbe37e855b9270c4.woff") format("woff"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold%20Italic/d4b94d05a5205e34fbe37e855b9270c4.ttf") format("truetype"),url("https://imagem.nl/wp-content/themes/imagem/assets/fonts/Basis%20Grotesque%20Pro/Basis%20Grotesque%20Pro%20Bold%20Italic/d4b94d05a5205e34fbe37e855b9270c4.svg#BasisGrotesquePro-BoldItalic") format("svg");font-weight:700;font-style:italic;font-display:swap}.p-absolute{position:absolute}.p-relative,.position-relative{position:relative}.p-fixed{position:fixed}.w-100{width:100%}.h-100{height:100%}.top-0{top:0}.bottom-0{bottom:0}.left-0{left:0}.z-1{z-index:1}.z-2{z-index:2}body,html{color:var(--color-body,#1e1e1e);font-size:var(--body-size, 18px);font-weight:var(--body-weight,400);line-height:var(--body-line-height, 1.6);text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}a,body,button,caption,div,footer,form,header,html,input,label,legend,li,p,select,span,table,textarea{font-family:var(--font-body,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif");word-break:break-word}a,a:focus,a:visited{color:var(--color-link,var(--color-2-dark,#07495a));text-decoration:none;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}a:focus:hover,a:hover,a:visited:hover{color:var(--color-link-hover,#1e1e1e);text-decoration:none}a.more:not(.button),a:focus.more:not(.button),a:visited.more:not(.button){display:inline-flex;padding:var(--button-padding,.7em 1em);padding-left:0;padding-right:1.5em;position:relative;font-weight:700;border-radius:50px;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}a.more:not(.button):after,a.more:not(.button):before,a:focus.more:not(.button):after,a:focus.more:not(.button):before,a:visited.more:not(.button):after,a:visited.more:not(.button):before{position:absolute;font-family:"Font Awesome 6 Pro";text-align:center;color:var(--color-2,#0094b5);top:50%;transform:translateY(-50%);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out}a.more:not(.button):before,a:focus.more:not(.button):before,a:visited.more:not(.button):before{content:"-";right:0}a.more:not(.button):after,a:focus.more:not(.button):after,a:visited.more:not(.button):after{content:"ï¡";right:0}a.more:not(.button):active,a.more:not(.button):focus,a.more:not(.button):focus-visible,a.more:not(.button):hover,a:focus.more:not(.button):active,a:focus.more:not(.button):focus,a:focus.more:not(.button):focus-visible,a:focus.more:not(.button):hover,a:visited.more:not(.button):active,a:visited.more:not(.button):focus,a:visited.more:not(.button):focus-visible,a:visited.more:not(.button):hover{background-color:var(--color-2-light,#82c4d4);padding:var(--button-padding,.7em 1em);padding-right:3em;color:var(--color-body,#1e1e1e)}a.more:not(.button):active:after,a.more:not(.button):active:before,a.more:not(.button):focus-visible:after,a.more:not(.button):focus-visible:before,a.more:not(.button):focus:after,a.more:not(.button):focus:before,a.more:not(.button):hover:after,a.more:not(.button):hover:before,a:focus.more:not(.button):active:after,a:focus.more:not(.button):active:before,a:focus.more:not(.button):focus-visible:after,a:focus.more:not(.button):focus-visible:before,a:focus.more:not(.button):focus:after,a:focus.more:not(.button):focus:before,a:focus.more:not(.button):hover:after,a:focus.more:not(.button):hover:before,a:visited.more:not(.button):active:after,a:visited.more:not(.button):active:before,a:visited.more:not(.button):focus-visible:after,a:visited.more:not(.button):focus-visible:before,a:visited.more:not(.button):focus:after,a:visited.more:not(.button):focus:before,a:visited.more:not(.button):hover:after,a:visited.more:not(.button):hover:before{color:var(--color-body,#1e1e1e)}a.more:not(.button):active:after,a.more:not(.button):focus-visible:after,a.more:not(.button):focus:after,a.more:not(.button):hover:after,a:focus.more:not(.button):active:after,a:focus.more:not(.button):focus-visible:after,a:focus.more:not(.button):focus:after,a:focus.more:not(.button):hover:after,a:visited.more:not(.button):active:after,a:visited.more:not(.button):focus-visible:after,a:visited.more:not(.button):focus:after,a:visited.more:not(.button):hover:after{right:1em}a.more:not(.button):active:before,a.more:not(.button):focus-visible:before,a.more:not(.button):focus:before,a.more:not(.button):hover:before,a:focus.more:not(.button):active:before,a:focus.more:not(.button):focus-visible:before,a:focus.more:not(.button):focus:before,a:focus.more:not(.button):hover:before,a:visited.more:not(.button):active:before,a:visited.more:not(.button):focus-visible:before,a:visited.more:not(.button):focus:before,a:visited.more:not(.button):hover:before{right:1.5em}.hero a.more:not(.button):after,.hero a.more:not(.button):before,.hero a:focus.more:not(.button):after,.hero a:focus.more:not(.button):before,.hero a:visited.more:not(.button):after,.hero a:visited.more:not(.button):before{display:none}.hero a.more:not(.button):active,.hero a.more:not(.button):focus,.hero a.more:not(.button):focus-visible,.hero a.more:not(.button):hover,.hero a:focus.more:not(.button):active,.hero a:focus.more:not(.button):focus,.hero a:focus.more:not(.button):focus-visible,.hero a:focus.more:not(.button):hover,.hero a:visited.more:not(.button):active,.hero a:visited.more:not(.button):focus,.hero a:visited.more:not(.button):focus-visible,.hero a:visited.more:not(.button):hover{padding-right:1em}i{color:inherit}p{margin-top:0;margin-bottom:1rem}div:not(.content)>p:last-child{margin-bottom:0!important}.title,h1,h2,h3{font-family:var(--font-title,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif");line-height:var(--title-line-height, 1.2);font-weight:var(--title-weight,700);color:var(--color-title,#1e1e1e);margin-top:0;margin-bottom:1rem}.title:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0;padding-top:0}.title:last-child,h1:last-child,h2:last-child,h3:last-child{margin-bottom:0;padding-bottom:0}.text-center{text-align:center}.font-bold{font-weight:700!important}.uppercase{text-transform:uppercase}.font-small{font-size:var(--body-size-small, 16px)}h1{font-size:calc(1.4027777769rem + 2.0625000013vw)}@media(min-width:1200px){.row:has(>[class*=col-xl-]){grid-template-columns:repeat(12,minmax(0,1fr));column-gap:2rem}:root{--bs-body-font-size:1rem}.d-xl-flex{display:flex!important}.d-xl-none{display:none!important}h1{font-size:2.7777777778rem}}.has-size-2-font-size,h2{font-size:calc(1.3472222213rem + 1.3125000013vw)}@media(min-width:1200px){.has-size-2-font-size,h2{font-size:2.2222222222rem}}.font-size-3,h3{font-size:calc(1.3194444435rem + .9375000013vw)}@media(min-width:1200px){.font-size-3,h3{font-size:1.9444444444rem}}
18.font-size-4{font-size:calc(1.263888888rem + .1875000013vw)}@media(min-width:1200px){.font-size-4{font-size:1.3888888889rem}}.font-size-5,.has-size-5-font-size{font-size:1.1111111111rem}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:calc(var(--header-height-lg,110px) + 30px)}@media(max-width:782.98px){html{scroll-padding-top:calc(var(--header-height-md,90px) + 30px)}}@media screen and (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}body{overflow-x:hidden;background-color:var(--bg-body,#fff);font-size:var(--body-size-small, 16px)}body.show-nav{overflow:hidden}@media(min-width:576px){body{font-size:var(--body-size, 18px)}}.card-item,.container,.hero{container-type:inline-size}.flex-grow{flex-grow:1}img{max-width:100%;height:auto}.clickable{position:absolute!important;top:0;right:0;bottom:0;left:0;z-index:2}#wrapper{min-height:100vh}#content-wrapper{overflow:hidden;position:relative}.overflow-hidden{overflow:hidden}.box{border-radius:var(--border-radius-lg,10px);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.content-box{position:relative;overflow:hidden;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.box-image{overflow:hidden;width:100%}.box-image img:not(.acf-icon){width:100%;height:100%!important;object-fit:cover;display:block}.box-hover{-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s;transition-property:all!important}.image-hover img{-webkit-transition:.7s;-khtms-transition:ease all 0.7s;-moz-transition:.7s;-ms-transition:.7s;-o-transition:.7s;transition:ease all .7s;transition-property:all!important}@media(max-width:575.98px){html{scroll-padding-top:calc(var(--header-height-sm,70px) + 30px)}.image-hover img{transform:none}}.image-hover:hover img{transform:scale(1.05)}.box-text{overflow:hidden}.box-text a{position:relative;z-index:2}.box-video img:not(.acf-icon){width:100%;height:100%;object-fit:cover;display:block}.section-title .more{position:relative}.section-title .more:hover:after{background-color:var(--color-2,#0094b5)}.section-title .more:after{-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s;content:"";position:absolute;bottom:5px;left:0;background-color:var(--color-1,#87ab26);height:2px;width:100%}.label{border-radius:8px;border:1px solid hsla(0,0%,100%,.7);background:hsla(0,0%,100%,.7);backdrop-filter:blur(5px);text-transform:uppercase;font-size:16px;padding:1px 10px;color:var(--color-body,#1e1e1e)}:root{--fancybox-accent-color:var(--color-1, #87AB26)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}a.skip-link{position:absolute;left:1rem;transform:translateY(calc(-100% - 1rem));background:var(--color-1,#87ab26);color:#fff;padding:.75rem 1.25rem;z-index:1000;text-decoration:none;font-weight:700;opacity:0;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}a.skip-link:focus,a.skip-link:hover{transform:translateY(1rem);opacity:1}.card-item .box-text{overflow:visible}.tile-item{position:relative}.excerpt{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.gradient-overlay{background:linear-gradient(to top,rgba(0,0,0,.7) 0,rgba(0,0,0,.55) 100%) no-repeat}.gradient-overlay:before{content:"";position:absolute;background:linear-gradient(to top,rgba(0,0,0,.55) 0,rgba(0,0,0,0) 100%) no-repeat;bottom:100%;left:0;width:100%;height:2rem}@media(min-width:992px){body.show-nav{overflow:auto}.gradient-overlay:before{height:4rem}}.gradient-overlay-top{background:linear-gradient(to top,rgba(0,0,0,.7) 0,rgba(0,0,0,.55) 100%) no-repeat}.gradient-overlay-top:before{content:"";position:absolute;background:linear-gradient(to top,rgba(0,0,0,.55) 0,rgba(0,0,0,0) 100%) no-repeat;bottom:100%;left:0;width:100%;height:2rem}.bg-shapes{background-image:url("https://imagem.nl/wp-content/themes/imagem/graphics/bg-shapes.svg");background-position:center center;background-size:cover;background-repeat:no-repeat}.media-icon{width:74px;height:74px;position:absolute;top:10px;left:10px;border-radius:50%;padding:10px}.media-icon img{display:block;width:100%!important;height:100%!important;object-fit:contain}.play-button{position:absolute;height:100%;width:100%;top:0}.play-button i{height:50px;width:50px;color:var(--color-body,#1e1e1e);border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:20px;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.box-image:hover .play-button i{background:var(--color-1,#87ab26);color:var(--color-white,#fff)}.box-image+.media-caption{color:rgba(30,30,30,.7)}#header{position:fixed;min-height:var(--header-height-lg,110px);top:0;left:0;width:100%;z-index:11;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.header-overlay #header{background:linear-gradient(to bottom,rgba(0,0,0,.55) 0,rgba(0,0,0,.55) 100%) no-repeat}.header-overlay #header:before{content:"";position:absolute;background:linear-gradient(to bottom,rgba(0,0,0,.55) 0,rgba(0,0,0,0) 100%) no-repeat;top:100%;left:0;width:100%;height:2rem}#header .header-right{min-height:var(--header-height-lg,110px)}@media(max-width:782.98px){#header{min-height:var(--header-height-md,90px)}#header .header-right{min-height:var(--header-height-md,90px)}}@media(max-width:575.98px){#header{min-height:var(--header-height-sm,70px)}#header .header-right{min-height:var(--header-height-sm,70px)}}#header .header-container{position:relative;z-index:1;background:rgba(0,0,0,0);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s;min-height:var(--header-height-lg,110px)}.header-hidden #header{transform:translateY(-100%)}#logo{display:flex;justify-content:center;flex-direction:column;height:auto;width:100%}#header #logo{height:100%}
18#logo .logo-text{fill:var(--color-white,#ffffff)!important;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}#logo .logo{width:210px;height:auto}#logo .logo img,#logo .logo svg{height:100%;width:100%;display:block}.scrolled #header,.show-nav #header,.show-search #header{z-index:13}.scrolled #header .header-container,.show-nav #header .header-container,.show-search #header .header-container{background-color:var(--header-bg,var(--color-white,#fff))}.scrolled #header:before,.show-nav #header:before,.show-search #header:before{display:none}.scrolled #logo .logo-text,.show-nav #logo .logo-text,.show-search #logo .logo-text{fill:var(--color-black,#000000)!important}:root{--menu-main-color:var(--color-white, #ffffff);--menu-main-color-active:var(--color-white, #ffffff);--menu-main-color-hover:var(--color-white, #ffffff);--menu-top-color:var(--color-white, #ffffff);--menu-top-color-active:var(--color-white, #ffffff);--menu-top-color-hover:var(--color-white, #ffffff)}.menu a{display:inline-block}.main-menu{font-family:var(--menu-main-font,var(--font-title,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif"));height:100%}.scrolled .main-menu,.show-nav .main-menu,.show-search .main-menu{--menu-main-color:var(--menu-main-color, var(--color-body, #1E1E1E));--menu-main-color-active:var(--menu-main-color-active, var(--color-body, #1E1E1E));--menu-main-color-hover:var(--menu-main-color-hover, var(--color-body, #1E1E1E))}.main-menu .megamenu{visibility:hidden;opacity:0;max-height:calc(100vh - var(--header-height-lg,110px));left:0;top:var(--header-height-lg,110px);overflow:auto;z-index:13;-webkit-box-shadow:0 40px 40px rgba(0,0,0,.1);-khtms-box-shadow:0 40px 40px rgba(0,0,0,.1);-moz-box-shadow:0 40px 40px rgba(0,0,0,.1);-ms-box-shadow:0 40px 40px rgba(0,0,0,.1);-o-box-shadow:0 40px 40px rgba(0,0,0,.1);box-shadow:0 40px 40px rgba(0,0,0,.1);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.main-menu .megamenu:hover{visibility:visible!important;opacity:1!important}@media(max-width:782.98px){#header .header-container{min-height:var(--header-height-md,90px)}#logo .logo{width:160px}.main-menu .megamenu{top:var(--header-height-md,90px);max-height:calc(100vh - var(--header-height-md,90px))}}@media(max-width:575.98px){#header .header-container{min-height:var(--header-height-sm,70px)}.main-menu .megamenu{top:var(--header-height-sm,70px);max-height:calc(100vh - var(--header-height-sm,70px))}}.main-menu .megamenu .megamenu-featured-item p{-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s;text-decoration-color:rgba(0,0,0,0)}.main-menu .megamenu .megamenu-featured-item:hover p{text-decoration:underline;text-underline-offset:5px;text-decoration-color:var(--color-body,#1E1E1E);text-decoration-thickness:1px}.main-menu .megamenu.no-transition{transition:.1s all ease!important}.main-menu>li{position:relative;padding:0 15px}.main-menu>li:last-child{padding-right:0}.main-menu>li:hover .sub-menu{visibility:visible;opacity:1}.main-menu>li:hover .megamenu{visibility:visible;opacity:1;margin-top:0;transition-delay:0s;-webkit-transition:.3s;-khtms-transition:all ease 0.3s;-moz-transition:.3s;-ms-transition:.3s;-o-transition:.3s;transition:all ease .3s}.main-menu>li:hover .megamenu:hover{visibility:visible;opacity:1}.main-menu>li.has-megamenu.force-hide-megamenu .megamenu{display:none!important}.main-menu>li>a{padding:15px 0;font-size:var(--menu-main-font-size, 18px);font-weight:var(--menu-main-font-weight,700);color:var(--menu-main-color,var(--color-body,#1e1e1e));text-transform:var(--menu-main-text-transform,none);text-decoration:underline;text-underline-offset:5px;text-decoration-thickness:2px;text-decoration-color:rgba(0,0,0,0)}.main-menu>li>a:active,.main-menu>li>a:focus,.main-menu>li>a:hover{color:var(--menu-main-color-hover,var(--color-body,#1e1e1e));text-decoration:underline;text-underline-offset:10px;text-decoration-color:var(--color-2-light,#82C4D4);text-decoration-thickness:2px}.main-menu>li.menu-item-has-children>a:after{content:"ï";font-family:"Font Awesome 6 Pro";padding-left:10px;font-size:16px}.main-menu>li .sub-menu{position:absolute;font-weight:400;font-size:18px;top:100%;left:0;visibility:hidden;opacity:0;min-width:280px;-webkit-box-shadow:0 3px 5px rgba(0,0,0,.1);
18-khtms-box-shadow:0 3px 5px rgba(0,0,0,.1);-moz-box-shadow:0 3px 5px rgba(0,0,0,.1);-ms-box-shadow:0 3px 5px rgba(0,0,0,.1);-o-box-shadow:0 3px 5px rgba(0,0,0,.1);box-shadow:0 3px 5px rgba(0,0,0,.1);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.main-menu>li .sub-menu a{background-color:var(--menu-main-submenu-bg,var(--color-white,#fff));color:var(--menu-main-submenu-color,var(--color-body,#1e1e1e));padding:10px 20px;font-size:var(--menu-main-submenu-font-size, 17px);font-family:var(--menu-main-submenu-font,var(--font-title,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif"));width:100%}.main-menu>li .sub-menu a:hover{background-color:var(--menu-main-submenu-bg-hover,var(--color-1-light,#bad978));color:var(--menu-main-submenu-color-hover,var(--color-body,#1e1e1e))}.top-menu{font-size:var(--menu-top-font-size, 16px);font-family:var(--menu-top-font,var(--font-title,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif"))}.scrolled .top-menu,.show-nav .top-menu,.show-search .top-menu{--menu-top-color:var(--menu-top-color, var(--color-body, #1E1E1E));--menu-top-color-active:var(--menu-top-color-active, var(--color-body, #1E1E1E));--menu-top-color-hover:var(--menu-top-color-hover, var(--color-body, #1E1E1E))}.top-menu>li{position:relative;padding:0 15px}.top-menu>li:last-child{padding-right:0}.top-menu>li>a{padding:5px 0;color:var(--menu-top-color,var(--color-body,#1e1e1e))}.top-menu>li>a:not(.menu-button){text-decoration:underline;color:var(--menu-top-color-hover,var(--color-body,#1e1e1e));text-underline-offset:0;text-decoration-color:rgba(130,196,212,0);text-decoration-thickness:.08em}.top-menu>li>a:not(.menu-button):hover{text-decoration:underline;text-underline-offset:5px;text-decoration-color:#82c4d4;text-decoration-thickness:.08em;color:var(--menu-top-color-hover,var(--color-body,#1e1e1e))}a.topmenu-button,button.topmenu-button{border:none;min-width:46px;border-radius:30px;background-color:color-mix(in srgb,var(--color-2-dark,#07495a),var(--color-black,#000) 20%);height:44px;padding:0 12px;line-height:44px;text-align:center;font-size:var(--menu-top-font-size, 16px);color:var(--color-white,#fff);overflow:hidden;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}a.topmenu-button:active,a.topmenu-button:focus,a.topmenu-button:focus-visible,a.topmenu-button:hover,button.topmenu-button:active,button.topmenu-button:focus,button.topmenu-button:focus-visible,button.topmenu-button:hover{background-color:var(--color-1-light,#bad978)!important;color:var(--color-body,#1e1e1e)!important;aspect-ratio:unset;padding:0 15px}a.topmenu-button:active i,a.topmenu-button:focus i,a.topmenu-button:focus-visible i,a.topmenu-button:hover i,button.topmenu-button:active i,button.topmenu-button:focus i,button.topmenu-button:focus-visible i,button.topmenu-button:hover i{color:var(--color-body,#1e1e1e)!important}a.topmenu-button:active .button-text,a.topmenu-button:focus .button-text,a.topmenu-button:focus-visible .button-text,a.topmenu-button:hover .button-text,button.topmenu-button:active .button-text,button.topmenu-button:focus .button-text,button.topmenu-button:focus-visible .button-text,button.topmenu-button:hover .button-text{visibility:visible;opacity:1;max-width:300px;white-space:nowrap;padding-right:.5rem}a.topmenu-button i,button.topmenu-button i{color:var(--color-white,#fff);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}a.topmenu-button .button-text,button.topmenu-button .button-text{position:relative;visibility:hidden;opacity:0;max-width:0;white-space:nowrap;color:var(--color-body,#1e1e1e);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.has-hero.header-dark a.topmenu-button,.has-hero.header-dark button.topmenu-button{background-color:rgba(0,0,0,.3)}
18.scrolled a.topmenu-button,.scrolled button.topmenu-button,.show-nav a.topmenu-button,.show-nav button.topmenu-button,.show-search a.topmenu-button,.show-search button.topmenu-button{background-color:var(--color-2-lighter,#eff3f6)!important}.scrolled a.topmenu-button i,.scrolled button.topmenu-button i,.show-nav a.topmenu-button i,.show-nav button.topmenu-button i,.show-search a.topmenu-button i,.show-search button.topmenu-button i{color:var(--color-body,#1e1e1e)!important}.scrolled a.topmenu-button:active,.scrolled a.topmenu-button:focus,.scrolled a.topmenu-button:focus-visible,.scrolled a.topmenu-button:hover,.scrolled button.topmenu-button:active,.scrolled button.topmenu-button:focus,.scrolled button.topmenu-button:focus-visible,.scrolled button.topmenu-button:hover,.show-nav a.topmenu-button:active,.show-nav a.topmenu-button:focus,.show-nav a.topmenu-button:focus-visible,.show-nav a.topmenu-button:hover,.show-nav button.topmenu-button:active,.show-nav button.topmenu-button:focus,.show-nav button.topmenu-button:focus-visible,.show-nav button.topmenu-button:hover,.show-search a.topmenu-button:active,.show-search a.topmenu-button:focus,.show-search a.topmenu-button:focus-visible,.show-search a.topmenu-button:hover,.show-search button.topmenu-button:active,.show-search button.topmenu-button:focus,.show-search button.topmenu-button:focus-visible,.show-search button.topmenu-button:hover{background-color:var(--color-1-light,#bad978)!important}.scrolled a.topmenu-button:active i,.scrolled a.topmenu-button:focus i,.scrolled a.topmenu-button:focus-visible i,.scrolled a.topmenu-button:hover i,.scrolled button.topmenu-button:active i,.scrolled button.topmenu-button:focus i,.scrolled button.topmenu-button:focus-visible i,.scrolled button.topmenu-button:hover i,.show-nav a.topmenu-button:active i,.show-nav a.topmenu-button:focus i,.show-nav a.topmenu-button:focus-visible i,.show-nav a.topmenu-button:hover i,.show-nav button.topmenu-button:active i,.show-nav button.topmenu-button:focus i,.show-nav button.topmenu-button:focus-visible i,.show-nav button.topmenu-button:hover i,.show-search a.topmenu-button:active i,.show-search a.topmenu-button:focus i,.show-search a.topmenu-button:focus-visible i,.show-search a.topmenu-button:hover i,.show-search button.topmenu-button:active i,.show-search button.topmenu-button:focus i,.show-search button.topmenu-button:focus-visible i,.show-search button.topmenu-button:hover i{color:var(--color-body,#1e1e1e)!important}.toggle-button{background:0 0;color:var(--menu-main-color,var(--color-body,#1e1e1e));-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.toggle-button:hover{color:var(--menu-main-color-hover,var(--color-body,#1e1e1e))}.scrolled .toggle-button,.show-nav .toggle-button,.show-search .toggle-button{--menu-main-color:var(--menu-main-color, var(--color-body, #1E1E1E));--menu-main-color-active:var(--menu-main-color-active, var(--color-body, #1E1E1E));--menu-main-color-hover:var(--menu-main-color-hover, var(--color-body, #1E1E1E))}.toggle-nav{display:flex}.toggle-nav>span{text-align:center;min-width:53px}#mobile-menu{position:fixed;z-index:15;right:-100%;width:100%;height:100%;overflow:auto;background-color:var(--menu-mobile-bg,var(--color-2-lighter,#eff3f6));top:var(--header-height-sm,70px);padding-bottom:var(--header-height-sm,70px);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}@media(min-width:783px){#mobile-menu{top:var(--header-height-md,90px);padding-bottom:var(--header-height-md,90px)}}#mobile-menu .search-form{padding:20px}.show-nav #mobile-menu{right:0}#mobile-menu .menu{padding-top:15px}#mobile-menu .menu>li>a{font-family:var(--menu-mobile-font,var(--font-title,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif"));font-size:var(--menu-mobile-font-size, 20px);
18font-weight:var(--menu-mobile-font-weight,600);text-transform:var(--menu-mobile-text-transform,none)}#mobile-menu .menu li a{text-align:center;display:block;padding:10px 40px;color:var(--menu-mobile-color,var(--color-body,#1e1e1e))}#mobile-menu .menu li:hover>a{background-color:var(--menu-mobile-bg-active,transparent);color:var(--menu-mobile-color-active,var(--color-2,#0094b5))}#mobile-menu .menu li.menu-item-has-children a{position:relative;display:flex;align-items:center;justify-content:center}#mobile-menu .menu li.menu-item-has-children a i{position:absolute;display:flex;right:0;padding:15px;align-items:center;transform:rotate(0);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}#mobile-menu .menu li.menu-item-has-children.show-sub-menu>a>i{transform:rotate(180deg)}#mobile-menu .menu li .sub-menu{display:none;margin-bottom:10px}#mobile-menu .menu li .sub-menu>li{background-color:var(--menu-mobile-submenu-bg,transparent);color:var(--menu-mobile-submenu-color,var(--color-white,#fff))}#mobile-menu .menu li .sub-menu>li>a{font-family:var(--menu-mobile-submenu-font,var(--font-title,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif"));font-size:var(--menu-mobile-submenu-font-size, 17px);font-weight:var(--menu-mobile-submenu-font-weight,400);text-transform:var(--menu-mobile-submenu-text-transform,none);padding:5px 40px}#mobile-menu .menu li .sub-menu>li:hover>a{background-color:var(--menu-mobile-submenu-bg-active,transparent);color:var(--menu-mobile-submenu-color-active,var(--color-white,#fff))}.hamburger{position:relative;overflow:hidden;margin:0;padding:0;width:22px;height:50px;background:rgba(0,0,0,0);appearance:none;box-shadow:none;border-radius:0;border:none;cursor:pointer}.hamburger:hover{background:rgba(0,0,0,0)}.hamburger:focus{outline:0}.hamburger span{display:block;position:absolute;top:50%;transform:translateY(-50%);left:0;right:0;height:3px;background:var(--menu-main-color,var(--color-body,#1e1e1e))}.hamburger span:after,.hamburger span:before{position:absolute;display:block;left:0;width:100%;height:3px;background-color:var(--menu-main-color,var(--color-body,#1e1e1e));content:""}.hamburger span:before{top:-8px}.hamburger span:after{bottom:-8px}.show-nav .hamburger-x span{background:0 0}.hamburger-x span:after,.hamburger-x span:before{transition-duration:.1s,.2s;transition-delay:.1s,0s}.show-nav .hamburger-x span:after,.show-nav .hamburger-x span:before{transition-delay:0s,.1s}.hamburger-x span:before{transition-property:top,transform}.show-nav .hamburger-x span:before{top:0;transform:rotate(45deg)}.hamburger-x span:after{transition-property:bottom,transform}.show-nav .hamburger-x span:after{bottom:0;transform:rotate(-45deg)}.hero{min-height:calc(600px - 300px);position:relative;color:var(--hero-text-color,var(--color-white,#fff));font-size:var(--hero-text-size, 19px);--button-color:var(--hero-button-color, var(--color-body, #1E1E1E));--button-bg:var(--hero-button-bg, var(--color-2-light, #82C4D4));--button-color-hover:var(--hero-button-color-hover, var(--color-body, #1E1E1E));--button-bg-hover:var(--hero-button-bg-hover, var(--color-1-light, #BAD978))}@media(min-width:783px){.hero{min-height:calc(600px - 200px)}.button:not(.acf-button):focus .more:before,.button:not(.acf-button):focus-visible .more:before,.button:not(.acf-button):hover .more:before,a.button:not(.acf-button):focus .more:before,a.button:not(.acf-button):focus-visible .more:before,a.button:not(.acf-button):hover .more:before,a:visited.button:not(.acf-button):focus .more:before,a:visited.button:not(.acf-button):focus-visible .more:before,a:visited.button:not(.acf-button):hover .more:before,input[type=button]:focus .more:before,input[type=button]:focus-visible .more:before,input[type=button]:hover .more:before,input[type=submit]:focus .more:before,input[type=submit]:focus-visible .more:before,input[type=submit]:hover .more:before{left:100%}.button:not(.acf-button):focus .more:after,.button:not(.acf-button):focus-visible .more:after,.button:not(.acf-button):hover .more:after,a.button:not(.acf-button):focus .more:after,a.button:not(.acf-button):focus-visible .more:after,a.button:not(.acf-button):hover .more:after,a:visited.button:not(.acf-button):focus .more:after,a:visited.button:not(.acf-button):focus-visible .more:after,a:visited.button:not(.acf-button):hover .more:after,input[type=button]:focus .more:after,input[type=button]:focus-visible .more:after,input[type=button]:hover .more:after,input[type=submit]:focus .more:after,input[type=submit]:focus-visible .more:after,input[type=submit]:hover .more:after{right:0}}.hero#hero-frontpage{min-height:calc(80vh - 100px)}.hero .hero-title{color:var(--hero-title-color,var(--color-white,#fff));font-size:calc(1.3916666658rem + 1.9125000013vw)}@media(min-width:1200px){.toggle-nav{display:none}.hero .hero-title{font-size:2.6666666667rem}}.hero a:not([itemprop=item]){color:var(--hero-link-color,var(--color-white,#fff));font-weight:700;font-size:var(--hero-text-size, 19px);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.hero img{position:absolute;top:0;left:0;display:block;object-fit:cover;width:100%;height:100%}.hero .hero-links a.more:active,.hero .hero-links a.more:focus,.hero .hero-links a.more:focus-visible,.hero .hero-links a.more:hover{background-color:hsla(0,0%,100%,.7)}.hero .hero-video{top:0;left:0;z-index:1;opacity:0;-webkit-transition:opacity 1s ease-in-out;-khtms-transition:opacity 1s ease-in-out;-moz-transition:opacity 1s ease-in-out;-ms-transition:opacity 1s ease-in-out;-o-transition:opacity 1s ease-in-out;transition:opacity 1s ease-in-out}.hero .hero-video.is-loaded{opacity:1}.hero .hero-video .video-container{position:absolute;padding-top:56.25%;height:100%;width:auto;top:50%;left:50%;transform:translate(-50%,-50%);aspect-ratio:16/9}.hero .hero-video .video-container iframe{position:absolute;top:0;left:0;height:100%;width:100%;border:0}.content{word-wrap:break-word;position:relative}.content p:last-child{margin-bottom:0}.content.page-content>:first-child:not(.has-background){margin-top:2rem!important}.content.page-content>:last-child:not(.has-background){margin-bottom:3rem!important}.content ul:not([class]){display:block;margin:1rem 0;list-style-type:none}.content ul:not([class]) li{padding-left:1.5rem;position:relative}.content ul:not([class]) li:before{content:"";position:absolute;
18left:0;height:8px;width:8px;border-radius:2px;background-color:var(--color-1,#87ab26);top:.5em}.content ul:not([class]) li:last-child{margin-bottom:0}.content p:has(.toggle-read-more)+*{display:none}.content h1:first-child,.content h2:first-child,.content h3:first-child{margin-top:0}.content h1:last-child,.content h2:last-child,.content h3:last-child{margin-bottom:0}.content a:not([class]),.content a:not([class]):focus,.content a:not([class]):visited{text-decoration:underline}.content a:not([class]):focus:hover,.content a:not([class]):hover,.content a:not([class]):visited:hover{text-decoration:underline;text-decoration-color:var(--color-2,#0094B5)}.content img{max-width:100%;height:auto}.content iframe{max-width:100%}#footer{transition:none!important;background:var(--footer-bg,var(--color-white,#fff));color:var(--footer-color,var(--color-body,#1e1e1e));border-top:1px solid var(--color-2-lighter,#eff3f6)}#footer h1,#footer h2,#footer h3{color:var(--footer-color,var(--color-body,#1e1e1e))}#footer .title{font-weight:700;color:var(--footer-color,var(--color-body,#1e1e1e))}#footer ul li>a:not(.go-to-item):not(.button){display:inline-block;padding:5px 0}#footer a:not(.go-to-item):not(.button){color:var(--footer-link-color,var(--color-body,#1e1e1e));text-decoration:underline;text-underline-offset:0;text-decoration-color:rgba(30,30,30,0);text-decoration-thickness:.08em}#footer a:not(.go-to-item):not(.button):hover{text-decoration:underline;text-underline-offset:2px;text-decoration-color:#1e1e1e;text-decoration-thickness:.08em}#footer p{margin-bottom:10px}#footer #footer-bottom{padding:25px 0}.wp-block-columns{display:flex;row-gap:3rem!important;column-gap:2rem!important;margin-bottom:4rem;margin-top:4rem}@media(max-width:575.98px){#footer #footer-bottom{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}#footer #footer-bottom .footer-bottom-left{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important;width:100%}#footer #footer-bottom .footer-bottom-right{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important;width:100%}.wp-block-columns{flex-wrap:wrap!important;column-gap:2rem;row-gap:2rem;margin-bottom:2rem;margin-top:2rem}}.wp-block-columns.has-background{padding:2rem;border-radius:var(--border-radius-lg,10px)}@media(min-width:992px){.gradient-overlay-top:before{height:4rem}.header-overlay #header:before{height:4rem}#mobile-menu{top:var(--header-height-lg,110px);padding-bottom:var(--header-height-lg,110px)}.hero{min-height:var(--hero-height,600px)}.hero#hero-frontpage{min-height:var(--hero-height-home,80vh)}.content.page-content>:first-child:not(.has-background){margin-top:2.5rem!important}.wp-block-columns.has-background{padding:3rem}}.wp-block-columns .wp-block-column{padding-left:0;padding-right:0;margin:0;width:100%}.wp-block-columns .wp-block-column.has-background{padding:2rem;border-radius:var(--border-radius-lg,10px)}.wp-block-columns .wp-block-column>:first-child{margin-top:0!important}.wp-block-columns .wp-block-column>:last-child{margin-bottom:0!important}@media(max-width:782.98px){.wp-block-columns.has-2-columns{flex-direction:column;width:100%;flex-basis:100%!important;margin-left:0!important}}@media(max-width:991.98px){.wp-block-columns.has-4-columns{flex-wrap:wrap!important}}@media(max-width:782.98px){.wp-block-columns.has-4-columns{flex-direction:column}}@media(max-width:991.98px){.wp-block-columns.has-4-columns .wp-block-column{width:calc(50% - 2rem/2);flex-basis:calc(50% - 2rem/2)!important;margin-left:0!important}.wp-block-columns.has-4-columns .wp-block-column:first-child{margin-top:0!important}.wp-block-columns.has-4-columns .wp-block-column:last-child{margin-bottom:0!important}}@media(max-width:782.98px){.wp-block-columns.has-4-columns .wp-block-column{width:100%;flex-basis:100%!important}.wp-block-columns.has-4-columns .wp-block-column:nth-child(3),.wp-block-columns.has-4-columns .wp-block-column:nth-child(4){margin-top:0!important}}h1+.wp-block-columns,h2+.wp-block-columns,h3+.wp-block-columns{margin-top:1rem}h1+.content-block,h1+.wp-block-columns{margin-top:1.5rem}ul.wp-block-gallery{display:flex!important;flex-wrap:wrap;list-style-type:none!important;padding:0;margin:0}ul.wp-block-gallery li{padding-left:0!important;margin-bottom:16px!important;position:relative}ul.wp-block-gallery li:before{content:""!important;display:none!important}.wp-block-heading{margin-top:2rem}.wp-block-heading.has-size-2-font-size{font-size:var(--font-size-2, 40px)}.wp-block-heading.has-size-5-font-size{font-size:var(--font-size-5, 20px)}h1.wp-block-heading{font-size:var(--font-size-1, 50px)}
18h2.wp-block-heading{font-size:var(--font-size-3, 35px)}h3.wp-block-heading{font-size:var(--font-size-4, 25px)}.content-block{position:relative;margin-top:4rem;margin-bottom:4rem}.content-block.has-background{padding:3rem 0}@media(min-width:992px){.wp-block-columns .wp-block-column.has-background{padding:3rem}.content-block.has-background{padding:4rem 0}}.content-block.has-background+.has-background{margin-top:0!important}.content-block.has-background:first-child{margin-top:0!important}.content-block.has-background:last-child{margin-bottom:0!important}.content-block .bg-full{width:100vw;position:absolute;top:0;bottom:0;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw}.content-block .bg-full img{width:100%;height:100%;object-fit:cover;display:block}h1+.content-block,h2+.content-block,h3+.content-block{margin-top:2rem!important}.button:not(.acf-button),a.button:not(.acf-button),a:visited.button:not(.acf-button),input[type=button],input[type=submit]{display:inline-flex;position:relative;border:none!important;padding:var(--button-padding,.7em 1em);cursor:pointer;z-index:1;background-color:var(--button-bg,var(--color-2-light,#82c4d4));color:var(--button-color,var(--color-body,#1e1e1e));font-family:var(--button-font,var(--font-title,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif"));border-radius:var(--button-border-radius,50px);font-weight:var(--button-weight,700);text-decoration:none;line-height:var(--button-size, 1);gap:1rem;align-items:center;font-size:var(--button-size, 19px);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.button:not(.acf-button):focus,.button:not(.acf-button):focus-visible,.button:not(.acf-button):hover,a.button:not(.acf-button):focus,a.button:not(.acf-button):focus-visible,a.button:not(.acf-button):hover,a:visited.button:not(.acf-button):focus,a:visited.button:not(.acf-button):focus-visible,a:visited.button:not(.acf-button):hover,input[type=button]:focus,input[type=button]:focus-visible,input[type=button]:hover,input[type=submit]:focus,input[type=submit]:focus-visible,input[type=submit]:hover{text-decoration:none;background:var(--button-bg-hover,var(--color-1-light,#bad978));color:var(--button-color-hover,var(--color-body,#1e1e1e))}.button:not(.acf-button):focus .more:before,.button:not(.acf-button):focus-visible .more:before,.button:not(.acf-button):hover .more:before,a.button:not(.acf-button):focus .more:before,a.button:not(.acf-button):focus-visible .more:before,a.button:not(.acf-button):hover .more:before,a:visited.button:not(.acf-button):focus .more:before,a:visited.button:not(.acf-button):focus-visible .more:before,a:visited.button:not(.acf-button):hover .more:before,input[type=button]:focus .more:before,input[type=button]:focus-visible .more:before,input[type=button]:hover .more:before,input[type=submit]:focus .more:before,input[type=submit]:focus-visible .more:before,input[type=submit]:hover .more:before{background-color:var(--color-body,#1e1e1e);color:var(--color-white,#fff)}.button:not(.acf-button) .more,a.button:not(.acf-button) .more,a:visited.button:not(.acf-button) .more,input[type=button] .more,input[type=submit] .more{background-color:color-mix(in srgb,var(--button-bg,var(--color-2-light,#82c4d4)),var(--color-black,#000) 10%);position:relative;aspect-ratio:1;border-radius:50%;overflow:hidden;width:35px;height:35px}.button:not(.acf-button) .more:after,.button:not(.acf-button) .more:before,a.button:not(.acf-button) .more:after,a.button:not(.acf-button) .more:before,a:visited.button:not(.acf-button) .more:after,a:visited.button:not(.acf-button) .more:before,input[type=button] .more:after,input[type=button] .more:before,input[type=submit] .more:after,input[type=submit] .more:before{content:"ï¡";font-family:"Font Awesome 6 Pro";position:absolute;width:35px;line-height:35px;text-align:center;color:var(--color-body,#1e1e1e);border-radius:50%;top:0;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.button:not(.acf-button) .more:before,a.button:not(.acf-button) .more:before,a:visited.button:not(.acf-button) .more:before,input[type=button] .more:before,input[type=submit] .more:before{left:0}.button:not(.acf-button) .more:after,a.button:not(.acf-button) .more:after,a:visited.button:not(.acf-button) .more:after,input[type=button] .more:after,input[type=submit] .more:after{right:100%;background-color:var(--color-body,#1e1e1e);color:var(--color-white,#fff)}.button:not(.acf-button).bg-2-light,a.button:not(.acf-button).bg-2-light,a:visited.button:not(.acf-button).bg-2-light,input[type=button].bg-2-light,input[type=submit].bg-2-light{--button-bg:var(--color-2-light, #82C4D4)!important;--button-color:var(--color-body, #1E1E1E)!important;--button-bg-hover:color-mix(in srgb, var(--color-2-light, #82C4D4), var(--color-black, #000000) 10%)!important;--button-color-hover:var(--color-link-hover, #1E1E1E)!important}.button:not(.acf-button).bg-2-lighter,a.button:not(.acf-button).bg-2-lighter,a:visited.button:not(.acf-button).bg-2-lighter,input[type=button].bg-2-lighter,input[type=submit].bg-2-lighter{--button-bg:var(--color-2-lighter, #EFF3F6)!important;--button-color:var(--color-body, #1E1E1E)!important;--button-bg-hover:color-mix(in srgb, var(--color-2-lighter, #EFF3F6), var(--color-black, #000000) 10%)!important;--button-color-hover:var(--color-link-hover, #1E1E1E)!important}.button:not(.acf-button).bg-2-dark,a.button:not(.acf-button).bg-2-dark,a:visited.button:not(.acf-button).bg-2-dark,input[type=button].bg-2-dark,input[type=submit].bg-2-dark{--button-bg:var(--color-2-dark, #07495A)!important;--button-color:var(--color-white, #ffffff)!important;--button-bg-hover:color-mix(in srgb, var(--color-2-dark, #07495A), var(--color-white, #ffffff) 10%)!important;--button-color-hover:var(--color-link-hover, #1E1E1E)!important}.button:not(.acf-button).bg-image,a.button:not(.acf-button).bg-image,a:visited.button:not(.acf-button).bg-image,input[type=button].bg-image,input[type=submit].bg-image{--button-bg:transparent!important;--button-color:var(--color-white, #ffffff)!important;--button-color-hover:var(--color-white, #ffffff)!important}.button:not(.acf-button).bg-white,a.button:not(.acf-button).bg-white,a:visited.button:not(.acf-button).bg-white,input[type=button].bg-white,input[type=submit].bg-white{--button-bg:var(--color-white, #ffffff)!important;--button-color:var(--color-body, #1E1E1E)!important;--button-color-hover:var(--color-link-hover, #1E1E1E)!important}.button:not(.acf-button).bg-white-blur,a.button:not(.acf-button).bg-white-blur,a:visited.button:not(.acf-button).bg-white-blur,input[type=button].bg-white-blur,input[type=submit].bg-white-blur{--button-bg:var(--color-white-blur, rgba(255, 255, 255, 0.7))!important;--button-color:var(--color-body, #1E1E1E)!important;--button-color-hover:var(--color-link-hover, #1E1E1E)!important}.button:not(.acf-button).bg-black,a.button:not(.acf-button).bg-black,a:visited.button:not(.acf-button).bg-black,input[type=button].bg-black,input[type=submit].bg-black{--button-bg:var(--color-black, #000000)!important;--button-color:var(--color-white, #ffffff)!important;--button-bg-hover:var(--color-black, #000000)!important;--button-color-hover:var(--color-white, #ffffff)!important}
18button{cursor:pointer}.toggle-button{border:0;background:0 0}.swiper-slider{height:100%}.swiper-slider .swiper-container{position:relative;overflow:hidden}.swiper-slider .swiper-wrapper{z-index:0}.swiper-slider .swiper-slide{display:flex;height:auto}.swiper-slider .swiper-slide img{display:block}.swiper-slider .swiper-lazy{opacity:0;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.swiper-slider .swiper-lazy.lazyloaded,.swiper-slider .swiper-lazy.swiper-lazy-loaded{opacity:1}.swiper-slider .slider-footer{margin-top:2rem}.swiper-slider .swiper-pagination{display:flex;justify-content:center;position:relative;bottom:0!important;border-radius:0;overflow:hidden}.swiper-slider .swiper-pagination .swiper-pagination-bullet{width:25px;gap:15px;height:10px;opacity:1;border-radius:30px;cursor:pointer;background:rgba(0,148,181,.1);position:relative;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.swiper-slider .swiper-pagination .swiper-pagination-bullet:before{content:"";width:100%;height:100%;position:absolute;border-radius:30px}.swiper-slider .swiper-pagination .swiper-pagination-bullet-active{background:rgba(0,148,181,.1);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.swiper-slider .swiper-pagination .swiper-pagination-bullet-active:before{background:rgba(0,148,181,.7)}@keyframes pagination-next{from{right:100%}to{right:0}}@keyframes pagination-prev{from{right:-100%}to{right:0}}.swiper-slider .swiper-pagination.slide-next .swiper-pagination-bullet:before{right:100%;background:rgba(0,0,0,0)}.swiper-slider .swiper-pagination.slide-next .swiper-pagination-bullet-active:before{animation-name:pagination-next;animation-duration:.3s;animation-fill-mode:forwards;background:rgba(0,148,181,.7)}.swiper-slider .swiper-pagination.slide-prev .swiper-pagination-bullet:before{right:-100%;background:rgba(0,0,0,0)}.swiper-slider .swiper-pagination.slide-prev .swiper-pagination-bullet-active:before{animation-name:pagination-prev;animation-duration:.3s;animation-fill-mode:forwards;background:rgba(0,148,181,.7)}.swiper-slider .slider-footer{width:100%}.swiper-slider .swiper-next,.swiper-slider .swiper-prev{position:absolute;height:44px;width:44px;text-align:center;line-height:44px!important;border-radius:50%;background-color:rgba(0,0,0,.55);color:var(--color-white,#fff);cursor:pointer;z-index:10;top:40%;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.swiper-slider .swiper-next.swiper-button-disabled,.swiper-slider .swiper-prev.swiper-button-disabled{opacity:.5;cursor:no-drop}.swiper-slider .swiper-next:active,.swiper-slider .swiper-next:hover,.swiper-slider .swiper-prev:active,.swiper-slider .swiper-prev:hover{background-color:var(--color-1-light,#bad978);color:var(--color-body,#1e1e1e)}.swiper-slider .swiper-next:after,.swiper-slider .swiper-prev:after{font-family:"Font Awesome 6 Pro";font-weight:300;font-size:24px}.swiper-slider .swiper-prev{left:10px}.swiper-slider .swiper-prev:after{content:"ï";font-weight:400}.swiper-slider .swiper-next{right:10px}.swiper-slider .swiper-next:after{content:"ï";font-weight:400}.swiper-slider.section-slider .swiper-container{overflow:visible}.swiper-slider.section-slider .swiper-next,.swiper-slider.section-slider .swiper-prev{background-color:var(--color-2-light,#82c4d4);color:var(--color-body,#1e1e1e);top:calc(50% - (10px + 2rem));position:absolute;left:auto;right:50%;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}
18.swiper-slider.section-slider .swiper-next:hover,.swiper-slider.section-slider .swiper-prev:hover{background-color:var(--color-1-light,#bad978);color:var(--color-body,#1e1e1e)}.swiper-slider.section-slider .swiper-next:after,.swiper-slider.section-slider .swiper-prev:after{font-family:"Font Awesome 6 Pro";font-weight:300}.swiper-slider.section-slider .swiper-next{transform:translate(calc(50vw - 10px),60%)}@media(min-width:783px){.swiper-slider.section-slider .swiper-next{transform:translate(calc(50vw - 20px),60%)}}.swiper-slider.section-slider .swiper-next:after{content:"ï
";font-weight:400}.swiper-slider.section-slider .swiper-prev{transform:translate(calc(50vw - 10px),-60%)}.swiper-slider.section-slider .swiper-prev:after{content:"ï";font-weight:400}.swiper-slider.section-slider .slider-overlay{position:absolute;height:100%;width:calc((100vw - 100%)/ 2);top:0;z-index:1}.swiper-slider.section-slider .slider-overlay.slider-overlay-left{right:100%;background:linear-gradient(-90deg,transparent,var(--bg-body,#fff) 300px,var(--bg-body,#fff) 100%)}.swiper-slider.section-slider .slider-overlay.slider-overlay-right{left:100%;background:linear-gradient(90deg,transparent,var(--bg-body,#fff) 300px,var(--bg-body,#fff) 100%)}.swiper-slider .swiper-pagination-lock{display:none!important;margin-top:0}.bg-2-light .slider-overlay-left{background:linear-gradient(-90deg,transparent,var(--color-2-light,#82c4d4) 300px,var(--color-2-light,#82c4d4) 100%)!important}.bg-2-light .slider-overlay-right{background:linear-gradient(90deg,transparent,var(--color-2-light,#82c4d4) 300px,var(--color-2-light,#82c4d4) 100%)!important}.bg-2-lighter .slider-overlay-left{background:linear-gradient(-90deg,transparent,var(--color-2-lighter,#eff3f6) 300px,var(--color-2-lighter,#eff3f6) 100%)!important}.bg-2-lighter .slider-overlay-right{background:linear-gradient(90deg,transparent,var(--color-2-lighter,#eff3f6) 300px,var(--color-2-lighter,#eff3f6) 100%)!important}.bg-2-dark .slider-overlay-left{background:linear-gradient(-90deg,transparent,var(--color-2-dark,#07495a) 300px,var(--color-2-dark,#07495a) 100%)!important}.bg-2-dark .slider-overlay-right{background:linear-gradient(90deg,transparent,var(--color-2-dark,#07495a) 300px,var(--color-2-dark,#07495a) 100%)!important}.bg-image .slider-overlay-left{background:linear-gradient(-90deg,transparent,transparent 300px,transparent 100%)!important}.bg-image .slider-overlay-right{background:linear-gradient(90deg,transparent,transparent 300px,transparent 100%)!important}.bg-white .slider-overlay-left{background:linear-gradient(-90deg,transparent,var(--color-white,#fff) 300px,var(--color-white,#fff) 100%)!important}.bg-white .slider-overlay-right{background:linear-gradient(90deg,transparent,var(--color-white,#fff) 300px,var(--color-white,#fff) 100%)!important}.bg-white-blur .slider-overlay-left{background:linear-gradient(-90deg,transparent,var(--color-white-blur,rgba(255,255,255,.7)) 300px,var(--color-white-blur,rgba(255,255,255,.7)) 100%)!important}.bg-white-blur .slider-overlay-right{background:linear-gradient(90deg,transparent,var(--color-white-blur,rgba(255,255,255,.7)) 300px,var(--color-white-blur,rgba(255,255,255,.7)) 100%)!important}.bg-black .slider-overlay-left{background:linear-gradient(-90deg,transparent,var(--color-black,#000) 300px,var(--color-black,#000) 100%)!important}.bg-black .slider-overlay-right{background:linear-gradient(90deg,transparent,var(--color-black,#000) 300px,var(--color-black,#000) 100%)!important}input[type=email],input[type=text]{background-color:var(--color-white,#fff);border:1px solid transparent;border-radius:var(--border-radius-sm,8px);padding:.75rem;width:100%;-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}input[type=email]:focus,input[type=text]:focus{border-color:var(--color-1,#87ab26);outline:0;box-shadow:none}fieldset{border:none}label{margin-bottom:.5rem;display:block}.mc4wp-form p{margin-bottom:.5rem}.mc4wp-form input[type=email],.mc4wp-form input[type=text]{border-color:var(--color-grey-light,#c6c7c8)}.mc4wp-form input[type=submit]{width:100%}
18.card-item{position:relative}#filters{position:relative;font-family:var(--font-body,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif")!important;flex-wrap:wrap}#filters ::-webkit-input-placeholder{color:var(--color-meta,#87888a)!important}#filters ::-moz-placeholder{color:var(--color-meta,#87888a)!important}#filters :-ms-input-placeholder{color:var(--color-meta,#87888a)!important}#filters :-moz-placeholder{color:var(--color-meta,#87888a)!important}#filters .button{height:50px;line-height:50px;padding:0 1em;font-size:var(--body-size, 18px)}#filters input[type=search]{font-family:var(--font-body,"Basis Grotesque Pro","Helvetica Neue","Arial","sans-serif")!important;font-size:var(--body-size, 18px);min-height:50px;border:1px solid transparent;width:100%;border-radius:var(--border-radius-sm,8px);-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}#filters input[type=search]:focus,#filters input[type=search]:hover{outline:0;border-color:var(--color-2,#0094b5)}.socials-go-to-container{gap:.5rem;flex-wrap:wrap}@media(max-width:575.98px){.socials-go-to-container{justify-content:center}}.socials-go-to-container a{background-color:var(--social-bg,var(--color-2-lighter,#eff3f6));color:var(--social-color,var(--color-body,#1e1e1e))!important;border-radius:var(--social-border-radius,50%);height:var(--social-size,50px);width:var(--social-size,50px);font-size:calc(var(--social-size, 50px)*.5);display:flex;align-items:center;justify-content:center;text-decoration:none!important}.socials-go-to-container a:hover{background:var(--social-bg-hover,var(--color-2-light,#82c4d4))!important;color:var(--social-color-hover,var(--color-body,#1e1e1e))!important;text-decoration:none!important;-webkit-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);-khtms-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);-moz-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);-ms-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);-o-box-shadow:0 2px 10px 0 rgba(0,0,0,.2);box-shadow:0 2px 10px 0 rgba(0,0,0,.2)}.socials-go-to-container a i{text-decoration:none!important}.header-search-bar{position:absolute;left:0;top:100%;width:100%;height:100%;transform:translateY(-100%);opacity:0;background-color:var(--searchbar-bg,var(--color-2-lighter,#eff3f6));-webkit-transition:.2s ease-in-out;-khtms-transition:all 0.2s ease-in-out 0s;-moz-transition:.2s ease-in-out;-ms-transition:.2s ease-in-out;-o-transition:.2s ease-in-out;transition:all .2s ease-in-out 0s}.show-search .header-search-bar{opacity:1;transform:translateY(0);z-index:1}.search-form{margin:auto;position:relative;width:100%}#mobile-menu .search-form{margin:0 auto;padding:0}.search-form label{display:none}.search-form input{height:50px;line-height:50px;width:100%;padding:0 75px 0 15px;border-radius:var(--border-radius-sm,8px);border:1px solid transparent;background-color:var(--color-white,#fff)}.search-form input::-webkit-input-placeholder{color:var(--color-meta,#87888a)}.search-form input:-moz-placeholder{color:var(--color-meta,#87888a)}.search-form input::-moz-placeholder{color:var(--color-meta,#87888a)}.search-form input:-ms-input-placeholder{color:var(--color-meta,#87888a)}.search-form button{position:absolute;right:0;top:0;bottom:0;border:none;border-radius:0 var(--border-radius-sm,8px) var(--border-radius-sm,8px) 0;padding:0;min-width:60px}#search-bar .search-form{max-width:400px}.header-padding{padding-top:var(--header-height-sm,70px)}@media(min-width:783px){.swiper-slider.section-slider .swiper-prev{transform:translate(calc(50vw - 20px),-60%)}.header-padding{padding-top:var(--header-height-md,90px)}}.max-block-cta .img-fill .box-image{height:100%}.max-block-cta .content-block{margin:0}.max-block-cta ul{display:flex;margin-top:1.5rem;margin-bottom:1.5rem;flex-direction:column;gap:1rem}.max-block-cta ul li{position:relative;padding-left:1.5rem;margin:0}.max-block-cta ul li:before{content:"";width:8px;height:8px;position:absolute;font-weight:700;left:0;font-size:20px;background:var(--color-1,#87ab26);top:.55em}#footer .max-block-media img{width:auto;max-width:100%}.max-block-slider-blocks{--block-width:calc(50% + 20px);--full-width:calc(var(--block-width) + 100%);--rest-width:calc((100vw - var(--full-width)) / 2);--overlay-width:calc(var(--block-width) + var(--rest-width))}
18.max-block-slider-blocks .swiper-slider.section-slider{position:relative}@media(min-width:992px){.header-padding{padding-top:var(--header-height-lg,110px)}.max-block-slider-blocks .swiper-slider.section-slider .swiper-container{overflow:hidden}}.max-block-slider-blocks .swiper-slider.section-slider .slider-overlay{position:absolute;height:100%;width:var(--overlay-width);top:0;z-index:1}.max-block-slider-blocks .swiper-slider.section-slider .swiper-next{transform:translate(calc(50vw - 10px),60%)}@media(min-width:783px){.max-block-slider-blocks .swiper-slider.section-slider .swiper-next{right:0;left:auto;transform:translate(50%,60%)}}.max-block-slider-blocks .swiper-slider.section-slider .swiper-prev{transform:translate(calc(50vw - 10px),-60%)}.max-block-slider-blocks .swiper-slider.section-slider .swiper-pagination .swiper-pagination-bullet{background-color:hsla(0,0%,100%,.25)}.max-block-slider-blocks .tile-blocks:hover .box-image img{transform:scale(1.1)}.max-block-slider-blocks .tile-blocks img{-webkit-transition:.5s ease-out;-khtms-transition:0.5s ease-out all;-moz-transition:.5s ease-out;-ms-transition:.5s ease-out;-o-transition:.5s ease-out;transition:.5s ease-out all}.max-block-slider-blocks .tile-item .gradient-overlay-top{-webkit-transition:.5s ease-out;-khtms-transition:0.5s ease-out all;-moz-transition:.5s ease-out;-ms-transition:.5s ease-out;-o-transition:.5s ease-out;transition:.5s ease-out all}.max-block-slider-blocks .tile-item .tile-text{max-height:500px;overflow:hidden;-webkit-transition:.5s ease-out;-khtms-transition:0.5s ease-out all;-moz-transition:.5s ease-out;-ms-transition:.5s ease-out;-o-transition:.5s ease-out;transition:.5s ease-out all;opacity:1}.max-block-ctafull{min-height:600px}.max-block-ctafull img{width:100%;height:100%}.max-block-ctafull .ctafull-content{z-index:2}.max-block-ctafull .card-item{position:relative}@media(min-width:783px){.max-block-slider-blocks .swiper-slider.section-slider .swiper-prev{right:0;left:auto;transform:translate(50%,-60%)}.max-block-slider-blocks .tile-item .tile-text{max-height:0;opacity:0}
18.max-block-slider-blocks .tile-item:hover .tile-text{max-height:500px;opacity:1}.max-block-ctafull .card-item{position:absolute;bottom:0;width:100%;height:auto}}input[type=checkbox].cmplz-category{width:initial;-webkit-appearance:checkbox}input[type=checkbox].cmplz-category:checked::before{content:''}.cmplz-cookiebanner{box-sizing:border-box}:root{--cmplz_banner_width:526px;--cmplz_banner_background_color:#eff3f6;--cmplz_banner_border_color:#eff3f6;--cmplz_banner_border_width:0px 0px 0px 0px;--cmplz_banner_border_radius:12px 12px 12px 12px;--cmplz_banner_margin:10px;--cmplz_categories-height:216px;--cmplz_title_font_size:15px;--cmplz_text_line_height:calc(var(--cmplz_text_font_size) * 1.5);--cmplz_text_color:#222222;--cmplz_hyperlink_color:#1E73BE;--cmplz_text_font_size:12px;--cmplz_link_font_size:12px;--cmplz_category_body_font_size:12px;--cmplz_button_accept_background_color:#82c4d4;--cmplz_button_accept_border_color:#82c4d4;--cmplz_button_accept_text_color:#000000;--cmplz_button_deny_background_color:#eff3f6;--cmplz_button_deny_border_color:#82c4d4;--cmplz_button_deny_text_color:#222222;--cmplz_button_settings_background_color:#eff3f6;--cmplz_button_settings_border_color:#82c4d4;--cmplz_button_settings_text_color:#333333;--cmplz_button_border_radius:50px 50px 50px 50px;--cmplz_button_font_size:15px;--cmplz_category_header_always_active_color:green;--cmplz_category_header_title_font_size:14px;--cmplz_category_header_active_font_size:12px;--cmplz-manage-consent-height:50px;--cmplz-manage-consent-offset:-35px;--cmplz_slider_active_color:#1e73be;--cmplz_slider_inactive_color:#F56E28;--cmplz_slider_bullet_color:#ffffff}body.cmplz-banner-active :not(.cmplz-cookiebanner):not(.cmplz-cookiebanner *){pointer-events:none!important;user-select:none!important}.cmplz-cookiebanner *{pointer-events:auto!important;user-select:auto!important}#cmplz-manage-consent .cmplz-manage-consent{margin:unset;z-index:9998;color:var(--cmplz_text_color);background-color:var(--cmplz_banner_background_color);border-style:solid;border-color:var(--cmplz_banner_border_color);border-width:var(--cmplz_banner_border_width);border-radius:var(--cmplz_banner_border_radius);border-bottom-left-radius:0;border-bottom-right-radius:0;line-height:initial;position:fixed;bottom:var(--cmplz-manage-consent-offset);min-width:100px;height:var(--cmplz-manage-consent-height);right:40px;padding:15px;cursor:pointer;animation:.5s forwards mc_slideOut}#cmplz-manage-consent .cmplz-manage-consent:active{outline:0;border:none}#cmplz-manage-consent .cmplz-manage-consent.cmplz-dismissed{display:none}#cmplz-manage-consent .cmplz-manage-consent:focus,#cmplz-manage-consent .cmplz-manage-consent:hover{animation:.5s forwards mc_slideIn;animation-delay:0}@-webkit-keyframes mc_slideIn{100%{bottom:0}}@keyframes mc_slideIn{100%{bottom:0}}@-webkit-keyframes mc_slideOut{100%{bottom:var(--cmplz-manage-consent-offset)}}@keyframes mc_slideOut{100%{bottom:var(--cmplz-manage-consent-offset)}}.cmplz-cookiebanner{max-height:calc(100vh - 20px);overflow-y:auto;position:fixed;height:auto;left:50%;top:50%;-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);grid-template-rows:minmax(0,1fr);z-index:99999;background:var(--cmplz_banner_background_color)}.cmplz-cookiebanner a{transition:initial}.cmplz-cookiebanner .cmplz-buttons a.cmplz-btn.tcf{display:none}.cmplz-cookiebanner.cmplz-dismissed{display:none}.cmplz-cookiebanner .cmplz-body{width:100%;grid-column:span 3;overflow-y:auto;overflow-x:hidden;max-height:55vh}.cmplz-cookiebanner .cmplz-body::-webkit-scrollbar-track{border-radius:10px;-webkit-box-shadow:inset 0 0 2px transparent;background-color:transparent}.cmplz-cookiebanner .cmplz-body::-webkit-scrollbar{width:5px;background-color:transparent}.cmplz-cookiebanner .cmplz-body::-webkit-scrollbar-thumb{background-color:var(--cmplz_button_accept_background_color);border-radius:10px}@media (min-width:350px){.cmplz-cookiebanner .cmplz-body{min-width:300px}}@media (max-height:400px){.cmplz-cookiebanner{height:calc(100vh - 20px);display:flex;flex-direction:column;overflow:hidden;gap:1px;grid-row-gap:1px;padding:7px 12px!important;zoom:0.6}.cmplz-cookiebanner .cmplz-body{flex:1;min-height:0;overflow-y:auto;max-height:none;margin-top:15px!important}.cmplz-cookiebanner .cmplz-buttons,.cmplz-cookiebanner .cmplz-divider,.cmplz-cookiebanner .cmplz-documents,.cmplz-cookiebanner .cmplz-header,.cmplz-cookiebanner .cmplz-links{flex-shrink:0}.cmplz-cookiebanner .cmplz-header{margin-bottom:15px!important;max-height:10px}.cmplz-close{zoom:0.6!important}.cmplz-cookiebanner .cmplz-buttons{gap:1px!important}.cmplz-cookiebanner .cmplz-buttons .cmplz-btn{height:15vh!important;min-height:unset!important;padding:0!important;white-space:nowrap!important;font-size:1.1rem!important;line-height:14px!important;zoom:0.5!important}.cmplz-cookiebanner .cmplz-documents,.cmplz-cookiebanner .cmplz-information{zoom:0.5!important}}@media (max-height:400px) and (max-width:768px){.cmplz-cookiebanner{gap:1px}}.cmplz-cookiebanner{border-style:solid;border-color:var(--cmplz_banner_border_color);border-width:var(--cmplz_banner_border_width);border-radius:var(--cmplz_banner_border_radius);padding:15px 20px;display:grid;grid-gap:10px}.cmplz-cookiebanner .cmplz-divider{margin-left:-20px;margin-right:-20px}.cmplz-cookiebanner .cmplz-header{grid-template-columns:100px 1fr 100px;align-items:center;display:grid;grid-column:span 3}@media (max-width:399px){.cmplz-cookiebanner .cmplz-header{grid-template-columns:auto 1fr auto}}.cmplz-cookiebanner .cmplz-logo svg{max-height:35px;width:inherit}.cmplz-cookiebanner .cmplz-logo img{max-height:40px;width:inherit}.cmplz-cookiebanner .cmplz-title{justify-self:center;grid-column-start:2;font-size:var(--cmplz_title_font_size);color:var(--cmplz_text_color);font-weight:500}.cmplz-cookiebanner .cmplz-close{line-height:20px;justify-self:end;grid-column-start:3;font-size:20px;cursor:pointer;width:20px;height:20px;color:var(--cmplz_text_color)}.cmplz-cookiebanner .cmplz-close svg{width:20px;height:20px}.cmplz-cookiebanner .cmplz-close:hover{text-decoration:none;line-height:initial;font-size:18px}.cmplz-cookiebanner .cmplz-message{word-wrap:break-word;font-size:var(--cmplz_text_font_size);line-height:var(--cmplz_text_line_height);color:var(--cmplz_text_color);margin-bottom:5px}.cmplz-cookiebanner .cmplz-message a{color:var(--cmplz_hyperlink_color)}.cmplz-cookiebanner .cmplz-buttons,.cmplz-cookiebanner .cmplz-categories,.cmplz-cookiebanner .cmplz-divider,.cmplz-cookiebanner .cmplz-links,.cmplz-cookiebanner .cmplz-message{grid-column:span 3}.cmplz-cookiebanner .cmplz-categories .cmplz-category{background-color:rgba(239,239,239,.5)}.cmplz-cookiebanner .cmplz-categories .cmplz-category:not(:last-child){margin-bottom:10px}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-category-header{display:grid;grid-template-columns:1fr auto 15px;grid-template-rows:minmax(0,1fr);align-items:center;grid-gap:10px;padding:10px}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-category-header .cmplz-category-title{font-weight:500;grid-column-start:1;
18justify-self:start;font-size:var(--cmplz_category_header_title_font_size);color:var(--cmplz_text_color);margin:0}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-category-header .cmplz-always-active{font-size:var(--cmplz_category_header_active_font_size);font-weight:500;color:var(--cmplz_category_header_always_active_color)}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-category-header .cmplz-always-active label{display:none}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-category-header .cmplz-banner-checkbox{display:flex;align-items:center;margin:0}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-category-header .cmplz-banner-checkbox input[data-category=cmplz_functional]{display:none}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-category-header .cmplz-category-toggle{background:0 0;border:none;padding:0;margin:0;cursor:pointer;grid-column-start:3;display:flex;align-items:center;justify-content:center;color:inherit}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-category-header .cmplz-icon.cmplz-open{cursor:pointer;content:'';transform:rotate(0);-webkit-transition:.5s;-moz-transition:.5s;-o-transition:.5s;transition:all .5s ease;background-size:cover;height:18px;width:18px}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-description{font-size:var(--cmplz_category_body_font_size);color:var(--cmplz_text_color);margin:0;max-width:100%;padding:10px}.cmplz-cookiebanner .cmplz-buttons{display:flex;gap:var(--cmplz_banner_margin)}.cmplz-cookiebanner .cmplz-buttons .cmplz-btn{min-height:45px;padding:10px;margin:initial;width:100%;white-space:nowrap;border-radius:var(--cmplz_button_border_radius);cursor:pointer;font-size:var(--cmplz_button_font_size);font-weight:500;text-decoration:none;line-height:20px;text-align:center;flex:initial}.cmplz-cookiebanner .cmplz-buttons .cmplz-btn:hover{text-decoration:none}.cmplz-cookiebanner .cmplz-buttons .cmplz-btn.cmplz-accept{background-color:var(--cmplz_button_accept_background_color);border:1px solid var(--cmplz_button_accept_border_color);color:var(--cmplz_button_accept_text_color)}.cmplz-cookiebanner .cmplz-buttons .cmplz-btn.cmplz-deny{background-color:var(--cmplz_button_deny_background_color);border:1px solid var(--cmplz_button_deny_border_color);color:var(--cmplz_button_deny_text_color)}.cmplz-cookiebanner .cmplz-buttons .cmplz-btn.cmplz-view-preferences{background-color:var(--cmplz_button_settings_background_color);border:1px solid var(--cmplz_button_settings_border_color);color:var(--cmplz_button_settings_text_color)}.cmplz-cookiebanner .cmplz-buttons .cmplz-btn.cmplz-save-preferences{background-color:var(--cmplz_button_settings_background_color);border:1px solid var(--cmplz_button_settings_border_color);color:var(--cmplz_button_settings_text_color)}.cmplz-cookiebanner .cmplz-buttons .cmplz-btn.cmplz-manage-options{background-color:var(--cmplz_button_settings_background_color);border:1px solid var(--cmplz_button_settings_border_color);color:var(--cmplz_button_settings_text_color)}.cmplz-cookiebanner .cmplz-buttons a.cmplz-btn{display:flex;align-items:center;justify-content:center;padding:initial}@media (max-width:425px){.cmplz-cookiebanner .cmplz-header .cmplz-title{display:none}.cmplz-cookiebanner .cmplz-category .cmplz-category-header{grid-template-columns:1fr!important}.cmplz-cookiebanner .cmplz-message{margin-right:5px}.cmplz-cookiebanner .cmplz-links.cmplz-information{display:initial;text-align:center}}.cmplz-cookiebanner .cmplz-links{display:flex;gap:var(--cmplz_banner_margin)}.cmplz-cookiebanner .cmplz-links.cmplz-information{justify-content:space-between}.cmplz-cookiebanner .cmplz-links.cmplz-documents{justify-content:center}.cmplz-cookiebanner .cmplz-links .cmplz-link{color:var(--cmplz_hyperlink_color);font-size:var(--cmplz_link_font_size);text-decoration:underline;margin:0}.cmplz-cookiebanner .cmplz-links .cmplz-link.cmplz-read-more-purposes{display:none}.cmplz-cookiebanner .cmplz-links ul{margin:0;padding:0;list-style:none;display:flex;gap:var(--cmplz_banner_margin);justify-content:center}.cmplz-categories .cmplz-category .cmplz-description-statistics-anonymous{display:none}.cmplz-categories .cmplz-category .cmplz-description-statistics{display:block}.cmplz-categories .cmplz-category .cmplz-category-header .cmplz-category-toggle{background:0 0;border:none;padding:0;margin:0;cursor:pointer;grid-column-start:3;display:flex;align-items:center;justify-content:center;color:inherit}.cmplz-categories .cmplz-category .cmplz-category-toggle[aria-expanded=true] .cmplz-icon.cmplz-open{transform:rotate(180deg)}.cmplz-cookiebanner{top:initial;left:initial;right:10px;bottom:10px;transform:initial}@media (max-width:768px){.cmplz-cookiebanner{left:initial;right:initial;bottom:0;width:100%}.cmplz-cookiebanner .cmplz-buttons{flex-direction:column}#cmplz-manage-consent .cmplz-manage-consent{display:none}}@media (min-width:768px){.cmplz-cookiebanner{min-width:var(--cmplz_banner_width);max-width:100%;display:grid;grid-row-gap:10px}.cmplz-categories,.cmplz-message{width:calc(var(--cmplz_banner_width) - 42px)}}.cmplz-cookiebanner .cmplz-btn.cmplz-manage-options,.cmplz-cookiebanner .cmplz-categories,.cmplz-cookiebanner .cmplz-link.cmplz-manage-options,.cmplz-cookiebanner .cmplz-manage-vendors,.cmplz-cookiebanner .cmplz-save-preferences{display:none}.cmplz-cookiebanner .cmplz-categories.cmplz-fade-in{animation:1s fadeIn;-webkit-animation:1s fadeIn;-moz-animation:1s fadeIn;-o-animation:1s fadeIn;-ms-animation:fadeIn 1s;display:block}@keyframes fadeIn{0%{opacity:0}
18100%{opacity:1}}@-moz-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-o-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-ms-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.cmplz-cookiebanner .cmplz-links.cmplz-information{display:none}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox{position:relative}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox input.cmplz-consent-checkbox{opacity:0;margin:0;margin-top:-10px;cursor:pointer;-moz-opacity:0;-khtml-opacity:0;position:absolute;z-index:1;top:0;left:0;width:40px;height:20px}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox input.cmplz-consent-checkbox:focus+.cmplz-label:before{box-shadow:0 0 0 2px #245fcc}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox input.cmplz-consent-checkbox:checked+.cmplz-label::before{display:block;background-color:var(--cmplz_slider_active_color);content:"";padding-left:6px}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox input.cmplz-consent-checkbox:checked+.cmplz-label:after{left:14px}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox .cmplz-label{position:relative;padding-left:30px;margin:0}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox .cmplz-label:after,.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox .cmplz-label:before{box-sizing:border-box;position:absolute;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;transition:background-color .3s,left .3s}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox .cmplz-label:before{display:block;content:"";color:#fff;box-sizing:border-box;
18font-family:FontAwesome,sans-serif;padding-left:23px;font-size:12px;line-height:20px;background-color:var(--cmplz_slider_inactive_color);left:0;top:-7px;height:15px;width:28px;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.cmplz-cookiebanner .cmplz-categories .cmplz-category .cmplz-banner-checkbox .cmplz-label:after{display:block;content:"";letter-spacing:20px;background:var(--cmplz_slider_bullet_color);left:4px;top:-5px;height:11px;width:11px}.cmplz-cookiebanner{box-shadow:rgba(0,0,0,.19) 0 10px 20px,rgba(0,0,0,.23) 0 6px 6px}#cmplz-manage-consent .cmplz-manage-consent{box-shadow:rgba(0,0,0,.19) 0 10px 20px,rgba(0,0,0,.23) 0 6px 6px}.cmplz-cookiebanner.cmplz-show{box-shadow:rgba(0,0,0,.19) 0 10px 20px,rgba(0,0,0,.23) 0 6px 6px}.cmplz-cookiebanner.cmplz-show:hover{transition-duration:1s;box-shadow:rgba(0,0,0,.3) 0 19px 38px,rgba(0,0,0,.22) 0 15px 12px}.cmplz-categories .cmplz-category .cmplz-description-statistics-anonymous{display:block}.cmplz-categories .cmplz-category .cmplz-description-statistics{display:none}.cmplz-hidden{display:none!important}:root{--swiper-theme-color:#007aff}.swiper{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;box-sizing:content-box}.swiper-wrapper{transform:translate3d(0,0,0)}.swiper-pointer-events{touch-action:pan-y}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform}.swiper-slide-invisible-blank{visibility:hidden}.swiper-backface-hidden .swiper-slide{transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(0px - (var(--swiper-navigation-size)/ 2));z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{opacity:0;cursor:auto;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev{display:none!important}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;font-variant:initial;line-height:1}.swiper-button-prev{left:10px;right:auto}.swiper-button-prev:after{content:'prev'}.swiper-button-next{right:10px;left:auto}.swiper-button-next:after{content:'next'}.swiper-button-lock{display:none}.swiper-pagination{position:absolute;text-align:center;transition:.3s opacity;transform:translate3d(0,0,0);z-index:10}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal{bottom:10px;left:0;width:100%}.swiper-pagination-bullet{width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));display:inline-block;border-radius:50%;background:var(--swiper-pagination-bullet-inactive-color,#000);opacity:var(--swiper-pagination-bullet-inactive-opacity,.2)}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{opacity:var(--swiper-pagination-bullet-opacity,1);background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;
18left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-scrollbar.swiper-scrollbar-vertical{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-watch-progress .swiper-slide-visible .swiper-lazy-preloader,.swiper:not(.swiper-watch-progress) .swiper-lazy-preloader{animation:1s linear infinite swiper-preloader-spin}@keyframes swiper-preloader-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.wp-container-core-columns-is-layout-8f761849{flex-wrap:nowrap}.hero img{object-position:50% 50%}#tile-6a82a8367797b img{object-position:50% 50%}#tile-6a82a83678c32 img{object-position:50% 50%}#tile-6a82a83678f27 img{object-position:50% 50%}#image-2109 img{object-position:50% 50%}#image-2060 img{object-position:50% 50%}#card-post-7294 img{object-position:50% 50%}#card-post-7164 img{object-position:50% 50%}#card-post-7109 img{object-position:15% 9%}#card-post-1399 img{object-position:50% 50%}#card-post-1690 img{object-position:50% 50%}#card-post-778 img{object-position:50% 50%}#card-post-1132 img{object-position:49% 46%}#card-post-2039 img{object-position:76% 28%}#card-post-1 img{object-position:50% 50%}#image-4215 img{object-position:50% 50%}#ctafull-block_489d10c5a989040139768d530dea508f img{object-position:50% 50%}#image-820 img{object-position:85% 48%}#image-5263 img{object-position:50% 50%}#image-5252 img{object-position:50% 50%}:root{--f-spinner-width:36px;--f-spinner-height:36px;--f-spinner-color-1:rgba(0, 0, 0, .1);--f-spinner-color-2:rgba(17, 24, 28, .8);--f-spinner-stroke:2.75}.f-spinner{margin:auto;padding:0;width:var(--f-spinner-width);height:var(--f-spinner-height)}.f-spinner svg{width:100%;height:100%;vertical-align:top;animation:2s linear infinite f-spinner-rotate}.f-spinner svg *{stroke-width:var(--f-spinner-stroke);fill:none}.f-spinner svg :first-child{stroke:var(--f-spinner-color-1)}.f-spinner svg :last-child{stroke:var(--f-spinner-color-2);animation:2s ease-in-out infinite f-spinner-dash}@keyframes f-spinner-rotate{100%{transform:rotate(360deg)}}@keyframes f-spinner-dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}.f-throwOutUp{animation:var(--f-throw-out-duration,.175s) ease-out both f-throwOutUp}.f-throwOutDown{animation:var(--f-throw-out-duration,.175s) ease-out both f-throwOutDown}@keyframes f-throwOutUp{to{transform:translate3d(0,calc(var(--f-throw-out-distance,150px) * -1),0);opacity:0}}@keyframes f-throwOutDown{to{transform:translate3d(0,var(--f-throw-out-distance,150px),0);opacity:0}}.f-zoomInUp{animation:var(--f-transition-duration,.2s) ease .1s both f-zoomInUp}.f-zoomOutDown{animation:var(--f-transition-duration,.2s) ease both f-zoomOutDown}@keyframes f-zoomInUp{from{transform:scale(.975) translate3d(0,16px,0);opacity:0}to{transform:scale(1) translate3d(0,0,0);opacity:1}}@keyframes f-zoomOutDown{to{transform:scale(.975) translate3d(0,16px,0);opacity:0}}.f-fadeIn{animation:var(--f-transition-duration,.2s) var(--f-transition-easing,ease) var(--f-transition-delay,0s) both f-fadeIn;z-index:2}.f-fadeOut{animation:var(--f-transition-duration,.2s) var(--f-transition-easing,ease) var(--f-transition-delay,0s) both f-fadeOut;z-index:1}@keyframes f-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes f-fadeOut{100%{opacity:0}
18}.f-fadeFastIn{animation:var(--f-transition-duration,.2s) ease-out both f-fadeFastIn;z-index:2}.f-fadeFastOut{animation:var(--f-transition-duration,.1s) ease-out both f-fadeFastOut;z-index:2}@keyframes f-fadeFastIn{0%{opacity:.75}100%{opacity:1}}@keyframes f-fadeFastOut{100%{opacity:0}}.f-fadeSlowIn{animation:var(--f-transition-duration,.5s) ease both f-fadeSlowIn;z-index:2}.f-fadeSlowOut{animation:var(--f-transition-duration,.5s) ease both f-fadeSlowOut;z-index:1}@keyframes f-fadeSlowIn{0%{opacity:0}100%{opacity:1}}@keyframes f-fadeSlowOut{100%{opacity:0}}.f-crossfadeIn{animation:var(--f-transition-duration,.2s) ease-out both f-crossfadeIn;z-index:2}.f-crossfadeOut{animation:calc(var(--f-transition-duration,.2s)*.5) linear .1s both f-crossfadeOut;z-index:1}@keyframes f-crossfadeIn{0%{opacity:0}100%{opacity:1}}@keyframes f-crossfadeOut{100%{opacity:0}}.f-slideIn.from-next{animation:var(--f-transition-duration,.85s) cubic-bezier(.16,1,.3,1) f-slideInNext}.f-slideIn.from-prev{animation:var(--f-transition-duration,.85s) cubic-bezier(.16,1,.3,1) f-slideInPrev}.f-slideOut.to-next{animation:var(--f-transition-duration,.85s) cubic-bezier(.16,1,.3,1) f-slideOutNext}.f-slideOut.to-prev{animation:var(--f-transition-duration,.85s) cubic-bezier(.16,1,.3,1) f-slideOutPrev}@keyframes f-slideInPrev{0%{transform:translateX(100%)}100%{transform:translate3d(0,0,0)}}@keyframes f-slideInNext{0%{transform:translateX(-100%)}100%{transform:translate3d(0,0,0)}}@keyframes f-slideOutNext{100%{transform:translateX(-100%)}}@keyframes f-slideOutPrev{100%{transform:translateX(100%)}}.f-classicIn.from-next{animation:var(--f-transition-duration,.85s) cubic-bezier(.16,1,.3,1) f-classicInNext;z-index:2}.f-classicIn.from-prev{animation:var(--f-transition-duration,.85s) cubic-bezier(.16,1,.3,1) f-classicInPrev;z-index:2}.f-classicOut.to-next{animation:var(--f-transition-duration,.85s) cubic-bezier(.16,1,.3,1) f-classicOutNext;z-index:1}.f-classicOut.to-prev{animation:var(--f-transition-duration,.85s) cubic-bezier(.16,1,.3,1) f-classicOutPrev;z-index:1}@keyframes f-classicInNext{0%{transform:translateX(-75px);opacity:0}100%{transform:translate3d(0,0,0);opacity:1}}@keyframes f-classicInPrev{0%{transform:translateX(75px);opacity:0}100%{transform:translate3d(0,0,0);opacity:1}}@keyframes f-classicOutNext{100%{transform:translateX(-75px);opacity:0}}@keyframes f-classicOutPrev{100%{transform:translateX(75px);opacity:0}}:root{--f-button-width:40px;--f-button-height:40px;--f-button-border:0;--f-button-border-radius:0;--f-button-color:#374151;--f-button-bg:#f8f8f8;--f-button-hover-bg:#e0e0e0;--f-button-active-bg:#d0d0d0;--f-button-shadow:none;--f-button-transition:all .15s ease;--f-button-transform:none;--f-button-svg-width:20px;--f-button-svg-height:20px;--f-button-svg-stroke-width:1.5;--f-button-svg-fill:none;--f-button-svg-filter:none;--f-button-svg-disabled-opacity:.65}.f-button{display:flex;justify-content:center;align-items:center;box-sizing:content-box;position:relative;margin:0;padding:0;width:var(--f-button-width);height:var(--f-button-height);border:var(--f-button-border);border-radius:var(--f-button-border-radius);color:var(--f-button-color);background:var(--f-button-bg);box-shadow:var(--f-button-shadow);pointer-events:all;cursor:pointer;transition:var(--f-button-transition)}@media (hover:hover){.f-button:hover:not([disabled]){color:var(--f-button-hover-color);background-color:var(--f-button-hover-bg)}}.f-button:active:not([disabled]){background-color:var(--f-button-active-bg)}.f-button:focus:not(:focus-visible){outline:0}.f-button:focus-visible{outline:0;box-shadow:inset 0 0 0 var(--f-button-outline,2px) var(--f-button-outline-color,var(--f-button-color))}.f-button svg{width:var(--f-button-svg-width);height:var(--f-button-svg-height);fill:var(--f-button-svg-fill);stroke:currentColor;stroke-width:var(--f-button-svg-stroke-width);stroke-linecap:round;stroke-linejoin:round;transition:opacity .15s ease;transform:var(--f-button-transform);filter:var(--f-button-svg-filter);pointer-events:none}.f-button[disabled]{cursor:default}.f-button[disabled] svg{opacity:var(--f-button-svg-disabled-opacity)}.f-carousel__nav .f-button.is-next,.f-carousel__nav .f-button.is-prev,.fancybox__nav .f-button.is-next,.fancybox__nav .f-button.is-prev{position:absolute;z-index:1}.is-horizontal .f-carousel__nav .f-button.is-next,.is-horizontal .f-carousel__nav .f-button.is-prev,.is-horizontal .fancybox__nav .f-button.is-next,.is-horizontal .fancybox__nav .f-button.is-prev{top:50%;transform:translateY(-50%)}.is-horizontal .f-carousel__nav .f-button.is-prev,.is-horizontal .fancybox__nav .f-button.is-prev{left:var(--f-button-prev-pos)}.is-horizontal .f-carousel__nav .f-button.is-next,.is-horizontal .fancybox__nav .f-button.is-next{right:var(--f-button-next-pos)}.is-horizontal.is-rtl .f-carousel__nav .f-button.is-prev,.is-horizontal.is-rtl .fancybox__nav .f-button.is-prev{left:auto;right:var(--f-button-next-pos)}.is-horizontal.is-rtl .f-carousel__nav .f-button.is-next,.is-horizontal.is-rtl .fancybox__nav .f-button.is-next{right:auto;left:var(--f-button-prev-pos)}.is-vertical .f-carousel__nav .f-button.is-next,.is-vertical .f-carousel__nav .f-button.is-prev,.is-vertical .fancybox__nav .f-button.is-next,.is-vertical .fancybox__nav .f-button.is-prev{top:auto;left:50%;transform:translateX(-50%)}.is-vertical .f-carousel__nav .f-button.is-prev,.is-vertical .fancybox__nav .f-button.is-prev{top:var(--f-button-next-pos)}.is-vertical .f-carousel__nav .f-button.is-next,.is-vertical .fancybox__nav .f-button.is-next{bottom:var(--f-button-next-pos)}.is-vertical .f-carousel__nav .f-button.is-next svg,.is-vertical .f-carousel__nav .f-button.is-prev svg,.is-vertical .fancybox__nav .f-button.is-next svg,.is-vertical .fancybox__nav .f-button.is-prev svg{transform:rotate(90deg)}.f-carousel__nav .f-button:disabled,.fancybox__nav .f-button:disabled{pointer-events:none}html.with-fancybox{width:auto;overflow:visible;scroll-behavior:auto}html.with-fancybox body{touch-action:none}html.with-fancybox body.hide-scrollbar{width:auto;margin-right:calc(var(--fancybox-body-margin,0px) + var(--fancybox-scrollbar-compensate,0px));overflow:hidden!important;overscroll-behavior-y:none}.fancybox__container{--fancybox-color:#dbdbdb;--fancybox-hover-color:#fff;--fancybox-bg:rgba(24, 24, 27, .98);--fancybox-slide-gap:10px;--f-spinner-width:50px;--f-spinner-height:50px;--f-spinner-color-1:rgba(255, 255, 255, .1);--f-spinner-color-2:#bbb;--f-spinner-stroke:3.65;position:fixed;top:0;left:0;bottom:0;right:0;direction:ltr;display:flex;flex-direction:column;box-sizing:border-box;margin:0;padding:0;color:#f8f8f8;-webkit-tap-highlight-color:transparent;overflow:visible;z-index:var(--fancybox-zIndex,1050);outline:0;transform-origin:top left;-webkit-text-size-adjust:100%;-moz-text-size-adjust:none;-ms-text-size-adjust:100%;text-size-adjust:100%;overscroll-behavior-y:contain}.fancybox__container *,.fancybox__container ::after,.fancybox__container ::before{box-sizing:inherit}.fancybox__container::backdrop{background-color:rgba(0,0,0,0)}.fancybox__backdrop{position:fixed;top:0;left:0;bottom:0;right:0;z-index:-1;background:var(--fancybox-bg);opacity:var(--fancybox-opacity,1);will-change:opacity}.fancybox__carousel{position:relative;box-sizing:border-box;flex:1;min-height:0;z-index:10;overflow-y:visible;overflow-x:clip}.fancybox__viewport{width:100%;height:100%}.fancybox__viewport.is-draggable{cursor:move;cursor:grab}.fancybox__viewport.is-dragging{cursor:move;cursor:grabbing}.fancybox__track{display:flex;margin:0 auto;height:100%}.fancybox__slide{flex:0 0 auto;position:relative;display:flex;flex-direction:column;align-items:center;width:100%;height:100%;
18margin:0 var(--fancybox-slide-gap) 0 0;padding:4px;overflow:auto;overscroll-behavior:contain;transform:translate3d(0,0,0);backface-visibility:hidden}.fancybox__container:not(.is-compact) .fancybox__slide.has-close-btn{padding-top:40px}.fancybox__slide.has-html5video,.fancybox__slide.has-iframe,.fancybox__slide.has-video{overflow:hidden}.fancybox__slide.has-image{overflow:hidden}.fancybox__slide.has-image.is-animating,.fancybox__slide.has-image.is-selected{overflow:visible}.fancybox__slide::after,.fancybox__slide::before{content:"";flex:0 0 0;margin:auto}.fancybox__backdrop:empty,.fancybox__slide:empty,.fancybox__track:empty,.fancybox__viewport:empty{display:block}.fancybox__content{align-self:center;display:flex;flex-direction:column;position:relative;margin:0;padding:2rem;max-width:100%;color:var(--fancybox-content-color,#374151);background:var(--fancybox-content-bg,#fff);cursor:default;border-radius:0;z-index:20}.is-loading .fancybox__content{opacity:0}.is-draggable .fancybox__content{cursor:move;cursor:grab}.can-zoom_in .fancybox__content{cursor:zoom-in}.can-zoom_out .fancybox__content{cursor:zoom-out}.is-dragging .fancybox__content{cursor:move;cursor:grabbing}.fancybox__content [contenteditable],.fancybox__content [data-selectable]{cursor:auto}.fancybox__slide.has-image>.fancybox__content{padding:0;background:rgba(0,0,0,0);min-height:1px;background-repeat:no-repeat;background-size:contain;background-position:center center;transition:none;transform:translate3d(0,0,0);backface-visibility:hidden}.fancybox__slide.has-image>.fancybox__content>picture>img{width:100%;height:auto;max-height:100%}.is-animating .fancybox__content,.is-dragging .fancybox__content{will-change:transform,width,height}.fancybox-image{margin:auto;display:block;width:100%;height:100%;min-height:0;object-fit:contain;user-select:none;filter:blur(0)}.fancybox__caption{align-self:center;max-width:100%;flex-shrink:0;margin:0;padding:14px 0 4px;overflow-wrap:anywhere;line-height:1.375;color:var(--fancybox-color,currentColor);opacity:var(--fancybox-opacity,1);cursor:auto;visibility:visible}.is-closing .fancybox__caption,.is-loading .fancybox__caption{opacity:0;visibility:hidden}.is-compact .fancybox__caption{padding-bottom:0}.f-button.is-close-btn{--f-button-svg-stroke-width:2;position:absolute;top:0;right:8px;z-index:40}.fancybox__content>.f-button.is-close-btn{--f-button-width:34px;--f-button-height:34px;--f-button-border-radius:4px;--f-button-color:var(--fancybox-color,#fff);--f-button-hover-color:var(--fancybox-color,#fff);--f-button-bg:transparent;--f-button-hover-bg:transparent;--f-button-active-bg:transparent;--f-button-svg-width:22px;--f-button-svg-height:22px;position:absolute;top:-38px;right:0;opacity:.75}.is-loading .fancybox__content>.f-button.is-close-btn{visibility:hidden}.is-zooming-out .fancybox__content>.f-button.is-close-btn{visibility:hidden}.fancybox__content>.f-button.is-close-btn:hover{opacity:1}.fancybox__footer{padding:0;margin:0;position:relative}.fancybox__footer .fancybox__caption{width:100%;padding:24px;opacity:var(--fancybox-opacity,1);transition:all .25s ease}.is-compact .fancybox__footer{position:absolute;bottom:0;left:0;right:0;z-index:20;background:rgba(24,24,27,.5)}.is-compact .fancybox__footer .fancybox__caption{padding:12px}.is-compact .fancybox__content>.f-button.is-close-btn{--f-button-border-radius:50%;--f-button-color:#fff;--f-button-hover-color:#fff;--f-button-outline-color:#000;--f-button-bg:rgba(0, 0, 0, .6);--f-button-active-bg:rgba(0, 0, 0, .6);--f-button-hover-bg:rgba(0, 0, 0, .6);--f-button-svg-width:18px;--f-button-svg-height:18px;--f-button-svg-filter:none;top:5px;right:5px}.fancybox__nav{--f-button-width:50px;--f-button-height:50px;--f-button-border:0;--f-button-border-radius:50%;--f-button-color:var(--fancybox-color);--f-button-hover-color:var(--fancybox-hover-color);--f-button-bg:transparent;--f-button-hover-bg:rgba(24, 24, 27, .3);--f-button-active-bg:rgba(24, 24, 27, .5);--f-button-shadow:none;--f-button-transition:all .15s ease;--f-button-transform:none;--f-button-svg-width:26px;--f-button-svg-height:26px;--f-button-svg-stroke-width:2.5;--f-button-svg-fill:none;--f-button-svg-filter:drop-shadow(1px 1px 1px rgba(24, 24, 27, .5));
18--f-button-svg-disabled-opacity:.65;--f-button-next-pos:1rem;--f-button-prev-pos:1rem;opacity:var(--fancybox-opacity,1)}.fancybox__nav .f-button:before{position:absolute;content:"";top:-30px;right:-20px;left:-20px;bottom:-30px;z-index:1}.is-idle .fancybox__nav{animation:.15s ease-out both f-fadeOut}.is-idle.is-compact .fancybox__footer{pointer-events:none;animation:.15s ease-out both f-fadeOut}.fancybox__slide>.f-spinner{position:absolute;top:50%;left:50%;margin:var(--f-spinner-top,calc(var(--f-spinner-width) * -.5)) 0 0 var(--f-spinner-left,calc(var(--f-spinner-height) * -.5));z-index:30;cursor:pointer}.fancybox-protected{position:absolute;top:0;left:0;right:0;bottom:0;z-index:40;user-select:none}.fancybox-ghost{position:absolute;top:0;left:0;width:100%;height:100%;min-height:0;object-fit:contain;z-index:40;user-select:none;pointer-events:none}.fancybox-focus-guard{outline:0;opacity:0;position:fixed;pointer-events:none}.fancybox__container:not([aria-hidden]){opacity:0}.fancybox__container.is-animated[aria-hidden=false] .fancybox__carousel>:not(.fancybox__viewport),.fancybox__container.is-animated[aria-hidden=false] .fancybox__slide>:not(.fancybox__content),.fancybox__container.is-animated[aria-hidden=false]>:not(.fancybox__backdrop,.fancybox__carousel){animation:var(--f-interface-enter-duration,.25s) ease .1s backwards f-fadeIn}.fancybox__container.is-animated[aria-hidden=false] .fancybox__backdrop{animation:var(--f-backdrop-enter-duration,.35s) ease backwards f-fadeIn}.fancybox__container.is-animated[aria-hidden=true] .fancybox__carousel>:not(.fancybox__viewport),.fancybox__container.is-animated[aria-hidden=true] .fancybox__slide>:not(.fancybox__content),.fancybox__container.is-animated[aria-hidden=true]>:not(.fancybox__backdrop,.fancybox__carousel){animation:var(--f-interface-exit-duration,.15s) ease forwards f-fadeOut}.fancybox__container.is-animated[aria-hidden=true] .fancybox__backdrop{animation:var(--f-backdrop-exit-duration,.35s) ease forwards f-fadeOut}.has-html5video .fancybox__content,.has-iframe .fancybox__content,.has-map .fancybox__content,.has-pdf .fancybox__content,.has-vimeo .fancybox__content,.has-youtube .fancybox__content{max-width:100%;flex-shrink:1;min-height:1px;overflow:visible}.has-iframe .fancybox__content,.has-map .fancybox__content,.has-pdf .fancybox__content{width:calc(100% - 120px);height:90%}.fancybox__container.is-compact .has-iframe .fancybox__content,.fancybox__container.is-compact .has-map .fancybox__content,.fancybox__container.is-compact .has-pdf .fancybox__content{width:100%;height:100%}.has-html5video .fancybox__content,.has-vimeo .fancybox__content,.has-youtube .fancybox__content{width:960px;height:540px;max-width:100%;max-height:100%}.has-html5video .fancybox__content,.has-map .fancybox__content,.has-pdf .fancybox__content,.has-vimeo .fancybox__content,.has-youtube .fancybox__content{padding:0;background:rgba(24,24,27,.9);color:#fff}.has-map .fancybox__content{background:#e5e3df}.fancybox__html5video,.fancybox__iframe{border:0;display:block;height:100%;width:100%;background:rgba(0,0,0,0)}.fancybox-placeholder{border:0!important;clip:rect(1px,1px,1px,1px)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.f-carousel__thumbs{--f-thumb-width:96px;--f-thumb-height:72px;--f-thumb-outline:0;--f-thumb-outline-color:#5eb0ef;--f-thumb-opacity:1;--f-thumb-hover-opacity:1;--f-thumb-selected-opacity:1;--f-thumb-border-radius:2px;--f-thumb-offset:0;--f-button-next-pos:0;--f-button-prev-pos:0}.f-carousel__thumbs.is-classic{--f-thumb-gap:8px;--f-thumb-opacity:.5;--f-thumb-hover-opacity:1;--f-thumb-selected-opacity:1}.f-carousel__thumbs.is-modern{--f-thumb-gap:4px;--f-thumb-extra-gap:16px;--f-thumb-clip-width:46px}.f-thumbs{position:relative;flex:0 0 auto;margin:0;overflow:hidden;-webkit-tap-highlight-color:transparent;user-select:none;perspective:1000px;transform:translateZ(0)}.f-thumbs .f-spinner{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:2px;background-image:linear-gradient(#ebeff2,#e2e8f0);z-index:-1}.f-thumbs .f-spinner svg{display:none}.f-thumbs.is-vertical{height:100%}.f-thumbs__viewport{width:100%;height:auto;overflow:hidden;
18transform:translate3d(0,0,0)}.f-thumbs__track{display:flex}.f-thumbs__slide{position:relative;flex:0 0 auto;box-sizing:content-box;display:flex;align-items:center;justify-content:center;padding:0;margin:0;width:var(--f-thumb-width);height:var(--f-thumb-height);overflow:visible;cursor:pointer}.f-thumbs__slide.is-loading img{opacity:0}.is-classic .f-thumbs__viewport{height:100%}.is-modern .f-thumbs__track{width:max-content}.is-modern .f-thumbs__track::before{content:"";position:absolute;top:0;bottom:0;left:calc((var(--f-thumb-clip-width,0))*-.5);width:calc(var(--width,0)*1px + var(--f-thumb-clip-width,0));cursor:pointer}.is-modern .f-thumbs__slide{width:var(--f-thumb-clip-width);transform:translate3d(calc(var(--shift,0) * -1px),0,0);transition:none;pointer-events:none}.is-modern.is-resting .f-thumbs__slide{transition:transform .33s ease}.is-modern.is-resting .f-thumbs__slide__button{transition:clip-path .33s ease}.is-using-tab .is-modern .f-thumbs__slide:focus-within{filter:drop-shadow(-1px 0 0 var(--f-thumb-outline-color)) drop-shadow(2px 0 0 var(--f-thumb-outline-color)) drop-shadow(0 -1px 0 var(--f-thumb-outline-color)) drop-shadow(0 2px 0 var(--f-thumb-outline-color))}.f-thumbs__slide__button{appearance:none;width:var(--f-thumb-width);height:100%;margin:0 -100%;padding:0;border:0;position:relative;border-radius:var(--f-thumb-border-radius);overflow:hidden;background:rgba(0,0,0,0);outline:0;cursor:pointer;pointer-events:auto;touch-action:manipulation;opacity:var(--f-thumb-opacity);transition:opacity .2s ease}.f-thumbs__slide__button:hover{opacity:var(--f-thumb-hover-opacity)}.f-thumbs__slide__button:focus:not(:focus-visible){outline:0}.f-thumbs__slide__button:focus-visible{outline:0;opacity:var(--f-thumb-selected-opacity)}.is-modern .f-thumbs__slide__button{--clip-path:inset( 0 calc( ((var(--f-thumb-width, 0) - var(--f-thumb-clip-width, 0))) * (1 - var(--progress, 0)) * 0.5 ) round var(--f-thumb-border-radius, 0) );clip-path:var(--clip-path)}.is-classic .is-nav-selected .f-thumbs__slide__button{opacity:var(--f-thumb-selected-opacity)}.is-classic .is-nav-selected .f-thumbs__slide__button::after{content:"";position:absolute;top:0;left:0;right:0;height:auto;bottom:0;border:var(--f-thumb-outline,0) solid var(--f-thumb-outline-color,transparent);border-radius:var(--f-thumb-border-radius);animation:.2s ease-out f-fadeIn;z-index:10}.f-thumbs__slide__img{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;margin:0;padding:var(--f-thumb-offset);box-sizing:border-box;pointer-events:none;object-fit:cover;border-radius:var(--f-thumb-border-radius)}.f-thumbs.is-horizontal .f-thumbs__track{padding:8px 0 12px}.f-thumbs.is-horizontal .f-thumbs__slide{margin:0 var(--f-thumb-gap) 0 0}.f-thumbs.is-vertical .f-thumbs__track{flex-wrap:wrap;padding:0 8px}.f-thumbs.is-vertical .f-thumbs__slide{margin:0 0 var(--f-thumb-gap) 0}.fancybox__thumbs{--f-thumb-width:96px;--f-thumb-height:72px;--f-thumb-border-radius:2px;--f-thumb-outline:2px;--f-thumb-outline-color:#ededed;position:relative;opacity:var(--fancybox-opacity,1);transition:max-height .35s cubic-bezier(.23,1,.32,1)}.fancybox__thumbs.is-classic{--f-thumb-gap:8px;--f-thumb-opacity:.5;--f-thumb-hover-opacity:1}.fancybox__thumbs.is-classic .f-spinner{background-image:linear-gradient(rgba(255,255,255,.1),rgba(255,255,255,.05))}.fancybox__thumbs.is-modern{--f-thumb-gap:4px;--f-thumb-extra-gap:16px;--f-thumb-clip-width:46px;--f-thumb-opacity:1;--f-thumb-hover-opacity:1}.fancybox__thumbs.is-modern .f-spinner{background-image:linear-gradient(rgba(255,255,255,.1),rgba(255,255,255,.05))}.fancybox__thumbs.is-horizontal{padding:0 var(--f-thumb-gap)}.fancybox__thumbs.is-vertical{padding:var(--f-thumb-gap) 0}.is-compact .fancybox__thumbs{--f-thumb-width:64px;--f-thumb-clip-width:32px;--f-thumb-height:48px;--f-thumb-extra-gap:10px}.fancybox__thumbs.is-masked{max-height:0!important}.is-closing .fancybox__thumbs{transition:none!important}.fancybox__toolbar{--f-progress-color:var(--fancybox-color,rgba(255, 255, 255, .94));--f-button-width:46px;--f-button-height:46px;--f-button-color:var(--fancybox-color);--f-button-hover-color:var(--fancybox-hover-color);--f-button-bg:rgba(24, 24, 27, .65);
18--f-button-hover-bg:rgba(70, 70, 73, .65);--f-button-active-bg:rgba(90, 90, 93, .65);--f-button-border-radius:0;--f-button-svg-width:24px;--f-button-svg-height:24px;--f-button-svg-stroke-width:1.5;--f-button-svg-filter:drop-shadow(1px 1px 1px rgba(24, 24, 27, .15));--f-button-svg-fill:none;--f-button-svg-disabled-opacity:.65;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI Adjusted","Segoe UI","Liberation Sans",sans-serif;color:var(--fancybox-color,currentColor);opacity:var(--fancybox-opacity,1);text-shadow:var(--fancybox-toolbar-text-shadow,1px 1px 1px rgba(0,0,0,.5));pointer-events:none;z-index:20}.fancybox__toolbar :focus-visible{z-index:1}.fancybox__toolbar.is-absolute,.is-compact .fancybox__toolbar{position:absolute;top:0;left:0;right:0}.is-idle .fancybox__toolbar{pointer-events:none;animation:.15s ease-out both f-fadeOut}.fancybox__toolbar__column{display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start}.fancybox__toolbar__column.is-left,.fancybox__toolbar__column.is-right{flex-grow:1;flex-basis:0}.fancybox__toolbar__column.is-right{display:flex;justify-content:flex-end;flex-wrap:nowrap}.fancybox__infobar{padding:0 5px;line-height:var(--f-button-height);text-align:center;font-size:17px;font-variant-numeric:tabular-nums;-webkit-font-smoothing:subpixel-antialiased;cursor:default;user-select:none}.fancybox__infobar span{padding:0 5px}.fancybox__infobar:not(:first-child):not(:last-child){background:var(--f-button-bg)}[data-fancybox-toggle-slideshow]{position:relative}[data-fancybox-toggle-slideshow] .f-progress{height:100%;opacity:.3}[data-fancybox-toggle-slideshow] svg g:first-child{display:flex}[data-fancybox-toggle-slideshow] svg g:last-child{display:none}.has-slideshow [data-fancybox-toggle-slideshow] svg g:first-child{display:none}.has-slideshow [data-fancybox-toggle-slideshow] svg g:last-child{display:flex}[data-fancybox-toggle-fullscreen] svg g:first-child{display:flex}[data-fancybox-toggle-fullscreen] svg g:last-child{display:none}:fullscreen [data-fancybox-toggle-fullscreen] svg g:first-child{display:none}:fullscreen [data-fancybox-toggle-fullscreen] svg g:last-child{display:flex}.f-progress{position:absolute;top:0;left:0;right:0;height:3px;transform:scaleX(0);transform-origin:0;transition-property:transform;transition-timing-function:linear;background:var(--f-progress-color,var(--f-carousel-theme-color,#0091ff));z-index:30;user-select:none;pointer-events:none}</style><link rel="preload" data-rocket-preload as="image" href="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-600x338.jpg" imagesrcset="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-600x338.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-300x169.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-450x253.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-900x506.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-1200x675.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-1800x1013.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2.jpg 1920w" imagesizes="100vw" fetchpriority="high"> 19 <meta name="viewport" content="width=device-width, initial-scale=1"/> 20 <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> 21
21<script>/*! 22 * jQuery JavaScript Library v3.7.1 23 * https://jquery.com/ 24 * 25 * Copyright OpenJS Foundation and other contributors 26 * Released under the MIT license 27 * https://jquery.org/license 28 * 29 * Date: 2023-08-28T13:37Z 30 */ 31( function( global, factory ) { 32 33 "use strict"; 34 35 if ( typeof module === "object"
vendor: 12,125 bytes, lines 35-528
35 && typeof module.exports === "object" ) { 36 37 // For CommonJS and CommonJS-like environments where a proper `window` 38 // is present, execute the factory and get jQuery. 39 // For environments that do not have a `window` with a `document` 40 // (such as Node.js), expose a factory as module.exports. 41 // This accentuates the need for the creation of a real `window`. 42 // e.g. var jQuery = require("jquery")(window); 43 // See ticket trac-14549 for more info. 44 module.exports = global.document ? 45 factory( global, true ) : 46 function( w ) { 47 if ( !w.document ) { 48 throw new Error( "jQuery requires a window with a document" ); 49 } 50 return factory( w ); 51 }; 52 } else { 53 factory( global ); 54 } 55 56// Pass this if window is not defined yet 57} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 58 59// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 60// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 61// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 62// enough that all such attempts are guarded in a try block. 63"use strict"; 64 65var arr = []; 66 67var getProto = Object.getPrototypeOf; 68 69var slice = arr.slice; 70 71var flat = arr.flat ? function( array ) { 72 return arr.flat.call( array ); 73} : function( array ) { 74 return arr.concat.apply( [], array ); 75}; 76 77 78var push = arr.push; 79 80var indexOf = arr.indexOf; 81 82var class2type = {}; 83 84var toString = class2type.toString; 85 86var hasOwn = class2type.hasOwnProperty; 87 88var fnToString = hasOwn.toString; 89 90var ObjectFunctionString = fnToString.call( Object ); 91 92var support = {}; 93 94var isFunction = function isFunction( obj ) { 95 96 // Support: Chrome <=57, Firefox <=52 97 // In some browsers, typeof returns "function" for HTML <object> elements 98 // (i.e., `typeof document.createElement( "object" ) === "function"`). 99 // We don't want to classify *any* DOM node as a function. 100 // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 101 // Plus for old WebKit, typeof returns "function" for HTML collections 102 // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) 103 return typeof obj === "function" && typeof obj.nodeType !== "number" && 104 typeof obj.item !== "function"; 105 }; 106 107 108var isWindow = function isWindow( obj ) { 109 return obj != null && obj === obj.window; 110 }; 111 112 113var document = window.document; 114 115 116 117 var preservedScriptAttributes = { 118 type: true, 119 src: true, 120 nonce: true, 121 noModule: true 122 }; 123 124 function DOMEval( code, node, doc ) { 125 doc = doc || document; 126 127 var i, val, 128 script = doc.createElement( "script" ); 129 130 script.text = code; 131 if ( node ) { 132 for ( i in preservedScriptAttributes ) { 133 134 // Support: Firefox 64+, Edge 18+ 135 // Some browsers don't support the "nonce" property on scripts. 136 // On the other hand, just using `getAttribute` is not enough as 137 // the `nonce` attribute is reset to an empty string whenever it 138 // becomes browsing-context connected. 139 // See https://github.com/whatwg/html/issues/2369 140 // See https://html.spec.whatwg.org/#nonce-attributes 141 // The `node.getAttribute` check was added for the sake of 142 // `jQuery.globalEval` so that it can fake a nonce-containing node 143 // via an object. 144 val = node[ i ] || node.getAttribute && node.getAttribute( i ); 145 if ( val ) { 146 script.setAttribute( i, val ); 147 } 148 } 149 } 150 doc.head.appendChild( script ).parentNode.removeChild( script ); 151 } 152 153 154function toType( obj ) { 155 if ( obj == null ) { 156 return obj + ""; 157 } 158 159 // Support: Android <=2.3 only (functionish RegExp) 160 return typeof obj === "object" || typeof obj === "function" ? 161 class2type[ toString.call( obj ) ] || "object" : 162 typeof obj; 163} 164/* global Symbol */ 165// Defining this global in .eslintrc.json would create a danger of using the global 166// unguarded in another place, it seems safer to define global only for this module 167 168 169 170var version = "3.7.1", 171 172 rhtmlSuffix = /HTML$/i, 173 174 // Define a local copy of jQuery 175 jQuery = function( selector, context ) { 176 177 // The jQuery object is actually just the init constructor 'enhanced' 178 // Need init if jQuery is called (just allow error to be thrown if not included) 179 return new jQuery.fn.init( selector, context ); 180 }; 181 182jQuery.fn = jQuery.prototype = { 183 184 // The current version of jQuery being used 185 jquery: version, 186 187 constructor: jQuery, 188 189 // The default length of a jQuery object is 0 190 length: 0, 191 192 toArray: function() { 193 return slice.call( this ); 194 }, 195 196 // Get the Nth element in the matched element set OR 197 // Get the whole matched element set as a clean array 198 get: function( num ) { 199 200 // Return all the elements in a clean array 201 if ( num == null ) { 202 return slice.call( this ); 203 } 204 205 // Return just the one element from the set 206 return num < 0 ? this[ num + this.length ] : this[ num ]; 207 }, 208 209 // Take an array of elements and push it onto the stack 210 // (returning the new matched element set) 211 pushStack: function( elems ) { 212 213 // Build a new jQuery matched element set 214 var ret = jQuery.merge( this.constructor(), elems ); 215 216 // Add the old object onto the stack (as a reference) 217 ret.prevObject = this; 218 219 // Return the newly-formed element set 220 return ret; 221 }, 222 223 // Execute a callback for every element in the matched set. 224 each: function( callback ) { 225 return jQuery.each( this, callback ); 226 }, 227 228 map: function( callback ) { 229 return this.pushStack( jQuery.map( this, function( elem, i ) { 230 return callback.call( elem, i, elem ); 231 } ) ); 232 }, 233 234 slice: function() { 235 return this.pushStack( slice.apply( this, arguments ) ); 236 }, 237 238 first: function() { 239 return this.eq( 0 ); 240 }, 241 242 last: function() { 243 return this.eq( -1 ); 244 }, 245 246 even: function() { 247 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 248 return ( i + 1 ) % 2; 249 } ) ); 250 }, 251 252 odd: function() { 253 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 254 return i % 2; 255 } ) ); 256 }, 257 258 eq: function( i ) { 259 var len = this.length, 260 j = +i + ( i < 0 ? len : 0 ); 261 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 262 }, 263 264 end: function() { 265 return this.prevObject || this.constructor(); 266 }, 267 268 // For internal use only. 269 // Behaves like an Array's method, not like a jQuery method. 270 push: push, 271 sort: arr.sort, 272 splice: arr.splice 273}; 274 275jQuery.extend = jQuery.fn.extend = function() { 276 var options, name, src, copy, copyIsArray, clone, 277 target = arguments[ 0 ] || {}, 278 i = 1, 279 length = arguments.length, 280 deep = false; 281 282 // Handle a deep copy situation 283 if ( typeof target === "boolean" ) { 284 deep = target; 285 286 // Skip the boolean and the target 287 target = arguments[ i ] || {}; 288 i++; 289 } 290 291 // Handle case when target is a string or something (possible in deep copy) 292 if ( typeof target !== "object" && !isFunction( target ) ) { 293 target = {}; 294 } 295 296 // Extend jQuery itself if only one argument is passed 297 if ( i === length ) { 298 target = this; 299 i--; 300 } 301 302 for ( ; i < length; i++ ) { 303 304 // Only deal with non-null/undefined values 305 if ( ( options = arguments[ i ] ) != null ) { 306 307 // Extend the base object 308 for ( name in options ) { 309 copy = options[ name ]; 310 311 // Prevent Object.prototype pollution 312 // Prevent never-ending loop 313 if ( name === "__proto__" || target === copy ) { 314 continue; 315 } 316 317 // Recurse if we're merging plain objects or arrays 318 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 319 ( copyIsArray = Array.isArray( copy ) ) ) ) { 320 src = target[ name ]; 321 322 // Ensure proper type for the source value 323 if ( copyIsArray && !Array.isArray( src ) ) { 324 clone = []; 325 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { 326 clone = {}; 327 } else { 328 clone = src; 329 } 330 copyIsArray = false; 331 332 // Never move original objects, clone them 333 target[ name ] = jQuery.extend( deep, clone, copy ); 334 335 // Don't bring in undefined values 336 } else if ( copy !== undefined ) { 337 target[ name ] = copy; 338 } 339 } 340 } 341 } 342 343 // Return the modified object 344 return target; 345}; 346 347jQuery.extend( { 348 349 // Unique for each copy of jQuery on the page 350 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 351 352 // Assume jQuery is ready without the ready module 353 isReady: true, 354 355 error: function( msg ) { 356 throw new Error( msg ); 357 }, 358 359 noop: function() {}, 360 361 isPlainObject: function( obj ) { 362 var proto, Ctor; 363 364 // Detect obvious negatives 365 // Use toString instead of jQuery.type to catch host objects 366 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 367 return false; 368 } 369 370 proto = getProto( obj ); 371 372 // Objects with no prototype (e.g., `Object.create( null )`) are plain 373 if ( !proto ) { 374 return true; 375 } 376 377 // Objects with prototype are plain iff they were constructed by a global Object function 378 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; 379 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; 380 }, 381 382 isEmptyObject: function( obj ) { 383 var name; 384 385 for ( name in obj ) { 386 return false; 387 } 388 return true; 389 }, 390 391 // Evaluates a script in a provided context; falls back to the global one 392 // if not specified. 393 globalEval: function( code, options, doc ) { 394 DOMEval( code, { nonce: options && options.nonce }, doc ); 395 }, 396 397 each: function( obj, callback ) { 398 var length, i = 0; 399 400 if ( isArrayLike( obj ) ) { 401 length = obj.length; 402 for ( ; i < length; i++ ) { 403 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 404 break; 405 } 406 } 407 } else { 408 for ( i in obj ) { 409 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 410 break; 411 } 412 } 413 } 414 415 return obj; 416 }, 417 418 419 // Retrieve the text value of an array of DOM nodes 420 text: function( elem ) { 421 var node, 422 ret = "", 423 i = 0, 424 nodeType = elem.nodeType; 425 426 if ( !nodeType ) { 427 428 // If no nodeType, this is expected to be an array 429 while ( ( node = elem[ i++ ] ) ) { 430 431 // Do not traverse comment nodes 432 ret += jQuery.text( node ); 433 } 434 } 435 if ( nodeType === 1 || nodeType === 11 ) { 436 return elem.textContent; 437 } 438 if ( nodeType === 9 ) { 439 return elem.documentElement.textContent; 440 } 441 if ( nodeType === 3 || nodeType === 4 ) { 442 return elem.nodeValue; 443 } 444 445 // Do not include comment or processing instruction nodes 446 447 return ret; 448 }, 449 450 // results is for internal usage only 451 makeArray: function( arr, results ) { 452 var ret = results || []; 453 454 if ( arr != null ) { 455 if ( isArrayLike( Object( arr ) ) ) { 456 jQuery.merge( ret, 457 typeof arr === "string" ? 458 [ arr ] : arr 459 ); 460 } else { 461 push.call( ret, arr ); 462 } 463 } 464 465 return ret; 466 }, 467 468 inArray: function( elem, arr, i ) { 469 return arr == null ? -1 : indexOf.call( arr, elem, i ); 470 }, 471 472 isXMLDoc: function( elem ) { 473 var namespace = elem && elem.namespaceURI, 474 docElem = elem && ( elem.ownerDocument || elem ).documentElement; 475 476 // Assume HTML when documentElement doesn't yet exist, such as inside 477 // document fragments. 478 return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); 479 }, 480 481 // Support: Android <=4.0 only, PhantomJS 1 only 482 // push.apply(_, arraylike) throws on ancient WebKit 483 merge: function( first, second ) { 484 var len = +second.length, 485 j = 0, 486 i = first.length; 487 488 for ( ; j < len; j++ ) { 489 first[ i++ ] = second[ j ]; 490 } 491 492 first.length = i; 493 494 return first; 495 }, 496 497 grep: function( elems, callback, invert ) { 498 var callbackInverse, 499 matches = [], 500 i = 0, 501 length = elems.length, 502 callbackExpect = !invert; 503 504 // Go through the array, only saving the items 505 // that pass the validator function 506 for ( ; i < length; i++ ) { 507 callbackInverse = !callback( elems[ i ], i ); 508 if ( callbackInverse !== callbackExpect ) { 509 matches.push( elems[ i ] ); 510 } 511 } 512 513 return matches; 514 }, 515 516 // arg is for internal usage only 517 map: function( elems, callback, arg ) { 518 var length, value, 519 i = 0, 520 ret = []; 521 522 // Go through the array, translating each of the items to their new values 523 if ( isArrayLike( elems ) ) { 524 length = elems.length; 525 for ( ; i < length; i++ ) { 526 value = callback( elems[ i ], i, arg ); 527 528 if ( value != null ) {
vendor: 17,514 bytes, lines 529-1150
529 ret.push( value ); 530 } 531 } 532 533 // Go through every key on the object, 534 } else { 535 for ( i in elems ) { 536 value = callback( elems[ i ], i, arg ); 537 538 if ( value != null ) { 539 ret.push( value ); 540 } 541 } 542 } 543 544 // Flatten any nested arrays 545 return flat( ret ); 546 }, 547 548 // A global GUID counter for objects 549 guid: 1, 550 551 // jQuery.support is not used in Core but other projects attach their 552 // properties to it so it needs to exist. 553 support: support 554} ); 555 556if ( typeof Symbol === "function" ) { 557 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 558} 559 560// Populate the class2type map 561jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 562 function( _i, name ) { 563 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 564 } ); 565 566function isArrayLike( obj ) { 567 568 // Support: real iOS 8.2 only (not reproducible in simulator) 569 // `in` check used to prevent JIT error (gh-2145) 570 // hasOwn isn't used here due to false negatives 571 // regarding Nodelist length in IE 572 var length = !!obj && "length" in obj && obj.length, 573 type = toType( obj ); 574 575 if ( isFunction( obj ) || isWindow( obj ) ) { 576 return false; 577 } 578 579 return type === "array" || length === 0 || 580 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 581} 582 583 584function nodeName( elem, name ) { 585 586 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 587 588} 589var pop = arr.pop; 590 591 592var sort = arr.sort; 593 594 595var splice = arr.splice; 596 597 598var whitespace = "[\\x20\\t\\r\\n\\f]"; 599 600 601var rtrimCSS = new RegExp( 602 "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", 603 "g" 604); 605 606 607 608 609// Note: an element does not contain itself 610jQuery.contains = function( a, b ) { 611 var bup = b && b.parentNode; 612 613 return a === bup || !!( bup && bup.nodeType === 1 && ( 614 615 // Support: IE 9 - 11+ 616 // IE doesn't have `contains` on SVG. 617 a.contains ? 618 a.contains( bup ) : 619 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 620 ) ); 621}; 622 623 624 625 626// CSS string/identifier serialization 627// https://drafts.csswg.org/cssom/#common-serializing-idioms 628var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; 629 630function fcssescape( ch, asCodePoint ) { 631 if ( asCodePoint ) { 632 633 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 634 if ( ch === "\0" ) { 635 return "\uFFFD"; 636 } 637 638 // Control characters and (dependent upon position) numbers get escaped as code points 639 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 640 } 641 642 // Other potentially-special ASCII characters get backslash-escaped 643 return "\\" + ch; 644} 645 646jQuery.escapeSelector = function( sel ) { 647 return ( sel + "" ).replace( rcssescape, fcssescape ); 648}; 649 650 651 652 653var preferredDoc = document, 654 pushNative = push; 655 656( function() { 657 658var i, 659 Expr, 660 outermostContext, 661 sortInput, 662 hasDuplicate, 663 push = pushNative, 664 665 // Local document vars 666 document, 667 documentElement, 668 documentIsHTML, 669 rbuggyQSA, 670 matches, 671 672 // Instance-specific data 673 expando = jQuery.expando, 674 dirruns = 0, 675 done = 0, 676 classCache = createCache(), 677 tokenCache = createCache(), 678 compilerCache = createCache(), 679 nonnativeSelectorCache = createCache(), 680 sortOrder = function( a, b ) { 681 if ( a === b ) { 682 hasDuplicate = true; 683 } 684 return 0; 685 }, 686 687 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + 688 "loop|multiple|open|readonly|required|scoped", 689 690 // Regular expressions 691 692 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram 693 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + 694 "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", 695 696 // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors 697 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 698 699 // Operator (capture 2) 700 "*([*^$|!~]?=)" + whitespace + 701 702 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" 703 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + 704 whitespace + "*\\]", 705 706 pseudos = ":(" + identifier + ")(?:\\((" + 707 708 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 709 // 1. quoted (capture 3; capture 4 or capture 5) 710 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 711 712 // 2. simple (capture 6) 713 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 714 715 // 3. anything else (capture 2) 716 ".*" + 717 ")\\)|)", 718 719 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 720 rwhitespace = new RegExp( whitespace + "+", "g" ), 721 722 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 723 rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + 724 whitespace + "*" ), 725 rdescend = new RegExp( whitespace + "|>" ), 726 727 rpseudo = new RegExp( pseudos ), 728 ridentifier = new RegExp( "^" + identifier + "$" ), 729 730 matchExpr = { 731 ID: new RegExp( "^#(" + identifier + ")" ), 732 CLASS: new RegExp( "^\\.(" + identifier + ")" ), 733 TAG: new RegExp( "^(" + identifier + "|[*])" ), 734 ATTR: new RegExp( "^" + attributes ), 735 PSEUDO: new RegExp( "^" + pseudos ), 736 CHILD: new RegExp( 737 "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + 738 whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + 739 whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 740 bool: new RegExp( "^(?:" + booleans + ")$", "i" ), 741 742 // For use in libraries implementing .is() 743 // We use this for POS matching in `select` 744 needsContext: new RegExp( "^" + whitespace + 745 "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + 746 "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 747 }, 748 749 rinputs = /^(?:input|select|textarea|button)$/i, 750 rheader = /^h\d$/i, 751 752 // Easily-parseable/retrievable ID or TAG or CLASS selectors 753 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 754 755 rsibling = /[+~]/, 756 757 // CSS escapes 758 // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters 759 runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + 760 "?|\\\\([^\\r\\n\\f])", "g" ), 761 funescape = function( escape, nonHex ) { 762 var high = "0x" + escape.slice( 1 ) - 0x10000; 763 764 if ( nonHex ) { 765 766 // Strip the backslash prefix from a non-hex escape sequence 767 return nonHex; 768 } 769 770 // Replace a hexadecimal escape sequence with the encoded Unicode code point 771 // Support: IE <=11+ 772 // For values outside the Basic Multilingual Plane (BMP), manually construct a 773 // surrogate pair 774 return high < 0 ? 775 String.fromCharCode( high + 0x10000 ) : 776 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 777 }, 778 779 // Used for iframes; see `setDocument`. 780 // Support: IE 9 - 11+, Edge 12 - 18+ 781 // Removing the function wrapper causes a "Permission Denied" 782 // error in IE/Edge. 783 unloadHandler = function() { 784 setDocument(); 785 }, 786 787 inDisabledFieldset = addCombinator( 788 function( elem ) { 789 return elem.disabled === true && nodeName( elem, "fieldset" ); 790 }, 791 { dir: "parentNode", next: "legend" } 792 ); 793 794// Support: IE <=9 only 795// Accessing document.activeElement can throw unexpectedly 796// https://bugs.jquery.com/ticket/13393 797function safeActiveElement() { 798 try { 799 return document.activeElement; 800 } catch ( err ) { } 801} 802 803// Optimize for push.apply( _, NodeList ) 804try { 805 push.apply( 806 ( arr = slice.call( preferredDoc.childNodes ) ), 807 preferredDoc.childNodes 808 ); 809 810 // Support: Android <=4.0 811 // Detect silently failing push.apply 812 // eslint-disable-next-line no-unused-expressions 813 arr[ preferredDoc.childNodes.length ].nodeType; 814} catch ( e ) { 815 push = { 816 apply: function( target, els ) { 817 pushNative.apply( target, slice.call( els ) ); 818 }, 819 call: function( target ) { 820 pushNative.apply( target, slice.call( arguments, 1 ) ); 821 } 822 }; 823} 824 825function find( selector, context, results, seed ) { 826 var m, i, elem, nid, match, groups, newSelector, 827 newContext = context && context.ownerDocument, 828 829 // nodeType defaults to 9, since context defaults to document 830 nodeType = context ? context.nodeType : 9; 831 832 results = results || []; 833 834 // Return early from calls with invalid selector or context 835 if ( typeof selector !== "string" || !selector || 836 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 837 838 return results; 839 } 840 841 // Try to shortcut find operations (as opposed to filters) in HTML documents 842 if ( !seed ) { 843 setDocument( context ); 844 context = context || document; 845 846 if ( documentIsHTML ) { 847 848 // If the selector is sufficiently simple, try using a "get*By*" DOM method 849 // (excepting DocumentFragment context, where the methods don't exist) 850 if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { 851 852 // ID selector 853 if ( ( m = match[ 1 ] ) ) { 854 855 // Document context 856 if ( nodeType === 9 ) { 857 if ( ( elem = context.getElementById( m ) ) ) { 858 859 // Support: IE 9 only 860 // getElementById can match elements by name instead of ID 861 if ( elem.id === m ) { 862 push.call( results, elem ); 863 return results; 864 } 865 } else { 866 return results; 867 } 868 869 // Element context 870 } else { 871 872 // Support: IE 9 only 873 // getElementById can match elements by name instead of ID 874 if ( newContext && ( elem = newContext.getElementById( m ) ) && 875 find.contains( context, elem ) && 876 elem.id === m ) { 877 878 push.call( results, elem ); 879 return results; 880 } 881 } 882 883 // Type selector 884 } else if ( match[ 2 ] ) { 885 push.apply( results, context.getElementsByTagName( selector ) ); 886 return results; 887 888 // Class selector 889 } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { 890 push.apply( results, context.getElementsByClassName( m ) ); 891 return results; 892 } 893 } 894 895 // Take advantage of querySelectorAll 896 if ( !nonnativeSelectorCache[ selector + " " ] && 897 ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { 898 899 newSelector = selector; 900 newContext = context; 901 902 // qSA considers elements outside a scoping root when evaluating child or 903 // descendant combinators, which is not what we want. 904 // In such cases, we work around the behavior by prefixing every selector in the 905 // list with an ID selector referencing the scope context. 906 // The technique has to be used as well when a leading combinator is used 907 // as such selectors are not recognized by querySelectorAll. 908 // Thanks to Andrew Dupont for this technique. 909 if ( nodeType === 1 && 910 ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { 911 912 // Expand context for sibling selectors 913 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 914 context; 915 916 // We can use :scope instead of the ID hack if the browser 917 // supports it & if we're not changing the context. 918 // Support: IE 11+, Edge 17 - 18+ 919 // IE/Edge sometimes throw a "Permission denied" error when 920 // strict-comparing two documents; shallow comparisons work. 921 // eslint-disable-next-line eqeqeq 922 if ( newContext != context || !support.scope ) { 923 924 // Capture the context ID, setting it first if necessary 925 if ( ( nid = context.getAttribute( "id" ) ) ) { 926 nid = jQuery.escapeSelector( nid ); 927 } else { 928 context.setAttribute( "id", ( nid = expando ) ); 929 } 930 } 931 932 // Prefix every selector in the list 933 groups = tokenize( selector ); 934 i = groups.length; 935 while ( i-- ) { 936 groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + 937 toSelector( groups[ i ] ); 938 } 939 newSelector = groups.join( "," ); 940 } 941 942 try { 943 push.apply( results, 944 newContext.querySelectorAll( newSelector ) 945 ); 946 return results; 947 } catch ( qsaError ) { 948 nonnativeSelectorCache( selector, true ); 949 } finally { 950 if ( nid === expando ) { 951 context.removeAttribute( "id" ); 952 } 953 } 954 } 955 } 956 } 957 958 // All others 959 return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); 960} 961 962/** 963 * Create key-value caches of limited size 964 * @returns {function(string, object)} Returns the Object data after storing it on itself with 965 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 966 * deleting the oldest entry 967 */ 968function createCache() { 969 var keys = []; 970 971 function cache( key, value ) { 972 973 // Use (key + " ") to avoid collision with native prototype properties 974 // (see https://github.com/jquery/sizzle/issues/157) 975 if ( keys.push( key + " " ) > Expr.cacheLength ) { 976 977 // Only keep the most recent entries 978 delete cache[ keys.shift() ]; 979 } 980 return ( cache[ key + " " ] = value ); 981 } 982 return cache; 983} 984 985/** 986 * Mark a function for special use by jQuery selector module 987 * @param {Function} fn The function to mark 988 */ 989function markFunction( fn ) { 990 fn[ expando ] = true; 991 return fn; 992} 993 994/** 995 * Support testing using an element 996 * @param {Function} fn Passed the created element and returns a boolean result 997 */ 998function assert( fn ) { 999 var el = document.createElement( "fieldset" ); 1000 1001 try { 1002 return !!fn( el ); 1003 } catch ( e ) { 1004 return false; 1005 } finally { 1006 1007 // Remove from its parent by default 1008 if ( el.parentNode ) { 1009 el.parentNode.removeChild( el ); 1010 } 1011 1012 // release memory in IE 1013 el = null; 1014 } 1015} 1016 1017/** 1018 * Returns a function to use in pseudos for input types 1019 * @param {String} type 1020 */ 1021function createInputPseudo( type ) { 1022 return function( elem ) { 1023 return nodeName( elem, "input" ) && elem.type === type; 1024 }; 1025} 1026 1027/** 1028 * Returns a function to use in pseudos for buttons 1029 * @param {String} type 1030 */ 1031function createButtonPseudo( type ) { 1032 return function( elem ) { 1033 return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && 1034 elem.type === type; 1035 }; 1036} 1037 1038/** 1039 * Returns a function to use in pseudos for :enabled/:disabled 1040 * @param {Boolean} disabled true for :disabled; false for :enabled 1041 */ 1042function createDisabledPseudo( disabled ) { 1043 1044 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 1045 return function( elem ) { 1046 1047 // Only certain elements can match :enabled or :disabled 1048 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 1049 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 1050 if ( "form" in elem ) { 1051 1052 // Check for inherited disabledness on relevant non-disabled elements: 1053 // * listed form-associated elements in a disabled fieldset 1054 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 1055 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 1056 // * option elements in a disabled optgroup 1057 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 1058 // All such elements have a "form" property. 1059 if ( elem.parentNode && elem.disabled === false ) { 1060 1061 // Option elements defer to a parent optgroup if present 1062 if ( "label" in elem ) { 1063 if ( "label" in elem.parentNode ) { 1064 return elem.parentNode.disabled === disabled; 1065 } else { 1066 return elem.disabled === disabled; 1067 } 1068 } 1069 1070 // Support: IE 6 - 11+ 1071 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 1072 return elem.isDisabled === disabled || 1073 1074 // Where there is no isDisabled, check manually 1075 elem.isDisabled !== !disabled && 1076 inDisabledFieldset( elem ) === disabled; 1077 } 1078 1079 return elem.disabled === disabled; 1080 1081 // Try to winnow out elements that can't be disabled before trusting the disabled property. 1082 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 1083 // even exist on them, let alone have a boolean value. 1084 } else if ( "label" in elem ) { 1085 return elem.disabled === disabled; 1086 } 1087 1088 // Remaining elements are neither :enabled nor :disabled 1089 return false; 1090 }; 1091} 1092 1093/** 1094 * Returns a function to use in pseudos for positionals 1095 * @param {Function} fn 1096 */ 1097function createPositionalPseudo( fn ) { 1098 return markFunction( function( argument ) { 1099 argument = +argument; 1100 return markFunction( function( seed, matches ) { 1101 var j, 1102 matchIndexes = fn( [], seed.length, argument ), 1103 i = matchIndexes.length; 1104 1105 // Match elements found at the specified indexes 1106 while ( i-- ) { 1107 if ( seed[ ( j = matchIndexes[ i ] ) ] ) { 1108 seed[ j ] = !( matches[ j ] = seed[ j ] ); 1109 } 1110 } 1111 } ); 1112 } ); 1113} 1114 1115/** 1116 * Checks a node for validity as a jQuery selector context 1117 * @param {Element|Object=} context 1118 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 1119 */ 1120function testContext( context ) { 1121 return context && typeof context.getElementsByTagName !== "undefined" && context; 1122} 1123 1124/** 1125 * Sets document-related variables once based on the current document 1126 * @param {Element|Object} [node] An element or document object to use to set the document 1127 * @returns {Object} Returns the current document 1128 */ 1129function setDocument( node ) { 1130 var subWindow, 1131 doc = node ? node.ownerDocument || node : preferredDoc; 1132 1133 // Return early if doc is invalid or already selected 1134 // Support: IE 11+, Edge 17 - 18+ 1135 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1136 // two documents; shallow comparisons work. 1137 // eslint-disable-next-line eqeqeq 1138 if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { 1139 return document; 1140 } 1141 1142 // Update global variables 1143 document = doc; 1144 documentElement = document.documentElement; 1145 documentIsHTML = !jQuery.isXMLDoc( document ); 1146 1147 // Support: iOS 7 only, IE 9 - 11+ 1148 // Older browsers didn't support unprefixed `matches`. 1149 matches = documentElement.matches || 1150 documentElement.webkitMatchesSelector ||
vendor: 4,667 bytes, lines 1151-1302
1151 documentElement.msMatchesSelector; 1152 1153 // Support: IE 9 - 11+, Edge 12 - 18+ 1154 // Accessing iframe documents after unload throws "permission denied" errors 1155 // (see trac-13936). 1156 // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, 1157 // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. 1158 if ( documentElement.msMatchesSelector && 1159 1160 // Support: IE 11+, Edge 17 - 18+ 1161 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1162 // two documents; shallow comparisons work. 1163 // eslint-disable-next-line eqeqeq 1164 preferredDoc != document && 1165 ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { 1166 1167 // Support: IE 9 - 11+, Edge 12 - 18+ 1168 subWindow.addEventListener( "unload", unloadHandler ); 1169 } 1170 1171 // Support: IE <10 1172 // Check if getElementById returns elements by name 1173 // The broken getElementById methods don't pick up programmatically-set names, 1174 // so use a roundabout getElementsByName test 1175 support.getById = assert( function( el ) { 1176 documentElement.appendChild( el ).id = jQuery.expando; 1177 return !document.getElementsByName || 1178 !document.getElementsByName( jQuery.expando ).length; 1179 } ); 1180 1181 // Support: IE 9 only 1182 // Check to see if it's possible to do matchesSelector 1183 // on a disconnected node. 1184 support.disconnectedMatch = assert( function( el ) { 1185 return matches.call( el, "*" ); 1186 } ); 1187 1188 // Support: IE 9 - 11+, Edge 12 - 18+ 1189 // IE/Edge don't support the :scope pseudo-class. 1190 support.scope = assert( function() { 1191 return document.querySelectorAll( ":scope" ); 1192 } ); 1193 1194 // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only 1195 // Make sure the `:has()` argument is parsed unforgivingly. 1196 // We include `*` in the test to detect buggy implementations that are 1197 // _selectively_ forgiving (specifically when the list includes at least 1198 // one valid selector). 1199 // Note that we treat complete lack of support for `:has()` as if it were 1200 // spec-compliant support, which is fine because use of `:has()` in such 1201 // environments will fail in the qSA path and fall back to jQuery traversal 1202 // anyway. 1203 support.cssHas = assert( function() { 1204 try { 1205 document.querySelector( ":has(*,:jqfake)" ); 1206 return false; 1207 } catch ( e ) { 1208 return true; 1209 } 1210 } ); 1211 1212 // ID filter and find 1213 if ( support.getById ) { 1214 Expr.filter.ID = function( id ) { 1215 var attrId = id.replace( runescape, funescape ); 1216 return function( elem ) { 1217 return elem.getAttribute( "id" ) === attrId; 1218 }; 1219 }; 1220 Expr.find.ID = function( id, context ) { 1221 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1222 var elem = context.getElementById( id ); 1223 return elem ? [ elem ] : []; 1224 } 1225 }; 1226 } else { 1227 Expr.filter.ID = function( id ) { 1228 var attrId = id.replace( runescape, funescape ); 1229 return function( elem ) { 1230 var node = typeof elem.getAttributeNode !== "undefined" && 1231 elem.getAttributeNode( "id" ); 1232 return node && node.value === attrId; 1233 }; 1234 }; 1235 1236 // Support: IE 6 - 7 only 1237 // getElementById is not reliable as a find shortcut 1238 Expr.find.ID = function( id, context ) { 1239 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1240 var node, i, elems, 1241 elem = context.getElementById( id ); 1242 1243 if ( elem ) { 1244 1245 // Verify the id attribute 1246 node = elem.getAttributeNode( "id" ); 1247 if ( node && node.value === id ) { 1248 return [ elem ]; 1249 } 1250 1251 // Fall back on getElementsByName 1252 elems = context.getElementsByName( id ); 1253 i = 0; 1254 while ( ( elem = elems[ i++ ] ) ) { 1255 node = elem.getAttributeNode( "id" ); 1256 if ( node && node.value === id ) { 1257 return [ elem ]; 1258 } 1259 } 1260 } 1261 1262 return []; 1263 } 1264 }; 1265 } 1266 1267 // Tag 1268 Expr.find.TAG = function( tag, context ) { 1269 if ( typeof context.getElementsByTagName !== "undefined" ) { 1270 return context.getElementsByTagName( tag ); 1271 1272 // DocumentFragment nodes don't have gEBTN 1273 } else { 1274 return context.querySelectorAll( tag ); 1275 } 1276 }; 1277 1278 // Class 1279 Expr.find.CLASS = function( className, context ) { 1280 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 1281 return context.getElementsByClassName( className ); 1282 } 1283 }; 1284 1285 /* QSA/matchesSelector 1286 ---------------------------------------------------------------------- */ 1287 1288 // QSA and matchesSelector support 1289 1290 rbuggyQSA = []; 1291 1292 // Build QSA regex 1293 // Regex strategy adopted from Diego Perini 1294 assert( function( el ) { 1295 1296 var input; 1297 1298 documentElement.appendChild( el ).innerHTML = 1299 "<a id='" + expando + "' href='' disabled='disabled'></a>" + 1300 "<select id='" + expando + "-\r\\' disabled='disabled'>" + 1301 "<option selected=''></option></select>"; 1302
vendor: 38,614 bytes, lines 1303-2674
1303 // Support: iOS <=7 - 8 only 1304 // Boolean attributes and "value" are not treated correctly in some XML documents 1305 if ( !el.querySelectorAll( "[selected]" ).length ) { 1306 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 1307 } 1308 1309 // Support: iOS <=7 - 8 only 1310 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 1311 rbuggyQSA.push( "~=" ); 1312 } 1313 1314 // Support: iOS 8 only 1315 // https://bugs.webkit.org/show_bug.cgi?id=136851 1316 // In-page `selector#id sibling-combinator selector` fails 1317 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 1318 rbuggyQSA.push( ".#.+[+~]" ); 1319 } 1320 1321 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ 1322 // In some of the document kinds, these selectors wouldn't work natively. 1323 // This is probably OK but for backwards compatibility we want to maintain 1324 // handling them through jQuery traversal in jQuery 3.x. 1325 if ( !el.querySelectorAll( ":checked" ).length ) { 1326 rbuggyQSA.push( ":checked" ); 1327 } 1328 1329 // Support: Windows 8 Native Apps 1330 // The type and name attributes are restricted during .innerHTML assignment 1331 input = document.createElement( "input" ); 1332 input.setAttribute( "type", "hidden" ); 1333 el.appendChild( input ).setAttribute( "name", "D" ); 1334 1335 // Support: IE 9 - 11+ 1336 // IE's :disabled selector does not pick up the children of disabled fieldsets 1337 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ 1338 // In some of the document kinds, these selectors wouldn't work natively. 1339 // This is probably OK but for backwards compatibility we want to maintain 1340 // handling them through jQuery traversal in jQuery 3.x. 1341 documentElement.appendChild( el ).disabled = true; 1342 if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { 1343 rbuggyQSA.push( ":enabled", ":disabled" ); 1344 } 1345 1346 // Support: IE 11+, Edge 15 - 18+ 1347 // IE 11/Edge don't find elements on a `[name='']` query in some cases. 1348 // Adding a temporary attribute to the document before the selection works 1349 // around the issue. 1350 // Interestingly, IE 10 & older don't seem to have the issue. 1351 input = document.createElement( "input" ); 1352 input.setAttribute( "name", "" ); 1353 el.appendChild( input ); 1354 if ( !el.querySelectorAll( "[name='']" ).length ) { 1355 rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + 1356 whitespace + "*(?:''|\"\")" ); 1357 } 1358 } ); 1359 1360 if ( !support.cssHas ) { 1361 1362 // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ 1363 // Our regular `try-catch` mechanism fails to detect natively-unsupported 1364 // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) 1365 // in browsers that parse the `:has()` argument as a forgiving selector list. 1366 // https://drafts.csswg.org/selectors/#relational now requires the argument 1367 // to be parsed unforgivingly, but browsers have not yet fully adjusted. 1368 rbuggyQSA.push( ":has" ); 1369 } 1370 1371 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); 1372 1373 /* Sorting 1374 ---------------------------------------------------------------------- */ 1375 1376 // Document order sorting 1377 sortOrder = function( a, b ) { 1378 1379 // Flag for duplicate removal 1380 if ( a === b ) { 1381 hasDuplicate = true; 1382 return 0; 1383 } 1384 1385 // Sort on method existence if only one input has compareDocumentPosition 1386 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 1387 if ( compare ) { 1388 return compare; 1389 } 1390 1391 // Calculate position if both inputs belong to the same document 1392 // Support: IE 11+, Edge 17 - 18+ 1393 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1394 // two documents; shallow comparisons work. 1395 // eslint-disable-next-line eqeqeq 1396 compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? 1397 a.compareDocumentPosition( b ) : 1398 1399 // Otherwise we know they are disconnected 1400 1; 1401 1402 // Disconnected nodes 1403 if ( compare & 1 || 1404 ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { 1405 1406 // Choose the first element that is related to our preferred document 1407 // Support: IE 11+, Edge 17 - 18+ 1408 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1409 // two documents; shallow comparisons work. 1410 // eslint-disable-next-line eqeqeq 1411 if ( a === document || a.ownerDocument == preferredDoc && 1412 find.contains( preferredDoc, a ) ) { 1413 return -1; 1414 } 1415 1416 // Support: IE 11+, Edge 17 - 18+ 1417 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1418 // two documents; shallow comparisons work. 1419 // eslint-disable-next-line eqeqeq 1420 if ( b === document || b.ownerDocument == preferredDoc && 1421 find.contains( preferredDoc, b ) ) { 1422 return 1; 1423 } 1424 1425 // Maintain original order 1426 return sortInput ? 1427 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 1428 0; 1429 } 1430 1431 return compare & 4 ? -1 : 1; 1432 }; 1433 1434 return document; 1435} 1436 1437find.matches = function( expr, elements ) { 1438 return find( expr, null, null, elements ); 1439}; 1440 1441find.matchesSelector = function( elem, expr ) { 1442 setDocument( elem ); 1443 1444 if ( documentIsHTML && 1445 !nonnativeSelectorCache[ expr + " " ] && 1446 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 1447 1448 try { 1449 var ret = matches.call( elem, expr ); 1450 1451 // IE 9's matchesSelector returns false on disconnected nodes 1452 if ( ret || support.disconnectedMatch || 1453 1454 // As well, disconnected nodes are said to be in a document 1455 // fragment in IE 9 1456 elem.document && elem.document.nodeType !== 11 ) { 1457 return ret; 1458 } 1459 } catch ( e ) { 1460 nonnativeSelectorCache( expr, true ); 1461 } 1462 } 1463 1464 return find( expr, document, null, [ elem ] ).length > 0; 1465}; 1466 1467find.contains = function( context, elem ) { 1468 1469 // Set document vars if needed 1470 // Support: IE 11+, Edge 17 - 18+ 1471 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1472 // two documents; shallow comparisons work. 1473 // eslint-disable-next-line eqeqeq 1474 if ( ( context.ownerDocument || context ) != document ) { 1475 setDocument( context ); 1476 } 1477 return jQuery.contains( context, elem ); 1478}; 1479 1480 1481find.attr = function( elem, name ) { 1482 1483 // Set document vars if needed 1484 // Support: IE 11+, Edge 17 - 18+ 1485 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1486 // two documents; shallow comparisons work. 1487 // eslint-disable-next-line eqeqeq 1488 if ( ( elem.ownerDocument || elem ) != document ) { 1489 setDocument( elem ); 1490 } 1491 1492 var fn = Expr.attrHandle[ name.toLowerCase() ], 1493 1494 // Don't get fooled by Object.prototype properties (see trac-13807) 1495 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 1496 fn( elem, name, !documentIsHTML ) : 1497 undefined; 1498 1499 if ( val !== undefined ) { 1500 return val; 1501 } 1502 1503 return elem.getAttribute( name ); 1504}; 1505 1506find.error = function( msg ) { 1507 throw new Error( "Syntax error, unrecognized expression: " + msg ); 1508}; 1509 1510/** 1511 * Document sorting and removing duplicates 1512 * @param {ArrayLike} results 1513 */ 1514jQuery.uniqueSort = function( results ) { 1515 var elem, 1516 duplicates = [], 1517 j = 0, 1518 i = 0; 1519 1520 // Unless we *know* we can detect duplicates, assume their presence 1521 // 1522 // Support: Android <=4.0+ 1523 // Testing for detecting duplicates is unpredictable so instead assume we can't 1524 // depend on duplicate detection in all browsers without a stable sort. 1525 hasDuplicate = !support.sortStable; 1526 sortInput = !support.sortStable && slice.call( results, 0 ); 1527 sort.call( results, sortOrder ); 1528 1529 if ( hasDuplicate ) { 1530 while ( ( elem = results[ i++ ] ) ) { 1531 if ( elem === results[ i ] ) { 1532 j = duplicates.push( i ); 1533 } 1534 } 1535 while ( j-- ) { 1536 splice.call( results, duplicates[ j ], 1 ); 1537 } 1538 } 1539 1540 // Clear input after sorting to release objects 1541 // See https://github.com/jquery/sizzle/pull/225 1542 sortInput = null; 1543 1544 return results; 1545}; 1546 1547jQuery.fn.uniqueSort = function() { 1548 return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); 1549}; 1550 1551Expr = jQuery.expr = { 1552 1553 // Can be adjusted by the user 1554 cacheLength: 50, 1555 1556 createPseudo: markFunction, 1557 1558 match: matchExpr, 1559 1560 attrHandle: {}, 1561 1562 find: {}, 1563 1564 relative: { 1565 ">": { dir: "parentNode", first: true }, 1566 " ": { dir: "parentNode" }, 1567 "+": { dir: "previousSibling", first: true }, 1568 "~": { dir: "previousSibling" } 1569 }, 1570 1571 preFilter: { 1572 ATTR: function( match ) { 1573 match[ 1 ] = match[ 1 ].replace( runescape, funescape ); 1574 1575 // Move the given value to match[3] whether quoted or unquoted 1576 match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) 1577 .replace( runescape, funescape ); 1578 1579 if ( match[ 2 ] === "~=" ) { 1580 match[ 3 ] = " " + match[ 3 ] + " "; 1581 } 1582 1583 return match.slice( 0, 4 ); 1584 }, 1585 1586 CHILD: function( match ) { 1587 1588 /* matches from matchExpr["CHILD"] 1589 1 type (only|nth|...) 1590 2 what (child|of-type) 1591 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 1592 4 xn-component of xn+y argument ([+-]?\d*n|) 1593 5 sign of xn-component 1594 6 x of xn-component 1595 7 sign of y-component 1596 8 y of y-component 1597 */ 1598 match[ 1 ] = match[ 1 ].toLowerCase(); 1599 1600 if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { 1601 1602 // nth-* requires argument 1603 if ( !match[ 3 ] ) { 1604 find.error( match[ 0 ] ); 1605 } 1606 1607 // numeric x and y parameters for Expr.filter.CHILD 1608 // remember that false/true cast respectively to 0/1 1609 match[ 4 ] = +( match[ 4 ] ? 1610 match[ 5 ] + ( match[ 6 ] || 1 ) : 1611 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) 1612 ); 1613 match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); 1614 1615 // other types prohibit arguments 1616 } else if ( match[ 3 ] ) { 1617 find.error( match[ 0 ] ); 1618 } 1619 1620 return match; 1621 }, 1622 1623 PSEUDO: function( match ) { 1624 var excess, 1625 unquoted = !match[ 6 ] && match[ 2 ]; 1626 1627 if ( matchExpr.CHILD.test( match[ 0 ] ) ) { 1628 return null; 1629 } 1630 1631 // Accept quoted arguments as-is 1632 if ( match[ 3 ] ) { 1633 match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; 1634 1635 // Strip excess characters from unquoted arguments 1636 } else if ( unquoted && rpseudo.test( unquoted ) && 1637 1638 // Get excess from tokenize (recursively) 1639 ( excess = tokenize( unquoted, true ) ) && 1640 1641 // advance to the next closing parenthesis 1642 ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { 1643 1644 // excess is a negative index 1645 match[ 0 ] = match[ 0 ].slice( 0, excess ); 1646 match[ 2 ] = unquoted.slice( 0, excess ); 1647 } 1648 1649 // Return only captures needed by the pseudo filter method (type and argument) 1650 return match.slice( 0, 3 ); 1651 } 1652 }, 1653 1654 filter: { 1655 1656 TAG: function( nodeNameSelector ) { 1657 var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 1658 return nodeNameSelector === "*" ? 1659 function() { 1660 return true; 1661 } : 1662 function( elem ) { 1663 return nodeName( elem, expectedNodeName ); 1664 }; 1665 }, 1666 1667 CLASS: function( className ) { 1668 var pattern = classCache[ className + " " ]; 1669 1670 return pattern || 1671 ( pattern = new RegExp( "(^|" + whitespace + ")" + className + 1672 "(" + whitespace + "|$)" ) ) && 1673 classCache( className, function( elem ) { 1674 return pattern.test( 1675 typeof elem.className === "string" && elem.className || 1676 typeof elem.getAttribute !== "undefined" && 1677 elem.getAttribute( "class" ) || 1678 "" 1679 ); 1680 } ); 1681 }, 1682 1683 ATTR: function( name, operator, check ) { 1684 return function( elem ) { 1685 var result = find.attr( elem, name ); 1686 1687 if ( result == null ) { 1688 return operator === "!="; 1689 } 1690 if ( !operator ) { 1691 return true; 1692 } 1693 1694 result += ""; 1695 1696 if ( operator === "=" ) { 1697 return result === check; 1698 } 1699 if ( operator === "!=" ) { 1700 return result !== check; 1701 } 1702 if ( operator === "^=" ) { 1703 return check && result.indexOf( check ) === 0; 1704 } 1705 if ( operator === "*=" ) { 1706 return check && result.indexOf( check ) > -1; 1707 } 1708 if ( operator === "$=" ) { 1709 return check && result.slice( -check.length ) === check; 1710 } 1711 if ( operator === "~=" ) { 1712 return ( " " + result.replace( rwhitespace, " " ) + " " ) 1713 .indexOf( check ) > -1; 1714 } 1715 if ( operator === "|=" ) { 1716 return result === check || result.slice( 0, check.length + 1 ) === check + "-"; 1717 } 1718 1719 return false; 1720 }; 1721 }, 1722 1723 CHILD: function( type, what, _argument, first, last ) { 1724 var simple = type.slice( 0, 3 ) !== "nth", 1725 forward = type.slice( -4 ) !== "last", 1726 ofType = what === "of-type"; 1727 1728 return first === 1 && last === 0 ? 1729 1730 // Shortcut for :nth-*(n) 1731 function( elem ) { 1732 return !!elem.parentNode; 1733 } : 1734 1735 function( elem, _context, xml ) { 1736 var cache, outerCache, node, nodeIndex, start, 1737 dir = simple !== forward ? "nextSibling" : "previousSibling", 1738 parent = elem.parentNode, 1739 name = ofType && elem.nodeName.toLowerCase(), 1740 useCache = !xml && !ofType, 1741 diff = false; 1742 1743 if ( parent ) { 1744 1745 // :(first|last|only)-(child|of-type) 1746 if ( simple ) { 1747 while ( dir ) { 1748 node = elem; 1749 while ( ( node = node[ dir ] ) ) { 1750 if ( ofType ? 1751 nodeName( node, name ) : 1752 node.nodeType === 1 ) { 1753 1754 return false; 1755 } 1756 } 1757 1758 // Reverse direction for :only-* (if we haven't yet done so) 1759 start = dir = type === "only" && !start && "nextSibling"; 1760 } 1761 return true; 1762 } 1763 1764 start = [ forward ? parent.firstChild : parent.lastChild ]; 1765 1766 // non-xml :nth-child(...) stores cache data on `parent` 1767 if ( forward && useCache ) { 1768 1769 // Seek `elem` from a previously-cached index 1770 outerCache = parent[ expando ] || ( parent[ expando ] = {} ); 1771 cache = outerCache[ type ] || []; 1772 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 1773 diff = nodeIndex && cache[ 2 ]; 1774 node = nodeIndex && parent.childNodes[ nodeIndex ]; 1775 1776 while ( ( node = ++nodeIndex && node && node[ dir ] || 1777 1778 // Fallback to seeking `elem` from the start 1779 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 1780 1781 // When found, cache indexes on `parent` and break 1782 if ( node.nodeType === 1 && ++diff && node === elem ) { 1783 outerCache[ type ] = [ dirruns, nodeIndex, diff ]; 1784 break; 1785 } 1786 } 1787 1788 } else { 1789 1790 // Use previously-cached element index if available 1791 if ( useCache ) { 1792 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 1793 cache = outerCache[ type ] || []; 1794 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 1795 diff = nodeIndex; 1796 } 1797 1798 // xml :nth-child(...) 1799 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 1800 if ( diff === false ) { 1801 1802 // Use the same loop as above to seek `elem` from the start 1803 while ( ( node = ++nodeIndex && node && node[ dir ] || 1804 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 1805 1806 if ( ( ofType ? 1807 nodeName( node, name ) : 1808 node.nodeType === 1 ) && 1809 ++diff ) { 1810 1811 // Cache the index of each encountered element 1812 if ( useCache ) { 1813 outerCache = node[ expando ] || 1814 ( node[ expando ] = {} ); 1815 outerCache[ type ] = [ dirruns, diff ]; 1816 } 1817 1818 if ( node === elem ) { 1819 break; 1820 } 1821 } 1822 } 1823 } 1824 } 1825 1826 // Incorporate the offset, then check against cycle size 1827 diff -= last; 1828 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 1829 } 1830 }; 1831 }, 1832 1833 PSEUDO: function( pseudo, argument ) { 1834 1835 // pseudo-class names are case-insensitive 1836 // https://www.w3.org/TR/selectors/#pseudo-classes 1837 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 1838 // Remember that setFilters inherits from pseudos 1839 var args, 1840 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 1841 find.error( "unsupported pseudo: " + pseudo ); 1842 1843 // The user may use createPseudo to indicate that 1844 // arguments are needed to create the filter function 1845 // just as jQuery does 1846 if ( fn[ expando ] ) { 1847 return fn( argument ); 1848 } 1849 1850 // But maintain support for old signatures 1851 if ( fn.length > 1 ) { 1852 args = [ pseudo, pseudo, "", argument ]; 1853 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 1854 markFunction( function( seed, matches ) { 1855 var idx, 1856 matched = fn( seed, argument ), 1857 i = matched.length; 1858 while ( i-- ) { 1859 idx = indexOf.call( seed, matched[ i ] ); 1860 seed[ idx ] = !( matches[ idx ] = matched[ i ] ); 1861 } 1862 } ) : 1863 function( elem ) { 1864 return fn( elem, 0, args ); 1865 }; 1866 } 1867 1868 return fn; 1869 } 1870 }, 1871 1872 pseudos: { 1873 1874 // Potentially complex pseudos 1875 not: markFunction( function( selector ) { 1876 1877 // Trim the selector passed to compile 1878 // to avoid treating leading and trailing 1879 // spaces as combinators 1880 var input = [], 1881 results = [], 1882 matcher = compile( selector.replace( rtrimCSS, "$1" ) ); 1883 1884 return matcher[ expando ] ? 1885 markFunction( function( seed, matches, _context, xml ) { 1886 var elem, 1887 unmatched = matcher( seed, null, xml, [] ), 1888 i = seed.length; 1889 1890 // Match elements unmatched by `matcher` 1891 while ( i-- ) { 1892 if ( ( elem = unmatched[ i ] ) ) { 1893 seed[ i ] = !( matches[ i ] = elem ); 1894 } 1895 } 1896 } ) : 1897 function( elem, _context, xml ) { 1898 input[ 0 ] = elem; 1899 matcher( input, null, xml, results ); 1900 1901 // Don't keep the element 1902 // (see https://github.com/jquery/sizzle/issues/299) 1903 input[ 0 ] = null; 1904 return !results.pop(); 1905 }; 1906 } ), 1907 1908 has: markFunction( function( selector ) { 1909 return function( elem ) { 1910 return find( selector, elem ).length > 0; 1911 }; 1912 } ), 1913 1914 contains: markFunction( function( text ) { 1915 text = text.replace( runescape, funescape ); 1916 return function( elem ) { 1917 return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; 1918 }; 1919 } ), 1920 1921 // "Whether an element is represented by a :lang() selector 1922 // is based solely on the element's language value 1923 // being equal to the identifier C, 1924 // or beginning with the identifier C immediately followed by "-". 1925 // The matching of C against the element's language value is performed case-insensitively. 1926 // The identifier C does not have to be a valid language name." 1927 // https://www.w3.org/TR/selectors/#lang-pseudo 1928 lang: markFunction( function( lang ) { 1929 1930 // lang value must be a valid identifier 1931 if ( !ridentifier.test( lang || "" ) ) { 1932 find.error( "unsupported lang: " + lang ); 1933 } 1934 lang = lang.replace( runescape, funescape ).toLowerCase(); 1935 return function( elem ) { 1936 var elemLang; 1937 do { 1938 if ( ( elemLang = documentIsHTML ? 1939 elem.lang : 1940 elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { 1941 1942 elemLang = elemLang.toLowerCase(); 1943 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 1944 } 1945 } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); 1946 return false; 1947 }; 1948 } ), 1949 1950 // Miscellaneous 1951 target: function( elem ) { 1952 var hash = window.location && window.location.hash; 1953 return hash && hash.slice( 1 ) === elem.id; 1954 }, 1955 1956 root: function( elem ) { 1957 return elem === documentElement; 1958 }, 1959 1960 focus: function( elem ) { 1961 return elem === safeActiveElement() && 1962 document.hasFocus() && 1963 !!( elem.type || elem.href || ~elem.tabIndex ); 1964 }, 1965 1966 // Boolean properties 1967 enabled: createDisabledPseudo( false ), 1968 disabled: createDisabledPseudo( true ), 1969 1970 checked: function( elem ) { 1971 1972 // In CSS3, :checked should return both checked and selected elements 1973 // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1974 return ( nodeName( elem, "input" ) && !!elem.checked ) || 1975 ( nodeName( elem, "option" ) && !!elem.selected ); 1976 }, 1977 1978 selected: function( elem ) { 1979 1980 // Support: IE <=11+ 1981 // Accessing the selectedIndex property 1982 // forces the browser to treat the default option as 1983 // selected when in an optgroup. 1984 if ( elem.parentNode ) { 1985 // eslint-disable-next-line no-unused-expressions 1986 elem.parentNode.selectedIndex; 1987 } 1988 1989 return elem.selected === true; 1990 }, 1991 1992 // Contents 1993 empty: function( elem ) { 1994 1995 // https://www.w3.org/TR/selectors/#empty-pseudo 1996 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 1997 // but not by others (comment: 8; processing instruction: 7; etc.) 1998 // nodeType < 6 works because attributes (2) do not appear as children 1999 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 2000 if ( elem.nodeType < 6 ) { 2001 return false; 2002 } 2003 } 2004 return true; 2005 }, 2006 2007 parent: function( elem ) { 2008 return !Expr.pseudos.empty( elem ); 2009 }, 2010 2011 // Element/input types 2012 header: function( elem ) { 2013 return rheader.test( elem.nodeName ); 2014 }, 2015 2016 input: function( elem ) { 2017 return rinputs.test( elem.nodeName ); 2018 }, 2019 2020 button: function( elem ) { 2021 return nodeName( elem, "input" ) && elem.type === "button" || 2022 nodeName( elem, "button" ); 2023 }, 2024 2025 text: function( elem ) { 2026 var attr; 2027 return nodeName( elem, "input" ) && elem.type === "text" && 2028 2029 // Support: IE <10 only 2030 // New HTML5 attribute values (e.g., "search") appear 2031 // with elem.type === "text" 2032 ( ( attr = elem.getAttribute( "type" ) ) == null || 2033 attr.toLowerCase() === "text" ); 2034 }, 2035 2036 // Position-in-collection 2037 first: createPositionalPseudo( function() { 2038 return [ 0 ]; 2039 } ), 2040 2041 last: createPositionalPseudo( function( _matchIndexes, length ) { 2042 return [ length - 1 ]; 2043 } ), 2044 2045 eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { 2046 return [ argument < 0 ? argument + length : argument ]; 2047 } ), 2048 2049 even: createPositionalPseudo( function( matchIndexes, length ) { 2050 var i = 0; 2051 for ( ; i < length; i += 2 ) { 2052 matchIndexes.push( i ); 2053 } 2054 return matchIndexes; 2055 } ), 2056 2057 odd: createPositionalPseudo( function( matchIndexes, length ) { 2058 var i = 1; 2059 for ( ; i < length; i += 2 ) { 2060 matchIndexes.push( i ); 2061 } 2062 return matchIndexes; 2063 } ), 2064 2065 lt: createPositionalPseudo( function( matchIndexes, length, argument ) { 2066 var i; 2067 2068 if ( argument < 0 ) { 2069 i = argument + length; 2070 } else if ( argument > length ) { 2071 i = length; 2072 } else { 2073 i = argument; 2074 } 2075 2076 for ( ; --i >= 0; ) { 2077 matchIndexes.push( i ); 2078 } 2079 return matchIndexes; 2080 } ), 2081 2082 gt: createPositionalPseudo( function( matchIndexes, length, argument ) { 2083 var i = argument < 0 ? argument + length : argument; 2084 for ( ; ++i < length; ) { 2085 matchIndexes.push( i ); 2086 } 2087 return matchIndexes; 2088 } ) 2089 } 2090}; 2091 2092Expr.pseudos.nth = Expr.pseudos.eq; 2093 2094// Add button/input type pseudos 2095for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 2096 Expr.pseudos[ i ] = createInputPseudo( i ); 2097} 2098for ( i in { submit: true, reset: true } ) { 2099 Expr.pseudos[ i ] = createButtonPseudo( i ); 2100} 2101 2102// Easy API for creating new setFilters 2103function setFilters() {} 2104setFilters.prototype = Expr.filters = Expr.pseudos; 2105Expr.setFilters = new setFilters(); 2106 2107function tokenize( selector, parseOnly ) { 2108 var matched, match, tokens, type, 2109 soFar, groups, preFilters, 2110 cached = tokenCache[ selector + " " ]; 2111 2112 if ( cached ) { 2113 return parseOnly ? 0 : cached.slice( 0 ); 2114 } 2115 2116 soFar = selector; 2117 groups = []; 2118 preFilters = Expr.preFilter; 2119 2120 while ( soFar ) { 2121 2122 // Comma and first run 2123 if ( !matched || ( match = rcomma.exec( soFar ) ) ) { 2124 if ( match ) { 2125 2126 // Don't consume trailing commas as valid 2127 soFar = soFar.slice( match[ 0 ].length ) || soFar; 2128 } 2129 groups.push( ( tokens = [] ) ); 2130 } 2131 2132 matched = false; 2133 2134 // Combinators 2135 if ( ( match = rleadingCombinator.exec( soFar ) ) ) { 2136 matched = match.shift(); 2137 tokens.push( { 2138 value: matched, 2139 2140 // Cast descendant combinators to space 2141 type: match[ 0 ].replace( rtrimCSS, " " ) 2142 } ); 2143 soFar = soFar.slice( matched.length ); 2144 } 2145 2146 // Filters 2147 for ( type in Expr.filter ) { 2148 if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || 2149 ( match = preFilters[ type ]( match ) ) ) ) { 2150 matched = match.shift(); 2151 tokens.push( { 2152 value: matched, 2153 type: type, 2154 matches: match 2155 } ); 2156 soFar = soFar.slice( matched.length ); 2157 } 2158 } 2159 2160 if ( !matched ) { 2161 break; 2162 } 2163 } 2164 2165 // Return the length of the invalid excess 2166 // if we're just parsing 2167 // Otherwise, throw an error or return tokens 2168 if ( parseOnly ) { 2169 return soFar.length; 2170 } 2171 2172 return soFar ? 2173 find.error( selector ) : 2174 2175 // Cache the tokens 2176 tokenCache( selector, groups ).slice( 0 ); 2177} 2178 2179function toSelector( tokens ) { 2180 var i = 0, 2181 len = tokens.length, 2182 selector = ""; 2183 for ( ; i < len; i++ ) { 2184 selector += tokens[ i ].value; 2185 } 2186 return selector; 2187} 2188 2189function addCombinator( matcher, combinator, base ) { 2190 var dir = combinator.dir, 2191 skip = combinator.next, 2192 key = skip || dir, 2193 checkNonElements = base && key === "parentNode", 2194 doneName = done++; 2195 2196 return combinator.first ? 2197 2198 // Check against closest ancestor/preceding element 2199 function( elem, context, xml ) { 2200 while ( ( elem = elem[ dir ] ) ) { 2201 if ( elem.nodeType === 1 || checkNonElements ) { 2202 return matcher( elem, context, xml ); 2203 } 2204 } 2205 return false; 2206 } : 2207 2208 // Check against all ancestor/preceding elements 2209 function( elem, context, xml ) { 2210 var oldCache, outerCache, 2211 newCache = [ dirruns, doneName ]; 2212 2213 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 2214 if ( xml ) { 2215 while ( ( elem = elem[ dir ] ) ) { 2216 if ( elem.nodeType === 1 || checkNonElements ) { 2217 if ( matcher( elem, context, xml ) ) { 2218 return true; 2219 } 2220 } 2221 } 2222 } else { 2223 while ( ( elem = elem[ dir ] ) ) { 2224 if ( elem.nodeType === 1 || checkNonElements ) { 2225 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 2226 2227 if ( skip && nodeName( elem, skip ) ) { 2228 elem = elem[ dir ] || elem; 2229 } else if ( ( oldCache = outerCache[ key ] ) && 2230 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 2231 2232 // Assign to newCache so results back-propagate to previous elements 2233 return ( newCache[ 2 ] = oldCache[ 2 ] ); 2234 } else { 2235 2236 // Reuse newcache so results back-propagate to previous elements 2237 outerCache[ key ] = newCache; 2238 2239 // A match means we're done; a fail means we have to keep checking 2240 if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { 2241 return true; 2242 } 2243 } 2244 } 2245 } 2246 } 2247 return false; 2248 }; 2249} 2250 2251function elementMatcher( matchers ) { 2252 return matchers.length > 1 ? 2253 function( elem, context, xml ) { 2254 var i = matchers.length; 2255 while ( i-- ) { 2256 if ( !matchers[ i ]( elem, context, xml ) ) { 2257 return false; 2258 } 2259 } 2260 return true; 2261 } : 2262 matchers[ 0 ]; 2263} 2264 2265function multipleContexts( selector, contexts, results ) { 2266 var i = 0, 2267 len = contexts.length; 2268 for ( ; i < len; i++ ) { 2269 find( selector, contexts[ i ], results ); 2270 } 2271 return results; 2272} 2273 2274function condense( unmatched, map, filter, context, xml ) { 2275 var elem, 2276 newUnmatched = [], 2277 i = 0, 2278 len = unmatched.length, 2279 mapped = map != null; 2280 2281 for ( ; i < len; i++ ) { 2282 if ( ( elem = unmatched[ i ] ) ) { 2283 if ( !filter || filter( elem, context, xml ) ) { 2284 newUnmatched.push( elem ); 2285 if ( mapped ) { 2286 map.push( i ); 2287 } 2288 } 2289 } 2290 } 2291 2292 return newUnmatched; 2293} 2294 2295function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 2296 if ( postFilter && !postFilter[ expando ] ) { 2297 postFilter = setMatcher( postFilter ); 2298 } 2299 if ( postFinder && !postFinder[ expando ] ) { 2300 postFinder = setMatcher( postFinder, postSelector ); 2301 } 2302 return markFunction( function( seed, results, context, xml ) { 2303 var temp, i, elem, matcherOut, 2304 preMap = [], 2305 postMap = [], 2306 preexisting = results.length, 2307 2308 // Get initial elements from seed or context 2309 elems = seed || 2310 multipleContexts( selector || "*", 2311 context.nodeType ? [ context ] : context, [] ), 2312 2313 // Prefilter to get matcher input, preserving a map for seed-results synchronization 2314 matcherIn = preFilter && ( seed || !selector ) ? 2315 condense( elems, preMap, preFilter, context, xml ) : 2316 elems; 2317 2318 if ( matcher ) { 2319 2320 // If we have a postFinder, or filtered seed, or non-seed postFilter 2321 // or preexisting results, 2322 matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 2323 2324 // ...intermediate processing is necessary 2325 [] : 2326 2327 // ...otherwise use results directly 2328 results; 2329 2330 // Find primary matches 2331 matcher( matcherIn, matcherOut, context, xml ); 2332 } else { 2333 matcherOut = matcherIn; 2334 } 2335 2336 // Apply postFilter 2337 if ( postFilter ) { 2338 temp = condense( matcherOut, postMap ); 2339 postFilter( temp, [], context, xml ); 2340 2341 // Un-match failing elements by moving them back to matcherIn 2342 i = temp.length; 2343 while ( i-- ) { 2344 if ( ( elem = temp[ i ] ) ) { 2345 matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); 2346 } 2347 } 2348 } 2349 2350 if ( seed ) { 2351 if ( postFinder || preFilter ) { 2352 if ( postFinder ) { 2353 2354 // Get the final matcherOut by condensing this intermediate into postFinder contexts 2355 temp = []; 2356 i = matcherOut.length; 2357 while ( i-- ) { 2358 if ( ( elem = matcherOut[ i ] ) ) { 2359 2360 // Restore matcherIn since elem is not yet a final match 2361 temp.push( ( matcherIn[ i ] = elem ) ); 2362 } 2363 } 2364 postFinder( null, ( matcherOut = [] ), temp, xml ); 2365 } 2366 2367 // Move matched elements from seed to results to keep them synchronized 2368 i = matcherOut.length; 2369 while ( i-- ) { 2370 if ( ( elem = matcherOut[ i ] ) && 2371 ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { 2372 2373 seed[ temp ] = !( results[ temp ] = elem ); 2374 } 2375 } 2376 } 2377 2378 // Add elements to results, through postFinder if defined 2379 } else { 2380 matcherOut = condense( 2381 matcherOut === results ? 2382 matcherOut.splice( preexisting, matcherOut.length ) : 2383 matcherOut 2384 ); 2385 if ( postFinder ) { 2386 postFinder( null, results, matcherOut, xml ); 2387 } else { 2388 push.apply( results, matcherOut ); 2389 } 2390 } 2391 } ); 2392} 2393 2394function matcherFromTokens( tokens ) { 2395 var checkContext, matcher, j, 2396 len = tokens.length, 2397 leadingRelative = Expr.relative[ tokens[ 0 ].type ], 2398 implicitRelative = leadingRelative || Expr.relative[ " " ], 2399 i = leadingRelative ? 1 : 0, 2400 2401 // The foundational matcher ensures that elements are reachable from top-level context(s) 2402 matchContext = addCombinator( function( elem ) { 2403 return elem === checkContext; 2404 }, implicitRelative, true ), 2405 matchAnyContext = addCombinator( function( elem ) { 2406 return indexOf.call( checkContext, elem ) > -1; 2407 }, implicitRelative, true ), 2408 matchers = [ function( elem, context, xml ) { 2409 2410 // Support: IE 11+, Edge 17 - 18+ 2411 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 2412 // two documents; shallow comparisons work. 2413 // eslint-disable-next-line eqeqeq 2414 var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( 2415 ( checkContext = context ).nodeType ? 2416 matchContext( elem, context, xml ) : 2417 matchAnyContext( elem, context, xml ) ); 2418 2419 // Avoid hanging onto element 2420 // (see https://github.com/jquery/sizzle/issues/299) 2421 checkContext = null; 2422 return ret; 2423 } ]; 2424 2425 for ( ; i < len; i++ ) { 2426 if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { 2427 matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; 2428 } else { 2429 matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); 2430 2431 // Return special upon seeing a positional matcher 2432 if ( matcher[ expando ] ) { 2433 2434 // Find the next relative operator (if any) for proper handling 2435 j = ++i; 2436 for ( ; j < len; j++ ) { 2437 if ( Expr.relative[ tokens[ j ].type ] ) { 2438 break; 2439 } 2440 } 2441 return setMatcher( 2442 i > 1 && elementMatcher( matchers ), 2443 i > 1 && toSelector( 2444 2445 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 2446 tokens.slice( 0, i - 1 ) 2447 .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) 2448 ).replace( rtrimCSS, "$1" ), 2449 matcher, 2450 i < j && matcherFromTokens( tokens.slice( i, j ) ), 2451 j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), 2452 j < len && toSelector( tokens ) 2453 ); 2454 } 2455 matchers.push( matcher ); 2456 } 2457 } 2458 2459 return elementMatcher( matchers ); 2460} 2461 2462function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 2463 var bySet = setMatchers.length > 0, 2464 byElement = elementMatchers.length > 0, 2465 superMatcher = function( seed, context, xml, results, outermost ) { 2466 var elem, j, matcher, 2467 matchedCount = 0, 2468 i = "0", 2469 unmatched = seed && [], 2470 setMatched = [], 2471 contextBackup = outermostContext, 2472 2473 // We must always have either seed elements or outermost context 2474 elems = seed || byElement && Expr.find.TAG( "*", outermost ), 2475 2476 // Use integer dirruns iff this is the outermost matcher 2477 dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), 2478 len = elems.length; 2479 2480 if ( outermost ) { 2481 2482 // Support: IE 11+, Edge 17 - 18+ 2483 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 2484 // two documents; shallow comparisons work. 2485 // eslint-disable-next-line eqeqeq 2486 outermostContext = context == document || context || outermost; 2487 } 2488 2489 // Add elements passing elementMatchers directly to results 2490 // Support: iOS <=7 - 9 only 2491 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching 2492 // elements by id. (see trac-14142) 2493 for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { 2494 if ( byElement && elem ) { 2495 j = 0; 2496 2497 // Support: IE 11+, Edge 17 - 18+ 2498 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 2499 // two documents; shallow comparisons work. 2500 // eslint-disable-next-line eqeqeq 2501 if ( !context && elem.ownerDocument != document ) { 2502 setDocument( elem ); 2503 xml = !documentIsHTML; 2504 } 2505 while ( ( matcher = elementMatchers[ j++ ] ) ) { 2506 if ( matcher( elem, context || document, xml ) ) { 2507 push.call( results, elem ); 2508 break; 2509 } 2510 } 2511 if ( outermost ) { 2512 dirruns = dirrunsUnique; 2513 } 2514 } 2515 2516 // Track unmatched elements for set filters 2517 if ( bySet ) { 2518 2519 // They will have gone through all possible matchers 2520 if ( ( elem = !matcher && elem ) ) { 2521 matchedCount--; 2522 } 2523 2524 // Lengthen the array for every element, matched or not 2525 if ( seed ) { 2526 unmatched.push( elem ); 2527 } 2528 } 2529 } 2530 2531 // `i` is now the count of elements visited above, and adding it to `matchedCount` 2532 // makes the latter nonnegative. 2533 matchedCount += i; 2534 2535 // Apply set filters to unmatched elements 2536 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 2537 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 2538 // no element matchers and no seed. 2539 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 2540 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 2541 // numerically zero. 2542 if ( bySet && i !== matchedCount ) { 2543 j = 0; 2544 while ( ( matcher = setMatchers[ j++ ] ) ) { 2545 matcher( unmatched, setMatched, context, xml ); 2546 } 2547 2548 if ( seed ) { 2549 2550 // Reintegrate element matches to eliminate the need for sorting 2551 if ( matchedCount > 0 ) { 2552 while ( i-- ) { 2553 if ( !( unmatched[ i ] || setMatched[ i ] ) ) { 2554 setMatched[ i ] = pop.call( results ); 2555 } 2556 } 2557 } 2558 2559 // Discard index placeholder values to get only actual matches 2560 setMatched = condense( setMatched ); 2561 } 2562 2563 // Add matches to results 2564 push.apply( results, setMatched ); 2565 2566 // Seedless set matches succeeding multiple successful matchers stipulate sorting 2567 if ( outermost && !seed && setMatched.length > 0 && 2568 ( matchedCount + setMatchers.length ) > 1 ) { 2569 2570 jQuery.uniqueSort( results ); 2571 } 2572 } 2573 2574 // Override manipulation of globals by nested matchers 2575 if ( outermost ) { 2576 dirruns = dirrunsUnique; 2577 outermostContext = contextBackup; 2578 } 2579 2580 return unmatched; 2581 }; 2582 2583 return bySet ? 2584 markFunction( superMatcher ) : 2585 superMatcher; 2586} 2587 2588function compile( selector, match /* Internal Use Only */ ) { 2589 var i, 2590 setMatchers = [], 2591 elementMatchers = [], 2592 cached = compilerCache[ selector + " " ]; 2593 2594 if ( !cached ) { 2595 2596 // Generate a function of recursive functions that can be used to check each element 2597 if ( !match ) { 2598 match = tokenize( selector ); 2599 } 2600 i = match.length; 2601 while ( i-- ) { 2602 cached = matcherFromTokens( match[ i ] ); 2603 if ( cached[ expando ] ) { 2604 setMatchers.push( cached ); 2605 } else { 2606 elementMatchers.push( cached ); 2607 } 2608 } 2609 2610 // Cache the compiled function 2611 cached = compilerCache( selector, 2612 matcherFromGroupMatchers( elementMatchers, setMatchers ) ); 2613 2614 // Save selector and tokenization 2615 cached.selector = selector; 2616 } 2617 return cached; 2618} 2619 2620/** 2621 * A low-level selection function that works with jQuery's compiled 2622 * selector functions 2623 * @param {String|Function} selector A selector or a pre-compiled 2624 * selector function built with jQuery selector compile 2625 * @param {Element} context 2626 * @param {Array} [results] 2627 * @param {Array} [seed] A set of elements to match against 2628 */ 2629function select( selector, context, results, seed ) { 2630 var i, tokens, token, type, find, 2631 compiled = typeof selector === "function" && selector, 2632 match = !seed && tokenize( ( selector = compiled.selector || selector ) ); 2633 2634 results = results || []; 2635 2636 // Try to minimize operations if there is only one selector in the list and no seed 2637 // (the latter of which guarantees us context) 2638 if ( match.length === 1 ) { 2639 2640 // Reduce context if the leading compound selector is an ID 2641 tokens = match[ 0 ] = match[ 0 ].slice( 0 ); 2642 if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && 2643 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { 2644 2645 context = ( Expr.find.ID( 2646 token.matches[ 0 ].replace( runescape, funescape ), 2647 context 2648 ) || [] )[ 0 ]; 2649 if ( !context ) { 2650 return results; 2651 2652 // Precompiled matchers will still verify ancestry, so step up a level 2653 } else if ( compiled ) { 2654 context = context.parentNode; 2655 } 2656 2657 selector = selector.slice( tokens.shift().value.length ); 2658 } 2659 2660 // Fetch a seed set for right-to-left matching 2661 i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; 2662 while ( i-- ) { 2663 token = tokens[ i ]; 2664 2665 // Abort if we hit a combinator 2666 if ( Expr.relative[ ( type = token.type ) ] ) { 2667 break; 2668 } 2669 if ( ( find = Expr.find[ type ] ) ) { 2670 2671 // Search, expanding context for leading sibling combinators 2672 if ( ( seed = find( 2673 token.matches[ 0 ].replace( runescape, funescape ), 2674 rsibling.test( tokens[ 0 ].type ) &&
vendor: 4,497 bytes, lines 2675-2859
2675 testContext( context.parentNode ) || context 2676 ) ) ) { 2677 2678 // If seed is empty or no tokens remain, we can return early 2679 tokens.splice( i, 1 ); 2680 selector = seed.length && toSelector( tokens ); 2681 if ( !selector ) { 2682 push.apply( results, seed ); 2683 return results; 2684 } 2685 2686 break; 2687 } 2688 } 2689 } 2690 } 2691 2692 // Compile and execute a filtering function if one is not provided 2693 // Provide `match` to avoid retokenization if we modified the selector above 2694 ( compiled || compile( selector, match ) )( 2695 seed, 2696 context, 2697 !documentIsHTML, 2698 results, 2699 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 2700 ); 2701 return results; 2702} 2703 2704// One-time assignments 2705 2706// Support: Android <=4.0 - 4.1+ 2707// Sort stability 2708support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; 2709 2710// Initialize against the default document 2711setDocument(); 2712 2713// Support: Android <=4.0 - 4.1+ 2714// Detached nodes confoundingly follow *each other* 2715support.sortDetached = assert( function( el ) { 2716 2717 // Should return 1, but returns 4 (following) 2718 return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; 2719} ); 2720 2721jQuery.find = find; 2722 2723// Deprecated 2724jQuery.expr[ ":" ] = jQuery.expr.pseudos; 2725jQuery.unique = jQuery.uniqueSort; 2726 2727// These have always been private, but they used to be documented as part of 2728// Sizzle so let's maintain them for now for backwards compatibility purposes. 2729find.compile = compile; 2730find.select = select; 2731find.setDocument = setDocument; 2732find.tokenize = tokenize; 2733 2734find.escape = jQuery.escapeSelector; 2735find.getText = jQuery.text; 2736find.isXML = jQuery.isXMLDoc; 2737find.selectors = jQuery.expr; 2738find.support = jQuery.support; 2739find.uniqueSort = jQuery.uniqueSort; 2740 2741 /* eslint-enable */ 2742 2743} )(); 2744 2745 2746var dir = function( elem, dir, until ) { 2747 var matched = [], 2748 truncate = until !== undefined; 2749 2750 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 2751 if ( elem.nodeType === 1 ) { 2752 if ( truncate && jQuery( elem ).is( until ) ) { 2753 break; 2754 } 2755 matched.push( elem ); 2756 } 2757 } 2758 return matched; 2759}; 2760 2761 2762var siblings = function( n, elem ) { 2763 var matched = []; 2764 2765 for ( ; n; n = n.nextSibling ) { 2766 if ( n.nodeType === 1 && n !== elem ) { 2767 matched.push( n ); 2768 } 2769 } 2770 2771 return matched; 2772}; 2773 2774 2775var rneedsContext = jQuery.expr.match.needsContext; 2776 2777var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 2778 2779 2780 2781// Implement the identical functionality for filter and not 2782function winnow( elements, qualifier, not ) { 2783 if ( isFunction( qualifier ) ) { 2784 return jQuery.grep( elements, function( elem, i ) { 2785 return !!qualifier.call( elem, i, elem ) !== not; 2786 } ); 2787 } 2788 2789 // Single element 2790 if ( qualifier.nodeType ) { 2791 return jQuery.grep( elements, function( elem ) { 2792 return ( elem === qualifier ) !== not; 2793 } ); 2794 } 2795 2796 // Arraylike of elements (jQuery, arguments, Array) 2797 if ( typeof qualifier !== "string" ) { 2798 return jQuery.grep( elements, function( elem ) { 2799 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 2800 } ); 2801 } 2802 2803 // Filtered directly for both simple and complex selectors 2804 return jQuery.filter( qualifier, elements, not ); 2805} 2806 2807jQuery.filter = function( expr, elems, not ) { 2808 var elem = elems[ 0 ]; 2809 2810 if ( not ) { 2811 expr = ":not(" + expr + ")"; 2812 } 2813 2814 if ( elems.length === 1 && elem.nodeType === 1 ) { 2815 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 2816 } 2817 2818 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 2819 return elem.nodeType === 1; 2820 } ) ); 2821}; 2822 2823jQuery.fn.extend( { 2824 find: function( selector ) { 2825 var i, ret, 2826 len = this.length, 2827 self = this; 2828 2829 if ( typeof selector !== "string" ) { 2830 return this.pushStack( jQuery( selector ).filter( function() { 2831 for ( i = 0; i < len; i++ ) { 2832 if ( jQuery.contains( self[ i ], this ) ) { 2833 return true; 2834 } 2835 } 2836 } ) ); 2837 } 2838 2839 ret = this.pushStack( [] ); 2840 2841 for ( i = 0; i < len; i++ ) { 2842 jQuery.find( selector, self[ i ], ret ); 2843 } 2844 2845 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 2846 }, 2847 filter: function( selector ) { 2848 return this.pushStack( winnow( this, selector || [], false ) ); 2849 }, 2850 not: function( selector ) { 2851 return this.pushStack( winnow( this, selector || [], true ) ); 2852 }, 2853 is: function( selector ) { 2854 return !!winnow( 2855 this, 2856 2857 // If this is a positional/relative selector, check membership in the returned set 2858 // so $("p:first").is("p:last") won't return true for a doc with two "p". 2859 typeof selector === "string" && rneedsContext.test( selector ) ?
vendor: 9,941 bytes, lines 2860-3248
2860 jQuery( selector ) : 2861 selector || [], 2862 false 2863 ).length; 2864 } 2865} ); 2866 2867 2868// Initialize a jQuery object 2869 2870 2871// A central reference to the root jQuery(document) 2872var rootjQuery, 2873 2874 // A simple way to check for HTML strings 2875 // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) 2876 // Strict HTML recognition (trac-11290: must start with <) 2877 // Shortcut simple #id case for speed 2878 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 2879 2880 init = jQuery.fn.init = function( selector, context, root ) { 2881 var match, elem; 2882 2883 // HANDLE: $(""), $(null), $(undefined), $(false) 2884 if ( !selector ) { 2885 return this; 2886 } 2887 2888 // Method init() accepts an alternate rootjQuery 2889 // so migrate can support jQuery.sub (gh-2101) 2890 root = root || rootjQuery; 2891 2892 // Handle HTML strings 2893 if ( typeof selector === "string" ) { 2894 if ( selector[ 0 ] === "<" && 2895 selector[ selector.length - 1 ] === ">" && 2896 selector.length >= 3 ) { 2897 2898 // Assume that strings that start and end with <> are HTML and skip the regex check 2899 match = [ null, selector, null ]; 2900 2901 } else { 2902 match = rquickExpr.exec( selector ); 2903 } 2904 2905 // Match html or make sure no context is specified for #id 2906 if ( match && ( match[ 1 ] || !context ) ) { 2907 2908 // HANDLE: $(html) -> $(array) 2909 if ( match[ 1 ] ) { 2910 context = context instanceof jQuery ? context[ 0 ] : context; 2911 2912 // Option to run scripts is true for back-compat 2913 // Intentionally let the error be thrown if parseHTML is not present 2914 jQuery.merge( this, jQuery.parseHTML( 2915 match[ 1 ], 2916 context && context.nodeType ? context.ownerDocument || context : document, 2917 true 2918 ) ); 2919 2920 // HANDLE: $(html, props) 2921 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 2922 for ( match in context ) { 2923 2924 // Properties of context are called as methods if possible 2925 if ( isFunction( this[ match ] ) ) { 2926 this[ match ]( context[ match ] ); 2927 2928 // ...and otherwise set as attributes 2929 } else { 2930 this.attr( match, context[ match ] ); 2931 } 2932 } 2933 } 2934 2935 return this; 2936 2937 // HANDLE: $(#id) 2938 } else { 2939 elem = document.getElementById( match[ 2 ] ); 2940 2941 if ( elem ) { 2942 2943 // Inject the element directly into the jQuery object 2944 this[ 0 ] = elem; 2945 this.length = 1; 2946 } 2947 return this; 2948 } 2949 2950 // HANDLE: $(expr, $(...)) 2951 } else if ( !context || context.jquery ) { 2952 return ( context || root ).find( selector ); 2953 2954 // HANDLE: $(expr, context) 2955 // (which is just equivalent to: $(context).find(expr) 2956 } else { 2957 return this.constructor( context ).find( selector ); 2958 } 2959 2960 // HANDLE: $(DOMElement) 2961 } else if ( selector.nodeType ) { 2962 this[ 0 ] = selector; 2963 this.length = 1; 2964 return this; 2965 2966 // HANDLE: $(function) 2967 // Shortcut for document ready 2968 } else if ( isFunction( selector ) ) { 2969 return root.ready !== undefined ? 2970 root.ready( selector ) : 2971 2972 // Execute immediately if ready is not present 2973 selector( jQuery ); 2974 } 2975 2976 return jQuery.makeArray( selector, this ); 2977 }; 2978 2979// Give the init function the jQuery prototype for later instantiation 2980init.prototype = jQuery.fn; 2981 2982// Initialize central reference 2983rootjQuery = jQuery( document ); 2984 2985 2986var rparentsprev = /^(?:parents|prev(?:Until|All))/, 2987 2988 // Methods guaranteed to produce a unique set when starting from a unique set 2989 guaranteedUnique = { 2990 children: true, 2991 contents: true, 2992 next: true, 2993 prev: true 2994 }; 2995 2996jQuery.fn.extend( { 2997 has: function( target ) { 2998 var targets = jQuery( target, this ), 2999 l = targets.length; 3000 3001 return this.filter( function() { 3002 var i = 0; 3003 for ( ; i < l; i++ ) { 3004 if ( jQuery.contains( this, targets[ i ] ) ) { 3005 return true; 3006 } 3007 } 3008 } ); 3009 }, 3010 3011 closest: function( selectors, context ) { 3012 var cur, 3013 i = 0, 3014 l = this.length, 3015 matched = [], 3016 targets = typeof selectors !== "string" && jQuery( selectors ); 3017 3018 // Positional selectors never match, since there's no _selection_ context 3019 if ( !rneedsContext.test( selectors ) ) { 3020 for ( ; i < l; i++ ) { 3021 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 3022 3023 // Always skip document fragments 3024 if ( cur.nodeType < 11 && ( targets ? 3025 targets.index( cur ) > -1 : 3026 3027 // Don't pass non-elements to jQuery#find 3028 cur.nodeType === 1 && 3029 jQuery.find.matchesSelector( cur, selectors ) ) ) { 3030 3031 matched.push( cur ); 3032 break; 3033 } 3034 } 3035 } 3036 } 3037 3038 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 3039 }, 3040 3041 // Determine the position of an element within the set 3042 index: function( elem ) { 3043 3044 // No argument, return index in parent 3045 if ( !elem ) { 3046 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 3047 } 3048 3049 // Index in selector 3050 if ( typeof elem === "string" ) { 3051 return indexOf.call( jQuery( elem ), this[ 0 ] ); 3052 } 3053 3054 // Locate the position of the desired element 3055 return indexOf.call( this, 3056 3057 // If it receives a jQuery object, the first element is used 3058 elem.jquery ? elem[ 0 ] : elem 3059 ); 3060 }, 3061 3062 add: function( selector, context ) { 3063 return this.pushStack( 3064 jQuery.uniqueSort( 3065 jQuery.merge( this.get(), jQuery( selector, context ) ) 3066 ) 3067 ); 3068 }, 3069 3070 addBack: function( selector ) { 3071 return this.add( selector == null ? 3072 this.prevObject : this.prevObject.filter( selector ) 3073 ); 3074 } 3075} ); 3076 3077function sibling( cur, dir ) { 3078 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 3079 return cur; 3080} 3081 3082jQuery.each( { 3083 parent: function( elem ) { 3084 var parent = elem.parentNode; 3085 return parent && parent.nodeType !== 11 ? parent : null; 3086 }, 3087 parents: function( elem ) { 3088 return dir( elem, "parentNode" ); 3089 }, 3090 parentsUntil: function( elem, _i, until ) { 3091 return dir( elem, "parentNode", until ); 3092 }, 3093 next: function( elem ) { 3094 return sibling( elem, "nextSibling" ); 3095 }, 3096 prev: function( elem ) { 3097 return sibling( elem, "previousSibling" ); 3098 }, 3099 nextAll: function( elem ) { 3100 return dir( elem, "nextSibling" ); 3101 }, 3102 prevAll: function( elem ) { 3103 return dir( elem, "previousSibling" ); 3104 }, 3105 nextUntil: function( elem, _i, until ) { 3106 return dir( elem, "nextSibling", until ); 3107 }, 3108 prevUntil: function( elem, _i, until ) { 3109 return dir( elem, "previousSibling", until ); 3110 }, 3111 siblings: function( elem ) { 3112 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 3113 }, 3114 children: function( elem ) { 3115 return siblings( elem.firstChild ); 3116 }, 3117 contents: function( elem ) { 3118 if ( elem.contentDocument != null && 3119 3120 // Support: IE 11+ 3121 // <object> elements with no `data` attribute has an object 3122 // `contentDocument` with a `null` prototype. 3123 getProto( elem.contentDocument ) ) { 3124 3125 return elem.contentDocument; 3126 } 3127 3128 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 3129 // Treat the template element as a regular one in browsers that 3130 // don't support it. 3131 if ( nodeName( elem, "template" ) ) { 3132 elem = elem.content || elem; 3133 } 3134 3135 return jQuery.merge( [], elem.childNodes ); 3136 } 3137}, function( name, fn ) { 3138 jQuery.fn[ name ] = function( until, selector ) { 3139 var matched = jQuery.map( this, fn, until ); 3140 3141 if ( name.slice( -5 ) !== "Until" ) { 3142 selector = until; 3143 } 3144 3145 if ( selector && typeof selector === "string" ) { 3146 matched = jQuery.filter( selector, matched ); 3147 } 3148 3149 if ( this.length > 1 ) { 3150 3151 // Remove duplicates 3152 if ( !guaranteedUnique[ name ] ) { 3153 jQuery.uniqueSort( matched ); 3154 } 3155 3156 // Reverse order for parents* and prev-derivatives 3157 if ( rparentsprev.test( name ) ) { 3158 matched.reverse(); 3159 } 3160 } 3161 3162 return this.pushStack( matched ); 3163 }; 3164} ); 3165var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 3166 3167 3168 3169// Convert String-formatted options into Object-formatted ones 3170function createOptions( options ) { 3171 var object = {}; 3172 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 3173 object[ flag ] = true; 3174 } ); 3175 return object; 3176} 3177 3178/* 3179 * Create a callback list using the following parameters: 3180 * 3181 * options: an optional list of space-separated options that will change how 3182 * the callback list behaves or a more traditional option object 3183 * 3184 * By default a callback list will act like an event callback list and can be 3185 * "fired" multiple times. 3186 * 3187 * Possible options: 3188 * 3189 * once: will ensure the callback list can only be fired once (like a Deferred) 3190 * 3191 * memory: will keep track of previous values and will call any callback added 3192 * after the list has been fired right away with the latest "memorized" 3193 * values (like a Deferred) 3194 * 3195 * unique: will ensure a callback can only be added once (no duplicate in the list) 3196 * 3197 * stopOnFalse: interrupt callings when a callback returns false 3198 * 3199 */ 3200jQuery.Callbacks = function( options ) { 3201 3202 // Convert options from String-formatted to Object-formatted if needed 3203 // (we check in cache first) 3204 options = typeof options === "string" ? 3205 createOptions( options ) : 3206 jQuery.extend( {}, options ); 3207 3208 var // Flag to know if list is currently firing 3209 firing, 3210 3211 // Last fire value for non-forgettable lists 3212 memory, 3213 3214 // Flag to know if list was already fired 3215 fired, 3216 3217 // Flag to prevent firing 3218 locked, 3219 3220 // Actual callback list 3221 list = [], 3222 3223 // Queue of execution data for repeatable lists 3224 queue = [], 3225 3226 // Index of currently firing callback (modified by add/remove as needed) 3227 firingIndex = -1, 3228 3229 // Fire callbacks 3230 fire = function() { 3231 3232 // Enforce single-firing 3233 locked = locked || options.once; 3234 3235 // Execute callbacks for all pending executions, 3236 // respecting firingIndex overrides and runtime changes 3237 fired = firing = true; 3238 for ( ; queue.length; firingIndex = -1 ) { 3239 memory = queue.shift(); 3240 while ( ++firingIndex < list.length ) { 3241 3242 // Run callback and check for early termination 3243 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 3244 options.stopOnFalse ) { 3245 3246 // Jump to end and forget the data so .add doesn't re-fire 3247 firingIndex = list.length; 3248 memory = false;
vendor: 4,918 bytes, lines 3249-3458
3249 } 3250 } 3251 } 3252 3253 // Forget the data if we're done with it 3254 if ( !options.memory ) { 3255 memory = false; 3256 } 3257 3258 firing = false; 3259 3260 // Clean up if we're done firing for good 3261 if ( locked ) { 3262 3263 // Keep an empty list if we have data for future add calls 3264 if ( memory ) { 3265 list = []; 3266 3267 // Otherwise, this object is spent 3268 } else { 3269 list = ""; 3270 } 3271 } 3272 }, 3273 3274 // Actual Callbacks object 3275 self = { 3276 3277 // Add a callback or a collection of callbacks to the list 3278 add: function() { 3279 if ( list ) { 3280 3281 // If we have memory from a past run, we should fire after adding 3282 if ( memory && !firing ) { 3283 firingIndex = list.length - 1; 3284 queue.push( memory ); 3285 } 3286 3287 ( function add( args ) { 3288 jQuery.each( args, function( _, arg ) { 3289 if ( isFunction( arg ) ) { 3290 if ( !options.unique || !self.has( arg ) ) { 3291 list.push( arg ); 3292 } 3293 } else if ( arg && arg.length && toType( arg ) !== "string" ) { 3294 3295 // Inspect recursively 3296 add( arg ); 3297 } 3298 } ); 3299 } )( arguments ); 3300 3301 if ( memory && !firing ) { 3302 fire(); 3303 } 3304 } 3305 return this; 3306 }, 3307 3308 // Remove a callback from the list 3309 remove: function() { 3310 jQuery.each( arguments, function( _, arg ) { 3311 var index; 3312 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 3313 list.splice( index, 1 ); 3314 3315 // Handle firing indexes 3316 if ( index <= firingIndex ) { 3317 firingIndex--; 3318 } 3319 } 3320 } ); 3321 return this; 3322 }, 3323 3324 // Check if a given callback is in the list. 3325 // If no argument is given, return whether or not list has callbacks attached. 3326 has: function( fn ) { 3327 return fn ? 3328 jQuery.inArray( fn, list ) > -1 : 3329 list.length > 0; 3330 }, 3331 3332 // Remove all callbacks from the list 3333 empty: function() { 3334 if ( list ) { 3335 list = []; 3336 } 3337 return this; 3338 }, 3339 3340 // Disable .fire and .add 3341 // Abort any current/pending executions 3342 // Clear all callbacks and values 3343 disable: function() { 3344 locked = queue = []; 3345 list = memory = ""; 3346 return this; 3347 }, 3348 disabled: function() { 3349 return !list; 3350 }, 3351 3352 // Disable .fire 3353 // Also disable .add unless we have memory (since it would have no effect) 3354 // Abort any pending executions 3355 lock: function() { 3356 locked = queue = []; 3357 if ( !memory && !firing ) { 3358 list = memory = ""; 3359 } 3360 return this; 3361 }, 3362 locked: function() { 3363 return !!locked; 3364 }, 3365 3366 // Call all callbacks with the given context and arguments 3367 fireWith: function( context, args ) { 3368 if ( !locked ) { 3369 args = args || []; 3370 args = [ context, args.slice ? args.slice() : args ]; 3371 queue.push( args ); 3372 if ( !firing ) { 3373 fire(); 3374 } 3375 } 3376 return this; 3377 }, 3378 3379 // Call all the callbacks with the given arguments 3380 fire: function() { 3381 self.fireWith( this, arguments ); 3382 return this; 3383 }, 3384 3385 // To know if the callbacks have already been called at least once 3386 fired: function() { 3387 return !!fired; 3388 } 3389 }; 3390 3391 return self; 3392}; 3393 3394 3395function Identity( v ) { 3396 return v; 3397} 3398function Thrower( ex ) { 3399 throw ex; 3400} 3401 3402function adoptValue( value, resolve, reject, noValue ) { 3403 var method; 3404 3405 try { 3406 3407 // Check for promise aspect first to privilege synchronous behavior 3408 if ( value && isFunction( ( method = value.promise ) ) ) { 3409 method.call( value ).done( resolve ).fail( reject ); 3410 3411 // Other thenables 3412 } else if ( value && isFunction( ( method = value.then ) ) ) { 3413 method.call( value, resolve, reject ); 3414 3415 // Other non-thenables 3416 } else { 3417 3418 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 3419 // * false: [ value ].slice( 0 ) => resolve( value ) 3420 // * true: [ value ].slice( 1 ) => resolve() 3421 resolve.apply( undefined, [ value ].slice( noValue ) ); 3422 } 3423 3424 // For Promises/A+, convert exceptions into rejections 3425 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 3426 // Deferred#then to conditionally suppress rejection. 3427 } catch ( value ) { 3428 3429 // Support: Android 4.0 only 3430 // Strict mode functions invoked without .call/.apply get global-object context 3431 reject.apply( undefined, [ value ] ); 3432 } 3433} 3434 3435jQuery.extend( { 3436 3437 Deferred: function( func ) { 3438 var tuples = [ 3439 3440 // action, add listener, callbacks, 3441 // ... .then handlers, argument index, [final state] 3442 [ "notify", "progress", jQuery.Callbacks( "memory" ), 3443 jQuery.Callbacks( "memory" ), 2 ], 3444 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 3445 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 3446 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 3447 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 3448 ], 3449 state = "pending", 3450 promise = { 3451 state: function() { 3452 return state; 3453 }, 3454 always: function() { 3455 deferred.done( arguments ).fail( arguments ); 3456 return this; 3457 }, 3458 "catch": function( fn ) {
vendor: 28,472 bytes, lines 3459-4570
3459 return promise.then( null, fn ); 3460 }, 3461 3462 // Keep pipe for back-compat 3463 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 3464 var fns = arguments; 3465 3466 return jQuery.Deferred( function( newDefer ) { 3467 jQuery.each( tuples, function( _i, tuple ) { 3468 3469 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 3470 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 3471 3472 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 3473 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 3474 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 3475 deferred[ tuple[ 1 ] ]( function() { 3476 var returned = fn && fn.apply( this, arguments ); 3477 if ( returned && isFunction( returned.promise ) ) { 3478 returned.promise() 3479 .progress( newDefer.notify ) 3480 .done( newDefer.resolve ) 3481 .fail( newDefer.reject ); 3482 } else { 3483 newDefer[ tuple[ 0 ] + "With" ]( 3484 this, 3485 fn ? [ returned ] : arguments 3486 ); 3487 } 3488 } ); 3489 } ); 3490 fns = null; 3491 } ).promise(); 3492 }, 3493 then: function( onFulfilled, onRejected, onProgress ) { 3494 var maxDepth = 0; 3495 function resolve( depth, deferred, handler, special ) { 3496 return function() { 3497 var that = this, 3498 args = arguments, 3499 mightThrow = function() { 3500 var returned, then; 3501 3502 // Support: Promises/A+ section 2.3.3.3.3 3503 // https://promisesaplus.com/#point-59 3504 // Ignore double-resolution attempts 3505 if ( depth < maxDepth ) { 3506 return; 3507 } 3508 3509 returned = handler.apply( that, args ); 3510 3511 // Support: Promises/A+ section 2.3.1 3512 // https://promisesaplus.com/#point-48 3513 if ( returned === deferred.promise() ) { 3514 throw new TypeError( "Thenable self-resolution" ); 3515 } 3516 3517 // Support: Promises/A+ sections 2.3.3.1, 3.5 3518 // https://promisesaplus.com/#point-54 3519 // https://promisesaplus.com/#point-75 3520 // Retrieve `then` only once 3521 then = returned && 3522 3523 // Support: Promises/A+ section 2.3.4 3524 // https://promisesaplus.com/#point-64 3525 // Only check objects and functions for thenability 3526 ( typeof returned === "object" || 3527 typeof returned === "function" ) && 3528 returned.then; 3529 3530 // Handle a returned thenable 3531 if ( isFunction( then ) ) { 3532 3533 // Special processors (notify) just wait for resolution 3534 if ( special ) { 3535 then.call( 3536 returned, 3537 resolve( maxDepth, deferred, Identity, special ), 3538 resolve( maxDepth, deferred, Thrower, special ) 3539 ); 3540 3541 // Normal processors (resolve) also hook into progress 3542 } else { 3543 3544 // ...and disregard older resolution values 3545 maxDepth++; 3546 3547 then.call( 3548 returned, 3549 resolve( maxDepth, deferred, Identity, special ), 3550 resolve( maxDepth, deferred, Thrower, special ), 3551 resolve( maxDepth, deferred, Identity, 3552 deferred.notifyWith ) 3553 ); 3554 } 3555 3556 // Handle all other returned values 3557 } else { 3558 3559 // Only substitute handlers pass on context 3560 // and multiple values (non-spec behavior) 3561 if ( handler !== Identity ) { 3562 that = undefined; 3563 args = [ returned ]; 3564 } 3565 3566 // Process the value(s) 3567 // Default process is resolve 3568 ( special || deferred.resolveWith )( that, args ); 3569 } 3570 }, 3571 3572 // Only normal processors (resolve) catch and reject exceptions 3573 process = special ? 3574 mightThrow : 3575 function() { 3576 try { 3577 mightThrow(); 3578 } catch ( e ) { 3579 3580 if ( jQuery.Deferred.exceptionHook ) { 3581 jQuery.Deferred.exceptionHook( e, 3582 process.error ); 3583 } 3584 3585 // Support: Promises/A+ section 2.3.3.3.4.1 3586 // https://promisesaplus.com/#point-61 3587 // Ignore post-resolution exceptions 3588 if ( depth + 1 >= maxDepth ) { 3589 3590 // Only substitute handlers pass on context 3591 // and multiple values (non-spec behavior) 3592 if ( handler !== Thrower ) { 3593 that = undefined; 3594 args = [ e ]; 3595 } 3596 3597 deferred.rejectWith( that, args ); 3598 } 3599 } 3600 }; 3601 3602 // Support: Promises/A+ section 2.3.3.3.1 3603 // https://promisesaplus.com/#point-57 3604 // Re-resolve promises immediately to dodge false rejection from 3605 // subsequent errors 3606 if ( depth ) { 3607 process(); 3608 } else { 3609 3610 // Call an optional hook to record the error, in case of exception 3611 // since it's otherwise lost when execution goes async 3612 if ( jQuery.Deferred.getErrorHook ) { 3613 process.error = jQuery.Deferred.getErrorHook(); 3614 3615 // The deprecated alias of the above. While the name suggests 3616 // returning the stack, not an error instance, jQuery just passes 3617 // it directly to `console.warn` so both will work; an instance 3618 // just better cooperates with source maps. 3619 } else if ( jQuery.Deferred.getStackHook ) { 3620 process.error = jQuery.Deferred.getStackHook(); 3621 } 3622 window.setTimeout( process ); 3623 } 3624 }; 3625 } 3626 3627 return jQuery.Deferred( function( newDefer ) { 3628 3629 // progress_handlers.add( ... ) 3630 tuples[ 0 ][ 3 ].add( 3631 resolve( 3632 0, 3633 newDefer, 3634 isFunction( onProgress ) ? 3635 onProgress : 3636 Identity, 3637 newDefer.notifyWith 3638 ) 3639 ); 3640 3641 // fulfilled_handlers.add( ... ) 3642 tuples[ 1 ][ 3 ].add( 3643 resolve( 3644 0, 3645 newDefer, 3646 isFunction( onFulfilled ) ? 3647 onFulfilled : 3648 Identity 3649 ) 3650 ); 3651 3652 // rejected_handlers.add( ... ) 3653 tuples[ 2 ][ 3 ].add( 3654 resolve( 3655 0, 3656 newDefer, 3657 isFunction( onRejected ) ? 3658 onRejected : 3659 Thrower 3660 ) 3661 ); 3662 } ).promise(); 3663 }, 3664 3665 // Get a promise for this deferred 3666 // If obj is provided, the promise aspect is added to the object 3667 promise: function( obj ) { 3668 return obj != null ? jQuery.extend( obj, promise ) : promise; 3669 } 3670 }, 3671 deferred = {}; 3672 3673 // Add list-specific methods 3674 jQuery.each( tuples, function( i, tuple ) { 3675 var list = tuple[ 2 ], 3676 stateString = tuple[ 5 ]; 3677 3678 // promise.progress = list.add 3679 // promise.done = list.add 3680 // promise.fail = list.add 3681 promise[ tuple[ 1 ] ] = list.add; 3682 3683 // Handle state 3684 if ( stateString ) { 3685 list.add( 3686 function() { 3687 3688 // state = "resolved" (i.e., fulfilled) 3689 // state = "rejected" 3690 state = stateString; 3691 }, 3692 3693 // rejected_callbacks.disable 3694 // fulfilled_callbacks.disable 3695 tuples[ 3 - i ][ 2 ].disable, 3696 3697 // rejected_handlers.disable 3698 // fulfilled_handlers.disable 3699 tuples[ 3 - i ][ 3 ].disable, 3700 3701 // progress_callbacks.lock 3702 tuples[ 0 ][ 2 ].lock, 3703 3704 // progress_handlers.lock 3705 tuples[ 0 ][ 3 ].lock 3706 ); 3707 } 3708 3709 // progress_handlers.fire 3710 // fulfilled_handlers.fire 3711 // rejected_handlers.fire 3712 list.add( tuple[ 3 ].fire ); 3713 3714 // deferred.notify = function() { deferred.notifyWith(...) } 3715 // deferred.resolve = function() { deferred.resolveWith(...) } 3716 // deferred.reject = function() { deferred.rejectWith(...) } 3717 deferred[ tuple[ 0 ] ] = function() { 3718 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 3719 return this; 3720 }; 3721 3722 // deferred.notifyWith = list.fireWith 3723 // deferred.resolveWith = list.fireWith 3724 // deferred.rejectWith = list.fireWith 3725 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 3726 } ); 3727 3728 // Make the deferred a promise 3729 promise.promise( deferred ); 3730 3731 // Call given func if any 3732 if ( func ) { 3733 func.call( deferred, deferred ); 3734 } 3735 3736 // All done! 3737 return deferred; 3738 }, 3739 3740 // Deferred helper 3741 when: function( singleValue ) { 3742 var 3743 3744 // count of uncompleted subordinates 3745 remaining = arguments.length, 3746 3747 // count of unprocessed arguments 3748 i = remaining, 3749 3750 // subordinate fulfillment data 3751 resolveContexts = Array( i ), 3752 resolveValues = slice.call( arguments ), 3753 3754 // the primary Deferred 3755 primary = jQuery.Deferred(), 3756 3757 // subordinate callback factory 3758 updateFunc = function( i ) { 3759 return function( value ) { 3760 resolveContexts[ i ] = this; 3761 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 3762 if ( !( --remaining ) ) { 3763 primary.resolveWith( resolveContexts, resolveValues ); 3764 } 3765 }; 3766 }; 3767 3768 // Single- and empty arguments are adopted like Promise.resolve 3769 if ( remaining <= 1 ) { 3770 adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, 3771 !remaining ); 3772 3773 // Use .then() to unwrap secondary thenables (cf. gh-3000) 3774 if ( primary.state() === "pending" || 3775 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 3776 3777 return primary.then(); 3778 } 3779 } 3780 3781 // Multiple arguments are aggregated like Promise.all array elements 3782 while ( i-- ) { 3783 adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); 3784 } 3785 3786 return primary.promise(); 3787 } 3788} ); 3789 3790 3791// These usually indicate a programmer mistake during development, 3792// warn about them ASAP rather than swallowing them by default. 3793var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 3794 3795// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error 3796// captured before the async barrier to get the original error cause 3797// which may otherwise be hidden. 3798jQuery.Deferred.exceptionHook = function( error, asyncError ) { 3799 3800 // Support: IE 8 - 9 only 3801 // Console exists when dev tools are open, which can happen at any time 3802 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 3803 window.console.warn( "jQuery.Deferred exception: " + error.message, 3804 error.stack, asyncError ); 3805 } 3806}; 3807 3808 3809 3810 3811jQuery.readyException = function( error ) { 3812 window.setTimeout( function() { 3813 throw error; 3814 } ); 3815}; 3816 3817 3818 3819 3820// The deferred used on DOM ready 3821var readyList = jQuery.Deferred(); 3822 3823jQuery.fn.ready = function( fn ) { 3824 3825 readyList 3826 .then( fn ) 3827 3828 // Wrap jQuery.readyException in a function so that the lookup 3829 // happens at the time of error handling instead of callback 3830 // registration. 3831 .catch( function( error ) { 3832 jQuery.readyException( error ); 3833 } ); 3834 3835 return this; 3836}; 3837 3838jQuery.extend( { 3839 3840 // Is the DOM ready to be used? Set to true once it occurs. 3841 isReady: false, 3842 3843 // A counter to track how many items to wait for before 3844 // the ready event fires. See trac-6781 3845 readyWait: 1, 3846 3847 // Handle when the DOM is ready 3848 ready: function( wait ) { 3849 3850 // Abort if there are pending holds or we're already ready 3851 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 3852 return; 3853 } 3854 3855 // Remember that the DOM is ready 3856 jQuery.isReady = true; 3857 3858 // If a normal DOM Ready event fired, decrement, and wait if need be 3859 if ( wait !== true && --jQuery.readyWait > 0 ) { 3860 return; 3861 } 3862 3863 // If there are functions bound, to execute 3864 readyList.resolveWith( document, [ jQuery ] ); 3865 } 3866} ); 3867 3868jQuery.ready.then = readyList.then; 3869 3870// The ready event handler and self cleanup method 3871function completed() { 3872 document.removeEventListener( "DOMContentLoaded", completed ); 3873 window.removeEventListener( "load", completed ); 3874 jQuery.ready(); 3875} 3876 3877// Catch cases where $(document).ready() is called 3878// after the browser event has already occurred. 3879// Support: IE <=9 - 10 only 3880// Older IE sometimes signals "interactive" too soon 3881if ( document.readyState === "complete" || 3882 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 3883 3884 // Handle it asynchronously to allow scripts the opportunity to delay ready 3885 window.setTimeout( jQuery.ready ); 3886 3887} else { 3888 3889 // Use the handy event callback 3890 document.addEventListener( "DOMContentLoaded", completed ); 3891 3892 // A fallback to window.onload, that will always work 3893 window.addEventListener( "load", completed ); 3894} 3895 3896 3897 3898 3899// Multifunctional method to get and set values of a collection 3900// The value/s can optionally be executed if it's a function 3901var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 3902 var i = 0, 3903 len = elems.length, 3904 bulk = key == null; 3905 3906 // Sets many values 3907 if ( toType( key ) === "object" ) { 3908 chainable = true; 3909 for ( i in key ) { 3910 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 3911 } 3912 3913 // Sets one value 3914 } else if ( value !== undefined ) { 3915 chainable = true; 3916 3917 if ( !isFunction( value ) ) { 3918 raw = true; 3919 } 3920 3921 if ( bulk ) { 3922 3923 // Bulk operations run against the entire set 3924 if ( raw ) { 3925 fn.call( elems, value ); 3926 fn = null; 3927 3928 // ...except when executing function values 3929 } else { 3930 bulk = fn; 3931 fn = function( elem, _key, value ) { 3932 return bulk.call( jQuery( elem ), value ); 3933 }; 3934 } 3935 } 3936 3937 if ( fn ) { 3938 for ( ; i < len; i++ ) { 3939 fn( 3940 elems[ i ], key, raw ? 3941 value : 3942 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 3943 ); 3944 } 3945 } 3946 } 3947 3948 if ( chainable ) { 3949 return elems; 3950 } 3951 3952 // Gets 3953 if ( bulk ) { 3954 return fn.call( elems ); 3955 } 3956 3957 return len ? fn( elems[ 0 ], key ) : emptyGet; 3958}; 3959 3960 3961// Matches dashed string for camelizing 3962var rmsPrefix = /^-ms-/, 3963 rdashAlpha = /-([a-z])/g; 3964 3965// Used by camelCase as callback to replace() 3966function fcamelCase( _all, letter ) { 3967 return letter.toUpperCase(); 3968} 3969 3970// Convert dashed to camelCase; used by the css and data modules 3971// Support: IE <=9 - 11, Edge 12 - 15 3972// Microsoft forgot to hump their vendor prefix (trac-9572) 3973function camelCase( string ) { 3974 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 3975} 3976var acceptData = function( owner ) { 3977 3978 // Accepts only: 3979 // - Node 3980 // - Node.ELEMENT_NODE 3981 // - Node.DOCUMENT_NODE 3982 // - Object 3983 // - Any 3984 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 3985}; 3986 3987 3988 3989 3990function Data() { 3991 this.expando = jQuery.expando + Data.uid++; 3992} 3993 3994Data.uid = 1; 3995 3996Data.prototype = { 3997 3998 cache: function( owner ) { 3999 4000 // Check if the owner object already has a cache 4001 var value = owner[ this.expando ]; 4002 4003 // If not, create one 4004 if ( !value ) { 4005 value = {}; 4006 4007 // We can accept data for non-element nodes in modern browsers, 4008 // but we should not, see trac-8335. 4009 // Always return an empty object. 4010 if ( acceptData( owner ) ) { 4011 4012 // If it is a node unlikely to be stringify-ed or looped over 4013 // use plain assignment 4014 if ( owner.nodeType ) { 4015 owner[ this.expando ] = value; 4016 4017 // Otherwise secure it in a non-enumerable property 4018 // configurable must be true to allow the property to be 4019 // deleted when data is removed 4020 } else { 4021 Object.defineProperty( owner, this.expando, { 4022 value: value, 4023 configurable: true 4024 } ); 4025 } 4026 } 4027 } 4028 4029 return value; 4030 }, 4031 set: function( owner, data, value ) { 4032 var prop, 4033 cache = this.cache( owner ); 4034 4035 // Handle: [ owner, key, value ] args 4036 // Always use camelCase key (gh-2257) 4037 if ( typeof data === "string" ) { 4038 cache[ camelCase( data ) ] = value; 4039 4040 // Handle: [ owner, { properties } ] args 4041 } else { 4042 4043 // Copy the properties one-by-one to the cache object 4044 for ( prop in data ) { 4045 cache[ camelCase( prop ) ] = data[ prop ]; 4046 } 4047 } 4048 return cache; 4049 }, 4050 get: function( owner, key ) { 4051 return key === undefined ? 4052 this.cache( owner ) : 4053 4054 // Always use camelCase key (gh-2257) 4055 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; 4056 }, 4057 access: function( owner, key, value ) { 4058 4059 // In cases where either: 4060 // 4061 // 1. No key was specified 4062 // 2. A string key was specified, but no value provided 4063 // 4064 // Take the "read" path and allow the get method to determine 4065 // which value to return, respectively either: 4066 // 4067 // 1. The entire cache object 4068 // 2. The data stored at the key 4069 // 4070 if ( key === undefined || 4071 ( ( key && typeof key === "string" ) && value === undefined ) ) { 4072 4073 return this.get( owner, key ); 4074 } 4075 4076 // When the key is not a string, or both a key and value 4077 // are specified, set or extend (existing objects) with either: 4078 // 4079 // 1. An object of properties 4080 // 2. A key and value 4081 // 4082 this.set( owner, key, value ); 4083 4084 // Since the "set" path can have two possible entry points 4085 // return the expected data based on which path was taken[*] 4086 return value !== undefined ? value : key; 4087 }, 4088 remove: function( owner, key ) { 4089 var i, 4090 cache = owner[ this.expando ]; 4091 4092 if ( cache === undefined ) { 4093 return; 4094 } 4095 4096 if ( key !== undefined ) { 4097 4098 // Support array or space separated string of keys 4099 if ( Array.isArray( key ) ) { 4100 4101 // If key is an array of keys... 4102 // We always set camelCase keys, so remove that. 4103 key = key.map( camelCase ); 4104 } else { 4105 key = camelCase( key ); 4106 4107 // If a key with the spaces exists, use it. 4108 // Otherwise, create an array by matching non-whitespace 4109 key = key in cache ? 4110 [ key ] : 4111 ( key.match( rnothtmlwhite ) || [] ); 4112 } 4113 4114 i = key.length; 4115 4116 while ( i-- ) { 4117 delete cache[ key[ i ] ]; 4118 } 4119 } 4120 4121 // Remove the expando if there's no more data 4122 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 4123 4124 // Support: Chrome <=35 - 45 4125 // Webkit & Blink performance suffers when deleting properties 4126 // from DOM nodes, so set to undefined instead 4127 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 4128 if ( owner.nodeType ) { 4129 owner[ this.expando ] = undefined; 4130 } else { 4131 delete owner[ this.expando ]; 4132 } 4133 } 4134 }, 4135 hasData: function( owner ) { 4136 var cache = owner[ this.expando ]; 4137 return cache !== undefined && !jQuery.isEmptyObject( cache ); 4138 } 4139}; 4140var dataPriv = new Data(); 4141 4142var dataUser = new Data(); 4143 4144 4145 4146// Implementation Summary 4147// 4148// 1. Enforce API surface and semantic compatibility with 1.9.x branch 4149// 2. Improve the module's maintainability by reducing the storage 4150// paths to a single mechanism. 4151// 3. Use the same single mechanism to support "private" and "user" data. 4152// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 4153// 5. Avoid exposing implementation details on user objects (eg. expando properties) 4154// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 4155 4156var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 4157 rmultiDash = /[A-Z]/g; 4158 4159function getData( data ) { 4160 if ( data === "true" ) { 4161 return true; 4162 } 4163 4164 if ( data === "false" ) { 4165 return false; 4166 } 4167 4168 if ( data === "null" ) { 4169 return null; 4170 } 4171 4172 // Only convert to a number if it doesn't change the string 4173 if ( data === +data + "" ) { 4174 return +data; 4175 } 4176 4177 if ( rbrace.test( data ) ) { 4178 return JSON.parse( data ); 4179 } 4180 4181 return data; 4182} 4183 4184function dataAttr( elem, key, data ) { 4185 var name; 4186 4187 // If nothing was found internally, try to fetch any 4188 // data from the HTML5 data-* attribute 4189 if ( data === undefined && elem.nodeType === 1 ) { 4190 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 4191 data = elem.getAttribute( name ); 4192 4193 if ( typeof data === "string" ) { 4194 try { 4195 data = getData( data ); 4196 } catch ( e ) {} 4197 4198 // Make sure we set the data so it isn't changed later 4199 dataUser.set( elem, key, data ); 4200 } else { 4201 data = undefined; 4202 } 4203 } 4204 return data; 4205} 4206 4207jQuery.extend( { 4208 hasData: function( elem ) { 4209 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 4210 }, 4211 4212 data: function( elem, name, data ) { 4213 return dataUser.access( elem, name, data ); 4214 }, 4215 4216 removeData: function( elem, name ) { 4217 dataUser.remove( elem, name ); 4218 }, 4219 4220 // TODO: Now that all calls to _data and _removeData have been replaced 4221 // with direct calls to dataPriv methods, these can be deprecated. 4222 _data: function( elem, name, data ) { 4223 return dataPriv.access( elem, name, data ); 4224 }, 4225 4226 _removeData: function( elem, name ) { 4227 dataPriv.remove( elem, name ); 4228 } 4229} ); 4230 4231jQuery.fn.extend( { 4232 data: function( key, value ) { 4233 var i, name, data, 4234 elem = this[ 0 ], 4235 attrs = elem && elem.attributes; 4236 4237 // Gets all values 4238 if ( key === undefined ) { 4239 if ( this.length ) { 4240 data = dataUser.get( elem ); 4241 4242 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 4243 i = attrs.length; 4244 while ( i-- ) { 4245 4246 // Support: IE 11 only 4247 // The attrs elements can be null (trac-14894) 4248 if ( attrs[ i ] ) { 4249 name = attrs[ i ].name; 4250 if ( name.indexOf( "data-" ) === 0 ) { 4251 name = camelCase( name.slice( 5 ) ); 4252 dataAttr( elem, name, data[ name ] ); 4253 } 4254 } 4255 } 4256 dataPriv.set( elem, "hasDataAttrs", true ); 4257 } 4258 } 4259 4260 return data; 4261 } 4262 4263 // Sets multiple values 4264 if ( typeof key === "object" ) { 4265 return this.each( function() { 4266 dataUser.set( this, key ); 4267 } ); 4268 } 4269 4270 return access( this, function( value ) { 4271 var data; 4272 4273 // The calling jQuery object (element matches) is not empty 4274 // (and therefore has an element appears at this[ 0 ]) and the 4275 // `value` parameter was not undefined. An empty jQuery object 4276 // will result in `undefined` for elem = this[ 0 ] which will 4277 // throw an exception if an attempt to read a data cache is made. 4278 if ( elem && value === undefined ) { 4279 4280 // Attempt to get data from the cache 4281 // The key will always be camelCased in Data 4282 data = dataUser.get( elem, key ); 4283 if ( data !== undefined ) { 4284 return data; 4285 } 4286 4287 // Attempt to "discover" the data in 4288 // HTML5 custom data-* attrs 4289 data = dataAttr( elem, key ); 4290 if ( data !== undefined ) { 4291 return data; 4292 } 4293 4294 // We tried really hard, but the data doesn't exist. 4295 return; 4296 } 4297 4298 // Set the data... 4299 this.each( function() { 4300 4301 // We always store the camelCased key 4302 dataUser.set( this, key, value ); 4303 } ); 4304 }, null, value, arguments.length > 1, null, true ); 4305 }, 4306 4307 removeData: function( key ) { 4308 return this.each( function() { 4309 dataUser.remove( this, key ); 4310 } ); 4311 } 4312} ); 4313 4314 4315jQuery.extend( { 4316 queue: function( elem, type, data ) { 4317 var queue; 4318 4319 if ( elem ) { 4320 type = ( type || "fx" ) + "queue"; 4321 queue = dataPriv.get( elem, type ); 4322 4323 // Speed up dequeue by getting out quickly if this is just a lookup 4324 if ( data ) { 4325 if ( !queue || Array.isArray( data ) ) { 4326 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 4327 } else { 4328 queue.push( data ); 4329 } 4330 } 4331 return queue || []; 4332 } 4333 }, 4334 4335 dequeue: function( elem, type ) { 4336 type = type || "fx"; 4337 4338 var queue = jQuery.queue( elem, type ), 4339 startLength = queue.length, 4340 fn = queue.shift(), 4341 hooks = jQuery._queueHooks( elem, type ), 4342 next = function() { 4343 jQuery.dequeue( elem, type ); 4344 }; 4345 4346 // If the fx queue is dequeued, always remove the progress sentinel 4347 if ( fn === "inprogress" ) { 4348 fn = queue.shift(); 4349 startLength--; 4350 } 4351 4352 if ( fn ) { 4353 4354 // Add a progress sentinel to prevent the fx queue from being 4355 // automatically dequeued 4356 if ( type === "fx" ) { 4357 queue.unshift( "inprogress" ); 4358 } 4359 4360 // Clear up the last queue stop function 4361 delete hooks.stop; 4362 fn.call( elem, next, hooks ); 4363 } 4364 4365 if ( !startLength && hooks ) { 4366 hooks.empty.fire(); 4367 } 4368 }, 4369 4370 // Not public - generate a queueHooks object, or return the current one 4371 _queueHooks: function( elem, type ) { 4372 var key = type + "queueHooks"; 4373 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 4374 empty: jQuery.Callbacks( "once memory" ).add( function() { 4375 dataPriv.remove( elem, [ type + "queue", key ] ); 4376 } ) 4377 } ); 4378 } 4379} ); 4380 4381jQuery.fn.extend( { 4382 queue: function( type, data ) { 4383 var setter = 2; 4384 4385 if ( typeof type !== "string" ) { 4386 data = type; 4387 type = "fx"; 4388 setter--; 4389 } 4390 4391 if ( arguments.length < setter ) { 4392 return jQuery.queue( this[ 0 ], type ); 4393 } 4394 4395 return data === undefined ? 4396 this : 4397 this.each( function() { 4398 var queue = jQuery.queue( this, type, data ); 4399 4400 // Ensure a hooks for this queue 4401 jQuery._queueHooks( this, type ); 4402 4403 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 4404 jQuery.dequeue( this, type ); 4405 } 4406 } ); 4407 }, 4408 dequeue: function( type ) { 4409 return this.each( function() { 4410 jQuery.dequeue( this, type ); 4411 } ); 4412 }, 4413 clearQueue: function( type ) { 4414 return this.queue( type || "fx", [] ); 4415 }, 4416 4417 // Get a promise resolved when queues of a certain type 4418 // are emptied (fx is the type by default) 4419 promise: function( type, obj ) { 4420 var tmp, 4421 count = 1, 4422 defer = jQuery.Deferred(), 4423 elements = this, 4424 i = this.length, 4425 resolve = function() { 4426 if ( !( --count ) ) { 4427 defer.resolveWith( elements, [ elements ] ); 4428 } 4429 }; 4430 4431 if ( typeof type !== "string" ) { 4432 obj = type; 4433 type = undefined; 4434 } 4435 type = type || "fx"; 4436 4437 while ( i-- ) { 4438 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 4439 if ( tmp && tmp.empty ) { 4440 count++; 4441 tmp.empty.add( resolve ); 4442 } 4443 } 4444 resolve(); 4445 return defer.promise( obj ); 4446 } 4447} ); 4448var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 4449 4450var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 4451 4452 4453var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 4454 4455var documentElement = document.documentElement; 4456 4457 4458 4459 var isAttached = function( elem ) { 4460 return jQuery.contains( elem.ownerDocument, elem ); 4461 }, 4462 composed = { composed: true }; 4463 4464 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only 4465 // Check attachment across shadow DOM boundaries when possible (gh-3504) 4466 // Support: iOS 10.0-10.2 only 4467 // Early iOS 10 versions support `attachShadow` but not `getRootNode`, 4468 // leading to errors. We need to check for `getRootNode`. 4469 if ( documentElement.getRootNode ) { 4470 isAttached = function( elem ) { 4471 return jQuery.contains( elem.ownerDocument, elem ) || 4472 elem.getRootNode( composed ) === elem.ownerDocument; 4473 }; 4474 } 4475var isHiddenWithinTree = function( elem, el ) { 4476 4477 // isHiddenWithinTree might be called from jQuery#filter function; 4478 // in that case, element will be second argument 4479 elem = el || elem; 4480 4481 // Inline style trumps all 4482 return elem.style.display === "none" || 4483 elem.style.display === "" && 4484 4485 // Otherwise, check computed style 4486 // Support: Firefox <=43 - 45 4487 // Disconnected elements can have computed display: none, so first confirm that elem is 4488 // in the document. 4489 isAttached( elem ) && 4490 4491 jQuery.css( elem, "display" ) === "none"; 4492 }; 4493 4494 4495 4496function adjustCSS( elem, prop, valueParts, tween ) { 4497 var adjusted, scale, 4498 maxIterations = 20, 4499 currentValue = tween ? 4500 function() { 4501 return tween.cur(); 4502 } : 4503 function() { 4504 return jQuery.css( elem, prop, "" ); 4505 }, 4506 initial = currentValue(), 4507 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 4508 4509 // Starting value computation is required for potential unit mismatches 4510 initialInUnit = elem.nodeType && 4511 ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 4512 rcssNum.exec( jQuery.css( elem, prop ) ); 4513 4514 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 4515 4516 // Support: Firefox <=54 4517 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 4518 initial = initial / 2; 4519 4520 // Trust units reported by jQuery.css 4521 unit = unit || initialInUnit[ 3 ]; 4522 4523 // Iteratively approximate from a nonzero starting point 4524 initialInUnit = +initial || 1; 4525 4526 while ( maxIterations-- ) { 4527 4528 // Evaluate and update our best guess (doubling guesses that zero out). 4529 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 4530 jQuery.style( elem, prop, initialInUnit + unit ); 4531 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { 4532 maxIterations = 0; 4533 } 4534 initialInUnit = initialInUnit / scale; 4535 4536 } 4537 4538 initialInUnit = initialInUnit * 2; 4539 jQuery.style( elem, prop, initialInUnit + unit ); 4540 4541 // Make sure we update the tween properties later on 4542 valueParts = valueParts || []; 4543 } 4544 4545 if ( valueParts ) { 4546 initialInUnit = +initialInUnit || +initial || 0; 4547 4548 // Apply relative offset (+=/-=) if specified 4549 adjusted = valueParts[ 1 ] ? 4550 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 4551 +valueParts[ 2 ]; 4552 if ( tween ) { 4553 tween.unit = unit; 4554 tween.start = initialInUnit; 4555 tween.end = adjusted; 4556 } 4557 } 4558 return adjusted; 4559} 4560 4561 4562var defaultDisplayMap = {}; 4563 4564function getDefaultDisplay( elem ) { 4565 var temp, 4566 doc = elem.ownerDocument, 4567 nodeName = elem.nodeName, 4568 display = defaultDisplayMap[ nodeName ]; 4569 4570 if ( display ) {
vendor: 2,317 bytes, lines 4571-4669
4571 return display; 4572 } 4573 4574 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 4575 display = jQuery.css( temp, "display" ); 4576 4577 temp.parentNode.removeChild( temp ); 4578 4579 if ( display === "none" ) { 4580 display = "block"; 4581 } 4582 defaultDisplayMap[ nodeName ] = display; 4583 4584 return display; 4585} 4586 4587function showHide( elements, show ) { 4588 var display, elem, 4589 values = [], 4590 index = 0, 4591 length = elements.length; 4592 4593 // Determine new display value for elements that need to change 4594 for ( ; index < length; index++ ) { 4595 elem = elements[ index ]; 4596 if ( !elem.style ) { 4597 continue; 4598 } 4599 4600 display = elem.style.display; 4601 if ( show ) { 4602 4603 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 4604 // check is required in this first loop unless we have a nonempty display value (either 4605 // inline or about-to-be-restored) 4606 if ( display === "none" ) { 4607 values[ index ] = dataPriv.get( elem, "display" ) || null; 4608 if ( !values[ index ] ) { 4609 elem.style.display = ""; 4610 } 4611 } 4612 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 4613 values[ index ] = getDefaultDisplay( elem ); 4614 } 4615 } else { 4616 if ( display !== "none" ) { 4617 values[ index ] = "none"; 4618 4619 // Remember what we're overwriting 4620 dataPriv.set( elem, "display", display ); 4621 } 4622 } 4623 } 4624 4625 // Set the display of the elements in a second loop to avoid constant reflow 4626 for ( index = 0; index < length; index++ ) { 4627 if ( values[ index ] != null ) { 4628 elements[ index ].style.display = values[ index ]; 4629 } 4630 } 4631 4632 return elements; 4633} 4634 4635jQuery.fn.extend( { 4636 show: function() { 4637 return showHide( this, true ); 4638 }, 4639 hide: function() { 4640 return showHide( this ); 4641 }, 4642 toggle: function( state ) { 4643 if ( typeof state === "boolean" ) { 4644 return state ? this.show() : this.hide(); 4645 } 4646 4647 return this.each( function() { 4648 if ( isHiddenWithinTree( this ) ) { 4649 jQuery( this ).show(); 4650 } else { 4651 jQuery( this ).hide(); 4652 } 4653 } ); 4654 } 4655} ); 4656var rcheckableType = ( /^(?:checkbox|radio)$/i ); 4657 4658var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); 4659 4660var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); 4661 4662 4663 4664( function() { 4665 var fragment = document.createDocumentFragment(), 4666 div = fragment.appendChild( document.createElement( "div" ) ), 4667 input = document.createElement( "input" ); 4668 4669 // Support: Android 4.0 - 4.3 only
vendor: 10,092 bytes, lines 4670-5054
4670 // Check state lost if the name is set (trac-11217) 4671 // Support: Windows Web Apps (WWA) 4672 // `name` and `type` must use .setAttribute for WWA (trac-14901) 4673 input.setAttribute( "type", "radio" ); 4674 input.setAttribute( "checked", "checked" ); 4675 input.setAttribute( "name", "t" ); 4676 4677 div.appendChild( input ); 4678 4679 // Support: Android <=4.1 only 4680 // Older WebKit doesn't clone checked state correctly in fragments 4681 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 4682 4683 // Support: IE <=11 only 4684 // Make sure textarea (and checkbox) defaultValue is properly cloned 4685 div.innerHTML = "<textarea>x</textarea>"; 4686 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 4687 4688 // Support: IE <=9 only 4689 // IE <=9 replaces <option> tags with their contents when inserted outside of 4690 // the select element. 4691 div.innerHTML = "<option></option>"; 4692 support.option = !!div.lastChild; 4693} )(); 4694 4695 4696// We have to close these tags to support XHTML (trac-13200) 4697var wrapMap = { 4698 4699 // XHTML parsers do not magically insert elements in the 4700 // same way that tag soup parsers do. So we cannot shorten 4701 // this by omitting <tbody> or other required elements. 4702 thead: [ 1, "<table>", "</table>" ], 4703 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 4704 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 4705 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 4706 4707 _default: [ 0, "", "" ] 4708}; 4709 4710wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 4711wrapMap.th = wrapMap.td; 4712 4713// Support: IE <=9 only 4714if ( !support.option ) { 4715 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; 4716} 4717 4718 4719function getAll( context, tag ) { 4720 4721 // Support: IE <=9 - 11 only 4722 // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) 4723 var ret; 4724 4725 if ( typeof context.getElementsByTagName !== "undefined" ) { 4726 ret = context.getElementsByTagName( tag || "*" ); 4727 4728 } else if ( typeof context.querySelectorAll !== "undefined" ) { 4729 ret = context.querySelectorAll( tag || "*" ); 4730 4731 } else { 4732 ret = []; 4733 } 4734 4735 if ( tag === undefined || tag && nodeName( context, tag ) ) { 4736 return jQuery.merge( [ context ], ret ); 4737 } 4738 4739 return ret; 4740} 4741 4742 4743// Mark scripts as having already been evaluated 4744function setGlobalEval( elems, refElements ) { 4745 var i = 0, 4746 l = elems.length; 4747 4748 for ( ; i < l; i++ ) { 4749 dataPriv.set( 4750 elems[ i ], 4751 "globalEval", 4752 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 4753 ); 4754 } 4755} 4756 4757 4758var rhtml = /<|&#?\w+;/; 4759 4760function buildFragment( elems, context, scripts, selection, ignored ) { 4761 var elem, tmp, tag, wrap, attached, j, 4762 fragment = context.createDocumentFragment(), 4763 nodes = [], 4764 i = 0, 4765 l = elems.length; 4766 4767 for ( ; i < l; i++ ) { 4768 elem = elems[ i ]; 4769 4770 if ( elem || elem === 0 ) { 4771 4772 // Add nodes directly 4773 if ( toType( elem ) === "object" ) { 4774 4775 // Support: Android <=4.0 only, PhantomJS 1 only 4776 // push.apply(_, arraylike) throws on ancient WebKit 4777 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 4778 4779 // Convert non-html into a text node 4780 } else if ( !rhtml.test( elem ) ) { 4781 nodes.push( context.createTextNode( elem ) ); 4782 4783 // Convert html into DOM nodes 4784 } else { 4785 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 4786 4787 // Deserialize a standard representation 4788 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 4789 wrap = wrapMap[ tag ] || wrapMap._default; 4790 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 4791 4792 // Descend through wrappers to the right content 4793 j = wrap[ 0 ]; 4794 while ( j-- ) { 4795 tmp = tmp.lastChild; 4796 } 4797 4798 // Support: Android <=4.0 only, PhantomJS 1 only 4799 // push.apply(_, arraylike) throws on ancient WebKit 4800 jQuery.merge( nodes, tmp.childNodes ); 4801 4802 // Remember the top-level container 4803 tmp = fragment.firstChild; 4804 4805 // Ensure the created nodes are orphaned (trac-12392) 4806 tmp.textContent = ""; 4807 } 4808 } 4809 } 4810 4811 // Remove wrapper from fragment 4812 fragment.textContent = ""; 4813 4814 i = 0; 4815 while ( ( elem = nodes[ i++ ] ) ) { 4816 4817 // Skip elements already in the context collection (trac-4087) 4818 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 4819 if ( ignored ) { 4820 ignored.push( elem ); 4821 } 4822 continue; 4823 } 4824 4825 attached = isAttached( elem ); 4826 4827 // Append to fragment 4828 tmp = getAll( fragment.appendChild( elem ), "script" ); 4829 4830 // Preserve script evaluation history 4831 if ( attached ) { 4832 setGlobalEval( tmp ); 4833 } 4834 4835 // Capture executables 4836 if ( scripts ) { 4837 j = 0; 4838 while ( ( elem = tmp[ j++ ] ) ) { 4839 if ( rscriptType.test( elem.type || "" ) ) { 4840 scripts.push( elem ); 4841 } 4842 } 4843 } 4844 } 4845 4846 return fragment; 4847} 4848 4849 4850var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 4851 4852function returnTrue() { 4853 return true; 4854} 4855 4856function returnFalse() { 4857 return false; 4858} 4859 4860function on( elem, types, selector, data, fn, one ) { 4861 var origFn, type; 4862 4863 // Types can be a map of types/handlers 4864 if ( typeof types === "object" ) { 4865 4866 // ( types-Object, selector, data ) 4867 if ( typeof selector !== "string" ) { 4868 4869 // ( types-Object, data ) 4870 data = data || selector; 4871 selector = undefined; 4872 } 4873 for ( type in types ) { 4874 on( elem, type, selector, data, types[ type ], one ); 4875 } 4876 return elem; 4877 } 4878 4879 if ( data == null && fn == null ) { 4880 4881 // ( types, fn ) 4882 fn = selector; 4883 data = selector = undefined; 4884 } else if ( fn == null ) { 4885 if ( typeof selector === "string" ) { 4886 4887 // ( types, selector, fn ) 4888 fn = data; 4889 data = undefined; 4890 } else { 4891 4892 // ( types, data, fn ) 4893 fn = data; 4894 data = selector; 4895 selector = undefined; 4896 } 4897 } 4898 if ( fn === false ) { 4899 fn = returnFalse; 4900 } else if ( !fn ) { 4901 return elem; 4902 } 4903 4904 if ( one === 1 ) { 4905 origFn = fn; 4906 fn = function( event ) { 4907 4908 // Can use an empty set, since event contains the info 4909 jQuery().off( event ); 4910 return origFn.apply( this, arguments ); 4911 }; 4912 4913 // Use same guid so caller can remove using origFn 4914 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 4915 } 4916 return elem.each( function() { 4917 jQuery.event.add( this, types, fn, data, selector ); 4918 } ); 4919} 4920 4921/* 4922 * Helper functions for managing events -- not part of the public interface. 4923 * Props to Dean Edwards' addEvent library for many of the ideas. 4924 */ 4925jQuery.event = { 4926 4927 global: {}, 4928 4929 add: function( elem, types, handler, data, selector ) { 4930 4931 var handleObjIn, eventHandle, tmp, 4932 events, t, handleObj, 4933 special, handlers, type, namespaces, origType, 4934 elemData = dataPriv.get( elem ); 4935 4936 // Only attach events to objects that accept data 4937 if ( !acceptData( elem ) ) { 4938 return; 4939 } 4940 4941 // Caller can pass in an object of custom data in lieu of the handler 4942 if ( handler.handler ) { 4943 handleObjIn = handler; 4944 handler = handleObjIn.handler; 4945 selector = handleObjIn.selector; 4946 } 4947 4948 // Ensure that invalid selectors throw exceptions at attach time 4949 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 4950 if ( selector ) { 4951 jQuery.find.matchesSelector( documentElement, selector ); 4952 } 4953 4954 // Make sure that the handler has a unique ID, used to find/remove it later 4955 if ( !handler.guid ) { 4956 handler.guid = jQuery.guid++; 4957 } 4958 4959 // Init the element's event structure and main handler, if this is the first 4960 if ( !( events = elemData.events ) ) { 4961 events = elemData.events = Object.create( null ); 4962 } 4963 if ( !( eventHandle = elemData.handle ) ) { 4964 eventHandle = elemData.handle = function( e ) { 4965 4966 // Discard the second event of a jQuery.event.trigger() and 4967 // when an event is called after a page has unloaded 4968 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 4969 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 4970 }; 4971 } 4972 4973 // Handle multiple events separated by a space 4974 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 4975 t = types.length; 4976 while ( t-- ) { 4977 tmp = rtypenamespace.exec( types[ t ] ) || []; 4978 type = origType = tmp[ 1 ]; 4979 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 4980 4981 // There *must* be a type, no attaching namespace-only handlers 4982 if ( !type ) { 4983 continue; 4984 } 4985 4986 // If event changes its type, use the special event handlers for the changed type 4987 special = jQuery.event.special[ type ] || {}; 4988 4989 // If selector defined, determine special event api type, otherwise given type 4990 type = ( selector ? special.delegateType : special.bindType ) || type; 4991 4992 // Update special based on newly reset type 4993 special = jQuery.event.special[ type ] || {}; 4994 4995 // handleObj is passed to all event handlers 4996 handleObj = jQuery.extend( { 4997 type: type, 4998 origType: origType, 4999 data: data, 5000 handler: handler, 5001 guid: handler.guid, 5002 selector: selector, 5003 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 5004 namespace: namespaces.join( "." ) 5005 }, handleObjIn ); 5006 5007 // Init the event handler queue if we're the first 5008 if ( !( handlers = events[ type ] ) ) { 5009 handlers = events[ type ] = []; 5010 handlers.delegateCount = 0; 5011 5012 // Only use addEventListener if the special events handler returns false 5013 if ( !special.setup || 5014 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 5015 5016 if ( elem.addEventListener ) { 5017 elem.addEventListener( type, eventHandle ); 5018 } 5019 } 5020 } 5021 5022 if ( special.add ) { 5023 special.add.call( elem, handleObj ); 5024 5025 if ( !handleObj.handler.guid ) { 5026 handleObj.handler.guid = handler.guid; 5027 } 5028 } 5029 5030 // Add to the element's handler list, delegates in front 5031 if ( selector ) { 5032 handlers.splice( handlers.delegateCount++, 0, handleObj ); 5033 } else { 5034 handlers.push( handleObj ); 5035 } 5036 5037 // Keep track of which events have ever been used, for event optimization 5038 jQuery.event.global[ type ] = true; 5039 } 5040 5041 }, 5042 5043 // Detach an event or set of events from an element 5044 remove: function( elem, types, handler, selector, mappedTypes ) { 5045 5046 var j, origCount, tmp, 5047 events, t, handleObj, 5048 special, handlers, type, namespaces, origType, 5049 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 5050 5051 if ( !elemData || !( events = elemData.events ) ) { 5052 return; 5053 } 5054
vendor: 4,197 bytes, lines 5055-5193
5055 // Once for each type.namespace in types; type may be omitted 5056 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5057 t = types.length; 5058 while ( t-- ) { 5059 tmp = rtypenamespace.exec( types[ t ] ) || []; 5060 type = origType = tmp[ 1 ]; 5061 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5062 5063 // Unbind all events (on this namespace, if provided) for the element 5064 if ( !type ) { 5065 for ( type in events ) { 5066 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 5067 } 5068 continue; 5069 } 5070 5071 special = jQuery.event.special[ type ] || {}; 5072 type = ( selector ? special.delegateType : special.bindType ) || type; 5073 handlers = events[ type ] || []; 5074 tmp = tmp[ 2 ] && 5075 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 5076 5077 // Remove matching events 5078 origCount = j = handlers.length; 5079 while ( j-- ) { 5080 handleObj = handlers[ j ]; 5081 5082 if ( ( mappedTypes || origType === handleObj.origType ) && 5083 ( !handler || handler.guid === handleObj.guid ) && 5084 ( !tmp || tmp.test( handleObj.namespace ) ) && 5085 ( !selector || selector === handleObj.selector || 5086 selector === "**" && handleObj.selector ) ) { 5087 handlers.splice( j, 1 ); 5088 5089 if ( handleObj.selector ) { 5090 handlers.delegateCount--; 5091 } 5092 if ( special.remove ) { 5093 special.remove.call( elem, handleObj ); 5094 } 5095 } 5096 } 5097 5098 // Remove generic event handler if we removed something and no more handlers exist 5099 // (avoids potential for endless recursion during removal of special event handlers) 5100 if ( origCount && !handlers.length ) { 5101 if ( !special.teardown || 5102 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 5103 5104 jQuery.removeEvent( elem, type, elemData.handle ); 5105 } 5106 5107 delete events[ type ]; 5108 } 5109 } 5110 5111 // Remove data and the expando if it's no longer used 5112 if ( jQuery.isEmptyObject( events ) ) { 5113 dataPriv.remove( elem, "handle events" ); 5114 } 5115 }, 5116 5117 dispatch: function( nativeEvent ) { 5118 5119 var i, j, ret, matched, handleObj, handlerQueue, 5120 args = new Array( arguments.length ), 5121 5122 // Make a writable jQuery.Event from the native event object 5123 event = jQuery.event.fix( nativeEvent ), 5124 5125 handlers = ( 5126 dataPriv.get( this, "events" ) || Object.create( null ) 5127 )[ event.type ] || [], 5128 special = jQuery.event.special[ event.type ] || {}; 5129 5130 // Use the fix-ed jQuery.Event rather than the (read-only) native event 5131 args[ 0 ] = event; 5132 5133 for ( i = 1; i < arguments.length; i++ ) { 5134 args[ i ] = arguments[ i ]; 5135 } 5136 5137 event.delegateTarget = this; 5138 5139 // Call the preDispatch hook for the mapped type, and let it bail if desired 5140 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 5141 return; 5142 } 5143 5144 // Determine handlers 5145 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 5146 5147 // Run delegates first; they may want to stop propagation beneath us 5148 i = 0; 5149 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 5150 event.currentTarget = matched.elem; 5151 5152 j = 0; 5153 while ( ( handleObj = matched.handlers[ j++ ] ) && 5154 !event.isImmediatePropagationStopped() ) { 5155 5156 // If the event is namespaced, then each handler is only invoked if it is 5157 // specially universal or its namespaces are a superset of the event's. 5158 if ( !event.rnamespace || handleObj.namespace === false || 5159 event.rnamespace.test( handleObj.namespace ) ) { 5160 5161 event.handleObj = handleObj; 5162 event.data = handleObj.data; 5163 5164 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 5165 handleObj.handler ).apply( matched.elem, args ); 5166 5167 if ( ret !== undefined ) { 5168 if ( ( event.result = ret ) === false ) { 5169 event.preventDefault(); 5170 event.stopPropagation(); 5171 } 5172 } 5173 } 5174 } 5175 } 5176 5177 // Call the postDispatch hook for the mapped type 5178 if ( special.postDispatch ) { 5179 special.postDispatch.call( this, event ); 5180 } 5181 5182 return event.result; 5183 }, 5184 5185 handlers: function( event, handlers ) { 5186 var i, handleObj, sel, matchedHandlers, matchedSelectors, 5187 handlerQueue = [], 5188 delegateCount = handlers.delegateCount, 5189 cur = event.target; 5190 5191 // Find delegate handlers 5192 if ( delegateCount && 5193
vendor: 21,959 bytes, lines 5194-5946
5194 // Support: IE <=9 5195 // Black-hole SVG <use> instance trees (trac-13180) 5196 cur.nodeType && 5197 5198 // Support: Firefox <=42 5199 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 5200 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 5201 // Support: IE 11 only 5202 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 5203 !( event.type === "click" && event.button >= 1 ) ) { 5204 5205 for ( ; cur !== this; cur = cur.parentNode || this ) { 5206 5207 // Don't check non-elements (trac-13208) 5208 // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) 5209 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 5210 matchedHandlers = []; 5211 matchedSelectors = {}; 5212 for ( i = 0; i < delegateCount; i++ ) { 5213 handleObj = handlers[ i ]; 5214 5215 // Don't conflict with Object.prototype properties (trac-13203) 5216 sel = handleObj.selector + " "; 5217 5218 if ( matchedSelectors[ sel ] === undefined ) { 5219 matchedSelectors[ sel ] = handleObj.needsContext ? 5220 jQuery( sel, this ).index( cur ) > -1 : 5221 jQuery.find( sel, this, null, [ cur ] ).length; 5222 } 5223 if ( matchedSelectors[ sel ] ) { 5224 matchedHandlers.push( handleObj ); 5225 } 5226 } 5227 if ( matchedHandlers.length ) { 5228 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 5229 } 5230 } 5231 } 5232 } 5233 5234 // Add the remaining (directly-bound) handlers 5235 cur = this; 5236 if ( delegateCount < handlers.length ) { 5237 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 5238 } 5239 5240 return handlerQueue; 5241 }, 5242 5243 addProp: function( name, hook ) { 5244 Object.defineProperty( jQuery.Event.prototype, name, { 5245 enumerable: true, 5246 configurable: true, 5247 5248 get: isFunction( hook ) ? 5249 function() { 5250 if ( this.originalEvent ) { 5251 return hook( this.originalEvent ); 5252 } 5253 } : 5254 function() { 5255 if ( this.originalEvent ) { 5256 return this.originalEvent[ name ]; 5257 } 5258 }, 5259 5260 set: function( value ) { 5261 Object.defineProperty( this, name, { 5262 enumerable: true, 5263 configurable: true, 5264 writable: true, 5265 value: value 5266 } ); 5267 } 5268 } ); 5269 }, 5270 5271 fix: function( originalEvent ) { 5272 return originalEvent[ jQuery.expando ] ? 5273 originalEvent : 5274 new jQuery.Event( originalEvent ); 5275 }, 5276 5277 special: { 5278 load: { 5279 5280 // Prevent triggered image.load events from bubbling to window.load 5281 noBubble: true 5282 }, 5283 click: { 5284 5285 // Utilize native event to ensure correct state for checkable inputs 5286 setup: function( data ) { 5287 5288 // For mutual compressibility with _default, replace `this` access with a local var. 5289 // `|| data` is dead code meant only to preserve the variable through minification. 5290 var el = this || data; 5291 5292 // Claim the first handler 5293 if ( rcheckableType.test( el.type ) && 5294 el.click && nodeName( el, "input" ) ) { 5295 5296 // dataPriv.set( el, "click", ... ) 5297 leverageNative( el, "click", true ); 5298 } 5299 5300 // Return false to allow normal processing in the caller 5301 return false; 5302 }, 5303 trigger: function( data ) { 5304 5305 // For mutual compressibility with _default, replace `this` access with a local var. 5306 // `|| data` is dead code meant only to preserve the variable through minification. 5307 var el = this || data; 5308 5309 // Force setup before triggering a click 5310 if ( rcheckableType.test( el.type ) && 5311 el.click && nodeName( el, "input" ) ) { 5312 5313 leverageNative( el, "click" ); 5314 } 5315 5316 // Return non-false to allow normal event-path propagation 5317 return true; 5318 }, 5319 5320 // For cross-browser consistency, suppress native .click() on links 5321 // Also prevent it if we're currently inside a leveraged native-event stack 5322 _default: function( event ) { 5323 var target = event.target; 5324 return rcheckableType.test( target.type ) && 5325 target.click && nodeName( target, "input" ) && 5326 dataPriv.get( target, "click" ) || 5327 nodeName( target, "a" ); 5328 } 5329 }, 5330 5331 beforeunload: { 5332 postDispatch: function( event ) { 5333 5334 // Support: Firefox 20+ 5335 // Firefox doesn't alert if the returnValue field is not set. 5336 if ( event.result !== undefined && event.originalEvent ) { 5337 event.originalEvent.returnValue = event.result; 5338 } 5339 } 5340 } 5341 } 5342}; 5343 5344// Ensure the presence of an event listener that handles manually-triggered 5345// synthetic events by interrupting progress until reinvoked in response to 5346// *native* events that it fires directly, ensuring that state changes have 5347// already occurred before other listeners are invoked. 5348function leverageNative( el, type, isSetup ) { 5349 5350 // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add 5351 if ( !isSetup ) { 5352 if ( dataPriv.get( el, type ) === undefined ) { 5353 jQuery.event.add( el, type, returnTrue ); 5354 } 5355 return; 5356 } 5357 5358 // Register the controller as a special universal handler for all event namespaces 5359 dataPriv.set( el, type, false ); 5360 jQuery.event.add( el, type, { 5361 namespace: false, 5362 handler: function( event ) { 5363 var result, 5364 saved = dataPriv.get( this, type ); 5365 5366 if ( ( event.isTrigger & 1 ) && this[ type ] ) { 5367 5368 // Interrupt processing of the outer synthetic .trigger()ed event 5369 if ( !saved ) { 5370 5371 // Store arguments for use when handling the inner native event 5372 // There will always be at least one argument (an event object), so this array 5373 // will not be confused with a leftover capture object. 5374 saved = slice.call( arguments ); 5375 dataPriv.set( this, type, saved ); 5376 5377 // Trigger the native event and capture its result 5378 this[ type ](); 5379 result = dataPriv.get( this, type ); 5380 dataPriv.set( this, type, false ); 5381 5382 if ( saved !== result ) { 5383 5384 // Cancel the outer synthetic event 5385 event.stopImmediatePropagation(); 5386 event.preventDefault(); 5387 5388 return result; 5389 } 5390 5391 // If this is an inner synthetic event for an event with a bubbling surrogate 5392 // (focus or blur), assume that the surrogate already propagated from triggering 5393 // the native event and prevent that from happening again here. 5394 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the 5395 // bubbling surrogate propagates *after* the non-bubbling base), but that seems 5396 // less bad than duplication. 5397 } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { 5398 event.stopPropagation(); 5399 } 5400 5401 // If this is a native event triggered above, everything is now in order 5402 // Fire an inner synthetic event with the original arguments 5403 } else if ( saved ) { 5404 5405 // ...and capture the result 5406 dataPriv.set( this, type, jQuery.event.trigger( 5407 saved[ 0 ], 5408 saved.slice( 1 ), 5409 this 5410 ) ); 5411 5412 // Abort handling of the native event by all jQuery handlers while allowing 5413 // native handlers on the same element to run. On target, this is achieved 5414 // by stopping immediate propagation just on the jQuery event. However, 5415 // the native event is re-wrapped by a jQuery one on each level of the 5416 // propagation so the only way to stop it for jQuery is to stop it for 5417 // everyone via native `stopPropagation()`. This is not a problem for 5418 // focus/blur which don't bubble, but it does also stop click on checkboxes 5419 // and radios. We accept this limitation. 5420 event.stopPropagation(); 5421 event.isImmediatePropagationStopped = returnTrue; 5422 } 5423 } 5424 } ); 5425} 5426 5427jQuery.removeEvent = function( elem, type, handle ) { 5428 5429 // This "if" is needed for plain objects 5430 if ( elem.removeEventListener ) { 5431 elem.removeEventListener( type, handle ); 5432 } 5433}; 5434 5435jQuery.Event = function( src, props ) { 5436 5437 // Allow instantiation without the 'new' keyword 5438 if ( !( this instanceof jQuery.Event ) ) { 5439 return new jQuery.Event( src, props ); 5440 } 5441 5442 // Event object 5443 if ( src && src.type ) { 5444 this.originalEvent = src; 5445 this.type = src.type; 5446 5447 // Events bubbling up the document may have been marked as prevented 5448 // by a handler lower down the tree; reflect the correct value. 5449 this.isDefaultPrevented = src.defaultPrevented || 5450 src.defaultPrevented === undefined && 5451 5452 // Support: Android <=2.3 only 5453 src.returnValue === false ? 5454 returnTrue : 5455 returnFalse; 5456 5457 // Create target properties 5458 // Support: Safari <=6 - 7 only 5459 // Target should not be a text node (trac-504, trac-13143) 5460 this.target = ( src.target && src.target.nodeType === 3 ) ? 5461 src.target.parentNode : 5462 src.target; 5463 5464 this.currentTarget = src.currentTarget; 5465 this.relatedTarget = src.relatedTarget; 5466 5467 // Event type 5468 } else { 5469 this.type = src; 5470 } 5471 5472 // Put explicitly provided properties onto the event object 5473 if ( props ) { 5474 jQuery.extend( this, props ); 5475 } 5476 5477 // Create a timestamp if incoming event doesn't have one 5478 this.timeStamp = src && src.timeStamp || Date.now(); 5479 5480 // Mark it as fixed 5481 this[ jQuery.expando ] = true; 5482}; 5483 5484// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 5485// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 5486jQuery.Event.prototype = { 5487 constructor: jQuery.Event, 5488 isDefaultPrevented: returnFalse, 5489 isPropagationStopped: returnFalse, 5490 isImmediatePropagationStopped: returnFalse, 5491 isSimulated: false, 5492 5493 preventDefault: function() { 5494 var e = this.originalEvent; 5495 5496 this.isDefaultPrevented = returnTrue; 5497 5498 if ( e && !this.isSimulated ) { 5499 e.preventDefault(); 5500 } 5501 }, 5502 stopPropagation: function() { 5503 var e = this.originalEvent; 5504 5505 this.isPropagationStopped = returnTrue; 5506 5507 if ( e && !this.isSimulated ) { 5508 e.stopPropagation(); 5509 } 5510 }, 5511 stopImmediatePropagation: function() { 5512 var e = this.originalEvent; 5513 5514 this.isImmediatePropagationStopped = returnTrue; 5515 5516 if ( e && !this.isSimulated ) { 5517 e.stopImmediatePropagation(); 5518 } 5519 5520 this.stopPropagation(); 5521 } 5522}; 5523 5524// Includes all common event props including KeyEvent and MouseEvent specific props 5525jQuery.each( { 5526 altKey: true, 5527 bubbles: true, 5528 cancelable: true, 5529 changedTouches: true, 5530 ctrlKey: true, 5531 detail: true, 5532 eventPhase: true, 5533 metaKey: true, 5534 pageX: true, 5535 pageY: true, 5536 shiftKey: true, 5537 view: true, 5538 "char": true, 5539 code: true, 5540 charCode: true, 5541 key: true, 5542 keyCode: true, 5543 button: true, 5544 buttons: true, 5545 clientX: true, 5546 clientY: true, 5547 offsetX: true, 5548 offsetY: true, 5549 pointerId: true, 5550 pointerType: true, 5551 screenX: true, 5552 screenY: true, 5553 targetTouches: true, 5554 toElement: true, 5555 touches: true, 5556 which: true 5557}, jQuery.event.addProp ); 5558 5559jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { 5560 5561 function focusMappedHandler( nativeEvent ) { 5562 if ( document.documentMode ) { 5563 5564 // Support: IE 11+ 5565 // Attach a single focusin/focusout handler on the document while someone wants 5566 // focus/blur. This is because the former are synchronous in IE while the latter 5567 // are async. In other browsers, all those handlers are invoked synchronously. 5568 5569 // `handle` from private data would already wrap the event, but we need 5570 // to change the `type` here. 5571 var handle = dataPriv.get( this, "handle" ), 5572 event = jQuery.event.fix( nativeEvent ); 5573 event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; 5574 event.isSimulated = true; 5575 5576 // First, handle focusin/focusout 5577 handle( nativeEvent ); 5578 5579 // ...then, handle focus/blur 5580 // 5581 // focus/blur don't bubble while focusin/focusout do; simulate the former by only 5582 // invoking the handler at the lower level. 5583 if ( event.target === event.currentTarget ) { 5584 5585 // The setup part calls `leverageNative`, which, in turn, calls 5586 // `jQuery.event.add`, so event handle will already have been set 5587 // by this point. 5588 handle( event ); 5589 } 5590 } else { 5591 5592 // For non-IE browsers, attach a single capturing handler on the document 5593 // while someone wants focusin/focusout. 5594 jQuery.event.simulate( delegateType, nativeEvent.target, 5595 jQuery.event.fix( nativeEvent ) ); 5596 } 5597 } 5598 5599 jQuery.event.special[ type ] = { 5600 5601 // Utilize native event if possible so blur/focus sequence is correct 5602 setup: function() { 5603 5604 var attaches; 5605 5606 // Claim the first handler 5607 // dataPriv.set( this, "focus", ... ) 5608 // dataPriv.set( this, "blur", ... ) 5609 leverageNative( this, type, true ); 5610 5611 if ( document.documentMode ) { 5612 5613 // Support: IE 9 - 11+ 5614 // We use the same native handler for focusin & focus (and focusout & blur) 5615 // so we need to coordinate setup & teardown parts between those events. 5616 // Use `delegateType` as the key as `type` is already used by `leverageNative`. 5617 attaches = dataPriv.get( this, delegateType ); 5618 if ( !attaches ) { 5619 this.addEventListener( delegateType, focusMappedHandler ); 5620 } 5621 dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); 5622 } else { 5623 5624 // Return false to allow normal processing in the caller 5625 return false; 5626 } 5627 }, 5628 trigger: function() { 5629 5630 // Force setup before trigger 5631 leverageNative( this, type ); 5632 5633 // Return non-false to allow normal event-path propagation 5634 return true; 5635 }, 5636 5637 teardown: function() { 5638 var attaches; 5639 5640 if ( document.documentMode ) { 5641 attaches = dataPriv.get( this, delegateType ) - 1; 5642 if ( !attaches ) { 5643 this.removeEventListener( delegateType, focusMappedHandler ); 5644 dataPriv.remove( this, delegateType ); 5645 } else { 5646 dataPriv.set( this, delegateType, attaches ); 5647 } 5648 } else { 5649 5650 // Return false to indicate standard teardown should be applied 5651 return false; 5652 } 5653 }, 5654 5655 // Suppress native focus or blur if we're currently inside 5656 // a leveraged native-event stack 5657 _default: function( event ) { 5658 return dataPriv.get( event.target, type ); 5659 }, 5660 5661 delegateType: delegateType 5662 }; 5663 5664 // Support: Firefox <=44 5665 // Firefox doesn't have focus(in | out) events 5666 // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 5667 // 5668 // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 5669 // focus(in | out) events fire after focus & blur events, 5670 // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 5671 // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 5672 // 5673 // Support: IE 9 - 11+ 5674 // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, 5675 // attach a single handler for both events in IE. 5676 jQuery.event.special[ delegateType ] = { 5677 setup: function() { 5678 5679 // Handle: regular nodes (via `this.ownerDocument`), window 5680 // (via `this.document`) & document (via `this`). 5681 var doc = this.ownerDocument || this.document || this, 5682 dataHolder = document.documentMode ? this : doc, 5683 attaches = dataPriv.get( dataHolder, delegateType ); 5684 5685 // Support: IE 9 - 11+ 5686 // We use the same native handler for focusin & focus (and focusout & blur) 5687 // so we need to coordinate setup & teardown parts between those events. 5688 // Use `delegateType` as the key as `type` is already used by `leverageNative`. 5689 if ( !attaches ) { 5690 if ( document.documentMode ) { 5691 this.addEventListener( delegateType, focusMappedHandler ); 5692 } else { 5693 doc.addEventListener( type, focusMappedHandler, true ); 5694 } 5695 } 5696 dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); 5697 }, 5698 teardown: function() { 5699 var doc = this.ownerDocument || this.document || this, 5700 dataHolder = document.documentMode ? this : doc, 5701 attaches = dataPriv.get( dataHolder, delegateType ) - 1; 5702 5703 if ( !attaches ) { 5704 if ( document.documentMode ) { 5705 this.removeEventListener( delegateType, focusMappedHandler ); 5706 } else { 5707 doc.removeEventListener( type, focusMappedHandler, true ); 5708 } 5709 dataPriv.remove( dataHolder, delegateType ); 5710 } else { 5711 dataPriv.set( dataHolder, delegateType, attaches ); 5712 } 5713 } 5714 }; 5715} ); 5716 5717// Create mouseenter/leave events using mouseover/out and event-time checks 5718// so that event delegation works in jQuery. 5719// Do the same for pointerenter/pointerleave and pointerover/pointerout 5720// 5721// Support: Safari 7 only 5722// Safari sends mouseenter too often; see: 5723// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 5724// for the description of the bug (it existed in older Chrome versions as well). 5725jQuery.each( { 5726 mouseenter: "mouseover", 5727 mouseleave: "mouseout", 5728 pointerenter: "pointerover", 5729 pointerleave: "pointerout" 5730}, function( orig, fix ) { 5731 jQuery.event.special[ orig ] = { 5732 delegateType: fix, 5733 bindType: fix, 5734 5735 handle: function( event ) { 5736 var ret, 5737 target = this, 5738 related = event.relatedTarget, 5739 handleObj = event.handleObj; 5740 5741 // For mouseenter/leave call the handler if related is outside the target. 5742 // NB: No relatedTarget if the mouse left/entered the browser window 5743 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 5744 event.type = handleObj.origType; 5745 ret = handleObj.handler.apply( this, arguments ); 5746 event.type = fix; 5747 } 5748 return ret; 5749 } 5750 }; 5751} ); 5752 5753jQuery.fn.extend( { 5754 5755 on: function( types, selector, data, fn ) { 5756 return on( this, types, selector, data, fn ); 5757 }, 5758 one: function( types, selector, data, fn ) { 5759 return on( this, types, selector, data, fn, 1 ); 5760 }, 5761 off: function( types, selector, fn ) { 5762 var handleObj, type; 5763 if ( types && types.preventDefault && types.handleObj ) { 5764 5765 // ( event ) dispatched jQuery.Event 5766 handleObj = types.handleObj; 5767 jQuery( types.delegateTarget ).off( 5768 handleObj.namespace ? 5769 handleObj.origType + "." + handleObj.namespace : 5770 handleObj.origType, 5771 handleObj.selector, 5772 handleObj.handler 5773 ); 5774 return this; 5775 } 5776 if ( typeof types === "object" ) { 5777 5778 // ( types-object [, selector] ) 5779 for ( type in types ) { 5780 this.off( type, selector, types[ type ] ); 5781 } 5782 return this; 5783 } 5784 if ( selector === false || typeof selector === "function" ) { 5785 5786 // ( types [, fn] ) 5787 fn = selector; 5788 selector = undefined; 5789 } 5790 if ( fn === false ) { 5791 fn = returnFalse; 5792 } 5793 return this.each( function() { 5794 jQuery.event.remove( this, types, fn, selector ); 5795 } ); 5796 } 5797} ); 5798 5799 5800var 5801 5802 // Support: IE <=10 - 11, Edge 12 - 13 only 5803 // In IE/Edge using regex groups here causes severe slowdowns. 5804 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 5805 rnoInnerhtml = /<script|<style|<link/i, 5806 5807 // checked="checked" or checked 5808 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 5809 5810 rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g; 5811 5812// Prefer a tbody over its parent table for containing new rows 5813function manipulationTarget( elem, content ) { 5814 if ( nodeName( elem, "table" ) && 5815 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 5816 5817 return jQuery( elem ).children( "tbody" )[ 0 ] || elem; 5818 } 5819 5820 return elem; 5821} 5822 5823// Replace/restore the type attribute of script elements for safe DOM manipulation 5824function disableScript( elem ) { 5825 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 5826 return elem; 5827} 5828function restoreScript( elem ) { 5829 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { 5830 elem.type = elem.type.slice( 5 ); 5831 } else { 5832 elem.removeAttribute( "type" ); 5833 } 5834 5835 return elem; 5836} 5837 5838function cloneCopyEvent( src, dest ) { 5839 var i, l, type, pdataOld, udataOld, udataCur, events; 5840 5841 if ( dest.nodeType !== 1 ) { 5842 return; 5843 } 5844 5845 // 1. Copy private data: events, handlers, etc. 5846 if ( dataPriv.hasData( src ) ) { 5847 pdataOld = dataPriv.get( src ); 5848 events = pdataOld.events; 5849 5850 if ( events ) { 5851 dataPriv.remove( dest, "handle events" ); 5852 5853 for ( type in events ) { 5854 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 5855 jQuery.event.add( dest, type, events[ type ][ i ] ); 5856 } 5857 } 5858 } 5859 } 5860 5861 // 2. Copy user data 5862 if ( dataUser.hasData( src ) ) { 5863 udataOld = dataUser.access( src ); 5864 udataCur = jQuery.extend( {}, udataOld ); 5865 5866 dataUser.set( dest, udataCur ); 5867 } 5868} 5869 5870// Fix IE bugs, see support tests 5871function fixInput( src, dest ) { 5872 var nodeName = dest.nodeName.toLowerCase(); 5873 5874 // Fails to persist the checked state of a cloned checkbox or radio button. 5875 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 5876 dest.checked = src.checked; 5877 5878 // Fails to return the selected option to the default selected state when cloning options 5879 } else if ( nodeName === "input" || nodeName === "textarea" ) { 5880 dest.defaultValue = src.defaultValue; 5881 } 5882} 5883 5884function domManip( collection, args, callback, ignored ) { 5885 5886 // Flatten any nested arrays 5887 args = flat( args ); 5888 5889 var fragment, first, scripts, hasScripts, node, doc, 5890 i = 0, 5891 l = collection.length, 5892 iNoClone = l - 1, 5893 value = args[ 0 ], 5894 valueIsFunction = isFunction( value ); 5895 5896 // We can't cloneNode fragments that contain checked, in WebKit 5897 if ( valueIsFunction || 5898 ( l > 1 && typeof value === "string" && 5899 !support.checkClone && rchecked.test( value ) ) ) { 5900 return collection.each( function( index ) { 5901 var self = collection.eq( index ); 5902 if ( valueIsFunction ) { 5903 args[ 0 ] = value.call( this, index, self.html() ); 5904 } 5905 domManip( self, args, callback, ignored ); 5906 } ); 5907 } 5908 5909 if ( l ) { 5910 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 5911 first = fragment.firstChild; 5912 5913 if ( fragment.childNodes.length === 1 ) { 5914 fragment = first; 5915 } 5916 5917 // Require either new content or an interest in ignored elements to invoke the callback 5918 if ( first || ignored ) { 5919 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 5920 hasScripts = scripts.length; 5921 5922 // Use the original fragment for the last item 5923 // instead of the first because it can end up 5924 // being emptied incorrectly in certain situations (trac-8070). 5925 for ( ; i < l; i++ ) { 5926 node = fragment; 5927 5928 if ( i !== iNoClone ) { 5929 node = jQuery.clone( node, true, true ); 5930 5931 // Keep references to cloned scripts for later restoration 5932 if ( hasScripts ) { 5933 5934 // Support: Android <=4.0 only, PhantomJS 1 only 5935 // push.apply(_, arraylike) throws on ancient WebKit 5936 jQuery.merge( scripts, getAll( node, "script" ) ); 5937 } 5938 } 5939 5940 callback.call( collection[ i ], node, i ); 5941 } 5942 5943 if ( hasScripts ) { 5944 doc = scripts[ scripts.length - 1 ].ownerDocument; 5945 5946 // Re
5946-
vendor: 9,089 bytes, lines 5946-6307
5946enable scripts 5947 jQuery.map( scripts, restoreScript ); 5948 5949 // Evaluate executable scripts on first document insertion 5950 for ( i = 0; i < hasScripts; i++ ) { 5951 node = scripts[ i ]; 5952 if ( rscriptType.test( node.type || "" ) && 5953 !dataPriv.access( node, "globalEval" ) && 5954 jQuery.contains( doc, node ) ) { 5955 5956 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { 5957 5958 // Optional AJAX dependency, but won't run scripts if not present 5959 if ( jQuery._evalUrl && !node.noModule ) { 5960 jQuery._evalUrl( node.src, { 5961 nonce: node.nonce || node.getAttribute( "nonce" ) 5962 }, doc ); 5963 } 5964 } else { 5965 5966 // Unwrap a CDATA section containing script contents. This shouldn't be 5967 // needed as in XML documents they're already not visible when 5968 // inspecting element contents and in HTML documents they have no 5969 // meaning but we're preserving that logic for backwards compatibility. 5970 // This will be removed completely in 4.0. See gh-4904. 5971 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); 5972 } 5973 } 5974 } 5975 } 5976 } 5977 } 5978 5979 return collection; 5980} 5981 5982function remove( elem, selector, keepData ) { 5983 var node, 5984 nodes = selector ? jQuery.filter( selector, elem ) : elem, 5985 i = 0; 5986 5987 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 5988 if ( !keepData && node.nodeType === 1 ) { 5989 jQuery.cleanData( getAll( node ) ); 5990 } 5991 5992 if ( node.parentNode ) { 5993 if ( keepData && isAttached( node ) ) { 5994 setGlobalEval( getAll( node, "script" ) ); 5995 } 5996 node.parentNode.removeChild( node ); 5997 } 5998 } 5999 6000 return elem; 6001} 6002 6003jQuery.extend( { 6004 htmlPrefilter: function( html ) { 6005 return html; 6006 }, 6007 6008 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 6009 var i, l, srcElements, destElements, 6010 clone = elem.cloneNode( true ), 6011 inPage = isAttached( elem ); 6012 6013 // Fix IE cloning issues 6014 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 6015 !jQuery.isXMLDoc( elem ) ) { 6016 6017 // We eschew jQuery#find here for performance reasons: 6018 // https://jsperf.com/getall-vs-sizzle/2 6019 destElements = getAll( clone ); 6020 srcElements = getAll( elem ); 6021 6022 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6023 fixInput( srcElements[ i ], destElements[ i ] ); 6024 } 6025 } 6026 6027 // Copy the events from the original to the clone 6028 if ( dataAndEvents ) { 6029 if ( deepDataAndEvents ) { 6030 srcElements = srcElements || getAll( elem ); 6031 destElements = destElements || getAll( clone ); 6032 6033 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6034 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 6035 } 6036 } else { 6037 cloneCopyEvent( elem, clone ); 6038 } 6039 } 6040 6041 // Preserve script evaluation history 6042 destElements = getAll( clone, "script" ); 6043 if ( destElements.length > 0 ) { 6044 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 6045 } 6046 6047 // Return the cloned set 6048 return clone; 6049 }, 6050 6051 cleanData: function( elems ) { 6052 var data, elem, type, 6053 special = jQuery.event.special, 6054 i = 0; 6055 6056 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 6057 if ( acceptData( elem ) ) { 6058 if ( ( data = elem[ dataPriv.expando ] ) ) { 6059 if ( data.events ) { 6060 for ( type in data.events ) { 6061 if ( special[ type ] ) { 6062 jQuery.event.remove( elem, type ); 6063 6064 // This is a shortcut to avoid jQuery.event.remove's overhead 6065 } else { 6066 jQuery.removeEvent( elem, type, data.handle ); 6067 } 6068 } 6069 } 6070 6071 // Support: Chrome <=35 - 45+ 6072 // Assign undefined instead of using delete, see Data#remove 6073 elem[ dataPriv.expando ] = undefined; 6074 } 6075 if ( elem[ dataUser.expando ] ) { 6076 6077 // Support: Chrome <=35 - 45+ 6078 // Assign undefined instead of using delete, see Data#remove 6079 elem[ dataUser.expando ] = undefined; 6080 } 6081 } 6082 } 6083 } 6084} ); 6085 6086jQuery.fn.extend( { 6087 detach: function( selector ) { 6088 return remove( this, selector, true ); 6089 }, 6090 6091 remove: function( selector ) { 6092 return remove( this, selector ); 6093 }, 6094 6095 text: function( value ) { 6096 return access( this, function( value ) { 6097 return value === undefined ? 6098 jQuery.text( this ) : 6099 this.empty().each( function() { 6100 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6101 this.textContent = value; 6102 } 6103 } ); 6104 }, null, value, arguments.length ); 6105 }, 6106 6107 append: function() { 6108 return domManip( this, arguments, function( elem ) { 6109 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6110 var target = manipulationTarget( this, elem ); 6111 target.appendChild( elem ); 6112 } 6113 } ); 6114 }, 6115 6116 prepend: function() { 6117 return domManip( this, arguments, function( elem ) { 6118 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6119 var target = manipulationTarget( this, elem ); 6120 target.insertBefore( elem, target.firstChild ); 6121 } 6122 } ); 6123 }, 6124 6125 before: function() { 6126 return domManip( this, arguments, function( elem ) { 6127 if ( this.parentNode ) { 6128 this.parentNode.insertBefore( elem, this ); 6129 } 6130 } ); 6131 }, 6132 6133 after: function() { 6134 return domManip( this, arguments, function( elem ) { 6135 if ( this.parentNode ) { 6136 this.parentNode.insertBefore( elem, this.nextSibling ); 6137 } 6138 } ); 6139 }, 6140 6141 empty: function() { 6142 var elem, 6143 i = 0; 6144 6145 for ( ; ( elem = this[ i ] ) != null; i++ ) { 6146 if ( elem.nodeType === 1 ) { 6147 6148 // Prevent memory leaks 6149 jQuery.cleanData( getAll( elem, false ) ); 6150 6151 // Remove any remaining nodes 6152 elem.textContent = ""; 6153 } 6154 } 6155 6156 return this; 6157 }, 6158 6159 clone: function( dataAndEvents, deepDataAndEvents ) { 6160 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 6161 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 6162 6163 return this.map( function() { 6164 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 6165 } ); 6166 }, 6167 6168 html: function( value ) { 6169 return access( this, function( value ) { 6170 var elem = this[ 0 ] || {}, 6171 i = 0, 6172 l = this.length; 6173 6174 if ( value === undefined && elem.nodeType === 1 ) { 6175 return elem.innerHTML; 6176 } 6177 6178 // See if we can take a shortcut and just use innerHTML 6179 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 6180 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 6181 6182 value = jQuery.htmlPrefilter( value ); 6183 6184 try { 6185 for ( ; i < l; i++ ) { 6186 elem = this[ i ] || {}; 6187 6188 // Remove element nodes and prevent memory leaks 6189 if ( elem.nodeType === 1 ) { 6190 jQuery.cleanData( getAll( elem, false ) ); 6191 elem.innerHTML = value; 6192 } 6193 } 6194 6195 elem = 0; 6196 6197 // If using innerHTML throws an exception, use the fallback method 6198 } catch ( e ) {} 6199 } 6200 6201 if ( elem ) { 6202 this.empty().append( value ); 6203 } 6204 }, null, value, arguments.length ); 6205 }, 6206 6207 replaceWith: function() { 6208 var ignored = []; 6209 6210 // Make the changes, replacing each non-ignored context element with the new content 6211 return domManip( this, arguments, function( elem ) { 6212 var parent = this.parentNode; 6213 6214 if ( jQuery.inArray( this, ignored ) < 0 ) { 6215 jQuery.cleanData( getAll( this ) ); 6216 if ( parent ) { 6217 parent.replaceChild( elem, this ); 6218 } 6219 } 6220 6221 // Force callback invocation 6222 }, ignored ); 6223 } 6224} ); 6225 6226jQuery.each( { 6227 appendTo: "append", 6228 prependTo: "prepend", 6229 insertBefore: "before", 6230 insertAfter: "after", 6231 replaceAll: "replaceWith" 6232}, function( name, original ) { 6233 jQuery.fn[ name ] = function( selector ) { 6234 var elems, 6235 ret = [], 6236 insert = jQuery( selector ), 6237 last = insert.length - 1, 6238 i = 0; 6239 6240 for ( ; i <= last; i++ ) { 6241 elems = i === last ? this : this.clone( true ); 6242 jQuery( insert[ i ] )[ original ]( elems ); 6243 6244 // Support: Android <=4.0 only, PhantomJS 1 only 6245 // .get() because push.apply(_, arraylike) throws on ancient WebKit 6246 push.apply( ret, elems.get() ); 6247 } 6248 6249 return this.pushStack( ret ); 6250 }; 6251} ); 6252var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 6253 6254var rcustomProp = /^--/; 6255 6256 6257var getStyles = function( elem ) { 6258 6259 // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) 6260 // IE throws on elements created in popups 6261 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 6262 var view = elem.ownerDocument.defaultView; 6263 6264 if ( !view || !view.opener ) { 6265 view = window; 6266 } 6267 6268 return view.getComputedStyle( elem ); 6269 }; 6270 6271var swap = function( elem, options, callback ) { 6272 var ret, name, 6273 old = {}; 6274 6275 // Remember the old values, and insert the new ones 6276 for ( name in options ) { 6277 old[ name ] = elem.style[ name ]; 6278 elem.style[ name ] = options[ name ]; 6279 } 6280 6281 ret = callback.call( elem ); 6282 6283 // Revert the old values 6284 for ( name in options ) { 6285 elem.style[ name ] = old[ name ]; 6286 } 6287 6288 return ret; 6289}; 6290 6291 6292var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); 6293 6294 6295 6296( function() { 6297 6298 // Executing both pixelPosition & boxSizingReliable tests require only one layout 6299 // so they're executed at the same time to save the second computation. 6300 function computeStyleTests() { 6301 6302 // This is a singleton, we need to execute it only once 6303 if ( !div ) { 6304 return; 6305 } 6306 6307 container.style.cssText = "position:absolute;
vendor: 4,156 bytes, lines 6307-6426
6307left:-11111px;width:60px;" + 6308 "margin-top:1px;padding:0;border:0"; 6309 div.style.cssText = 6310 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + 6311 "margin:auto;border:1px;padding:1px;" + 6312 "width:60%;top:1%"; 6313 documentElement.appendChild( container ).appendChild( div ); 6314 6315 var divStyle = window.getComputedStyle( div ); 6316 pixelPositionVal = divStyle.top !== "1%"; 6317 6318 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 6319 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; 6320 6321 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 6322 // Some styles come back with percentage values, even though they shouldn't 6323 div.style.right = "60%"; 6324 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; 6325 6326 // Support: IE 9 - 11 only 6327 // Detect misreporting of content dimensions for box-sizing:border-box elements 6328 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; 6329 6330 // Support: IE 9 only 6331 // Detect overflow:scroll screwiness (gh-3699) 6332 // Support: Chrome <=64 6333 // Don't get tricked when zoom affects offsetWidth (gh-4029) 6334 div.style.position = "absolute"; 6335 scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; 6336 6337 documentElement.removeChild( container ); 6338 6339 // Nullify the div so it wouldn't be stored in the memory and 6340 // it will also be a sign that checks already performed 6341 div = null; 6342 } 6343 6344 function roundPixelMeasures( measure ) { 6345 return Math.round( parseFloat( measure ) ); 6346 } 6347 6348 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, 6349 reliableTrDimensionsVal, reliableMarginLeftVal, 6350 container = document.createElement( "div" ), 6351 div = document.createElement( "div" ); 6352 6353 // Finish early in limited (non-browser) environments 6354 if ( !div.style ) { 6355 return; 6356 } 6357 6358 // Support: IE <=9 - 11 only 6359 // Style of cloned element affects source element cloned (trac-8908) 6360 div.style.backgroundClip = "content-box"; 6361 div.cloneNode( true ).style.backgroundClip = ""; 6362 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 6363 6364 jQuery.extend( support, { 6365 boxSizingReliable: function() { 6366 computeStyleTests(); 6367 return boxSizingReliableVal; 6368 }, 6369 pixelBoxStyles: function() { 6370 computeStyleTests(); 6371 return pixelBoxStylesVal; 6372 }, 6373 pixelPosition: function() { 6374 computeStyleTests(); 6375 return pixelPositionVal; 6376 }, 6377 reliableMarginLeft: function() { 6378 computeStyleTests(); 6379 return reliableMarginLeftVal; 6380 }, 6381 scrollboxSize: function() { 6382 computeStyleTests(); 6383 return scrollboxSizeVal; 6384 }, 6385 6386 // Support: IE 9 - 11+, Edge 15 - 18+ 6387 // IE/Edge misreport `getComputedStyle` of table rows with width/height 6388 // set in CSS while `offset*` properties report correct values. 6389 // Behavior in IE 9 is more subtle than in newer versions & it passes 6390 // some versions of this test; make sure not to make it pass there! 6391 // 6392 // Support: Firefox 70+ 6393 // Only Firefox includes border widths 6394 // in computed dimensions. (gh-4529) 6395 reliableTrDimensions: function() { 6396 var table, tr, trChild, trStyle; 6397 if ( reliableTrDimensionsVal == null ) { 6398 table = document.createElement( "table" ); 6399 tr = document.createElement( "tr" ); 6400 trChild = document.createElement( "div" ); 6401 6402 table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; 6403 tr.style.cssText = "box-sizing:content-box;border:1px solid"; 6404 6405 // Support: Chrome 86+ 6406 // Height set through cssText does not get applied. 6407 // Computed height then comes back as 0. 6408 tr.style.height = "1px"; 6409 trChild.style.height = "9px"; 6410 6411 // Support: Android 8 Chrome 86+ 6412 // In our bodyBackground.html iframe, 6413 // display for all div elements is set to "inline", 6414 // which causes a problem only in Android 8 Chrome 86. 6415 // Ensuring the div is `display: block` 6416 // gets around this issue. 6417 trChild.style.display = "block"; 6418 6419 documentElement 6420 .appendChild( table ) 6421 .appendChild( tr ) 6422 .appendChild( trChild ); 6423 6424 trStyle = window.getComputedStyle( tr ); 6425 reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + 6426 parseInt( trStyle.borderTopWidth, 10 ) +
vendor: 12,879 bytes, lines 6427-6853
6427 parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; 6428 6429 documentElement.removeChild( table ); 6430 } 6431 return reliableTrDimensionsVal; 6432 } 6433 } ); 6434} )(); 6435 6436 6437function curCSS( elem, name, computed ) { 6438 var width, minWidth, maxWidth, ret, 6439 isCustomProp = rcustomProp.test( name ), 6440 6441 // Support: Firefox 51+ 6442 // Retrieving style before computed somehow 6443 // fixes an issue with getting wrong values 6444 // on detached elements 6445 style = elem.style; 6446 6447 computed = computed || getStyles( elem ); 6448 6449 // getPropertyValue is needed for: 6450 // .css('filter') (IE 9 only, trac-12537) 6451 // .css('--customProperty) (gh-3144) 6452 if ( computed ) { 6453 6454 // Support: IE <=9 - 11+ 6455 // IE only supports `"float"` in `getPropertyValue`; in computed styles 6456 // it's only available as `"cssFloat"`. We no longer modify properties 6457 // sent to `.css()` apart from camelCasing, so we need to check both. 6458 // Normally, this would create difference in behavior: if 6459 // `getPropertyValue` returns an empty string, the value returned 6460 // by `.css()` would be `undefined`. This is usually the case for 6461 // disconnected elements. However, in IE even disconnected elements 6462 // with no styles return `"none"` for `getPropertyValue( "float" )` 6463 ret = computed.getPropertyValue( name ) || computed[ name ]; 6464 6465 if ( isCustomProp && ret ) { 6466 6467 // Support: Firefox 105+, Chrome <=105+ 6468 // Spec requires trimming whitespace for custom properties (gh-4926). 6469 // Firefox only trims leading whitespace. Chrome just collapses 6470 // both leading & trailing whitespace to a single space. 6471 // 6472 // Fall back to `undefined` if empty string returned. 6473 // This collapses a missing definition with property defined 6474 // and set to an empty string but there's no standard API 6475 // allowing us to differentiate them without a performance penalty 6476 // and returning `undefined` aligns with older jQuery. 6477 // 6478 // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED 6479 // as whitespace while CSS does not, but this is not a problem 6480 // because CSS preprocessing replaces them with U+000A LINE FEED 6481 // (which *is* CSS whitespace) 6482 // https://www.w3.org/TR/css-syntax-3/#input-preprocessing 6483 ret = ret.replace( rtrimCSS, "$1" ) || undefined; 6484 } 6485 6486 if ( ret === "" && !isAttached( elem ) ) { 6487 ret = jQuery.style( elem, name ); 6488 } 6489 6490 // A tribute to the "awesome hack by Dean Edwards" 6491 // Android Browser returns percentage for some values, 6492 // but width seems to be reliably pixels. 6493 // This is against the CSSOM draft spec: 6494 // https://drafts.csswg.org/cssom/#resolved-values 6495 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { 6496 6497 // Remember the original values 6498 width = style.width; 6499 minWidth = style.minWidth; 6500 maxWidth = style.maxWidth; 6501 6502 // Put in the new values to get a computed value out 6503 style.minWidth = style.maxWidth = style.width = ret; 6504 ret = computed.width; 6505 6506 // Revert the changed values 6507 style.width = width; 6508 style.minWidth = minWidth; 6509 style.maxWidth = maxWidth; 6510 } 6511 } 6512 6513 return ret !== undefined ? 6514 6515 // Support: IE <=9 - 11 only 6516 // IE returns zIndex value as an integer. 6517 ret + "" : 6518 ret; 6519} 6520 6521 6522function addGetHookIf( conditionFn, hookFn ) { 6523 6524 // Define the hook, we'll check on the first run if it's really needed. 6525 return { 6526 get: function() { 6527 if ( conditionFn() ) { 6528 6529 // Hook not needed (or it's not possible to use it due 6530 // to missing dependency), remove it. 6531 delete this.get; 6532 return; 6533 } 6534 6535 // Hook needed; redefine it so that the support test is not executed again. 6536 return ( this.get = hookFn ).apply( this, arguments ); 6537 } 6538 }; 6539} 6540 6541 6542var cssPrefixes = [ "Webkit", "Moz", "ms" ], 6543 emptyStyle = document.createElement( "div" ).style, 6544 vendorProps = {}; 6545 6546// Return a vendor-prefixed property or undefined 6547function vendorPropName( name ) { 6548 6549 // Check for vendor prefixed names 6550 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 6551 i = cssPrefixes.length; 6552 6553 while ( i-- ) { 6554 name = cssPrefixes[ i ] + capName; 6555 if ( name in emptyStyle ) { 6556 return name; 6557 } 6558 } 6559} 6560 6561// Return a potentially-mapped jQuery.cssProps or vendor prefixed property 6562function finalPropName( name ) { 6563 var final = jQuery.cssProps[ name ] || vendorProps[ name ]; 6564 6565 if ( final ) { 6566 return final; 6567 } 6568 if ( name in emptyStyle ) { 6569 return name; 6570 } 6571 return vendorProps[ name ] = vendorPropName( name ) || name; 6572} 6573 6574 6575var 6576 6577 // Swappable if display is none or starts with table 6578 // except "table", "table-cell", or "table-caption" 6579 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 6580 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 6581 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 6582 cssNormalTransform = { 6583 letterSpacing: "0", 6584 fontWeight: "400" 6585 }; 6586 6587function setPositiveNumber( _elem, value, subtract ) { 6588 6589 // Any relative (+/-) values have already been 6590 // normalized at this point 6591 var matches = rcssNum.exec( value ); 6592 return matches ? 6593 6594 // Guard against undefined "subtract", e.g., when used as in cssHooks 6595 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 6596 value; 6597} 6598 6599function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { 6600 var i = dimension === "width" ? 1 : 0, 6601 extra = 0, 6602 delta = 0, 6603 marginDelta = 0; 6604 6605 // Adjustment may not be necessary 6606 if ( box === ( isBorderBox ? "border" : "content" ) ) { 6607 return 0; 6608 } 6609 6610 for ( ; i < 4; i += 2 ) { 6611 6612 // Both box models exclude margin 6613 // Count margin delta separately to only add it after scroll gutter adjustment. 6614 // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). 6615 if ( box === "margin" ) { 6616 marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); 6617 } 6618 6619 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 6620 if ( !isBorderBox ) { 6621 6622 // Add padding 6623 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6624 6625 // For "border" or "margin", add border 6626 if ( box !== "padding" ) { 6627 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6628 6629 // But still keep track of it otherwise 6630 } else { 6631 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6632 } 6633 6634 // If we get here with a border-box (content + padding + border), we're seeking "content" or 6635 // "padding" or "margin" 6636 } else { 6637 6638 // For "content", subtract padding 6639 if ( box === "content" ) { 6640 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6641 } 6642 6643 // For "content" or "padding", subtract border 6644 if ( box !== "margin" ) { 6645 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6646 } 6647 } 6648 } 6649 6650 // Account for positive content-box scroll gutter when requested by providing computedVal 6651 if ( !isBorderBox && computedVal >= 0 ) { 6652 6653 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 6654 // Assuming integer scroll gutter, subtract the rest and round down 6655 delta += Math.max( 0, Math.ceil( 6656 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 6657 computedVal - 6658 delta - 6659 extra - 6660 0.5 6661 6662 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter 6663 // Use an explicit zero to avoid NaN (gh-3964) 6664 ) ) || 0; 6665 } 6666 6667 return delta + marginDelta; 6668} 6669 6670function getWidthOrHeight( elem, dimension, extra ) { 6671 6672 // Start with computed style 6673 var styles = getStyles( elem ), 6674 6675 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). 6676 // Fake content-box until we know it's needed to know the true value. 6677 boxSizingNeeded = !support.boxSizingReliable() || extra, 6678 isBorderBox = boxSizingNeeded && 6679 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 6680 valueIsBorderBox = isBorderBox, 6681 6682 val = curCSS( elem, dimension, styles ), 6683 offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); 6684 6685 // Support: Firefox <=54 6686 // Return a confounding non-pixel value or feign ignorance, as appropriate. 6687 if ( rnumnonpx.test( val ) ) { 6688 if ( !extra ) { 6689 return val; 6690 } 6691 val = "auto"; 6692 } 6693 6694 6695 // Support: IE 9 - 11 only 6696 // Use offsetWidth/offsetHeight for when box sizing is unreliable. 6697 // In those cases, the computed value can be trusted to be border-box. 6698 if ( ( !support.boxSizingReliable() && isBorderBox || 6699 6700 // Support: IE 10 - 11+, Edge 15 - 18+ 6701 // IE/Edge misreport `getComputedStyle` of table rows with width/height 6702 // set in CSS while `offset*` properties report correct values. 6703 // Interestingly, in some cases IE 9 doesn't suffer from this issue. 6704 !support.reliableTrDimensions() && nodeName( elem, "tr" ) || 6705 6706 // Fall back to offsetWidth/offsetHeight when value is "auto" 6707 // This happens for inline elements with no explicit setting (gh-3571) 6708 val === "auto" || 6709 6710 // Support: Android <=4.1 - 4.3 only 6711 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 6712 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && 6713 6714 // Make sure the element is visible & connected 6715 elem.getClientRects().length ) { 6716 6717 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 6718 6719 // Where available, offsetWidth/offsetHeight approximate border box dimensions. 6720 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the 6721 // retrieved value as a content box dimension. 6722 valueIsBorderBox = offsetProp in elem; 6723 if ( valueIsBorderBox ) { 6724 val = elem[ offsetProp ]; 6725 } 6726 } 6727 6728 // Normalize "" and auto 6729 val = parseFloat( val ) || 0; 6730 6731 // Adjust for the element's box model 6732 return ( val + 6733 boxModelAdjustment( 6734 elem, 6735 dimension, 6736 extra || ( isBorderBox ? "border" : "content" ), 6737 valueIsBorderBox, 6738 styles, 6739 6740 // Provide the current computed size to request scroll gutter calculation (gh-3589) 6741 val 6742 ) 6743 ) + "px"; 6744} 6745 6746jQuery.extend( { 6747 6748 // Add in style property hooks for overriding the default 6749 // behavior of getting and setting a style property 6750 cssHooks: { 6751 opacity: { 6752 get: function( elem, computed ) { 6753 if ( computed ) { 6754 6755 // We should always get a number back from opacity 6756 var ret = curCSS( elem, "opacity" ); 6757 return ret === "" ? "1" : ret; 6758 } 6759 } 6760 } 6761 }, 6762 6763 // Don't automatically add "px" to these possibly-unitless properties 6764 cssNumber: { 6765 animationIterationCount: true, 6766 aspectRatio: true, 6767 borderImageSlice: true, 6768 columnCount: true, 6769 flexGrow: true, 6770 flexShrink: true, 6771 fontWeight: true, 6772 gridArea: true, 6773 gridColumn: true, 6774 gridColumnEnd: true, 6775 gridColumnStart: true, 6776 gridRow: true, 6777 gridRowEnd: true, 6778 gridRowStart: true, 6779 lineHeight: true, 6780 opacity: true, 6781 order: true, 6782 orphans: true, 6783 scale: true, 6784 widows: true, 6785 zIndex: true, 6786 zoom: true, 6787 6788 // SVG-related 6789 fillOpacity: true, 6790 floodOpacity: true, 6791 stopOpacity: true, 6792 strokeMiterlimit: true, 6793 strokeOpacity: true 6794 }, 6795 6796 // Add in properties whose names you wish to fix before 6797 // setting or getting the value 6798 cssProps: {}, 6799 6800 // Get and set the style property on a DOM Node 6801 style: function( elem, name, value, extra ) { 6802 6803 // Don't set styles on text and comment nodes 6804 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 6805 return; 6806 } 6807 6808 // Make sure that we're working with the right name 6809 var ret, type, hooks, 6810 origName = camelCase( name ), 6811 isCustomProp = rcustomProp.test( name ), 6812 style = elem.style; 6813 6814 // Make sure that we're working with the right name. We don't 6815 // want to query the value if it is a CSS custom property 6816 // since they are user-defined. 6817 if ( !isCustomProp ) { 6818 name = finalPropName( origName ); 6819 } 6820 6821 // Gets hook for the prefixed version, then unprefixed version 6822 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6823 6824 // Check if we're setting a value 6825 if ( value !== undefined ) { 6826 type = typeof value; 6827 6828 // Convert "+=" or "-=" to relative numbers (trac-7345) 6829 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 6830 value = adjustCSS( elem, name, ret ); 6831 6832 // Fixes bug trac-9237 6833 type = "number"; 6834 } 6835 6836 // Make sure that null and NaN values aren't set (trac-7116) 6837 if ( value == null || value !== value ) { 6838 return; 6839 } 6840 6841 // If a number was passed in, add the unit (except for certain CSS properties) 6842 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append 6843 // "px" to a few hardcoded values. 6844 if ( type === "number" && !isCustomProp ) { 6845 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 6846 } 6847 6848 // background-* props affect original clone's values 6849 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 6850 style[ name ] = "inherit"; 6851 } 6852 6853 // If a hook was provided, use that value, otherwise just set the specified value
vendor: 16,052 bytes, lines 6854-7458
6854 if ( !hooks || !( "set" in hooks ) || 6855 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 6856 6857 if ( isCustomProp ) { 6858 style.setProperty( name, value ); 6859 } else { 6860 style[ name ] = value; 6861 } 6862 } 6863 6864 } else { 6865 6866 // If a hook was provided get the non-computed value from there 6867 if ( hooks && "get" in hooks && 6868 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 6869 6870 return ret; 6871 } 6872 6873 // Otherwise just get the value from the style object 6874 return style[ name ]; 6875 } 6876 }, 6877 6878 css: function( elem, name, extra, styles ) { 6879 var val, num, hooks, 6880 origName = camelCase( name ), 6881 isCustomProp = rcustomProp.test( name ); 6882 6883 // Make sure that we're working with the right name. We don't 6884 // want to modify the value if it is a CSS custom property 6885 // since they are user-defined. 6886 if ( !isCustomProp ) { 6887 name = finalPropName( origName ); 6888 } 6889 6890 // Try prefixed name followed by the unprefixed name 6891 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6892 6893 // If a hook was provided get the computed value from there 6894 if ( hooks && "get" in hooks ) { 6895 val = hooks.get( elem, true, extra ); 6896 } 6897 6898 // Otherwise, if a way to get the computed value exists, use that 6899 if ( val === undefined ) { 6900 val = curCSS( elem, name, styles ); 6901 } 6902 6903 // Convert "normal" to computed value 6904 if ( val === "normal" && name in cssNormalTransform ) { 6905 val = cssNormalTransform[ name ]; 6906 } 6907 6908 // Make numeric if forced or a qualifier was provided and val looks numeric 6909 if ( extra === "" || extra ) { 6910 num = parseFloat( val ); 6911 return extra === true || isFinite( num ) ? num || 0 : val; 6912 } 6913 6914 return val; 6915 } 6916} ); 6917 6918jQuery.each( [ "height", "width" ], function( _i, dimension ) { 6919 jQuery.cssHooks[ dimension ] = { 6920 get: function( elem, computed, extra ) { 6921 if ( computed ) { 6922 6923 // Certain elements can have dimension info if we invisibly show them 6924 // but it must have a current display style that would benefit 6925 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 6926 6927 // Support: Safari 8+ 6928 // Table columns in Safari have non-zero offsetWidth & zero 6929 // getBoundingClientRect().width unless display is changed. 6930 // Support: IE <=11 only 6931 // Running getBoundingClientRect on a disconnected node 6932 // in IE throws an error. 6933 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 6934 swap( elem, cssShow, function() { 6935 return getWidthOrHeight( elem, dimension, extra ); 6936 } ) : 6937 getWidthOrHeight( elem, dimension, extra ); 6938 } 6939 }, 6940 6941 set: function( elem, value, extra ) { 6942 var matches, 6943 styles = getStyles( elem ), 6944 6945 // Only read styles.position if the test has a chance to fail 6946 // to avoid forcing a reflow. 6947 scrollboxSizeBuggy = !support.scrollboxSize() && 6948 styles.position === "absolute", 6949 6950 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) 6951 boxSizingNeeded = scrollboxSizeBuggy || extra, 6952 isBorderBox = boxSizingNeeded && 6953 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 6954 subtract = extra ? 6955 boxModelAdjustment( 6956 elem, 6957 dimension, 6958 extra, 6959 isBorderBox, 6960 styles 6961 ) : 6962 0; 6963 6964 // Account for unreliable border-box dimensions by comparing offset* to computed and 6965 // faking a content-box to get border and padding (gh-3699) 6966 if ( isBorderBox && scrollboxSizeBuggy ) { 6967 subtract -= Math.ceil( 6968 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 6969 parseFloat( styles[ dimension ] ) - 6970 boxModelAdjustment( elem, dimension, "border", false, styles ) - 6971 0.5 6972 ); 6973 } 6974 6975 // Convert to pixels if value adjustment is needed 6976 if ( subtract && ( matches = rcssNum.exec( value ) ) && 6977 ( matches[ 3 ] || "px" ) !== "px" ) { 6978 6979 elem.style[ dimension ] = value; 6980 value = jQuery.css( elem, dimension ); 6981 } 6982 6983 return setPositiveNumber( elem, value, subtract ); 6984 } 6985 }; 6986} ); 6987 6988jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 6989 function( elem, computed ) { 6990 if ( computed ) { 6991 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 6992 elem.getBoundingClientRect().left - 6993 swap( elem, { marginLeft: 0 }, function() { 6994 return elem.getBoundingClientRect().left; 6995 } ) 6996 ) + "px"; 6997 } 6998 } 6999); 7000 7001// These hooks are used by animate to expand properties 7002jQuery.each( { 7003 margin: "", 7004 padding: "", 7005 border: "Width" 7006}, function( prefix, suffix ) { 7007 jQuery.cssHooks[ prefix + suffix ] = { 7008 expand: function( value ) { 7009 var i = 0, 7010 expanded = {}, 7011 7012 // Assumes a single number if not a string 7013 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 7014 7015 for ( ; i < 4; i++ ) { 7016 expanded[ prefix + cssExpand[ i ] + suffix ] = 7017 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 7018 } 7019 7020 return expanded; 7021 } 7022 }; 7023 7024 if ( prefix !== "margin" ) { 7025 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 7026 } 7027} ); 7028 7029jQuery.fn.extend( { 7030 css: function( name, value ) { 7031 return access( this, function( elem, name, value ) { 7032 var styles, len, 7033 map = {}, 7034 i = 0; 7035 7036 if ( Array.isArray( name ) ) { 7037 styles = getStyles( elem ); 7038 len = name.length; 7039 7040 for ( ; i < len; i++ ) { 7041 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 7042 } 7043 7044 return map; 7045 } 7046 7047 return value !== undefined ? 7048 jQuery.style( elem, name, value ) : 7049 jQuery.css( elem, name ); 7050 }, name, value, arguments.length > 1 ); 7051 } 7052} ); 7053 7054 7055function Tween( elem, options, prop, end, easing ) { 7056 return new Tween.prototype.init( elem, options, prop, end, easing ); 7057} 7058jQuery.Tween = Tween; 7059 7060Tween.prototype = { 7061 constructor: Tween, 7062 init: function( elem, options, prop, end, easing, unit ) { 7063 this.elem = elem; 7064 this.prop = prop; 7065 this.easing = easing || jQuery.easing._default; 7066 this.options = options; 7067 this.start = this.now = this.cur(); 7068 this.end = end; 7069 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 7070 }, 7071 cur: function() { 7072 var hooks = Tween.propHooks[ this.prop ]; 7073 7074 return hooks && hooks.get ? 7075 hooks.get( this ) : 7076 Tween.propHooks._default.get( this ); 7077 }, 7078 run: function( percent ) { 7079 var eased, 7080 hooks = Tween.propHooks[ this.prop ]; 7081 7082 if ( this.options.duration ) { 7083 this.pos = eased = jQuery.easing[ this.easing ]( 7084 percent, this.options.duration * percent, 0, 1, this.options.duration 7085 ); 7086 } else { 7087 this.pos = eased = percent; 7088 } 7089 this.now = ( this.end - this.start ) * eased + this.start; 7090 7091 if ( this.options.step ) { 7092 this.options.step.call( this.elem, this.now, this ); 7093 } 7094 7095 if ( hooks && hooks.set ) { 7096 hooks.set( this ); 7097 } else { 7098 Tween.propHooks._default.set( this ); 7099 } 7100 return this; 7101 } 7102}; 7103 7104Tween.prototype.init.prototype = Tween.prototype; 7105 7106Tween.propHooks = { 7107 _default: { 7108 get: function( tween ) { 7109 var result; 7110 7111 // Use a property on the element directly when it is not a DOM element, 7112 // or when there is no matching style property that exists. 7113 if ( tween.elem.nodeType !== 1 || 7114 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 7115 return tween.elem[ tween.prop ]; 7116 } 7117 7118 // Passing an empty string as a 3rd parameter to .css will automatically 7119 // attempt a parseFloat and fallback to a string if the parse fails. 7120 // Simple values such as "10px" are parsed to Float; 7121 // complex values such as "rotate(1rad)" are returned as-is. 7122 result = jQuery.css( tween.elem, tween.prop, "" ); 7123 7124 // Empty strings, null, undefined and "auto" are converted to 0. 7125 return !result || result === "auto" ? 0 : result; 7126 }, 7127 set: function( tween ) { 7128 7129 // Use step hook for back compat. 7130 // Use cssHook if its there. 7131 // Use .style if available and use plain properties where available. 7132 if ( jQuery.fx.step[ tween.prop ] ) { 7133 jQuery.fx.step[ tween.prop ]( tween ); 7134 } else if ( tween.elem.nodeType === 1 && ( 7135 jQuery.cssHooks[ tween.prop ] || 7136 tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { 7137 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 7138 } else { 7139 tween.elem[ tween.prop ] = tween.now; 7140 } 7141 } 7142 } 7143}; 7144 7145// Support: IE <=9 only 7146// Panic based approach to setting things on disconnected nodes 7147Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 7148 set: function( tween ) { 7149 if ( tween.elem.nodeType && tween.elem.parentNode ) { 7150 tween.elem[ tween.prop ] = tween.now; 7151 } 7152 } 7153}; 7154 7155jQuery.easing = { 7156 linear: function( p ) { 7157 return p; 7158 }, 7159 swing: function( p ) { 7160 return 0.5 - Math.cos( p * Math.PI ) / 2; 7161 }, 7162 _default: "swing" 7163}; 7164 7165jQuery.fx = Tween.prototype.init; 7166 7167// Back compat <1.8 extension point 7168jQuery.fx.step = {}; 7169 7170 7171 7172 7173var 7174 fxNow, inProgress, 7175 rfxtypes = /^(?:toggle|show|hide)$/, 7176 rrun = /queueHooks$/; 7177 7178function schedule() { 7179 if ( inProgress ) { 7180 if ( document.hidden === false && window.requestAnimationFrame ) { 7181 window.requestAnimationFrame( schedule ); 7182 } else { 7183 window.setTimeout( schedule, jQuery.fx.interval ); 7184 } 7185 7186 jQuery.fx.tick(); 7187 } 7188} 7189 7190// Animations created synchronously will run synchronously 7191function createFxNow() { 7192 window.setTimeout( function() { 7193 fxNow = undefined; 7194 } ); 7195 return ( fxNow = Date.now() ); 7196} 7197 7198// Generate parameters to create a standard animation 7199function genFx( type, includeWidth ) { 7200 var which, 7201 i = 0, 7202 attrs = { height: type }; 7203 7204 // If we include width, step value is 1 to do all cssExpand values, 7205 // otherwise step value is 2 to skip over Left and Right 7206 includeWidth = includeWidth ? 1 : 0; 7207 for ( ; i < 4; i += 2 - includeWidth ) { 7208 which = cssExpand[ i ]; 7209 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 7210 } 7211 7212 if ( includeWidth ) { 7213 attrs.opacity = attrs.width = type; 7214 } 7215 7216 return attrs; 7217} 7218 7219function createTween( value, prop, animation ) { 7220 var tween, 7221 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 7222 index = 0, 7223 length = collection.length; 7224 for ( ; index < length; index++ ) { 7225 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 7226 7227 // We're done with this property 7228 return tween; 7229 } 7230 } 7231} 7232 7233function defaultPrefilter( elem, props, opts ) { 7234 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 7235 isBox = "width" in props || "height" in props, 7236 anim = this, 7237 orig = {}, 7238 style = elem.style, 7239 hidden = elem.nodeType && isHiddenWithinTree( elem ), 7240 dataShow = dataPriv.get( elem, "fxshow" ); 7241 7242 // Queue-skipping animations hijack the fx hooks 7243 if ( !opts.queue ) { 7244 hooks = jQuery._queueHooks( elem, "fx" ); 7245 if ( hooks.unqueued == null ) { 7246 hooks.unqueued = 0; 7247 oldfire = hooks.empty.fire; 7248 hooks.empty.fire = function() { 7249 if ( !hooks.unqueued ) { 7250 oldfire(); 7251 } 7252 }; 7253 } 7254 hooks.unqueued++; 7255 7256 anim.always( function() { 7257 7258 // Ensure the complete handler is called before this completes 7259 anim.always( function() { 7260 hooks.unqueued--; 7261 if ( !jQuery.queue( elem, "fx" ).length ) { 7262 hooks.empty.fire(); 7263 } 7264 } ); 7265 } ); 7266 } 7267 7268 // Detect show/hide animations 7269 for ( prop in props ) { 7270 value = props[ prop ]; 7271 if ( rfxtypes.test( value ) ) { 7272 delete props[ prop ]; 7273 toggle = toggle || value === "toggle"; 7274 if ( value === ( hidden ? "hide" : "show" ) ) { 7275 7276 // Pretend to be hidden if this is a "show" and 7277 // there is still data from a stopped show/hide 7278 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 7279 hidden = true; 7280 7281 // Ignore all other no-op show/hide data 7282 } else { 7283 continue; 7284 } 7285 } 7286 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 7287 } 7288 } 7289 7290 // Bail out if this is a no-op like .hide().hide() 7291 propTween = !jQuery.isEmptyObject( props ); 7292 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 7293 return; 7294 } 7295 7296 // Restrict "overflow" and "display" styles during box animations 7297 if ( isBox && elem.nodeType === 1 ) { 7298 7299 // Support: IE <=9 - 11, Edge 12 - 15 7300 // Record all 3 overflow attributes because IE does not infer the shorthand 7301 // from identically-valued overflowX and overflowY and Edge just mirrors 7302 // the overflowX value there. 7303 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 7304 7305 // Identify a display type, preferring old show/hide data over the CSS cascade 7306 restoreDisplay = dataShow && dataShow.display; 7307 if ( restoreDisplay == null ) { 7308 restoreDisplay = dataPriv.get( elem, "display" ); 7309 } 7310 display = jQuery.css( elem, "display" ); 7311 if ( display === "none" ) { 7312 if ( restoreDisplay ) { 7313 display = restoreDisplay; 7314 } else { 7315 7316 // Get nonempty value(s) by temporarily forcing visibility 7317 showHide( [ elem ], true ); 7318 restoreDisplay = elem.style.display || restoreDisplay; 7319 display = jQuery.css( elem, "display" ); 7320 showHide( [ elem ] ); 7321 } 7322 } 7323 7324 // Animate inline elements as inline-block 7325 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 7326 if ( jQuery.css( elem, "float" ) === "none" ) { 7327 7328 // Restore the original display value at the end of pure show/hide animations 7329 if ( !propTween ) { 7330 anim.done( function() { 7331 style.display = restoreDisplay; 7332 } ); 7333 if ( restoreDisplay == null ) { 7334 display = style.display; 7335 restoreDisplay = display === "none" ? "" : display; 7336 } 7337 } 7338 style.display = "inline-block"; 7339 } 7340 } 7341 } 7342 7343 if ( opts.overflow ) { 7344 style.overflow = "hidden"; 7345 anim.always( function() { 7346 style.overflow = opts.overflow[ 0 ]; 7347 style.overflowX = opts.overflow[ 1 ]; 7348 style.overflowY = opts.overflow[ 2 ]; 7349 } ); 7350 } 7351 7352 // Implement show/hide animations 7353 propTween = false; 7354 for ( prop in orig ) { 7355 7356 // General show/hide setup for this element animation 7357 if ( !propTween ) { 7358 if ( dataShow ) { 7359 if ( "hidden" in dataShow ) { 7360 hidden = dataShow.hidden; 7361 } 7362 } else { 7363 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 7364 } 7365 7366 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 7367 if ( toggle ) { 7368 dataShow.hidden = !hidden; 7369 } 7370 7371 // Show elements before animating them 7372 if ( hidden ) { 7373 showHide( [ elem ], true ); 7374 } 7375 7376 /* eslint-disable no-loop-func */ 7377 7378 anim.done( function() { 7379 7380 /* eslint-enable no-loop-func */ 7381 7382 // The final step of a "hide" animation is actually hiding the element 7383 if ( !hidden ) { 7384 showHide( [ elem ] ); 7385 } 7386 dataPriv.remove( elem, "fxshow" ); 7387 for ( prop in orig ) { 7388 jQuery.style( elem, prop, orig[ prop ] ); 7389 } 7390 } ); 7391 } 7392 7393 // Per-property setup 7394 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 7395 if ( !( prop in dataShow ) ) { 7396 dataShow[ prop ] = propTween.start; 7397 if ( hidden ) { 7398 propTween.end = propTween.start; 7399 propTween.start = 0; 7400 } 7401 } 7402 } 7403} 7404 7405function propFilter( props, specialEasing ) { 7406 var index, name, easing, value, hooks; 7407 7408 // camelCase, specialEasing and expand cssHook pass 7409 for ( index in props ) { 7410 name = camelCase( index ); 7411 easing = specialEasing[ name ]; 7412 value = props[ index ]; 7413 if ( Array.isArray( value ) ) { 7414 easing = value[ 1 ]; 7415 value = props[ index ] = value[ 0 ]; 7416 } 7417 7418 if ( index !== name ) { 7419 props[ name ] = value; 7420 delete props[ index ]; 7421 } 7422 7423 hooks = jQuery.cssHooks[ name ]; 7424 if ( hooks && "expand" in hooks ) { 7425 value = hooks.expand( value ); 7426 delete props[ name ]; 7427 7428 // Not quite $.extend, this won't overwrite existing keys. 7429 // Reusing 'index' because we have the correct "name" 7430 for ( index in value ) { 7431 if ( !( index in props ) ) { 7432 props[ index ] = value[ index ]; 7433 specialEasing[ index ] = easing; 7434 } 7435 } 7436 } else { 7437 specialEasing[ name ] = easing; 7438 } 7439 } 7440} 7441 7442function Animation( elem, properties, options ) { 7443 var result, 7444 stopped, 7445 index = 0, 7446 length = Animation.prefilters.length, 7447 deferred = jQuery.Deferred().always( function() { 7448 7449 // Don't match elem in the :animated selector 7450 delete tick.elem; 7451 } ), 7452 tick = function() { 7453 if ( stopped ) { 7454 return false; 7455 } 7456 var currentTime = fxNow || createFxNow(), 7457 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 7458
vendor: 9,542 bytes, lines 7459-7849
7459 // Support: Android 2.3 only 7460 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) 7461 temp = remaining / animation.duration || 0, 7462 percent = 1 - temp, 7463 index = 0, 7464 length = animation.tweens.length; 7465 7466 for ( ; index < length; index++ ) { 7467 animation.tweens[ index ].run( percent ); 7468 } 7469 7470 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 7471 7472 // If there's more to do, yield 7473 if ( percent < 1 && length ) { 7474 return remaining; 7475 } 7476 7477 // If this was an empty animation, synthesize a final progress notification 7478 if ( !length ) { 7479 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7480 } 7481 7482 // Resolve the animation and report its conclusion 7483 deferred.resolveWith( elem, [ animation ] ); 7484 return false; 7485 }, 7486 animation = deferred.promise( { 7487 elem: elem, 7488 props: jQuery.extend( {}, properties ), 7489 opts: jQuery.extend( true, { 7490 specialEasing: {}, 7491 easing: jQuery.easing._default 7492 }, options ), 7493 originalProperties: properties, 7494 originalOptions: options, 7495 startTime: fxNow || createFxNow(), 7496 duration: options.duration, 7497 tweens: [], 7498 createTween: function( prop, end ) { 7499 var tween = jQuery.Tween( elem, animation.opts, prop, end, 7500 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 7501 animation.tweens.push( tween ); 7502 return tween; 7503 }, 7504 stop: function( gotoEnd ) { 7505 var index = 0, 7506 7507 // If we are going to the end, we want to run all the tweens 7508 // otherwise we skip this part 7509 length = gotoEnd ? animation.tweens.length : 0; 7510 if ( stopped ) { 7511 return this; 7512 } 7513 stopped = true; 7514 for ( ; index < length; index++ ) { 7515 animation.tweens[ index ].run( 1 ); 7516 } 7517 7518 // Resolve when we played the last frame; otherwise, reject 7519 if ( gotoEnd ) { 7520 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7521 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 7522 } else { 7523 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 7524 } 7525 return this; 7526 } 7527 } ), 7528 props = animation.props; 7529 7530 propFilter( props, animation.opts.specialEasing ); 7531 7532 for ( ; index < length; index++ ) { 7533 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 7534 if ( result ) { 7535 if ( isFunction( result.stop ) ) { 7536 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 7537 result.stop.bind( result ); 7538 } 7539 return result; 7540 } 7541 } 7542 7543 jQuery.map( props, createTween, animation ); 7544 7545 if ( isFunction( animation.opts.start ) ) { 7546 animation.opts.start.call( elem, animation ); 7547 } 7548 7549 // Attach callbacks from options 7550 animation 7551 .progress( animation.opts.progress ) 7552 .done( animation.opts.done, animation.opts.complete ) 7553 .fail( animation.opts.fail ) 7554 .always( animation.opts.always ); 7555 7556 jQuery.fx.timer( 7557 jQuery.extend( tick, { 7558 elem: elem, 7559 anim: animation, 7560 queue: animation.opts.queue 7561 } ) 7562 ); 7563 7564 return animation; 7565} 7566 7567jQuery.Animation = jQuery.extend( Animation, { 7568 7569 tweeners: { 7570 "*": [ function( prop, value ) { 7571 var tween = this.createTween( prop, value ); 7572 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 7573 return tween; 7574 } ] 7575 }, 7576 7577 tweener: function( props, callback ) { 7578 if ( isFunction( props ) ) { 7579 callback = props; 7580 props = [ "*" ]; 7581 } else { 7582 props = props.match( rnothtmlwhite ); 7583 } 7584 7585 var prop, 7586 index = 0, 7587 length = props.length; 7588 7589 for ( ; index < length; index++ ) { 7590 prop = props[ index ]; 7591 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 7592 Animation.tweeners[ prop ].unshift( callback ); 7593 } 7594 }, 7595 7596 prefilters: [ defaultPrefilter ], 7597 7598 prefilter: function( callback, prepend ) { 7599 if ( prepend ) { 7600 Animation.prefilters.unshift( callback ); 7601 } else { 7602 Animation.prefilters.push( callback ); 7603 } 7604 } 7605} ); 7606 7607jQuery.speed = function( speed, easing, fn ) { 7608 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 7609 complete: fn || !fn && easing || 7610 isFunction( speed ) && speed, 7611 duration: speed, 7612 easing: fn && easing || easing && !isFunction( easing ) && easing 7613 }; 7614 7615 // Go to the end state if fx are off 7616 if ( jQuery.fx.off ) { 7617 opt.duration = 0; 7618 7619 } else { 7620 if ( typeof opt.duration !== "number" ) { 7621 if ( opt.duration in jQuery.fx.speeds ) { 7622 opt.duration = jQuery.fx.speeds[ opt.duration ]; 7623 7624 } else { 7625 opt.duration = jQuery.fx.speeds._default; 7626 } 7627 } 7628 } 7629 7630 // Normalize opt.queue - true/undefined/null -> "fx" 7631 if ( opt.queue == null || opt.queue === true ) { 7632 opt.queue = "fx"; 7633 } 7634 7635 // Queueing 7636 opt.old = opt.complete; 7637 7638 opt.complete = function() { 7639 if ( isFunction( opt.old ) ) { 7640 opt.old.call( this ); 7641 } 7642 7643 if ( opt.queue ) { 7644 jQuery.dequeue( this, opt.queue ); 7645 } 7646 }; 7647 7648 return opt; 7649}; 7650 7651jQuery.fn.extend( { 7652 fadeTo: function( speed, to, easing, callback ) { 7653 7654 // Show any hidden elements after setting opacity to 0 7655 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 7656 7657 // Animate to the value specified 7658 .end().animate( { opacity: to }, speed, easing, callback ); 7659 }, 7660 animate: function( prop, speed, easing, callback ) { 7661 var empty = jQuery.isEmptyObject( prop ), 7662 optall = jQuery.speed( speed, easing, callback ), 7663 doAnimation = function() { 7664 7665 // Operate on a copy of prop so per-property easing won't be lost 7666 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 7667 7668 // Empty animations, or finishing resolves immediately 7669 if ( empty || dataPriv.get( this, "finish" ) ) { 7670 anim.stop( true ); 7671 } 7672 }; 7673 7674 doAnimation.finish = doAnimation; 7675 7676 return empty || optall.queue === false ? 7677 this.each( doAnimation ) : 7678 this.queue( optall.queue, doAnimation ); 7679 }, 7680 stop: function( type, clearQueue, gotoEnd ) { 7681 var stopQueue = function( hooks ) { 7682 var stop = hooks.stop; 7683 delete hooks.stop; 7684 stop( gotoEnd ); 7685 }; 7686 7687 if ( typeof type !== "string" ) { 7688 gotoEnd = clearQueue; 7689 clearQueue = type; 7690 type = undefined; 7691 } 7692 if ( clearQueue ) { 7693 this.queue( type || "fx", [] ); 7694 } 7695 7696 return this.each( function() { 7697 var dequeue = true, 7698 index = type != null && type + "queueHooks", 7699 timers = jQuery.timers, 7700 data = dataPriv.get( this ); 7701 7702 if ( index ) { 7703 if ( data[ index ] && data[ index ].stop ) { 7704 stopQueue( data[ index ] ); 7705 } 7706 } else { 7707 for ( index in data ) { 7708 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 7709 stopQueue( data[ index ] ); 7710 } 7711 } 7712 } 7713 7714 for ( index = timers.length; index--; ) { 7715 if ( timers[ index ].elem === this && 7716 ( type == null || timers[ index ].queue === type ) ) { 7717 7718 timers[ index ].anim.stop( gotoEnd ); 7719 dequeue = false; 7720 timers.splice( index, 1 ); 7721 } 7722 } 7723 7724 // Start the next in the queue if the last step wasn't forced. 7725 // Timers currently will call their complete callbacks, which 7726 // will dequeue but only if they were gotoEnd. 7727 if ( dequeue || !gotoEnd ) { 7728 jQuery.dequeue( this, type ); 7729 } 7730 } ); 7731 }, 7732 finish: function( type ) { 7733 if ( type !== false ) { 7734 type = type || "fx"; 7735 } 7736 return this.each( function() { 7737 var index, 7738 data = dataPriv.get( this ), 7739 queue = data[ type + "queue" ], 7740 hooks = data[ type + "queueHooks" ], 7741 timers = jQuery.timers, 7742 length = queue ? queue.length : 0; 7743 7744 // Enable finishing flag on private data 7745 data.finish = true; 7746 7747 // Empty the queue first 7748 jQuery.queue( this, type, [] ); 7749 7750 if ( hooks && hooks.stop ) { 7751 hooks.stop.call( this, true ); 7752 } 7753 7754 // Look for any active animations, and finish them 7755 for ( index = timers.length; index--; ) { 7756 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 7757 timers[ index ].anim.stop( true ); 7758 timers.splice( index, 1 ); 7759 } 7760 } 7761 7762 // Look for any animations in the old queue and finish them 7763 for ( index = 0; index < length; index++ ) { 7764 if ( queue[ index ] && queue[ index ].finish ) { 7765 queue[ index ].finish.call( this ); 7766 } 7767 } 7768 7769 // Turn off finishing flag 7770 delete data.finish; 7771 } ); 7772 } 7773} ); 7774 7775jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { 7776 var cssFn = jQuery.fn[ name ]; 7777 jQuery.fn[ name ] = function( speed, easing, callback ) { 7778 return speed == null || typeof speed === "boolean" ? 7779 cssFn.apply( this, arguments ) : 7780 this.animate( genFx( name, true ), speed, easing, callback ); 7781 }; 7782} ); 7783 7784// Generate shortcuts for custom animations 7785jQuery.each( { 7786 slideDown: genFx( "show" ), 7787 slideUp: genFx( "hide" ), 7788 slideToggle: genFx( "toggle" ), 7789 fadeIn: { opacity: "show" }, 7790 fadeOut: { opacity: "hide" }, 7791 fadeToggle: { opacity: "toggle" } 7792}, function( name, props ) { 7793 jQuery.fn[ name ] = function( speed, easing, callback ) { 7794 return this.animate( props, speed, easing, callback ); 7795 }; 7796} ); 7797 7798jQuery.timers = []; 7799jQuery.fx.tick = function() { 7800 var timer, 7801 i = 0, 7802 timers = jQuery.timers; 7803 7804 fxNow = Date.now(); 7805 7806 for ( ; i < timers.length; i++ ) { 7807 timer = timers[ i ]; 7808 7809 // Run the timer and safely remove it when done (allowing for external removal) 7810 if ( !timer() && timers[ i ] === timer ) { 7811 timers.splice( i--, 1 ); 7812 } 7813 } 7814 7815 if ( !timers.length ) { 7816 jQuery.fx.stop(); 7817 } 7818 fxNow = undefined; 7819}; 7820 7821jQuery.fx.timer = function( timer ) { 7822 jQuery.timers.push( timer ); 7823 jQuery.fx.start(); 7824}; 7825 7826jQuery.fx.interval = 13; 7827jQuery.fx.start = function() { 7828 if ( inProgress ) { 7829 return; 7830 } 7831 7832 inProgress = true; 7833 schedule(); 7834}; 7835 7836jQuery.fx.stop = function() { 7837 inProgress = null; 7838}; 7839 7840jQuery.fx.speeds = { 7841 slow: 600, 7842 fast: 200, 7843 7844 // Default speed 7845 _default: 400 7846}; 7847 7848 7849// Based off of the plugin by Clint Helfers, with permission.
vendor: 5,177 bytes, lines 7850-8070
7850jQuery.fn.delay = function( time, type ) { 7851 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 7852 type = type || "fx"; 7853 7854 return this.queue( type, function( next, hooks ) { 7855 var timeout = window.setTimeout( next, time ); 7856 hooks.stop = function() { 7857 window.clearTimeout( timeout ); 7858 }; 7859 } ); 7860}; 7861 7862 7863( function() { 7864 var input = document.createElement( "input" ), 7865 select = document.createElement( "select" ), 7866 opt = select.appendChild( document.createElement( "option" ) ); 7867 7868 input.type = "checkbox"; 7869 7870 // Support: Android <=4.3 only 7871 // Default value for a checkbox should be "on" 7872 support.checkOn = input.value !== ""; 7873 7874 // Support: IE <=11 only 7875 // Must access selectedIndex to make default options select 7876 support.optSelected = opt.selected; 7877 7878 // Support: IE <=11 only 7879 // An input loses its value after becoming a radio 7880 input = document.createElement( "input" ); 7881 input.value = "t"; 7882 input.type = "radio"; 7883 support.radioValue = input.value === "t"; 7884} )(); 7885 7886 7887var boolHook, 7888 attrHandle = jQuery.expr.attrHandle; 7889 7890jQuery.fn.extend( { 7891 attr: function( name, value ) { 7892 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 7893 }, 7894 7895 removeAttr: function( name ) { 7896 return this.each( function() { 7897 jQuery.removeAttr( this, name ); 7898 } ); 7899 } 7900} ); 7901 7902jQuery.extend( { 7903 attr: function( elem, name, value ) { 7904 var ret, hooks, 7905 nType = elem.nodeType; 7906 7907 // Don't get/set attributes on text, comment and attribute nodes 7908 if ( nType === 3 || nType === 8 || nType === 2 ) { 7909 return; 7910 } 7911 7912 // Fallback to prop when attributes are not supported 7913 if ( typeof elem.getAttribute === "undefined" ) { 7914 return jQuery.prop( elem, name, value ); 7915 } 7916 7917 // Attribute hooks are determined by the lowercase version 7918 // Grab necessary hook if one is defined 7919 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 7920 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 7921 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 7922 } 7923 7924 if ( value !== undefined ) { 7925 if ( value === null ) { 7926 jQuery.removeAttr( elem, name ); 7927 return; 7928 } 7929 7930 if ( hooks && "set" in hooks && 7931 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 7932 return ret; 7933 } 7934 7935 elem.setAttribute( name, value + "" ); 7936 return value; 7937 } 7938 7939 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 7940 return ret; 7941 } 7942 7943 ret = jQuery.find.attr( elem, name ); 7944 7945 // Non-existent attributes return null, we normalize to undefined 7946 return ret == null ? undefined : ret; 7947 }, 7948 7949 attrHooks: { 7950 type: { 7951 set: function( elem, value ) { 7952 if ( !support.radioValue && value === "radio" && 7953 nodeName( elem, "input" ) ) { 7954 var val = elem.value; 7955 elem.setAttribute( "type", value ); 7956 if ( val ) { 7957 elem.value = val; 7958 } 7959 return value; 7960 } 7961 } 7962 } 7963 }, 7964 7965 removeAttr: function( elem, value ) { 7966 var name, 7967 i = 0, 7968 7969 // Attribute names can contain non-HTML whitespace characters 7970 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 7971 attrNames = value && value.match( rnothtmlwhite ); 7972 7973 if ( attrNames && elem.nodeType === 1 ) { 7974 while ( ( name = attrNames[ i++ ] ) ) { 7975 elem.removeAttribute( name ); 7976 } 7977 } 7978 } 7979} ); 7980 7981// Hooks for boolean attributes 7982boolHook = { 7983 set: function( elem, value, name ) { 7984 if ( value === false ) { 7985 7986 // Remove boolean attributes when set to false 7987 jQuery.removeAttr( elem, name ); 7988 } else { 7989 elem.setAttribute( name, name ); 7990 } 7991 return name; 7992 } 7993}; 7994 7995jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { 7996 var getter = attrHandle[ name ] || jQuery.find.attr; 7997 7998 attrHandle[ name ] = function( elem, name, isXML ) { 7999 var ret, handle, 8000 lowercaseName = name.toLowerCase(); 8001 8002 if ( !isXML ) { 8003 8004 // Avoid an infinite loop by temporarily removing this function from the getter 8005 handle = attrHandle[ lowercaseName ]; 8006 attrHandle[ lowercaseName ] = ret; 8007 ret = getter( elem, name, isXML ) != null ? 8008 lowercaseName : 8009 null; 8010 attrHandle[ lowercaseName ] = handle; 8011 } 8012 return ret; 8013 }; 8014} ); 8015 8016 8017 8018 8019var rfocusable = /^(?:input|select|textarea|button)$/i, 8020 rclickable = /^(?:a|area)$/i; 8021 8022jQuery.fn.extend( { 8023 prop: function( name, value ) { 8024 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 8025 }, 8026 8027 removeProp: function( name ) { 8028 return this.each( function() { 8029 delete this[ jQuery.propFix[ name ] || name ]; 8030 } ); 8031 } 8032} ); 8033 8034jQuery.extend( { 8035 prop: function( elem, name, value ) { 8036 var ret, hooks, 8037 nType = elem.nodeType; 8038 8039 // Don't get/set properties on text, comment and attribute nodes 8040 if ( nType === 3 || nType === 8 || nType === 2 ) { 8041 return; 8042 } 8043 8044 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 8045 8046 // Fix name and attach hooks 8047 name = jQuery.propFix[ name ] || name; 8048 hooks = jQuery.propHooks[ name ]; 8049 } 8050 8051 if ( value !== undefined ) { 8052 if ( hooks && "set" in hooks && 8053 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 8054 return ret; 8055 } 8056 8057 return ( elem[ name ] = value ); 8058 } 8059 8060 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 8061 return ret; 8062 } 8063 8064 return elem[ name ]; 8065 }, 8066 8067 propHooks: { 8068 tabIndex: { 8069 get: function( elem ) { 8070
vendor: 6,126 bytes, lines 8071-8330
8071 // Support: IE <=9 - 11 only 8072 // elem.tabIndex doesn't always return the 8073 // correct value when it hasn't been explicitly set 8074 // Use proper attribute retrieval (trac-12072) 8075 var tabindex = jQuery.find.attr( elem, "tabindex" ); 8076 8077 if ( tabindex ) { 8078 return parseInt( tabindex, 10 ); 8079 } 8080 8081 if ( 8082 rfocusable.test( elem.nodeName ) || 8083 rclickable.test( elem.nodeName ) && 8084 elem.href 8085 ) { 8086 return 0; 8087 } 8088 8089 return -1; 8090 } 8091 } 8092 }, 8093 8094 propFix: { 8095 "for": "htmlFor", 8096 "class": "className" 8097 } 8098} ); 8099 8100// Support: IE <=11 only 8101// Accessing the selectedIndex property 8102// forces the browser to respect setting selected 8103// on the option 8104// The getter ensures a default option is selected 8105// when in an optgroup 8106// eslint rule "no-unused-expressions" is disabled for this code 8107// since it considers such accessions noop 8108if ( !support.optSelected ) { 8109 jQuery.propHooks.selected = { 8110 get: function( elem ) { 8111 8112 /* eslint no-unused-expressions: "off" */ 8113 8114 var parent = elem.parentNode; 8115 if ( parent && parent.parentNode ) { 8116 parent.parentNode.selectedIndex; 8117 } 8118 return null; 8119 }, 8120 set: function( elem ) { 8121 8122 /* eslint no-unused-expressions: "off" */ 8123 8124 var parent = elem.parentNode; 8125 if ( parent ) { 8126 parent.selectedIndex; 8127 8128 if ( parent.parentNode ) { 8129 parent.parentNode.selectedIndex; 8130 } 8131 } 8132 } 8133 }; 8134} 8135 8136jQuery.each( [ 8137 "tabIndex", 8138 "readOnly", 8139 "maxLength", 8140 "cellSpacing", 8141 "cellPadding", 8142 "rowSpan", 8143 "colSpan", 8144 "useMap", 8145 "frameBorder", 8146 "contentEditable" 8147], function() { 8148 jQuery.propFix[ this.toLowerCase() ] = this; 8149} ); 8150 8151 8152 8153 8154 // Strip and collapse whitespace according to HTML spec 8155 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 8156 function stripAndCollapse( value ) { 8157 var tokens = value.match( rnothtmlwhite ) || []; 8158 return tokens.join( " " ); 8159 } 8160 8161 8162function getClass( elem ) { 8163 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 8164} 8165 8166function classesToArray( value ) { 8167 if ( Array.isArray( value ) ) { 8168 return value; 8169 } 8170 if ( typeof value === "string" ) { 8171 return value.match( rnothtmlwhite ) || []; 8172 } 8173 return []; 8174} 8175 8176jQuery.fn.extend( { 8177 addClass: function( value ) { 8178 var classNames, cur, curValue, className, i, finalValue; 8179 8180 if ( isFunction( value ) ) { 8181 return this.each( function( j ) { 8182 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 8183 } ); 8184 } 8185 8186 classNames = classesToArray( value ); 8187 8188 if ( classNames.length ) { 8189 return this.each( function() { 8190 curValue = getClass( this ); 8191 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8192 8193 if ( cur ) { 8194 for ( i = 0; i < classNames.length; i++ ) { 8195 className = classNames[ i ]; 8196 if ( cur.indexOf( " " + className + " " ) < 0 ) { 8197 cur += className + " "; 8198 } 8199 } 8200 8201 // Only assign if different to avoid unneeded rendering. 8202 finalValue = stripAndCollapse( cur ); 8203 if ( curValue !== finalValue ) { 8204 this.setAttribute( "class", finalValue ); 8205 } 8206 } 8207 } ); 8208 } 8209 8210 return this; 8211 }, 8212 8213 removeClass: function( value ) { 8214 var classNames, cur, curValue, className, i, finalValue; 8215 8216 if ( isFunction( value ) ) { 8217 return this.each( function( j ) { 8218 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 8219 } ); 8220 } 8221 8222 if ( !arguments.length ) { 8223 return this.attr( "class", "" ); 8224 } 8225 8226 classNames = classesToArray( value ); 8227 8228 if ( classNames.length ) { 8229 return this.each( function() { 8230 curValue = getClass( this ); 8231 8232 // This expression is here for better compressibility (see addClass) 8233 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8234 8235 if ( cur ) { 8236 for ( i = 0; i < classNames.length; i++ ) { 8237 className = classNames[ i ]; 8238 8239 // Remove *all* instances 8240 while ( cur.indexOf( " " + className + " " ) > -1 ) { 8241 cur = cur.replace( " " + className + " ", " " ); 8242 } 8243 } 8244 8245 // Only assign if different to avoid unneeded rendering. 8246 finalValue = stripAndCollapse( cur ); 8247 if ( curValue !== finalValue ) { 8248 this.setAttribute( "class", finalValue ); 8249 } 8250 } 8251 } ); 8252 } 8253 8254 return this; 8255 }, 8256 8257 toggleClass: function( value, stateVal ) { 8258 var classNames, className, i, self, 8259 type = typeof value, 8260 isValidValue = type === "string" || Array.isArray( value ); 8261 8262 if ( isFunction( value ) ) { 8263 return this.each( function( i ) { 8264 jQuery( this ).toggleClass( 8265 value.call( this, i, getClass( this ), stateVal ), 8266 stateVal 8267 ); 8268 } ); 8269 } 8270 8271 if ( typeof stateVal === "boolean" && isValidValue ) { 8272 return stateVal ? this.addClass( value ) : this.removeClass( value ); 8273 } 8274 8275 classNames = classesToArray( value ); 8276 8277 return this.each( function() { 8278 if ( isValidValue ) { 8279 8280 // Toggle individual class names 8281 self = jQuery( this ); 8282 8283 for ( i = 0; i < classNames.length; i++ ) { 8284 className = classNames[ i ]; 8285 8286 // Check each className given, space separated list 8287 if ( self.hasClass( className ) ) { 8288 self.removeClass( className ); 8289 } else { 8290 self.addClass( className ); 8291 } 8292 } 8293 8294 // Toggle whole class name 8295 } else if ( value === undefined || type === "boolean" ) { 8296 className = getClass( this ); 8297 if ( className ) { 8298 8299 // Store className if set 8300 dataPriv.set( this, "__className__", className ); 8301 } 8302 8303 // If the element has a class name or if we're passed `false`, 8304 // then remove the whole classname (if there was one, the above saved it). 8305 // Otherwise bring back whatever was previously saved (if anything), 8306 // falling back to the empty string if nothing was stored. 8307 if ( this.setAttribute ) { 8308 this.setAttribute( "class", 8309 className || value === false ? 8310 "" : 8311 dataPriv.get( this, "__className__" ) || "" 8312 ); 8313 } 8314 } 8315 } ); 8316 }, 8317 8318 hasClass: function( selector ) { 8319 var className, elem, 8320 i = 0; 8321 8322 className = " " + selector + " "; 8323 while ( ( elem = this[ i++ ] ) ) { 8324 if ( elem.nodeType === 1 && 8325 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 8326 return true; 8327 } 8328 } 8329 8330 return false;
vendor: 1,385 bytes, lines 8331-8400
8331 } 8332} ); 8333 8334 8335 8336 8337var rreturn = /\r/g; 8338 8339jQuery.fn.extend( { 8340 val: function( value ) { 8341 var hooks, ret, valueIsFunction, 8342 elem = this[ 0 ]; 8343 8344 if ( !arguments.length ) { 8345 if ( elem ) { 8346 hooks = jQuery.valHooks[ elem.type ] || 8347 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 8348 8349 if ( hooks && 8350 "get" in hooks && 8351 ( ret = hooks.get( elem, "value" ) ) !== undefined 8352 ) { 8353 return ret; 8354 } 8355 8356 ret = elem.value; 8357 8358 // Handle most common string cases 8359 if ( typeof ret === "string" ) { 8360 return ret.replace( rreturn, "" ); 8361 } 8362 8363 // Handle cases where value is null/undef or number 8364 return ret == null ? "" : ret; 8365 } 8366 8367 return; 8368 } 8369 8370 valueIsFunction = isFunction( value ); 8371 8372 return this.each( function( i ) { 8373 var val; 8374 8375 if ( this.nodeType !== 1 ) { 8376 return; 8377 } 8378 8379 if ( valueIsFunction ) { 8380 val = value.call( this, i, jQuery( this ).val() ); 8381 } else { 8382 val = value; 8383 } 8384 8385 // Treat null/undefined as ""; convert numbers to string 8386 if ( val == null ) { 8387 val = ""; 8388 8389 } else if ( typeof val === "number" ) { 8390 val += ""; 8391 8392 } else if ( Array.isArray( val ) ) { 8393 val = jQuery.map( val, function( value ) { 8394 return value == null ? "" : value + ""; 8395 } ); 8396 } 8397 8398 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 8399 8400 // If set returns undefined, fall back to normal setting
vendor: 4,458 bytes, lines 8401-8586
8401 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 8402 this.value = val; 8403 } 8404 } ); 8405 } 8406} ); 8407 8408jQuery.extend( { 8409 valHooks: { 8410 option: { 8411 get: function( elem ) { 8412 8413 var val = jQuery.find.attr( elem, "value" ); 8414 return val != null ? 8415 val : 8416 8417 // Support: IE <=10 - 11 only 8418 // option.text throws exceptions (trac-14686, trac-14858) 8419 // Strip and collapse whitespace 8420 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 8421 stripAndCollapse( jQuery.text( elem ) ); 8422 } 8423 }, 8424 select: { 8425 get: function( elem ) { 8426 var value, option, i, 8427 options = elem.options, 8428 index = elem.selectedIndex, 8429 one = elem.type === "select-one", 8430 values = one ? null : [], 8431 max = one ? index + 1 : options.length; 8432 8433 if ( index < 0 ) { 8434 i = max; 8435 8436 } else { 8437 i = one ? index : 0; 8438 } 8439 8440 // Loop through all the selected options 8441 for ( ; i < max; i++ ) { 8442 option = options[ i ]; 8443 8444 // Support: IE <=9 only 8445 // IE8-9 doesn't update selected after form reset (trac-2551) 8446 if ( ( option.selected || i === index ) && 8447 8448 // Don't return options that are disabled or in a disabled optgroup 8449 !option.disabled && 8450 ( !option.parentNode.disabled || 8451 !nodeName( option.parentNode, "optgroup" ) ) ) { 8452 8453 // Get the specific value for the option 8454 value = jQuery( option ).val(); 8455 8456 // We don't need an array for one selects 8457 if ( one ) { 8458 return value; 8459 } 8460 8461 // Multi-Selects return an array 8462 values.push( value ); 8463 } 8464 } 8465 8466 return values; 8467 }, 8468 8469 set: function( elem, value ) { 8470 var optionSet, option, 8471 options = elem.options, 8472 values = jQuery.makeArray( value ), 8473 i = options.length; 8474 8475 while ( i-- ) { 8476 option = options[ i ]; 8477 8478 /* eslint-disable no-cond-assign */ 8479 8480 if ( option.selected = 8481 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 8482 ) { 8483 optionSet = true; 8484 } 8485 8486 /* eslint-enable no-cond-assign */ 8487 } 8488 8489 // Force browsers to behave consistently when non-matching value is set 8490 if ( !optionSet ) { 8491 elem.selectedIndex = -1; 8492 } 8493 return values; 8494 } 8495 } 8496 } 8497} ); 8498 8499// Radios and checkboxes getter/setter 8500jQuery.each( [ "radio", "checkbox" ], function() { 8501 jQuery.valHooks[ this ] = { 8502 set: function( elem, value ) { 8503 if ( Array.isArray( value ) ) { 8504 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 8505 } 8506 } 8507 }; 8508 if ( !support.checkOn ) { 8509 jQuery.valHooks[ this ].get = function( elem ) { 8510 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 8511 }; 8512 } 8513} ); 8514 8515 8516 8517 8518// Return jQuery for attributes-only inclusion 8519var location = window.location; 8520 8521var nonce = { guid: Date.now() }; 8522 8523var rquery = ( /\?/ ); 8524 8525 8526 8527// Cross-browser xml parsing 8528jQuery.parseXML = function( data ) { 8529 var xml, parserErrorElem; 8530 if ( !data || typeof data !== "string" ) { 8531 return null; 8532 } 8533 8534 // Support: IE 9 - 11 only 8535 // IE throws on parseFromString with invalid input. 8536 try { 8537 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 8538 } catch ( e ) {} 8539 8540 parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; 8541 if ( !xml || parserErrorElem ) { 8542 jQuery.error( "Invalid XML: " + ( 8543 parserErrorElem ? 8544 jQuery.map( parserErrorElem.childNodes, function( el ) { 8545 return el.textContent; 8546 } ).join( "\n" ) : 8547 data 8548 ) ); 8549 } 8550 return xml; 8551}; 8552 8553 8554var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 8555 stopPropagationCallback = function( e ) { 8556 e.stopPropagation(); 8557 }; 8558 8559jQuery.extend( jQuery.event, { 8560 8561 trigger: function( event, data, elem, onlyHandlers ) { 8562 8563 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, 8564 eventPath = [ elem || document ], 8565 type = hasOwn.call( event, "type" ) ? event.type : event, 8566 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 8567 8568 cur = lastElement = tmp = elem = elem || document; 8569 8570 // Don't do events on text and comment nodes 8571 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 8572 return; 8573 } 8574 8575 // focus/blur morphs to focusin/out; ensure we're not firing them right now 8576 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 8577 return; 8578 } 8579 8580 if ( type.indexOf( "." ) > -1 ) { 8581 8582 // Namespaced trigger; create a regexp to match event type in handle() 8583 namespaces = type.split( "." ); 8584 type = namespaces.shift(); 8585 namespaces.sort(); 8586 }
vendor: 6,524 bytes, lines 8587-8836
8587 ontype = type.indexOf( ":" ) < 0 && "on" + type; 8588 8589 // Caller can pass in a jQuery.Event object, Object, or just an event type string 8590 event = event[ jQuery.expando ] ? 8591 event : 8592 new jQuery.Event( type, typeof event === "object" && event ); 8593 8594 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 8595 event.isTrigger = onlyHandlers ? 2 : 3; 8596 event.namespace = namespaces.join( "." ); 8597 event.rnamespace = event.namespace ? 8598 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 8599 null; 8600 8601 // Clean up the event in case it is being reused 8602 event.result = undefined; 8603 if ( !event.target ) { 8604 event.target = elem; 8605 } 8606 8607 // Clone any incoming data and prepend the event, creating the handler arg list 8608 data = data == null ? 8609 [ event ] : 8610 jQuery.makeArray( data, [ event ] ); 8611 8612 // Allow special events to draw outside the lines 8613 special = jQuery.event.special[ type ] || {}; 8614 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 8615 return; 8616 } 8617 8618 // Determine event propagation path in advance, per W3C events spec (trac-9951) 8619 // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) 8620 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { 8621 8622 bubbleType = special.delegateType || type; 8623 if ( !rfocusMorph.test( bubbleType + type ) ) { 8624 cur = cur.parentNode; 8625 } 8626 for ( ; cur; cur = cur.parentNode ) { 8627 eventPath.push( cur ); 8628 tmp = cur; 8629 } 8630 8631 // Only add window if we got to document (e.g., not plain obj or detached DOM) 8632 if ( tmp === ( elem.ownerDocument || document ) ) { 8633 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 8634 } 8635 } 8636 8637 // Fire handlers on the event path 8638 i = 0; 8639 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 8640 lastElement = cur; 8641 event.type = i > 1 ? 8642 bubbleType : 8643 special.bindType || type; 8644 8645 // jQuery handler 8646 handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && 8647 dataPriv.get( cur, "handle" ); 8648 if ( handle ) { 8649 handle.apply( cur, data ); 8650 } 8651 8652 // Native handler 8653 handle = ontype && cur[ ontype ]; 8654 if ( handle && handle.apply && acceptData( cur ) ) { 8655 event.result = handle.apply( cur, data ); 8656 if ( event.result === false ) { 8657 event.preventDefault(); 8658 } 8659 } 8660 } 8661 event.type = type; 8662 8663 // If nobody prevented the default action, do it now 8664 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 8665 8666 if ( ( !special._default || 8667 special._default.apply( eventPath.pop(), data ) === false ) && 8668 acceptData( elem ) ) { 8669 8670 // Call a native DOM method on the target with the same name as the event. 8671 // Don't do default actions on window, that's where global variables be (trac-6170) 8672 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { 8673 8674 // Don't re-trigger an onFOO event when we call its FOO() method 8675 tmp = elem[ ontype ]; 8676 8677 if ( tmp ) { 8678 elem[ ontype ] = null; 8679 } 8680 8681 // Prevent re-triggering of the same event, since we already bubbled it above 8682 jQuery.event.triggered = type; 8683 8684 if ( event.isPropagationStopped() ) { 8685 lastElement.addEventListener( type, stopPropagationCallback ); 8686 } 8687 8688 elem[ type ](); 8689 8690 if ( event.isPropagationStopped() ) { 8691 lastElement.removeEventListener( type, stopPropagationCallback ); 8692 } 8693 8694 jQuery.event.triggered = undefined; 8695 8696 if ( tmp ) { 8697 elem[ ontype ] = tmp; 8698 } 8699 } 8700 } 8701 } 8702 8703 return event.result; 8704 }, 8705 8706 // Piggyback on a donor event to simulate a different one 8707 // Used only for `focus(in | out)` events 8708 simulate: function( type, elem, event ) { 8709 var e = jQuery.extend( 8710 new jQuery.Event(), 8711 event, 8712 { 8713 type: type, 8714 isSimulated: true 8715 } 8716 ); 8717 8718 jQuery.event.trigger( e, null, elem ); 8719 } 8720 8721} ); 8722 8723jQuery.fn.extend( { 8724 8725 trigger: function( type, data ) { 8726 return this.each( function() { 8727 jQuery.event.trigger( type, data, this ); 8728 } ); 8729 }, 8730 triggerHandler: function( type, data ) { 8731 var elem = this[ 0 ]; 8732 if ( elem ) { 8733 return jQuery.event.trigger( type, data, elem, true ); 8734 } 8735 } 8736} ); 8737 8738 8739var 8740 rbracket = /\[\]$/, 8741 rCRLF = /\r?\n/g, 8742 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 8743 rsubmittable = /^(?:input|select|textarea|keygen)/i; 8744 8745function buildParams( prefix, obj, traditional, add ) { 8746 var name; 8747 8748 if ( Array.isArray( obj ) ) { 8749 8750 // Serialize array item. 8751 jQuery.each( obj, function( i, v ) { 8752 if ( traditional || rbracket.test( prefix ) ) { 8753 8754 // Treat each array item as a scalar. 8755 add( prefix, v ); 8756 8757 } else { 8758 8759 // Item is non-scalar (array or object), encode its numeric index. 8760 buildParams( 8761 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 8762 v, 8763 traditional, 8764 add 8765 ); 8766 } 8767 } ); 8768 8769 } else if ( !traditional && toType( obj ) === "object" ) { 8770 8771 // Serialize object item. 8772 for ( name in obj ) { 8773 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 8774 } 8775 8776 } else { 8777 8778 // Serialize scalar item. 8779 add( prefix, obj ); 8780 } 8781} 8782 8783// Serialize an array of form elements or a set of 8784// key/values into a query string 8785jQuery.param = function( a, traditional ) { 8786 var prefix, 8787 s = [], 8788 add = function( key, valueOrFunction ) { 8789 8790 // If value is a function, invoke it and use its return value 8791 var value = isFunction( valueOrFunction ) ? 8792 valueOrFunction() : 8793 valueOrFunction; 8794 8795 s[ s.length ] = encodeURIComponent( key ) + "=" + 8796 encodeURIComponent( value == null ? "" : value ); 8797 }; 8798 8799 if ( a == null ) { 8800 return ""; 8801 } 8802 8803 // If an array was passed in, assume that it is an array of form elements. 8804 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 8805 8806 // Serialize the form elements 8807 jQuery.each( a, function() { 8808 add( this.name, this.value ); 8809 } ); 8810 8811 } else { 8812 8813 // If traditional, encode the "old" way (the way 1.3.2 or older 8814 // did it), otherwise encode params recursively. 8815 for ( prefix in a ) { 8816 buildParams( prefix, a[ prefix ], traditional, add ); 8817 } 8818 } 8819 8820 // Return the resulting serialization 8821 return s.join( "&" ); 8822}; 8823 8824jQuery.fn.extend( { 8825 serialize: function() { 8826 return jQuery.param( this.serializeArray() ); 8827 }, 8828 serializeArray: function() { 8829 return this.map( function() { 8830 8831 // Can add propHook for "elements" to filter or add form elements 8832 var elements = jQuery.prop( this, "elements" ); 8833 return elements ? jQuery.makeArray( elements ) : this; 8834 } ).filter( function() { 8835 var type = this.type; 8836
vendor: 46,136 bytes, lines 8837-10583
8837 // Use .is( ":disabled" ) so that fieldset[disabled] works 8838 return this.name && !jQuery( this ).is( ":disabled" ) && 8839 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 8840 ( this.checked || !rcheckableType.test( type ) ); 8841 } ).map( function( _i, elem ) { 8842 var val = jQuery( this ).val(); 8843 8844 if ( val == null ) { 8845 return null; 8846 } 8847 8848 if ( Array.isArray( val ) ) { 8849 return jQuery.map( val, function( val ) { 8850 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 8851 } ); 8852 } 8853 8854 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 8855 } ).get(); 8856 } 8857} ); 8858 8859 8860var 8861 r20 = /%20/g, 8862 rhash = /#.*$/, 8863 rantiCache = /([?&])_=[^&]*/, 8864 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 8865 8866 // trac-7653, trac-8125, trac-8152: local protocol detection 8867 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 8868 rnoContent = /^(?:GET|HEAD)$/, 8869 rprotocol = /^\/\//, 8870 8871 /* Prefilters 8872 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 8873 * 2) These are called: 8874 * - BEFORE asking for a transport 8875 * - AFTER param serialization (s.data is a string if s.processData is true) 8876 * 3) key is the dataType 8877 * 4) the catchall symbol "*" can be used 8878 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 8879 */ 8880 prefilters = {}, 8881 8882 /* Transports bindings 8883 * 1) key is the dataType 8884 * 2) the catchall symbol "*" can be used 8885 * 3) selection will start with transport dataType and THEN go to "*" if needed 8886 */ 8887 transports = {}, 8888 8889 // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression 8890 allTypes = "*/".concat( "*" ), 8891 8892 // Anchor tag for parsing the document origin 8893 originAnchor = document.createElement( "a" ); 8894 8895originAnchor.href = location.href; 8896 8897// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 8898function addToPrefiltersOrTransports( structure ) { 8899 8900 // dataTypeExpression is optional and defaults to "*" 8901 return function( dataTypeExpression, func ) { 8902 8903 if ( typeof dataTypeExpression !== "string" ) { 8904 func = dataTypeExpression; 8905 dataTypeExpression = "*"; 8906 } 8907 8908 var dataType, 8909 i = 0, 8910 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 8911 8912 if ( isFunction( func ) ) { 8913 8914 // For each dataType in the dataTypeExpression 8915 while ( ( dataType = dataTypes[ i++ ] ) ) { 8916 8917 // Prepend if requested 8918 if ( dataType[ 0 ] === "+" ) { 8919 dataType = dataType.slice( 1 ) || "*"; 8920 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 8921 8922 // Otherwise append 8923 } else { 8924 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 8925 } 8926 } 8927 } 8928 }; 8929} 8930 8931// Base inspection function for prefilters and transports 8932function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 8933 8934 var inspected = {}, 8935 seekingTransport = ( structure === transports ); 8936 8937 function inspect( dataType ) { 8938 var selected; 8939 inspected[ dataType ] = true; 8940 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 8941 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 8942 if ( typeof dataTypeOrTransport === "string" && 8943 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 8944 8945 options.dataTypes.unshift( dataTypeOrTransport ); 8946 inspect( dataTypeOrTransport ); 8947 return false; 8948 } else if ( seekingTransport ) { 8949 return !( selected = dataTypeOrTransport ); 8950 } 8951 } ); 8952 return selected; 8953 } 8954 8955 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 8956} 8957 8958// A special extend for ajax options 8959// that takes "flat" options (not to be deep extended) 8960// Fixes trac-9887 8961function ajaxExtend( target, src ) { 8962 var key, deep, 8963 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 8964 8965 for ( key in src ) { 8966 if ( src[ key ] !== undefined ) { 8967 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 8968 } 8969 } 8970 if ( deep ) { 8971 jQuery.extend( true, target, deep ); 8972 } 8973 8974 return target; 8975} 8976 8977/* Handles responses to an ajax request: 8978 * - finds the right dataType (mediates between content-type and expected dataType) 8979 * - returns the corresponding response 8980 */ 8981function ajaxHandleResponses( s, jqXHR, responses ) { 8982 8983 var ct, type, finalDataType, firstDataType, 8984 contents = s.contents, 8985 dataTypes = s.dataTypes; 8986 8987 // Remove auto dataType and get content-type in the process 8988 while ( dataTypes[ 0 ] === "*" ) { 8989 dataTypes.shift(); 8990 if ( ct === undefined ) { 8991 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 8992 } 8993 } 8994 8995 // Check if we're dealing with a known content-type 8996 if ( ct ) { 8997 for ( type in contents ) { 8998 if ( contents[ type ] && contents[ type ].test( ct ) ) { 8999 dataTypes.unshift( type ); 9000 break; 9001 } 9002 } 9003 } 9004 9005 // Check to see if we have a response for the expected dataType 9006 if ( dataTypes[ 0 ] in responses ) { 9007 finalDataType = dataTypes[ 0 ]; 9008 } else { 9009 9010 // Try convertible dataTypes 9011 for ( type in responses ) { 9012 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 9013 finalDataType = type; 9014 break; 9015 } 9016 if ( !firstDataType ) { 9017 firstDataType = type; 9018 } 9019 } 9020 9021 // Or just use first one 9022 finalDataType = finalDataType || firstDataType; 9023 } 9024 9025 // If we found a dataType 9026 // We add the dataType to the list if needed 9027 // and return the corresponding response 9028 if ( finalDataType ) { 9029 if ( finalDataType !== dataTypes[ 0 ] ) { 9030 dataTypes.unshift( finalDataType ); 9031 } 9032 return responses[ finalDataType ]; 9033 } 9034} 9035 9036/* Chain conversions given the request and the original response 9037 * Also sets the responseXXX fields on the jqXHR instance 9038 */ 9039function ajaxConvert( s, response, jqXHR, isSuccess ) { 9040 var conv2, current, conv, tmp, prev, 9041 converters = {}, 9042 9043 // Work with a copy of dataTypes in case we need to modify it for conversion 9044 dataTypes = s.dataTypes.slice(); 9045 9046 // Create converters map with lowercased keys 9047 if ( dataTypes[ 1 ] ) { 9048 for ( conv in s.converters ) { 9049 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 9050 } 9051 } 9052 9053 current = dataTypes.shift(); 9054 9055 // Convert to each sequential dataType 9056 while ( current ) { 9057 9058 if ( s.responseFields[ current ] ) { 9059 jqXHR[ s.responseFields[ current ] ] = response; 9060 } 9061 9062 // Apply the dataFilter if provided 9063 if ( !prev && isSuccess && s.dataFilter ) { 9064 response = s.dataFilter( response, s.dataType ); 9065 } 9066 9067 prev = current; 9068 current = dataTypes.shift(); 9069 9070 if ( current ) { 9071 9072 // There's only work to do if current dataType is non-auto 9073 if ( current === "*" ) { 9074 9075 current = prev; 9076 9077 // Convert response if prev dataType is non-auto and differs from current 9078 } else if ( prev !== "*" && prev !== current ) { 9079 9080 // Seek a direct converter 9081 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 9082 9083 // If none found, seek a pair 9084 if ( !conv ) { 9085 for ( conv2 in converters ) { 9086 9087 // If conv2 outputs current 9088 tmp = conv2.split( " " ); 9089 if ( tmp[ 1 ] === current ) { 9090 9091 // If prev can be converted to accepted input 9092 conv = converters[ prev + " " + tmp[ 0 ] ] || 9093 converters[ "* " + tmp[ 0 ] ]; 9094 if ( conv ) { 9095 9096 // Condense equivalence converters 9097 if ( conv === true ) { 9098 conv = converters[ conv2 ]; 9099 9100 // Otherwise, insert the intermediate dataType 9101 } else if ( converters[ conv2 ] !== true ) { 9102 current = tmp[ 0 ]; 9103 dataTypes.unshift( tmp[ 1 ] ); 9104 } 9105 break; 9106 } 9107 } 9108 } 9109 } 9110 9111 // Apply converter (if not an equivalence) 9112 if ( conv !== true ) { 9113 9114 // Unless errors are allowed to bubble, catch and return them 9115 if ( conv && s.throws ) { 9116 response = conv( response ); 9117 } else { 9118 try { 9119 response = conv( response ); 9120 } catch ( e ) { 9121 return { 9122 state: "parsererror", 9123 error: conv ? e : "No conversion from " + prev + " to " + current 9124 }; 9125 } 9126 } 9127 } 9128 } 9129 } 9130 } 9131 9132 return { state: "success", data: response }; 9133} 9134 9135jQuery.extend( { 9136 9137 // Counter for holding the number of active queries 9138 active: 0, 9139 9140 // Last-Modified header cache for next request 9141 lastModified: {}, 9142 etag: {}, 9143 9144 ajaxSettings: { 9145 url: location.href, 9146 type: "GET", 9147 isLocal: rlocalProtocol.test( location.protocol ), 9148 global: true, 9149 processData: true, 9150 async: true, 9151 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 9152 9153 /* 9154 timeout: 0, 9155 data: null, 9156 dataType: null, 9157 username: null, 9158 password: null, 9159 cache: null, 9160 throws: false, 9161 traditional: false, 9162 headers: {}, 9163 */ 9164 9165 accepts: { 9166 "*": allTypes, 9167 text: "text/plain", 9168 html: "text/html", 9169 xml: "application/xml, text/xml", 9170 json: "application/json, text/javascript" 9171 }, 9172 9173 contents: { 9174 xml: /\bxml\b/, 9175 html: /\bhtml/, 9176 json: /\bjson\b/ 9177 }, 9178 9179 responseFields: { 9180 xml: "responseXML", 9181 text: "responseText", 9182 json: "responseJSON" 9183 }, 9184 9185 // Data converters 9186 // Keys separate source (or catchall "*") and destination types with a single space 9187 converters: { 9188 9189 // Convert anything to text 9190 "* text": String, 9191 9192 // Text to html (true = no transformation) 9193 "text html": true, 9194 9195 // Evaluate text as a json expression 9196 "text json": JSON.parse, 9197 9198 // Parse text as xml 9199 "text xml": jQuery.parseXML 9200 }, 9201 9202 // For options that shouldn't be deep extended: 9203 // you can add your own custom options here if 9204 // and when you create one that shouldn't be 9205 // deep extended (see ajaxExtend) 9206 flatOptions: { 9207 url: true, 9208 context: true 9209 } 9210 }, 9211 9212 // Creates a full fledged settings object into target 9213 // with both ajaxSettings and settings fields. 9214 // If target is omitted, writes into ajaxSettings. 9215 ajaxSetup: function( target, settings ) { 9216 return settings ? 9217 9218 // Building a settings object 9219 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 9220 9221 // Extending ajaxSettings 9222 ajaxExtend( jQuery.ajaxSettings, target ); 9223 }, 9224 9225 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 9226 ajaxTransport: addToPrefiltersOrTransports( transports ), 9227 9228 // Main method 9229 ajax: function( url, options ) { 9230 9231 // If url is an object, simulate pre-1.5 signature 9232 if ( typeof url === "object" ) { 9233 options = url; 9234 url = undefined; 9235 } 9236 9237 // Force options to be an object 9238 options = options || {}; 9239 9240 var transport, 9241 9242 // URL without anti-cache param 9243 cacheURL, 9244 9245 // Response headers 9246 responseHeadersString, 9247 responseHeaders, 9248 9249 // timeout handle 9250 timeoutTimer, 9251 9252 // Url cleanup var 9253 urlAnchor, 9254 9255 // Request state (becomes false upon send and true upon completion) 9256 completed, 9257 9258 // To know if global events are to be dispatched 9259 fireGlobals, 9260 9261 // Loop variable 9262 i, 9263 9264 // uncached part of the url 9265 uncached, 9266 9267 // Create the final options object 9268 s = jQuery.ajaxSetup( {}, options ), 9269 9270 // Callbacks context 9271 callbackContext = s.context || s, 9272 9273 // Context for global events is callbackContext if it is a DOM node or jQuery collection 9274 globalEventContext = s.context && 9275 ( callbackContext.nodeType || callbackContext.jquery ) ? 9276 jQuery( callbackContext ) : 9277 jQuery.event, 9278 9279 // Deferreds 9280 deferred = jQuery.Deferred(), 9281 completeDeferred = jQuery.Callbacks( "once memory" ), 9282 9283 // Status-dependent callbacks 9284 statusCode = s.statusCode || {}, 9285 9286 // Headers (they are sent all at once) 9287 requestHeaders = {}, 9288 requestHeadersNames = {}, 9289 9290 // Default abort message 9291 strAbort = "canceled", 9292 9293 // Fake xhr 9294 jqXHR = { 9295 readyState: 0, 9296 9297 // Builds headers hashtable if needed 9298 getResponseHeader: function( key ) { 9299 var match; 9300 if ( completed ) { 9301 if ( !responseHeaders ) { 9302 responseHeaders = {}; 9303 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 9304 responseHeaders[ match[ 1 ].toLowerCase() + " " ] = 9305 ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) 9306 .concat( match[ 2 ] ); 9307 } 9308 } 9309 match = responseHeaders[ key.toLowerCase() + " " ]; 9310 } 9311 return match == null ? null : match.join( ", " ); 9312 }, 9313 9314 // Raw string 9315 getAllResponseHeaders: function() { 9316 return completed ? responseHeadersString : null; 9317 }, 9318 9319 // Caches the header 9320 setRequestHeader: function( name, value ) { 9321 if ( completed == null ) { 9322 name = requestHeadersNames[ name.toLowerCase() ] = 9323 requestHeadersNames[ name.toLowerCase() ] || name; 9324 requestHeaders[ name ] = value; 9325 } 9326 return this; 9327 }, 9328 9329 // Overrides response content-type header 9330 overrideMimeType: function( type ) { 9331 if ( completed == null ) { 9332 s.mimeType = type; 9333 } 9334 return this; 9335 }, 9336 9337 // Status-dependent callbacks 9338 statusCode: function( map ) { 9339 var code; 9340 if ( map ) { 9341 if ( completed ) { 9342 9343 // Execute the appropriate callbacks 9344 jqXHR.always( map[ jqXHR.status ] ); 9345 } else { 9346 9347 // Lazy-add the new callbacks in a way that preserves old ones 9348 for ( code in map ) { 9349 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 9350 } 9351 } 9352 } 9353 return this; 9354 }, 9355 9356 // Cancel the request 9357 abort: function( statusText ) { 9358 var finalText = statusText || strAbort; 9359 if ( transport ) { 9360 transport.abort( finalText ); 9361 } 9362 done( 0, finalText ); 9363 return this; 9364 } 9365 }; 9366 9367 // Attach deferreds 9368 deferred.promise( jqXHR ); 9369 9370 // Add protocol if not provided (prefilters might expect it) 9371 // Handle falsy url in the settings object (trac-10093: consistency with old signature) 9372 // We also use the url parameter if available 9373 s.url = ( ( url || s.url || location.href ) + "" ) 9374 .replace( rprotocol, location.protocol + "//" ); 9375 9376 // Alias method option to type as per ticket trac-12004 9377 s.type = options.method || options.type || s.method || s.type; 9378 9379 // Extract dataTypes list 9380 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 9381 9382 // A cross-domain request is in order when the origin doesn't match the current origin. 9383 if ( s.crossDomain == null ) { 9384 urlAnchor = document.createElement( "a" ); 9385 9386 // Support: IE <=8 - 11, Edge 12 - 15 9387 // IE throws exception on accessing the href property if url is malformed, 9388 // e.g. http://example.com:80x/ 9389 try { 9390 urlAnchor.href = s.url; 9391 9392 // Support: IE <=8 - 11 only 9393 // Anchor's host property isn't correctly set when s.url is relative 9394 urlAnchor.href = urlAnchor.href; 9395 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 9396 urlAnchor.protocol + "//" + urlAnchor.host; 9397 } catch ( e ) { 9398 9399 // If there is an error parsing the URL, assume it is crossDomain, 9400 // it can be rejected by the transport if it is invalid 9401 s.crossDomain = true; 9402 } 9403 } 9404 9405 // Convert data if not already a string 9406 if ( s.data && s.processData && typeof s.data !== "string" ) { 9407 s.data = jQuery.param( s.data, s.traditional ); 9408 } 9409 9410 // Apply prefilters 9411 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 9412 9413 // If request was aborted inside a prefilter, stop there 9414 if ( completed ) { 9415 return jqXHR; 9416 } 9417 9418 // We can fire global events as of now if asked to 9419 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) 9420 fireGlobals = jQuery.event && s.global; 9421 9422 // Watch for a new set of requests 9423 if ( fireGlobals && jQuery.active++ === 0 ) { 9424 jQuery.event.trigger( "ajaxStart" ); 9425 } 9426 9427 // Uppercase the type 9428 s.type = s.type.toUpperCase(); 9429 9430 // Determine if request has content 9431 s.hasContent = !rnoContent.test( s.type ); 9432 9433 // Save the URL in case we're toying with the If-Modified-Since 9434 // and/or If-None-Match header later on 9435 // Remove hash to simplify url manipulation 9436 cacheURL = s.url.replace( rhash, "" ); 9437 9438 // More options handling for requests with no content 9439 if ( !s.hasContent ) { 9440 9441 // Remember the hash so we can put it back 9442 uncached = s.url.slice( cacheURL.length ); 9443 9444 // If data is available and should be processed, append data to url 9445 if ( s.data && ( s.processData || typeof s.data === "string" ) ) { 9446 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 9447 9448 // trac-9682: remove data so that it's not used in an eventual retry 9449 delete s.data; 9450 } 9451 9452 // Add or update anti-cache param if needed 9453 if ( s.cache === false ) { 9454 cacheURL = cacheURL.replace( rantiCache, "$1" ); 9455 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + 9456 uncached; 9457 } 9458 9459 // Put hash and anti-cache on the URL that will be requested (gh-1732) 9460 s.url = cacheURL + uncached; 9461 9462 // Change '%20' to '+' if this is encoded form body content (gh-2658) 9463 } else if ( s.data && s.processData && 9464 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 9465 s.data = s.data.replace( r20, "+" ); 9466 } 9467 9468 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9469 if ( s.ifModified ) { 9470 if ( jQuery.lastModified[ cacheURL ] ) { 9471 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 9472 } 9473 if ( jQuery.etag[ cacheURL ] ) { 9474 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 9475 } 9476 } 9477 9478 // Set the correct header, if data is being sent 9479 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 9480 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 9481 } 9482 9483 // Set the Accepts header for the server, depending on the dataType 9484 jqXHR.setRequestHeader( 9485 "Accept", 9486 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 9487 s.accepts[ s.dataTypes[ 0 ] ] + 9488 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 9489 s.accepts[ "*" ] 9490 ); 9491 9492 // Check for headers option 9493 for ( i in s.headers ) { 9494 jqXHR.setRequestHeader( i, s.headers[ i ] ); 9495 } 9496 9497 // Allow custom headers/mimetypes and early abort 9498 if ( s.beforeSend && 9499 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 9500 9501 // Abort if not done already and return 9502 return jqXHR.abort(); 9503 } 9504 9505 // Aborting is no longer a cancellation 9506 strAbort = "abort"; 9507 9508 // Install callbacks on deferreds 9509 completeDeferred.add( s.complete ); 9510 jqXHR.done( s.success ); 9511 jqXHR.fail( s.error ); 9512 9513 // Get transport 9514 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 9515 9516 // If no transport, we auto-abort 9517 if ( !transport ) { 9518 done( -1, "No Transport" ); 9519 } else { 9520 jqXHR.readyState = 1; 9521 9522 // Send global event 9523 if ( fireGlobals ) { 9524 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 9525 } 9526 9527 // If request was aborted inside ajaxSend, stop there 9528 if ( completed ) { 9529 return jqXHR; 9530 } 9531 9532 // Timeout 9533 if ( s.async && s.timeout > 0 ) { 9534 timeoutTimer = window.setTimeout( function() { 9535 jqXHR.abort( "timeout" ); 9536 }, s.timeout ); 9537 } 9538 9539 try { 9540 completed = false; 9541 transport.send( requestHeaders, done ); 9542 } catch ( e ) { 9543 9544 // Rethrow post-completion exceptions 9545 if ( completed ) { 9546 throw e; 9547 } 9548 9549 // Propagate others as results 9550 done( -1, e ); 9551 } 9552 } 9553 9554 // Callback for when everything is done 9555 function done( status, nativeStatusText, responses, headers ) { 9556 var isSuccess, success, error, response, modified, 9557 statusText = nativeStatusText; 9558 9559 // Ignore repeat invocations 9560 if ( completed ) { 9561 return; 9562 } 9563 9564 completed = true; 9565 9566 // Clear timeout if it exists 9567 if ( timeoutTimer ) { 9568 window.clearTimeout( timeoutTimer ); 9569 } 9570 9571 // Dereference transport for early garbage collection 9572 // (no matter how long the jqXHR object will be used) 9573 transport = undefined; 9574 9575 // Cache response headers 9576 responseHeadersString = headers || ""; 9577 9578 // Set readyState 9579 jqXHR.readyState = status > 0 ? 4 : 0; 9580 9581 // Determine if successful 9582 isSuccess = status >= 200 && status < 300 || status === 304; 9583 9584 // Get response data 9585 if ( responses ) { 9586 response = ajaxHandleResponses( s, jqXHR, responses ); 9587 } 9588 9589 // Use a noop converter for missing script but not if jsonp 9590 if ( !isSuccess && 9591 jQuery.inArray( "script", s.dataTypes ) > -1 && 9592 jQuery.inArray( "json", s.dataTypes ) < 0 ) { 9593 s.converters[ "text script" ] = function() {}; 9594 } 9595 9596 // Convert no matter what (that way responseXXX fields are always set) 9597 response = ajaxConvert( s, response, jqXHR, isSuccess ); 9598 9599 // If successful, handle type chaining 9600 if ( isSuccess ) { 9601 9602 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9603 if ( s.ifModified ) { 9604 modified = jqXHR.getResponseHeader( "Last-Modified" ); 9605 if ( modified ) { 9606 jQuery.lastModified[ cacheURL ] = modified; 9607 } 9608 modified = jqXHR.getResponseHeader( "etag" ); 9609 if ( modified ) { 9610 jQuery.etag[ cacheURL ] = modified; 9611 } 9612 } 9613 9614 // if no content 9615 if ( status === 204 || s.type === "HEAD" ) { 9616 statusText = "nocontent"; 9617 9618 // if not modified 9619 } else if ( status === 304 ) { 9620 statusText = "notmodified"; 9621 9622 // If we have data, let's convert it 9623 } else { 9624 statusText = response.state; 9625 success = response.data; 9626 error = response.error; 9627 isSuccess = !error; 9628 } 9629 } else { 9630 9631 // Extract error from statusText and normalize for non-aborts 9632 error = statusText; 9633 if ( status || !statusText ) { 9634 statusText = "error"; 9635 if ( status < 0 ) { 9636 status = 0; 9637 } 9638 } 9639 } 9640 9641 // Set data for the fake xhr object 9642 jqXHR.status = status; 9643 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 9644 9645 // Success/Error 9646 if ( isSuccess ) { 9647 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 9648 } else { 9649 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 9650 } 9651 9652 // Status-dependent callbacks 9653 jqXHR.statusCode( statusCode ); 9654 statusCode = undefined; 9655 9656 if ( fireGlobals ) { 9657 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 9658 [ jqXHR, s, isSuccess ? success : error ] ); 9659 } 9660 9661 // Complete 9662 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 9663 9664 if ( fireGlobals ) { 9665 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 9666 9667 // Handle the global AJAX counter 9668 if ( !( --jQuery.active ) ) { 9669 jQuery.event.trigger( "ajaxStop" ); 9670 } 9671 } 9672 } 9673 9674 return jqXHR; 9675 }, 9676 9677 getJSON: function( url, data, callback ) { 9678 return jQuery.get( url, data, callback, "json" ); 9679 }, 9680 9681 getScript: function( url, callback ) { 9682 return jQuery.get( url, undefined, callback, "script" ); 9683 } 9684} ); 9685 9686jQuery.each( [ "get", "post" ], function( _i, method ) { 9687 jQuery[ method ] = function( url, data, callback, type ) { 9688 9689 // Shift arguments if data argument was omitted 9690 if ( isFunction( data ) ) { 9691 type = type || callback; 9692 callback = data; 9693 data = undefined; 9694 } 9695 9696 // The url can be an options object (which then must have .url) 9697 return jQuery.ajax( jQuery.extend( { 9698 url: url, 9699 type: method, 9700 dataType: type, 9701 data: data, 9702 success: callback 9703 }, jQuery.isPlainObject( url ) && url ) ); 9704 }; 9705} ); 9706 9707jQuery.ajaxPrefilter( function( s ) { 9708 var i; 9709 for ( i in s.headers ) { 9710 if ( i.toLowerCase() === "content-type" ) { 9711 s.contentType = s.headers[ i ] || ""; 9712 } 9713 } 9714} ); 9715 9716 9717jQuery._evalUrl = function( url, options, doc ) { 9718 return jQuery.ajax( { 9719 url: url, 9720 9721 // Make this explicit, since user can override this through ajaxSetup (trac-11264) 9722 type: "GET", 9723 dataType: "script", 9724 cache: true, 9725 async: false, 9726 global: false, 9727 9728 // Only evaluate the response if it is successful (gh-4126) 9729 // dataFilter is not invoked for failure responses, so using it instead 9730 // of the default converter is kludgy but it works. 9731 converters: { 9732 "text script": function() {} 9733 }, 9734 dataFilter: function( response ) { 9735 jQuery.globalEval( response, options, doc ); 9736 } 9737 } ); 9738}; 9739 9740 9741jQuery.fn.extend( { 9742 wrapAll: function( html ) { 9743 var wrap; 9744 9745 if ( this[ 0 ] ) { 9746 if ( isFunction( html ) ) { 9747 html = html.call( this[ 0 ] ); 9748 } 9749 9750 // The elements to wrap the target around 9751 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 9752 9753 if ( this[ 0 ].parentNode ) { 9754 wrap.insertBefore( this[ 0 ] ); 9755 } 9756 9757 wrap.map( function() { 9758 var elem = this; 9759 9760 while ( elem.firstElementChild ) { 9761 elem = elem.firstElementChild; 9762 } 9763 9764 return elem; 9765 } ).append( this ); 9766 } 9767 9768 return this; 9769 }, 9770 9771 wrapInner: function( html ) { 9772 if ( isFunction( html ) ) { 9773 return this.each( function( i ) { 9774 jQuery( this ).wrapInner( html.call( this, i ) ); 9775 } ); 9776 } 9777 9778 return this.each( function() { 9779 var self = jQuery( this ), 9780 contents = self.contents(); 9781 9782 if ( contents.length ) { 9783 contents.wrapAll( html ); 9784 9785 } else { 9786 self.append( html ); 9787 } 9788 } ); 9789 }, 9790 9791 wrap: function( html ) { 9792 var htmlIsFunction = isFunction( html ); 9793 9794 return this.each( function( i ) { 9795 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); 9796 } ); 9797 }, 9798 9799 unwrap: function( selector ) { 9800 this.parent( selector ).not( "body" ).each( function() { 9801 jQuery( this ).replaceWith( this.childNodes ); 9802 } ); 9803 return this; 9804 } 9805} ); 9806 9807 9808jQuery.expr.pseudos.hidden = function( elem ) { 9809 return !jQuery.expr.pseudos.visible( elem ); 9810}; 9811jQuery.expr.pseudos.visible = function( elem ) { 9812 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 9813}; 9814 9815 9816 9817 9818jQuery.ajaxSettings.xhr = function() { 9819 try { 9820 return new window.XMLHttpRequest(); 9821 } catch ( e ) {} 9822}; 9823 9824var xhrSuccessStatus = { 9825 9826 // File protocol always yields status code 0, assume 200 9827 0: 200, 9828 9829 // Support: IE <=9 only 9830 // trac-1450: sometimes IE returns 1223 when it should be 204 9831 1223: 204 9832 }, 9833 xhrSupported = jQuery.ajaxSettings.xhr(); 9834 9835support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 9836support.ajax = xhrSupported = !!xhrSupported; 9837 9838jQuery.ajaxTransport( function( options ) { 9839 var callback, errorCallback; 9840 9841 // Cross domain only allowed if supported through XMLHttpRequest 9842 if ( support.cors || xhrSupported && !options.crossDomain ) { 9843 return { 9844 send: function( headers, complete ) { 9845 var i, 9846 xhr = options.xhr(); 9847 9848 xhr.open( 9849 options.type, 9850 options.url, 9851 options.async, 9852 options.username, 9853 options.password 9854 ); 9855 9856 // Apply custom fields if provided 9857 if ( options.xhrFields ) { 9858 for ( i in options.xhrFields ) { 9859 xhr[ i ] = options.xhrFields[ i ]; 9860 } 9861 } 9862 9863 // Override mime type if needed 9864 if ( options.mimeType && xhr.overrideMimeType ) { 9865 xhr.overrideMimeType( options.mimeType ); 9866 } 9867 9868 // X-Requested-With header 9869 // For cross-domain requests, seeing as conditions for a preflight are 9870 // akin to a jigsaw puzzle, we simply never set it to be sure. 9871 // (it can always be set on a per-request basis or even using ajaxSetup) 9872 // For same-domain requests, won't change header if already provided. 9873 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 9874 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 9875 } 9876 9877 // Set headers 9878 for ( i in headers ) { 9879 xhr.setRequestHeader( i, headers[ i ] ); 9880 } 9881 9882 // Callback 9883 callback = function( type ) { 9884 return function() { 9885 if ( callback ) { 9886 callback = errorCallback = xhr.onload = 9887 xhr.onerror = xhr.onabort = xhr.ontimeout = 9888 xhr.onreadystatechange = null; 9889 9890 if ( type === "abort" ) { 9891 xhr.abort(); 9892 } else if ( type === "error" ) { 9893 9894 // Support: IE <=9 only 9895 // On a manual native abort, IE9 throws 9896 // errors on any property access that is not readyState 9897 if ( typeof xhr.status !== "number" ) { 9898 complete( 0, "error" ); 9899 } else { 9900 complete( 9901 9902 // File: protocol always yields status 0; see trac-8605, trac-14207 9903 xhr.status, 9904 xhr.statusText 9905 ); 9906 } 9907 } else { 9908 complete( 9909 xhrSuccessStatus[ xhr.status ] || xhr.status, 9910 xhr.statusText, 9911 9912 // Support: IE <=9 only 9913 // IE9 has no XHR2 but throws on binary (trac-11426) 9914 // For XHR2 non-text, let the caller handle it (gh-2498) 9915 ( xhr.responseType || "text" ) !== "text" || 9916 typeof xhr.responseText !== "string" ? 9917 { binary: xhr.response } : 9918 { text: xhr.responseText }, 9919 xhr.getAllResponseHeaders() 9920 ); 9921 } 9922 } 9923 }; 9924 }; 9925 9926 // Listen to events 9927 xhr.onload = callback(); 9928 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); 9929 9930 // Support: IE 9 only 9931 // Use onreadystatechange to replace onabort 9932 // to handle uncaught aborts 9933 if ( xhr.onabort !== undefined ) { 9934 xhr.onabort = errorCallback; 9935 } else { 9936 xhr.onreadystatechange = function() { 9937 9938 // Check readyState before timeout as it changes 9939 if ( xhr.readyState === 4 ) { 9940 9941 // Allow onerror to be called first, 9942 // but that will not handle a native abort 9943 // Also, save errorCallback to a variable 9944 // as xhr.onerror cannot be accessed 9945 window.setTimeout( function() { 9946 if ( callback ) { 9947 errorCallback(); 9948 } 9949 } ); 9950 } 9951 }; 9952 } 9953 9954 // Create the abort callback 9955 callback = callback( "abort" ); 9956 9957 try { 9958 9959 // Do send the request (this may raise an exception) 9960 xhr.send( options.hasContent && options.data || null ); 9961 } catch ( e ) { 9962 9963 // trac-14683: Only rethrow if this hasn't been notified as an error yet 9964 if ( callback ) { 9965 throw e; 9966 } 9967 } 9968 }, 9969 9970 abort: function() { 9971 if ( callback ) { 9972 callback(); 9973 } 9974 } 9975 }; 9976 } 9977} ); 9978 9979 9980 9981 9982// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 9983jQuery.ajaxPrefilter( function( s ) { 9984 if ( s.crossDomain ) { 9985 s.contents.script = false; 9986 } 9987} ); 9988 9989// Install script dataType 9990jQuery.ajaxSetup( { 9991 accepts: { 9992 script: "text/javascript, application/javascript, " + 9993 "application/ecmascript, application/x-ecmascript" 9994 }, 9995 contents: { 9996 script: /\b(?:java|ecma)script\b/ 9997 }, 9998 converters: { 9999 "text script": function( text ) { 10000 jQuery.globalEval( text ); 10001 return text; 10002 } 10003 } 10004} ); 10005 10006// Handle cache's special case and crossDomain 10007jQuery.ajaxPrefilter( "script", function( s ) { 10008 if ( s.cache === undefined ) { 10009 s.cache = false; 10010 } 10011 if ( s.crossDomain ) { 10012 s.type = "GET"; 10013 } 10014} ); 10015 10016// Bind script tag hack transport 10017jQuery.ajaxTransport( "script", function( s ) { 10018 10019 // This transport only deals with cross domain or forced-by-attrs requests 10020 if ( s.crossDomain || s.scriptAttrs ) { 10021 var script, callback; 10022 return { 10023 send: function( _, complete ) { 10024 script = jQuery( "<script>" ) 10025 .attr( s.scriptAttrs || {} ) 10026 .prop( { charset: s.scriptCharset, src: s.url } ) 10027 .on( "load error", callback = function( evt ) { 10028 script.remove(); 10029 callback = null; 10030 if ( evt ) { 10031 complete( evt.type === "error" ? 404 : 200, evt.type ); 10032 } 10033 } ); 10034 10035 // Use native DOM manipulation to avoid our domManip AJAX trickery 10036 document.head.appendChild( script[ 0 ] ); 10037 }, 10038 abort: function() { 10039 if ( callback ) { 10040 callback(); 10041 } 10042 } 10043 }; 10044 } 10045} ); 10046 10047 10048 10049 10050var oldCallbacks = [], 10051 rjsonp = /(=)\?(?=&|$)|\?\?/; 10052 10053// Default jsonp settings 10054jQuery.ajaxSetup( { 10055 jsonp: "callback", 10056 jsonpCallback: function() { 10057 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); 10058 this[ callback ] = true; 10059 return callback; 10060 } 10061} ); 10062 10063// Detect, normalize options and install callbacks for jsonp requests 10064jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 10065 10066 var callbackName, overwritten, responseContainer, 10067 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 10068 "url" : 10069 typeof s.data === "string" && 10070 ( s.contentType || "" ) 10071 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 10072 rjsonp.test( s.data ) && "data" 10073 ); 10074 10075 // Handle iff the expected data type is "jsonp" or we have a parameter to set 10076 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 10077 10078 // Get callback name, remembering preexisting value associated with it 10079 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 10080 s.jsonpCallback() : 10081 s.jsonpCallback; 10082 10083 // Insert callback into url or form data 10084 if ( jsonProp ) { 10085 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 10086 } else if ( s.jsonp !== false ) { 10087 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 10088 } 10089 10090 // Use data converter to retrieve json after script execution 10091 s.converters[ "script json" ] = function() { 10092 if ( !responseContainer ) { 10093 jQuery.error( callbackName + " was not called" ); 10094 } 10095 return responseContainer[ 0 ]; 10096 }; 10097 10098 // Force json dataType 10099 s.dataTypes[ 0 ] = "json"; 10100 10101 // Install callback 10102 overwritten = window[ callbackName ]; 10103 window[ callbackName ] = function() { 10104 responseContainer = arguments; 10105 }; 10106 10107 // Clean-up function (fires after converters) 10108 jqXHR.always( function() { 10109 10110 // If previous value didn't exist - remove it 10111 if ( overwritten === undefined ) { 10112 jQuery( window ).removeProp( callbackName ); 10113 10114 // Otherwise restore preexisting value 10115 } else { 10116 window[ callbackName ] = overwritten; 10117 } 10118 10119 // Save back as free 10120 if ( s[ callbackName ] ) { 10121 10122 // Make sure that re-using the options doesn't screw things around 10123 s.jsonpCallback = originalSettings.jsonpCallback; 10124 10125 // Save the callback name for future use 10126 oldCallbacks.push( callbackName ); 10127 } 10128 10129 // Call if it was a function and we have a response 10130 if ( responseContainer && isFunction( overwritten ) ) { 10131 overwritten( responseContainer[ 0 ] ); 10132 } 10133 10134 responseContainer = overwritten = undefined; 10135 } ); 10136 10137 // Delegate to script 10138 return "script"; 10139 } 10140} ); 10141 10142 10143 10144 10145// Support: Safari 8 only 10146// In Safari 8 documents created via document.implementation.createHTMLDocument 10147// collapse sibling forms: the second one becomes a child of the first one. 10148// Because of that, this security measure has to be disabled in Safari 8. 10149// https://bugs.webkit.org/show_bug.cgi?id=137337 10150support.createHTMLDocument = ( function() { 10151 var body = document.implementation.createHTMLDocument( "" ).body; 10152 body.innerHTML = "<form></form><form></form>"; 10153 return body.childNodes.length === 2; 10154} )(); 10155 10156 10157// Argument "data" should be string of html 10158// context (optional): If specified, the fragment will be created in this context, 10159// defaults to document 10160// keepScripts (optional): If true, will include scripts passed in the html string 10161jQuery.parseHTML = function( data, context, keepScripts ) { 10162 if ( typeof data !== "string" ) { 10163 return []; 10164 } 10165 if ( typeof context === "boolean" ) { 10166 keepScripts = context; 10167 context = false; 10168 } 10169 10170 var base, parsed, scripts; 10171 10172 if ( !context ) { 10173 10174 // Stop scripts or inline event handlers from being executed immediately 10175 // by using document.implementation 10176 if ( support.createHTMLDocument ) { 10177 context = document.implementation.createHTMLDocument( "" ); 10178 10179 // Set the base href for the created document 10180 // so any parsed elements with URLs 10181 // are based on the document's URL (gh-2965) 10182 base = context.createElement( "base" ); 10183 base.href = document.location.href; 10184 context.head.appendChild( base ); 10185 } else { 10186 context = document; 10187 } 10188 } 10189 10190 parsed = rsingleTag.exec( data ); 10191 scripts = !keepScripts && []; 10192 10193 // Single tag 10194 if ( parsed ) { 10195 return [ context.createElement( parsed[ 1 ] ) ]; 10196 } 10197 10198 parsed = buildFragment( [ data ], context, scripts ); 10199 10200 if ( scripts && scripts.length ) { 10201 jQuery( scripts ).remove(); 10202 } 10203 10204 return jQuery.merge( [], parsed.childNodes ); 10205}; 10206 10207 10208/** 10209 * Load a url into a page 10210 */ 10211jQuery.fn.load = function( url, params, callback ) { 10212 var selector, type, response, 10213 self = this, 10214 off = url.indexOf( " " ); 10215 10216 if ( off > -1 ) { 10217 selector = stripAndCollapse( url.slice( off ) ); 10218 url = url.slice( 0, off ); 10219 } 10220 10221 // If it's a function 10222 if ( isFunction( params ) ) { 10223 10224 // We assume that it's the callback 10225 callback = params; 10226 params = undefined; 10227 10228 // Otherwise, build a param string 10229 } else if ( params && typeof params === "object" ) { 10230 type = "POST"; 10231 } 10232 10233 // If we have elements to modify, make the request 10234 if ( self.length > 0 ) { 10235 jQuery.ajax( { 10236 url: url, 10237 10238 // If "type" variable is undefined, then "GET" method will be used. 10239 // Make value of this field explicit since 10240 // user can override it through ajaxSetup method 10241 type: type || "GET", 10242 dataType: "html", 10243 data: params 10244 } ).done( function( responseText ) { 10245 10246 // Save response for use in complete callback 10247 response = arguments; 10248 10249 self.html( selector ? 10250 10251 // If a selector was specified, locate the right elements in a dummy div 10252 // Exclude scripts to avoid IE 'Permission Denied' errors 10253 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 10254 10255 // Otherwise use the full result 10256 responseText ); 10257 10258 // If the request succeeds, this function gets "data", "status", "jqXHR" 10259 // but they are ignored because response was set above. 10260 // If it fails, this function gets "jqXHR", "status", "error" 10261 } ).always( callback && function( jqXHR, status ) { 10262 self.each( function() { 10263 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 10264 } ); 10265 } ); 10266 } 10267 10268 return this; 10269}; 10270 10271 10272 10273 10274jQuery.expr.pseudos.animated = function( elem ) { 10275 return jQuery.grep( jQuery.timers, function( fn ) { 10276 return elem === fn.elem; 10277 } ).length; 10278}; 10279 10280 10281 10282 10283jQuery.offset = { 10284 setOffset: function( elem, options, i ) { 10285 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 10286 position = jQuery.css( elem, "position" ), 10287 curElem = jQuery( elem ), 10288 props = {}; 10289 10290 // Set position first, in-case top/left are set even on static elem 10291 if ( position === "static" ) { 10292 elem.style.position = "relative"; 10293 } 10294 10295 curOffset = curElem.offset(); 10296 curCSSTop = jQuery.css( elem, "top" ); 10297 curCSSLeft = jQuery.css( elem, "left" ); 10298 calculatePosition = ( position === "absolute" || position === "fixed" ) && 10299 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 10300 10301 // Need to be able to calculate position if either 10302 // top or left is auto and position is either absolute or fixed 10303 if ( calculatePosition ) { 10304 curPosition = curElem.position(); 10305 curTop = curPosition.top; 10306 curLeft = curPosition.left; 10307 10308 } else { 10309 curTop = parseFloat( curCSSTop ) || 0; 10310 curLeft = parseFloat( curCSSLeft ) || 0; 10311 } 10312 10313 if ( isFunction( options ) ) { 10314 10315 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 10316 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 10317 } 10318 10319 if ( options.top != null ) { 10320 props.top = ( options.top - curOffset.top ) + curTop; 10321 } 10322 if ( options.left != null ) { 10323 props.left = ( options.left - curOffset.left ) + curLeft; 10324 } 10325 10326 if ( "using" in options ) { 10327 options.using.call( elem, props ); 10328 10329 } else { 10330 curElem.css( props ); 10331 } 10332 } 10333}; 10334 10335jQuery.fn.extend( { 10336 10337 // offset() relates an element's border box to the document origin 10338 offset: function( options ) { 10339 10340 // Preserve chaining for setter 10341 if ( arguments.length ) { 10342 return options === undefined ? 10343 this : 10344 this.each( function( i ) { 10345 jQuery.offset.setOffset( this, options, i ); 10346 } ); 10347 } 10348 10349 var rect, win, 10350 elem = this[ 0 ]; 10351 10352 if ( !elem ) { 10353 return; 10354 } 10355 10356 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 10357 // Support: IE <=11 only 10358 // Running getBoundingClientRect on a 10359 // disconnected node in IE throws an error 10360 if ( !elem.getClientRects().length ) { 10361 return { top: 0, left: 0 }; 10362 } 10363 10364 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 10365 rect = elem.getBoundingClientRect(); 10366 win = elem.ownerDocument.defaultView; 10367 return { 10368 top: rect.top + win.pageYOffset, 10369 left: rect.left + win.pageXOffset 10370 }; 10371 }, 10372 10373 // position() relates an element's margin box to its offset parent's padding box 10374 // This corresponds to the behavior of CSS absolute positioning 10375 position: function() { 10376 if ( !this[ 0 ] ) { 10377 return; 10378 } 10379 10380 var offsetParent, offset, doc, 10381 elem = this[ 0 ], 10382 parentOffset = { top: 0, left: 0 }; 10383 10384 // position:fixed elements are offset from the viewport, which itself always has zero offset 10385 if ( jQuery.css( elem, "position" ) === "fixed" ) { 10386 10387 // Assume position:fixed implies availability of getBoundingClientRect 10388 offset = elem.getBoundingClientRect(); 10389 10390 } else { 10391 offset = this.offset(); 10392 10393 // Account for the *real* offset parent, which can be the document or its root element 10394 // when a statically positioned element is identified 10395 doc = elem.ownerDocument; 10396 offsetParent = elem.offsetParent || doc.documentElement; 10397 while ( offsetParent && 10398 ( offsetParent === doc.body || offsetParent === doc.documentElement ) && 10399 jQuery.css( offsetParent, "position" ) === "static" ) { 10400 10401 offsetParent = offsetParent.parentNode; 10402 } 10403 if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { 10404 10405 // Incorporate borders into its offset, since they are outside its content origin 10406 parentOffset = jQuery( offsetParent ).offset(); 10407 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); 10408 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); 10409 } 10410 } 10411 10412 // Subtract parent offsets and element margins 10413 return { 10414 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 10415 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 10416 }; 10417 }, 10418 10419 // This method will return documentElement in the following cases: 10420 // 1) For the element inside the iframe without offsetParent, this method will return 10421 // documentElement of the parent window 10422 // 2) For the hidden or detached element 10423 // 3) For body or html element, i.e. in case of the html node - it will return itself 10424 // 10425 // but those exceptions were never presented as a real life use-cases 10426 // and might be considered as more preferable results. 10427 // 10428 // This logic, however, is not guaranteed and can change at any point in the future 10429 offsetParent: function() { 10430 return this.map( function() { 10431 var offsetParent = this.offsetParent; 10432 10433 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 10434 offsetParent = offsetParent.offsetParent; 10435 } 10436 10437 return offsetParent || documentElement; 10438 } ); 10439 } 10440} ); 10441 10442// Create scrollLeft and scrollTop methods 10443jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 10444 var top = "pageYOffset" === prop; 10445 10446 jQuery.fn[ method ] = function( val ) { 10447 return access( this, function( elem, method, val ) { 10448 10449 // Coalesce documents and windows 10450 var win; 10451 if ( isWindow( elem ) ) { 10452 win = elem; 10453 } else if ( elem.nodeType === 9 ) { 10454 win = elem.defaultView; 10455 } 10456 10457 if ( val === undefined ) { 10458 return win ? win[ prop ] : elem[ method ]; 10459 } 10460 10461 if ( win ) { 10462 win.scrollTo( 10463 !top ? val : win.pageXOffset, 10464 top ? val : win.pageYOffset 10465 ); 10466 10467 } else { 10468 elem[ method ] = val; 10469 } 10470 }, method, val, arguments.length ); 10471 }; 10472} ); 10473 10474// Support: Safari <=7 - 9.1, Chrome <=37 - 49 10475// Add the top/left cssHooks using jQuery.fn.position 10476// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 10477// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 10478// getComputedStyle returns percent when specified for top/left/bottom/right; 10479// rather than make the css module depend on the offset module, just check for it here 10480jQuery.each( [ "top", "left" ], function( _i, prop ) { 10481 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 10482 function( elem, computed ) { 10483 if ( computed ) { 10484 computed = curCSS( elem, prop ); 10485 10486 // If curCSS returns percentage, fallback to offset 10487 return rnumnonpx.test( computed ) ? 10488 jQuery( elem ).position()[ prop ] + "px" : 10489 computed; 10490 } 10491 } 10492 ); 10493} ); 10494 10495 10496// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 10497jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 10498 jQuery.each( { 10499 padding: "inner" + name, 10500 content: type, 10501 "": "outer" + name 10502 }, function( defaultExtra, funcName ) { 10503 10504 // Margin is only for outerHeight, outerWidth 10505 jQuery.fn[ funcName ] = function( margin, value ) { 10506 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 10507 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 10508 10509 return access( this, function( elem, type, value ) { 10510 var doc; 10511 10512 if ( isWindow( elem ) ) { 10513 10514 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 10515 return funcName.indexOf( "outer" ) === 0 ? 10516 elem[ "inner" + name ] : 10517 elem.document.documentElement[ "client" + name ]; 10518 } 10519 10520 // Get document width or height 10521 if ( elem.nodeType === 9 ) { 10522 doc = elem.documentElement; 10523 10524 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 10525 // whichever is greatest 10526 return Math.max( 10527 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 10528 elem.body[ "offset" + name ], doc[ "offset" + name ], 10529 doc[ "client" + name ] 10530 ); 10531 } 10532 10533 return value === undefined ? 10534 10535 // Get width or height on the element, requesting but not forcing parseFloat 10536 jQuery.css( elem, type, extra ) : 10537 10538 // Set width or height on the element 10539 jQuery.style( elem, type, value, extra ); 10540 }, type, chainable ? margin : undefined, chainable ); 10541 }; 10542 } ); 10543} ); 10544 10545 10546jQuery.each( [ 10547 "ajaxStart", 10548 "ajaxStop", 10549 "ajaxComplete", 10550 "ajaxError", 10551 "ajaxSuccess", 10552 "ajaxSend" 10553], function( _i, type ) { 10554 jQuery.fn[ type ] = function( fn ) { 10555 return this.on( type, fn ); 10556 }; 10557} ); 10558 10559 10560 10561 10562jQuery.fn.extend( { 10563 10564 bind: function( types, data, fn ) { 10565 return this.on( types, null, data, fn ); 10566 }, 10567 unbind: function( types, fn ) { 10568 return this.off( types, null, fn ); 10569 }, 10570 10571 delegate: function( selector, types, data, fn ) { 10572 return this.on( types, selector, data, fn ); 10573 }, 10574 undelegate: function( selector, types, fn ) { 10575 10576 // ( namespace ) or ( selector, types [, fn] ) 10577 return arguments.length === 1 ? 10578 this.off( selector, "**" ) : 10579 this.off( types, selector || "**", fn ); 10580 }, 10581 10582 hover: function( fnOver, fnOut ) { 10583 return this
vendor: 2,585 bytes, lines 10583-10677
10583 10584 .on( "mouseenter", fnOver ) 10585 .on( "mouseleave", fnOut || fnOver ); 10586 } 10587} ); 10588 10589jQuery.each( 10590 ( "blur focus focusin focusout resize scroll click dblclick " + 10591 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 10592 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 10593 function( _i, name ) { 10594 10595 // Handle event binding 10596 jQuery.fn[ name ] = function( data, fn ) { 10597 return arguments.length > 0 ? 10598 this.on( name, null, data, fn ) : 10599 this.trigger( name ); 10600 }; 10601 } 10602); 10603 10604 10605 10606 10607// Support: Android <=4.0 only 10608// Make sure we trim BOM and NBSP 10609// Require that the "whitespace run" starts from a non-whitespace 10610// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. 10611var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; 10612 10613// Bind a function to a context, optionally partially applying any 10614// arguments. 10615// jQuery.proxy is deprecated to promote standards (specifically Function#bind) 10616// However, it is not slated for removal any time soon 10617jQuery.proxy = function( fn, context ) { 10618 var tmp, args, proxy; 10619 10620 if ( typeof context === "string" ) { 10621 tmp = fn[ context ]; 10622 context = fn; 10623 fn = tmp; 10624 } 10625 10626 // Quick check to determine if target is callable, in the spec 10627 // this throws a TypeError, but we will just return undefined. 10628 if ( !isFunction( fn ) ) { 10629 return undefined; 10630 } 10631 10632 // Simulated bind 10633 args = slice.call( arguments, 2 ); 10634 proxy = function() { 10635 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 10636 }; 10637 10638 // Set the guid of unique handler to the same of original handler, so it can be removed 10639 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 10640 10641 return proxy; 10642}; 10643 10644jQuery.holdReady = function( hold ) { 10645 if ( hold ) { 10646 jQuery.readyWait++; 10647 } else { 10648 jQuery.ready( true ); 10649 } 10650}; 10651jQuery.isArray = Array.isArray; 10652jQuery.parseJSON = JSON.parse; 10653jQuery.nodeName = nodeName; 10654jQuery.isFunction = isFunction; 10655jQuery.isWindow = isWindow; 10656jQuery.camelCase = camelCase; 10657jQuery.type = toType; 10658 10659jQuery.now = Date.now; 10660 10661jQuery.isNumeric = function( obj ) { 10662 10663 // As of jQuery 3.0, isNumeric is limited to 10664 // strings and numbers (primitives or objects) 10665 // that can be coerced to finite numbers (gh-2662) 10666 var type = jQuery.type( obj ); 10667 return ( type === "number" || type === "string" ) && 10668 10669 // parseFloat NaNs numeric-cast false positives ("") 10670 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 10671 // subtraction forces infinities to NaN 10672 !isNaN( obj - parseFloat( obj ) ); 10673}; 10674 10675jQuery.trim = function( text ) { 10676 return text == null ? 10677 "" :
10678 ( text + "" ).replace( rtrim, "$1" ); 10679}; 10680 10681 10682 10683// Register as a named AMD module, since jQuery can be concatenated with other 10684// files that may use define, but not via a proper concatenation script that 10685// understands anonymous AMD modules. A named AMD is safest and most robust 10686// way to register. Lowercase jquery is used because AMD module names are 10687// derived from file names, and jQuery is normally delivered in a lowercase 10688// file name. Do this after creating the global so that if an AMD module wants 10689// to call noConflict to hide this version of jQuery, it will work. 10690 10691// Note that for maximum portability, libraries that are not jQuery should 10692// declare themselves as anonymous modules, and avoid setting a global if an 10693// AMD loader is present. jQuery is a special case. For more information, see 10694// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 10695 10696if ( typeof define === "function" && define.amd ) { 10697 define( "jquery", [], function() { 10698 return jQuery; 10699 } ); 10700} 10701 10702 10703 10704 10705var 10706 10707 // Map over jQuery in case of overwrite 10708 _jQuery = window.jQuery, 10709 10710 // Map over the $ in case of overwrite 10711 _$ = window.$; 10712 10713jQuery.noConflict = function( deep ) { 10714 if ( window.$ === jQuery ) { 10715 window.$ = _$; 10716 } 10717 10718 if ( deep && window.jQuery === jQuery ) { 10719 window.jQuery = _jQuery; 10720 } 10721 10722 return jQuery; 10723}; 10724 10725// Expose jQuery and $ identifiers, even in AMD 10726// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) 10727// and CommonJS for browser emulators (trac-13566) 10728if ( typeof noGlobal === "undefined" ) { 10729 window.jQuery = window.$ = jQuery; 10730} 10731 10732 10733 10734 10735return jQuery; 10736} ); 10737jQuery.noConflict();</script>
10737
10737<script>window.addEventListener('DOMContentLoaded', function() {/*! jQuery Migrate v3.4.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ 10738"undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e,window)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery"),window):t(jQuery,window)}(function(s,n){"use strict";function e(e){return 0<=function(e,t){for(var r=/^(\d+)\.(\d+)\.(\d+)/,n=r.exec(e)||[],o=r.exec(t)||[],a=1;a<=3;a++){if(+o[a]<+n[a])return 1;if(+n[a]<+o[a])return-1}return 0}(s.fn.jquery,e)}s.migrateVersion="3.4.1";var t=Object.create(null);s.migrateDisablePatches=function(){for(var e=0;e<arguments.length;e++)t[arguments[e]]=!0},s.migrateEnablePatches=function(){for(var e=0;e<arguments.length;e++)delete t[arguments[e]]},s.migrateIsPatchEnabled=function(e){return!t[e]},n.console&&n.console.log&&(s&&e("3.0.0")&&!e("5.0.0")||n.console.log("JQMIGRATE: jQuery 3.x-4.x REQUIRED"),s.migrateWarnings&&n.console.log("JQMIGRATE: Migrate plugin loaded multiple times"),n.console.log("JQMIGRATE: Migrate is installed"+(s.migrateMute?"":" with logging active")+", version "+s.migrateVersion));var o={};function u(e,t){var r=n.console;!s.migrateIsPatchEnabled(e)||s.migrateDeduplicateWarnings&&o[t]||(o[t]=!0,s.migrateWarnings.push(t+" ["+e+"]"),r&&r.warn&&!s.migrateMute&&(r.warn("JQMIGRATE: "+t),s.migrateTrace&&r.trace&&r.trace()))}function r(e,t,r,n,o){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){return u(n,o),r},set:function(e){u(n,o),r=e}})}function a(e,t,r,n,o){var a=e[t];e[t]=function(){return o&&u(n,o),(s.migrateIsPatchEnabled(n)?r:a||s.noop).apply(this,arguments)}}function c(e,t,r,n,o){if(!o)throw new Error("No warning message provided");return a(e,t,r,n,o),0}function i(e,t,r,n){return a(e,t,r,n),0}s.migrateDeduplicateWarnings=!0,s.migrateWarnings=[],void 0===s.migrateTrace&&(s.migrateTrace=!0),s.migrateReset=function(){o={},s.migrateWarnings.length=0},"BackCompat"===n.document.compatMode&&u("quirks","jQuery is not compatible with Quirks Mode");var d,l,p,f={},m=s.fn.init,y=s.find,h=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,g=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,v=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;for(d in i(s.fn,"init",function(e){var t=Array.prototype.slice.call(arguments);return s.migrateIsPatchEnabled("selector-empty-id")&&"string"==typeof e&&"#"===e&&(u("selector-empty-id","jQuery( '#' ) is not a valid selector"),t[0]=[]),m.apply(this,t)},"selector-empty-id"),s.fn.init.prototype=s.fn,i(s,"find",function(t){var r=Array.prototype.slice.call(arguments);if("string"==typeof t&&h.test(t))try{n.document.querySelector(t)}catch(e){t=t.replace(g,function(e,t,r,n){return"["+t+r+'"'+n+'"]'});try{n.document.querySelector(t),u("selector-hash","Attribute selector with '#' must be quoted: "+r[0]),r[0]=t}catch(e){u("selector-hash","Attribute selector with '#' was not fixed: "+r[0])}}return y.apply(this,r)},"selector-hash"),y)Object.prototype.hasOwnProperty.call(y,d)&&(s.find[d]=y[d]);c(s.fn,"size",function(){return this.length},"size","jQuery.fn.size() is deprecated and removed; use the .length property"),c(s,"parseJSON",function(){return JSON.parse.apply(null,arguments)},"parseJSON","jQuery.parseJSON is deprecated; use JSON.parse"),c(s,"holdReady",s.holdReady,"holdReady","jQuery.holdReady is deprecated"),c(s,"unique",s.uniqueSort,"unique","jQuery.unique is deprecated; use jQuery.uniqueSort"),r(s.expr,"filters",s.expr.pseudos,"expr-pre-pseudos","jQuery.expr.filters is deprecated; use jQuery.expr.pseudos"),r(s.expr,":",s.expr.pseudos,"expr-pre-pseudos","jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos"),e("3.1.1")&&c(s,"trim",function(e){return null==e?"":(e+"").replace(v,"$1")},"trim","jQuery.trim is deprecated; use String.prototype.trim"),e("3.2.0")&&(c(s,"nodeName",function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},"nodeName","jQuery.nodeName is deprecated"),c(s,"isArray",Array.isArray,"isArray","jQuery.isArray is deprecated; use Array.isArray")),e("3.3.0")&&(c(s,"isNumeric",function(e){var t=typeof e;return("number"==t||"string"==t)&&!isNaN(e-parseFloat(e))},"isNumeric","jQuery.isNumeric() is deprecated"),s.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){f["[object "+t+"]"]=t.toLowerCase()}),c(s,"type",function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?f[Object.prototype.toString.call(e)]||"object":typeof e},"type","jQuery.type is deprecated"),c(s,"isFunction",function(e){return"function"==typeof e},"isFunction","jQuery.isFunction() is deprecated"),c(s,"isWindow",function(e){return null!=e&&e===e.window}
10738,"isWindow","jQuery.isWindow() is deprecated")),s.ajax&&(l=s.ajax,p=/(=)\?(?=&|$)|\?\?/,i(s,"ajax",function(){var e=l.apply(this,arguments);return e.promise&&(c(e,"success",e.done,"jqXHR-methods","jQXHR.success is deprecated and removed"),c(e,"error",e.fail,"jqXHR-methods","jQXHR.error is deprecated and removed"),c(e,"complete",e.always,"jqXHR-methods","jQXHR.complete is deprecated and removed")),e},"jqXHR-methods"),e("4.0.0")||s.ajaxPrefilter("+json",function(e){!1!==e.jsonp&&(p.test(e.url)||"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&p.test(e.data))&&u("jsonp-promotion","JSON-to-JSONP auto-promotion is deprecated")}));var j=s.fn.removeAttr,b=s.fn.toggleClass,w=/\S+/g;function x(e){return e.replace(/-([a-z])/g,function(e,t){return t.toUpperCase()})}i(s.fn,"removeAttr",function(e){var r=this,n=!1;return s.each(e.match(w),function(e,t){s.expr.match.bool.test(t)&&r.each(function(){if(!1!==s(this).prop(t))return!(n=!0)}),n&&(u("removeAttr-bool","jQuery.fn.removeAttr no longer sets boolean properties: "+t),r.prop(t,!1))}),j.apply(this,arguments)},"removeAttr-bool"),i(s.fn,"toggleClass",function(t){return void 0!==t&&"boolean"!=typeof t?b.apply(this,arguments):(u("toggleClass-bool","jQuery.fn.toggleClass( boolean ) is deprecated"),this.each(function(){var e=this.getAttribute&&this.getAttribute("class")||"";e&&s.data(this,"__className__",e),this.setAttribute&&this.setAttribute("class",!e&&!1!==t&&s.data(this,"__className__")||"")}))},"toggleClass-bool");var Q,A,R=!1,C=/^[a-z]/,N=/^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;s.swap&&s.each(["height","width","reliableMarginRight"],function(e,t){var r=s.cssHooks[t]&&s.cssHooks[t].get;r&&(s.cssHooks[t].get=function(){var e;return R=!0,e=r.apply(this,arguments),R=!1,e})}),i(s,"swap",function(e,t,r,n){var o,a,i={};for(a in R||u("swap","jQuery.swap() is undocumented and deprecated"),t)i[a]=e.style[a],e.style[a]=t[a];for(a in o=r.apply(e,n||[]),t)e.style[a]=i[a];return o},"swap"),e("3.4.0")&&"undefined"!=typeof Proxy&&(s.cssProps=new Proxy(s.cssProps||{},{set:function(){return u("cssProps","jQuery.cssProps is deprecated"),Reflect.set.apply(this,arguments)}})),e("4.0.0")?(A={animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},"undefined"!=typeof Proxy?s.cssNumber=new Proxy(A,{get:function(){return u("css-number","jQuery.cssNumber is deprecated"),Reflect.get.apply(this,arguments)},set:function(){return u("css-number","jQuery.cssNumber is deprecated"),Reflect.set.apply(this,arguments)}}):s.cssNumber=A):A=s.cssNumber,Q=s.fn.css,i(s.fn,"css",function(e,t){var r,n,o=this;return e&&"object"==typeof e&&!Array.isArray(e)?(s.each(e,function(e,t){s.fn.css.call(o,e,t)}),this):("number"==typeof t&&(r=x(e),n=r,C.test(n)&&N.test(n[0].toUpperCase()+n.slice(1))||A[r]||u("css-number",'Number-typed values are deprecated for jQuery.fn.css( "'+e+'", value )')),Q.apply(this,arguments))},"css-number");var S,P,k,H,E=s.data;i(s,"data",function(e,t,r){var n,o,a;if(t&&"object"==typeof t&&2===arguments.length){for(a in n=s.hasData(e)&&E.call(this,e),o={},t)a!==x(a)?(u("data-camelCase","jQuery.data() always sets/gets camelCased names: "+a),n[a]=t[a]):o[a]=t[a];return E.call(this,e,o),t}return t&&"string"==typeof t&&t!==x(t)&&(n=s.hasData(e)&&E.call(this,e))&&t in n?(u("data-camelCase","jQuery.data() always sets/gets camelCased names: "+t),2<arguments.length&&(n[t]=r),n[t]):E.apply(this,arguments)},"data-camelCase"),s.fx&&(k=s.Tween.prototype.run,H=function(e){return e},i(s.Tween.prototype,"run",function(){1<s.easing[this.easing].length&&(u("easing-one-arg","'jQuery.easing."+this.easing.toString()+"' should use only one argument"),s.easing[this.easing]=H),k.apply(this,arguments)},"easing-one-arg"),S=s.fx.interval,P="jQuery.fx.interval is deprecated",n.requestAnimationFrame&&Object.defineProperty(s.fx,"interval",{configurable:!0,enumerable:!0,get:function(){return n.document.hidden||u("fx-interval",P),s.migrateIsPatchEnabled("fx-interval")&&void 0===S?13:S},set:function(e){u("fx-interval",P),S=e}}));var M=s.fn.load,q=s.event.add,O=s.event.fix;s.event.props=[],s.event.fixHooks={}
10738,r(s.event.props,"concat",s.event.props.concat,"event-old-patch","jQuery.event.props.concat() is deprecated and removed"),i(s.event,"fix",function(e){var t,r=e.type,n=this.fixHooks[r],o=s.event.props;if(o.length){u("event-old-patch","jQuery.event.props are deprecated and removed: "+o.join());while(o.length)s.event.addProp(o.pop())}if(n&&!n._migrated_&&(n._migrated_=!0,u("event-old-patch","jQuery.event.fixHooks are deprecated and removed: "+r),(o=n.props)&&o.length))while(o.length)s.event.addProp(o.pop());return t=O.call(this,e),n&&n.filter?n.filter(t,e):t},"event-old-patch"),i(s.event,"add",function(e,t){return e===n&&"load"===t&&"complete"===n.document.readyState&&u("load-after-event","jQuery(window).on('load'...) called after load event occurred"),q.apply(this,arguments)},"load-after-event"),s.each(["load","unload","error"],function(e,t){i(s.fn,t,function(){var e=Array.prototype.slice.call(arguments,0);return"load"===t&&"string"==typeof e[0]?M.apply(this,e):(u("shorthand-removed-v3","jQuery.fn."+t+"() is deprecated"),e.splice(0,0,t),arguments.length?this.on.apply(this,e):(this.triggerHandler.apply(this,e),this))},"shorthand-removed-v3")}),s.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,r){c(s.fn,r,function(e,t){return 0<arguments.length?this.on(r,null,e,t):this.trigger(r)},"shorthand-deprecated-v3","jQuery.fn."+r+"() event shorthand is deprecated")}),s(function(){s(n.document).triggerHandler("ready")}),s.event.special.ready={setup:function(){this===n.document&&u("ready-event","'ready' event is deprecated")}},c(s.fn,"bind",function(e,t,r){return this.on(e,null,t,r)},"pre-on-methods","jQuery.fn.bind() is deprecated"),c(s.fn,"unbind",function(e,t){return this.off(e,null,t)},"pre-on-methods","jQuery.fn.unbind() is deprecated"),c(s.fn,"delegate",function(e,t,r,n){return this.on(t,e,r,n)},"pre-on-methods","jQuery.fn.delegate() is deprecated"),c(s.fn,"undelegate",function(e,t,r){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",r)},"pre-on-methods","jQuery.fn.undelegate() is deprecated"),c(s.fn,"hover",function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)},"pre-on-methods","jQuery.fn.hover() is deprecated");function T(e){var t=n.document.implementation.createHTMLDocument("");return t.body.innerHTML=e,t.body&&t.body.innerHTML}var F=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi;s.UNSAFE_restoreLegacyHtmlPrefilter=function(){s.migrateEnablePatches("self-closed-tags")},i(s,"htmlPrefilter",function(e){var t,r;return(r=(t=e).replace(F,"<$1></$2>"))!==t&&T(t)!==T(r)&&u("self-closed-tags","HTML tags must be properly nested and closed: "+t),e.replace(F,"<$1></$2>")},"self-closed-tags"),s.migrateDisablePatches("self-closed-tags");var D,W,_,I=s.fn.offset;return i(s.fn,"offset",function(){var e=this[0];return!e||e.nodeType&&e.getBoundingClientRect?I.apply(this,arguments):(u("offset-valid-elem","jQuery.fn.offset() requires a valid DOM element"),arguments.length?this:void 0)},"offset-valid-elem"),s.ajax&&(D=s.param,i(s,"param",function(e,t){var r=s.ajaxSettings&&s.ajaxSettings.traditional;return void 0===t&&r&&(u("param-ajax-traditional","jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),t=r),D.call(this,e,t)},"param-ajax-traditional")),c(s.fn,"andSelf",s.fn.addBack,"andSelf","jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"),s.Deferred&&(W=s.Deferred,_=[["resolve","done",s.Callbacks("once memory"),s.Callbacks("once memory"),"resolved"],["reject","fail",s.Callbacks("once memory"),s.Callbacks("once memory"),"rejected"],["notify","progress",s.Callbacks("memory"),s.Callbacks("memory")]],i(s,"Deferred",function(e){var a=W(),i=a.promise();function t(){var o=arguments;return s.Deferred(function(n){s.each(_,function(e,t){var r="function"==typeof o[e]&&o[e];a[t[1]](function(){var e=r&&r.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[t[0]+"With"](this===i?n.promise():this,r?[e]:arguments)})}),o=null}).promise()}return c(a,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),c(i,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),e&&e.call(a,a),a},"deferred-pipe"),s.Deferred.exceptionHook=W.exceptionHook),s}); 10739});</script>
10739 10740 <!-- This site is optimized with the Yoast SEO plugin v28.5 - https://yoast.com/product/yoast-seo-wordpress/ --> 10741 <meta name="description" content="IMAGEM maakt complexe vraagstukken inzichtelijk door data, domeinkennis en technologie te verbinden. Zo ontstaat overzicht en betere besluitvorming." /> 10742 <link rel="canonical" href="https://imagem.nl/" /> 10743 <meta property="og:locale" content="nl_NL" /> 10744 <meta property="og:type" content="website" /> 10745 <meta property="og:title" content="IMAGEM | Van complexe data naar heldere inzichten" /> 10746 <meta property="og:description" content="IMAGEM maakt complexe vraagstukken inzichtelijk door data, domeinkennis en technologie te verbinden. Zo ontstaat overzicht en betere besluitvorming." /> 10747 <meta property="og:url" content="https://imagem.nl/" /> 10748 <meta property="og:site_name" content="IMAGEM" /> 10749 <meta property="article:modified_time" content="2026-06-16T08:52:39+00:00" /> 10750 <meta name="twitter:card" content="summary_large_image" /> 10751
10751<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/imagem.nl\/","url":"https:\/\/imagem.nl\/","name":"IMAGEM | Van complexe data naar heldere inzichten","isPartOf":{"@id":"https:\/\/imagem.nl\/#website"},"about":{"@id":"https:\/\/imagem.nl\/#organization"},"datePublished":"2025-09-09T14:14:52+00:00","dateModified":"2026-06-16T08:52:39+00:00","description":"IMAGEM maakt complexe vraagstukken inzichtelijk door data, domeinkennis en technologie te verbinden. Zo ontstaat overzicht en betere besluitvorming.","breadcrumb":{"@id":"https:\/\/imagem.nl\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/imagem.nl\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/imagem.nl\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home"}]},{"@type":"WebSite","@id":"https:\/\/imagem.nl\/#website","url":"https:\/\/imagem.nl\/","name":"IMAGEM","description":"","publisher":{"@id":"https:\/\/imagem.nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/imagem.nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/imagem.nl\/#organization","name":"IMAGEM","url":"https:\/\/imagem.nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/imagem.nl\/#\/schema\/logo\/image\/","url":"https:\/\/imagem.nl\/wp-content\/uploads\/2025\/09\/imagem-logo.svg","contentUrl":"https:\/\/imagem.nl\/wp-content\/uploads\/2025\/09\/imagem-logo.svg","width":1,"height":1,"caption":"IMAGEM"},"image":{"@id":"https:\/\/imagem.nl\/#\/schema\/logo\/image\/"}}]}</script>
10751 10752 <!-- / Yoast SEO plugin. --> 10753 10754 10755<link rel='dns-prefetch' href='//kit.fontawesome.com' /> 10756<link rel='dns-prefetch' href='//cdn.bureaumax.nl' /> 10757 10758<link rel="alternate" type="application/rss+xml" title="IMAGEM » feed" href="https://imagem.nl/feed/" /> 10759<link rel="alternate" type="application/rss+xml" title="IMAGEM » reacties feed" href="https://imagem.nl/comments/feed/" /> 10760<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://imagem.nl/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fimagem.nl%2F" /> 10761<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://imagem.nl/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fimagem.nl%2F&format=xml" /> 10762<style id="wp-img-auto-sizes-contain-inline-css"></style> 10763<style id="wp-block-library-inline-css"></style> 10764<style id="wp-block-heading-inline-css"></style> 10765<style id="wp-block-paragraph-inline-css"></style> 10766<style id="wp-block-columns-inline-css"></style> 10767<style id="wp-block-spacer-inline-css"></style> 10768 10769<style id="classic-theme-styles-inline-css"></style> 10770 10771<style id="global-styles-inline-css"></style> 10772 10773 10774 10775 10776 10777 10778 10779 10780
10781<script data-minify="1" id="wp-weglot-js-js" src="https://imagem.nl/wp-content/cache/min/1/wp-content/plugins/weglot/dist/front-js.js?ver=1790581408" data-rocket-defer defer></script>
vendor: 1 bytes, line 10781
10781
10782<script id="kit_fontawesome-js" src="https://kit.fontawesome.com/5d96198642.js"></script>
vendor: 1 bytes, line 10782
10782
10783<script id="swiper_script-js" src="https://cdn.bureaumax.nl/libs/swiper/swiper-bundle.min.js"></script>
vendor: 1 bytes, line 10783
10783
10784<script id="lazysizes-js-before"> 10785document.addEventListener('lazybeforesizes', function(e) { 10786 var elem = e.target; 10787 if (!elem.offsetWidth || !elem.offsetHeight) return; 10788 var attrW = parseInt(elem.getAttribute('width'), 10) || 0; 10789 var attrH = parseInt(elem.getAttribute('height'), 10) || 0; 10790 if (!attrW || !attrH) return; 10791 var sourceRatio = attrW / attrH; 10792 var neededWidth = Math.round(elem.offsetHeight * sourceRatio); 10793 if (neededWidth > elem.offsetWidth) { 10794 e.detail.width = Math.round(e.detail.width * (neededWidth / elem.offsetWidth)); 10795 } 10796}); 10797//# sourceURL=lazysizes-js-before 10798</script>
vendor: 1 bytes, line 10798
10798
10799<script id="lazysizes-js" src="https://cdn.bureaumax.nl/libs/lazysizes/lazysizes.min.js"></script>
vendor: 1 bytes, line 10799
10799
10800<script id="fancybox-js" src="https://cdn.bureaumax.nl/libs/@fancyapps/ui/dist/fancybox/fancybox.umd.js"></script>
vendor: 1 bytes, line 10800
10800
10801<script id="imagesloaded-js" src="https://cdn.bureaumax.nl/libs/imagesloaded/imagesloaded.pkgd.min.js"></script>
vendor: 1 bytes, line 10801
10801
10802<script id="isotope-js" src="https://cdn.bureaumax.nl/libs/isotope-layout/dist/isotope.pkgd.min.js"></script>
vendor: 1 bytes, line 10802
10802
10803<script id="aos_script-js" src="https://cdn.bureaumax.nl/libs/aos/dist/aos.js"></script>
vendor: 1 bytes, line 10803
10803
10804<script data-minify="1" id="synergy.aos-js" src="https://imagem.nl/wp-content/cache/min/1/wp-content/themes/imagem/scripts/synergy.aos.js?ver=1790581408" data-rocket-defer defer></script>
vendor: 1 bytes, line 10804
10804
10805<script data-minify="1" id="synergy.main-js" src="https://imagem.nl/wp-content/cache/min/1/wp-content/themes/imagem/scripts/synergy.main.js?ver=1790581408" data-rocket-defer defer></script>
vendor: 1 bytes, line 10805
10805
10806<script id="maxwp_init-js-extra"> 10807var maxwp_info = {"uri":"https://imagem.nl/cms/","theme_uri":"https://imagem.nl/wp-content/themes/imagem/","style_uri":"https://imagem.nl/wp-content/themes/imagem/","ajax":"https://imagem.nl/cms/wp-admin/admin-ajax.php","maxwp_ajax":"https://imagem.nl/wp-content/mu-plugins/max_wp/maxwp_ajax.php","nonce":"52016a2bd0","id":"452","maps_api":""}; 10808//# sourceURL=maxwp_init-js-extra 10809</script>
vendor: 1 bytes, line 10809
10809
10810<script data-minify="1" id="maxwp_init-js" src="https://imagem.nl/wp-content/cache/min/1/wp-content/mu-plugins/max_wp/scripts/maxwp_init.js?ver=1790581408" data-rocket-defer defer></script>
10810 10811<link rel="https://api.w.org/" href="https://imagem.nl/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://imagem.nl/wp-json/wp/v2/pages/452" /><link rel='shortlink' href='https://imagem.nl/' /> 10812 <style>.cmplz-hidden { 10813 display: none !important; 10814 }</style> 10815 10816<link rel="alternate" href="https://imagem.nl/" hreflang="nl"/> 10817<link rel="alternate" href="https://imagem.nl/en/" hreflang="en"/>
10818<script type="application/json" id="weglot-data">{"website":"https:\/\/imagem.nl","uid":"7385d04c25","project_slug":"imagem","deleted_at":null,"language_from":"nl","language_from_custom_flag":null,"language_from_custom_name":null,"auto_switch":false,"auto_switch_fallback":null,"translation_engine":3,"excluded_paths":[],"excluded_blocks":[],"dynamics":[],"custom_settings":{"switchers":[{"templates":{"name":"default","hash":"63e0a1891f5522181649c08d955b777e4a36bcb6"},"location":[],"style":{"with_flags":false,"flag_type":"rectangle_mat","with_name":true,"full_name":false,"is_dropdown":true}}],"definitions":[],"button_style":{"flag_type":"rectangle_mat","full_name":false,"with_name":true,"with_flags":false,"is_dropdown":true},"translate_amp":false,"translate_email":false,"wp_user_version":"5.3","translate_search":false,"ai_disclaimer_selector":""},"media_enabled":false,"external_enabled":false,"page_views_enabled":false,"versions":{"translation":1780488476},"pending_translation_enabled":false,"curl_ssl_check_enabled":true,"custom_css":"","languages":[{"language_to":"en","custom_code":null,"custom_name":null,"custom_local_name":null,"provider":null,"enabled":true,"automatic_translation_enabled":true,"deleted_at":null,"connect_host_destination":null,"custom_flag":null}],"category":7,"organization_slug":"w-9b41e1e14c","technology_id":1,"technology_name":"WordPress","api_domain":"cdn-api-weglot.com","api_base_url":"https:\/\/cdn-api-weglot.com","product":"1.0","current_language":"nl","switcher_links":{"nl":"https:\/\/imagem.nl\/","en":"https:\/\/imagem.nl\/en\/"},"original_path":"\/"}</script>
10818 <link rel="icon" type="image/png" sizes="96x96" 10819 href="https://imagem.nl/wp-content/themes/imagem/graphics/favicon/favicon-96x96.png"> 10820 <link rel="icon" type="image/svg+xml" 10821 href="https://imagem.nl/wp-content/themes/imagem/graphics/favicon/favicon.svg"> 10822 <link rel="shortcut icon" 10823 href="https://imagem.nl/wp-content/themes/imagem/graphics/favicon/favicon.ico"> 10824 <link rel="apple-touch-icon" sizes="180x180" 10825 href="https://imagem.nl/wp-content/themes/imagem/graphics/favicon/apple-touch-icon.png"> 10826 <meta name="apple-mobile-web-app-title" content="IMAGEM"> 10827 <link rel="manifest" href='https://imagem.nl/wp-content/themes/imagem/graphics/favicon/site.webmanifest' /> 10828 <noscript><style id="rocket-lazyload-nojs-css">.rll-youtube-player, [data-lazy-src]{display:none !important;}</style></noscript> 10829<style id="core-block-supports-inline-css"> 10830.wp-container-core-columns-is-layout-8f761849{flex-wrap:nowrap;} 10831/*# sourceURL=core-block-supports-inline-css */ 10832</style> 10833 10834<style id="rocket-lazyrender-inline-css">[data-wpr-lazyrender] {content-visibility: auto;}</style><meta name="generator" content="WP Rocket 3.23.3.3" data-wpr-features="wpr_remove_unused_css wpr_defer_js wpr_minify_js wpr_lazyload_images wpr_lazyload_iframes wpr_preconnect_external_domains wpr_automatic_lazy_rendering wpr_oci wpr_minify_css wpr_cdn wpr_preload_links wpr_host_fonts_locally wpr_desktop" /></head> 10835<body data-cmplz=1 class="home wp-singular page-template-default page page-id-452 wp-embed-responsive wp-theme-imagem has-hero header-overlay header-dark"> 10836 <a href="#content-wrapper" class="skip-link">Naar inhoud</a> 10837 <a href="#footer" class="skip-link">Naar footer</a> 10838<svg aria-hidden="true" style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1" 10839 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 10840 <defs> 10841 <symbol id="icon-arrow-right" viewBox="0 0 20 20"> 10842 <path d="M16.172 9l-6.071-6.071 1.414-1.414 8.485 8.485-8.485 8.485-1.414-1.414 6.071-6.071h-16.172v-2z"></path> 10843 </symbol> 10844 <symbol id="icon-arrow-left" viewBox="0 0 20 20"> 10845 <path d="M3.828 9l6.071-6.071-1.414-1.414-8.485 8.485 8.485 8.485 1.414-1.414-6.071-6.071h16.172v-2h-16.172z"></path> 10846 </symbol> 10847 </defs> 10848</svg><div id="wrapper" class="d-flex flex-column"> 10849 <header id="header"> 10850 <section class="header-container"> 10851 <div class="container"> 10852 <div class="d-flex justify-content-between"> 10853 <div class="header-left d-flex flex-column"> 10854 <a id="logo" href="https://imagem.nl/" title="Naar de homepagina van: IMAGEM " aria-label="Naar de homepagina van: %"> 10855 <div class="logo"><svg width="185" height="58" viewBox="0 0 185 58" fill="none" xmlns="http://www.w3.org/2000/svg"> 10856 <g class="logo-text" fill="black"> 10857 <path d="M4.0329 20.2573H0.00292969V41.5215H4.0329V20.2573Z"/> 10858 <path d="M6.99121 20.2573H11.2371L18.0496 37.1461L24.8622 20.2573H29.1001V41.5215H25.198V28.5147C25.0141 29.0636 24.1586 31.7684 24.1586 31.7684L19.9767 41.5215H16.1226L11.9407 31.7843C11.9407 31.7843 11.0851 29.0796 10.9012 28.5306V41.5215H6.99121V20.2573Z"/> 10859 <path d="M38.5992 32.381H44.1004L42.1254 27.2737C42.1254 27.2737 41.7336 26.2396 41.3258 24.9667C40.926 26.2396 40.5262 27.2737 40.5262 27.2737L38.5992 32.381ZM39.3988 20.2573H43.2528L51.8885 41.5215H47.6106L45.4757 35.9528H37.2239L35.0889 41.5215H30.7871L39.3988 20.2573Z"/> 10860 <path d="M68.1287 38.6019C67.441 39.6836 66.4766 40.5639 65.3342 41.1524C64.1918 41.7409 62.9127 42.0166 61.6279 41.951C55.6709 41.951 51.0333 37.3609 51.0333 30.8854C51.0051 29.4294 51.2724 27.9826 51.8192 26.6318C52.3661 25.2809 53.1812 24.0537 54.2159 23.0236C55.2506 21.9935 56.4835 21.1816 57.8408 20.6366C59.1982 20.0915 60.6522 19.8245 62.1157 19.8515C66.3615 19.8515 69.8398 21.9199 71.463 25.0463L68.4325 27.2101C67.8527 26.0226 66.9407 25.0269 65.806 24.3425C64.6713 23.6581 63.3621 23.3141 62.0357 23.3518C58.2856 23.3518 55.1032 26.2396 55.1032 30.8854C55.1032 35.2289 57.9498 38.2439 61.7319 38.2439C65.514 38.2439 67.2011 36.0244 67.5929 33.4708H60.7084V30.1933H71.6389V41.5215H68.9842L68.1287 38.6019Z"/> 10861 <path d="M74.4209 20.2573H89.1735V23.8371H78.4509V28.7295H88.3179V32.3173H78.4509V37.9337H89.2614V41.5215H74.4209V20.2573Z"/> 10862 <path d="M91.8281 20.2573H96.074L102.895 37.1461L109.707 20.2573H113.953V41.5215H110.043V28.5147C109.859 29.0636 109.003 31.7684 109.003 31.7684L104.822 41.5215H100.976L96.7776 31.7843C96.7776 31.7843 95.9221 29.0796 95.7382 28.5306V41.5215H91.8281V20.2573Z"/> 10863 </g> 10864 <g class="logo-icon"> 10865 <path d="M182 32H156V58H182V32Z" fill="#0094B5"/> 10866 <path d="M185 0H156V29H185V0Z" fill="#BAD978"/> 10867 <path d="M151 32H129V55H151V32Z" fill="#718C1E"/> 10868 <path d="M152 3H126V29H152V3Z" fill="#82C4D4"/> 10869 </g> 10870</svg></div> </a> 10871 </div> 10872 <div class="header-right d-flex flex-column align-items-end justify-content-center"> 10873 <div class="d-flex gap-3 align-items-center pt-1"> 10874 <nav id="top-menu" class="d-none d-xl-flex" aria-label="Topmenu"> 10875 <ul id="menu-topmenu" class="top-menu menu d-flex align-items-center"><li id="menu-item-501" class="menu-item menu-item-type-post_type_archive menu-item-object-technologie menu-item-501"><a href="https://imagem.nl/technologie/">Technologie</a></li> 10876<li id="menu-item-502" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-502"><a href="https://imagem.nl/nieuws/">Nieuws</a></li> 10877<li id="menu-item-969" class="menu-item menu-item-type-post_type_archive menu-item-object-agenda menu-item-969"><a href="https://imagem.nl/agenda/">Agenda</a></li> 10878<li id="menu-item-516" class="menu-item menu-item-type-post_type_archive menu-item-object-persoon menu-item-516"><a href="https://imagem.nl/team/">Team</a></li> 10879<li id="menu-item-6479" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6479"><a href="https://imagem.nl/contact/">Contact</a></li> 10880</ul> </nav> 10881 <div class="topmenu-button-container d-none d-xl-flex gap-1"> 10882 <a href="tel:0031552002055" type="button" class="topmenu-button d-flex align-items-center justify-content-center" aria-label="Bellen met IMAGEM">
10883 <span class="button-text">+31 55 2002 055</span><i class="fas fa-phone"></i> 10884 </a> 10885 <button type="button" class="topmenu-button d-flex align-items-center justify-content-center toggle-search" aria-label="Zoekveld openen" aria-expanded="false" aria-controls="search-container"> 10886 <i class="fas fa-search" aria-hidden="true"></i> 10887 </button> 10888 </div> 10889 </div> 10890 <div class="d-flex gap-3"> 10891 <nav id="main-menu" class="d-none d-xl-flex" aria-label="Hoofdmenu"> 10892 <ul id="menu-hoofdmenu" class="main-menu menu d-flex"><li id="menu-item-365" class="menu-item menu-item-type-post_type menu-item-object-page has-megamenu"><a href="https://imagem.nl/themas/">Themaâs</a><section class="megamenu py-6 bg-white p-fixed w-100"><div class="container"><div class="row"><div class="col-lg"><div class="d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3"><p class="title font-size-4 mb-0">Voor elk thema en slimme oplossing</p><a href="https://imagem.nl/themas/" target="_self" class="more-link font-bold">Overzicht van themaâs<i class="fa-sharp fa-arrow-right ms-1 color-2"></i></a></div><div class="megamenu-featured pt-1"><div class="row gx-3 gap-row-3"><div class="col-lg-4"><div class="megamenu-featured-item p-relative image-hover"><a class="clickable" href="https://imagem.nl/thema/klimaat/" target="_self" title="Klimaat"></a><div class="box box-image" style="aspect-ratio: 16/9;"><img class="lazyload" width="450" height="253" data-src="https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-450x253.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-450x253.jpg 450w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-300x169.jpg 300w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-600x338.jpg 600w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-900x506.jpg 900w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-1200x675.jpg 1200w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-1800x1013.jpg 1800w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249.jpg 1920w" data-sizes="auto" alt="Droneshot strand Hoek van Holland"></div><div class="box-text"><p class="title font-size-5 mt-2 mb-1">Klimaat</p><p>Veerkrachtige geo-data oplossingen voor een klimaat dat veranderende is.</p></div> </div></div><div class="col-lg-4"><div class="megamenu-featured-item p-relative image-hover"><a class="clickable" href="https://imagem.nl/thema/gebiedsontwikkeling/" target="_self" title="Gebiedsontwikkeling"></a><div class="box box-image" style="aspect-ratio: 16/9;"><img class="lazyload" width="450" height="253" data-src="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-450x253.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-450x253.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-300x169.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-600x338.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-900x506.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-1200x675.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-1800x1013.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989.jpg 1920w" data-sizes="auto" alt="Almere Drone beeld gebiedsontwikkeling"></div><div class="box-text"><p class="title font-size-5 mt-2 mb-1">Gebiedsontwikkeling</p><p>Concrete geo-data oplossingen die helpen bij het vormgeven van de stad van morgen.</p></div> </div></div><div class="col-lg-4"><div class="megamenu-featured-item p-relative image-hover">
10892<a class="clickable" href="https://imagem.nl/thema/veiligheid/" target="_self" title="Veiligheid"></a><div class="box box-image" style="aspect-ratio: 16/9;"><img class="lazyload" width="450" height="450" data-src="https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-450x450.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-450x450.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-150x150.jpg 150w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-300x300.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-600x600.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-900x900.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1.jpg 1024w" data-sizes="auto" alt=""></div><div class="box-text"><p class="title font-size-5 mt-2 mb-1">Veiligheid</p><p>Verhoog de veiligheid met inzichtelijke geo-informatie met onze geo-data oplossingen.</p></div> </div></div></div></div></div></div></div></section></li> 10893<li id="menu-item-491" class="menu-item menu-item-type-post_type menu-item-object-page has-megamenu"><a href="https://imagem.nl/oplossingen/">Oplossingen</a><section class="megamenu py-6 bg-white p-fixed w-100"><div class="container"><div class="row"><div class="col-lg"><div class="d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3"><p class="title font-size-4 mb-0">Geo data gedreven oplossingen</p><a href="https://imagem.nl/oplossingen/" target="_self" class="more-link font-bold">Overzicht van oplossingen<i class="fa-sharp fa-arrow-right ms-1 color-2"></i></a></div><div class="megamenu-featured pt-1"><div class="row gx-3 gap-row-3"><div class="col-lg-4"><div class="megamenu-featured-item p-relative image-hover"><a class="clickable" href="https://imagem.nl/oplossing/digital-twin/" target="_self" title="Digital Twin"></a><div class="box box-image" style="aspect-ratio: 16/9;"><img class="lazyload" width="450" height="300" data-src="https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-450x300.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-450x300.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-300x200.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-600x400.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-900x600.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-1200x800.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-1800x1200.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin.jpg 1920w" data-sizes="auto" alt="2D of 3D? 2D blijft belangrijk, maar 3D en digital twins voegen context toe."></div><div class="box-text"><p class="title font-size-5 mt-2 mb-1">Digital Twin</p><p>Snel en eenvoudig projecten of vraagstukken simuleren, visualiseren en delen.</p></div> </div></div><div class="col-lg-4"><div class="megamenu-featured-item p-relative image-hover"><a class="clickable" href="https://imagem.nl/oplossing/beleidsbewuste-digital-twin/" target="_self" title="Beleidsbewuste digital twin"></a><div class="box box-image" style="aspect-ratio: 16/9;"><img class="lazyload" width="450" height="253" data-src="https://imagem.nl/wp-content/uploads/2025/09/250311-IMAGEM-Planspace-Simulator_Screenshot_01-450x253.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2025/09/250311-IMAGEM-Planspace-Simulator_Screenshot_01-450x253.jpg 450w, https://imagem.nl/wp-content/uploads/2025/09/250311-IMAGEM-Planspace-Simulator_Screenshot_01-300x169.jpg 300w, https://imagem.nl/wp-content/uploads/2025/09/250311-IMAGEM-Planspace-Simulator_Screenshot_01-600x338.jpg 600w, https://imagem.nl/wp-content/uploads/2025/09/250311-IMAGEM-Planspace-Simulator_Screenshot_01-900x506.jpg 900w, https://imagem.nl/wp-content/uploads/2025/09/250311-IMAGEM-Planspace-Simulator_Screenshot_01-1200x675.jpg 1200w, https://imagem.nl/wp-content/uploads/2025/09/250311-IMAGEM-Planspace-Simulator_Screenshot_01-1800x1013.jpg 1800w, https://imagem.nl/wp-content/uploads/2025/09/250311-IMAGEM-Planspace-Simulator_Screenshot_01.jpg 1920w" data-sizes="auto" alt="Digital twin wateroverlast"></div><div class="box-text"><p class="title font-size-5 mt-2 mb-1">Beleidsbewuste digital twin</p><p>Projecten worden gesimuleerd op gebied van ambities, doelstellingen en wettelijke kaders.</p></div> </div></div><div class="col-lg-4"><div class="megamenu-featured-item p-relative image-hover"><a class="clickable" href="https://imagem.nl/oplossing/remote-sensing/" target="_self" title="Remote Sensing"></a><div class="box box-image" style="aspect-ratio: 16/9;"><img class="lazyload" width="450" height="450" data-src="https://imagem.nl/wp-content/uploads/2026/02/mutatiesignalering-1024x1024-1-450x450.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/02/mutatiesignalering-1024x1024-1-450x450.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/mutatiesignalering-1024x1024-1-150x150.jpg 150w, https://imagem.nl/wp-content/uploads/2026/02/mutatiesignalering-1024x1024-1-300x300.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/mutatiesignalering-1024x1024-1-600x600.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/mutatiesignalering-1024x1024-1-900x900.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/mutatiesignalering-1024x1024-1.jpg 1024w" data-sizes="auto" alt=""></div><div class="box-text"><p class="title font-size-5 mt-2 mb-1">Remote Sensing</p><p>Verzamel accurate en actuele informatie over grote gebieden, zonder fysieke aanwezigheid.</p></div> </div></div></div></div></div></div></div></section></li> 10894<li id="menu-item-503" class="menu-item menu-item-type-post_type_archive menu-item-object-toepassing"><a href="https://imagem.nl/toepassingen/">Toepassingen</a></li> 10895<li id="menu-item-493" class="menu-item menu-item-type-post_type_archive menu-item-object-klantcase"><a href="https://imagem.nl/cases/">Cases</a></li> 10896<li id="menu-item-6461" class="menu-item menu-item-type-post_type menu-item-object-page"><a href="https://imagem.nl/aanpak/">Aanpak</a></li> 10897<li id="menu-item-489" class="menu-item menu-item-type-post_type menu-item-object-page"><a href="https://imagem.nl/over-ons/">Over ons</a></li> 10898<li id="menu-item-1226" class="weglot-parent-menu-item wg-nl weglot-lang menu-item-weglot weglot-language nl menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children"><a title="Nederlands" href="#weglot_switcher" data-wg-notranslate="true">NL</a> 10899<ul class="sub-menu"> 10900<li id="menu-item-weglot-1226-en" class="weglot-lang menu-item-weglot weglot-language weglot-en menu-item menu-item-type-custom menu-item-object-custom"><a title="English" href="https://imagem.nl/en/" data-wg-notranslate="true">EN</a></li> 10901</ul> 10902</li> 10903</ul> </nav> 10904 <div class="menu-button-container d-flex d-xl-none gap-1 font-bold"> 10905 <a href="tel:+3112345678" type="button" class="toggle-button d-flex align-items-center" aria-label="Bellen met Imagem"> 10906 <i class="fas fa-phone"></i> 10907 </a> 10908 <button type="button" class="toggle-search toggle-button align-items-center" aria-label="Zoekveld openen" aria-expanded="false" aria-controls="search-container"> 10909 <i class="fas fa-search" aria-hidden="true"></i> 10910 </button> 10911 <button type="button" class="toggle-nav toggle-button gap-1 align-items-center" aria-label="Menu openen" aria-expanded="false" aria-controls="main-navigation"> 10912 <div class="hamburger hamburger-x">
10913 <span></span> 10914 </div> 10915 </button> 10916 </div> 10917 </div> 10918 </div> 10919 </div> 10920 </div> 10921 </section> 10922 <div id="search-bar" class="header-search-bar d-flex p-1"> 10923 <form id="search-form" class="search-form d-flex align-items-center" method="get" action="https://imagem.nl" role="search"> 10924 <label for="search-form-input" class="sr-only">Zoekterm invoeren</label> 10925 <input 10926 id="search-form-input" 10927 type="search" 10928 name="s" 10929 autocomplete="off" 10930 required 10931 aria-required="true" 10932 placeholder="Zoeken" 10933 value=""> 10934 <button 10935 type="submit" 10936 class="nav-button bg-2-light" 10937 aria-label="Zoeken"> 10938 <i class="far fa-search" aria-hidden="true"></i> 10939 <span class="sr-only">Zoeken</span> 10940 </button> 10941</form> 10942</div> 10943 </header> 10944 <main id="content-wrapper" class="d-flex flex-column p-relative flex-grow-1"> 10945 <div id="page-452" class="synergy-page synergy-module-page post-452 page type-page status-publish hentry"> 10946 <section class="hero overflow-hidden"> 10947 <style></style> 10948 <section id="hero-frontpage" class="hero d-flex flex-column header-padding"> 10949 <div class="hero-video p-absolute h-100 w-100" 10950 aria-hidden="true" 10951 data-hero-video="https://player.vimeo.com/video/1167180814?autoplay=1&muted=1&loop=1&background=1&dnt=1" 10952 data-hero-video-title="Hero achtergrondvideo"> 10953 <div class="video-container"></div> 10954</div> 10955<img fetchpriority="high" src="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-600x338.jpg" width="600" height="338" srcset="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-600x338.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-300x169.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-450x253.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-900x506.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-1200x675.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2-1800x1013.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0092-2.jpg 1920w" sizes="100vw" alt=""> <div class="hero-content-container flex-grow-1 d-flex flex-column justify-content-end z-2 mt-4"> 10956 <div class="hero-content pb-4 pb-lg-6 p-relative gradient-overlay"> 10957 <div class="container"> 10958 <div class="row"> 10959 <div class="col-lg-8"> 10960 <h1 class="hero-title p-relative" data-aos-duration="1000" data-aos-delay="100" data-aos="fade-up">Wij geven data een gezicht</h1> 10961 <p class="hero-text p-relative mt-3" data-aos-duration="1000" data-aos-delay="200" data-aos="fade-up">Zodat informatie zichtbaar en begrijpelijk wordt, er overzicht ontstaat en beslissingen sneller en beter onderbouwd kunnen worden.</p> 10962 <div class="hero-links d-flex gap-column-3 flex-wrap gap-2 mt-4" data-aos-duration="1000" data-aos-delay="300" data-aos="fade-up"> 10963 <a class="button p-relative d-flex gap-2 align-items-center" href="https://imagem.nl/oplossingen/" 10964 title="Ontdek onze oplossingen" 10965 target=""> 10966 Ontdek onze oplossingen<span class="more"></span> 10967 </a> 10968 <a class="p-relative more d-flex align-items-center" href="https://imagem.nl/contact/" 10969 title="Contact opnemen" 10970 target=""> 10971 Contact opnemen </a> 10972 </div> 10973 </div> 10974 </div> 10975 </div> 10976 </div> 10977 </div> 10978 </section> 10979 </section> 10980 <section class="home-content"> 10981 <div class="container"> 10982 <div class="content page-content"> 10983 <div id="cta-block_8d0840c2b4a85dd411a7f42d04186fb9" 10984 class="max-block-cta content-block d-flex flex-column"> 10985 <div class="bg-full "></div> 10986 <div class="row gy-0 gx-4 gx-lg-6"> 10987 <div class="col-lg-6 order-lg-last img-fill" data-aos="fade-up" data-aos-duration="600"> 10988 <style></style> 10989 <div class="cta-video box box-video box-image box-hover p-relative" style="aspect-ratio: 16/9;"> 10990 <a class="clickable" href="https://www.youtube-nocookie.com/embed/He9Ap5q12s4" data-fancybox title="Van complexe vraag naar helder inzicht" aria-label="Video afspelen: Van complexe vraag naar helder inzicht" aria-describedby="media-caption-6abda388739b2"></a> 10991 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2026/02/2026_IMAGEM_1920x1280_1_Kantoor-Imagem-600x400.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/02/2026_IMAGEM_1920x1280_1_Kantoor-Imagem-600x400.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/2026_IMAGEM_1920x1280_1_Kantoor-Imagem-300x200.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/2026_IMAGEM_1920x1280_1_Kantoor-Imagem-450x300.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/2026_IMAGEM_1920x1280_1_Kantoor-Imagem-900x600.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/2026_IMAGEM_1920x1280_1_Kantoor-Imagem-1200x800.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/02/2026_IMAGEM_1920x1280_1_Kantoor-Imagem-1800x1200.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/02/2026_IMAGEM_1920x1280_1_Kantoor-Imagem.jpg 1920w" data-sizes="auto" alt="Villa von Zeppelin
10991in Apeldoorn"> <div id="media-caption-6abda388739b2" class="media-caption p-absolute bg-white-blur text-center p-1 p-md-2" style="bottom: 0; left: 0; right: 0;">Bekijk de video over IMAGEM</div> <div class="play-button d-flex align-items-center justify-content-center" aria-hidden="true"> 10992 <i class="fa-sharp fa-play bg-white-blur" aria-hidden="true"></i> 10993 </div> 10994 </div> 10995 </div> 10996 10997 <div class="col-lg-6 order-lg-first d-flex align-items-center"> 10998 <div class="cta-txt mt-lg-0 p-relative d-flex flex-column align-items-start py-4 py-lg-6" data-aos="fade-left" data-aos-duration="600"> 10999 <div class="block-title mb-2"> 11000 <h2 class="font-size-3">Van complexe vraag naar helder inzicht</h2> 11001 </div> 11002 <div class="block-text"> 11003 <p>In veel organisaties komen data, ruimte, beleid en maatschappelijke belangen samen in één vraagstuk. Dat maakt besluitvorming complex.</p> 11004<p>IMAGEM helpt om die complexiteit inzichtelijk te maken. Door domeinkennis te verbinden met data en slimme technologie ontstaat overzicht en richting voor besluitvorming.</p> 11005<p>Benieuwd hoe die aanpak eruit ziet in de praktijk?</p> 11006 </div> 11007 <a class="more mt-3" 11008 href="https://imagem.nl/aanpak/" 11009 target=""> 11010 Meer over onze aanpak </a> 11011 </div> 11012 </div> 11013 </div> 11014 </div> 11015 11016 11017 <div id="slider-blocks-block_1d00f94feaa86a11b367349174d2a093" class="max-block-slider-blocks content-block bg-2-dark has-background text-position-top"> 11018 <div class="bg-full bg-shapes bg-2-dark"></div> 11019 <div class="row"> 11020 <div class="col-lg-10 offset-lg-1 z-2"> 11021 <div class="section-title text-center"> 11022 <h2>De uitdagingen die jouw leefomgeving vormgeven</h2> 11023 <p>Krijg inzicht in de vraagstukken die vandaag spelen en morgen bepalen. Ontdek hoe IMAGEM helpt om deze complexiteit te vertalen naar grip, richting en betere besluitvorming.</p> 11024 </div> 11025 </div> 11026 <div class="col-lg-12"> 11027 <div class="swiper-slider blocks-slider section-slider "> 11028 <div class="swiper-container"> 11029 <div class="slider-overlay slider-overlay-left"></div> 11030 <div class="swiper-wrapper"> 11031 <div class="swiper-slide" data-aos="fade-up" data-aos-duration="600" data-aos-delay="0"> 11032 <div id="tile-6abda388742ff" class="tile-item tile-blocks d-flex flex-column flex-grow-1 w-100 box box-hover"> 11033 <a aria-label="Lees verder over: Klimaat" 11034 class="clickable box" 11035 href="https://imagem.nl/thema/klimaat/" 11036 target="_self"></a> 11037 11038 <div class="box d-flex flex-column flex-grow-1 justify-content-end p-relative overflow-hidden bg-image" data-aos="fade"> 11039 <style></style> 11040 <div class="box-image p-absolute h-100 w-100"> 11041 <img class="lazyload" width="450" height="253" data-src="https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-450x253.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-450x253.jpg 450w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-300x169.jpg 300w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-600x338.jpg 600w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-900x506.jpg 900w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-1200x675.jpg 1200w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249-1800x1013.jpg 1800w, https://imagem.nl/wp-content/uploads/2025/09/2025_IMAGEM_Video-Render-1920x1080_DJI_0249.jpg 1920w" data-sizes="auto" alt="Droneshot strand Hoek van Holland"> </div> 11042 11043 <div class="box-text w-100 z-1 d-flex flex-column justify-content-end" style="aspect-ratio: 40/48; min-height: 400px;"> 11044 <div class="gradient-overlay-top px-3 pb-3 d-flex flex-column gap-1 p-relative"> 11045 11046 <div class="tile-title d-flex align-items-center justify-content-between gap-2"> 11047 <h2 class="font-size-4 mb-0 flex-grow-1">Klimaat</h2> 11048 <i class="fa-sharp fa-arrow-right flex-shrink-0 font-size-4"></i> 11049 </div> 11050 <div class="tile-text">Hoe geo-data helpt bij het aanpakken van bv. wateroverlast en hittestress. Ontdek onze oplossingen voor een veerkrachtige toekomst.</div> 11051 </div> 11052 </div> 11053 </div> 11054</div> </div> 11055 <div class="swiper-slide" data-aos="fade-up" data-aos-duration="600" data-aos-delay="100"> 11056 <div id="tile-6abda38874587" class="tile-item tile-blocks d-flex flex-column flex-grow-1 w-100 box box-hover"> 11057 <a aria-label="Lees verder over: Gebiedsontwikkeling" 11058 class="clickable box" 11059 href="https://imagem.nl/thema/gebiedsontwikkeling/" 11060 target="_self"></a> 11061 11062 <div class="box d-flex flex-column flex-grow-1 justify-content-end p-relative overflow-hidden bg-image" data-aos="fade"> 11063 <style></style> 11064 <div class="box-image p-absolute h-100 w-100"> 11065 <img class="lazyload" width="450" height="253" data-src="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-450x253.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-450x253.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-300x169.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-600x338.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-900x506.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-1200x675.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989-1800x1013.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM_Video-Render-1920x1080_DJI_0989.jpg 1920w" data-sizes="auto" alt="Almere Drone beeld gebiedsontwikkeling"> </div> 11066 11067 <div class="box-text w-100 z-1 d-flex flex-column justify-content-end" style="aspect-ratio: 40/48; min-height: 400px;"> 11068 <div class="gradient-overlay-top px-3 pb-3 d-flex flex-column gap-1 p-relative"> 11069 11070 <div class="tile-title d-flex align-items-center justify-content-between gap-2"> 11071 <h2 class="font-size-4 mb-0 flex-grow-1">Gebiedsontwikkeling</h2> 11072 <i class="fa-sharp fa-arrow-right flex-shrink-0 font-size-4"></i> 11073 </div> 11074 <div class="tile-text">Slimme oplossingen voor leefbare en duurzame steden. Leer hoe IMAGEM bijdraagt aan de stedelijke ontwikkeling van morgen.</div> 11075 </div> 11076 </div> 11077 </div> 11078</div> </div> 11079 <div class="swiper-slide" data-aos="fade-up" data-aos-duration="600" data-aos-delay="200"> 11080 <div id="tile-6abda388747db" class="tile-item tile-blocks d-flex flex-column flex-grow-1 w-100 box box-hover"> 11081 <a aria-label="Lees verder over: Veiligheid" 11082 class="clickable box"
11083 href="https://imagem.nl/thema/veiligheid/" 11084 target="_self"></a> 11085 11086 <div class="box d-flex flex-column flex-grow-1 justify-content-end p-relative overflow-hidden bg-image" data-aos="fade"> 11087 <style></style> 11088 <div class="box-image p-absolute h-100 w-100"> 11089 <img class="lazyload" width="450" height="450" data-src="https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-450x450.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-450x450.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-150x150.jpg 150w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-300x300.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-600x600.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1-900x900.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/2008-IMAGEM-Website-1920x1920_gemeenten-1024x1024-1.jpg 1024w" data-sizes="auto" alt=""> </div> 11090 11091 <div class="box-text w-100 z-1 d-flex flex-column justify-content-end" style="aspect-ratio: 40/48; min-height: 400px;"> 11092 <div class="gradient-overlay-top px-3 pb-3 d-flex flex-column gap-1 p-relative"> 11093 11094 <div class="tile-title d-flex align-items-center justify-content-between gap-2"> 11095 <h2 class="font-size-4 mb-0 flex-grow-1">Veiligheid</h2> 11096 <i class="fa-sharp fa-arrow-right flex-shrink-0 font-size-4"></i> 11097 </div> 11098 <div class="tile-text">Verhoog de veiligheid met inzichtelijke geo-informatie. Ontdek hoe we helpen bij het creëren van een veilige leefomgeving.</div> 11099 </div> 11100 </div> 11101 </div> 11102</div> </div> 11103 </div> 11104 <div class="slider-overlay slider-overlay-right"></div> 11105 <div class="slider-footer d-flex justify-content-center align-items-center gap-4"> 11106 <div class="swiper-pagination pagination-blocks border-radius-sm d-flex align-items-center"></div> 11107 </div> 11108 </div> 11109 <div class="d-flex gap-1"> 11110 <div class="swiper-prev blocks-swiper-prev"></div> 11111 <div class="swiper-next blocks-swiper-next"></div> 11112 </div> 11113 </div> 11114 </div> 11115 </div> 11116 </div> 11117 11118 11119 11120<h2 class="wp-block-heading has-text-align-center has-size-2-font-size">Onze oplossingen</h2> 11121 11122 11123 <div id="cta-block_19f17562b7cfecc3eb8b8c7af4ba5888" 11124 class="max-block-cta content-block d-flex flex-column"> 11125 <div class="bg-full "></div> 11126 <div class="row gy-0 gx-4 gx-lg-6"> 11127 <div class="col-lg-6 img-fill" data-aos="fade-up" data-aos-duration="600"> 11128 <style></style> 11129 <div id="image-2109" class="cta-img box box-image p-relative" style="aspect-ratio: "> 11130 <img class="lazyload" width="450" height="300" data-src="https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-450x300.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-450x300.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-300x200.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-600x400.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-900x600.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-1200x800.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin-1800x1200.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/02/250106-IMAGEM-Website-1920x1280_Digital-Twin.jpg 1920w" data-sizes="auto" alt="2D of 3D? 2D blijft belangrijk, maar 3D en digital twins voegen context toe."><div class="media-icon bg-2-lighter" aria-hidden="true"><img decoding="async" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2054%2054'%3E%3C/svg%3E" class="acf-icon" width="54" height="54" alt="digital-twin" style="font-size: 54px;" data-lazy-src="https://imagem.nl/wp-content/themes/imagem/graphics/icons/imagem/digital-twin.svg"><noscript><img decoding="async" src="https://imagem.nl/wp-content/themes/imagem/graphics/icons/imagem/digital-twin.svg" class="acf-icon" width="54" height="54" alt="digital-twin" style="font-size: 54px;"></noscript></div> </div> 11131 </div> 11132 11133 <div class="col-lg-6 d-flex align-items-center"> 11134 <div class="cta-txt mt-lg-0 p-relative d-flex flex-column align-items-start py-4 py-lg-6" data-aos="fade-right" data-aos-duration="600"> 11135 <div class="block-subtitle mb-2 uppercase color-2 font-bold"> 11136 Digital Twin </div> 11137 <div class="block-title mb-2"> 11138 <h2 class="font-size-3">Meer dan een kopie van de fysieke leefomgeving</h2> 11139 </div> 11140 <div class="block-text"> 11141 <p>
11141Beslissingen nemen op basis van alleen de huidige situatie is vaak niet genoeg. Je wilt niet alleen zien hoe de situatie eruitziet, maar ook begrijpen wat er mogelijk is en wat keuzes betekenen. Met een digital twin krijg je een realistisch en actueel beeld van de fysieke leefomgeving, waarin je scenarioâs verkent, plannen toetst en direct de effecten ziet. Zo ontstaat inzicht dat verder gaat dan visualisatie alleen en kun je samen sneller, effectiever en kostenefficiënter beslissingen nemen.</p> 11142 </div> 11143 <a class="button mt-3" 11144 href="https://imagem.nl/oplossing/digital-twin/" 11145 target=""> 11146 Meer over Digital Twin <span class="more"></span> 11147 </a> 11148 </div> 11149 </div> 11150 </div> 11151 </div> 11152 11153 11154 <div id="cta-block_c8add6d3b9d90f2330ee0f147be24a48" 11155 class="max-block-cta content-block d-flex flex-column"> 11156 <div class="bg-full "></div> 11157 <div class="row gy-0 gx-4 gx-lg-6"> 11158 <div class="col-lg-6 img-fill" data-aos="fade-up" data-aos-duration="600"> 11159 <style></style> 11160 <div id="image-2060" class="cta-img box box-image p-relative" style="aspect-ratio: "> 11161 <img class="lazyload" width="450" height="253" data-src="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM-Remote-Sensing-01-450x253.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM-Remote-Sensing-01-450x253.jpg 450w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM-Remote-Sensing-01-300x169.jpg 300w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM-Remote-Sensing-01-600x338.jpg 600w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM-Remote-Sensing-01-900x506.jpg 900w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM-Remote-Sensing-01-1200x675.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM-Remote-Sensing-01-1800x1013.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/02/2025_IMAGEM-Remote-Sensing-01.jpg 1920w" data-sizes="auto" alt="Remote sensing analyse overstromingsschade Valencia"><div class="media-icon bg-2-lighter" aria-hidden="true"><img decoding="async" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2054%2054'%3E%3C/svg%3E" class="acf-icon" width="54" height="54" alt="photogrammetry" style="font-size: 54px;" data-lazy-src="https://imagem.nl/wp-content/themes/imagem/graphics/icons/imagem/photogrammetry.svg"><noscript><img decoding="async" src="https://imagem.nl/wp-content/themes/imagem/graphics/icons/imagem/photogrammetry.svg" class="acf-icon" width="54" height="54" alt="photogrammetry" style="font-size: 54px;"></noscript></div> </div> 11162 </div> 11163 11164 <div class="col-lg-6 d-flex align-items-center"> 11165 <div class="cta-txt mt-lg-0 p-relative d-flex flex-column align-items-start py-4 py-lg-6" data-aos="fade-right" data-aos-duration="600"> 11166 <div class="block-subtitle mb-2 uppercase color-2 font-bold"> 11167 Remote Sensing </div> 11168 <div class="block-title mb-2"> 11169 <h2 class="font-size-3">Maak betere beslissingen met data vanuit de lucht</h2> 11170 </div> 11171 <div class="block-text"> 11172 <p>Remote sensing geeft je snel en nauwkeurig inzicht in de werkelijkheid, zonder het gebied fysiek te bezoeken. Via satellieten, drones, vliegtuigen en sensornetwerken verzamelen we data met sensoren zoals optisch, thermisch, radar en LiDAR. Deze informatie wordt gecombineerd met open data, rekenmodellen en AI en geanalyseerd om besluitvorming te ondersteunen. Bij IMAGEM combineren we deze data met onze expertise, zodat jij altijd werkt met betrouwbaar en actueel beeldmateriaal. Zo neem je beter onderbouwde beslissingen over stedelijke ontwikkeling, milieubeheer, vergunningen en toezicht & handhaving.</p> 11173 </div> 11174 <a class="button mt-3" 11175 href="https://imagem.nl/oplossing/remote-sensing/" 11176 target=""> 11177 Meer over Remote Sensing <sp
11177an class="more"></span> 11178 </a> 11179 </div> 11180 </div> 11181 </div> 11182 </div> 11183 11184 11185 <div id="news-block_f7ef7239368eead09b02db64253b0aa8" 11186 class="max-block-news content-block has-background bg-2-lighter" data-aos="fade"> 11187 <div class="bg-full bg-2-lighter"></div> 11188 <div class="bg-full-container position-relative" data-aos="fade"> 11189 <div class="section-title mb-2 d-flex justify-content-between align-items-center flex-wrap"> 11190 <h2 class="mb-0">Actueel</h2> 11191 <a href="https://imagem.nl/nieuws/" class="more-link font-bold">Alle artikelen<i class="fa-sharp fa-arrow-right ms-1 color-2"></i></a> 11192 </div> 11193 <div class="swiper-slider news-slider section-slider" data-aos="fade-up"> 11194 <div class="swiper-container"> 11195 <div class="slider-overlay slider-overlay-left"></div> 11196 <div class="swiper-wrapper"> 11197 <div class="swiper-slide d-flex" data-aos="fade-up" data-aos-duration="600" data-aos-delay="0"> 11198 <div id="card-post-7523" class="card-item card-post p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-7523"> 11199 <div class="box d-flex flex-column flex-grow overflow-hidden bg-white"> 11200 <a aria-label="Lees verder over:: Digital Reality: een Digital Twin mét het perspectief van mensen" class="clickable box" href="https://imagem.nl/nieuws-categorie/digital-reality-een-digital-twin-met-perspectief-van-mensen/"></a> 11201 <style></style> 11202 <div class="box-image p-relative"> 11203 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2026/09/IMAGEM-Digital-Reality-Bevolk-de-Digital-Twin-600x400.png" data-srcset="https://imagem.nl/wp-content/uploads/2026/09/IMAGEM-Digital-Reality-Bevolk-de-Digital-Twin-600x400.png 600w, https://imagem.nl/wp-content/uploads/2026/09/IMAGEM-Digital-Reality-Bevolk-de-Digital-Twin-300x200.png 300w, https://imagem.nl/wp-content/uploads/2026/09/IMAGEM-Digital-Reality-Bevolk-de-Digital-Twin-450x300.png 450w, https://imagem.nl/wp-content/uploads/2026/09/IMAGEM-Digital-Reality-Bevolk-de-Digital-Twin-900x600.png 900w, https://imagem.nl/wp-content/uploads/2026/09/IMAGEM-Digital-Reality-Bevolk-de-Digital-Twin-1200x800.png 1200w" data-sizes="auto" alt="Digital Reality waarin de fysieke leefomgeving wordt verbonden met de beleving en het perspectief van mensen."> <div class="oplossing-labels p-1 d-flex gap-1 p-absolute top-0 left-0"> 11204 <span class="oplossing-label label">Digital Twin</span> 11205 </div> 11206 </div> 11207 <div class="box-text d-flex flex-grow flex-column p-3 align-items-start"> 11208 <h3 id="card-title-7523" class="font-size-4">Digital Reality: een Digital Twin mét het perspectief van mensen</h3> <p class="excerpt">Voor maatschappelijke opgaven is het niet genoeg om de werkelijkheid digitaal na te bouwen. Je wilt begrijpen wat die werkelijkheid betekent voor de mensen die erin wonen, werken, ondernemen en besluiten nemen. En daarvoor moet je verder kijken dan de Digital Twin. Naar een Digital Reality, waarin niet alleen de fysieke wereld, maar ook het menselijk perspectief een plek krijgt.</p> 11209 <a class="more p-relative mt-auto" href="https://imagem.nl/nieuws-categorie/digital-reality-een-digital-twin-met-perspectief-van-mensen/" aria-hidden="true" tabindex="-1">
11210 <span>Lees artikel</span> 11211 </a> 11212 </div> 11213 </div> 11214 </div> 11215 </div> 11216 <div class="swiper-slide d-flex" data-aos="fade-up" data-aos-duration="600" data-aos-delay="100"> 11217 <div id="card-post-7482" class="card-item card-post p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-7482"> 11218 <div class="box d-flex flex-column flex-grow overflow-hidden bg-white"> 11219 <a aria-label="Lees verder over:: Digitale transformatie bij de overheid deel 1: kennis borgen en benutten" class="clickable box" href="https://imagem.nl/nieuws-categorie/digitale-transformatie-overheid-deel-1-kennis-borgen-en-beter-benutten/"></a> 11220 <style></style> 11221 <div class="box-image p-relative"> 11222 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2026/09/Digitale-transformatie-bij-de-overheid-deel-1-kennis-borgen-en-benutten-600x400.png" data-srcset="https://imagem.nl/wp-content/uploads/2026/09/Digitale-transformatie-bij-de-overheid-deel-1-kennis-borgen-en-benutten-600x400.png 600w, https://imagem.nl/wp-content/uploads/2026/09/Digitale-transformatie-bij-de-overheid-deel-1-kennis-borgen-en-benutten-300x200.png 300w, https://imagem.nl/wp-content/uploads/2026/09/Digitale-transformatie-bij-de-overheid-deel-1-kennis-borgen-en-benutten-450x300.png 450w, https://imagem.nl/wp-content/uploads/2026/09/Digitale-transformatie-bij-de-overheid-deel-1-kennis-borgen-en-benutten-900x600.png 900w, https://imagem.nl/wp-content/uploads/2026/09/Digitale-transformatie-bij-de-overheid-deel-1-kennis-borgen-en-benutten-1200x800.png 1200w, https://imagem.nl/wp-content/uploads/2026/09/Digitale-transformatie-bij-de-overheid-deel-1-kennis-borgen-en-benutten.png 1536w" data-sizes="auto" alt="Digitale transformatie bij de overheid gericht op het borgen en beter benutten van kennis voor snellere, onderbouwde besluitvorming."> <div class="oplossing-labels p-1 d-flex gap-1 p-absolute top-0 left-0"> 11223 <span class="oplossing-label label">Digital Twin</span> 11224 </div> 11225 </div> 11226 <div class="box-text d-flex flex-grow flex-column p-3 align-items-start"> 11227 <h3 id="card-title-7482" class="font-size-4">Digitale transformatie bij de overheid deel 1: kennis borgen en benutten</h3> <p class="excerpt">Kennisborging draait om het behouden én direct benutten van waardevolle kennis voor werk en besluitvorming. Door kennis structureel vast te leggen, te verbinden en toegankelijk te maken, ontstaat een gedeelde informatiepositie die helpt om sneller en beter onderbouwd te besluiten. Zo vormt kennisborging een belangrijke basis voor digitale transformatie.</p> 11228 <a class="more p-relative mt-auto" href="https://imagem.nl/nieuws-categorie/digitale-transformatie-overheid-deel-1-kennis-borgen-en-beter-benutten/" aria-hidden="true" tabindex="-1"> 11229 <span>Lees artikel</span> 11230 </a> 11231 </div> 11232 </div> 11233 </div> 11234 </div> 11235 <div class="swiper-slide d-flex" data-aos="fade-up" data-aos-duration="600" data-aos-delay="200"> 11236 <div id="card-post-7467" class="card-item card-post p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-7467"> 11237 <div class="box d-flex flex-column flex-grow overflow-hidden bg-white"> 11238 <a aria-label="Lees verder over:: Digitale soevereiniteit begint met de vrijheid om te kiezen" class="clickable box" href="https://imagem.nl/nieuws-categorie/digitale-soevereiniteit-begint-met-de-vrijheid-om-te-kiezen/"></a> 11239 <style></style> 11240 <div class="box-image p-relative"> 11241 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2026/08/Digitale-soevereiniteit-keuzevrijheid-600x400.png" data-srcset="https://imagem.nl/wp-content/uploads/2026/08/Digitale-soevereiniteit-keuzevrijheid-600x400.png 600w, https://imagem.nl/wp-content/uploads/2026/08/Digitale-soevereiniteit-keuzevrijheid-300x200.png 300w, https://imagem.nl/wp-content/uploads/2026/08/Digitale-soevereiniteit-keuzevrijheid-450x300.png 450w, https://imagem.nl/wp-content/uploads/2026/08/Digitale-soevereiniteit-keuzevrijheid-900x600.png 900w, https://imagem.nl/wp-content/uploads/2026/08/Digitale-soevereiniteit-keuzevrijheid-1200x800.png 1200w" data-sizes="auto" alt="Digitale soevereiniteit en keuzevrijheid in technologie"> <div class="oplossing-labels p-1 d-flex gap-1 p-absolute top-0 left-0"> 11242 <sp
11242an class="oplossing-label label">Digital Twin</span> 11243 </div> 11244 </div> 11245 <div class="box-text d-flex flex-grow flex-column p-3 align-items-start"> 11246 <h3 id="card-title-7467" class="font-size-4">Digitale soevereiniteit begint met de vrijheid om te kiezen</h3> <p class="excerpt">Digitale soevereiniteit draait om de vrijheid om zelf keuzes te blijven maken over data, technologie en infrastructuur. Door afhankelijkheden inzichtelijk te maken, risicoâs te spreiden en alternatieven en een exitstrategie achter de hand te hebben, behouden organisaties de regie. IMAGEM denkt graag mee met organisaties waar Voor organisaties waarbij autonomie, dataveiligheid en continuïteit essentieel zijn.</p> 11247 <a class="more p-relative mt-auto" href="https://imagem.nl/nieuws-categorie/digitale-soevereiniteit-begint-met-de-vrijheid-om-te-kiezen/" aria-hidden="true" tabindex="-1"> 11248 <span>Lees artikel</span> 11249 </a> 11250 </div> 11251 </div> 11252 </div> 11253 </div> 11254 <div class="swiper-slide d-flex" data-aos="fade-up" data-aos-duration="600" data-aos-delay="300"> 11255 <div id="card-post-7294" class="card-item card-post p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-7294"> 11256 <div class="box d-flex flex-column flex-grow overflow-hidden bg-white"> 11257 <a aria-label="Lees verder over:: Remote sensing Deel 5: Van data naar dashboard in Capelle aan den IJssel" class="clickable box" href="https://imagem.nl/nieuws-categorie/remote-sensing-deel-5-van-data-naar-dashboard/"></a> 11258 <style></style> 11259 <div class="box-image p-relative"> 11260 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2025/06/Remote-sensing-van-data-en-dashboards-capelle-aan-de-IJssel-600x400.png" data-srcset="https://imagem.nl/wp-content/uploads/2025/06/Remote-sensing-van-data-en-dashboards-capelle-aan-de-IJssel-600x400.png 600w, https://imagem.nl/wp-content/uploads/2025/06/Remote-sensing-van-data-en-dashboards-capelle-aan-de-IJssel-300x200.png 300w, https://imagem.nl/wp-content/uploads/2025/06/Remote-sensing-van-data-en-dashboards-capelle-aan-de-IJssel-450x300.png 450w, https://imagem.nl/wp-content/uploads/2025/06/Remote-sensing-van-data-en-dashboards-capelle-aan-de-IJssel-900x600.png 900w" data-sizes="auto" alt="Luchtfoto van Capelle aan den IJssel ter illustratie van remote sensing, data-analyse en dashboardvisualisatie."> <div class="oplossing-labels p-1 d-flex gap-1 p-absolute top-0 left-0"> 11261 <span class="oplossing-label label">Remote Sensing</span> 11262 </div> 11263 </div> 11264 <div class="box-text d-flex flex-grow flex-column p-3 align-items-start"> 11265 <h3 id="card-title-7294" class="font-size-4">Remote sensing Deel 5: Van data naar dashboard in Capelle aan den IJssel</h3> <p class="excerpt">Voordat we iets kunnen visualiseren in een digital twin, moeten we eerst begrijpen waar we eigenlijk naar kijken. Zonder dat fundament zijn visualisaties niet meer dan mooie plaatjes. In deel vier van de serie zet Harald een stap terug naar het begin: het waarnemen zelf. Niet alleen via satellieten of drones, maar ook met onze eigen ogen. Remote sensing begint bij waarnemen, bij weten wie kijkt, waarom en met welk instrument. Alleen dan kun je data combineren tot informatie die klopt, betekenisvol is en bruikbaar wordt.</p> 11266 <a class="more p-relative mt-auto" href="https://imagem.nl/nieuws-categorie/remote-sensing-deel-5-van-data-naar-dashboard/" aria-hidden="true" tabindex="-1">
11267 <span>Lees artikel</span> 11268 </a> 11269 </div> 11270 </div> 11271 </div> 11272 </div> 11273 <div class="swiper-slide d-flex" data-aos="fade-up" data-aos-duration="600" data-aos-delay="400"> 11274 <div id="card-post-7164" class="card-item card-post p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-7164"> 11275 <div class="box d-flex flex-column flex-grow overflow-hidden bg-white"> 11276 <a aria-label="Lees verder over:: Digitale puzzelstukjes: bouwen aan onze Digital Reality" class="clickable box" href="https://imagem.nl/nieuws-categorie/digitale-puzzelstukjes-bouwen-aan-digital-reality/"></a> 11277 <style></style> 11278 <div class="box-image p-relative"> 11279 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2024/04/Digitale-puzzelstukjes-bouwen-aan-onze-Digital-Reality-600x400.png" data-srcset="https://imagem.nl/wp-content/uploads/2024/04/Digitale-puzzelstukjes-bouwen-aan-onze-Digital-Reality-600x400.png 600w, https://imagem.nl/wp-content/uploads/2024/04/Digitale-puzzelstukjes-bouwen-aan-onze-Digital-Reality-300x200.png 300w, https://imagem.nl/wp-content/uploads/2024/04/Digitale-puzzelstukjes-bouwen-aan-onze-Digital-Reality-450x300.png 450w, https://imagem.nl/wp-content/uploads/2024/04/Digitale-puzzelstukjes-bouwen-aan-onze-Digital-Reality-900x600.png 900w, https://imagem.nl/wp-content/uploads/2024/04/Digitale-puzzelstukjes-bouwen-aan-onze-Digital-Reality-1200x800.png 1200w" data-sizes="auto" alt="Visualisatie van 3D-data als digitale puzzelstukjes die samen bouwen aan een complete Digital Reality."> <div class="oplossing-labels p-1 d-flex gap-1 p-absolute top-0 left-0"> 11280 <span class="oplossing-label label">Digital Twin</span> 11281 </div> 11282 </div> 11283 <div class="box-text d-flex flex-grow flex-column p-3 align-items-start"> 11284 <h3 id="card-title-7164" class="font-size-4">Digitale puzzelstukjes: bouwen aan onze Digital Reality</h3> <p class="excerpt">Reinier de Graaf laat zien hoe groot het verschil tussen 2D en 3D nog is, en waarom hij verwacht dat dit verschil binnen afzienbare tijd verdwijnt en overgaat in een werkbare Digital Reality.</p> 11285 <a class="more p-relative mt-auto" href="https://imagem.nl/nieuws-categorie/digitale-puzzelstukjes-bouwen-aan-digital-reality/" aria-hidden="true" tabindex="-1"> 11286 <span>Lees artikel</span> 11287 </a> 11288 </div> 11289 </div> 11290 </div> 11291 </div> 11292 <div class="swiper-slide d-flex" data-aos="fade-up" data-aos-duration="600" data-aos-delay="500"> 11293 <div id="card-post-7109" class="card-item card-post p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-7109"> 11294 <div class="box d-flex flex-column flex-grow overflow-hidden bg-white"> 11295 <a aria-label="Lees verder over:: Van dronedata naar direct inzetbaar 3D-inzicht" class="clickable box" href="https://imagem.nl/nieuws-categorie/contractondertekening-partnership-imagem-skyline/"></a> 11296 <style></style> 11297 <div class="box-image p-relative"> 11298 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2026/04/Partnership-IMAGEM-en-Skyline-600x400.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/04/Partnership-IMAGEM-en-Skyline-600x400.jpg 600w, https://imagem.nl/wp-content/uploads/2026/04/Partnership-IMAGEM-en-Skyline-300x200.jpg 300w, https://imagem.nl/wp-content/uploads/2026/04/Partnership-IMAGEM-en-Skyline-450x300.jpg 450w, https://imagem.nl/wp-content/uploads/2026/04/Partnership-IMAGEM-en-Skyline-900x600.jpg 900w, https://imagem.nl/wp-content/uploads/2026/04/Partnership-IMAGEM-en-Skyline-1200x800.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/04/Partnership-IMAGEM-en-Skyline-1800x1200.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/04/Partnership-IMAGEM-en-Skyline.jpg 1920w" data-sizes="auto" alt="Rutger van Kan van Skyline en Eric-Jan van Alten van IMAGEM ondertekenen een overeenkomst voor een geospatial partnership"> <div class="oplossing-labels p-1 d-flex gap-1 p-absolute top-0 left-0"> 11299 <sp
11299an class="oplossing-label label">Digital Twin</span> 11300 <span class="oplossing-label label">Remote Sensing</span> 11301 </div> 11302 </div> 11303 <div class="box-text d-flex flex-grow flex-column p-3 align-items-start"> 11304 <h3 id="card-title-7109" class="font-size-4">Van dronedata naar direct inzetbaar 3D-inzicht</h3> <p class="excerpt">Snelle en betrouwbare informatie maakt het verschil op momenten die ertoe doen. Toch blijft drone data in de praktijk vaak hangen in losse beelden, afzonderlijke softwarestappen en versnipperde workflows. IMAGEM en Skyline brengen daar verandering in. Met een gelijkwaardig partnership verbinden we dataverzameling, 3D-verwerking, centraal databeheer en visualisatie tot één geïntegreerde keten. </p> 11305 <a class="more p-relative mt-auto" href="https://imagem.nl/nieuws-categorie/contractondertekening-partnership-imagem-skyline/" aria-hidden="true" tabindex="-1"> 11306 <span>Lees artikel</span> 11307 </a> 11308 </div> 11309 </div> 11310 </div> 11311 </div> 11312 <div class="swiper-slide d-flex" data-aos="fade-up" data-aos-duration="600" data-aos-delay="600"> 11313 <div id="card-post-1399" class="card-item card-post p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-1399"> 11314 <div class="box d-flex flex-column flex-grow overflow-hidden bg-white"> 11315 <a aria-label="Lees verder over:: Een digital twin voor iedereen" class="clickable box" href="https://imagem.nl/nieuws-categorie/een-digital-twin-voor-iedereen/"></a> 11316 <style></style> 11317 <div class="box-image p-relative"> 11318 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2025/11/Een-digital-twin-voor-iedereen-600x400.jpeg" data-srcset="https://imagem.nl/wp-content/uploads/2025/11/Een-digital-twin-voor-iedereen-600x400.jpeg 600w, https://imagem.nl/wp-content/uploads/2025/11/Een-digital-twin-voor-iedereen-300x200.jpeg 300w, https://imagem.nl/wp-content/uploads/2025/11/Een-digital-twin-voor-iedereen-450x300.jpeg 450w, https://imagem.nl/wp-content/uploads/2025/11/Een-digital-twin-voor-iedereen-900x600.jpeg 900w, https://imagem.nl/wp-content/uploads/2025/11/Een-digital-twin-voor-iedereen-1200x800.jpeg 1200w" data-sizes="auto" alt="Digital twins die jouw gemeente helpen bij complexe vraagstukken"> <div class="oplossing-labels p-1 d-flex gap-1 p-absolute top-0 left-0"> 11319 <span class="oplossing-label label">Digital Twin</span> 11320 </div> 11321 </div> 11322 <div class="box-text d-flex flex-grow flex-column p-3 align-items-start"> 11323 <h3 id="card-title-1399" class="font-size-4">Een digital twin voor iedereen</h3> <p class="excerpt">Beleid maken is complex door versnipperde data en tijdrovende processen. Digital twins bieden uitkomst, maar vergen kennis en techniek. IMAGEM combineert technologie, expertise en een praktische aanpak, zodat digital twins wél laagdrempelig en direct inzetbaar worden voor gemeenten.</p> 11324 <a class="more p-relative mt-auto" href="https://imagem.nl/nieuws-categorie/een-digital-twin-voor-iedereen/" aria-hidden="true" tabindex="-1">
11325 <span>Lees artikel</span> 11326 </a> 11327 </div> 11328 </div> 11329 </div> 11330 </div> 11331 <div class="swiper-slide d-flex" data-aos="fade-up" data-aos-duration="600" data-aos-delay="700"> 11332 <div id="card-post-1690" class="card-item card-post p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-1690"> 11333 <div class="box d-flex flex-column flex-grow overflow-hidden bg-white"> 11334 <a aria-label="Lees verder over:: Twee jubilarissen, één verhaal" class="clickable box" href="https://imagem.nl/medewerkers/twee-jubilarissen-imagem-niels-en-syreetha/"></a> 11335 <style></style> 11336 <div class="box-image p-relative"> 11337 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2025/10/IMAGEM-blog-Jubileum-Syreetha-en-Niels-01-600x400.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2025/10/IMAGEM-blog-Jubileum-Syreetha-en-Niels-01-600x400.jpg 600w, https://imagem.nl/wp-content/uploads/2025/10/IMAGEM-blog-Jubileum-Syreetha-en-Niels-01-300x200.jpg 300w, https://imagem.nl/wp-content/uploads/2025/10/IMAGEM-blog-Jubileum-Syreetha-en-Niels-01-450x300.jpg 450w, https://imagem.nl/wp-content/uploads/2025/10/IMAGEM-blog-Jubileum-Syreetha-en-Niels-01-900x600.jpg 900w, https://imagem.nl/wp-content/uploads/2025/10/IMAGEM-blog-Jubileum-Syreetha-en-Niels-01-1200x800.jpg 1200w" data-sizes="auto" alt="Twee jubilarissen, één verhaal. Een dubbelinterview met Niels en Syreetha"> </div> 11338 <div class="box-text d-flex flex-grow flex-column p-3 align-items-start"> 11339 <h3 id="card-title-1690" class="font-size-4">Twee jubilarissen, één verhaal</h3> <p class="excerpt">Dit jaar vieren twee collegaâs een bijzonder jubileum bij IMAGEM: Niels van de Graaf, marktmanager Overheid, is al 10 jaar aan boord, en Syreetha Nuhuway, operations en duizendpoot, werkt inmiddels 5 jaar bij het bedrijf. Een mooie aanleiding om stil te staan bij hun werk, hun groei en vooral de mensen achter de functies.</p> 11340 <a class="more p-relative mt-auto" href="https://imagem.nl/medewerkers/twee-jubilarissen-imagem-niels-en-syreetha/" aria-hidden="true" tabindex="-1"> 11341 <span>Lees artikel</span> 11342 </a> 11343 </div> 11344 </div> 11345 </div> 11346 </div> 11347 <div class="swiper-slide d-flex" data-aos="fade-up" data-aos-duration="600" data-aos-delay="800"> 11348 <div id="card-post-778" class="card-item card-post p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-778"> 11349 <div class="box d-flex flex-column flex-grow overflow-hidden bg-white"> 11350 <a aria-label="Lees verder over:: Van game tot globe: Hoe 3D-engines de wereld veroveren" class="clickable box" href="https://imagem.nl/nieuws-categorie/van-game-tot-globe-hoe-3d-engines-de-wereld-veroveren/"></a> 11351 <style></style> 11352 <div class="box-image p-relative"> 11353 <img class="lazyload" width="600" height="400" data-src="https://imagem.nl/wp-content/uploads/2025/09/2026_IMAGEM_1920x1280_022_Blog-GEO-Engine-600x400.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2025/09/2026_IMAGEM_1920x1280_022_Blog-GEO-Engine-600x400.jpg 600w, https://imagem.nl/wp-content/uploads/2025/09/2026_IMAGEM_1920x1280_022_Blog-GEO-Engine-300x200.jpg 300w, https://imagem.nl/wp-content/uploads/2025/09/2026_IMAGEM_1920x1280_022_Blog-GEO-Engine-450x300.jpg 450w, https://imagem.nl/wp-content/uploads/2025/09/2026_IMAGEM_1920x1280_022_Blog-GEO-Engine-900x600.jpg 900w, https://imagem.nl/wp-content/uploads/2025/09/2026_IMAGEM_1920x1280_022_Blog-GEO-Engine-1200x800.jpg 1200w, https://imagem.nl/wp-content/uploads/2025/09/2026_IMAGEM_1920x1280_022_Blog-GEO-Engine-1800x1200.jpg 1800w, https://imagem.nl/wp-content/uploads/2025/09/2026_IMAGEM_1920x1280_022_Blog-GEO-Engine.jpg 1920w" data-sizes="auto" alt="De opvallende verschillen tussen geo-engines en game-engines"> <div class="oplossing-labels p-1 d-flex gap-1 p-absolute top-0 left-0"> 11354 <sp
11354an class="oplossing-label label">Digital Twin</span> 11355 </div> 11356 </div> 11357 <div class="box-text d-flex flex-grow flex-column p-3 align-items-start"> 11358 <h3 id="card-title-778" class="font-size-4">Van game tot globe: Hoe 3D-engines de wereld veroveren</h3> <p class="excerpt">3D-technologie wordt nu ingezet voor toepassingen in de âechte wereldâ: van slimme steden tot luchtverkeersleiding. Maar hoe kan een engine die ooit bedoeld was om virtuele werelden tot leven te brengen, ineens cruciaal zijn voor grote geospatiale projecten? In dit artikel duiken we in de opvallende verschillen tussen geo-engines en game-engines. Want als het draait om nauwkeurigheid, schaal en betrouwbaarheid, dan blijkt een geo-engine zoals Luciad in een totaal andere klasse te opereren.</p> 11359 <a class="more p-relative mt-auto" href="https://imagem.nl/nieuws-categorie/van-game-tot-globe-hoe-3d-engines-de-wereld-veroveren/" aria-hidden="true" tabindex="-1"> 11360 <span>Lees artikel</span> 11361 </a> 11362 </div> 11363 </div> 11364 </div> 11365 </div> 11366 </div> 11367 <div class="slider-overlay slider-overlay-right"></div> 11368 <div class="slider-footer d-flex justify-content-center align-items-center"> 11369 <div class="swiper-pagination pagination-news border-radius-sm d-flex align-items-center"></div> 11370 </div> 11371 <div class="swiper-prev news-swiper-prev"></div> 11372 <div class="swiper-next news-swiper-next"></div> 11373 </div> 11374 </div> 11375 </div> 11376 </div> 11377 11378 11379 <div id="cta-block_f0582733e9c3d803a9f47bb7f3072d36" 11380 class="max-block-cta content-block d-flex flex-column"> 11381 <div class="bg-full "></div> 11382 <div class="row gy-0 gx-4 gx-lg-6"> 11383 <div class="col-lg-6 order-lg-last d-flex align-items-center" data-aos="fade-up" data-aos-duration="600"> 11384 <style></style> 11385 <div id="image-4215" class="cta-img box box-image p-relative" style="aspect-ratio: "> 11386 <img class="lazyload" width="450" height="253" data-src="https://imagem.nl/wp-content/uploads/2026/03/2026_IMAGEM_1920x1280_001_Team-2024_02-450x253.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2026/03/2026_IMAGEM_1920x1280_001_Team-2024_02-450x253.jpg 450w, https://imagem.nl/wp-content/uploads/2026/03/2026_IMAGEM_1920x1280_001_Team-2024_02-300x169.jpg 300w, https://imagem.nl/wp-content/uploads/2026/03/2026_IMAGEM_1920x1280_001_Team-2024_02-600x338.jpg 600w, https://imagem.nl/wp-content/uploads/2026/03/2026_IMAGEM_1920x1280_001_Team-2024_02-900x506.jpg 900w, https://imagem.nl/wp-content/uploads/2026/03/2026_IMAGEM_1920x1280_001_Team-2024_02-1200x675.jpg 1200w, https://imagem.nl/wp-content/uploads/2026/03/2026_IMAGEM_1920x1280_001_Team-2024_02-1800x1013.jpg 1800w, https://imagem.nl/wp-content/uploads/2026/03/2026_IMAGEM_1920x1280_001_Team-2024_02.jpg 1920w" data-sizes="auto" alt=""> </div> 11387 </div> 11388 11389 <div class="col-lg-6 order-lg-first d-flex align-items-center"> 11390 <div class="cta-txt mt-lg-0 p-relative d-flex flex-column align-items-start py-4 py-lg-6" data-aos="fade-left" data-aos-duration="600"> 11391 <div class="block-subtitle mb-2 uppercase color-2 font-bold"> 11392 Over IMAGEM </div> 11393 <div class="block-title mb-2"> 11394 <h2 class="font-size-3">Samenwerken aan datagedreven besluitvorming </h2> 11395 </div> 11396 <div class="block-text"> 11397 <p>Achter IMAGEM staat een team van gedreven specialisten die domeinkennis, data en technologie samenbrengen. Door deze slim te combineren, vertalen we complexe vraagstukken naar heldere inzichten en concrete oplossingen. Zo realiseer je meer grip, betere keuzes en blijvende impact in de leefomgeving.</p> 11398 </div> 11399 <a class="button mt-3" 11400 href="https://imagem.nl/over-ons/" 11401 target=""> 11402 Lees meer over IMAGEM <sp
11402an class="more"></span> 11403 </a> 11404 </div> 11405 </div> 11406 </div> 11407 </div> 11408 11409 11410 <div id="ctafull-block_489d10c5a989040139768d530dea508f" class="max-block-ctafull content-block bg-image box overflow-hidden d-flex flex-column justify-content-end" data-aos="fade-up" data-aos-duration="600"> 11411 <div class="ctafull-image box-image bg-image p-absolute top-0 left-0 h-100 w-100"> 11412 <style></style> 11413 <img class="lazyload" width="450" height="300" data-src="https://imagem.nl/wp-content/uploads/2025/12/IMG_3235-450x300.jpg" data-srcset="https://imagem.nl/wp-content/uploads/2025/12/IMG_3235-450x300.jpg 450w, https://imagem.nl/wp-content/uploads/2025/12/IMG_3235-300x200.jpg 300w, https://imagem.nl/wp-content/uploads/2025/12/IMG_3235-600x400.jpg 600w, https://imagem.nl/wp-content/uploads/2025/12/IMG_3235-900x600.jpg 900w, https://imagem.nl/wp-content/uploads/2025/12/IMG_3235-1200x800.jpg 1200w, https://imagem.nl/wp-content/uploads/2025/12/IMG_3235-1800x1200.jpg 1800w, https://imagem.nl/wp-content/uploads/2025/12/IMG_3235.jpg 1920w" data-sizes="auto" alt="Training Digital twin met LEF"> </div> 11414 <div class="ctafull-content pt-4 pt-lg-0 px-4 pb-4 px-lg-6 pb-lg-6 gradient-overlay-top p-relative"> 11415 <div class="row"> 11416 <div class="col-xl-8 col-lg-7 col-md-6 d-flex flex-column justify-content-end"> 11417 <div class="cta-txt mt-lg-0 p-relative"> 11418 <div class="block-subtitle mb-2 uppercase font-bold"> 11419 <p>Kennis van 3D/digital twins uitbreiden?</p> 11420 </div> 11421 <div class="block-title mb-2"> 11422 <h2><p>Training 3D / Digital twin met LEF</p> 11423</h2> 11424 </div> 11425 <a class="button mt-2" 11426 href="https://imagem.nl/training/digital-twin-met-lef/" 11427 target="_blank"> 11428 Meer informatie <span class="more"></span> 11429 </a> 11430 </div> 11431 </div> 11432 <div class="col-xl-4 col-lg-5 col-md-6 p-relative"> 11433 <div id="card-page-3940" class="card-item card-page p-relative d-flex flex-grow box box-hover post-452 page type-page status-publish hentry" role="article" aria-labelledby="card-title-3940"> 11434 <a aria-label="Lees verder over:: 3D / Digital Twin met Lef training" class="clickable box" href="https://imagem.nl/training/digital-twin-met-lef/"></a> 11435 <div class="box d-flex flex-column flex-grow overflow-hidden bg-image" data-aos="fade"> 11436 <div class="box-text d-flex justify-content-between align-items-center px-2 py-1 p-absolute bottom-0 left-0 bg-white-blur gap-1 w-100"> 11437 <p id="card-title-3940" class="font-small mb-0">3D / Digital Twin met Lef training</p> 11438 <i class="fal fa-arrow-right" aria-hidden="true"></i> 11439 </div> 11440 </div> 11441 </div> 11442 </div> 11443 </div> 11444 </div> 11445 </div> 11446 </div> 11447 </div> 11448 </section> 11449 </div> 11450</main> 11451 <footer data-wpr-lazyrender="1" id="footer" class="font-small"> 11452 <div id="footer-top"> 11453 <div class="container"> 11454 11455<div class="wp-block-columns has-4-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns has-4-columns-is-layout-flex"> 11456<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"> <div id="media-block_195cd5703fc4e674ede936a24cb0e934" 11457 class="max-block-media my-3 my-lg-4 d-flex flex-column justify-content-end" 11458 data-aos="fade"> 11459 <style></style> 11460 <div id="image-820" class="cta-img box box-image p-relative" style="aspect-ratio: "> 11461 <img class="lazyload" width="1" height="1" data-src="https://imagem.nl/wp-content/uploads/2025/09/imagem-logo.svg" data-srcset="" data-sizes="auto" alt=""> </div> 11462 </div> 11463 11464 11465 <div id="follow-block_04128c30909c482e5c3006f453357bcd" 11466 class="max-block-follow my-3"> 11467 <div class="title mb-2 font-size-5">Volg ons</div> 11468 <div class="social-share"> 11469 <div class='socials-go-to-container d-flex align-items-center justify-content-start gap-1'><a href='https://www.linkedin.com/company/imagemnl' target='_blank' class='go-to-item go-to-item-linkedin' title='Ga naar LinkedIn'><i class="fab fa-linkedin-in max-core-social-linkedin"></i></a>
11469<a href='https://www.youtube.com/channel/UCQvUpDBOeuDifsYqaueveQg' target='_blank' class='go-to-item go-to-item-youtube' title='Ga naar Youtube'><i class="fab fa-youtube max-core-social-youtube"></i></a><a href='https://www.instagram.com/imagembv/' target='_blank' class='go-to-item go-to-item-instagram' title='Ga naar Instagram'><i class="fab fa-instagram max-core-social-instagram"></i></a><a href='https://open.spotify.com/show/34EWgwXZ73Vk8ZsWoIxWJd?si=d61ad58dfaa64818&nd=1&dlsi=c7872368ecd24e2a' target='_blank' class='go-to-item go-to-item-spotify' title='Ga naar Spotify'><i class="fab fa-spotify max-core-social-spotify"></i></a></div> </div> 11470 </div> 11471 11472 11473 11474<h2 class="wp-block-heading has-size-5-font-size">Nieuwsbrief</h2> 11475 11476 11477 11478<p class="wp-block-paragraph">
11478<script>(function() { 11479 window.mc4wp = window.mc4wp || { 11480 listeners: [], 11481 forms: { 11482 on: function(evt, cb) { 11483 window.mc4wp.listeners.push( 11484 { 11485 event : evt, 11486 callback: cb 11487 } 11488 ); 11489 } 11490 } 11491 } 11492})(); 11493</script>
11493<!-- Mailchimp for WordPress v4.14.1 - https://wordpress.org/plugins/mailchimp-for-wp/ --><form id="mc4wp-form-1" class="mc4wp-form mc4wp-form-5238" method="post" data-id="5238" data-name="Nieuwsbrief" ><div class="mc4wp-form-fields"><p> 11494 <label for="firstname" hidden>Naam</label> 11495 <input id="firstname" type="text" name="FNAME" placeholder="Naam" required> 11496</p> 11497<p> 11498 <label for="email" hidden>E-mailadres</label> 11499 <input type="email" id="email" name="EMAIL" placeholder="E-mailadres" required> 11500</p> 11501<input type="submit" value="Inschrijven"></div><label style="display: none !important;">Leave this field empty if you're human: <input type="text" name="_mc4wp_honeypot" value="" tabindex="-1" autocomplete="off" /></label><input type="hidden" name="_mc4wp_timestamp" value="1790813064" /><input type="hidden" name="_mc4wp_form_id" value="5238" /><input type="hidden" name="_mc4wp_form_element_id" value="mc4wp-form-1" /><div class="mc4wp-response"></div></form><!-- / Mailchimp for WordPress Plugin --></p> 11502</div> 11503 11504 11505 11506<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"> 11507<p class="has-size-5-font-size wp-block-paragraph"><strong>Thema’s</strong></p> 11508 11509 11510 11511<p class="wp-block-paragraph"><a href="https://imagem.nl/thema/klimaat/" data-type="thema" data-id="11">Klimaat</a></p> 11512 11513 11514 11515<p class="wp-block-paragraph"><a href="https://imagem.nl/thema/gebiedsontwikkeling/">Gebiedsontwikkeling</a></p> 11516 11517 11518 11519<p class="wp-block-paragraph"><a href="https://imagem.nl/thema/veiligheid/" data-type="thema" data-id="15">Veiligheid</a></p> 11520 11521 11522 11523<div style="height:31px" aria-hidden="true" class="wp-block-spacer"></div> 11524 11525 11526 11527<p class="has-size-5-font-size wp-block-paragraph"><strong>Over IMAGEM</strong></p> 11528 11529 11530 11531<p class="wp-block-paragraph"><a href="https://imagem.nl/over-ons/">Over ons</a></p> 11532 11533 11534 11535<p class="wp-block-paragraph"><a href="https://imagem.nl/aanpak/" type="link" id="https://imagem.nl/aanpak/">Onze aanpak</a></p> 11536 11537 11538 11539<p class="wp-block-paragraph"><a href="https://imagem.nl/team/" type="link" id="https://imagem.nl/team/">Team</a></p> 11540 11541 11542 11543<p class="wp-block-paragraph"><a href="https://imagem.nl/werken-bij/">Werken bij</a></p> 11544 11545 11546 11547<p class="wp-block-paragraph"><a href="https://imagem.nl/informatiebeveiliging/" type="link" id="https://imagem.nl/informatiebeveiliging/">ISO 27001</a></p> 11548</div> 11549 11550 11551 11552<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"> 11553<p class="has-size-5-font-size wp-block-paragraph"><strong>Oplossingen</strong></p> 11554 11555 11556 11557<p class="wp-block-paragraph"><a href="https://imagem.nl/oplossing/digital-twin/" data-type="oplossing" data-id="368">Digital Twin</a></p> 11558 11559 11560 11561<p class="wp-block-paragraph"><a href="https://imagem.nl/oplossing/beleidsbewuste-digital-twin/">Beleidsbewuste Digital Twin</a></p> 11562 11563 11564 11565<p class="wp-block-paragraph"><a data-type="oplossing" data-id="584" href="https://imagem.nl/oplossing/remote-sensing/">Remote Sensing</a></p> 11566 11567 11568 11569<div style="height:31px" aria-hidden="true" class="wp-block-spacer"></div> 11570 11571 11572 11573<p class="has-size-5-font-size wp-block-paragraph"><strong>Wat wij doen</strong></p> 11574 11575 11576 11577<p class="wp-block-paragraph"><a href="https://imagem.nl/nieuws/">Nieuws</a></p> 11578 11579 11580 11581<p class="wp-block-paragraph"><a href="/cases/">Cases</a></p> 11582 11583 11584 11585<p class="wp-block-paragraph"><a href="/toepassingen/">Toepassingen</a></p> 11586 11587 11588 11589<p class="wp-block-paragraph"><a href="/training/">Trainingen</a></p> 11590 11591 11592 11593<p class="wp-block-paragraph"><a href="https://imagem.nl/oplossing/digital-twin/lab/">Digital Twin Lab</a></p> 11594</div> 11595 11596 11597 11598<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"> 11599<p class="has-size-5-font-size wp-block-paragraph"><strong>Contact</strong></p> 11600 11601 11602 11603<p class="wp-block-paragraph">Deventerstraat 37<br>7311 LT Apeldoorn<br>T: <a href="tel:0552002055">055 – 200 2055</a></p> 11604 11605 11606 11607<div style="height:31px" aria-hidden="true" class="wp-block-spacer"></div> 11608 11609 11610 11611<div class="wp-block-columns has-4-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns has-4-columns has-2-columns-is-layout-flex"> 11612<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"> <div id="media-block_c40871c044577c7d7c1cb5ec9b8d2836" 11613 class="max-block-media my-3 my-lg-4 d-flex flex-column justify-content-end" 11614 data-aos="fade"> 11615 <style></style> 11616 <div id="image-5263" class="cta-img box box-image p-relative" style="aspect-ratio: "> 11617 <a href="https://imagem.nl/informatiebeveiliging/" target="_self" title="Informatiebeveiliging" class="d-block w-100 h-100"> 11618 <img class="lazyload" width="126" height="180" data-src="https://imagem.nl/wp-content/uploads/2025/09/footer-iso-1.png" data-srcset="" data-sizes="auto" alt=""> </a> 11619 </div> 11620 </div> 11621</div> 11622 11623 11624 11625<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:55%"> <div id="media-block_10734c96bd59b3de12cc93746d7e8d51" 11626 class="max-block-media my-3 my-lg-4 d-flex flex-column justify-content-end" 11627 data-aos="fade"> 11628 <style></style> 11629 <div id="image-5252" class="cta-img box box-image p-relative" style="aspect-ratio: "> 11630 <a href="https://hexagon.com/" target="_blank" class="d-block w-100 h-100"> 11631 <img class="lazyload" width="206" height="180" data-src="https://imagem.nl/wp-content/uploads/2025/09/footer-hexagon.png" data-srcset="" data-sizes="auto" alt=""> </a> 11632 </div> 11633 </div> 11634</div> 11635</div> 11636</div> 11637</div> 11638 </div> 11639 </div> 11640 <div id="footer-bottom" class="bg-2-lighter"> 11641 <div class="container"> 11642 <div class="d-flex flex-wrap flex-column flex-md-row justify-content-center justify-content-md-between align-items-center gap-3"> 11643 <div class="footer-bottom-left d-flex flex-column flex-md-row flex-wrap align-items-center gap-3"> 11644 <div class="copy">© 2026 IMAGEM</div> 11645 <ul id="menu-footer-menu" class="footer-menu d-flex flex-wrap flex-column flex-md-row align-items-center gap-column-3"><li id="menu-item-2009" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2009"><a href="https://imagem.nl/algemene-voorwaarden/">Algemene voorwaarden</a></li> 11646<li id="menu-item-1991" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy menu-item-1991"><a rel="privacy-policy" href="https://imagem.nl/privacy-policy/">Privacy Statement</a></li> 11647<li id="menu-item-7040" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-7040"><a href="https://imagem.nl/cookiebeleid-eu/?cmplz_region_redirect=true">Cookiebeleid</a></li> 11648<li id="menu-item-6967" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6967"><a href="https://imagem.nl/sitemap_index.xml">Sitemap</a></li> 11649</ul> </div> 11650 <div class="footer-bottom-right d-flex flex-wrap">
11651 <span class="by-max"> 11652 By <a href="https://max.nl/" target="_blank" title="Bureau Max">Max</a> 11653 </span> 11654 </div> 11655 </div> 11656 </div> 11657 </div> 11658 </footer> 11659</div>
11660<script type="speculationrules"> 11661{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/cms/wp-*.php","/cms/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/imagem/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 11662</script>
vendor: 1 bytes, line 11662
11662
11663<script>(function() {function maybePrefixUrlField () { 11664 const value = this.value.trim() 11665 if (value !== '' && value.indexOf('http') !== 0) { 11666 this.value = 'http://' + value 11667 } 11668} 11669 11670const urlFields = document.querySelectorAll('.mc4wp-form input[type="url"]') 11671for (let j = 0; j < urlFields.length; j++) { 11672 urlFields[j].addEventListener('blur', maybePrefixUrlField) 11673} 11674})();</script>
11674 11675<!-- Consent Management powered by Complianz | GDPR/CCPA Cookie Consent https://wordpress.org/plugins/complianz-gdpr --> 11676<div id="cmplz-cookiebanner-container"><div id="cmplz-cookiebanner-1-optin" class="cmplz-cookiebanner cmplz-hidden banner-1 banner-a optin cmplz-bottom-right cmplz-categories-type-view-preferences" aria-modal="true" data-nosnippet="true" role="dialog" aria-live="polite" aria-labelledby="cmplz-header-1-optin" aria-describedby="cmplz-message-1-optin"> 11677 <div class="cmplz-header"> 11678 <div class="cmplz-logo"></div> 11679 <div class="cmplz-title" id="cmplz-header-1-optin">Beheer toestemming</div> 11680 <div class="cmplz-close" tabindex="0" role="button" aria-label="Close dialog"> 11681 <svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="times" class="svg-inline--fa fa-times fa-w-11" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512"><path fill="currentColor" d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"></path></svg> 11682 </div> 11683 </div> 11684 11685 <div class="cmplz-divider cmplz-divider-header"></div> 11686 <div class="cmplz-body"> 11687 <div class="cmplz-message" id="cmplz-message-1-optin">Om de beste ervaringen te bieden, gebruiken wij technologieën zoals cookies om informatie over je apparaat op te slaan en/of te raadplegen. Door in te stemmen met deze technologieën kunnen wij gegevens zoals surfgedrag of unieke ID's op deze site verwerken. Als je geen toestemming geeft of uw toestemming intrekt, kan dit een nadelige invloed hebben op bepaalde functies en mogelijkheden.</div> 11688 <!-- categories start --> 11689 <div class="cmplz-categories"> 11690 <div class="cmplz-category cmplz-functional"> 11691 <div class="cmplz-category-header"> 11692 <span class="cmplz-category-title" id="cmplz-title-functional-1-optin">Functioneel</span> 11693 <span class='cmplz-always-active'> 11694 <span class="cmplz-banner-checkbox"> 11695 <input type="checkbox" 11696 id="cmplz-functional-optin" 11697 data-category="cmplz_functional" 11698 class="cmplz-consent-checkbox cmplz-functional" 11699 size="40" 11700 value="1"/> 11701 <label class="cmplz-label" for="cmplz-functional-optin"><span class="screen-reader-text">Functioneel</span></label> 11702 </span> 11703 Always active </span> 11704 <button class="cmplz-category-toggle" 11705 aria-expanded="false" 11706 aria-controls="cmplz-desc-functional-1-optin" 11707 aria-labelledby="cmplz-title-functional-1-optin"> 11708 <span class="cmplz-icon cmplz-open"> 11709 <svg aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" height="18"><path d="M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"/></svg> 11710 </span> 11711 </button> 11712 </div> 11713 <div class="cmplz-description" id="cmplz-desc-functional-1-optin" hidden> 11714 <span class="cmplz-description-functional">De technische opslag of toegang is strikt noodzakelijk voor het legitieme doel het gebruik mogelijk te maken van een specifieke dienst waarom de abonnee of gebruiker uitdrukkelijk heeft gevraagd, of met als enig doel de uitvoering van de transmissie van een communicatie over een elektronisch communicatienetwerk.</span> 11715 </div> 11716 </div> 11717 11718 <div class="cmplz-category cmplz-preferences"> 11719 <div class="cmplz-category-header"> 11720 <span class="cmplz-category-title" id="cmplz-title-preferences-1-optin">Voorkeuren</span> 11721 <span class="cmplz-banner-checkbox"> 11722 <input type="checkbox" 11723 id="cmplz-preferences-optin" 11724 data-category="cmplz_preferences" 11725 class="cmplz-consent-checkbox cmplz-preferences" 11726 size="40" 11727 value="1"/> 11728 <label class="cmplz-label" for="cmplz-preferences-optin"><span class="screen-reader-text">Voorkeuren</span></label> 11729 </span> 11730 <button class="cmplz-category-toggle" 11731 aria-expanded="false" 11732 aria-controls="cmplz-desc-preferences-1-optin" 11733 aria-labelledby="cmplz-title-preferences-1-optin"> 11734 <span class="cmplz-icon cmplz-open"> 11735 <svg aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" height="18">
11735<path d="M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"/></svg> 11736 </span> 11737 </button> 11738 </div> 11739 <div class="cmplz-description" id="cmplz-desc-preferences-1-optin" hidden> 11740 <span class="cmplz-description-preferences">De technische opslag of toegang is noodzakelijk voor het legitieme doel voorkeuren op te slaan die niet door de abonnee of gebruiker zijn aangevraagd.</span> 11741 </div> 11742 </div> 11743 11744 <div class="cmplz-category cmplz-statistics"> 11745 <div class="cmplz-category-header"> 11746 <span class="cmplz-category-title" id="cmplz-title-statistics-1-optin">Statistieken</span> 11747 <span class="cmplz-banner-checkbox"> 11748 <input type="checkbox" 11749 id="cmplz-statistics-optin" 11750 data-category="cmplz_statistics" 11751 class="cmplz-consent-checkbox cmplz-statistics" 11752 size="40" 11753 value="1"/> 11754 <label class="cmplz-label" for="cmplz-statistics-optin"><span class="screen-reader-text">Statistieken</span></label> 11755 </span> 11756 <button class="cmplz-category-toggle" 11757 aria-expanded="false" 11758 aria-controls="cmplz-desc-statistics-1-optin" 11759 aria-labelledby="cmplz-title-statistics-1-optin"> 11760 <span class="cmplz-icon cmplz-open"> 11761 <svg aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" height="18"><path d="M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"/></svg> 11762 </span> 11763 </button> 11764 </div> 11765 <div class="cmplz-description" id="cmplz-desc-statistics-1-optin" hidden> 11766 <span class="cmplz-description-statistics">De technische opslag of toegang die uitsluitend voor statistische doeleinden wordt gebruikt.</span> 11767 <span class="cmplz-description-statistics-anonymous">De technische opslag of toegang die uitsluitend wordt gebruikt voor anonieme statistische doeleinden. Zonder dagvaarding, vrijwillige naleving door uw Internet Service Provider, of aanvullende gegevens van een derde partij, kan informatie die alleen voor dit doel wordt opgeslagen of opgehaald gewoonlijk niet worden gebruikt om je te identificeren.</span> 11768 </div> 11769 </div> 11770 11771 <div class="cmplz-category cmplz-marketing"> 11772 <div class="cmplz-category-header"> 11773 <span class="cmplz-category-title" id="cmplz-title-marketing-1-optin">Marketing</span> 11774 <span class="cmplz-banner-checkbox"> 11775 <input type="checkbox" 11776 id="cmplz-marketing-optin" 11777 data-category="cmplz_marketing" 11778 class="cmplz-consent-checkbox cmplz-marketing" 11779 size="40" 11780 value="1"/> 11781 <label class="cmplz-label" for="cmplz-marketing-optin"><span class="screen-reader-text">Marketing</span></label> 11782 </span> 11783 <button class="cmplz-category-toggle" 11784 aria-expanded="false" 11785 aria-controls="cmplz-desc-marketing-1-optin" 11786 aria-labelledby="cmplz-title-marketing-1-optin"> 11787 <span class="cmplz-icon cmplz-open"> 11788 <svg aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" height="18"><path d="M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"/></svg> 11789 </span> 11790 </button> 11791 </div> 11792 <div class="cmplz-description" id="cmplz-desc-marketing-1-optin" hidden> 11793 <span class="cmplz-description-marketing">De technische opslag of toegang is nodig om gebruikersprofielen op te stellen voor het verzenden van reclame, of om de gebruiker op een site of over verschillende sites te volgen voor soortgelijke marketingdoeleinden.</span> 11794 </div> 11795 </div> 11796 </div><!-- categories end --> 11797 </div> 11798 11799 <div class="cmplz-links cmplz-information"> 11800 <ul> 11801 <li><a class="cmplz-link cmplz-manage-options cookie-statement" href="#" data-relative_url="#cmplz-manage-consent-container">Manage options</a></li> 11802 <li><a class="cmplz-link cmplz-manage-third-parties cookie-statement" href="#" data-relative_url="#cmplz-cookie
11802s-overview">Manage services</a></li> 11803 <li><a class="cmplz-link cmplz-manage-vendors tcf cookie-statement" href="#" data-relative_url="#cmplz-tcf-wrapper">Manage {vendor_count} vendors</a></li> 11804 <li><a class="cmplz-link cmplz-external cmplz-read-more-purposes tcf" target="_blank" rel="noopener noreferrer nofollow" href="https://cookiedatabase.org/tcf/purposes/" aria-label="Read more about TCF purposes on Cookie Database">Read more about these purposes</a></li> 11805 </ul> 11806 </div> 11807 11808 <div class="cmplz-divider cmplz-footer"></div> 11809 11810 <div class="cmplz-buttons"> 11811 <button class="cmplz-btn cmplz-accept">Accepteren</button> 11812 <button class="cmplz-btn cmplz-deny">Weiger</button> 11813 <button class="cmplz-btn cmplz-view-preferences">Bekijk voorkeuren</button> 11814 <button class="cmplz-btn cmplz-save-preferences">Voorkeuren bewaren</button> 11815 <a class="cmplz-btn cmplz-manage-options tcf cookie-statement" href="#" data-relative_url="#cmplz-manage-consent-container">Bekijk voorkeuren</a> 11816 </div> 11817 11818 11819 <div class="cmplz-documents cmplz-links"> 11820 <ul> 11821 <li><a class="cmplz-link cookie-statement" href="#" data-relative_url="">{title}</a></li> 11822 <li><a class="cmplz-link privacy-statement" href="#" data-relative_url="">{title}</a></li> 11823 <li><a class="cmplz-link impressum" href="#" data-relative_url="">{title}</a></li> 11824 </ul> 11825 </div> 11826</div> 11827</div> 11828 <div id="cmplz-manage-consent" data-nosnippet="true"><button class="cmplz-btn cmplz-hidden cmplz-manage-consent manage-consent-1" aria-haspopup="dialog" aria-controls="cmplz-cookiebanner-1-optin">Beheer toestemming</button> 11829 11830</div>
11830<script id="rocket-browser-checker-js-after"> 11831"use strict";var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){return protoProps&&defineProperties(Constructor.prototype,protoProps),staticProps&&defineProperties(Constructor,staticProps),Constructor}}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}var RocketBrowserCompatibilityChecker=function(){function RocketBrowserCompatibilityChecker(options){_classCallCheck(this,RocketBrowserCompatibilityChecker),this.passiveSupported=!1,this._checkPassiveOption(this),this.options=!!this.passiveSupported&&options}return _createClass(RocketBrowserCompatibilityChecker,[{key:"_checkPassiveOption",value:function(self){try{var options={get passive(){return!(self.passiveSupported=!0)}};window.addEventListener("test",null,options),window.removeEventListener("test",null,options)}catch(err){self.passiveSupported=!1}}},{key:"initRequestIdleCallback",value:function(){!1 in window&&(window.requestIdleCallback=function(cb){var start=Date.now();return setTimeout(function(){cb({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-start))}})},1)}),!1 in window&&(window.cancelIdleCallback=function(id){return clearTimeout(id)})}},{key:"isDataSaverModeOn",value:function(){return"connection"in navigator&&!0===navigator.connection.saveData}},{key:"supportsLinkPrefetch",value:function(){var elem=document.createElement("link");return elem.relList&&elem.relList.supports&&elem.relList.supports("prefetch")&&window.IntersectionObserver&&"isIntersecting"in IntersectionObserverEntry.prototype}},{key:"isSlowConnection",value:function(){return"connection"in navigator&&"effectiveType"in navigator.connection&&("2g"===navigator.connection.effectiveType||"slow-2g"===navigator.connection.effectiveType)}}]),RocketBrowserCompatibilityChecker}(); 11832//# sourceURL=rocket-browser-checker-js-after 11833</script>
vendor: 1 bytes, line 11833
11833
11834<script id="rocket-preload-links-js-extra"> 11835var RocketPreloadLinksConfig = {"excludeUris":"/(?:.+/)?feed(?:/(?:.+/?)?)?$|/(?:.+/)?embed/|/(index.php/)?(.*)wp-json(/.*|$)|/refer/|/go/|/recommend/|/recommends/","usesTrailingSlash":"1","imageExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php","fileExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php|html|htm","siteUrl":"https://imagem.nl","onHoverDelay":"100","rateThrottle":"3"}; 11836//# sourceURL=rocket-preload-links-js-extra 11837</script>
vendor: 1 bytes, line 11837
11837
11838<script id="rocket-preload-links-js-after"> 11839(function() { 11840"use strict";var r="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},e=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}();function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var t=function(){function n(e,t){i(this,n),this.browser=e,this.config=t,this.options=this.browser.options,this.prefetched=new Set,this.eventTime=null,this.threshold=1111,this.numOnHover=0}return e(n,[{key:"init",value:function(){!this.browser.supportsLinkPrefetch()||this.browser.isDataSaverModeOn()||this.browser.isSlowConnection()||(this.regex={excludeUris:RegExp(this.config.excludeUris,"i"),images:RegExp(".("+this.config.imageExt+")$","i"),fileExt:RegExp(".("+this.config.fileExt+")$","i")},this._initListeners(this))}},{key:"_initListeners",value:function(e){-1<this.config.onHoverDelay&&document.addEventListener("mouseover",e.listener.bind(e),e.listenerOptions),document.addEventListener("mousedown",e.listener.bind(e),e.listenerOptions),document.addEventListener("touchstart",e.listener.bind(e),e.listenerOptions)}},{key:"listener",value:function(e){var t=e.target.closest("a"),n=this._prepareUrl(t);if(null!==n)switch(e.type){case"mousedown":case"touchstart":this._addPrefetchLink(n);break;case"mouseover":this._earlyPrefetch(t,n,"mouseout")}}},{key:"_earlyPrefetch",value:function(t,e,n){var i=this,r=setTimeout(function(){if(r=null,0===i.numOnHover)setTimeout(function(){return i.numOnHover=0},1e3);else if(i.numOnHover>i.config.rateThrottle)return;i.numOnHover++,i._addPrefetchLink(e)},this.config.onHoverDelay);t.addEventListener(n,function e(){t.removeEventListener(n,e,{passive:!0}),null!==r&&(clearTimeout(r),r=null)},{passive:!0})}},{key:"_addPrefetchLink",value:function(i){return this.prefetched.add(i.href),new Promise(function(e,t){var n=document.createElement("link");n.rel="prefetch",n.href=i.href,n.onload=e,n.onerror=t,document.head.appendChild(n)}).catch(function(){})}},{key:"_prepareUrl",value:function(e){if(null===e||"object"!==(void 0===e?"undefined":r(e))||!1 in e||-1===["http:","https:"].indexOf(e.protocol))return null;var t=e.href.substring(0,this.config.siteUrl.length),n=this._getPathname(e.href,t),i={original:e.href,protocol:e.protocol,origin:t,pathname:n,href:t+n};return this._isLinkOk(i)?i:null}},{key:"_getPathname",value:function(e,t){var n=t?e.substring(this.config.siteUrl.length):e;return n.startsWith("/")||(n="/"+n),this._shouldAddTrailingSlash(n)?n+"/":n}},{key:"_shouldAddTrailingSlash",value:function(e){return this.config.usesTrailingSlash&&!e.endsWith("/")&&!this.regex.fileExt.test(e)}},{key:"_isLinkOk",value:function(e){return null!==e&&"object"===(void 0===e?"undefined":r(e))&&(!this.prefetched.has(e.href)&&e.origin===this.config.siteUrl&&-1===e.href.indexOf("?")&&-1===e.href.indexOf("#")&&!this.regex.excludeUris.test(e.href)&&!this.regex.images.test(e.href))}}],[{key:"run",value:function(){"undefined"!=typeof RocketPreloadLinksConfig&&new n(new RocketBrowserCompatibilityChecker({capture:!0,passive:!0}),RocketPreloadLinksConfig).init()}}]),n}();t.run(); 11841}()); 11842 11843//# sourceURL=rocket-preload-links-js-after 11844</script>
vendor: 1 bytes, line 11844
11844
11845<script id="cmplz-cookiebanner-js-extra"> 11846var complianz = {"prefix":"cmplz_","debug":"","user_banner_id":"1","set_cookies":[],"block_ajax_content":"","banner_version":"24","version":"7.6.5","store_consent":"","do_not_track_enabled":"","consenttype":"optin","region":"eu","geoip":"1","dismiss_timeout":"","disable_cookiebanner":"","soft_cookiewall":"","dismiss_on_scroll":"","cookie_expiry":"365","url":"https://imagem.nl/wp-json/complianz/v1/","locale":"lang=nl&locale=nl_NL","set_cookies_on_root":"","cookie_domain":"","current_policy_id":"36","cookie_path":"/","categories":{"statistics":"statistics","marketing":"marketing"},"tcf_active":"","placeholdertext":"Click to accept {category} cookies and enable this content","css_file":"https://imagem.nl/wp-content/uploads/complianz/css/banner-{banner_id}-{type}.css?v=24","page_links":{"eu":{"cookie-statement":{"title":"Cookiebeleid ","url":"https://imagem.nl/cookiebeleid-eu/"},"privacy-statement":{"title":"Privacy Statement","url":"https://imagem.nl/privacy-policy/"}}},"tm_categories":"1","forceEnableStats":"1","preview":"","clean_cookies":"","aria_label":"Click to accept {category} cookies and enable this content","iapi_nav":"fallback"}; 11847//# sourceURL=cmplz-cookiebanner-js-extra 11848</script>
vendor: 1 bytes, line 11848
11848
11849<script defer id="cmplz-cookiebanner-js" src="https://imagem.nl/wp-content/plugins/complianz-gdpr-premium/cookiebanner/js/complianz.min.js"></script>
vendor: 1 bytes, line 11849
11849
11850<script id="cmplz-cookiebanner-js-after"> 11851document.addEventListener("cmplz_enable_category", function () { 11852 document.querySelectorAll('[data-rocket-lazyload]').forEach(obj => { 11853 if (obj.hasAttribute('data-lazy-src')) { 11854 obj.setAttribute('src', obj.getAttribute('data-lazy-src')); 11855 } 11856 }); 11857 }); 11858 11859 11860//# sourceURL=cmplz-cookiebanner-js-after 11861</script>
vendor: 1 bytes, line 11861
11861
11862<script data-minify="1" id="synergy-search-js" src="https://imagem.nl/wp-content/cache/min/1/wp-content/themes/imagem/modules/search/assets/search.js?ver=1790581408" data-rocket-defer defer></script>
vendor: 1 bytes, line 11862
11862
11863<script data-minify="1" id="synergy.hero-video-js" src="https://imagem.nl/wp-content/cache/min/1/wp-content/themes/imagem/scripts/synergy.hero-video.js?ver=1790581408" data-rocket-defer defer></script>
vendor: 1 bytes, line 11863
11863
11864<script id="swiper-script-js" src="https://cdn.bureaumax.nl/libs/swiper/swiper-bundle.min.js"></script>
vendor: 1 bytes, line 11864
11864
11865<script data-minify="1" id="synergy-block-slider-blocks-js" src="https://imagem.nl/wp-content/cache/min/1/wp-content/themes/imagem/blocks/block-slider-blocks/block-slider-blocks.js?ver=1790581408" data-rocket-defer defer></script>
vendor: 1 bytes, line 11865
11865
11866<script data-minify="1" id="synergy-block-news-js" src="https://imagem.nl/wp-content/cache/min/1/wp-content/themes/imagem/modules/post/blocks/block-news/block-news.js?ver=1790581408" data-rocket-defer defer></script>
vendor: 1 bytes, line 11866
11866
11867<script data-minify="1" id="mc4wp-forms-api-js" defer src="https://imagem.nl/wp-content/cache/min/1/wp-content/plugins/mailchimp-for-wp/assets/js/forms.js?ver=1790581409"></script>
11867 11868<!-- Statistics script Complianz GDPR/CCPA --> 11869
11869<script data-category="functional">
vendor: 339 bytes, lines 11869-11874
11869 11870 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 11871 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 11872 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 11873 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 11874})(window,document,'script','dataLayer','
11874GTM-PQM29HPL
vendor: 5 bytes, lines 11874-11875
11874'); 11875
11876const revokeListeners = []; 11877window.addRevokeListener = (callback) => { 11878 revokeListeners.push(callback); 11879}; 11880document.addEventListener("cmplz_revoke", function (e) { 11881 cmplz_set_cookie('cmplz_consent_mode', 'revoked', false ); 11882 revokeListeners.forEach((callback) => { 11883 callback(); 11884 }); 11885}); 11886 11887const consentListeners = []; 11888/** 11889 * Called from GTM template to set callback to be executed when user consent is provided. 11890 * @param callback 11891 */ 11892window.addConsentUpdateListener = (callback) => { 11893 consentListeners.push(callback); 11894}; 11895document.addEventListener("cmplz_fire_categories", function (e) { 11896 var consentedCategories = e.detail.categories; 11897 const consent = { 11898 'security_storage': "granted", 11899 'functionality_storage': "granted", 11900 'personalization_storage': cmplz_in_array( 'preferences', consentedCategories ) ? 'granted' : 'denied', 11901 'analytics_storage': cmplz_in_array( 'statistics', consentedCategories ) ? 'granted' : 'denied', 11902 'ad_storage': cmplz_in_array( 'marketing', consentedCategories ) ? 'granted' : 'denied', 11903 'ad_user_data': cmplz_in_array( 'marketing', consentedCategories ) ? 'granted' : 'denied', 11904 'ad_personalization': cmplz_in_array( 'marketing', consentedCategories ) ? 'granted' : 'denied', 11905 }; 11906 11907 //don't use automatic prefixing, as the TM template needs to be sure it's cmplz_. 11908 let consented = []; 11909 for (const [key, value] of Object.entries(consent)) { 11910 if (value === 'granted') { 11911 consented.push(key); 11912 } 11913 } 11914 cmplz_set_cookie('cmplz_consent_mode', consented.join(','), false ); 11915 consentListeners.forEach((callback) => { 11916 callback(consent); 11917 }); 11918}); 11919 </script>
11919 11920
11920<script>window.lazyLoadOptions=[{elements_selector:"img[data-lazy-src],.rocket-lazyload,iframe[data-lazy-src]",data_src:"lazy-src",data_srcset:"lazy-srcset",data_sizes:"lazy-sizes",class_loading:"lazyloading",class_loaded:"lazyloaded",threshold:300,callback_loaded:function(element){if(element.tagName==="IFRAME"&&element.dataset.rocketLazyload=="fitvidscompatible"){if(element.classList.contains("lazyloaded")){if(typeof window.jQuery!="undefined"){if(jQuery.fn.fitVids){jQuery(element).parent().fitVids()}}}}}},{elements_selector:".rocket-lazyload",data_src:"lazy-src",data_srcset:"lazy-srcset",data_sizes:"lazy-sizes",class_loading:"lazyloading",class_loaded:"lazyloaded",threshold:300,}];window.addEventListener('LazyLoad::Initialized',function(e){var lazyLoadInstance=e.detail.instance;if(window.MutationObserver){var observer=new MutationObserver(function(mutations){var image_count=0;var iframe_count=0;var rocketlazy_count=0;mutations.forEach(function(mutation){for(var i=0;i<mutation.addedNodes.length;i++){if(typeof mutation.addedNodes[i].getElementsByTagName!=='function'){continue} 11921if(typeof mutation.addedNodes[i].getElementsByClassName!=='function'){continue} 11922images=mutation.addedNodes[i].getElementsByTagName('img');is_image=mutation.addedNodes[i].tagName=="IMG";iframes=mutation.addedNodes[i].getElementsByTagName('iframe');is_iframe=mutation.addedNodes[i].tagName=="IFRAME";rocket_lazy=mutation.addedNodes[i].getElementsByClassName('rocket-lazyload');image_count+=images.length;iframe_count+=iframes.length;rocketlazy_count+=rocket_lazy.length;if(is_image){image_count+=1} 11923if(is_iframe){iframe_count+=1}}});if(image_count>0||iframe_count>0||rocketlazy_count>0){lazyLoadInstance.update()}});var b=document.getElementsByTagName("body")[0];var config={childList:!0,subtree:!0};observer.observe(b,config)}},!1)</script>
11923<script data-no-minify="1" async src="https://imagem.nl/wp-content/plugins/wp-rocket/assets/js/lazyload/17.8.3/lazyload.min.js"></script>
11923</div> 11924<nav id="mobile-menu" class="d-xl-none bg-black" aria-label="Mobiel menu"> 11925 <ul id="menu-hoofdmenu-1" class="menu mobile-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page has-megamenu menu-item-365"><a href="https://imagem.nl/themas/">Themaâs</a></li> 11926<li class="menu-item menu-item-type-post_type menu-item-object-page has-megamenu menu-item-491"><a href="https://imagem.nl/oplossingen/">Oplossingen</a></li> 11927<li class="menu-item menu-item-type-post_type_archive menu-item-object-toepassing menu-item-503"><a href="https://imagem.nl/toepassingen/">Toepassingen</a></li> 11928<li class="menu-item menu-item-type-post_type_archive menu-item-object-klantcase menu-item-493"><a href="https://imagem.nl/cases/">Cases</a></li> 11929<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6461"><a href="https://imagem.nl/aanpak/">Aanpak</a></li> 11930<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-489"><a href="https://imagem.nl/over-ons/">Over ons</a></li> 11931<li class="weglot-parent-menu-item wg-nl weglot-lang menu-item-weglot weglot-language nl menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1226"><a href="#weglot_switcher" title="Nederlands" data-wg-notranslate="true">NL</a> 11932<ul class="sub-menu"> 11933 <li class="weglot-lang menu-item-weglot weglot-language weglot-en menu-item menu-item-type-custom menu-item-object-custom menu-item-weglot-1226-en"><a href="https://imagem.nl/en/" title="English" data-wg-notranslate="true">EN</a></li> 11934</ul> 11935</li> 11936</ul><ul id="menu-topmenu-1" class="menu mobile-menu"><li class="menu-item menu-item-type-post_type_archive menu-item-object-technologie menu-item-501"><a href="https://imagem.nl/technologie/">Technologie</a></li> 11937<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-502"><a href="https://imagem.nl/nieuws/">Nieuws</a></li> 11938<li class="menu-item menu-item-type-post_type_archive menu-item-object-agenda menu-item-969"><a href="https://imagem.nl/agenda/">Agenda</a></li> 11939<li class="menu-item menu-item-type-post_type_archive menu-item-object-persoon menu-item-516"><a href="https://imagem.nl/team/">Team</a></li> 11940<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6479"><a href="https://imagem.nl/contact/">Contact</a></li> 11941</ul></nav><!-- Created with love, powered by Synergy from Max. Visit https://max.nl to get in touch --> 11942</body> 11943</html> 11944 11945<!-- This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me - Debug: cached@1790813069 -->
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.