PageSourceSearch

https://imagem.nl/

html imagem.nl collected 2026-10-01 00:54:04 UTC 574,435 bytes, 11,945 lines download raw bytes

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 &raquo; feed" href="https://imagem.nl/feed/" />
10759<link rel="alternate" type="application/rss+xml" title="IMAGEM &raquo; 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&#038;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&#038;muted=1&#038;loop=1&#038;background=1&#038;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 &amp; 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&#038;nd=1&#038;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&#039;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&#8217;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 &#8211; 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">&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.