<!DOCTYPE html>
<html class="no-js" lang=en>
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="twitter:card" content="summary_large_image">
        <title>Real Estate Insights | M & D Properties</title>
        <meta property="og:title" content="Real Estate Insights | M &amp; D Properties">
        <meta name="twitter:title" content="Real Estate Insights | M &amp; D Properties">
        <meta name="description" content="Browse M &amp; D Properties&#x27; blog posts for the latest real estate news, events, tips, trends, and insights on the Connecticut real estate market.">
        <meta property="og:description" content="Browse M &amp; D Properties&#x27; blog posts for the latest real estate news, events, tips, trends, and insights on the Connecticut real estate market.">
        <meta name="twitter:description" content="Browse M &amp; D Properties&#x27; blog posts for the latest real estate news, events, tips, trends, and insights on the Connecticut real estate market.">
        <meta property="og:image" content="https://media-production.lp-cdn.com/media/ee886203-5c4e-4d64-9613-ae87081a3dce">
        <meta name="twitter:image" content="https://media-production.lp-cdn.com/media/ee886203-5c4e-4d64-9613-ae87081a3dce">
        <meta property="og:url" content="https://weknowwestport.com/blog">
        <link rel="canonical" href="https://weknowwestport.com/blog">
    <script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Montserrat:100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Arapey:400,400i">
    <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
    <noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css"></noscript>
    <link rel="icon" type="image/x-icon" href="/favicon.ico">
    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png">
    <style id="global-css">:root{--global-primary-font-family:Montserrat,sans-serif;--global-primary-font-family-short:Montserrat;--global-secondary-font-family:Arapey,serif;--global-secondary-font-family-short:Arapey;--global-body-padding:20px;--global-background-color:#fff;--global-body-font-size:15px;--global-h1-font-size:70px;--global-h2-font-size:29px;--global-h3-font-size:24px;--global-h4-font-size:21px;--global-h5-font-size:18px;--global-h6-font-size:14px;--global-section-padding:96px;}@media (max-width: 768px){:root{--global-section-padding:64px;}}body{padding:0px;background-color:#fff;font-family:Arapey,serif;font-size:15px;}@media (min-width: 768px){body{padding:20px 20px 0px 20px;}}h1,h2,h3,h4,h5,h6,button{font-family:Montserrat,sans-serif;}h1{font-size:70px;}h2{font-size:29px;}h3{font-size:24px;}h4{font-size:21px;}h5{font-size:18px;}h6{font-size:14px;}</style>
        <link rel="stylesheet" type="text/css" href="https://styles.luxurypresence.com/classic/index.css" />
    <style id="website-css">@import url('https://fonts.googleapis.com/css?family=Arapey');#global-footer .classic-footer-component .logo{display:none;}#global-footer .classic-footer-component{padding-top:50px;}#global-footer .classic-footer-component{min-height:0vh;}</style>
    <style id="wow-hide-elements">.wow{visibility:hidden!important}</style>
        <style id="page-css">
            #section-8af9353d-d411-4802-b1d3-231441ea10dc{color:#ffffff;--fontColor:#ffffff;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:100%;--fontColor_A:1;--fontColor_darkenDir:-1;--bgColor:#cfcfcf;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:81%;--bgColor_A:1;--bgColor_darkenDir:-1;background-color:#cfcfcf;--gradient-color:var(--overlay-color, rgba(0, 0, 0, 0.5));background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/media/8dce807c-f5cb-487e-bb4a-2a42802460ae');background-repeat:no-repeat;-webkit-background-position:center;background-position:center;-webkit-background-size:cover;background-size:cover;}#section-8af9353d-d411-4802-b1d3-231441ea10dc .image-opening-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:50vh;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}#section-8af9353d-d411-4802-b1d3-231441ea10dc .image-opening-section .heading{z-index:100;position:relative;text-align:center;max-width:926px;}#section-8af9353d-d411-4802-b1d3-231441ea10dc .image-opening-section .heading .h3{margin-bottom:16px;}#section-8af9353d-d411-4802-b1d3-231441ea10dc .image-opening-section .heading p{font-family:var(--global-secondary-font-family);font-size:20px;max-width:956px;text-transform:none;margin:0 auto;}@media (max-width: 992px){#section-8af9353d-d411-4802-b1d3-231441ea10dc .image-opening-section{padding:50px;}}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533{color:#000;--fontColor:#000;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:0%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:#f1f1f1;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:95%;--bgColor_A:1;--bgColor_darkenDir:-1;background-color:#f1f1f1;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .redesign .pagination-container .paginationjs .paginationjs-pages li a{color:#000;background:transparent;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .redesign .pagination-container .paginationjs .paginationjs-pages li a:hover{color:#fff;background:#000;border:2px solid #000;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list-section{padding:60px 0;text-align:center;}@media (max-width: 768px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list-section .container{padding-left:0;padding-right:0;}}@media (max-width: 991px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list-section{padding:50px 0;}}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list{margin:0 -10px 15px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}@media (max-width: 991px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list{margin-left:0;margin-right:0;}}@media (max-width: 768px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list{margin-bottom:25px;padding:0 25px;}}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list.blog-list__no-date .date{display:none;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list .blog-list__block{text-align:left;margin:0 10px 35px;background-color:#fff;max-width:335px;width:30%;padding:0 25px 55px;display:block;min-height:510px;position:relative;color:#484b4e;box-shadow:0 2px 4px 0 rgba(0, 0, 0, 0.0);-webkit-transition:box-shadow .3s;transition:box-shadow .3s;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list .blog-list__block:hover{box-shadow:0 2px 4px 0 rgba(0, 0, 0, 0.1);}@media (min-width: 769px) and (max-width: 1148px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list .blog-list__block{margin-bottom:25px;}}@media (max-width: 768px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list .blog-list__block{width:100%;max-width:100%;margin-left:0;margin-right:0;}}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list figure{text-align:left;font-style:normal;margin:0 -25px 25px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:185px;position:relative;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;overflow:hidden;background-color:gray;}@media (max-width: 991px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list figure{height:165px;}}@media (min-width: 992px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list figure:hover img{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);}}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list figcaption{background-color:rgba(0,0,0, .7);padding:5px 10px;text-transform:uppercase;font-size:14px;text-shadow:.5px 0 0 currentColor;color:#fff;position:relative;z-index:2;font-style:normal;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list img{position:absolute;height:100%;width:100%;object-fit:cover;z-index:1;-webkit-transition:all .3s;transition:all .3s;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list h6{margin-bottom:5px;display:block;line-height:1.5;text-transform:uppercase;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list p{margin:0 0 10px;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list .link{position:absolute;bottom:35px;left:35px;line-height:16px;}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list .link.up-link{text-transform:uppercase;}@media (max-width: 991px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list .link{bottom:20px;left:20px;}}#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list .text_wrap{padding:10px 10px 0 10px;}@media (max-width: 991px){#section-739fa5af-02ea-4cbe-a7d6-b74dd396d533 .blog-list .text_wrap{padding:0;}}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded{color:#ffffff;--fontColor:#ffffff;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:100%;--fontColor_A:1;--fontColor_darkenDir:-1;--bgColor:#000000;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:0%;--bgColor_A:1;--bgColor_darkenDir:1;background-color:#000000;--gradient-color:var(--overlay-color, rgba(0, 0, 0, 0.00));background-image:linear-gradient(var(--gradient-color), var(--gradient-color)),url('https://media-production.lp-cdn.com/media/46b64946-af09-45f2-b0c3-81c56f20c866');background-repeat:no-repeat;-webkit-background-position:center;background-position:center;-webkit-background-size:cover;background-size:cover;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe{position:relative;-webkit-background-position:top center;background-position:top center;-webkit-background-size:cover;background-size:cover;padding-top:120px;padding-bottom:120px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (min-width: 768px) and (max-width: 1920px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe{height:100vh;}}@media (max-width: 1920px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe{padding-top:120px;padding-bottom:120px;}}@media (max-width: 1680px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe{padding-top:80px;padding-bottom:80px;}}@media (max-width: 768px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe{padding-top:60px;padding-bottom:60px;}}@media (max-width: 500px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe{padding-top:48px;padding-bottom:48px;}}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe:before{content:'';position:absolute;background-color:#000;opacity:.2;left:0;right:0;top:0;bottom:0;z-index:1;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;z-index:2;}@media (max-width: 768px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container .work-with-us{position:relative;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container .work-with-us:before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container .work-with-us >*{position:relative;z-index:2;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container>div{width:50%;padding:72px;text-align:center;max-width:572px;position:relative;}@media (max-width: 768px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container>div{width:100%;padding:45px 15px;}}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container>div:first-child{min-height:420px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container>div:first-child p{padding:24px 0;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container>div:first-child:last-child{width:100%;max-width:668px;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container>div h2,#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container>div p{margin:0 0 20px;}@media (max-width: 568px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container>div button,#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .container>div a{width:100%;}}@media (max-width: 768px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .work-with-us{margin-bottom:15px;}}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .work-with-us+.newsletter{padding-top:50px;padding-bottom:50px;border:1px solid #f1f1f1;border-left:0;background-color:transparent;}@media (max-width: 768px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .work-with-us+.newsletter{padding:45px 15px;border-left:1px solid #f1f1f1;}}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter{position:relative;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter .custom-label-group{max-width:100%;margin:30px 0;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter .custom-label-group label{width:145px;text-align:right;}@media (max-width: 1200px){#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter .custom-label-group label{text-align:left;width:auto;color:#fff;}}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter form input:not(input[type="checkbox"]),#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter form input:-webkit-autofill,#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter form input:-webkit-autofill:hover,#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter form input:-webkit-autofill:active{-webkit-box-shadow:0 0 0 30px #FFF inset;border-color:#c8c8c8;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter form input:focus,#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter form input:-webkit-autofill:focus{background:transparent;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter form .success{position:absolute;left:50%;padding-top:12px;-webkit-transform:translate(-50%, 0);-moz-transform:translate(-50%, 0);-ms-transform:translate(-50%, 0);transform:translate(-50%, 0);font-size:15px;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter form .hide{display:none;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .contact-and-subscribe .newsletter .thank-you-title{text-transform:uppercase;font-size:14px;color:#fff;}#section-afef24ca-36ca-4c7b-bcdc-d61d306fcded .h-pot{height:0;width:0;overflow:hidden;visibility:hidden;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317{color:#1a1a1a;--fontColor:#1a1a1a;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:10%;--fontColor_A:1;--fontColor_darkenDir:1;--bgColor:#fff;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:100%;--bgColor_A:1;--bgColor_darkenDir:-1;background-color:#fff;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed{display:none;--items:8;--containerWidth:calc(100% * var(--items) / (var(--items) + 1));--itemWidth:calc(100% / (var(--items) + 1));}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .feed-top{padding:50px 25px 35px;text-align:center;display:none;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .feed-top .title{margin:0;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .main-part{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .items-container{-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:var(--containerWidth);max-width:calc(300px * 8);overflow:hidden;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .items-container:not(.slick-slider){display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .item{max-width:300px;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:block;width:var(--itemWidth);overflow:hidden;position:relative;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .item::before{content:'';display:block;width:100%;height:0;padding-bottom:100%;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .ig-feed-item{width:calc(100% / var(--items));background-color:var(--tileColor, #000);}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .ig-feed-item__img{position:absolute;left:-1px;top:-1px;bottom:-1px;right:-1px;background:center/cover no-repeat;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .media-type-icon{position:absolute;right:17px;top:15px;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .ig-feed-item__info{position:absolute;top:0;left:0;bottom:0;right:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;padding:10%;overflow:hidden;color:#fff;text-align:center;background-color:rgba(0, 0, 0, 0.7);opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease;}@media (hover: hover){#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .ig-feed-item:hover .ig-feed-item__info{opacity:1;}}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .ig-feed-item__caption{text-overflow:ellipsis;-webkit-line-clamp:4;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .caption-content{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;padding:30px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .caption-content .icon{font-size:31px;margin-bottom:12px;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed.no-icon .caption-content .icon{display:none;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .caption-tile-title{margin:0;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .slick-arrow{color:#fff;width:40px;height:40px;border:2px solid #fff;z-index:1;text-align:center;line-height:38px;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .slick-arrow::before{content:none;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .slick-arrow:hover{color:#fff;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .slick-arrow.slick-prev{left:25px;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .slick-arrow.slick-next{right:25px;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed.no-caption-tile{--containerWidth:100%;--itemWidth:calc(100% / var(--items));}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed.no-caption-tile .caption-tile{display:none;}@media (max-width: 2400px){#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed{--items:7;}}@media (max-width: 2100px){#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed{--items:6;}}@media (max-width: 1800px){#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed{--items:5;}}@media (max-width: 1500px){#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed{--items:4;}}@media (max-width: 1200px){#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed{--items:3;}}@media (max-width: 900px){#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed{--items:2;}}@media (max-width: 600px){#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed{--items:1;}}@media (max-width: 430px){#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .feed-top{display:block;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .caption-tile{display:none;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .item{max-height:320px;max-width:none;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .ig-feed .items-container{--containerWidth:100%;min-width:100%;}}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .has-data .ig-feed{display:block;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317 .has-data .main-part{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317.has-data .ig-feed,#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317#section-temp .ig-feed{display:block;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317.has-data .main-part,#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317#section-temp .main-part{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}#section-c6c0dcb3-d535-41d1-bef6-549dd0e96317#section-temp .ig-feed{min-height:100px;}#modal-global-contact-us .redesign{width:100%;}@media (max-width: 560px){#modal-global-contact-us .redesign .socials{gap:27px;}}@media (max-width: 560px){#modal-global-contact-us .redesign .socials li{padding-right:0;margin-bottom:0;}#modal-global-contact-us .redesign .socials li .socials__link{margin-bottom:0;}}#modal-global-contact-us .contact-form{min-height:100vh;padding:104px 0 70px;width:100%;color:#ffffff;text-align:center;}#modal-global-contact-us .contact-form input:focus{border:0;}#modal-global-contact-us .contact-form input:-webkit-autofill,#modal-global-contact-us .contact-form input:-webkit-autofill:hover,#modal-global-contact-us .contact-form input:-webkit-autofill:focus,#modal-global-contact-us .contact-form textarea:-webkit-autofill,#modal-global-contact-us .contact-form textarea:-webkit-autofill:hover,#modal-global-contact-us .contact-form textarea:-webkit-autofill:focus,#modal-global-contact-us .contact-form select:-webkit-autofill,#modal-global-contact-us .contact-form select:-webkit-autofill:hover,#modal-global-contact-us .contact-form select:-webkit-autofill:focus{border:0;-webkit-box-shadow:0 0 0px 1000px #ffffff inset!important;}#modal-global-contact-us .contact-form .link--white{color:#ffffff;}#modal-global-contact-us .contact-form .link--white:after{background-color:#ffffff;}@media (max-width: 560px){#modal-global-contact-us .contact-form{padding:50px 0;}}#modal-global-contact-us .contact-form .contact-form-close{width:40px;height:50px;display:block;padding:0;border:none;background-color:transparent;cursor:pointer;position:absolute;right:50px;top:50px;}@media (max-width: 560px){#modal-global-contact-us .contact-form .contact-form-close{right:20px;top:20px;width:30px;height:40px;}}#modal-global-contact-us .contact-form .contact-form-close:before,#modal-global-contact-us .contact-form .contact-form-close:after{content:'';display:block;width:40px;height:1px;background-color:#fff;position:absolute;left:50%;top:50%;}@media (max-width: 560px){#modal-global-contact-us .contact-form .contact-form-close:before,#modal-global-contact-us .contact-form .contact-form-close:after{width:30px;}}#modal-global-contact-us .contact-form .contact-form-close:before{-webkit-transform:translate(-50%, -50%) rotate(45deg);-moz-transform:translate(-50%, -50%) rotate(45deg);-ms-transform:translate(-50%, -50%) rotate(45deg);transform:translate(-50%, -50%) rotate(45deg);}#modal-global-contact-us .contact-form .contact-form-close:after{-webkit-transform:translate(-50%, -50%) rotate(-45deg);-moz-transform:translate(-50%, -50%) rotate(-45deg);-ms-transform:translate(-50%, -50%) rotate(-45deg);transform:translate(-50%, -50%) rotate(-45deg);}#modal-global-contact-us .contact-form-subheadline,#modal-global-contact-us .contact-form h1{text-align:center;text-transform:uppercase;}#modal-global-contact-us .contact-form-subheadline{margin:0 0 18px;font-size:14px;}@media (max-width: 560px){#modal-global-contact-us .contact-form-subheadline{margin:0 0 7px;}}#modal-global-contact-us .contact-form__heading{margin:0 0 46px;}@media (max-width: 560px){#modal-global-contact-us .contact-form__heading{margin:0 0 24px;}}#modal-global-contact-us .contact-form-container{max-width:1280px;width:100%;margin:0 auto;padding:0 25px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;}@media (max-width: 1023px){#modal-global-contact-us .contact-form-container{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}#modal-global-contact-us .contact-form-container-form{max-width:580px;width:100%;margin:0 30px;}@media (max-width: 1200px){#modal-global-contact-us .contact-form-container-form{max-width:45%;}}@media (max-width: 1023px){#modal-global-contact-us .contact-form-container-form{max-width:100%;margin:0 0 50px 0;}}#modal-global-contact-us .contact-form-container-form .custom-label-group{max-width:100%;margin-bottom:21px;}#modal-global-contact-us .contact-form-container-form .custom-label-group >textarea,#modal-global-contact-us .contact-form-container-form .custom-label-group .text-input{text-transform:none;}@media (min-width: 1200px){#modal-global-contact-us .contact-form-container-form .custom-label-group .text-input,#modal-global-contact-us .contact-form-container-form .custom-label-group .textarea{width:420px;}}@media (max-width: 1200px){#modal-global-contact-us .contact-form-container-form .custom-label-group label{color:#ffffff;text-align:left;}}#modal-global-contact-us .contact-form-container-form .custom-select select{display:none;}#modal-global-contact-us .contact-form-container-form .custom-select .select-selected{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;background-color:#fff;height:55px;padding:0 15px;position:relative;text-transform:uppercase;}#modal-global-contact-us .contact-form-container-form .custom-select .select-selected:after{position:absolute;content:"";top:50%;right:18px;-webkit-transform:translateY(-50%) rotate(45deg);-moz-transform:translateY(-50%) rotate(45deg);-ms-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg);width:10px;height:10px;border-bottom:2px solid;border-right:2px solid;}#modal-global-contact-us .contact-form-container-form .custom-select .select-selected.select-arrow-active:after{-webkit-transform:translateY(-50%) rotate(-135deg);-moz-transform:translateY(-50%) rotate(-135deg);-ms-transform:translateY(-50%) rotate(-135deg);transform:translateY(-50%) rotate(-135deg);width:10px;height:10px;border-bottom:2px solid;border-right:2px solid;}#modal-global-contact-us .contact-form-container-form .custom-select .select-items div,#modal-global-contact-us .contact-form-container-form .custom-select .select-selected{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#878787;height:55px;padding:0 16px;cursor:pointer;}#modal-global-contact-us .contact-form-container-form .custom-select .select-items{position:absolute;background-color:#fff;top:100%;right:-1px;z-index:99;border-radius:0;border:solid 1px #d8d8d8;width:calc(100% + 2px);text-transform:uppercase;}@media (max-width: 1200px){#modal-global-contact-us .contact-form-container-form .custom-select .select-items{right:0;width:100%;}}#modal-global-contact-us .contact-form-container-form .custom-select .select-hide{display:none;}#modal-global-contact-us .contact-form-container-form .custom-select .select-items div:hover,#modal-global-contact-us .contact-form-container-form .custom-select .same-as-selected{background-color:rgba(114, 114, 172, 0.15);}#modal-global-contact-us .contact-form-container-form .custom-label-input label{width:145px;text-align:right;}@media (max-width: 1200px){#modal-global-contact-us .contact-form-container-form .custom-label-input label{text-align:left;width:auto;}}#modal-global-contact-us .contact-form-container-form .custom-label-input input{text-transform:none;}@media (max-width: 1200px){#modal-global-contact-us .contact-form-container-form .custom-label-input input{width:100%;}}#modal-global-contact-us .contact-form-container-form .custom-label-textarea{-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;height:auto;}#modal-global-contact-us .contact-form-container-form .custom-label-textarea label{width:100%;max-width:100%;text-align:center;}#modal-global-contact-us .contact-form-container-form .custom-label-textarea textarea{width:100%;height:120px;padding:12px 16px;border:0;outline:0;resize:none;font-size:15px;line-height:1.67;letter-spacing:0.75px;}#modal-global-contact-us .contact-form-container-form .custom-button{margin-top:30px;text-align:center;}@media (max-width: 560px){#modal-global-contact-us .contact-form-container-form .custom-button .btn{width:90%;}}#modal-global-contact-us .contact-form-container-form .custom-button .success{margin-top:10px;color:#ffffff;}#modal-global-contact-us .contact-form-container-form .custom-button .hide{display:none;}#modal-global-contact-us .contact-form-container-info{max-width:454px;width:100%;margin:0 30px;}@media (max-width: 1200px){#modal-global-contact-us .contact-form-container-info{max-width:45%;}}@media (max-width: 1023px){#modal-global-contact-us .contact-form-container-info{max-width:100%;margin:0;}}@media (max-width: 1023px){#modal-global-contact-us .contact-form-container-info p{text-align:center;}}#modal-global-contact-us .contact-form-container-info .socials{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}#modal-global-contact-us .contact-form__socials-block{margin-top:40px;padding-top:40px;border-top:1px solid hsla(var(--fontColor_H, 0), var(--fontColor_S, 0%), var(--fontColor_L, 100%), .3);}#modal-global-contact-us .contact-form-contact-details h5{margin-bottom:0;}#modal-global-contact-us .contact-form-contact-details p{font-family:var(--global-secondary-font-family);font-style:italic;font-size:18px;line-height:1.4;letter-spacing:1px;}#modal-global-contact-us .contact-form-contact-details a{position:relative;-webkit-text-decoration:none;text-decoration:none;-webkit-transition:0.2s;transition:0.2s;white-space:nowrap;line-height:1;}#modal-global-contact-us .contact-form-contact-details a:after{content:'';height:1px;position:absolute;bottom:1px;left:0;width:0;background-color:currentColor;-webkit-transition:0.4s;transition:0.4s;}#modal-global-contact-us .contact-form-contact-details a:hover:after{width:100%;}#modal-global-contact-us .close{display:none!important;}#modal-global-contact-us .close.contact-form-close{display:block!important;}#modal-global-contact-us .h-pot{height:0;width:0;overflow:hidden;visibility:hidden;}#modal-global-contact-us .lp-disclaimer{text-align:justify;font-size:12px;}#modal-global-contact-us .contact-form-container-form .custom-label-input input::-webkit-input-placeholder{text-transform:uppercase;}#modal-global-contact-us .contact-form-container-form .custom-label-input input::-moz-placeholder{text-transform:uppercase;}#modal-global-contact-us .contact-form-container-form .custom-label-input input:-ms-input-placeholder{text-transform:uppercase;}#modal-global-contact-us .contact-form-container-form .custom-label-input input::placeholder{text-transform:uppercase;}#modal-global-contact-us .contact-form-container-form .custom-label-textarea textarea::-webkit-input-placeholder{text-transform:uppercase;}#modal-global-contact-us .contact-form-container-form .custom-label-textarea textarea::-moz-placeholder{text-transform:uppercase;}#modal-global-contact-us .contact-form-container-form .custom-label-textarea textarea:-ms-input-placeholder{text-transform:uppercase;}#modal-global-contact-us .contact-form-container-form .custom-label-textarea textarea::placeholder{text-transform:uppercase;}nav .lp-i--phone{font-size:15px;margin-left:5px;}nav header{display:block;font-family:Montserrat,sans-serif;-webkit-transition:0.3s all;transition:0.3s all;white-space:nowrap;}nav a{background-color:transparent;}nav a:active,nav a:hover{outline:0;}nav img{border:0;}nav button{color:inherit;font:inherit;margin:0;}nav button{overflow:visible;}nav button{text-transform:none;}nav button{cursor:pointer;}nav a,nav a:visited{-webkit-text-decoration:underline;text-decoration:underline;transition-property:all;}nav img{page-break-inside:avoid;}nav img{max-width:100%!important;}nav .navbar{display:none;}nav button{font-family:inherit;font-size:inherit;line-height:inherit;}nav a{color:inherit;-webkit-text-decoration:none;text-decoration:none;}nav a:hover,nav a:focus{color:#606569;-webkit-text-decoration:none;text-decoration:none;}nav a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}nav img{vertical-align:middle;}nav .sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;}nav ul{margin-top:0;margin-bottom:15px;}nav li{margin-bottom:0;}nav ul ul{margin-bottom:0;}nav .container{margin-right:auto;margin-left:auto;padding-left:30px;padding-right:30px;}nav .container:before,nav .container:after{content:" ";display:table;}nav .container:after{clear:both;}@media (min-width: 768px){nav .container{width:720px;}}@media (min-width: 992px){nav .container{width:940px;}}@media (min-width: 1200px){nav .container{width:1140px;}}nav .nav{margin-bottom:0;padding-left:0;list-style:none;}nav .nav .sub-nav-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}nav .nav .sub-nav{position:absolute;left:auto;top:55px;margin-left:15px;background:#ffffff;border:1px solid #e7e7e7;text-align:left;padding:10px 0;opacity:0;visibility:hidden;-webkit-transition:all .5s ease;transition:all .5s ease;-webkit-transform:translate(0, 100px);-moz-transform:translate(0, 100px);-ms-transform:translate(0, 100px);transform:translate(0, 100px);}nav .nav .sub-nav ul{margin:0;}nav .nav .sub-nav ul li{position:relative;display:block;margin:0;padding:10px 20px;text-overflow:ellipsis;overflow:hidden;}nav .nav .sub-nav ul li a{color:#000;margin:0;max-width:260px;}nav .nav .sub-nav.visible{opacity:1;visibility:visible;-webkit-transform:translate(0, 0);-moz-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0);}nav .nav .sub-nav.visible +.nav-link{color:#CFCECE;-webkit-transition:.3s linear;transition:.3s linear;}nav .scroll .nav .sub-nav.visible+.nav-link{color:#878787;-webkit-transition:.3s linear;transition:.3s linear;}nav .nav:before,nav .nav:after{content:" ";display:table;}nav .nav:after{clear:both;}nav .nav>li{position:relative;display:block;}nav .nav>li>a{position:relative;display:block;padding:10px 15px;}nav .nav>li>a:hover,nav .nav>li>a:focus{-webkit-text-decoration:none;text-decoration:none;background-color:#f1f1f1;}nav .nav li.nav-item{position:static;}nav .navbar{position:relative;min-height:80px;margin-bottom:30px;border:1px solid transparent;}nav .navbar:before,nav .navbar:after{content:" ";display:table;}nav .navbar:after{clear:both;}@media (min-width: 768px){nav .navbar{border-radius:0;}}nav .navbar-header:before,nav .navbar-header:after{content:" ";display:table;}nav .navbar-header:after{clear:both;}@media (min-width: 768px){nav .navbar-header{float:left;}}nav .container>.navbar-header{margin-right:-30px;margin-left:-30px;}@media (min-width: 768px){nav .container>.navbar-header{margin-right:0;margin-left:0;}}nav .navbar-toggle{position:relative;float:right;margin-right:30px;padding:9px 10px;margin-top:23px;margin-bottom:23px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0;}nav .navbar-toggle:focus{outline:0;}nav .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;}nav .navbar-toggle .icon-bar+.icon-bar{margin-top:4px;}@media (min-width: 768px){nav .navbar-toggle{display:none;}}nav .navbar-nav{margin:12.5px -30px;}nav .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:30px;}@media (min-width: 768px){nav .navbar-nav{float:left;margin:0;}nav .navbar-nav>li{float:left;}nav .navbar-nav>li>a{padding-top:25px;padding-bottom:25px;}}nav .navbar-default{border-color:transparent;}nav .navbar-default .navbar-nav>li>a{color:inherit;}nav .navbar-default .navbar-nav>li>a:hover,nav .navbar-default .navbar-nav>li>a:focus{color:inherit;background-color:transparent;}nav .navbar-default .navbar-nav>.active>a,nav .navbar-default .navbar-nav>.active>a:hover,nav .navbar-default .navbar-nav>.active>a:focus{color:inherit;background-color:transparent;}nav .navbar-default .navbar-toggle{border-color:transparent;}nav .navbar-default .navbar-toggle:hover,nav .navbar-default .navbar-toggle:focus{background-color:transparent;}nav .navbar-default .navbar-toggle .icon-bar{background-color:#fff;}nav a:-webkit-any-link{-webkit-text-decoration:none;text-decoration:none;}nav .headroom .navbar .nav-link{text-transform:uppercase;letter-spacing:0.15em;}nav .header{padding:40px 20px 20px;width:100%;color:#fff;}nav .header .logo-dark{display:none;}nav .header.scroll{padding:0;}nav .header.scroll .icon-bar{background-color:#000;}nav .header.scroll .logo-dark{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}nav .header.scroll .logo-light{display:none;}nav .header.scroll .link:after{background-color:#000;}@media (max-width: 768px){nav .header{padding:20px 0px;}}nav .headroom{position:fixed;top:0;z-index:1039;}nav .headroom{left:0;right:0;}nav .headroom .navbar{margin-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:68px!important;}@media screen and (-webkit-min-device-pixel-ratio: 0){nav .headroom .navbar{background:transparent;}}nav .headroom .navbar .logo-container img{max-width:300px;max-height:70px;}nav .headroom .navbar .navbar-toggle{margin-top:17px!important;margin-bottom:17px!important;}nav .headroom .navbar .translate-element{margin:21px 15px;}@media (max-width: 1250px){nav .headroom .navbar .translate-element{display:none;}}nav .headroom .navbar .navbar-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;position:relative;}nav .headroom .navbar .navbar-header .logo-container{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}@media (max-width: 991px){nav .headroom .navbar .navbar-header .logo-container{width:100%;text-align:center;}}@media (max-width: 1250px){nav .headroom .navbar .navbar-header .logo-container{display:block;}}@media (max-width: 500px){nav .headroom .navbar .navbar-header .logo-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}@media (max-width: 991px){nav .headroom .navbar .navbar-header .logo-container{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}nav .headroom .navbar .navbar-header .logo-container img{padding:0.5em 0em;}nav .headroom .navbar .navbar-header .logo-container .logo-holder{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}nav .headroom .navbar .navbar-header .logo-container .logo-holder .logo-wrapper{position:relative;}@media (max-width: 1200px){nav .headroom .navbar .navbar-header .nav>li>a{padding-left:6px;padding-right:6px;}}nav .headroom .navbar .navbar-header .nav{float:left;}nav .headroom .navbar .navbar-header .navbar-nav .nav-item a{font-size:12px;font-weight:500;}nav .headroom .navbar .navbar-header .navbar-nav .nav-item .sub-nav a{padding-top:3px;padding-bottom:3px;display:block;}@media (max-width: 1200px){nav .headroom .navbar .navbar-header .navbar-nav .nav-item .nav-link{letter-spacing:0.9px;}}@media (max-width: 991px){nav .headroom .navbar .navbar-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}nav .headroom .navbar .navbar-header .navbar-nav{position:absolute;right:0;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);margin:0;}}@media (max-width: 500px){nav .headroom .navbar .navbar-header .navbar-nav{position:relative;-webkit-transform:none;-moz-transform:none;-ms-transform:none;transform:none;}}@media (max-width: 1250px){nav .headroom .navbar .navbar-header .navbar-nav .nav-item{display:none;}nav .headroom .navbar .navbar-header .nav{float:none;}}@media (min-width: 768px){nav .headroom .navbar .navbar-header{width:100%;}}@media (max-width: 767px){nav .headroom .navbar .navbar-header{margin:0;}}nav .headroom .navbar .navbar-header:after,nav .headroom .navbar .navbar-header:before{display:none;}nav .headroom .navbar .nav-link{cursor:pointer;font-size:10px;}nav .headroom .navbar .navbar-toggle{display:block;padding:6px 0px 6px 10px;}@media (max-width: 991px){nav .headroom .navbar .navbar-toggle{padding:6px 0px 6px 10px;margin-right:0px;}}nav .headroom .navbar .navbar-toggle .icon-bar{border-radius:0;width:26px;}nav .headroom .navbar .navbar-toggle .icon-bar+.icon-bar{margin-top:7px;}@media (min-width: 768px){nav .headroom .navbar .navbar-toggle{margin-right:0;}}nav .headroom .container{width:100%;}@media (max-width: 991px){nav .headroom .container{padding-left:25px;padding-right:25px;}}nav .headroom.headroom--not-top .navbar{padding:0;background:transparent;}nav .agent-phone::after{font-size:160%;}@media (min-width: 768px){nav .nav-item .nav-link{padding-top:19px;padding-bottom:19px;}}nav button{-webkit-appearance:button;border-radius:0px;cursor:pointer;}nav button{overflow:visible;}nav header,nav nav{display:block;}nav a{background-color:transparent;}nav a:active,nav a:hover{outline-width:0;}nav img{border-style:none;}nav button{font-size:100%;line-height:1.15;margin:0;}nav button{text-transform:none;}nav button,nav html [type="button"]{-webkit-appearance:button;}nav [type="button"]::-moz-focus-inner,nav button::-moz-focus-inner{border-style:none;padding:0;}body>div.sidemenu{background-color:transparent;--hoverColor:hsla(
    var(--fontColor_H, 210deg), 
    var(--fontColor_S, 4%), 
    calc(50% + (var(--fontColor_L, 9%) - 50%) * (1 - 2 * 0.415)),
    var(--fontColor_A, 1));}body>div.sidemenu .sidemenu{font-family:var(--global-primary-font-family);}body>div.sidemenu [off-canvas]{margin:0;padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}body>div.sidemenu [off-canvas]{display:none;position:fixed;overflow:hidden;overflow-y:auto;background-color:black;color:white;-webkit-overflow-scrolling:touch;}body>div.sidemenu [off-canvas*="right"]{width:255px;height:100%;top:0;right:0;}body>div.sidemenu [off-canvas*="overlay"]{z-index:9999;}body>div.sidemenu [off-canvas]{-webkit-transform:translate(0px, 0px);-moz-transform:translate(0px, 0px);-ms-transform:translate(0px, 0px);transform:translate(0px, 0px);-webkit-transition:-webkit-transform 300ms;-webkit-transition:-webkit-transform 300ms;transition:transform 300ms;-webkit-backface-visibility:hidden;}body>div.sidemenu .offcanvas.toggle{margin-right:0;}@media print{body>div.sidemenu [off-canvas]{display:none!important;}}body>div.sidemenu a{background-color:transparent;}body>div.sidemenu a:active,body>div.sidemenu a:hover{outline:0;}body>div.sidemenu img{border:0;}body>div.sidemenu a{color:#171819;-webkit-text-decoration:none;text-decoration:none;}body>div.sidemenu a:hover,body>div.sidemenu a:focus{color:#606569;-webkit-text-decoration:none;text-decoration:none;}body>div.sidemenu a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}body>div.sidemenu img{vertical-align:middle;}body>div.sidemenu [role="button"]{cursor:pointer;}body>div.sidemenu ul{margin-top:0;margin-bottom:15px;}body>div.sidemenu ul ul{margin-bottom:0;}body>div.sidemenu .btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:15px 30px;}body>div.sidemenu .btn:focus,body>div.sidemenu .btn:active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}body>div.sidemenu .btn:hover,body>div.sidemenu .btn:focus{color:#333;-webkit-text-decoration:none;text-decoration:none;}body>div.sidemenu .btn:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);}body>div.sidemenu .dropdown{position:relative;}body>div.sidemenu .dropdown-toggle:focus{outline:0;}body>div.sidemenu .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0, 0, 0, 0.175);box-shadow:0 6px 12px rgba(0, 0, 0, 0.175);-webkit-background-clip:padding-box;background-clip:padding-box;}body>div.sidemenu .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.6;color:#484b4e;white-space:nowrap;}body>div.sidemenu .dropdown-menu>li>a:hover,body>div.sidemenu .dropdown-menu>li>a:focus{-webkit-text-decoration:none;text-decoration:none;color:#3c3e41;background-color:transparent;}body>div.sidemenu .offcanvas .offcanvas-menu>li .sub-nav ul li:last-child{border-bottom:none;}body>div.sidemenu .offcanvas .offcanvas-menu .sub-nav ul{padding-top:10px;}body>div.sidemenu .sub-nav-container{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}body>div.sidemenu .sub-nav{opacity:0;visibility:hidden;-webkit-transition:all .5s ease;transition:all .5s ease;max-height:0;}body>div.sidemenu .sub-nav ul{margin:0;}body>div.sidemenu .sub-nav.visible{opacity:1;visibility:visible;max-height:400px;}body>div.sidemenu .sub-nav li{position:relative;display:block;margin:0;padding:10px 20px;}body>div.sidemenu .sub-nav li a{color:#000;margin:0;}body>div.sidemenu a:-webkit-any-link{-webkit-text-decoration:none;text-decoration:none;}body>div.sidemenu .btn{text-transform:uppercase;letter-spacing:0.15em;}body>div.sidemenu .btn{padding:15px 30px;font-size:10px;line-height:1.6;border-radius:0;-webkit-transition:all 0.5s cubic-bezier(0.23, 1, 0.32, 1);transition:all 0.5s cubic-bezier(0.23, 1, 0.32, 1);-webkit-text-decoration:none;text-decoration:none;}body>div.sidemenu .btn.btn-circle{padding:0;width:55px;height:55px;border:solid 1px #878787;border-radius:55px;margin:0 auto;letter-spacing:0;text-align:center;}body>div.sidemenu .btn.btn-circle:hover{background-color:#1b1b1b;border:2px solid rgba(255, 255, 255, 0.3);}body>div.sidemenu .btn.btn-circle:hover svg path{fill:#fff;}body>div.sidemenu .offcanvas{-webkit-transform:translateZ(0) translate3D(0, 0, 0);-moz-transform:translateZ(0) translate3D(0, 0, 0);-ms-transform:translateZ(0) translate3D(0, 0, 0);transform:translateZ(0) translate3D(0, 0, 0);background-color:var(--bgColor, #fff);}body>div.sidemenu .offcanvas ul{margin-left:0;}body>div.sidemenu .offcanvas:before,body>div.sidemenu .offcanvas:after{content:" ";display:table;}body>div.sidemenu .offcanvas:after{clear:both;}@media (min-width: 768px){body>div.sidemenu .offcanvas{width:440px;padding-top:70px;padding-bottom:70px;}}@media (max-width: 767px){body>div.sidemenu .offcanvas{padding-top:50px;padding-bottom:50px;}}body>div.sidemenu .offcanvas .offcanvas-inner{position:relative;height:100%;}body>div.sidemenu .offcanvas .offcanvas-header{width:100%;display:block;}@media (min-width: 768px){body>div.sidemenu .offcanvas .offcanvas-header{padding-right:70px;}}@media (max-width: 767px){body>div.sidemenu .offcanvas .offcanvas-header{padding-right:50px;}}@media (min-height: 800px){body>div.sidemenu .offcanvas .offcanvas-header{position:absolute;z-index:900;}}body>div.sidemenu .offcanvas .offcanvas-header img{width:24px;float:right;cursor:pointer;}body>div.sidemenu .offcanvas .offcanvas-menu{text-align:center;}body>div.sidemenu .sidemenu-inner{padding:60px;}@media (max-width: 767px){body>div.sidemenu .sidemenu-inner{padding:30px;}}@media (min-height: 800px){body>div.sidemenu .sidemenu-inner{position:relative;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);}}body>div.sidemenu .offcanvas .offcanvas-menu ul{padding:0;}body>div.sidemenu .offcanvas .offcanvas-menu>li{text-transform:uppercase;letter-spacing:0.15em;font-size:11px;padding:13px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;margin-bottom:0;}body>div.sidemenu .offcanvas .offcanvas-menu>li+li{border-top:1px solid rgba(0, 0, 0, 0.1);}body>div.sidemenu .offcanvas .offcanvas-menu>li ul li{text-transform:none;letter-spacing:0;font-size:12px;font-family:Arapey,serif;font-style:italic;padding:5px 0;}body>div.sidemenu .offcanvas .offcanvas-menu>li ul li:last-child{border-bottom:1px solid rgba(0, 0, 0, 0.1);}body>div.sidemenu .offcanvas .offcanvas-menu a{display:block;color:var(--fontColor, #171819);cursor:pointer;width:100%;font-size:14px;}body>div.sidemenu .offcanvas .offcanvas-menu a:hover,body>div.sidemenu .offcanvas .offcanvas-menu a:focus{color:var(--hoverColor, #696d72);}body>div.sidemenu .offcanvas .offcanvas-footer{text-align:center;width:100%;display:block;margin:0;padding:0 0 60px 0;}@media (min-height: 800px){body>div.sidemenu .offcanvas .offcanvas-footer{position:absolute;bottom:0;padding:0;z-index:900;}}body>div.sidemenu .offcanvas .offcanvas-footer li{display:inline-block;}body>div.sidemenu .sidemenu-social-links{margin-top:25px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}body>div.sidemenu .sidemenu-social-links li{padding:0;margin:5px;}body>div.sidemenu .sidemenu-social-links .socials__item{width:55px;height:55px;font-size:18px;border-radius:100%;border-color:transparent;background-color:#fff;color:#484b4e;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-transition:all 0.3s ease;transition:all 0.3s ease;}body>div.sidemenu .sidemenu-social-links .socials__item:hover{color:#000;}@media (max-width: 767px){body>div.sidemenu .sidemenu-social-links .socials__item{width:45px;height:45px;font-size:15px;}}body>div.sidemenu .sidemenu__close{float:right;width:24px;height:24px;display:block;position:relative;padding:0;border:none;background-color:transparent;cursor:pointer;}body>div.sidemenu .sidemenu__close:hover:before,body>div.sidemenu .sidemenu__close:hover:after{background-color:var(--hoverColor, #171819);}body>div.sidemenu .sidemenu__close:before,body>div.sidemenu .sidemenu__close:after{content:'';display:block;width:24px;height:2px;background-color:var(--fontColor, #171819);position:absolute;left:50%;top:50%;}body>div.sidemenu .sidemenu__close:before{-webkit-transform:translate(-50%, -50%) rotate(45deg);-moz-transform:translate(-50%, -50%) rotate(45deg);-ms-transform:translate(-50%, -50%) rotate(45deg);transform:translate(-50%, -50%) rotate(45deg);}body>div.sidemenu .sidemenu__close:after{-webkit-transform:translate(-50%, -50%) rotate(-45deg);-moz-transform:translate(-50%, -50%) rotate(-45deg);-ms-transform:translate(-50%, -50%) rotate(-45deg);transform:translate(-50%, -50%) rotate(-45deg);}body>div.sidemenu .btn.btn-circle:hover{background-color:#1b1b1b!important;}body>div.sidemenu a{background-color:transparent;-webkit-text-decoration-skip:objects;}body>div.sidemenu a:active,body>div.sidemenu a:hover{outline-width:0;}body>div.sidemenu img{border-style:none;}footer{background-color:#1B1B1B;color:#FFFFFF;--fontColor:#FFFFFF;--fontColor_H:0;--fontColor_S:0%;--fontColor_L:100%;--fontColor_A:1;--fontColor_darkenDir:-1;--bgColor:#1B1B1B;--bgColor_H:0;--bgColor_S:0%;--bgColor_L:11%;--bgColor_A:1;--bgColor_darkenDir:1;}footer .classic-footer-component{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:auto;min-height:100vh;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;}footer .classic-footer-component .row{-webkit-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-ms-flex-pack:space-around;-webkit-justify-content:space-around;justify-content:space-around;padding:30px 10px;margin-left:0;margin-right:0;}@media (max-width: 1023px){footer .classic-footer-component .row{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-bottom:0;}}footer .classic-footer-component .column{-webkit-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 30px;}footer .classic-footer-component .basic-info{margin:0 auto;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}@media (min-width: 768px){footer .classic-footer-component .basic-info{width:720px;}}@media (min-width: 1199px){footer .classic-footer-component .basic-info{width:940px;}}@media (min-width: 1200px){footer .classic-footer-component .basic-info{width:1140px;}}footer .classic-footer-component .basic-info h6{margin-top:0;margin-bottom:15px;}@media (max-width: 1023px){footer .classic-footer-component .basic-info .title{-webkit-order:1;-ms-flex-order:1;order:1;}}@media (max-width: 1023px){footer .classic-footer-component .basic-info .map{-webkit-order:3;-ms-flex-order:3;order:3;margin-bottom:0;}}@media (max-width: 1023px){footer .classic-footer-component .basic-info .contacts{-webkit-order:2;-ms-flex-order:2;order:2;}}footer .classic-footer-component .basic-info .contacts .phone p{margin-bottom:0;}footer .classic-footer-component .basic-info .contacts .title{font-style:normal;}@media (max-width: 1023px){footer .classic-footer-component .basic-info .column{margin-bottom:40px;}}footer .classic-footer-component .map-container{min-height:100px;width:100%;background-color:#fff;margin-bottom:15px;-webkit-transition:opacity ease-in .1s;transition:opacity ease-in .1s;opacity:.5;}footer .classic-footer-component .map-container:hover{opacity:1;}footer .classic-footer-component .logo{min-height:16vh;}footer .classic-footer-component .copyrights{-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;min-height:33vh;}@media (max-width: 1023px){footer .classic-footer-component .copyrights{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}footer .classic-footer-component .copyrights .column{-webkit-flex:2;-ms-flex:2;flex:2;}footer .classic-footer-component .copyrights .copyright-info{-webkit-flex:3;-ms-flex:3;flex:3;}@media (max-width: 991px){footer .classic-footer-component .copyrights .copyright-info{width:100%;}}footer .classic-footer-component .copyrights .copyright-info .info{width:80%;margin:1em auto;}@media (min-width: 991px){footer .classic-footer-component .copyrights .copyright-info .info{width:100%;}}footer .classic-footer-component .copyrights .copyright-info .info .by{font-size:20px;}footer .classic-footer-component .copyrights .copyright-info .info p{margin-bottom:0;}footer .classic-footer-component .copyrights .copyright-info .info .disclaimer-wrap>div{margin-top:1em;}footer .classic-footer-component .copyrights .copyright-logo{max-height:10em;width:155px;}footer .classic-footer-component .copyrights .copyright,footer .classic-footer-component .copyrights .copyright-name{font-size:10px;letter-spacing:0.15em;display:inline;}footer .classic-footer-component .copyrights .copyright.by,footer .classic-footer-component .copyrights .copyright-name.by{font-size:12px;}footer .classic-footer-component .copyrights .copyright{-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}@media (max-width: 1023px){footer .classic-footer-component .copyrights .copyright{-webkit-order:1;-ms-flex-order:1;order:1;margin-bottom:65px;}}footer .classic-footer-component .copyrights .copyright-name{-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;text-align:right;}@media (max-width: 1023px){footer .classic-footer-component .copyrights .copyright-name{margin-bottom:20px;}}footer .classic-footer-component .lp-socials{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;gap:15px;}@media (max-width: 1023px){footer .classic-footer-component .lp-socials{margin-bottom:20px;}}footer .classic-footer-component .lp-socials li{padding:0;margin:0;}footer .classic-footer-component .lp-socials a{margin:0;}body>div.mobile-contact-wrapper{z-index:200;position:relative;}body>div.mobile-contact-wrapper .lp-ico:before{content:'';width:1em;height:1em;background-color:currentColor;-webkit-background-size:cover;background-size:cover;display:block;-webkit-mask-position:center;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-transition:all .3s;transition:all .3s;}body>div.mobile-contact-wrapper .lp-ico-search:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='25' height='25' viewBox='0 0 25 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.6231 21.3002L17.1372 16.8143M19.5606 10.9877C19.5606 15.5441 15.8669 19.2377 11.3106 19.2377C6.75421 19.2377 3.06055 15.5441 3.06055 10.9877C3.06055 6.43135 6.75421 2.73769 11.3106 2.73769C15.8669 2.73769 19.5606 6.43135 19.5606 10.9877Z' stroke='black' stroke-width='1.82813' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='25' height='25' viewBox='0 0 25 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.6231 21.3002L17.1372 16.8143M19.5606 10.9877C19.5606 15.5441 15.8669 19.2377 11.3106 19.2377C6.75421 19.2377 3.06055 15.5441 3.06055 10.9877C3.06055 6.43135 6.75421 2.73769 11.3106 2.73769C15.8669 2.73769 19.5606 6.43135 19.5606 10.9877Z' stroke='black' stroke-width='1.82813' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='25' height='25' viewBox='0 0 25 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.6231 21.3002L17.1372 16.8143M19.5606 10.9877C19.5606 15.5441 15.8669 19.2377 11.3106 19.2377C6.75421 19.2377 3.06055 15.5441 3.06055 10.9877C3.06055 6.43135 6.75421 2.73769 11.3106 2.73769C15.8669 2.73769 19.5606 6.43135 19.5606 10.9877Z' stroke='black' stroke-width='1.82813' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-arrow-top:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='17' height='16' viewBox='0 0 17 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.8716 9.99976L8.87158 5.99976L4.87158 9.99976' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='17' height='16' viewBox='0 0 17 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.8716 9.99976L8.87158 5.99976L4.87158 9.99976' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='17' height='16' viewBox='0 0 17 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.8716 9.99976L8.87158 5.99976L4.87158 9.99976' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-scroll-top:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 3H3M12 21V7M12 7L5 14M12 7L19 14' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 3H3M12 21V7M12 7L5 14M12 7L19 14' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 3H3M12 21V7M12 7L5 14M12 7L19 14' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");}body>div.mobile-contact-wrapper .lp-ico-close:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.5986 6.32617L5.59863 18.3262M5.59863 6.32617L17.5986 18.3262' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.5986 6.32617L5.59863 18.3262M5.59863 6.32617L17.5986 18.3262' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M17.5986 6.32617L5.59863 18.3262M5.59863 6.32617L17.5986 18.3262' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E ");}body>div.mobile-contact-wrapper .lp-ico-phone:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8699 6.57142C14.7459 6.74157 15.551 7.16808 16.1821 7.79637C16.8132 8.42465 17.2416 9.22612 17.4126 10.0982M13.8699 3C15.6899 3.20128 17.3871 4.01265 18.6827 5.3009C19.9784 6.58914 20.7955 8.27768 21 10.0893M10.4412 13.592C9.36357 12.5192 8.51264 11.3061 7.88843 10.0118C7.83474 9.90047 7.80789 9.84481 7.78726 9.77437C7.71397 9.52405 7.76662 9.21668 7.91909 9.00469C7.962 8.94504 8.01326 8.894 8.11578 8.79194C8.42933 8.47979 8.58611 8.32372 8.6886 8.16677C9.07515 7.57491 9.07515 6.81189 8.6886 6.22002C8.58611 6.06308 8.42933 5.90701 8.11578 5.59486L7.94101 5.42087C7.46438 4.94637 7.22607 4.70912 6.97012 4.58024C6.4611 4.32392 5.85996 4.32392 5.35093 4.58024C5.09499 4.70912 4.85667 4.94637 4.38004 5.42087L4.23867 5.56161C3.76367 6.03449 3.52617 6.27093 3.34478 6.59239C3.1435 6.94909 2.99878 7.5031 3.00001 7.91222C3.00111 8.28092 3.07295 8.53291 3.21664 9.03688C3.98881 11.7453 5.44574 14.3009 7.58743 16.4331C9.72911 18.5652 12.2963 20.0156 15.0168 20.7843C15.523 20.9274 15.7761 20.9989 16.1465 21C16.5575 21.0012 17.114 20.8571 17.4723 20.6568C17.7952 20.4762 18.0327 20.2397 18.5077 19.7669L18.649 19.6261C19.1257 19.1516 19.364 18.9144 19.4934 18.6596C19.7509 18.1528 19.7509 17.5544 19.4934 17.0476C19.364 16.7928 19.1257 16.5556 18.649 16.0811L18.4743 15.9071C18.1607 15.5949 18.0039 15.4388 17.8463 15.3368C17.2518 14.952 16.4853 14.952 15.8908 15.3368C15.7332 15.4388 15.5764 15.5949 15.2628 15.9071C15.1603 16.0091 15.1091 16.0602 15.0491 16.1029C14.8362 16.2547 14.5274 16.3071 14.276 16.2341C14.2052 16.2136 14.1493 16.1869 14.0375 16.1334C12.7374 15.512 11.5189 14.6648 10.4412 13.592Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8699 6.57142C14.7459 6.74157 15.551 7.16808 16.1821 7.79637C16.8132 8.42465 17.2416 9.22612 17.4126 10.0982M13.8699 3C15.6899 3.20128 17.3871 4.01265 18.6827 5.3009C19.9784 6.58914 20.7955 8.27768 21 10.0893M10.4412 13.592C9.36357 12.5192 8.51264 11.3061 7.88843 10.0118C7.83474 9.90047 7.80789 9.84481 7.78726 9.77437C7.71397 9.52405 7.76662 9.21668 7.91909 9.00469C7.962 8.94504 8.01326 8.894 8.11578 8.79194C8.42933 8.47979 8.58611 8.32372 8.6886 8.16677C9.07515 7.57491 9.07515 6.81189 8.6886 6.22002C8.58611 6.06308 8.42933 5.90701 8.11578 5.59486L7.94101 5.42087C7.46438 4.94637 7.22607 4.70912 6.97012 4.58024C6.4611 4.32392 5.85996 4.32392 5.35093 4.58024C5.09499 4.70912 4.85667 4.94637 4.38004 5.42087L4.23867 5.56161C3.76367 6.03449 3.52617 6.27093 3.34478 6.59239C3.1435 6.94909 2.99878 7.5031 3.00001 7.91222C3.00111 8.28092 3.07295 8.53291 3.21664 9.03688C3.98881 11.7453 5.44574 14.3009 7.58743 16.4331C9.72911 18.5652 12.2963 20.0156 15.0168 20.7843C15.523 20.9274 15.7761 20.9989 16.1465 21C16.5575 21.0012 17.114 20.8571 17.4723 20.6568C17.7952 20.4762 18.0327 20.2397 18.5077 19.7669L18.649 19.6261C19.1257 19.1516 19.364 18.9144 19.4934 18.6596C19.7509 18.1528 19.7509 17.5544 19.4934 17.0476C19.364 16.7928 19.1257 16.5556 18.649 16.0811L18.4743 15.9071C18.1607 15.5949 18.0039 15.4388 17.8463 15.3368C17.2518 14.952 16.4853 14.952 15.8908 15.3368C15.7332 15.4388 15.5764 15.5949 15.2628 15.9071C15.1603 16.0091 15.1091 16.0602 15.0491 16.1029C14.8362 16.2547 14.5274 16.3071 14.276 16.2341C14.2052 16.2136 14.1493 16.1869 14.0375 16.1334C12.7374 15.512 11.5189 14.6648 10.4412 13.592Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8699 6.57142C14.7459 6.74157 15.551 7.16808 16.1821 7.79637C16.8132 8.42465 17.2416 9.22612 17.4126 10.0982M13.8699 3C15.6899 3.20128 17.3871 4.01265 18.6827 5.3009C19.9784 6.58914 20.7955 8.27768 21 10.0893M10.4412 13.592C9.36357 12.5192 8.51264 11.3061 7.88843 10.0118C7.83474 9.90047 7.80789 9.84481 7.78726 9.77437C7.71397 9.52405 7.76662 9.21668 7.91909 9.00469C7.962 8.94504 8.01326 8.894 8.11578 8.79194C8.42933 8.47979 8.58611 8.32372 8.6886 8.16677C9.07515 7.57491 9.07515 6.81189 8.6886 6.22002C8.58611 6.06308 8.42933 5.90701 8.11578 5.59486L7.94101 5.42087C7.46438 4.94637 7.22607 4.70912 6.97012 4.58024C6.4611 4.32392 5.85996 4.32392 5.35093 4.58024C5.09499 4.70912 4.85667 4.94637 4.38004 5.42087L4.23867 5.56161C3.76367 6.03449 3.52617 6.27093 3.34478 6.59239C3.1435 6.94909 2.99878 7.5031 3.00001 7.91222C3.00111 8.28092 3.07295 8.53291 3.21664 9.03688C3.98881 11.7453 5.44574 14.3009 7.58743 16.4331C9.72911 18.5652 12.2963 20.0156 15.0168 20.7843C15.523 20.9274 15.7761 20.9989 16.1465 21C16.5575 21.0012 17.114 20.8571 17.4723 20.6568C17.7952 20.4762 18.0327 20.2397 18.5077 19.7669L18.649 19.6261C19.1257 19.1516 19.364 18.9144 19.4934 18.6596C19.7509 18.1528 19.7509 17.5544 19.4934 17.0476C19.364 16.7928 19.1257 16.5556 18.649 16.0811L18.4743 15.9071C18.1607 15.5949 18.0039 15.4388 17.8463 15.3368C17.2518 14.952 16.4853 14.952 15.8908 15.3368C15.7332 15.4388 15.5764 15.5949 15.2628 15.9071C15.1603 16.0091 15.1091 16.0602 15.0491 16.1029C14.8362 16.2547 14.5274 16.3071 14.276 16.2341C14.2052 16.2136 14.1493 16.1869 14.0375 16.1334C12.7374 15.512 11.5189 14.6648 10.4412 13.592Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-sms:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7117 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0034 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92176 4.44061 8.37485 5.27072 7.03255C6.10083 5.69025 7.28825 4.60557 8.7 3.9C9.87812 3.30493 11.1801 2.99656 12.5 3H13C15.0843 3.11499 17.053 3.99476 18.5291 5.47086C20.0052 6.94695 20.885 8.91565 21 11V11.5Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7117 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0034 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92176 4.44061 8.37485 5.27072 7.03255C6.10083 5.69025 7.28825 4.60557 8.7 3.9C9.87812 3.30493 11.1801 2.99656 12.5 3H13C15.0843 3.11499 17.053 3.99476 18.5291 5.47086C20.0052 6.94695 20.885 8.91565 21 11V11.5Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21 11.5C21.0034 12.8199 20.6951 14.1219 20.1 15.3C19.3944 16.7117 18.3098 17.8992 16.9674 18.7293C15.6251 19.5594 14.0782 19.9994 12.5 20C11.1801 20.0034 9.87812 19.6951 8.7 19.1L3 21L4.9 15.3C4.30493 14.1219 3.99656 12.8199 4 11.5C4.00061 9.92176 4.44061 8.37485 5.27072 7.03255C6.10083 5.69025 7.28825 4.60557 8.7 3.9C9.87812 3.30493 11.1801 2.99656 12.5 3H13C15.0843 3.11499 17.053 3.99476 18.5291 5.47086C20.0052 6.94695 20.885 8.91565 21 11V11.5Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper .lp-ico-email:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.5 18L14.8571 12M9.14286 12L2.50003 18M2 7L10.1649 12.7154C10.8261 13.1783 11.1567 13.4097 11.5163 13.4993C11.8339 13.5785 12.1661 13.5785 12.4837 13.4993C12.8433 13.4097 13.1739 13.1783 13.8351 12.7154L22 7M6.8 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H6.8C5.11984 4 4.27976 4 3.63803 4.32698C3.07354 4.6146 2.6146 5.07354 2.32698 5.63803C2 6.27976 2 7.11984 2 8.8V15.2C2 16.8802 2 17.7202 2.32698 18.362C2.6146 18.9265 3.07354 19.3854 3.63803 19.673C4.27976 20 5.11984 20 6.8 20Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.5 18L14.8571 12M9.14286 12L2.50003 18M2 7L10.1649 12.7154C10.8261 13.1783 11.1567 13.4097 11.5163 13.4993C11.8339 13.5785 12.1661 13.5785 12.4837 13.4993C12.8433 13.4097 13.1739 13.1783 13.8351 12.7154L22 7M6.8 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H6.8C5.11984 4 4.27976 4 3.63803 4.32698C3.07354 4.6146 2.6146 5.07354 2.32698 5.63803C2 6.27976 2 7.11984 2 8.8V15.2C2 16.8802 2 17.7202 2.32698 18.362C2.6146 18.9265 3.07354 19.3854 3.63803 19.673C4.27976 20 5.11984 20 6.8 20Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M21.5 18L14.8571 12M9.14286 12L2.50003 18M2 7L10.1649 12.7154C10.8261 13.1783 11.1567 13.4097 11.5163 13.4993C11.8339 13.5785 12.1661 13.5785 12.4837 13.4993C12.8433 13.4097 13.1739 13.1783 13.8351 12.7154L22 7M6.8 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H6.8C5.11984 4 4.27976 4 3.63803 4.32698C3.07354 4.6146 2.6146 5.07354 2.32698 5.63803C2 6.27976 2 7.11984 2 8.8V15.2C2 16.8802 2 17.7202 2.32698 18.362C2.6146 18.9265 3.07354 19.3854 3.63803 19.673C4.27976 20 5.11984 20 6.8 20Z' stroke='white' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}body>div.mobile-contact-wrapper a{-webkit-text-decoration:none;text-decoration:none;}body>div.mobile-contact-wrapper .btn-holder{bottom:-50px;left:19px;position:fixed;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:13px;opacity:0;-webkit-transition:all .3s;transition:all .3s;}@media (max-width: 1024px){body>div.mobile-contact-wrapper .btn-holder{right:19px;padding:0 48px;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}}body>div.mobile-contact-wrapper .btn-holder.visible{bottom:28px;opacity:1;}body>div.mobile-contact-wrapper .search-btn{width:48px;height:48px;border-radius:999px;font-size:0;line-height:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-transition:all .3s;transition:all .3s;padding:12px;color:#141414;background:#fff;}@media (max-width: 1024px){body>div.mobile-contact-wrapper .search-btn{position:absolute;left:0;bottom:0;}}body>div.mobile-contact-wrapper .search-btn:before{width:24px;height:24px;}body>div.mobile-contact-wrapper .connect-btn{height:48px;padding:0 24px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;text-transform:uppercase;border-radius:25px;color:var(--pillTextColor);background:var(--pillBackgroundColor);border:1px solid rgba(255, 255, 255, 0.2);cursor:pointer;font-size:10px;font-style:normal;font-weight:500;line-height:16px;letter-spacing:0.4px;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-transition:all .4s;transition:all .4s;box-shadow:0 0 0 0 rgba(255, 255, 255, 0.2);-webkit-animation:pulsate 2s ease infinite;animation:pulsate 2s ease infinite;}body>div.mobile-contact-wrapper .connect-btn:before{width:16px;height:16px;}body>div.mobile-contact-wrapper .pop-up{display:none;position:fixed;bottom:0;left:0;width:100%;-webkit-transition:all .3s;transition:all .3s;border-radius:16px 16px 0 0;color:var(--textColor);background:var(--backgroundColor);}@media (min-width: 1025px){body>div.mobile-contact-wrapper .pop-up{max-width:637px;border-radius:16px;bottom:28px;left:19px;}}body>div.mobile-contact-wrapper .pop-up .lp-container{padding-top:24px;padding-bottom:24px;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}@media (min-width: 1025px){body>div.mobile-contact-wrapper .pop-up .lp-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-top:40px;padding-bottom:40px;min-height:450px;padding-left:56px;padding-right:56px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}body>div.mobile-contact-wrapper .pop-up .close-btn{width:44px;height:44px;background-color:transparent;border-color:transparent;display:block;margin:24px auto 0;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--textColor);cursor:pointer;padding:10px;border:0;}body>div.mobile-contact-wrapper .pop-up .close-btn:before{width:24px;height:24px;}@media (min-width: 1025px){body>div.mobile-contact-wrapper .pop-up .close-btn{position:absolute;top:14px;right:12px;margin:0;}}body>div.mobile-contact-wrapper .pop-up .icon-btn{width:44px;height:44px;border-radius:999px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:8px;color:var(--textColor);position:relative;}body>div.mobile-contact-wrapper .pop-up .icon-btn:after{position:absolute;bottom:0;width:100%;left:0;border-radius:999px;height:100%;content:'';border:solid 1px var(--textColor);opacity:.3;}body>div.mobile-contact-wrapper .pop-up .icon-btn:before{width:24px;height:24px;}body>div.mobile-contact-wrapper .success-block{display:none;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}@media (min-width: 1025px){body>div.mobile-contact-wrapper .success-block{-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}}body>div.mobile-contact-wrapper .success-block .lp-btn{margin-top:24px;}body>div.mobile-contact-wrapper .contact-form{margin:0;}@media (max-width: 1024px){body>div.mobile-contact-wrapper .contact-form__item{width:100%;}}body>div.mobile-contact-wrapper .contact-form__item .lp-input{width:100%;}body>div.mobile-contact-wrapper .contact-form__item .is-placeholder{color:#818181;}body>div.mobile-contact-wrapper .contact-form__item+.contact-form__item{margin-top:16px;}body>div.mobile-contact-wrapper .contact-form.show-success .contact-form__container,body>div.mobile-contact-wrapper .contact-form.success .contact-form__container{display:none;}body>div.mobile-contact-wrapper .contact-form.show-success .success-block,body>div.mobile-contact-wrapper .contact-form.success .success-block{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}body>div.mobile-contact-wrapper .contact-form .lp-disclaimer{margin-top:16px;}body>div.mobile-contact-wrapper .contact-form .lp-h3{margin-bottom:16px;}body>div.mobile-contact-wrapper .success-message{font-size:22px;}@-webkit-keyframes pulsate{0%{box-shadow:0 0 0 0 rgba(255, 255, 255, 0.2);}50%{box-shadow:0 0 4px 6px rgba(255, 255, 255, .5);}100%{box-shadow:0 0 12px 12px rgba(255, 255, 255, 0);}}
        </style>
    <style id="custom-style-css">.pagination-style-1 li a{color:rgba(0,0,0,1)!important;background-color:rgba(0, 0, 0, 0)!important;border-color:rgba(0, 0, 0, 0)!important;}.pagination-style-1 li a:hover{color:rgba(255,255,255,1)!important;background-color:rgba(0,0,0,1)!important;border-color:rgba(0, 0, 0, 1)!important;}.pagination-style-1 li.active a{color:rgba(255,255,255,1)!important;background-color:rgba(0,0,0,1)!important;border-color:rgba(0, 0, 0, 1)!important;}</style>


        <script>
            (function utmParse() {
                const url = new URL(window.location.href);
                if (url.search) {
                    const utm = url.search.split(/\?|&/g).reduce((acc, current) => {
                        const matched = current.match(/utm_(content|campaign|medium|source|term|id)|gclid/g);
                        if (matched) {
                        acc[matched[0]] = current.replace(`${matched[0]}=`, '');
                        }
                        return acc;
                    }, {});
                    if (Object.keys(utm).length) {
                        window.localStorage.setItem('utm_vars', JSON.stringify(utm));
                    } else {
                        // Remove old utm vars
                        window.localStorage.removeItem('utm_vars');
                    }
                }
                // Set referrer in local storage
                // This is meant to be stored once to avoid self-referrals and to have the first referrer only.
                if (!window.localStorage.getItem('referrer')) {
                    // Capture the Referrer URL
                    const referrer = document.referrer;
                    if (referrer) {
                        // Only store the referrer if it comes from outside the current domain (to avoid self-referrals)
                        const currentDomain = window.location.hostname;
                        const referrerDomain = new URL(referrer).hostname;

                        if (referrerDomain !== currentDomain) {
                            // Store it in localStorage
                            localStorage.setItem('referrer', referrer);
                        }
                    }
                }
            })();
        </script>
        
    <!-- GOOGLE TRANSLATE STYLES are moved to external CSS -->
</head>
<body>
    <div id="google_translate_element" style="display: none"></div>

      <div id="global-loader" style="height:100%;width:100%;position:fixed;z-index:9999;left:0;top:0;background-color:rgba(0, 0, 0, 1);overflow-x:hidden;transition:1s;">
          <div style="position:absolute;height:100vh;text-align:center;bottom:0;left:0;right: 0;display:flex;align-items:center;">
              <img style="margin:0 auto;" src="https://media-production.lp-cdn.com/cdn-cgi/image/format&#x3D;auto,quality&#x3D;85,fit&#x3D;scale-down,width&#x3D;960/https://media-production.lp-cdn.com/media/658e7b69-747c-4871-8934-af6fafd58dc6" />
          </div>
      </div>
      <script>
        if (window.sessionStorage.getItem('global_loading_displayed') === 'yes') {
          (function () {
            document.getElementById('global-loader').remove();
          })();
        }
      </script>

        <nav id="global-navbar" data-el-id="356ba03e-0a2b-4f0b-8a57-92f6d618e8c0">
            <header class="header headroom--not-bottom headroom headroom--not-top">
    <div class="navbar navbar-default">
        <div class="container">
            <div class="navbar-header">
                <div class="logo-container">
                    <a href="/" class="logo-holder">
                        <div class="logo-wrapper">
                            <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format&#x3D;auto,quality&#x3D;85,fit&#x3D;scale-down,width&#x3D;960/https://media-production.lp-cdn.com/media/b3e1f01c-5138-4bc7-9a54-feb7811a161c" class="logo-light">
                            <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format&#x3D;auto,quality&#x3D;85,fit&#x3D;scale-down,width&#x3D;960/https://media-production.lp-cdn.com/media/ca9745d8-b785-4dd4-b4c6-1c062139b1fd" class="logo-dark">
                        </div>
                    </a>
                </div>
                <ul class="nav navbar-nav">
                          <li class="nav-item sub-nav-container">
                              <div class="sub-nav">
                                  <ul>
                                              <li><a  href="/about" class="nav-link">About</a></li>
                                              <li><a  href="/agents" class="nav-link">Meet Our Team</a></li>
                                  </ul>
                              </div>
                              <a href="#" class="nav-link">About Us</a>
                          </li>
                            <li class="nav-item active"><a  href="/properties/sale" data-toggle="modal" role="button" class="nav-link">Featured Listings</a></li>
                            <li class="nav-item active"><a  href="/home-search/listings" data-toggle="modal" role="button" class="nav-link">Home Search</a></li>
                            <li class="nav-item"><a data-type="CONTACT_US" data-toggle="modal" role="button" class="nav-link">Contact Us</a></li>
                            <li class="nav-item active"><a target="_blank" href="tel:19178174253" data-toggle="modal" role="button" class="nav-link">(917) 817-4253</a></li>
                    <li><button type="button" class="navbar-toggle toggle-id-1 hamburger-component"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button></li>
                </ul>
            </div>
        </div>
    </div>
</header>

        </nav>
        <div id="global-sidemenu" class="sidemenu" data-el-id="45297590-3314-4020-98ac-7dfc88e70cfb">
            <div off-canvas="id-1 right overlay" class="offcanvas sidemenu" style="margin-right: -440px; display: block; transition-duration: 300ms; transform: translate(-440px, 0px);">
  <div class="offcanvas-inner">
    <a class="offcanvas-header"><div class="sidemenu__close offcanvas-close toggle"></div></a>
    <div class="sidemenu-inner">
    <ul class="offcanvas-menu">
      <li><a  href="/">Home</a></li>
      <li class="sub-nav-container">
        <a href="#" class="link">About Us +</a>
        <div class="sub-nav">
          <ul>
            <li><a  href="/about" class="link">About M &amp; D Properties</a></li>
            <li><a  href="/agents" class="link">Meet The Team</a></li>
          </ul>
        </div>
      </li>
      <li class="sub-nav-container">
        <a href="#" class="link">Properties +</a>
        <div class="sub-nav">
          <ul>
            <li><a  href="/properties/sale" class="link">Featured Listings</a></li>
            <li><a  href="/properties/sold" class="link">Sold Listings</a></li>
          </ul>
        </div>
      </li>
      <li><a  href="/blog">Blog</a></li>
      <li><a  href="/testimonials">Testimonials</a></li>
      <li><a  href="/neighborhoods">Neighborhoods</a></li>
      <li><a  href="/home-valuation">Home Valuation</a></li>
      <li><a  href="/agency-representation">Agency Representation</a></li>
      <li><a  href="/home-search/listings">Home Search</a></li>
      <li class="sub-nav-container">
        <a href="#" class="link">Resources +</a>
        <div class="sub-nav">
          <ul>
            <li><a  href="/buyers" class="link">Buyer&#x27;s Guide</a></li>
            <li><a  href="/sellers" class="link">Seller&#x27;s Guide</a></li>
          </ul>
        </div>
      </li>
      <li><a data-type="CONTACT_US" data-toggle="modal" role="button" class="close-menu toggle">Contact Us</a></li>
      <li><a target="_blank" href="tel:19178174253">(917) 817-4253</a></li>
    </ul>
  </div>
    <ul class="offcanvas-footer">
      <li>
        <button data-type="CONTACT_US" data-target="#modal-contact" data-toggle="modal" role="button" class="btn btn-inverse btn-circle close-menu toggle">
          <svg xmlns="http://www.w3.org/2000/svg" width="21" height="13" fill="none" viewBox="0 0 21 13">
            <path fill="#484B4E" d="M.25.958c-.146.271-.25.584-.25.917v9.23c0 .332.083.645.23.895l6.52-6L.25.958zM20.166.958l-6.52 5.063 6.52 6c.146-.271.23-.584.23-.896V1.896c.02-.354-.063-.646-.23-.938zM11.396 7.792c-.334.27-.75.416-1.188.416-.437 0-.854-.145-1.187-.416L7.54 6.646.918 12.729c.27.167.604.271.958.271H18.54c.355 0 .667-.104.959-.27l-6.625-6.084-1.48 1.146z"/>
            <path fill="#484B4E" d="M10.209 7.208c.208 0 .416-.062.583-.208L19.479.25c-.27-.167-.583-.25-.937-.25H1.875C1.542 0 1.23.083.938.25L9.625 7c.188.146.375.208.584.208z"/>
          </svg>
        </button>
      </li>
    </ul>
  </div>
</div>
        </div>
        <div  id="global-mobile-contact" class="mobile-contact-wrapper" data-el-id="befe5af2-a6ca-4119-924a-a85d96d36b51">
            <div class="btn-holder" 
style="
--backgroundColor: rgba(20, 20, 20, 1); 
--textColor: rgba(255, 255, 255, 1); 
--pillTextColor: rgba(26, 26, 26, 1); 
--pillBackgroundColor: rgba(255, 255, 255, 1);">

    <button type="button" class="connect-btn lp-ico lp-ico-arrow-top visible">Let&#x27;s Connect</button>
</div>


<div class="pop-up" style="--backgroundColor: rgba(20, 20, 20, 1); --textColor: rgba(255, 255, 255, 1);">
  <div class="lp-container">
    <form data-type="contact-form" class="contact-form">
      <div class="contact-form__container">
          <h3 class="lp-h3">Leave a Message</h3>
      
        <div class="contact-form__content">
          <div class="contact-form__inputs-container">
            <div class="contact-form__item">
              <input
                id="__FullName"
                type="text" name="name"
                class="lp-input lp-input--light"
                required
                placeholder="Full Name">
            </div>
            <div class="contact-form__item">
              <input
                id="__Email"
                type="email" name="email"
                class="lp-input js-email-input lp-input--light"
                required
                placeholder="Email">
            </div>
            <div class="contact-form__item"> 
              <input
                class="lp-input lp-input--light"
                type="tel" 
                placeholder="Phone"
                id="__Phone"
                name="phone"
                required>
            </div>

            <div class="contact-form__item input-group-select">
              <select name="interest" id="-field-interest" placeholder="Interest"
                class="lp-input dropdown-select js-select js-form-element lp-input--light" required>
                <option value="" disabled selected data-label="Interest">Interested in...</option>
                <option value="Selling &amp; Buying">Selling &amp; Buying</option>
                <option value="Selling">Selling</option>
                <option value="Buying">Buying</option>
                <option value="Renting">Renting</option>
                <option value="Other">Other</option>
              </select>
              <label for="-field-interest" class="lp-label sr-only">Interest</label>
            </div>

            <div class="contact-form__item">
              <textarea
                name="message"
                rows="4"
                id="__Message"
                class="lp-input lp-input--light"
                placeholder="Message"
                required></textarea>
            </div>
            <div class="lp-disclaimer">  <label style='display: none;' for='-termsAccepted'>Opt In/Disclaimer Consent:</label>
  <label class='lp-tcr-content'>
    <span class='lp-tcr-checkbox'>
      <input
        type='checkbox'
        id='-termsAccepted'
        name='termsAccepted'
        oninvalid="this.setCustomValidity('Please accept the terms and conditions')"
        oninput="this.setCustomValidity('')"
        required
      /></span>
    <span class='lp-tcr-message'>
      
        I agree to be contacted by
        M &amp; D Properties
        via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance.
        You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary.
        <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>.
    </span>
  </label>

</div>
            <button type="submit" class="lp-btn lp-btn--filled lp-btn--dark submit  contact-form__item">Submit</button>
            
            <div class="lp-h-pot">
              <input id="__newsSignMiddleName" name="middleName" value="" autocomplete="off" tabindex="-1">
            </div>
            
            <input style="display: none;" type="text" name="source" value="CONTACT_INQUIRY" />
            <input type="hidden" name="button_text" value="Let&#x27;s Connect">
          </div>
        </div>
      </div>


      <div class="success-block">
          <h3 class="lp-h3 success-message">Thank you for your message. We will be in touch with you shortly.</h3>

      </div>
    </form>

    <button type="button" class="close-btn lp-ico lp-ico-close"></button>
  
  </div>
</div>


        </div>
        <section  class="image-section is-font-color-light is-background-color-light" id="section-8af9353d-d411-4802-b1d3-231441ea10dc" data-el-id="ce4ebc8e-00da-41e6-b227-01aa28ddd458">
    <div class="redesign image-opening-section first_section">
    <div class="heading">
        <h1 class="h3">INSIDER INSIGHTS</h1>
        <p class="serif">Browse Our Latest Blog Posts</p>
    </div>
</div>
</section>
<section id="section-739fa5af-02ea-4cbe-a7d6-b74dd396d533"  class="solid-section is-font-color-dark is-background-color-light" data-el-id="5dc67f72-d757-4ad1-8c79-c0b4873d7390">
<script type="text/x-handlebars-template" class="blogItem pagination-script"><a href="/blog/{{slug}}" class="blog-list__block">
  <figure>
    {{#if media.length}}
      {{{mediaImage media.[0] sizes="(max-width: 768px) 100vw, 33vw" alt=title}}}
    {{/if}}
    {{#if categories}}
    {{#each categories}}
    <figcaption>{{name}}</figcaption>
    {{/each}}
    {{/if}}
  </figure>
  <div class="text_wrap">
    <h6>{{truncate (striptags title) 85 "..."}}</h6>
    {{#if (or customAuthor  publishedAt)}}
    <p class="custom_author">
      {{#isEmpty customAuthor}}
      
      {{hbFormatDate publishedAt}}
      
      {{else}}
      
      {{customAuthor}}
      
      {{#if (and customAuthor  publishedAt)}}|{{/if}}
      
      {{hbFormatDate publishedAt}}
      
      {{/isEmpty}}
    </p>
    {{/if}}
    {{#if subtitle}}
    <p class="feature">
      {{truncate (striptags subtitle) 150 "..."}}
    </p>
    {{/if}}
    <span class="link up-link hyperlink-style-1">read more</span>
  </div>
</a>
</script><div class="redesign">
  <div class="blog-list-section ">
    <div class="container">
      <div class="blog-list data-container">
        <a href="/blog/beachside-or-in-town-comparing-westport-lifestyles" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/6621fe78-0e13-48bf-82d6-bd7c6573439f" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/6621fe78-0e13-48bf-82d6-bd7c6573439f 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/6621fe78-0e13-48bf-82d6-bd7c6573439f 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/6621fe78-0e13-48bf-82d6-bd7c6573439f 1408w" alt="Beachside Or In-Town? Comparing Westport Lifestyles" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Beachside Or In-Town? Comparing Westport Lifestyles</h6>
            <p class="custom_author">
              
              June 11, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/life-along-the-saugatuck-river-in-westport" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/7b523265-3abb-40d3-9b94-d76146801860" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/7b523265-3abb-40d3-9b94-d76146801860 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/7b523265-3abb-40d3-9b94-d76146801860 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/7b523265-3abb-40d3-9b94-d76146801860 1408w" alt="Life Along The Saugatuck River In Westport" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Life Along The Saugatuck River In Westport</h6>
            <p class="custom_author">
              
              June 4, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/everyday-country-living-in-weston" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/3edc86f5-def8-4cce-994a-73125c454c7b" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/3edc86f5-def8-4cce-994a-73125c454c7b 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/3edc86f5-def8-4cce-994a-73125c454c7b 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/3edc86f5-def8-4cce-994a-73125c454c7b 1408w" alt="Everyday Country Living In Weston" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Everyday Country Living In Weston</h6>
            <p class="custom_author">
              
              May 28, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/planning-your-weston-home-sale-around-school-schedules" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/4aea3f63-14d6-44e5-a805-e9b8259292b8" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/4aea3f63-14d6-44e5-a805-e9b8259292b8 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/4aea3f63-14d6-44e5-a805-e9b8259292b8 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/4aea3f63-14d6-44e5-a805-e9b8259292b8 1408w" alt="Planning Your Weston Home Sale Around School Schedules" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Planning Your Weston Home Sale Around School Schedules</h6>
            <p class="custom_author">
              
              May 21, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/fairfield-beach-lifestyle-from-jennings-to-southport" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/19901d99-315b-449a-a575-edbf4792a73e" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/19901d99-315b-449a-a575-edbf4792a73e 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/19901d99-315b-449a-a575-edbf4792a73e 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/19901d99-315b-449a-a575-edbf4792a73e 1408w" alt="Fairfield Beach Lifestyle From Jennings To Southport" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Fairfield Beach Lifestyle From Jennings To Southport</h6>
            <p class="custom_author">
              
              May 14, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/how-m-and-d-lists-and-markets-westport-homes" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/9a252017-10c1-4a1a-a725-f5f9252670d5" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/9a252017-10c1-4a1a-a725-f5f9252670d5 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/9a252017-10c1-4a1a-a725-f5f9252670d5 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/9a252017-10c1-4a1a-a725-f5f9252670d5 1408w" alt="How M &amp; D Lists And Markets Westport Homes" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>How M &amp; D Lists And Markets Westport Homes</h6>
            <p class="custom_author">
              
              May 7, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/balancing-hybrid-work-and-life-in-westport-and-weston" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/1248b554-1c14-4ffb-b67b-169e0805db1f" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/1248b554-1c14-4ffb-b67b-169e0805db1f 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/1248b554-1c14-4ffb-b67b-169e0805db1f 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/1248b554-1c14-4ffb-b67b-169e0805db1f 1408w" alt="Balancing Hybrid Work And Life In Westport And Weston" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Balancing Hybrid Work And Life In Westport And Weston</h6>
            <p class="custom_author">
              
              April 23, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/buying-a-westport-beach-cottage-or-second-home" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/c4034661-2407-464b-ac1a-2f9806495d02" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/c4034661-2407-464b-ac1a-2f9806495d02 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/c4034661-2407-464b-ac1a-2f9806495d02 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/c4034661-2407-464b-ac1a-2f9806495d02 1408w" alt="Buying A Westport Beach Cottage Or Second Home" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Buying A Westport Beach Cottage Or Second Home</h6>
            <p class="custom_author">
              
              April 16, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/neighborhood-guide-for-first-time-fairfield-buyers" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/43dd6a00-7164-4847-a5cf-eaaaf2ac708e" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/43dd6a00-7164-4847-a5cf-eaaaf2ac708e 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/43dd6a00-7164-4847-a5cf-eaaaf2ac708e 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/43dd6a00-7164-4847-a5cf-eaaaf2ac708e 1408w" alt="Neighborhood Guide For First-Time Fairfield Buyers" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Neighborhood Guide For First-Time Fairfield Buyers</h6>
            <p class="custom_author">
              
              April 2, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/comparing-fairfield-westport-and-weston-real-estate" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/59542a1d-f172-45aa-81d0-13f0bf7b3d04" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/59542a1d-f172-45aa-81d0-13f0bf7b3d04 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/59542a1d-f172-45aa-81d0-13f0bf7b3d04 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/59542a1d-f172-45aa-81d0-13f0bf7b3d04 1408w" alt="Comparing Fairfield, Westport And Weston Real Estate" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Comparing Fairfield, Westport And Weston Real Estate</h6>
            <p class="custom_author">
              
              March 24, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/weston-school-campus-and-activities-guide-for-new-families" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/06a47820-1154-4f5d-9d4b-b9f0a3b55fa9" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/06a47820-1154-4f5d-9d4b-b9f0a3b55fa9 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/06a47820-1154-4f5d-9d4b-b9f0a3b55fa9 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/06a47820-1154-4f5d-9d4b-b9f0a3b55fa9 1408w" alt="Weston School Campus And Activities Guide For New Families" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Weston School Campus And Activities Guide For New Families</h6>
            <p class="custom_author">
              
              March 5, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/getting-a-westport-luxury-home-ready-for-spring-market" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/62b8d290-7e30-4266-ba92-b11433bbaa2e" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/62b8d290-7e30-4266-ba92-b11433bbaa2e 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/62b8d290-7e30-4266-ba92-b11433bbaa2e 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/62b8d290-7e30-4266-ba92-b11433bbaa2e 1408w" alt="Getting A Westport Luxury Home Ready For Spring Market" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Getting A Westport Luxury Home Ready For Spring Market</h6>
            <p class="custom_author">
              
              February 19, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/living-near-compo-beach-in-westport" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/06250fe4-5849-4a55-82e3-ae659d1161ee" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/06250fe4-5849-4a55-82e3-ae659d1161ee 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/06250fe4-5849-4a55-82e3-ae659d1161ee 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/06250fe4-5849-4a55-82e3-ae659d1161ee 1408w" alt="Living Near Compo Beach In Westport" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Living Near Compo Beach In Westport</h6>
            <p class="custom_author">
              
              February 5, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/why-nyc-movers-choose-weston" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/aa7c8a98-b5e2-4333-b2ea-d492b345d1d8" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/aa7c8a98-b5e2-4333-b2ea-d492b345d1d8 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/aa7c8a98-b5e2-4333-b2ea-d492b345d1d8 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/aa7c8a98-b5e2-4333-b2ea-d492b345d1d8 1408w" alt="Why NYC Movers Choose Weston" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Why NYC Movers Choose Weston</h6>
            <p class="custom_author">
              
              January 15, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/relocating-from-nyc-to-westport-a-practical-guide" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/2dc0a556-2f6b-4f38-bc85-ef127d85ebdc" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/2dc0a556-2f6b-4f38-bc85-ef127d85ebdc 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/2dc0a556-2f6b-4f38-bc85-ef127d85ebdc 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/2dc0a556-2f6b-4f38-bc85-ef127d85ebdc 1408w" alt="Relocating From NYC to Westport: A Practical Guide" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Relocating From NYC to Westport: A Practical Guide</h6>
            <p class="custom_author">
              
              January 1, 2026
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/relocating-to-fairfield-book-a-private-orientation-tour" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/f51092b8-fb56-4f91-8cea-549a790c6a1c" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/f51092b8-fb56-4f91-8cea-549a790c6a1c 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/f51092b8-fb56-4f91-8cea-549a790c6a1c 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/f51092b8-fb56-4f91-8cea-549a790c6a1c 1408w" alt="Relocating to Fairfield? Book a Private Orientation Tour" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Relocating to Fairfield? Book a Private Orientation Tour</h6>
            <p class="custom_author">
              
              December 18, 2025
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/nyc-commute-options-from-weston" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/8dabd224-649a-4d4a-80aa-55654b244c69" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/8dabd224-649a-4d4a-80aa-55654b244c69 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/8dabd224-649a-4d4a-80aa-55654b244c69 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/8dabd224-649a-4d4a-80aa-55654b244c69 1408w" alt="NYC Commute Options From Weston" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>NYC Commute Options From Weston</h6>
            <p class="custom_author">
              
              December 4, 2025
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/how-connecticut-closings-work-in-westport" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/c6846eb8-8b36-464b-a836-f36f66b385f4" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/c6846eb8-8b36-464b-a836-f36f66b385f4 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/c6846eb8-8b36-464b-a836-f36f66b385f4 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/c6846eb8-8b36-464b-a836-f36f66b385f4 1408w" alt="How Connecticut Closings Work In Westport" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>How Connecticut Closings Work In Westport</h6>
            <p class="custom_author">
              
              November 21, 2025
              
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/mandds-picks-top-10-most-romantic-restaurants-in-fairfield-county-1" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/vzin0uvp7wacc8gezblx" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/vzin0uvp7wacc8gezblx 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/vzin0uvp7wacc8gezblx 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/vzin0uvp7wacc8gezblx 1920w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=2560/https://media-production.lp-cdn.com/media/vzin0uvp7wacc8gezblx 2560w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/vzin0uvp7wacc8gezblx 3456w" alt="M&amp;D&#x27;s Picks:  Top 10 Most Romantic Restaurants in Fairfield County" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>M&amp;D&#x27;s Picks:  Top 10 Most Romantic Restaurants in Fairfield County</h6>
            <p class="custom_author">
              
              M &amp; D Team at Compass
              
              |
              
              October 30, 2025
              
            </p>
            <p class="feature">
              Don&#x27;t disappoint your sweetie this Valentine&#x27;s Day!  There&#x27;s still time to grab a reservation at one of Fairfield County&#x27;s most romantic spots to c...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/mandds-picks-top-10-burgers-in-fairfield-county" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/tqcfsfpy09qsoe12vx9t" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/tqcfsfpy09qsoe12vx9t 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/tqcfsfpy09qsoe12vx9t 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/tqcfsfpy09qsoe12vx9t 1920w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=2560/https://media-production.lp-cdn.com/media/tqcfsfpy09qsoe12vx9t 2560w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=3456/https://media-production.lp-cdn.com/media/tqcfsfpy09qsoe12vx9t 3456w" alt="M&amp;D&#x27;s Picks:  Top 10 Burgers in Fairfield County" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>M&amp;D&#x27;s Picks:  Top 10 Burgers in Fairfield County</h6>
            <p class="custom_author">
              
              M &amp; D Team at Compass
              
              |
              
              November 28, 2024
              
            </p>
            <p class="feature">
              When you need a burger - you NEED a Burger!  Trust us, we get it.  Having lived in Fairfield County for as long as we have, we know exactly where w...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/what-to-do-when-high-end-luxury-markets-shift" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ju2r7nhyjlisf0dweiklbiwm" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/ju2r7nhyjlisf0dweiklbiwm 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ju2r7nhyjlisf0dweiklbiwm 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/ju2r7nhyjlisf0dweiklbiwm 1920w" alt="What To Do When High-End Luxury Markets Shift" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>What To Do When High-End Luxury Markets Shift</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              In Fairfield County, and many other parts of the country, the high-end markets have slowed. Sellers who seek the highest price possible must accept...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/compass-ranked-1-by-real-trends" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/txpmymybvmylowk3q0b4gwbz" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/txpmymybvmylowk3q0b4gwbz 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/txpmymybvmylowk3q0b4gwbz 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/txpmymybvmylowk3q0b4gwbz 1920w" alt="COMPASS ranked #1 by Real Trends" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>COMPASS ranked #1 by Real Trends</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              Proud to announce that Real Trends ranks COMPASS as the #1 independent real estate brokerage and the #3 overall brokerage by sales volume in the Un...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/meet-us-at-the-station" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ppusnf9c4x4osa41fbuqn5ff" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/ppusnf9c4x4osa41fbuqn5ff 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ppusnf9c4x4osa41fbuqn5ff 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/ppusnf9c4x4osa41fbuqn5ff 1920w" alt="Meet Us At The Station!" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Meet Us At The Station!</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              Most people go to the train station to hop a train to a destination – but Westport’s Saugatuck station has become a destination unto itself!  A his...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/fun-fall-activities" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/gjtox1t66q9erndohe6rybcr" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/gjtox1t66q9erndohe6rybcr 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/gjtox1t66q9erndohe6rybcr 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/gjtox1t66q9erndohe6rybcr 1920w" alt="Fun Fall Activities" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Fun Fall Activities</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              We love Fall! It’s a time of new beginnings, crisp air, and lots of fun family time. If you’re looking for ideas on how to spend your upcoming Fall...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/back-to-school" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ukrv7g8wuk39fl1ks8284i1g" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/ukrv7g8wuk39fl1ks8284i1g 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ukrv7g8wuk39fl1ks8284i1g 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/ukrv7g8wuk39fl1ks8284i1g 1920w" alt="Back To School" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Back To School</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              Camp and vacation bags are unpacked, and the back to school ads are haunting you – this can only mean that it’s time to trade lazy summer mornings ...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/10-swoon-worthy-outdoor-spaces" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/pwijm2kedumczp4vqob0bvc0" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/pwijm2kedumczp4vqob0bvc0 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/pwijm2kedumczp4vqob0bvc0 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/pwijm2kedumczp4vqob0bvc0 1920w" alt="10 Swoon-Worthy Outdoor Spaces" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>10 Swoon-Worthy Outdoor Spaces</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              These long, lazy summer nights call for a cozy outdoor space to gather with family and friends. We’ve gathered ten gorgeous spaces to bring you ins...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/7-places-to-brunch-in-westport" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/zm85b9zl4106m5o5huni7jvp" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/zm85b9zl4106m5o5huni7jvp 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/zm85b9zl4106m5o5huni7jvp 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/zm85b9zl4106m5o5huni7jvp 1920w" alt="7 places to brunch in Westport" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>7 places to brunch in Westport</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              Previously Splash, Pearl at Longshore offers the best views for dining. The brunch menu at Pearl features so many enticing choices it will be hard ...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/one-step-ahead" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/u3wyxn84i0hmnizvj9kgtpba" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/u3wyxn84i0hmnizvj9kgtpba 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/u3wyxn84i0hmnizvj9kgtpba 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/u3wyxn84i0hmnizvj9kgtpba 1920w" alt="One Step Ahead" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>One Step Ahead</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              A stunning glass staircase can give any home a modern edge. We found 10 examples to give you some interior inspiration.
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/5-stunning-ways-to-bring-copper-into-your-kitchen" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ellnzcncu0ywt4cx9s9tbpd8" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/ellnzcncu0ywt4cx9s9tbpd8 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ellnzcncu0ywt4cx9s9tbpd8 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/ellnzcncu0ywt4cx9s9tbpd8 1920w" alt="5 stunning ways to bring copper into your kitchen" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>5 stunning ways to bring copper into your kitchen</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              5 stunning ways to bring copper into your kitchen. 1. Seating 2. Lighting..
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/staging-your-home-to-appeal-to-both-genders" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/hr8gtgmzuvx6sbfwgk312gr9" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/hr8gtgmzuvx6sbfwgk312gr9 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/hr8gtgmzuvx6sbfwgk312gr9 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/hr8gtgmzuvx6sbfwgk312gr9 1920w" alt="Staging Your Home To Appeal To Both Genders" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Staging Your Home To Appeal To Both Genders</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              Here are five quick tips from Patti Stern, PJ &amp; Company Staging and Interior Decorating to stage your home to appeal to both men’s and women’s tast...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/what-millennials-want-in-their-first-home" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/y12cpiz3mct1y9ll2aey3t8e" alt="What Millennials Want In Their First Home" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>What Millennials Want In Their First Home</h6>
            <p class="custom_author">
              
               M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              Curious what the next generation of home buyers is looking for? Millennial home buyers make up 68% of all first-time home buyers right now. About h...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/westport-weston-restaurant-week" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/p4phn76w8h0z7r9qivo9rgiv" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/p4phn76w8h0z7r9qivo9rgiv 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/p4phn76w8h0z7r9qivo9rgiv 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/p4phn76w8h0z7r9qivo9rgiv 1920w" alt="Westport-Weston Restaurant Week" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Westport-Weston Restaurant Week</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              Come and try a new fabulous eatery or visit one of your favorites. Each of the participating venues will be offering a Prix Fixe meal to entice you...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/westport-farmers-market-is-open" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/mcs77pconkjpwycyslrl9ute" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/mcs77pconkjpwycyslrl9ute 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/mcs77pconkjpwycyslrl9ute 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/mcs77pconkjpwycyslrl9ute 1920w" alt="Westport Farmers’ Market Is Open!" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Westport Farmers’ Market Is Open!</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              What’s on for the 2015 season? Plenty of old friends, along with some new faces. Look for integrated chef involvement, expanded children’s programm...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/7-tips-for-selling-in-the-winter-months" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/vb0m688c9dw90in60dqdk0xc" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/vb0m688c9dw90in60dqdk0xc 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/vb0m688c9dw90in60dqdk0xc 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/vb0m688c9dw90in60dqdk0xc 1920w" alt="7 Tips for Selling in the Winter Months" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>7 Tips for Selling in the Winter Months</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              From Huff Post Home: Prepping for an open house has its own to-do list, but there are some tips that are specific to wintertime showings. The weath...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/must-have-app-for-home-buyers" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/xifh605h0tofn0esqtuaxiws" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/xifh605h0tofn0esqtuaxiws 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/xifh605h0tofn0esqtuaxiws 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/xifh605h0tofn0esqtuaxiws 1920w" alt="Must Have App For Home Buyers" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Must Have App For Home Buyers</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              If you’re in need of floor plans of your home, RoomScan might provide the fastest and most accurate results. From ArchDaily: RoomScan is an app for...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/7-ways-to-add-a-little-wow-factor-to-your-home" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/avymxxbiedabrizvmfdxklf8" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/avymxxbiedabrizvmfdxklf8 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/avymxxbiedabrizvmfdxklf8 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/avymxxbiedabrizvmfdxklf8 1920w" alt="7 Ways To Add A Little Wow Factor To Your Home" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>7 Ways To Add A Little Wow Factor To Your Home</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              We found seven over the top ways to give your home a little extra personality. Believe it or not, we’ve already seen #7 here in Fairfield County.
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/why-now-is-the-best-time-to-get-a-mortgage" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/p2of64td7o78hdh20t1pd8oo" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/p2of64td7o78hdh20t1pd8oo 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/p2of64td7o78hdh20t1pd8oo 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/p2of64td7o78hdh20t1pd8oo 1920w" alt="Why Now Is The Best Time To Get A Mortgage" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Why Now Is The Best Time To Get A Mortgage</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              From Realtor Mag, January 16, 2015: Borrowing costs got even cheaper for home buyers and refinancers this week, as mortgage rates continued to desc...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/youth-fitness-at-the-westportweston-family-y" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/pxg31jse45axr6jo60lzncme" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/pxg31jse45axr6jo60lzncme 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/pxg31jse45axr6jo60lzncme 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/pxg31jse45axr6jo60lzncme 1920w" alt="Youth Fitness at the Westport/Weston Family Y" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Youth Fitness at the Westport/Weston Family Y</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              With the sunny days of summer behind us, it can be challenging to get the right amount of exercise. Did you know you can keep yourself and your kid...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/westport-library-acquires-humaniod-nao-evolution-robots" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/iid9dajky872rwml66pt8s41" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/iid9dajky872rwml66pt8s41 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/iid9dajky872rwml66pt8s41 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/iid9dajky872rwml66pt8s41 1920w" alt="Westport Library Acquires Humaniod “NAO Evolution” Robots" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Westport Library Acquires Humaniod “NAO Evolution” Robots</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              Two humanoid robots, Vincent and Nancy will soon be taking residence at the Westport Library. Standing around two feet high, these bots can walk, t...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/exciting-news" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/lj8hl8r268xqrbl4cplz6ud3" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/lj8hl8r268xqrbl4cplz6ud3 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/lj8hl8r268xqrbl4cplz6ud3 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/lj8hl8r268xqrbl4cplz6ud3 1920w" alt="Exciting News" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Exciting News</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 6, 2020
              
            </p>
            <p class="feature">
              The real estate team, M &amp; D Properties, Miriam Luck &amp; Dee Cohen, is listed in “America’s Best Real Estate Agents” by Real Trends in partnership wit...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/weston-school-district-among-top-ten-in-us" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/lvj4cgnyx1dh7offty41vi0o" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/lvj4cgnyx1dh7offty41vi0o 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/lvj4cgnyx1dh7offty41vi0o 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/lvj4cgnyx1dh7offty41vi0o 1920w" alt="Weston School District Among Top Ten In U.S." sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Weston School District Among Top Ten In U.S.</h6>
            <p class="custom_author">
              
              M &amp; D properties
              
              |
              
              February 5, 2020
              
            </p>
            <p class="feature">
              We are always touting the superior schools systems in Weston and Westport. After raising our children here we’ve experienced first hand how great t...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/westport-historical-society-holiday-house-tour" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/hg9cubxspve4mni4yxuznel4" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/hg9cubxspve4mni4yxuznel4 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/hg9cubxspve4mni4yxuznel4 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/hg9cubxspve4mni4yxuznel4 1920w" alt="Westport Historical Society Holiday House Tour" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Westport Historical Society Holiday House Tour</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 5, 2020
              
            </p>
            <p class="feature">
              Grab your tickets to see five stunning Westport homes decorated for the holidays. Three of years’ homes belong to designer Olga Adler, artist Kerri...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/slice-of-saugatuck-festival" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/w4ssjagssqwh6w7h9dxlvds1" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/w4ssjagssqwh6w7h9dxlvds1 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/w4ssjagssqwh6w7h9dxlvds1 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/w4ssjagssqwh6w7h9dxlvds1 1920w" alt="Slice of Saugatuck Festival" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Slice of Saugatuck Festival</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 5, 2020
              
            </p>
            <p class="feature">
              Over three dozen of Saugatuck’s finest restaurants, shops and galleries are opening their doors and inviting the community to come and sample their...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/where-to-dine-in-connecticut" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/b35nz00bs610juwtrlwjnyy6" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/b35nz00bs610juwtrlwjnyy6 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/b35nz00bs610juwtrlwjnyy6 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/b35nz00bs610juwtrlwjnyy6 1920w" alt="Where To Dine In Connecticut" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>Where To Dine In Connecticut</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 5, 2020
              
            </p>
            <p class="feature">
              Connecticut Magazine recently released its Best Restaurants in Connecticut 2016: Experts’ Picks. “Get ready to bite into the restaurants judged the...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
        <a href="/blog/these-are-a-few-of-our-favorite-things" class="blog-list__block">
          <figure>
              <img src="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ieuah83wyypqbta4v5gvw0e9" srcset="https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/ieuah83wyypqbta4v5gvw0e9 960w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/ieuah83wyypqbta4v5gvw0e9 1280w, https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/ieuah83wyypqbta4v5gvw0e9 1920w" alt="These Are A Few Of Our Favorite Things!" sizes="(max-width: 768px) 100vw, 33vw" loading="lazy">
          </figure>
          <div class="text_wrap">
            <h6>These Are A Few Of Our Favorite Things!</h6>
            <p class="custom_author">
              
              M &amp; D Properties
              
              |
              
              February 5, 2020
              
            </p>
            <p class="feature">
              Here are M&amp;D’s top ten reasons to love Westport and Weston: Living the Beach Life. ​​​​​​​It just might be our claim to fame! Sure, there are a lot...
            </p>
            <span class="link up-link hyperlink-style-1">read more</span>
          </div>
        </a>
      </div>
      <div class="pagination-container pagination-style-1"></div>    </div>
  </div>
</div>

</section>
<section  class="image-section is-font-color-light is-background-color-dark" id="section-afef24ca-36ca-4c7b-bcdc-d61d306fcded" data-el-id="72f0aad7-4781-42fc-a41a-3a08047ac222">
<div class="redesign contact-and-subscribe">
  <div class="container">

    <div class="solid-subsection work-with-us" style="color: #ffffff; background-color: rgba(0, 0, 0, 0.75);">
              <h2 class="lp-h3">WORK WITH US</h2>
              <p class="feature pre-line">M&amp;D Properties is consistently recognized for their top producing record. M&amp;D Properties’ standards of service and representation are unmatched, earning them top dollars in gross sales, year after year.
        
        </p>
                      <a
                          role="button"
                          data-type="CONTACT_US"
                          class="btn btn--primary-light button-style-2"
                          
                          
                          
                          
                          
                          >
                                  Contact Us
                          </a>
    </div>
    <div class="newsletter">
      <h2 class="lp-h3">NEWSLETTER</h2>
      <form data-type="contact-form">
        <div class="newsletter-form">
          <p class="feature">
            Subscribe to get our weekly newsletters.
          </p>
          <div class="custom-label-group">
             <div class="h-pot">
        <label for="section-afef24ca-36ca-4c7b-bcdc-d61d306fcded-middleName">Middle Name</label>
        <input id="section-afef24ca-36ca-4c7b-bcdc-d61d306fcded-middleName" name="middleName" value="" autocomplete="off" tabindex="-1">
      </div>
            <label for="section-afef24ca-36ca-4c7b-bcdc-d61d306fcded__wwu-email">Email:</label>
            <input id="section-afef24ca-36ca-4c7b-bcdc-d61d306fcded__wwu-email" name="email" type="email" class="text-input" required placeholder="Your email" pattern="[a-zA-Z0-9.!#$%&amp;’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+">
          </div>
          <input style="display: none;" type="text" name="source" value="NEWSLETTER_SIGNUP" />
          <div class="lp-disclaimer">  <label style='display: none;' for='section-afef24ca-36ca-4c7b-bcdc-d61d306fcded-termsAccepted'>Opt In/Disclaimer Consent:</label>
  <label class='lp-tcr-content'>
    <span class='lp-tcr-checkbox'>
      <input
        type='checkbox'
        id='section-afef24ca-36ca-4c7b-bcdc-d61d306fcded-termsAccepted'
        name='termsAccepted'
        oninvalid="this.setCustomValidity('Please accept the terms and conditions')"
        oninput="this.setCustomValidity('')"
        required
      /></span>
    <span class='lp-tcr-message'>
      
        I agree to be contacted by
        M &amp; D Properties
        via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance.
        You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary.
        <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>.
    </span>
  </label>

</div>
          <button type="submit" class="btn btn--primary-light button-style-2">Submit</button>
        </div>
        <p class="success hide">
          Success!
        </p>
      </form>
      
    </div>
  </div>
</div>
</section>
<section id="section-c6c0dcb3-d535-41d1-bef6-549dd0e96317"  class="solid-section is-font-color-dark is-background-color-light" data-el-id="c463fb0b-e53e-431b-94f8-8faeda327bdc">
  <script type="text/x-handlebars-template" class="jsIGTemplate">
    {{#each items}}
      <a href="{{permalink}}" target="_blank" class="item ig-feed-item insta-type-{{mediaType}}">
      <div class="ig-feed-item__img" style="background-image: url('{{#ifEquals mediaType 'VIDEO'}}{{thumbnailUrl}}{{else}}{{mediaUrl}}{{/ifEquals}}');">
      {{#ifEquals mediaType 'VIDEO'}}
        <div class="media-type-icon">
          <svg width="20px" height="20px" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" d="M19.369 6.042H2.082A2.086 2.086 0 000 8.125v13.71a2.086 2.086 0 002.083 2.083h17.285a2.086 2.086 0 002.084-2.083V8.125a2.086 2.086 0 00-2.084-2.083zM22.84 17.833l7.16 3.91V8.262l-7.16 3.908v5.662z"/></svg>
        </div>
      {{/ifEquals}}
      {{#if caption}}
      <div class="ig-feed-item__info"><div class="ig-feed-item__caption">{{caption}}</div></div>
      {{/if}}
      </div>
    </a> 
    {{/each}}
</script>


<div class="redesign ig-feed">
  <div class="feed-top">
    <h2 class="title lp-h3">Follow Us on Instagram</h2>
  </div>
  <div class="main-part">
    <div class="caption-tile item">
      <a class="caption-content jsIGLink">
        <i class="lp-i lp-i--instagram icon"></i>
        <h6 class="caption-tile-title">Follow Us on Instagram</h6>
      </a>
    </div>
    <div class="items-container jsIGContainer" data-arrows-style=""></div>
  </div>
</div>
</section>

        <div id="modals" class="modals"></div>
        <footer id="global-footer" class="is-font-color-light is-background-color-dark" data-el-id="8402b156-d4e9-4fc1-bf08-7346788facdb">
            <div class="classic-footer-component redesign">
    <div class="logo row"></div>
    <div class="basic-info row">
        <div class="title column align-center">
              <h6>M&amp;D TEAM AT COMPASS</h6>
              <p class="feature pre-line">It is a partnership based on long-standing friendships that are founded on trust, hard work, and dedication.</p>
        </div>
        <div class="map column">
            <h6>Location</h6>
            <div class="map-container"
                 data-lat="41.1421845"
                 data-lng="-73.3647257"
                 data-zoom="14"
            >

            </div>
            <a class="feature" target="_blank" href="https://www.google.com/maps/search/?api=1&query=54 Wilton Rd, Westport, CT 06880, USA">Get Directions</a>
        </div>
        <div class="contacts column align-center feature pre-line">
              <h6 class="title">Contact Us</h6>

              <p>                <p>Team Email:</p>
<p><a href="/cdn-cgi/l/email-protection#ef828e818b8b9f9d809f8a9d9b868a9caf8c80829f8e9c9cc18c8082" target="_blank" rel="noopener" data-cke-saved-href="mailto:manddproperties@compass.com"><span class="__cf_email__" data-cfemail="563b373832322233373b1635393b263725257835393b">[email&#160;protected]</span></a></p>
<p><a href="https://q6b6u3i3.stackpathcdn.com/disclaimer" data-cke-saved-href="/disclaimer">Disclaimer</a></p>
<p>54 Wilton Rd, Westport, CT 06880, USA</p>
<p>&nbsp;</p>
<p>Dee Cohen: (<a class="mobile-link" href="tel:+1-203-856-2336" aria-label="Call Mobile: 203-856-2336" data-tn="profile-phone" data-ol-has-click-handler="">203) 856-2336</a></p>
<p>Miriam Luck: (<a class="mobile-link" href="tel:+1-203-858-8568" aria-label="Call Mobile: 203-858-8568" data-tn="profile-phone" data-ol-has-click-handler="">203) 858-8568</a></p>
<p>Ryan Milliken: (<a class="mobile-link" href="tel:+1-917-576-2166" aria-label="Call Mobile: 917-576-2166" data-tn="profile-phone" data-ol-has-click-handler="">917) 576-2166</a></p>
<p>Alexis Brand: (<a class="mobile-link" href="tel:+1-917-887-7563" aria-label="Call Mobile: 917-887-7563" data-tn="profile-phone" data-ol-has-click-handler="">917) 887-7563</a></p>
<p>Meredith Kamo: <a class="mobile-link" href="tel:+1-917-817-4253" aria-label="Call Mobile: 917-817-4253" data-tn="profile-phone" data-ol-has-click-handler="">(917) 817-4253</a></p></p>
        </div>
    </div>
    <div class="copyrights row">
        <div class="copyright align-left column heading">
            COPYRIGHT © <span class="auto-year-update">2026</span> | <a href="/terms-and-conditions" class="link link--white">Policy</a>
        </div>
        <div class="copyright-info feature column align-center">
              <img src="https://media-production.lp-cdn.com/media/7ccb996f-8457-49bd-9a38-56a31eefbc3e" alt="M&amp;D TEAM AT COMPASS" class="copyright-logo">
            <div class="info">
              <div class="disclaimer-wrap">
                  <p><div></div><style>* { box-sizing: border-box; } body {margin: 0;}ul{list-style:inherit;}</style></p>
              </div>
              <br>
              <span class="by">Website designed and developed by <a href="https://www.luxurypresence.com/" target="_blank" class="link link--white">Luxury Presence</a>.</span>
            </div>
            <ul class="lp-socials social_icons-style-2 socials">
            
                    <li>
                      <a
                        href="https://www.facebook.com/manddproperties"
                        class="lp-socials__link socials__link"
                        data-wow-delay="0s"
                        target="_blank"
                        aria-label="FACEBOOK"
                      >
                          <span class="lp-i lp-i--facebook" aria-hidden="true"></span>
                      </a>
                    </li>
                    <li>
                      <a
                        href="https://www.instagram.com/weknowwestportrealestate/"
                        class="lp-socials__link socials__link"
                        data-wow-delay="0.1s"
                        target="_blank"
                        aria-label="INSTAGRAM"
                      >
                          <span class="lp-i lp-i--instagram" aria-hidden="true"></span>
                      </a>
                    </li>
              </ul>        </div>
        <div class="copyright-name heading column">
          M&amp;D TEAM AT COMPASS
        </div>
    </div>
</div>

        </footer>

        <div id="modal-global-contact-us" class="modal "
            data-el-id=""
            style="background-color: ;"
            >
            <div class="modal-content">
                <div class="redesign">
          <div class="contact-form">
            <button class="js-contact-form-close close contact-form-close"></button>
            <h6 class="contact-form-subheadline test-class">
              M&amp;D TEAM AT COMPASS
            </h6> 
            <h2 class="h1 contact-form__heading">Contact</h2>
            <div class="contact-form-container">
              <div class="contact-form-container-form">
                <h4>Agent Inquiry</h4>
                <form data-type="contact-form" class="contact-form_cls">
                  <div class="custom-label-group custom-label-input">
                    <label for="contactFullName">Full name:</label>
                    <input id="contactFullName" name="name" type="text" value="" class="text-input" required placeholder="Name">
                  </div>
                  <div class="h-pot">
                    <label for="-middleName">Middle Name</label>
                    <input id="-middleName" name="middleName" value="" autocomplete="off" tabindex="-1">
                  </div>
                  <div class="custom-label-group custom-label-input">
                    <label for="contactEmail">Email:</label>
                    <input id="contactEmail" name="email" type="email" value="" class="text-input" required placeholder="Email">
                  </div>
                  <div class="custom-label-group custom-label-input">
                    <label for="contactEmail">Phone:</label>
                    <input id="contactEmail" name="phone" type="tel" value="" class="text-input" required placeholder="Phone">
                  </div>
                  <div class="custom-label-group custom-select">
                    <label for="contact-interests">Your Interest:</label>
                    <select class="text-input" name="interest" value="" required id="contact-interests">
                      <option value="Select an interest" disabled selected>Select an interest</option>
                      <option value="buying">buying</option>
                      <option value="selling">selling</option>
                      <option value="media">media</option>
                      <option value="area information">area information</option>
                      <option value="home valuation">home valuation</option>
                      <option value="other">other</option>
                    </select>
                  </div>
                  <div class="custom-label-group custom-label-textarea">
                    <label for="contact-comment">Comment:</label>
                    <textarea name="message" id="contact-comment" cols="30" rows="10" value="" placeholder="Message" required></textarea>
                  </div>
                  <div class="lp-disclaimer">  <label style='display: none;' for='-termsAccepted'>Opt In/Disclaimer Consent:</label>
          <label class='lp-tcr-content'>
            <span class='lp-tcr-checkbox'>
              <input
                type='checkbox'
                id='-termsAccepted'
                name='termsAccepted'
                oninvalid="this.setCustomValidity('Please accept the terms and conditions')"
                oninput="this.setCustomValidity('')"
                required
              /></span>
            <span class='lp-tcr-message'>
              
                I agree to be contacted by
                M &amp; D Properties
                via call, email, and text for real estate services. To opt out, you can reply 'stop' at any time or reply 'help' for assistance.
                You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary.
                <a href='/terms-and-conditions' target='_blank'>Privacy Policy</a>.
            </span>
          </label>
        
        </div>
                  <div class="custom-button">
                    <input style="display: none;" type="text" name="source" value="CONTACT_INQUIRY" />
                    <input type="submit" value="SUBMIT" class="btn btn--primary-light button-style-2" />
                    <p class="success hide">
                      Success!
                    </p>
                  </div>
                </form>
                <a href="/about" target="_blank" class="h-pot redirect-link">link</a>
              </div>
              <div class="contact-form-container-info">
                <h4>Contact Details</h4>
                <div class="contact-form-contact-details"><p><br /><a id="contact-modal-email" href="/cdn-cgi/l/email-protection#402d212e24243425212d00232f2d302133336e232f2d"><span class="__cf_email__" data-cfemail="6409050a00001001050924070b09140517174a070b09">[email&#160;protected]</span></a><br />54 Wilton Road, Westport, CT 06880<br /><br /></p>
        <p>Agent Details:</p>
        <p>Dee Cohen: (<a class="mobile-link" href="tel:+1-203-856-2336" aria-label="Call Mobile: 203-856-2336" data-tn="profile-phone" data-ol-has-click-handler="">203) 856-2336</a></p>
        <p><a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7e1a1b1b501d11161b103e1d11130e1f0d0d501d1113">[email&#160;protected]</a></p>
        <p>&nbsp;</p>
        <p>Miriam Luck: (<a class="mobile-link" href="tel:+1-203-858-8568" aria-label="Call Mobile: 203-858-8568" data-tn="profile-phone" data-ol-has-click-handler="">203) 858-8568</a></p>
        <p><a class="profileCard-email" href="/cdn-cgi/l/email-protection#ee83879c878f83c0829b8d85ae8d81839e8f9d9dc08d8183" data-tn="profile-email" data-ol-has-click-handler=""><span class="__cf_email__" data-cfemail="0b666279626a6625677e68604b6864667b6a787825686466">[email&#160;protected]</span></a></p>
        <p>&nbsp;</p>
        <p>Meredith Kamo: <a class="mobile-link" href="tel:+1-917-817-4253" aria-label="Call Mobile: 917-817-4253" data-tn="profile-phone" data-ol-has-click-handler="">(917) 817-4253</a></p>
        <p><a class="profileCard-email" href="/cdn-cgi/l/email-protection#224f475047464b564a0c49434f4d62414d4f524351510c414d4f" data-tn="profile-email" data-ol-has-click-handler=""><span class="__cf_email__" data-cfemail="2c41495e494845584402474d41436c4f43415c4d5f5f024f4341">[email&#160;protected]</span></a></p>
        <p>&nbsp;</p>
        <p>Ryan Milliken: (<a class="mobile-link" href="tel:+1-917-576-2166" aria-label="Call Mobile: 917-576-2166" data-tn="profile-phone" data-ol-has-click-handler="">917) 576-2166</a></p>
        <p><a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f5878c949bdb989c99999c9e909bb5969a9885948686db969a98">[email&#160;protected]</a></p>
        <p>&nbsp;</p>
        <p>Alexis Brand: (<a class="mobile-link" href="tel:+1-917-887-7563" aria-label="Call Mobile: 917-887-7563" data-tn="profile-phone" data-ol-has-click-handler="">917) 887-7563</a></p>
        <p><a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fd9c919885948ed39f8f9c9399bd9e92908d9c8e8ed39e9290">[email&#160;protected]</a></p>
        <p>&nbsp;</p>
        <p>&nbsp;</p></div>
        
                <div class="contact-form__socials-block">
                  <ul class="lp-socials social_icons-style-2 socials white-socials">
                  
                          <li>
                            <a
                              href="https://www.facebook.com/manddproperties/"
                              class="lp-socials__link wow fadeInUp socials__link"
                              data-wow-delay="0s"
                              target="_blank"
                              aria-label="FACEBOOK"
                            >
                                <span class="lp-i lp-i--facebook" aria-hidden="true"></span>
                            </a>
                          </li>
                          <li>
                            <a
                              href="https://www.instagram.com/weknowwestportrealestate/"
                              class="lp-socials__link wow fadeInUp socials__link"
                              data-wow-delay="0.1s"
                              target="_blank"
                              aria-label="INSTAGRAM"
                            >
                                <span class="lp-i lp-i--instagram" aria-hidden="true"></span>
                            </a>
                          </li>
                    </ul>        </div>
              </div>
            </div>
          </div>
        </div>
            </div>
            <button class="close lp-close" type="button" aria-label="close modal">
                <span class="lp-close-icon" aria-hidden="true"></span>
            </button>
        </div>
        <div id="qualifying-questions-modal" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="qualifying-questions-modal-title" aria-hidden="true" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.7); z-index: 1050; display: none; align-items: center; justify-content: center;">
          <style>
            #qualifying-questions-modal .custom-select-toggle {
              border: 1px solid #848484;
              border-radius: 8px;
              padding: 12px 16px;
            }
        
            #qualifying-questions-modal .custom-select-toggle.is-placeholder {
              color: #848484;
            }
        
            #qualifying-questions-modal #qualifying-questions-modal-phoneNumber::placeholder {
              color: #848484;
              opacity: 1;
            }
        
            #qualifying-questions-modal .disclaimer-more {
              display: none;
            }
        
            #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-more {
              display: inline;
            }
        
            #qualifying-questions-modal #qualifying-questions-modal-disclaimer-text:not(.collapsed) .disclaimer-ellipsis {
              display: none;
            }
          </style>
          <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script>
            function toggleDisclaimerQualifyingQuestionsModal() {
              const disclaimerText = document.getElementById('qualifying-questions-modal-disclaimer-text');
              const toggleButton = document.getElementById('qualifying-questions-modal-toggle-disclaimer');
        
              if (disclaimerText.classList.contains('collapsed')) {
                disclaimerText.classList.remove('collapsed');
                toggleButton.textContent = 'Read less';
                toggleButton.setAttribute('aria-expanded', 'true');
              } else {
                disclaimerText.classList.add('collapsed');
                toggleButton.textContent = 'Read more';
                toggleButton.setAttribute('aria-expanded', 'false');
              }
            }
          </script>
          <div style="max-width: 400px; width: 95%; margin: 0 auto;">
            <div style="background: #fff; border: none; border-radius: 16px; color: black; box-shadow: none; position: relative;">
              <button type="button" data-dismiss="modal" aria-label="Close" style="position: absolute; right: 20px; top: 10px; font-size: 28px; font-weight: 300; color: black; opacity: 1; background: none; border: none; padding: 0; width: auto; height: auto; cursor: pointer; z-index: 10;">
                <span aria-hidden="true">&times;</span>
              </button>
              <div style="padding: 40px 30px 32px;">
                <div style="text-align: left; margin-bottom: 32px;">
                  <h2 id="qualifying-questions-modal-title" style="margin: 0; color: #333; font-size: 18px; line-height: 1.4; text-transform: uppercase; letter-spacing: 0.5px; font-weight: normal;">
                    Thanks, please provide more information to help serve you
                  </h2>
                </div>
                <form id="qualifying-questions-modal-form" data-type="contact-form">
                  <input type="hidden" name="source" value="PROFILE_UPDATE" />
                  <input type="hidden" name="email" value="" id="qualifying-questions-modal-email" />
                  <input type="hidden" name="triggerSource" id="qualifying-questions-modal-triggerSource" value="" />
                  <label for="qualifying-questions-modal-email" style="display:none;">
                    Email
                  </label>
                  <label for="qualifying-questions-modal-triggerSource" style="display:none;">
                    Trigger Source
                  </label>
        
                  <div style="margin-bottom: 20px;">
                    <label for="qualifying-questions-modal-phoneNumber" style="display:none;">
                      Phone Number
                    </label>
                    <input
                      type="tel"
                      id="qualifying-questions-modal-phoneNumber"
                      name="phoneNumber"
                      style="padding: 12px 16px; font-size: 16px; border: 1px solid #848484; border-radius: 8px; background: transparent; color: black; width: 100%; box-sizing: border-box; outline: none;"
                      pattern="^\+?1?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}$"
                      required
                      placeholder="Phone"
                      aria-label="Phone Number"
                      inputmode="tel"
                      autocomplete="tel"
                      onfocus="this.style.borderColor='black';"
                      onblur="this.style.borderColor='#848484';"
                    />
                  </div>
        
                  <div style="margin-bottom: 20px;">
                    <label for="qualifying-questions-modal-interest" style="display:none;">
                      Interest
                    </label>
                    <select
                      id="qualifying-questions-modal-interest"
                      name="interest"
                      required
                      data-label="Interest"
                      aria-label="Interest"
                      style="padding: 12px 16px; font-size: 16px; border: 1px solid #848484; border-radius: 8px; background: #fff; color: #848484; width: 100%; box-sizing: border-box; outline: none; appearance: none; -webkit-appearance: none; -moz-appearance: none; background-image: url('data:image/svg+xml;charset=utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 16 16%22%3E%3Cpath fill=%22%23666%22 d=%22M4.427 7.427l3.396 3.396a.25.25 0 00.354 0l3.396-3.396A.25.25 0 0011.396 7H4.604a.25.25 0 00-.177.427z%22/%3E%3C/svg%3E'); background-repeat: no-repeat; background-position: right 16px center; background-size: 16px;"
                      onfocus="this.style.borderColor='black'; this.style.color='black';"
                      onblur="this.style.borderColor='#848484'; if(this.value === '') this.style.color='#848484'; else this.style.color='black';"
                    >
                      <option value="" style="background: #fff; color: #848484;" disabled selected>Interested in...</option>
                      <option value="Selling & Buying" style="background: #fff; color: black;">Selling & Buying</option>
                      <option value="Selling" style="background: #fff; color: black;">Selling</option>
                      <option value="Buying" style="background: #fff; color: black;">Buying</option>
                      <option value="Renting" style="background: #fff; color: black;">Renting</option>
                      <option value="Other" style="background: #fff; color: black;">Other</option>
                    </select>
                  </div>
        
                  <div style="margin-bottom: 32px; font-size: 12px; line-height: 1.2;">
                    <label style='display: none;' for='qualifying-questions-modal-qualifying-questions-termsAccepted'>Opt In/Disclaimer Consent:</label>
                    <label class='lp-tcr-content'>
                      <span class='lp-tcr-checkbox'>
                        <input
                          type='checkbox'
                          id='qualifying-questions-modal-qualifying-questions-termsAccepted'
                          name='termsAccepted'
                          aria-describedby='qualifying-questions-modal-disclaimer-text'
                          oninvalid="this.setCustomValidity('Please accept the terms and conditions')"
                          oninput="this.setCustomValidity('')"
                          required
                        /></span>
                      <span class='lp-tcr-message'>
                        <div id="qualifying-questions-modal-disclaimer-text" class="collapsed" style="color: #848484;">
                          
                            I agree to be contacted by
                            <strong>M &amp; D Properties</strong>
                            via call, email, and text <span class="disclaimer-more">for real estate services. 
                            To opt out, you can reply 'stop' at any time or reply 'help' for assistance. 
                            You can also click the unsubscribe link in the emails. 
                            Message and data rates may apply. Message frequency may vary.</span>
                            <span class="disclaimer-ellipsis">...</span>
                            <a href='/terms-and-conditions' target='_blank' rel='noopener noreferrer' style='text-decoration: underline;'>Privacy Policy</a>.
                        </div>
                        <button
                          id="qualifying-questions-modal-toggle-disclaimer"
                          type="button"
                          style="background: none; border: none; color: #848484; font-size: inherit; font-weight: bold; padding: 0; margin-top: 4px; cursor: pointer;"
                          aria-expanded="false"
                          onclick="toggleDisclaimerQualifyingQuestionsModal()"
                        >
                          Read more
                        </button>
                      </span>
                    </label>
                  </div>
        
                  <div>
                    <button
                      type="submit"
                      style="padding: 12px 24px; font-size: 16px; font-weight: normal; border-radius: 8px; border: 1px solid black; background: black; color: white; width: 100%; cursor: pointer; transition: all 0.2s ease; text-transform: uppercase; letter-spacing: 0.5px;"
                      onmouseover="this.style.background='transparent'; this.style.color='black';"
                      onmouseout="this.style.background='black'; this.style.color='white';"
                    >
                      Submit
                    </button>
                  </div>
                </form>
              </div>
            </div>
          </div>
        </div>

    <script>
        (function() {
        var lazyVideos = [].slice.call(document.querySelectorAll("video.lazy"));

        if ("IntersectionObserver" in window && lazyVideos.length > 0) {
            var lazyVideoObserver = new IntersectionObserver(function(entries, observer) {
            entries.forEach(function(video) {
                if (video.isIntersecting) {
                for (var source in video.target.children) {
                    var videoSource = video.target.children[source];
                    if (typeof videoSource.tagName === "string" && videoSource.tagName === "SOURCE") {
                    videoSource.src = videoSource.dataset.src;
                    }
                }

                video.target.load();
                video.target.classList.remove("lazy");
                lazyVideoObserver.unobserve(video.target);
                }
            });
            });

            lazyVideos.forEach(function(lazyVideo) {
                lazyVideoObserver.observe(lazyVideo);
            });
        }
        })();
    </script>

        <!-- Global site tag (gtag.js) - Google Analytics -->
        <script defer src="https://www.googletagmanager.com/gtag/js"></script>

            <!-- Google Tag Manager -->
            <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
                new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
                j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.async=false;j.src=
                'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
            })(window,document,'script','dataLayer','GTM-MKNZMCK');</script>
            <!-- End Google Tag Manager -->
            <!-- Google Tag Manager -->
            <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
                new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
                j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.defer=true;j.async=false;j.src=
                'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
            })(window,document,'script','dataLayer','GTM-T9SFQGHZ');</script>
            <!-- End Google Tag Manager -->


        <!-- LP Tracker (divolte.js) - LP Divolte -->
            <script>window.divolteLp=window.divolteLp||function(){(divolteLp.q=divolteLp.q||[]).push(arguments)}</script>
        <!-- LP Tracker (eventBus) - LP EventBus -->
            <script>window.eventBusLp=window.eventBusLp||function(){(eventBusLp.q=eventBusLp.q||[]).push(arguments)}</script>

    <script>
        window.dataLayer = window.dataLayer || [];
        document.sendGoogleTagManagerEvent = function() {
            /* Honor GPC-enabled browsers and prevent GTM event if GPC is enabled. More details: https://global-privacy-control.glitch.me/ */
            if (window.navigator.globalPrivacyControl) {
                return;
            }

            dataLayer.push(arguments);
        }

        document.sendGoogleTagManagerEvent('js', new Date());
            document.sendGoogleTagManagerEvent('config', 'UA-157828353-1', { page: location.pathname, location: location.href });
            document.sendGoogleTagManagerEvent('config', 'G-9GHP7RBY43', { page: location.pathname, location: location.href });
        document.sendGoogleAnalyticsEvent = function(googleEvent) {
            document.sendGoogleTagManagerEvent('event', googleEvent.eventAction || googleEvent.hitType, {
                event_category: googleEvent.eventCategory,
                event_label: googleEvent.eventLabel,
                value: googleEvent.eventValue,
                page: googleEvent.page,
                location: googleEvent.location
            })
        };

        document.addEventListener("DOMContentLoaded", function() {
            (function() {
                //If the page has an element with ID of auto-year-update the element will be populated with the current year.
                var date = new Date();
                var elements = document.getElementsByClassName('auto-year-update');
                var i;
                for (i = 0; i < elements.length; i++) {
                    elements[i].innerText = date.getFullYear();
                }
            })();
            if (window.divolteLp) {
                window.divolteLp('sendLpPageView', {});
            }
            if (window.eventBusLp) {
                window.eventBusLp('sendLpPageView', {});
            }
        });
    </script>


    <script>
    // Function to dynamically load a script
    function loadScript(url, callback) {
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = url;
        script.defer = true;
        script.async = true;
        script.onload = callback;
        document.head.appendChild(script);
    }

    // Function to dynamically load CSS file
    function loadCSS(url) {
        var link = document.createElement("link");
        link.rel = "stylesheet";
        link.href = url;
        document.head.appendChild(link);
    }

    // Global methods / variables that can be accessed by element js
    window.luxuryPresence = {
        libs: {
            loadJs: loadScript,
            loadCss: loadCSS,
            jsLibsMap: {
                paroller: {
                    jsSrc: 'https://d1e1jt2fj4r8r.cloudfront.net/javascript/jquery.paroller.min.js',
                    isLoaded: false,
                },
                ionRangeSlider: {
                    jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/js/ion.rangeSlider.min.js',
                    cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/css/ion.rangeSlider.min.css',
                    isLoaded: false,
                    requires: ['jquery'],
                },
                splide: {
                    jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/js/splide.min.js',
                    cssSrc: 'https://cdnjs.cloudflare.com/ajax/libs/splidejs/4.1.4/css/splide-core.min.css',
                    isLoaded: false,
                },
                wow: {
                    jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js',
                    isLoaded: false,
                },
                jquery: {
                    jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js',
                    isLoaded: false,
                },
                slick: {
                    jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js',
                    isLoaded: false,
                    requires: ['jquery'],
                },
                libphonenumber: {
                    jsSrc: 'https://cdnjs.cloudflare.com/ajax/libs/libphonenumber-js/1.11.8/libphonenumber-js.min.js',
                    isLoaded: false,
                },
            },
        },
    };
    </script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer" onload="window.luxuryPresence.libs.jsLibsMap.jquery.isLoaded = true"></script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.8/handlebars.min.js"></script>
    <script defer src="https://cdn.jsdelivr.net/npm/handlebars-intl@1.1.2/dist/handlebars-intl.min.js"></script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/superagent/4.1.0/superagent.min.js"></script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js" onload="window.luxuryPresence.libs.jsLibsMap.slick.isLoaded = true"></script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js" onload="window.luxuryPresence.libs.jsLibsMap.wow.isLoaded = true"></script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/js/ion.rangeSlider.min.js" onload="window.luxuryPresence.libs.jsLibsMap.ionRangeSlider.isLoaded = true"></script>

    <!-- GOOGLE TRANSLATE SCRIPT -->
    <script>
        function googleTranslateElementInit() {
            // list of languages can be overridden by setting window.customLanguages in the head JS. example `window.customLanguages = 'en,de,fr,ro,sk,pl'`
            // Language codes can be taken from here https://cloud.google.com/translate/docs/languages
            const DEFAULT_LANGUAGES = 'en,es,zh-CN,zh-TW,tl,vi,ar,ko,ru,de,fr,hi,pt';
            document.querySelectorAll('[data-type="TRANSLATE"]').forEach(function(translate){
                translate.innerText = '';
                new google.translate.TranslateElement({
                    pageLanguage: 'en',
                    layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
                    includedLanguages: window.customLanguages || DEFAULT_LANGUAGES,
                }, translate);
            });
        }
    </script>
    <script defer src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
            <script defer src="https://accounts.google.com/gsi/intermediate"></script>

    <!-- GOOGLE TRANSLATE SCRIPT END-->
    <script>

        // UI helpers
        (function () {

            function getSideMenu () {
                return document.querySelector('body > div.sidemenu');
            }

            function sideMenuHide (instant) {
                var sideMenu = getSideMenu();
                if (!sideMenu || !sideMenu.classList.contains('visible')) {
                  return;
                }
                sideMenu.classList.remove('visible');
                sideMenu.dispatchEvent(new CustomEvent('lpui-hide', { detail: { instant: !!instant } }));
                window.dispatchEvent(new CustomEvent('lpui-sidemenu-hide', { detail: {instant: !!instant} }));
            }

            function sideMenuShow () {
                var sideMenu = getSideMenu();
                if (!sideMenu || sideMenu.classList.contains('visible')) {
                  return;
                }
                sideMenu.classList.add('visible');
                sideMenu.dispatchEvent(new Event('lpui-show'));
                window.dispatchEvent(new Event('lpui-sidemenu-show'));
            }

            function sideMenuToggle () {
                var sideMenu = getSideMenu();
                if (!sideMenu) {
                  return;
                }
                var isSideMenuVisible = sideMenu.classList.contains('visible');
                if (isSideMenuVisible) {
                    sideMenuHide();
                } else {
                    sideMenuShow();
                }
            }

            var scrollLockRequests = {};
            window.__debug_scrollLockRequests = scrollLockRequests;
            var hideScrollStyles = ''+
                    'body {'+
                    'overflow: hidden;' +
                    '}';
            var hideScrollId = 'hide-body-scroll-style';

            function scrollLock () {
                var style = document.createElement('style');
                style.id = hideScrollId;
                style.textContent = hideScrollStyles;
                document.head.appendChild(style);
                window.dispatchEvent(new Event('lpui-scroll-locked'));
            }

            function scrollUnlock () {
                document.getElementById(hideScrollId)?.remove();
                window.dispatchEvent(new Event('lpui-scroll-unlocked'));
            }

            function requestScrollLock (lockId) {
                var wasLocked = Object.keys(scrollLockRequests).length > 0;
                scrollLockRequests[lockId || '__anonymous_lock'] = true;
                if (!wasLocked) {
                    scrollLock();
                }
            }

            function releaseScrollLock (lockId) {
                if (lockId) {
                    delete scrollLockRequests[lockId];
                    if (!Object.keys(scrollLockRequests).length) {
                        scrollUnlock();
                    }
                } else {
                    scrollLockRequests = {};
                    window.__debug_scrollLockRequests = scrollLockRequests;
                    scrollUnlock();
                }
            }

            function showModal (modalId, options) {
                var modal = document.getElementById(modalId);
                if (!modal) {
                    return;
                }

                if (!modal.classList.contains('visible')) {
                    modal.classList.add('visible');
                    if (options && options.scrollLock) {
                        window.lpUI.requestScrollLock(modalId);
                    }
                    modal.dispatchEvent(new Event('lpui-show'));
                    window.dispatchEvent(new CustomEvent('lpui-modal-show', { detail: { id: modalId } }));
                }

                const visibleModals = document.querySelectorAll('.modal.visible');

                if (visibleModals.length > 1) {

                    const maxZIndex = Array.from(visibleModals).reduce((maxZIndex, modal) => {
                        const zIndex = window.getComputedStyle(modal).zIndex;
                        const parsedZIndex = zIndex !== 'auto' ? parseInt(zIndex) : 0;
                        return Math.max(maxZIndex, parsedZIndex);
                    }, 0);

                    modal.style.zIndex = maxZIndex + 1;
                }

            }

            function _hideModal (modalEl) {
                if (!modalEl) {
                    return;
                }
                if (!modalEl.classList.contains('visible')) {
                    return;
                }
                modalEl.classList.remove('visible');
                modalEl.style.zIndex = '';
                modalEl.dispatchEvent(new Event('lpui-hide'));
                var modalId = modalEl.getAttribute('id');
                if (modalId) {
                    window.lpUI.releaseScrollLock(modalId);
                    window.dispatchEvent(new CustomEvent('lpui-modal-hide', { detail: { id: modalId } }));
                }
            }

            function hideModal (modalId) {
                _hideModal(document.getElementById(modalId));
            }

            function hideClosestModal (el) {
              const modal = el?.closest('.modal');
              if (!modal) {
                return;
              }
              if (modal.classList) {
                _hideModal(modal);
                return;
              }
              if (modal.length && modal[0].classList) {
                _hideModal(modal[0]);
              }
            }

            window.lpUI = {
                sideMenuHide: sideMenuHide,
                sideMenuShow: sideMenuShow,
                sideMenuToggle: sideMenuToggle,
                requestScrollLock: requestScrollLock,
                releaseScrollLock: releaseScrollLock,
                showModal: showModal,
                hideModal: hideModal,
                hideClosestModal: hideClosestModal
            }
        })();

        var stringifyPrimitive = function(v) {
            switch (typeof v) {
                case 'string':
                    return v;

                case 'boolean':
                    return v ? 'true' : 'false';

                case 'number':
                    return isFinite(v) ? v : '';

                default:
                    return '';
            }
        };

        function objectToQuerystring(obj, sep, eq, name) {
            // https://github.com/Gozala/querystring/blob/master/encode.js
            sep = sep || '&';
            eq = eq || '=';
            if (obj === null) {
                obj = undefined;
            }

            if (typeof obj === 'object') {
                return Object.keys(obj).map(function(k) {
                    var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
                    if (Array.isArray(obj[k])) {
                        return obj[k].map(function(v) {
                            return ks + encodeURIComponent(stringifyPrimitive(v));
                        }).join(sep);
                    } else {
                        return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
                    }
                }).filter(Boolean).join(sep);

            }

            if (!name) return '';
            return encodeURIComponent(stringifyPrimitive(name)) + eq +
                    encodeURIComponent(stringifyPrimitive(obj));
        }

        function getPath(url, options) {
            var parser = document.createElement('a');
            parser.href = url || '';
            var path = parser.pathname || '';
            if (path[0] !== '/') {
              // IE does not return path starting with a slash
              path = '/' + path;
            }

            if (options && options.queryString) {
                path += parser.search;
            }

            return path;
        }

        function getMLSAutocomplete(keyword) {
            var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete';
            var query = {
                kind: 'listings',
                query: keyword
            };

            return superagent
                .get(searchURL)
                .query(query)
                .then(function(res) {
                    var data = res.body || [];
                    /*
                        Of the format:
                          [{
                            "_index": "listing_auto_completes_production_20190723232720775",
                            "_type": "listing_auto_complete",
                            "_id": "235875624",
                            "_score": 0,
                            "status_modified_at": 1553250708,
                            "city": "Jupiter",
                            "price": 1335743,
                            "display_address": "10088 Calabrese Trail Unit: 9 Jupiter FL 33478",
                            "sold_price": null,
                            "id": 235875624,
                            "state": "FL",
                            "photo_urls": [
                              "http://cdn.photos.sparkplatform.com/fl/20190322153144208228000000-o.jpg"
                            ],
                            "status": "Pending"
                          }, ...]
                      */

                    return data;
                });
        }

        function getMLSAutocompleteWithFilters(keyword, filters = {}) {
            var searchURL = window.location.protocol + '//' + window.location.hostname + '/home-search/auto_complete';

            return superagent
                .get(searchURL)
                .query({ kind: 'listings', query: keyword, ...filters })
                .then(function(res) {
                    /*
                        Of the format:
                          [{
                            "_index": "listing_auto_completes_production_20190723232720775",
                            "_type": "listing_auto_complete",
                            "_id": "235875624",
                            "_score": 0,
                            "status_modified_at": 1553250708,
                            "city": "Jupiter",
                            "price": 1335743,
                            "display_address": "10088 Calabrese Trail Unit: 9 Jupiter FL 33478",
                            "sold_price": null,
                            "id": 235875624,
                            "state": "FL",
                            "photo_urls": [
                              "http://cdn.photos.sparkplatform.com/fl/20190322153144208228000000-o.jpg"
                            ],
                            "status": "Pending"
                          }, ...]
                    */
                    return res.body || [];
                });
        }

        function makeMlsLink(data) {
            // Code Dupe from utils/googlePlace
            // mapping of google data type to mls data type
            var mapping = {
                neighborhood: 'neighborhood',
                locality: 'place',
                administrative_area_level_2: 'county',
                administrative_area_level_1: 'state',
                postal_code: 'postalcode',
            };

            function _filterTypes(types) {
                return types.filter(function(type) { return type !== 'political' });
            }

            if (!data || !Object.keys(data).length) {
                return '/home-search/listings';
            }

            var newData = {};
            _filterTypes(data.types).forEach(function(type) {
                if (mapping[type]) {
                    newData.search_type = mapping[type];
                }
            });
            newData.omnibox = data.formatted_address;
            data.address_components.forEach(function(component) {
                _filterTypes(component.types).forEach(function(type) {
                    if (mapping[type]) {
                        newData[mapping[type]] = component.long_name;
                    }
                });
            });
            var bounds = data.geometry.bounds;
            var convertedData = Object.assign(bounds, newData);

            return '/home-search/listings?' + objectToQuerystring(convertedData);
        }

        function debounce(func, wait) {
            let timeout;
            return function(...args) {
                const context = this;
                clearTimeout(timeout);
                timeout = setTimeout(() => func.apply(context, args), wait)
            }
        }

        // Global methods / variables that can be accessed by element js
        window.luxuryPresence = {
            ...window.luxuryPresence,
            defaults: {
                companyId: '4c87ae7a-8145-44a2-8253-f39b6c97db14',
                apiGatewayUrl: '/api-gw',
                routerUrl: '/api-nv',
                gql: {"agents":"\n  query Agents (\n    $agentId: ID\n    $agentIds: [ID!]\n    $companyId: String\n    $network: Boolean\n    $networkId: String\n    $officeId: [ID!]\n    $excludeOfficeId: [ID!]\n    $offset: Int\n    $limit: Int\n    $sort: String\n    $sortDir: SortDirectionEnum\n    $search: String\n    $tags: [String]\n    $tagsMode: TagsModeEnum\n    $teamId: [ID!]\n    $developmentId: [ID!]\n    $prioritizeIds: Boolean\n  ) {\n    agents (\n      agentId: $agentId\n      agentIds: $agentIds\n      companyId: $companyId\n      network: $network\n      networkId: $networkId\n      officeId: $officeId\n      excludeOfficeId: $excludeOfficeId\n      offset: $offset\n      limit: $limit\n      sort: $sort\n      sortDir: $sortDir\n      search: $search\n      tags: $tags\n      tagsMode: $tagsMode\n      teamId: $teamId\n      developmentId: $developmentId\n      prioritizeIds: $prioritizeIds\n    ) {\n      id\n      firstName\n      lastName\n      avatar {\n        smallUrl\n        mediumUrl\n        largeUrl\n        height\n        width\n      }\n      position\n      bioLong\n      bioShort\n      seoTitle\n      seoDescription\n      slug\n      phoneNumber\n      phoneNumber2\n      license\n      email\n      leadAgent\n      greaterArea\n      tags\n    }\n    agentsCount(\n      agentIds: $agentIds\n      companyId: $companyId\n      network: $network\n      networkId: $networkId\n      officeId: $officeId\n      excludeOfficeId: $excludeOfficeId\n      search: $search\n      tags: $tags\n      tagsMode: $tagsMode\n      teamId: $teamId\n      developmentId: $developmentId\n      prioritizeIds: $prioritizeIds\n    ) {\n      count\n    }\n  }\n","properties":"\n  query Properties(\n    $agentIds: [ID!]\n    $teamIds: [ID!]\n    $neighborhoodIds: [ID!]\n    $officeIds: [ID!]\n    $propertyId: ID\n    $companyId: String\n    $networkId: String\n    $network: Boolean\n    $statusId: String\n    $propertyIds: [ID!]\n    $prioritizeIds: Boolean\n    $statusIds: [String!]\n    $excludeStatusId: [String!]\n    $neighborhoodId: String\n    $addressState: [String!]\n    $addressCity: [String!]\n    $relatedNeighborhoodPropertyId: String\n    $developmentId: String\n    $featuredListing: Boolean\n    $leaseProperty: Boolean\n    $search: String\n    $searchTermMode: SearchTermModeEnum\n    $globalProperty: Boolean\n    $archived: Boolean\n    $salesPriceGTE: Float\n    $salesPriceLTE: Float\n    $leasePriceGTE: Float\n    $leasePriceLTE: Float\n    $livingSpaceSizeGTE: Float\n    $livingSpaceSizeLTE: Float\n    $bathCountGTE: Float\n    $bathCountLTE: Float\n    $bedroomCountGTE: Float\n    $bedroomCountLTE: Float\n    $architectureStyle: String\n    $lifestyle: String\n    $propertyTypeId: String\n    $propertyTypeIds: [String!]\n    $spaceTypeIds: [ID!]\n    $tag: String\n    $backfillMLSResults: Boolean\n    $displayMLSListings: String\n    $hostname: String\n    $websiteId: ID\n    $backfillProviders: [String!]\n    $backfillMLSListingIds: [String!]\n    $backfillMLSAgentIds: [String!]\n    $backfillMLSOfficeIds: [String!]\n    $backfillBoundary: JSON\n    $openHouse: Boolean\n    $withGeo: Boolean\n    $advancedFilters: JSON\n    $seasonalPriceId: ID\n    $offset: Int\n    $limit: Int\n    $sort: String\n    $sortDir: SortDirectionEnum\n  ) {\n    properties(\n      \n      agentIds: $agentIds\n      teamIds: $teamIds\n      propertyId: $propertyId\n      propertyIds: $propertyIds\n      prioritizeIds: $prioritizeIds\n      companyId: $companyId\n      network: $network\n      networkId: $networkId\n      statusId: $statusId\n      statusIds: $statusIds\n      excludeStatusId: $excludeStatusId\n      neighborhoodId: $neighborhoodId\n      neighborhoodIds: $neighborhoodIds\n      officeIds: $officeIds\n      addressState: $addressState\n      addressCity: $addressCity\n      developmentId: $developmentId\n      featuredListing: $featuredListing\n      leaseProperty: $leaseProperty\n      search: $search\n      searchTermMode: $searchTermMode\n      salesPriceGTE: $salesPriceGTE\n      salesPriceLTE: $salesPriceLTE\n      leasePriceGTE: $leasePriceGTE\n      leasePriceLTE: $leasePriceLTE\n      livingSpaceSizeGTE: $livingSpaceSizeGTE\n      livingSpaceSizeLTE: $livingSpaceSizeLTE\n      bathCountGTE: $bathCountGTE\n      bathCountLTE: $bathCountLTE\n      bedroomCountGTE: $bedroomCountGTE\n      bedroomCountLTE: $bedroomCountLTE\n      architectureStyle: $architectureStyle\n      lifestyle: $lifestyle\n      propertyTypeId: $propertyTypeId\n      propertyTypeIds: $propertyTypeIds\n      spaceTypeIds: $spaceTypeIds\n      tag: $tag\n      archived: $archived\n      globalProperty: $globalProperty\n      withGeo: $withGeo\n      openHouse: $openHouse\n      displayMLSListings: $displayMLSListings\n      advancedFilters: $advancedFilters\n      seasonalPriceId: $seasonalPriceId\n\n      relatedNeighborhoodPropertyId: $relatedNeighborhoodPropertyId\n      backfillMLSResults: $backfillMLSResults\n      hostname: $hostname\n      websiteId: $websiteId\n      backfillProviders: $backfillProviders\n      backfillMLSListingIds: $backfillMLSListingIds\n      backfillMLSAgentIds: $backfillMLSAgentIds\n      backfillMLSOfficeIds: $backfillMLSOfficeIds\n      backfillBoundary: $backfillBoundary\n      offset: $offset\n      limit: $limit\n      sort: $sort,\n      sortDir: $sortDir\n    ){\n      id\n      name\n      status\n      salesPrice\n      reducedPrice\n      isPasswordProtected\n      bedroomCount\n      bathCount\n      fullBathCount\n      halfBathCount\n      threeQuarterBathCount\n      fullAddress\n      addressLine1\n      addressLine2\n      addressCity\n      addressState\n      addressCountry\n      postalCode\n      description\n      syncedAt\n      officeName\n      attributionContact\n      neighborhood {\n        id\n      }\n      media {\n        smallUrl\n        mediumUrl\n        largeUrl\n        xLargeUrl\n        xxLargeUrl\n        height\n        width\n      }\n      seoTitle\n      seoDescription\n      slug\n      fromMLS\n      mlsId\n      mlsLogo\n      mlsAttribution\n      openHouse\n      openHouseHours\n      priceUponRequest\n      privateAddress\n      leaseProperty\n      leasePrice\n      currency\n      leaseTermFrequencyInterval\n      leaseTermFrequencyCount\n      leasePeriod\n      livingSpaceSize\n      livingSpaceUnits\n      lotAreaSize\n      lotAreaUnits\n      tags\n      latitude\n      longitude\n      timeZone\n      buyerAgencyCompensation\n      buyerAgencyCompensationType\n      landIdUrl\n    }\n    propertiesCount(\n    \n      agentIds: $agentIds\n      teamIds: $teamIds\n      propertyId: $propertyId\n      propertyIds: $propertyIds\n      prioritizeIds: $prioritizeIds\n      companyId: $companyId\n      network: $network\n      networkId: $networkId\n      statusId: $statusId\n      statusIds: $statusIds\n      excludeStatusId: $excludeStatusId\n      neighborhoodId: $neighborhoodId\n      neighborhoodIds: $neighborhoodIds\n      officeIds: $officeIds\n      addressState: $addressState\n      addressCity: $addressCity\n      developmentId: $developmentId\n      featuredListing: $featuredListing\n      leaseProperty: $leaseProperty\n      search: $search\n      searchTermMode: $searchTermMode\n      salesPriceGTE: $salesPriceGTE\n      salesPriceLTE: $salesPriceLTE\n      leasePriceGTE: $leasePriceGTE\n      leasePriceLTE: $leasePriceLTE\n      livingSpaceSizeGTE: $livingSpaceSizeGTE\n      livingSpaceSizeLTE: $livingSpaceSizeLTE\n      bathCountGTE: $bathCountGTE\n      bathCountLTE: $bathCountLTE\n      bedroomCountGTE: $bedroomCountGTE\n      bedroomCountLTE: $bedroomCountLTE\n      architectureStyle: $architectureStyle\n      lifestyle: $lifestyle\n      propertyTypeId: $propertyTypeId\n      propertyTypeIds: $propertyTypeIds\n      spaceTypeIds: $spaceTypeIds\n      tag: $tag\n      archived: $archived\n      globalProperty: $globalProperty\n      withGeo: $withGeo\n      openHouse: $openHouse\n      displayMLSListings: $displayMLSListings\n      advancedFilters: $advancedFilters\n      seasonalPriceId: $seasonalPriceId\n\n    ) {\n      count\n    }\n  }\n","pressReleases":"\n  query PressReleases (\n    $pressReleaseId: ID\n    $companyId: String\n    $offset: Int\n    $limit: Int\n    $sort: String\n    $sortDir: SortDirectionEnum\n    $search: String\n    $categories: [String!]\n    $propertyId: [String!]\n    $developmentId: [String!]\n    $agentId: [String!]\n    $teamId: [String!]\n  ) {\n    pressReleases (\n      pressReleaseId: $pressReleaseId\n      companyId: $companyId\n      offset: $offset\n      limit: $limit\n      sort: $sort\n      sortDir: $sortDir\n      search: $search\n      categories: $categories\n      propertyId: $propertyId\n      developmentId: $developmentId\n      agentId: $agentId\n      teamId: $teamId\n    ) {\n      id\n      title\n      description\n      author\n      externalUrl\n      media {\n        smallUrl\n        mediumUrl\n        largeUrl\n        xLargeUrl\n        xxLargeUrl\n        height\n        width\n      }\n      publishedAt\n      categories\n    }\n    pressReleasesCount(\n      companyId: $companyId\n      search: $search\n      categories: $categories\n      propertyId: $propertyId\n      developmentId: $developmentId\n      agentId: $agentId\n      teamId: $teamId\n    ) {\n      count\n    }\n  }\n","posts":"\n  query Posts (\n    $postId: ID\n    $companyId: String\n    $offset: Int\n    $limit: Int\n    $order: String\n    $sortDir: SortDirectionEnum\n    $search: String\n    $featured: Boolean\n    $categoryId: String\n    $categoryIds: [String!]\n    $neighborhoodId: [String!]\n    ) {\n    posts (\n      postId: $postId\n      companyId: $companyId\n      offset: $offset\n      limit: $limit\n      order: $order\n      sortDir: $sortDir\n      search: $search\n      featured: $featured\n      postStatusId: \"5f528253-abb7-484e-95c3-330269ac1102\"\n      categoryId: $categoryId\n      categoryIds: $categoryIds\n      neighborhoodId: $neighborhoodId\n    ) {\n      id\n      title\n      subtitle\n      description\n      status\n      featured\n      slug\n      categories {\n        id\n        name\n      }\n      createdAt\n      publishedAt\n      scheduledAt\n      createdBy {\n        firstName\n        lastName\n      }\n      customAuthor\n      media {\n        smallUrl\n        mediumUrl\n        largeUrl\n        xLargeUrl\n        xxLargeUrl\n        height\n        width\n      }\n      seoTitle\n      seoDescription\n      slug\n    }\n    postsCount(\n      companyId: $companyId\n      search: $search\n      featured: $featured\n      postStatusId: \"5f528253-abb7-484e-95c3-330269ac1102\"\n      categoryId: $categoryId\n      categoryIds: $categoryIds\n      neighborhoodId: $neighborhoodId\n    ) {\n      count\n    }\n  }\n","testimonials":"\n  query Testimonials(\n    $testimonialId: ID\n    $agentId: ID\n    $teamId: ID\n    $companyId: String\n    $offset: Int\n    $limit: Int\n    $sort: String\n    $sortDir: SortDirectionEnum\n    $search: String\n  ) {\n    testimonials(\n      testimonialId: $testimonialId\n      agentId: $agentId\n      teamId: $teamId\n      companyId: $companyId\n      offset: $offset\n      limit: $limit\n      sort: $sort\n      sortDir: $sortDir\n      search: $search\n    ){\n      id\n      body\n      author\n      position\n      media {\n        smallUrl\n        mediumUrl\n        largeUrl\n        xLargeUrl\n        xxLargeUrl\n        height\n        width\n      }\n      seoTitle\n      seoDescription\n      agents {\n        slug\n        email\n        firstName\n        lastName\n        avatar {\n          smallUrl\n          height\n          width\n        }\n      }\n    }\n    testimonialsCount(\n      companyId: $companyId\n      agentId: $agentId\n      teamId: $teamId\n      search: $search\n    ) {\n      count\n    }\n  }\n","neighborhoods":"\n  query Neighborhoods (\n    $neighborhoodId: ID\n    $companyId: String\n    $search: String\n    $tag: String\n    $offset: Int\n    $limit: Int\n    $sort: String\n    $sortDir: SortDirectionEnum\n  ) {\n    neighborhoods (\n      neighborhoodId: $neighborhoodId\n      companyId: $companyId\n      search: $search\n      tag: $tag\n      offset: $offset\n      limit: $limit\n      sort: $sort\n      sortDir: $sortDir\n    ) {\n      id\n      name\n      description\n      descriptionShort\n      slug\n      tags\n      googlePlaceData\n      mlsLink\n      createdAt\n      media {\n        smallUrl\n        mediumUrl\n        largeUrl\n        xLargeUrl\n        xxLargeUrl\n        height\n        width\n      }\n      seoTitle\n      seoDescription\n    }\n    neighborhoodsCount(\n      companyId: $companyId\n      search: $search\n      tag: $tag\n    ) {\n      count\n    }\n  }\n","developments":"\n  query Developments (\n    $developmentId: ID\n    $companyId: String\n    $offset: Int\n    $limit: Int\n    $sort: String\n    $sortDir: SortDirectionEnum\n    $search: String\n    $tag: [String!]\n    $agentId: [ID!]\n    $neighborhoodId: ID\n    $neighborhoodIds: [ID!]\n  ) {\n    developments (\n      developmentId: $developmentId\n      companyId: $companyId\n      offset: $offset\n      limit: $limit\n      sort: $sort\n      sortDir: $sortDir\n      search: $search\n      tag: $tag\n      agentId: $agentId\n      neighborhoodId: $neighborhoodId\n      neighborhoodIds: $neighborhoodIds\n    ) {\n      id\n      name\n      description\n      descriptionShort\n      slug\n      createdAt\n      media {\n        smallUrl\n        mediumUrl\n        largeUrl\n        xLargeUrl\n        xxLargeUrl\n        height\n        width\n      }\n      googlePlaceData\n      seoTitle\n      seoDescription\n      tags\n    }\n    developmentsCount(\n      companyId: $companyId\n      search: $search\n      tag: $tag\n      agentId: $agentId\n      neighborhoodId: $neighborhoodId\n      neighborhoodIds: $neighborhoodIds\n    ) {\n      count\n    }\n  }\n","pois":"\nquery PointsOfInterest(\n  $regionId: String!,\n  $radius: Int,\n  $offset: Int,\n  $limit: Int,\n  $categories: [PoiCategoryEnum!],\n  $sortBy: PoiSortByEnum\n) {\n pois(\n     regionId: $regionId,\n     radius: $radius,\n     offset: $offset,\n     limit: $limit,\n     categories: $categories,\n     sortBy: $sortBy\n ) {\n  name\n  imageUrl\n  url\n  reviewCount\n  rating\n  price\n  displayPhone\n  distance\n  category\n  location {\n      address1\n      address2\n      address3\n      city\n      zipCode\n      country\n      state\n      }\n  }\n }\n","offices":"\n  query Offices (\n    $officeId: ID\n    $officeIds: [ID!]\n    $companyId: String\n    $slug: String\n    $sort: String\n    $sortDir: SortDirectionEnum\n    $search: String\n    $tags: [String]\n    $offset: Int\n    $limit: Int\n  ) {\n    offices (\n      officeId: $officeId\n      officeIds: $officeIds\n      companyId: $companyId\n      slug: $slug\n      sort: $sort\n      sortDir: $sortDir\n      search: $search\n      tags: $tags\n      offset: $offset\n      limit: $limit\n    ) {\n      id\n      companyId\n      name\n      slug\n      officeMlsId\n      shortDescription\n      fullDescription\n      addressLine1\n      addressLine2\n      addressCity\n      addressState\n      addressPostalCode\n      addressCountry\n      phone\n      email\n      officeHours\n      coordinates\n      googlePlaceData \n      seoTitle\n      seoDescription\n      fullAddress\n      media {\n        id\n        originalUrl\n        thumbnailUrl\n        smallUrl\n        mediumUrl\n        largeUrl\n        xLargeUrl\n        xxLargeUrl\n      }\n    }\n    officesCount(\n      companyId: $companyId\n      officeId: $officeId\n      officeIds: $officeIds\n      slug: $slug\n      search: $search\n      tags: $tags\n    ) {\n      count\n    }\n  }\n","teams":"query TeamsAndCount(\n  $offset: Int\n  $limit: Int\n  $search: String\n  $sort: String\n  $sortDir: SortDirectionEnum\n  $companyId: ID\n) {\n  teams(\n    offset: $offset\n    limit: $limit\n    sort: $sort\n    sortDir: $sortDir\n    search: $search\n    companyId: $companyId\n  ) {\n    \n  id\n  companyId\n  name\n  email\n  shortBio\n  fullBio\n  addressLine1\n  addressLine2\n  addressCity\n  addressState\n  addressCountry\n  phoneNumber1\n  phoneNumber2\n  postalCode\n  avatar {\n    id\n    thumbnailUrl\n    smallUrl\n    mediumUrl\n    largeUrl\n  }\n  urlWebsite\n  socialLinks\n  socialLinksArray\n  tags\n  seoTitle\n  seoDesc\n  slug\n  displayOrder\n\n  }\n  teamsCount(\n    search: $search\n    companyId: $companyId\n  ) {\n    count\n  }\n}"},
                propertyPlaceholderImage: {"id":"1148d25c-eed0-494f-a377-f273973e6b5c","alt":null,"bytes":139052,"width":2000,"format":"jpeg","height":2000,"pngUrl":"","shared":true,"curated":false,"duration":null,"largeUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1920/https://media-production.lp-cdn.com/media/658e7b69-747c-4871-8934-af6fafd58dc6","smallUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=960/https://media-production.lp-cdn.com/media/658e7b69-747c-4871-8934-af6fafd58dc6","authorUrl":null,"createdAt":"2025-02-14T17:08:43.835Z","mediumUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=1280/https://media-production.lp-cdn.com/media/658e7b69-747c-4871-8934-af6fafd58dc6","sourceUrl":null,"updatedAt":"2025-02-14T17:08:43.835Z","xLargeUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/658e7b69-747c-4871-8934-af6fafd58dc6","__typename":"Media","altTagText":null,"authorName":null,"sourceName":"r2","xxLargeUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/658e7b69-747c-4871-8934-af6fafd58dc6","description":null,"displayName":"mdw","originalUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85/https://media-production.lp-cdn.com/media/658e7b69-747c-4871-8934-af6fafd58dc6","resourceType":"image","thumbnailUrl":"https://media-production.lp-cdn.com/cdn-cgi/image/format=auto,quality=85,fit=scale-down,width=320/https://media-production.lp-cdn.com/media/658e7b69-747c-4871-8934-af6fafd58dc6","originalFileName":"mdw","cloudinaryPublicId":"658e7b69-747c-4871-8934-af6fafd58dc6"}
            },
            objectToQuerystring: objectToQuerystring,
            getPath: getPath,
            getMLSAutocomplete: getMLSAutocomplete,
            getMLSAutocompleteWithFilters: getMLSAutocompleteWithFilters,
            makeMlsLink: makeMlsLink,
            debounce: debounce,
        };

        var wowOffset = 100;
    </script>
    <script>
        (() => {

function $parcel$interopDefault(a) {
  return a && a.__esModule ? a.default : a;
}
// Entry point for lp-sdk bundle
// This file exists to ensure Parcel v2 outputs the correct filename
/* global window */ var $53de3c160faf5a81$exports = {};
/*
WARNING!!! This file is used both on the server and in client's web-browser
please don't require/import any server-side related config/functions here
If we need something, let's pass it as a parameter of the factory
*/ var $0ce6edea77f7b81a$exports = {};
$0ce6edea77f7b81a$exports = {
    getVideoFirstFrame (videoUrl) {
        // The default Cloudinary asset delivery URL has the following structure: https://res.cloudinary.com/<cloud_name>/<asset_type>/<delivery_type>/<transformations>/<version>/<public_id>.<extension>
        //  https://cloudinary.com/documentation/video_manipulation_and_delivery#transformation_url_structure
        // The problem is that <transformations> and <version> are optional, and <transformations> can be chained separated by '/'
        // One more issue to be handled https://cloudinary.com/documentation/advanced_url_delivery_options#seo_friendly_media_asset_urls
        const CLOUDINARY_URL = 'https://res.cloudinary.com/';
        const invalid = !videoUrl || !videoUrl.startsWith(CLOUDINARY_URL);
        if (invalid) return null;
        const urlComponents = videoUrl.replace(CLOUDINARY_URL, '').replace('f_auto:video', 'f_auto').split('/');
        // checking if <asset_type> is not video or videos
        if (urlComponents[1].toLowerCase().indexOf('video') === -1) return null;
        // Filename is last urlComponent <public_id>.<extension>
        let filename = urlComponents[urlComponents.length - 1];
        if (filename.lastIndexOf('.') > -1) filename = `${filename.slice(0, filename.lastIndexOf('.'))}.jpg`;
        else filename += '.jpg';
        urlComponents[urlComponents.length - 1] = filename;
        // We need to add so_0,eo_0 transformation to the url to target the first frame.
        // we want to find the position at which we want to insert it as a chained transformation
        const firstFrameTransformation = 'so_0,eo_0';
        let firstFrameTransformationPosition = 3;
        // checking cases for SEO-friendly URLs
        if (urlComponents[1].toLowerCase() === 'videos' && urlComponents[2] !== '') firstFrameTransformationPosition = 2;
        // checking the last transformation position in the url
        // https://cloudinary.com/documentation/transformation_reference
        // https://regex101.com/r/lE3W6u/1
        const transformationRegex = /^(?:[a-z]{1,3}|\$\w+)_\S+$/;
        while(firstFrameTransformationPosition < urlComponents.length - 1 && transformationRegex.test(urlComponents[firstFrameTransformationPosition]))firstFrameTransformationPosition++;
        urlComponents.splice(firstFrameTransformationPosition, 0, firstFrameTransformation);
        return CLOUDINARY_URL + urlComponents.join('/');
    }
};


/**
 * Create helpers with given Handlebars instance
 *
 * @param {Object} HandlebarsInstance
 * @param {Function} isEqual - we use different implementation if isEqual on server and on client
 * @return {Object}
 */ function $53de3c160faf5a81$var$handlebarsHelpersFactory(HandlebarsInstance, { isEqual: isEqual }) {
    // notice!: code below assumes list is ordered lowest to highest width
    const MEDIA_SIZES = [
        {
            field: 'thumbnailUrl',
            w: 320
        },
        {
            field: 'smallUrl',
            w: 960
        },
        {
            field: 'mediumUrl',
            w: 1280
        },
        {
            field: 'largeUrl',
            w: 1920
        },
        {
            field: 'xLargeUrl',
            w: 2560
        },
        {
            field: 'xxLargeUrl',
            w: 3456
        }
    ];
    const MEDIA_SIZE_FOR_SRC = 1280;
    const lpFormatNumber = function(number, unit, precision) {
        const localization = 'en-US';
        if (!number) return '';
        if (typeof number === 'string') {
            const trimmed = number.trim();
            if (/[^+\-0-9.]/.test(trimmed)) return number; // returning text 'as is' assuming it already has all formatting
            // eslint-disable-next-line
            number = parseFloat(trimmed);
            if (!number) return '';
        }
        const currencyPrecision = typeof precision === 'number' ? precision : 0;
        const currencyFractionDigits = Number.isInteger(number) ? 0 : currencyPrecision;
        const currencyFractionOptions = {
            minimumFractionDigits: currencyFractionDigits,
            maximumFractionDigits: currencyFractionDigits
        };
        if (unit === 'USD') return `$${number.toLocaleString(localization, currencyFractionOptions)}`;
        if (unit === 'CAD') return `$${number.toLocaleString(localization, currencyFractionOptions)} CAD`;
        if (unit === 'EUR') return `\u{20AC}${number.toLocaleString(localization, currencyFractionOptions)}`;
        if (unit === 'GBP') return `\xa3${number.toLocaleString(localization, currencyFractionOptions)}`;
        if (unit === 'PERCENT') return `${number}%`;
        if (precision && typeof precision === 'number' && number > -1) return number.toLocaleString(localization, {
            maximumFractionDigits: precision
        });
        return number.toLocaleString(localization);
    };
    const formatFrequency = function(freqUnit) {
        switch(freqUnit){
            case 'DAY':
                return 'daily';
            case 'MONTH':
                return 'monthly';
            case 'WEEK':
                return 'weekly';
            case 'YEAR':
                return 'yearly';
            case 'QUARTER':
                return 'quarterly';
            case 'HALF_YEAR':
                return 'semi-annually';
            case 'NIGHTLY':
                return 'nightly';
            case 'SEASONAL':
                return 'seasonally';
            default:
                return '';
        }
    };
    const formatFrequencyShort = function(freqUnit) {
        switch(freqUnit){
            case 'DAY':
                return 'day';
            case 'WEEK':
                return 'wk';
            case 'MONTH':
                return 'mo';
            case 'YEAR':
                return 'yr';
            case 'QUARTER':
                return '3 mos';
            case 'HALF_YEAR':
                return '6 mos';
            case 'NIGHTLY':
                return 'night';
            case 'SEASONAL':
                return 'season';
            default:
                return '';
        }
    };
    const formatFrequencyStd = function(freqUnit) {
        switch(freqUnit){
            case 'DAY':
                return 'day';
            case 'WEEK':
                return 'week';
            case 'MONTH':
                return 'month';
            case 'YEAR':
                return 'year';
            case 'QUARTER':
                return 'quarter';
            case 'HALF_YEAR':
                return '6 months';
            case 'NIGHTLY':
                return 'night';
            case 'SEASONAL':
                return 'season';
            default:
                return '';
        }
    };
    const formatFrequencyExt = function(unit, options) {
        let val;
        let separator;
        const opts = options || {};
        switch(opts.mode){
            case 'short':
                val = formatFrequencyShort(unit);
                separator = opts.frequencySeparator || '/';
                break;
            case 'standard':
            case 'std':
                val = formatFrequencyStd(unit);
                separator = opts.frequencySeparator || '/';
                break;
            case 'long':
            default:
                val = formatFrequency(unit);
                separator = opts.frequencySeparator || ' ';
        }
        if (!val) return '';
        if (!opts.frequencyTag && !opts.frequencyClass) return separator + val;
        return `${separator}<${opts.frequencyTag || 'span'}${opts.frequencyClass ? ` class="${opts.frequencyClass}"` : ''}>${val}</${opts.frequencyTag || 'span'}>`;
    };
    return {
        isEmpty (arg1, options) {
            const result = !arg1 || (typeof arg1 === 'string' ? !arg1.trim() : false) || !Object.keys(arg1).length;
            if (options.fn) return result ? options.fn(this) : options.inverse(this);
            return result;
        },
        ifEquals (arg1, arg2, options) {
            return isEqual(arg1, arg2) ? options.fn(this) : options.inverse(this);
        },
        'raw-helper': function(options) {
            return options.fn();
        },
        striptags (txt) {
            if (!txt) return '';
            // Remove HTML Comments (escaping something to not make real html comment by expression)
            // eslint-disable-next-line no-useless-escape,no-param-reassign
            txt = txt.replace(/<\!--(.|[\r\n])*?-\->/g, '');
            // Remove XML fragments and <style> and <svg> tags with content
            // eslint-disable-next-line
            txt = txt.replace(/<(xml|style|svg)("[^"]*"|'[^']*'|[^>])*>(.|[\r\n])*?<\/\1>/gi, '');
            // Replace &nbsp; with space
            // eslint-disable-next-line no-param-reassign
            txt = txt.replace(/&nbsp;/g, ' ');
            // Remove HTML Tags
            const regexp = /<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g;
            return txt.replace(regexp, '');
        },
        striptagsLineBreaks (txt) {
            if (!txt) return '';
            // Remove HTML Comments (escaping something to not make real html comment by expression)
            // eslint-disable-next-line no-useless-escape,no-param-reassign
            txt = txt.replace(/<\!--(.|[\r\n])*?-\->/g, '');
            // Remove XML fragments and <style> and <svg> tags with content
            // eslint-disable-next-line no-param-reassign
            txt = txt.replace(/<(xml|style|svg)("[^"]*"|'[^']*'|[^>])*>(.|[\r\n])*?<\/\1>/gi, '');
            // Replace <br> and </p> tags with line break char, skipping last </p> which is not followed by <br> or </p>
            // eslint-disable-next-line no-param-reassign
            txt = txt.replace(/(<br\s*\/?>)|(<\/p\s*>)(?=.*(<\/p\s*>|<br\s*\/?>))/g, '&#10;');
            // Replace &nbsp; with space
            // eslint-disable-next-line no-param-reassign
            txt = txt.replace(/&nbsp;/g, ' ');
            // Remove HTML Tags
            const regexp = /<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g;
            return txt.replace(regexp, '');
        },
        truncate (text, limit, suffix) {
            if (!text) return '';
            if (text.length > limit) return typeof suffix === 'string' ? text.slice(0, limit - suffix.length) + suffix : text.slice(0, limit);
            return text;
        },
        // eslint-disable-next-line
        setSubArray (items = [], start, end, subArrayName, options) {
            // eslint-disable-next-line
            options.data.root[subArrayName] = items.slice(start, end);
        },
        formatAreaUnit (areaUnit) {
            switch(areaUnit){
                case 'ACRE':
                    return 'Acres';
                case 'SQUARE_METER':
                    return 'Sq.M.';
                case 'SQUARE_YARD':
                    return 'Sq.Yd.';
                default:
                    return 'Sq.Ft.';
            }
        },
        formatFrequency: formatFrequency,
        formatFrequencyShort: formatFrequencyShort,
        lpFormatFrequency (freqUnit, options) {
            return formatFrequencyExt(freqUnit, options && options.hash);
        },
        subArray (index, start, end, options) {
            return index >= start && index < end ? options.fn(this) : options.inverse(this);
        },
        formatPropertyStatus (status) {
            let formattedStatus = '';
            switch(status){
                case 'SOLD':
                    formattedStatus = 'Sold';
                    break;
                case 'FOR_SALE':
                    formattedStatus = 'For Sale';
                    break;
                case 'COMING_SOON':
                    formattedStatus = 'Coming Soon';
                    break;
                case 'INACTIVE':
                    formattedStatus = 'Inactive';
                    break;
                case 'POCKET_LISTING':
                    formattedStatus = 'Pocket Listing';
                    break;
                case 'PENDING':
                    formattedStatus = 'Pending';
                    break;
                case 'UNDER_CONTRACT':
                    formattedStatus = 'Under Contract';
                    break;
                case 'ACTIVE_UNDER_CONTRACT':
                    formattedStatus = 'Active Under Contract';
                    break;
                default:
                    formattedStatus = status;
            }
            return formattedStatus;
        },
        formatGrade (gradeValue) {
            switch(gradeValue){
                case 'UNDERGRADUATE_COURSES':
                    return 'Undergrad';
                case 'PRE_KINDERGARTEN':
                    return 'PreK';
                case 'KINDERGARTEN':
                    return 'K';
                case 'FIRST_GRADE':
                    return '1st';
                case 'SECOND_GRADE':
                    return '2nd';
                case 'THIRD_GRADE':
                    return '3rd';
                case 'FOURTH_GRADE':
                    return '4th';
                case 'FIFTH_GRADE':
                    return '5th';
                case 'SIXTH_GRADE':
                    return '6th';
                case 'SEVENTH_GRADE':
                    return '7th';
                case 'EIGHTH_GRADE':
                    return '8th';
                case 'NINTH_GRADE':
                    return '9th';
                case 'TENTH_GRADE':
                    return '10th';
                case 'ELEVENTH_GRADE':
                    return '11th';
                case 'TWELFTH_GRADE':
                    return '12th';
                default:
                    return '';
            }
        },
        encodeURI (uri) {
            return encodeURI(uri);
        },
        encodeURIComponent (txt) {
            return encodeURIComponent(txt);
        },
        hbFormatDate (date, type) {
            const newDate = date === 'current' ? new Date() : new Date(date);
            const months = [
                'January',
                'February',
                'March',
                'April',
                'May',
                'June',
                'July',
                'August',
                'September',
                'October',
                'November',
                'December'
            ];
            if (type === 'YYYY' || type === 'year') return `${newDate.getFullYear()}`;
            if (type === 'MM/DD/YY') {
                let month = newDate.getMonth() + 1;
                if (month < 10) month = `0${month.toString()}`;
                return `${month}/${newDate.getDate()}/${newDate.getFullYear().toString().substr(-2)}`;
            }
            return `${months[newDate.getMonth()]} ${newDate.getDate()}, ${newDate.getFullYear()}`;
        },
        openHousesFormat (startDate, endDate, timeZone) {
            if (!startDate || !endDate) return '';
            /**
       * return formatted time.
       * @param {date} date
       * @return {time} time.
       */ const getTime = (date)=>{
                let hours = date.getHours();
                if (hours > 12) hours -= 12;
                const prefix = '0';
                let time = `${hours}:${date.getMinutes() > 9 ? date.getMinutes() : prefix + date.getMinutes()}`;
                if (date.getHours() > 11) time += 'PM';
                else time += 'AM';
                return time;
            };
            let tz = '';
            let startFDate = startDate;
            let endFDate = endDate;
            if (timeZone) {
                startFDate = new Date(startDate).toLocaleString('en-US', {
                    timeZone: timeZone
                });
                endFDate = new Date(endDate).toLocaleString('en-US', {
                    timeZone: timeZone
                });
                [, , , tz] = new Date(endDate).toLocaleString('en-US', {
                    timeZone: timeZone,
                    timeZoneName: 'short'
                }).split(' ');
            }
            const date = new Date(startFDate);
            const openHouseDate = date.toLocaleDateString('en-US');
            const time1 = getTime(date);
            const date2 = new Date(endFDate);
            const time2 = getTime(date2);
            return `${openHouseDate} ${time1} - ${time2} ${tz}`;
        },
        math (lvalue, operator, rvalue) {
            // eslint-disable-next-line
            lvalue = parseFloat(lvalue);
            // eslint-disable-next-line
            rvalue = parseFloat(rvalue);
            return ({
                '+': lvalue + rvalue,
                '-': lvalue - rvalue,
                '*': lvalue * rvalue,
                '/': lvalue / rvalue,
                '%': lvalue % rvalue
            })[operator];
        },
        findByKey (values, key, value, options) {
            const result = (values || []).find((entry)=>entry[key] === value);
            return options.fn(result);
        },
        capitalize (string, split, options) {
            let capitalized;
            if (typeof string === 'string' && string.length) capitalized = string.toLowerCase().split(split).map((w)=>w.charAt(0).toUpperCase() + w.slice(1)).join(' ').toString();
            return capitalized;
        },
        and (...arg) {
            return Array.prototype.slice.call(arg).every(Boolean);
        },
        or (...arg) {
            return Array.prototype.slice.call(arg, 0, -1).some(Boolean);
        },
        not (arg) {
            return !arg;
        },
        orderByIds (items, orderedIds, options) {
            let ret = '';
            let data = null;
            if (options.data) data = HandlebarsInstance.createFrame(options.data);
            // When passed orderedIds, filter out empty items including empty strings and
            // only show items (and in that order) in a loop
            //  If no orderedIds provided, show all items
            const filteredIds = (orderedIds || []).filter(Boolean);
            if (filteredIds && filteredIds.length) {
                let skippedItems = 0;
                ret = filteredIds.reduce((res, id, idx)=>{
                    const item = (items || []).find((item)=>item.id === id);
                    // ID doesn't exist so ditch it
                    if (!item) {
                        skippedItems += 1;
                        return res;
                    }
                    if (data) data.index = idx - skippedItems;
                    return res + options.fn(item, {
                        data: data
                    });
                }, '');
            } else for(let i = 0, j = (items || []).length; i < j; i++){
                if (data) data.index = i;
                ret += options.fn(items[i], {
                    data: data
                });
            }
            return ret;
        },
        ifIn (elem, list, options) {
            if (list && list.indexOf(elem) > -1) return options.fn(this);
            return options.inverse(this);
        },
        partial (name, options) {
            // Register a partial and output the content in a script for clientside rendering
            HandlebarsInstance.registerPartial(name, HandlebarsInstance.compile(options.fn()));
            // eslint-disable-next-line
            const script = `<script type="text/x-handlebars-template" class="${name} pagination-script">${options.fn()}</${'script'}>`;
            return script;
        },
        numCompare (l, r, operator, options) {
            const operators = {
                '==': function(l, r) {
                    // eslint-disable-next-line
                    return l == r;
                },
                '===': function(l, r) {
                    return l === r;
                },
                '!=': function(l, r) {
                    // eslint-disable-next-line
                    return l != r;
                },
                '<': function(l, r) {
                    return l < r;
                },
                '>': function(l, r) {
                    return l > r;
                },
                '<=': function(l, r) {
                    return l <= r;
                },
                '>=': function(l, r) {
                    return l >= r;
                }
            };
            const result = operators[operator](l, r);
            if (result) return options.fn ? options.fn(this) : true;
            return options.fn ? options.inverse(this) : false;
        },
        lpFormatNumber: lpFormatNumber,
        arrayToHtmlList (arr, options) {
            // eslint-disable-next-line
            return arr.reduce((acc, current)=>{
                try {
                    if (typeof current === 'object' || current === null) return acc;
                    // eslint-disable-next-line
                    return acc += `<li>${current}</li>`;
                } catch (e) {
                /* empty */ }
            }, '');
        },
        join (array, separator, options) {
            if (!array || !array.join) return '';
            return array.join(typeof separator === 'string' ? separator : ', ');
        },
        dedupe (items, key, options) {
            let data = null;
            let skippedItems = 0;
            const list = new Set();
            if (options.data) data = HandlebarsInstance.createFrame(options.data);
            return (items || []).reduce((res, item, idx)=>{
                const val = key ? item[key] : item;
                // Item is unique if we're passed a key that is not defined
                const isUnique = !list.has(val) || key && val === undefined;
                if (isUnique) list.add(val);
                else {
                    skippedItems += 1;
                    return res;
                }
                if (data) data.index = idx - skippedItems;
                return res + options.fn(item, {
                    data: data
                });
            }, '');
        },
        JSONstringify (obj, options) {
            return JSON.stringify(obj);
        },
        // eslint-disable-next-line sonarjs/cognitive-complexity
        formatPropertyPrice (...args) {
            const options = args[args.length - 1];
            const opts = options.hash;
            const property = args.length > 1 ? args[0] : opts.property;
            const precision = opts.precision || 0;
            if (args.length > 2) // eslint-disable-next-line
            opts.mode = args[1];
            if (!opts.mode) opts.mode = 'short';
            let separator = args.length > 3 ? args[2] : opts.separator;
            if (typeof separator !== 'string') separator = ' | ';
            if (property.isPasswordProtected) return 'Exclusive Listing';
            let priceUponRequestText = args.length > 4 ? args[3] : opts.priceUponRequestText;
            if (typeof priceUponRequestText !== 'string') priceUponRequestText = 'Price Upon Request';
            if (property.priceUponRequest) return priceUponRequestText;
            let price = property.salesPrice;
            let reduced = null;
            // eslint-disable-next-line sonarjs/no-collapsible-if
            if (property.status !== 'SOLD' && property.status !== 'Leased') {
                if (property.reducedPrice) {
                    if (!opts.reducedClass) price = property.reducedPrice;
                    else reduced = property.reducedPrice;
                }
            }
            let result = '';
            if (reduced) result += `<${opts.reducedTag || 'span'} class="${opts.reducedClass}">${lpFormatNumber(reduced, property.currency, precision)}</${opts.reducedTag || 'span'}>`;
            if (price) {
                price = lpFormatNumber(price, property.currency, precision);
                if (opts.priceTag || opts.priceClass) result += `<${opts.priceTag || 'span'}${opts.priceClass ? ` class="${opts.priceClass}"` : ''}>${price}</${opts.priceTag || 'span'}>`;
                else result += price;
            }
            const leasePrice = property.leasePrice && lpFormatNumber(property.leasePrice, property.currency, precision);
            if (leasePrice) {
                if (result) result += separator;
                const leaseText = `${leasePrice}${formatFrequencyExt(property.leasePeriod, opts)}`;
                if (opts.leaseTag || opts.leaseClass) result += `<${opts.leaseTag || 'span'}${opts.leaseClass ? ` class="${opts.leaseClass}"` : ''}>${leaseText}</${opts.leaseTag || 'span'}>`;
                else result += leaseText;
            }
            return new HandlebarsInstance.SafeString(result);
        },
        // eslint-disable-next-line sonarjs/cognitive-complexity
        mediaImage (mediaSource, options = {}) {
            if (!mediaSource) return;
            const { lazy: lazy, ...attributes } = options.hash;
            let src = '';
            let srcset = '';
            if (typeof mediaSource === 'string') src = mediaSource;
            else {
                const srcMap = {};
                const { height: height, width: width, altTagText: altTagText } = mediaSource;
                MEDIA_SIZES.forEach((src)=>{
                    if (mediaSource[src.field] && !srcMap[mediaSource[src.field]]) srcMap[mediaSource[src.field]] = src.w;
                });
                const srcs = Object.keys(srcMap);
                if (!srcs.length) return;
                if (altTagText) attributes.alt = altTagText;
                if (height && width) {
                    if (height >= width) {
                        if (attributes.class) attributes.class += ' portrait';
                        else attributes.class = 'portrait';
                    }
                    if ('setDims' in options.hash) {
                        attributes.width = width;
                        attributes.height = height;
                    }
                }
                if (srcs.length > 1 && width && width < srcMap[srcs[srcs.length - 1]]) {
                    const maxSrc = srcs.findIndex((src)=>srcMap[src] >= width);
                    srcs.splice(maxSrc + 1);
                    srcMap[srcs[srcs.length - 1]] = width;
                }
                if (srcs.length > 1) {
                    srcset = srcs.map((s)=>`${s} ${srcMap[s]}w`).join(', ');
                    srcs.sort((a, b)=>Math.abs(srcMap[a] - MEDIA_SIZE_FOR_SRC) - Math.abs(srcMap[b] - MEDIA_SIZE_FOR_SRC));
                }
                // eslint-disable-next-line
                src = srcs[0];
            }
            delete attributes.setDims;
            if (!srcset) delete attributes.sizes;
            if (!('alt' in attributes)) attributes.alt = '';
            if (!('loading' in attributes) && (options?.data?.root?.sectionIndex > 1 || lazy)) attributes.loading = 'lazy';
            const attrs = Object.keys(attributes).map((k)=>`${HandlebarsInstance.escapeExpression(k)}="${HandlebarsInstance.escapeExpression(attributes[k])}"`).join(' ');
            return new HandlebarsInstance.SafeString(// eslint-disable-next-line sonarjs/no-nested-template-literals
            `<img src="${src}"${srcset ? ` srcset="${srcset}"` : ''}${attrs ? ` ${attrs}` : ''}>`);
        },
        bgImage (mediaSource) {
            if (!mediaSource) return '';
            if (typeof mediaSource === 'string') return mediaSource;
            return mediaSource.largeUrl || mediaSource.url || '';
        },
        concat (...rest) {
            let outStr = '';
            // rest params are Array instances while arguments object is not
            for(const arg in rest)if (rest[arg] !== null && rest[arg] !== undefined && typeof rest[arg] !== 'object') outStr += rest[arg];
            return outStr;
        },
        setVideoExtension (uri, format) {
            if (!uri || !format) return '';
            const decodedUri = new URL(uri);
            if (decodedUri.host !== 'res.cloudinary.com') {
                // Not a cloudinary uri, do not rewrite
                if (decodedUri.pathname.endsWith(`.${format}`)) return uri;
                return '';
            }
            // Rewrite the cloudinary uri
            const lastPeriodIdx = decodedUri.pathname.lastIndexOf('.');
            let pathWithoutFormat = decodedUri.pathname;
            if (lastPeriodIdx !== -1) pathWithoutFormat = decodedUri.pathname.substr(0, lastPeriodIdx);
            decodedUri.pathname = `${pathWithoutFormat}.${format}`;
            return decodedUri.toString();
        },
        addVideoSources (uri) {
            if (!uri) return '';
            const VIDEO_VARIANTS = [
                {
                    format: 'webm',
                    codec: 'vp9',
                    htmlCodecs: ';codecs=vp9'
                },
                {
                    format: 'mp4',
                    codec: 'h265',
                    htmlCodecs: ';codecs=hvc1'
                },
                {
                    format: 'mp4',
                    codec: 'h264',
                    htmlCodecs: ''
                }
            ];
            const VIDEO_EXT_REGEXP = /\.(?:3gp|mpeg|mp4|m4v|m4p|ogv|ogg|mov|webm)$/;
            if (!uri.includes('res.cloudinary.com')) // keep existing or no extension for non Cloudinary urls
            return `<source data-src="${uri}">`;
            const uriNoExt = uri.replace(VIDEO_EXT_REGEXP, '');
            const sources = VIDEO_VARIANTS.map((type)=>{
                const cloudinaryFormatUrl = `${uriNoExt.replace(/f_auto(?::video)?/, `f_${type.format},vc_${type.codec}`)}.${type.format}`;
                return `<source data-src="${cloudinaryFormatUrl}" type="video/${type.format}${type.htmlCodecs}">`;
            });
            return sources.join('\n');
        },
        cloudinaryVideoFirstFrame: $0ce6edea77f7b81a$exports.getVideoFirstFrame,
        initials (text, options) {
            if (!text) return '';
            if (options?.hash?.endChar) // eslint-disable-next-line
            text = text.split(options.hash.endChar)[0];
            // eslint-disable-next-line
            const maxChars = +options?.hash?.maxChars || 2; // we do not allow this to be 0
            let result = text.match(/\b\w/g)?.slice(0, maxChars);
            if (!result) return '';
            if (options?.hash?.addText) result = result.map((item)=>item + options.hash.addText);
            return result.join(options?.hash?.joinWith || '').toUpperCase();
        },
        normalizePhone (phone) {
            if (!phone) return '';
            const str = String(phone).trim();
            return (str.startsWith('+') ? '+' : '') + str.replace(/\D/g, '');
        }
    };
}
$53de3c160faf5a81$exports = $53de3c160faf5a81$var$handlebarsHelpersFactory;


/* global window, document */ // eslint-disable-next-line import/prefer-default-export
class $dc851cf3939b6ef5$export$ff0712c26d5458f7 {
    /**
   * Initialize Modal Controller
   * @param {Object} options
   */ constructor(options){
        this.isBuilder = false;
        this.companyId = null;
        this.websiteId = null;
        this.pageId = null;
        this.shareId = null;
        this.pageMeta = null;
        this.websiteApiGatewayUrl = null;
        this.buyerSellerServiceUrl = null;
        this.leadIngesterUrl = null;
        this.divolteServiceUrl = null;
        this.eventBus = null;
        this.templateId = null;
        this.myhomeDashboardEnabled = false;
        this.googleMapsAPIKey = null;
    }
    /**
   * Controllers must implement a "destroy" method to be called
   * after page navigation to remove event handlers / cleanup
   */ destroy() {}
    /**
   * Set page and supporting data
   * @param {string} pageId
   * @param {Object} options
   */ setPage(pageId, options = {}) {
        this.pageId = pageId;
        this.shareId = options.shareId || null;
        this.pageMeta = {
            sourceResource: options.sourceResource,
            pageElementId: options.pageElementId,
            pageQueryVariables: options.pageQueryVariables || {}
        };
    }
    /**
   * Sets if we are in pagebuilder context or not
   * @param {boolean} isBuilder
   */ setIsBuilder(isBuilder) {
        this.isBuilder = isBuilder;
    }
    /**
   * Set Company and supporting data
   * @param {string} companyId
   * @param {Object} options
   */ setCompany(companyId, options = {}) {
        this.companyId = companyId;
    }
    /**
   * Set website and supporting data
   * @param {string} websiteId
   * @param {Object} options
   */ setWebsite(websiteId, options = {}) {
        this.websiteId = websiteId;
        if (options.myhomeDashboardEnabled) this.myhomeDashboardEnabled = options.myhomeDashboardEnabled;
    }
    /**
   * Set websiteApiGatewayUrl
   * @param {string} websiteApiGatewayUrl
   * @param {Object} options
   */ setWebsiteApiGatewayUrl(websiteApiGatewayUrl, options = {}) {
        this.websiteApiGatewayUrl = websiteApiGatewayUrl;
    }
    /**
   * Set buyerSellerServiceUrl
   * @param {string} buyerSellerServiceUrl
   * @param {Object} options
   */ setBuyerSellerServiceUrl(buyerSellerServiceUrl, options = {}) {
        this.buyerSellerServiceUrl = buyerSellerServiceUrl;
    }
    /**
   * Set divolteServiceUrl and supporting data
   * @param {string} divolteServiceUrl
   * @param {Object} options
   */ setDivolteServiceUrl(divolteServiceUrl, options = {}) {
        this.divolteServiceUrl = divolteServiceUrl;
    }
    /**
   * Set eventBusUrl
   * @param {string} eventBusUrl
   * @param {Object} options
   */ setEventBusUrl(eventBusUrl, options = {}) {
        this.eventBusUrl = eventBusUrl;
    }
    /**
   * Set templateId and supporting data
   * @param {string} templateId
   * @param {Object} options
   */ setTemplateId(templateId, options = {}) {
        this.templateId = templateId;
    }
    /**
   * Set leadIngesterUrl
   * @param {string} leadIngesterUrl
   * @param {Object} options
   */ setLeadIngesterUrl(leadIngesterUrl, options = {}) {
        this.leadIngesterUrl = leadIngesterUrl;
    }
    /**
   * Set googleMapsAPIKey
   * @param {string} googleMapsAPIKey
   * @param {Object} options
   */ setGoogleMapsAPIKey(googleMapsAPIKey, options = {}) {
        this.googleMapsAPIKey = googleMapsAPIKey;
    }
    /**
   * Set eventBus
   * @param {Object} options
   */ setEventBus({ enabled: enabled, apiKey: apiKey, url: url }) {
        this.eventBus = {
            enabled: enabled,
            apiKey: apiKey,
            url: url
        };
    }
}


/* eslint-disable import/prefer-default-export */ // eslint-disable-next-line import/prefer-default-export
class $7c391e2f7931d60d$export$3b5bd9381a52554c {
    /**
   * Initialize Base Controller at build time
   * @param { ConfigController } config
   * @param {Window} window
   * @param {Document} document
   */ constructor(config, window, document){
        // TODO: Listen for events from configController to update configuration
        this.config = config;
        this.window = window;
        this.document = document;
        if (!this.destroy) // With turbolinks, we want to ensure that on each page load we have the latest version of the sdk
        //  Controllers are deconstructed and replaced (on the window object) per request
        //  Controllers must use the destory method to remove event handlers to prevent undefined behavior
        throw new Error('Controllers must implement a deconstructor');
    }
}


// eslint-disable-next-line import/prefer-default-export
const $a3e97e89bbc2a366$export$f037eeffb5561205 = 2000;


class $0ead03fdb95fa9ce$export$d507f25e63650365 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    /**
   * Initialize Modal Controller at build time
   * @param { ConfigController } config
   * @param {Window} window
   * @param {Document} document
   */ constructor(config, window, document){
        super(config, window, document);
        this.setLoginState = this.setLoginState.bind(this);
        this.pageId = null;
        this.modals = [];
        this.exitModalTriggered = {};
        this.exitModalEventListeners = [];
    }
    /**
   * Initialize Modal Controller at run time
   * Attach handlers and events to DOM
   * @param {Object} options
   */ initialize(options) {
        try {
            const { config: config, document: document } = this;
            this.pageId = config.pageId;
            this.modals = document.querySelectorAll('body > #modals > .modal');
            options.modals.forEach((m)=>{
                this._attachModalHandler(m);
            });
        } catch (e) {
            // eslint-disable-next-line no-console
            console.log(e);
        }
    }
    /**
   * Controllers must implement a "destroy" method to be called
   * after page navigation to remove event handlers / cleanup
   */ destroy() {
        const { document: document } = this;
        this.exitModalEventListeners.forEach((listener)=>{
            document.removeEventListener('mouseout', listener);
        });
        this.modals = [];
        this.exitModalTriggered = {};
        this.exitModalEventListeners = [];
    }
    /**
   * Set modal to local storage with expiration
   * @param {string} modalId
   */ setModalWithExpiry(modalId) {
        const { window: window } = this;
        const TTL = 86400000; // 24 hours
        const now = new Date();
        const expiry = now.getTime() + TTL;
        const key = `modal-controller-${modalId}`;
        try {
            window.localStorage.setItem(key, JSON.stringify(expiry));
        } catch (err) {
        // catch error when setting item to storage on iOS private browser
        }
    }
    /**
   * Save success login modal to local storage
   */ setLoginState() {
        const { window: window } = this;
        try {
            window.localStorage.setItem('isSignedUp', 'true');
        } catch (err) {
        // catch error when setting item to storage on iOS private browser
        }
    }
    /**
   * Get modal and check expiration
   * @param {string} modalId
   * @return {boolean}
   */ getModalWithExpiry(modalId) {
        const { window: window } = this;
        const storage = window.localStorage;
        const expirationTime = storage.getItem(`modal-controller-${modalId}`);
        if (!expirationTime) return false;
        const expiry = JSON.parse(expirationTime);
        const now = new Date();
        if (now.getTime() > expiry) {
            storage.removeItem(`modal-controller-${modalId}`);
            return false;
        }
        return true;
    }
    /**
   * Make a modal visible
   * @param {string} modalId
   * @param {Object} options
   */ show(modalId, options = {}) {
        // TODO: migrate logic from page.handlebars
        const { window: window } = this;
        const modalViewed = this.getModalWithExpiry(modalId);
        // Only show a modal if it has not been seen
        // Does not affect "show modal on button click"
        if (modalId && !modalViewed || options.forced === true) {
            window.lpUI.showModal(`modal-${modalId}`, options);
            this.setModalWithExpiry(modalId);
        }
    }
    /**
   * Attach events based on Modal type and page settings
   * @param {Modal} modal
   */ _attachModalHandler(modal) {
        const { pageId: pageId } = this;
        const { trigger: trigger, pageSpecific: pageSpecific } = modal;
        if (pageSpecific) {
            const pageIds = modal.pages.map((p)=>p.pageId);
            if (!pageIds.includes(pageId)) // Modal does not belong to this page
            return;
        }
        if (trigger === 'EXIT') this._exitModalHandler(modal);
        else if (trigger === 'TIMER') this._timerModalHandler(modal);
        else if (trigger === 'FORCED') this._forcedModalHandler(modal);
    }
    /**
   * Attach events for exit Modals
   * @param {Modal} modal
   */ _exitModalHandler(modal) {
        // eslint-disable-next-line
        const that = this;
        const { document: document, exitModalTriggered: exitModalTriggered } = this;
        const { modalId: modalId } = modal;
        /**
     * Handle the mouseout dom event
     * @param {Event} event
     */ function triggerExitModal(event) {
            if (exitModalTriggered[modalId]) return;
            if (!event.toElement && !event.relatedTarget) {
                that.show(modalId);
                exitModalTriggered[modalId] = true;
            }
        }
        document.addEventListener('mouseout', triggerExitModal);
        this.exitModalEventListeners.push(triggerExitModal);
    }
    /**
   * Attach events for timer Modals
   * @param {Modal} modal
   */ _timerModalHandler(modal) {
        const { modalId: modalId, timerDelay: timerDelay } = modal;
        setTimeout(()=>{
            this.show(modalId);
        }, timerDelay);
    }
    /**
   * Attach events for Forced Modals
   * @param {Modal} modal
   */ _forcedModalHandler(modal) {
        const { modalId: modalId } = modal;
        const { window: window, document: document } = this;
        const isLoggedIn = window.localStorage.getItem('isSignedUp') === 'true';
        if (!isLoggedIn) {
            // watch for event triggering success login
            const forcedModal = document.querySelector(`#modal-${modalId}`);
            const contactForm = forcedModal?.querySelector('form');
            const MODAL_CLOSE_DELAY = contactForm?.dataset.delay || (0, $a3e97e89bbc2a366$export$f037eeffb5561205);
            // form submit autoclose is handled by contactForms controller
            contactForm.addEventListener('formsubmitted', ()=>{
                this.setLoginState();
            });
            window.addEventListener('oauthSuccess', ()=>{
                this.setLoginState();
                contactForm.classList.add('success');
                setTimeout(()=>{
                    window.lpUI.hideModal(`modal-${modalId}`);
                    contactForm.reset();
                    contactForm.classList.remove('success');
                }, MODAL_CLOSE_DELAY);
            });
            this.show(modalId, {
                forced: true
            });
        }
    }
}


/* eslint-disable import/prefer-default-export */ /* global window */ /* eslint-disable import/prefer-default-export */ /**
 * Handle navigation push
 * @param {string} href
 * @param {boolean} _blank
 */ const $fc0a058ae42af628$export$95e8d77caafa3e06 = (href, _blank = false)=>{
    if (!href) return;
    if (_blank) {
        window.open(href);
        return;
    }
    window.location.assign(href);
};
const $fc0a058ae42af628$export$267a1435fe18b8d4 = (obj, path, defValue)=>{
    if (!path) return undefined;
    const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g);
    const result = pathArray.reduce((prevObj, key)=>prevObj && prevObj[key], obj);
    return result === undefined ? defValue : result;
};



class $d48f9f944810f613$export$ca3218b7861b9cb0 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    /**
   * Initialize Button Controller at build time
   * @param { ConfigController } config
   * @param {Window} window
   * @param {Document} document
   */ constructor(config, window, document){
        super(config, window, document);
        this._boundClickHandler = this._buttonClickHandler.bind(this);
    }
    /**
   * Initialize Button Controller at run time
   * Attach handlers and events to DOM
   * @param {Object} options
   */ initialize(options = {}) {
        try {
            const { document: document } = this;
            document.body.removeEventListener('click', this._boundClickHandler);
            document.body.addEventListener('click', this._boundClickHandler);
        } catch (e) {
            // eslint-disable-next-line no-console
            console.error(e);
        }
    }
    /**
   * Controllers must implement a "destroy" method to be called
   * after page navigation to remove event handlers / cleanup
   */ destroy() {
        const { document: document } = this;
        document.body.removeEventListener('click', this._boundClickHandler);
    }
    /**
   * Buttons click handler
   * @param {event} e
   */ _buttonClickHandler(e) {
        this._handleButtonClick(e).catch((e)=>console.error(e));
    }
    /**
   * Handle button click
   * We need special function to have easy way to detach listener
   * @param {Event} e
   */ async _handleButtonClick(e) {
        const { window: window, document: document } = this;
        const button = e.target.closest('button, a');
        if (!button) return;
        const type = button.dataset.type || '';
        const href = button.href || button.dataset.href || '';
        const target = button.target || '';
        const { submit: submit } = button.dataset;
        if (submit) {
            try {
                await this._handleSubmit(button);
            } catch (err) {
                // eslint-disable-next-line no-console
                console.error(err);
            }
            (0, $fc0a058ae42af628$export$95e8d77caafa3e06)(href, target === '_blank');
        }
        this._trackConversion(button);
        if (type === 'VIDEO') {
            this._handleVideoButton(button);
            return;
        }
        if (type === 'CONTACT_US') {
            this._handleContactUsButton(button);
            return;
        }
        if (type === 'SUBSCRIBE') {
            // TODO: Extend for an overwritten subscribe
            window.lpUI.showModal('modal-global-subscribe');
            return;
        }
        if (type === 'MY_ACCOUNT') {
            // TODO: Extend for an overwritten subscribe
            window.lpUI.showModal('modal-global-my-account');
            return;
        }
        if (type === 'SHARE_POPUP') {
            // TODO: Extend for an overwritten subscribe
            const sharePopup = button.querySelector('.share-popup');
            if (sharePopup) sharePopup.style.display = 'flex';
            e.stopPropagation(); // this may not work in current 'delegate' mode
            return;
        }
        // Custom modals
        if (type.substring(0, 6) === 'MODAL_') {
            const modalId = type.substring(6);
            window.lpUI.showModal(`modal-${modalId}`);
            return;
        }
        // MAILTO / TEL Event
        if (href?.startsWith('mailto:')) {
            const email = href.substring(7);
            // TODO: Replace with SDK method
            document.sendGoogleAnalyticsEvent({
                hitType: 'event',
                eventCategory: 'button',
                eventAction: 'click',
                eventLabel: 'Email',
                eventValue: email
            });
        } else if (href?.startsWith('tel:')) {
            const phoneNumber = href.substring(4);
            // TODO: Replace with SDK method
            document.sendGoogleAnalyticsEvent({
                hitType: 'event',
                eventCategory: 'button',
                eventAction: 'click',
                eventLabel: 'Phone',
                eventValue: phoneNumber
            });
        }
    }
    /**
   * Handle submit
   * @param {HTMLButtonElement|HTMLAnchorElement} button
   */ async _handleSubmit(button) {
        const form = button.closest('form');
        const { window: window } = this;
        if (form) return await window.luxuryPresence.contactForms.submitForm(form);
        return null;
    }
    _getVimeoSrc(link) {
        if (!link || !link.includes('vimeo.com') || link.length > 2000) return null;
        const matchResult = link.match(/(?:(?:www\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^/]*)\/videos\/|)|player.vimeo.com\/video\/)(\d+)(?:(?:\?.*&*h=|\/)+([\d,a-f]+))?/);
        if (!matchResult) return null;
        const [, vimeoId, vimeoHashParameter] = matchResult;
        let src = `https://player.vimeo.com/video/${vimeoId}?`;
        if (vimeoHashParameter) src += `h=${vimeoHashParameter}&`;
        src += 'autoplay=1';
        return src;
    }
    /**
   * Handle type video click
   * @param {HTMLElement} button
   */ // eslint-disable-next-line sonarjs/cognitive-complexity
    _handleVideoButton(button) {
        const { document: document } = this;
        const section = button.closest('section');
        // Embed youtube/vimeo video url
        let { src: src } = button.dataset;
        let youtubeId = '';
        if (src && (src.includes('youtube.com') || src.includes('youtu.be')) && !src.includes('youtube.com/embed')) {
            // test link: https://regexr.com/3anm9
            const youtubeRegex = /(?:youtube\.com\/\S*(?:(?:\/e(?:mbed))?\/|watch\?(?:\S*?&?v=))|youtu.be\/)([a-zA-Z0-9_-]{6,11})/;
            const youtubeResult = src.match(youtubeRegex);
            // eslint-disable-next-line
            if (youtubeResult) youtubeId = youtubeResult[1];
        }
        const vimeoSrc = this._getVimeoSrc(src);
        if (youtubeId) src = `https://youtube.com/embed/${youtubeId}?autoplay=1&controls=0`;
        else if (vimeoSrc) src = vimeoSrc;
        if (!src || !section) return;
        const isVideoFile = src.endsWith('.mp4') || src.endsWith('.webm') || src.includes('cloudinary.com');
        const modalHtml = `
      <div id="modal-${section.id}" class="modal visible">
        <div class="modal-content">
          <div class="lightbox-video">
            <div class="video-player">
              <div class="embed-container">
                ${isVideoFile ? `<video controls autoplay src="${src}"></video>` : `<iframe frameborder="0" allowfullscreen="1" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" title="YouTube video player" width="100%" height="100%" src="${src}"></iframe>`}
              </div>
            </div>
          </div>
        </div>
        <button class="close lp-close" type="button" aria-label="close modal"><span class="lp-close-icon" aria-hidden="true"></span></button>
      </div>
    `;
        document.body.insertAdjacentHTML('beforeend', modalHtml);
        const modal = document.getElementById(`modal-${section.id}`);
        const closeModal = modal.querySelector('.close');
        closeModal.addEventListener('click', ()=>{
            modal.remove();
        });
    }
    /**
   * Handle type contact us click
   * @param {HTMLElement} button
   */ _handleContactUsButton(button) {
        const { window: window, document: document } = this;
        // TODO: Extend for an overwritten contact us
        document.sendGoogleAnalyticsEvent({
            hitType: 'event',
            eventCategory: 'button',
            eventAction: 'click',
            eventLabel: 'contact'
        });
        window.lpUI.showModal('modal-global-contact-us', {
            scrollLock: true
        });
    }
    /**
   * Track conversion
   * @param {HTMLElement} button
   */ _trackConversion(button) {
        const { window: window, document: document } = this;
        // Conversion Tracking Options
        const { gtagConversionId: gtagConversionId, gtagConversionLabel: gtagConversionLabel, fbEventName: fbEventName } = button.dataset;
        if (gtagConversionId && gtagConversionLabel) {
            if (window.dataLayer && window.dataLayer.length) {
                const configured = window.dataLayer.some((layer)=>layer.length && layer[0] === 'config' && layer[1] === gtagConversionId);
                if (!configured) document.sendGoogleTagManagerEvent('config', gtagConversionId);
            }
            const sentTo = `${gtagConversionId}/${gtagConversionLabel}`;
            document.sendGoogleTagManagerEvent('event', 'conversion', {
                send_to: sentTo
            });
        }
        if (window.fbq && fbEventName) window.fbq('track', fbEventName, {});
    }
}


/* eslint-disable import/prefer-default-export */ 
class $68a2d4aa500c7a05$export$61ec8f2b6291ec31 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    /**
   * Initialize Validation Controller at build time
   * @param { ConfigController } config
   * @param {Window} window
   * @param {Document} document
   */ constructor(config, window, document){
        super(config, window, document);
        this.validatedForms = [];
    }
    /**
   * Initialize Contact Form Controller at run time
   * Attach handlers and events to DOM
   * @param {Object} options
   */ initialize(options = {}) {
        try {
            const { window: window, document: document } = this;
            const { selector: selector } = options;
            let validatedForms = [];
            if (selector) validatedForms = document.querySelectorAll(`${selector} form[data-type="contact-form"]`);
            else validatedForms = document.querySelectorAll('form[data-type="contact-form"]');
            const isPhoneValidationLibRequired = !!document.querySelectorAll('input[type="tel"]').length;
            // we are loading the phone validation lib from the globally defined list of libs
            if (isPhoneValidationLibRequired && !window.libphonenumber && window?.luxuryPresence?.libs) {
                const { loadJs: loadJs, jsLibsMap: jsLibsMap } = window.luxuryPresence.libs;
                const { libphonenumber: libphonenumber } = jsLibsMap;
                loadJs(libphonenumber.jsSrc, this.attachValidation.bind(this, validatedForms));
            } else this.attachValidation(validatedForms);
            this.validatedForms = this.validatedForms.concat(validatedForms);
        } catch (e) {
            // eslint-disable-next-line no-console
            console.log(e);
        }
    }
    /**
   * Controllers must implement a "destroy" method to be called
   * after page navigation to remove event handlers / cleanup
   */ destroy() {
        this.validatedForms = [];
    }
    /**
   * Validate all forms in the document
   * @param {NodeListOf<HTMLFormElement>} forms
   */ attachValidation(forms) {
        forms.forEach((form)=>{
            const inputs = form.querySelectorAll('input, select, textarea');
            inputs.forEach((input)=>{
                this.applyFieldValidation(input);
            });
        });
    }
    /**
   * Field Validation Handler from global context
   * @param {HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement} inputField
   */ applyFieldValidation(inputField) {
        const fieldType = inputField.getAttribute('type');
        if (fieldType === 'tel') this._applyPhoneValidation(inputField);
    }
    /**
   * Phone Field Validation Handler
   * @param {HTMLInputElement} inputField
   */ _applyPhoneValidation(inputField) {
        const { window: window } = this;
        if (window.libphonenumber) {
            // https://codepen.io/coinscope/pen/BaXBvBp?editors=1010
            const phoneUtil = window.libphonenumber.isValidPhoneNumber;
            inputField.addEventListener('keyup', function() {
                if (this.hasAttribute('required') || this.value.replace(/\s/g, '').length) try {
                    const phoneNumber = this.value;
                    const region = 'US';
                    const isValidNumber = phoneUtil(phoneNumber, region);
                    if (!isValidNumber) this.setCustomValidity('Please enter a valid phone number.');
                    else this.setCustomValidity('');
                } catch (e) {
                    this.setCustomValidity('Please enter a valid phone number.');
                }
                else this.setCustomValidity('');
            });
        }
    }
}





const $2aefad83322125c9$var$homeValuationRoute = '/api/v1/home-valuation';
class $2aefad83322125c9$export$2e2bcd8739ae039 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    destroy() {
    //
    }
    /**
   * Clean address string by removing call time frame suffix and extra whitespace
   *
   * Handles 17 templates that append ", call time frame: [value]" to the address:
   * - TheTrailblazerSir_2, TheMasterpiece (2x), TheInspirationSir_1, TheIconSir_3
   * - Influencer, GlobalCollective, Evolution, CorcoranAgent_1
   * - CompassSE (2x), CompassPrestige (2x), CompassNavigator
   * - ColdwellBanker (2x), Classic
   *
   * @param {string} address - Raw address string that may contain time frame info
   * @return {string} - Cleaned address string
   */ _cleanAddressString(address) {
        if (!address || typeof address !== 'string') return '';
        let cleaned = address.trim();
        // Fix 1: Handle "User entered address:\n..." pattern from TheProducer templates
        // Extract only the user entered address, ignore geocoded part
        if (cleaned.includes('User entered address:')) {
            const match = cleaned.match(/User entered address:\s*\n?\s*([^\n]+)/);
            if (match && match[1]) cleaned = match[1].trim();
        }
        // Fix 2: Remove ", call time frame: ..." suffix if present (affects 17 templates)
        const timeFrameIndex = cleaned.indexOf(', call time frame:');
        if (timeFrameIndex !== -1) cleaned = cleaned.substring(0, timeFrameIndex).trim();
        return cleaned;
    }
    /**
   * Transform Google Maps address components to structured format
   * @param {Array} addressComponents - Google Maps address components
   * @return {Object} - Structured address object
   */ _transformAddressComponents(addressComponents) {
        const get = (t)=>(addressComponents.find((c)=>c.componentType === t) || {}).componentName?.text;
        const structuredAddress = {};
        const streetNumber = get('street_number');
        const streetName = get('route');
        const state = get('administrative_area_level_1');
        const zipcode = get('postal_code');
        const addressLine2 = get('subpremise');
        // explicit precedence for city
        const city = get('locality') || get('sublocality_level_1') || get('neighborhood');
        if (streetNumber) structuredAddress.streetNumber = streetNumber;
        if (streetName) structuredAddress.streetName = streetName;
        if (city) structuredAddress.city = city;
        if (state) structuredAddress.state = state;
        if (zipcode) structuredAddress.zipcode = zipcode;
        if (addressLine2) structuredAddress.addressLine2 = addressLine2;
        return structuredAddress;
    }
    /**
   * Extract address and coordinates from Google Maps validation data
   * @param {Object} validatedAddressData - Google Maps validation result
   * @return {Object} - Object containing structuredAddress and coordinates
   */ _extractAddressAndCoordinates(validatedAddressData) {
        let structuredAddress = null;
        let coordinates = null;
        if (validatedAddressData?.result) {
            const { result: result } = validatedAddressData;
            // Extract structured address components
            if (result.address?.addressComponents) structuredAddress = this._transformAddressComponents(result.address.addressComponents);
            // Extract coordinates
            if (result.geocode?.location) coordinates = {
                latitude: result.geocode.location.latitude,
                longitude: result.geocode.location.longitude
            };
        }
        return {
            structuredAddress: structuredAddress,
            coordinates: coordinates
        };
    }
    /**
   * Filter out empty string values from an object, keeping only non-empty values
   * @param {Object} obj - Object to filter
   * @return {Object} - Filtered object without empty strings
   */ _filterEmptyStrings(obj) {
        const filtered = {};
        for (const [key, value] of Object.entries(obj))if (value !== '' && value !== null && value !== undefined) filtered[key] = value;
        return filtered;
    }
    /**
   * Extract raw address from form data with priority fallback chain.
   * Order is critical to handle 38 home valuation templates with different field naming:
   *
   * IMPORTANT: contactForms.js (line 189) stores name="message" in comments_attributes[0].text
   * because 'message' is in DEFAULT_LEAD_FIELDS. Fields NOT in DEFAULT_LEAD_FIELDS go to content.
   *
   * Priority (most specific → most generic):
   * 1. address           - Pattern 1: 9 templates (explicit address, stored in content)
   * 2. property-address  - Pattern 3: 4 templates (dash variant with JS, stored in content)
   * 3. property_address  - Pattern 4: 3 templates (underscore, stored in content - handles VanguardProperties!)
   * 4. Property_Address  - Pattern 5: 1 template (capital P - TheProducer/HomeValuationRansomHouse, stored in content)
   * 5. comments_attributes[0].text - Pattern 2: ALL 17 templates with name="message" store HERE!
   *                                   (e.g., Evolution/HomeValuation, TheProducer/HomeValuation, etc.)
   * 6. message           - Pattern 6: 4 templates with JS-populated message (rare, checked last)
   * 7-8. homeValuationAddress, propertyAddress - Legacy/unknown formats
   *
   * Critical: Each field is cleaned BEFORE checking, so dropdown values are skipped and we try next field
   *
   * @param {Object} data - Form data
   * @return {string} - Raw address string (may contain trailing text like ", call time frame: ...")
   */ _getRawAddress(data) {
        const content = data.activity.content || {};
        const comments = data.activity.comments_attributes?.[0]?.text;
        const possibleFields = [
            content.address,
            content['property-address'],
            content.property_address,
            content.Property_Address,
            comments,
            content.message,
            content.homeValuationAddress,
            content.propertyAddress
        ];
        return possibleFields.map((field)=>field && this._cleanAddressString(field)).find(Boolean) || '';
    }
    /**
   * Logs lead-related events for monitoring
   * @param {string} eventType - Type of event
   * @param {Object} data - Form data
   * @param {Error} error - Optional error object
   */ _logLeadEvent(eventType, data, error = null) {
        const eventPayload = {
            event: eventType,
            companyId: this.config.companyId,
            websiteId: this.config.websiteId,
            timestamp: new Date().toISOString(),
            hasEmail: !!data.activity?.author_email,
            hasAddress: !!this._getRawAddress(data)
        };
        if (error) {
            // Use userMessage (sanitized) instead of raw message to prevent PII exposure
            // userMessage is set by _getUserFriendlyErrorMessage() which provides safe messages
            eventPayload.errorMessage = error.userMessage || (error.status ? `Request failed with status ${error.status}` : 'An error occurred');
            eventPayload.errorName = error.name;
            eventPayload.errorStatus = error.status;
        }
        // Log to console with structured format for log aggregation
        // eslint-disable-next-line no-console
        console.error(`[HomeValuation] ${eventType}`, JSON.stringify(eventPayload));
        // If PostHog is available, send event for analytics
        // Wrap in try/catch to prevent SDK failures from blocking submissions
        if (this.window.posthog) try {
            this.window.posthog.capture(eventType, eventPayload);
        } catch (posthogError) {
            // eslint-disable-next-line no-console
            console.error('[HomeValuation] PostHog capture failed:', posthogError);
        }
    }
    /**
   * Maps error types to user-friendly messages
   * @param {Error} error - The error object
   * @returns {string} - User-friendly message
   */ _getUserFriendlyErrorMessage(error) {
        if (error.name === 'AbortError' || error.message?.includes('timeout')) return 'Connection timed out. Please try again.';
        if (error.name === 'TypeError' && error.message?.includes('fetch')) return 'Unable to connect. Please check your internet connection and try again.';
        if (error.status === 503 || error.status === 502 || error.status === 504) return 'Service temporarily unavailable. Please try again in a moment.';
        if (error.status === 400) return 'Please check your information and try again.';
        return 'Something went wrong. Please try again or contact us directly.';
    }
    /**
   * Build formatted address string from structured address components
   * @param {Object} structuredAddress - Structured address object
   * @return {string} - Formatted address string
   */ _formatStructuredAddress(structuredAddress) {
        if (!structuredAddress || Object.keys(structuredAddress).length === 0) return '';
        const parts = [];
        // Line 1: streetNumber streetName addressLine2
        const line1 = [
            structuredAddress.streetNumber,
            structuredAddress.streetName,
            structuredAddress.addressLine2
        ].filter(Boolean).join(' ');
        parts.push(line1);
        // Line 2: city, state zipcode
        const cityState = [
            structuredAddress.city,
            structuredAddress.state
        ].filter(Boolean).join(', ');
        const line2 = [
            cityState,
            structuredAddress.zipcode
        ].filter(Boolean).join(' ');
        parts.push(line2);
        return parts.filter(Boolean).join(', ');
    }
    /**
   * Build home valuation data object
   * @param {Object} data - Form data
   * @param {string} homeValuationEstimate - Home valuation estimate
   * @param {Object} structuredAddress - Structured address object
   * @param {Object} coordinates - Coordinates object
   * @return {Object} - Home valuation data object
   */ _buildHomeValuationData(data, homeValuationEstimate, structuredAddress, coordinates) {
        // Build homeValuationAddress from structured address (validated by Google) if available
        // Format: streetNumber streetName, city, state zipcode, addressLine2
        const homeValuationAddress = this._formatStructuredAddress(structuredAddress) || this._getRawAddress(data);
        // Validate that we have an address before proceeding
        if (!homeValuationAddress) throw new Error('Unable to extract home valuation address from form data');
        // Required fields that must always be included
        const requiredFields = {
            companyId: data.companyId,
            homeValuationAddress: homeValuationAddress,
            homeValuationEstimate: homeValuationEstimate ? new Intl.NumberFormat('en-US', {
                style: 'currency',
                currency: 'USD',
                maximumFractionDigits: 0,
                minimumFractionDigits: 0
            }).format(homeValuationEstimate) : null,
            websiteId: data.page.websiteId,
            sourceUrl: data.activity.source_url
        };
        // Optional fields that will be filtered if empty
        const optionalFields = {
            leadEmailAddress: data.activity.author_email,
            leadFullName: data.activity.author_name,
            leadPhoneNumber: data.activity.author_phone,
            parcelId: data.activity.content?.parcelId,
            resourceId: data.page.pageMeta?.resourceId,
            pageId: data.page.pageId,
            sourceResource: data.page.pageMeta?.sourceResource,
            pageElementId: data.page.pageMeta?.pageElementId,
            formId: data.page.pageMeta?.formId,
            utmSource: data.activity.content?.utm_source,
            utmMedium: data.activity.content?.utm_medium,
            utmCampaign: data.activity.content?.utm_campaign,
            utmTerm: data.activity.content?.utm_term,
            utmContent: data.activity.content?.utm_content,
            utmId: data.activity.content?.utm_id,
            timeToSell: data.activity.content?.timeToSell,
            lookingToBuy: data.activity.content?.lookingToBuy,
            referrer: data.referrer,
            content: data.activity.content || {},
            fields: data.fields || {}
        };
        // Filter out empty strings from optional fields
        const filteredOptionalFields = this._filterEmptyStrings(optionalFields);
        return {
            ...requiredFields,
            ...filteredOptionalFields,
            // Add structured address and coordinates if they exist
            ...structuredAddress && {
                address: structuredAddress
            },
            ...coordinates && {
                coordinates: coordinates
            }
        };
    }
    /**
   * Validate address with Google Maps
   * @param {string} rawAddress - Raw address string
   * @returns {Promise<Object|null>} - Validated address data or null
   * @throws {Error} - If validation fails, error is thrown with userMessage
   */ async _validateAddressSafely(rawAddress) {
        if (!rawAddress) {
            // eslint-disable-next-line no-console
            console.error('Home valuation: No address found in form data');
            return null;
        }
        try {
            return await this._validateAddressWithGoogleMaps(rawAddress);
        } catch (error) {
            // eslint-disable-next-line no-console
            console.error('Error validating address with Google Maps:', error);
            // Attach user-friendly message and throw so user sees the error
            error.userMessage = this._getUserFriendlyErrorMessage(error);
            throw error;
        }
    }
    /**
   * Get home valuation estimate
   * @param {Object} validatedAddressData - Validated address data
   * @returns {Promise<number|null>} - Home valuation estimate or null
   * @throws {Error} - If estimate fetch fails, error is thrown with userMessage
   */ async _getHomeValuationEstimateSafely(validatedAddressData) {
        try {
            return await this._getHomeValuationEstimate(validatedAddressData);
        } catch (error) {
            // eslint-disable-next-line no-console
            console.error('Error getting home valuation estimate:', error);
            // Attach user-friendly message and throw so user sees the error
            error.userMessage = this._getUserFriendlyErrorMessage(error);
            throw error;
        }
    }
    /**
   * Parse response text into payload object
   * @param {string} text - Response text
   * @returns {Object} - Parsed payload
   */ _parseResponsePayload(text) {
        try {
            return text ? JSON.parse(text) : {};
        } catch  {
            return {
                raw: text
            };
        }
    }
    /**
   * Create error from failed response
   * @param {Object} payload - Response payload
   * @param {number} status - HTTP status code
   * @returns {Error} - Error object with status and payload
   */ _createResponseError(payload, status) {
        const errorMessage = payload && typeof payload === 'object' && Object.keys(payload).length ? payload.message || JSON.stringify(payload) : 'Request failed';
        const error = new Error(errorMessage);
        // Preserve payload properties if it's an object
        if (payload && typeof payload === 'object' && Object.keys(payload).length) Object.assign(error, payload);
        // Preserve numeric HTTP status - must be set after Object.assign
        // to ensure it takes precedence over any status in payload
        error.status = status;
        return error;
    }
    /**
   * Submit lead to API endpoint
   * @param {string} leadRoute - API endpoint URL
   * @param {Object} homeValuationData - Data to submit
   * @returns {Promise<Object>} - Submission result
   */ async _submitLead(leadRoute, homeValuationData) {
        const controller = new AbortController();
        const timeoutId = setTimeout(()=>controller.abort(), 10000);
        try {
            const response = await fetch(leadRoute, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(homeValuationData),
                signal: controller.signal
            });
            clearTimeout(timeoutId);
            const text = await response.text();
            const payload = this._parseResponsePayload(text);
            if (!response.ok) throw this._createResponseError(payload, response.status);
            if (payload && payload.status === 'success' && payload.redirectUrl) {
                this.window.location.href = payload.redirectUrl;
                return {
                    redirected: true,
                    url: payload.redirectUrl
                };
            }
            return payload;
        } catch (error) {
            clearTimeout(timeoutId);
            throw error;
        }
    }
    /**
   * Submit home valuation request with Google Maps validation
   * @param {Object} data
   * @return {Promise<Object>}
   */ async _submitHomeValuationRequest(data) {
        const { config: config } = this;
        // Use websiteApiGatewayUrl from config
        if (!config.websiteApiGatewayUrl) throw new Error('websiteApiGatewayUrl not configured for home valuation');
        // Log submission started
        this._logLeadEvent('home_valuation_submission_started', data);
        try {
            // Validate address with Google Maps
            const rawAddress = this._getRawAddress(data);
            let validatedAddressData = null;
            try {
                validatedAddressData = await this._validateAddressSafely(rawAddress);
            } catch (error) {
                // Error already has userMessage from _validateAddressSafely
                this._logLeadEvent('home_valuation_address_validation_failed', data, error);
                throw error;
            }
            // Get home valuation estimate.
            // The estimate is best-effort: many valid properties (e.g. commercial
            // parcels or addresses without AVM coverage) have no estimate and the
            // estimate endpoint returns a non-OK status for them. A missing estimate
            // must never block lead capture, so we log the failure and continue with
            // a null estimate rather than aborting the whole submission.
            let homeValuationEstimate = null;
            try {
                homeValuationEstimate = await this._getHomeValuationEstimateSafely(validatedAddressData);
            } catch (error) {
                // Error already has userMessage from _getHomeValuationEstimateSafely
                this._logLeadEvent('home_valuation_estimate_failed', data, error);
                homeValuationEstimate = null;
            }
            // Extract structured address and coordinates from Google Maps validation
            const { structuredAddress: structuredAddress, coordinates: coordinates } = this._extractAddressAndCoordinates(validatedAddressData);
            const leadRoute = `${config.websiteApiGatewayUrl}${$2aefad83322125c9$var$homeValuationRoute}`;
            const homeValuationData = this._buildHomeValuationData(data, homeValuationEstimate, structuredAddress, coordinates);
            const result = await this._submitLead(leadRoute, homeValuationData);
            // Log success
            this._logLeadEvent('home_valuation_submission_success', data);
            return result;
        } catch (error) {
            // Ensure error has user-friendly message (may already be set by helper methods)
            if (!error.userMessage) error.userMessage = this._getUserFriendlyErrorMessage(error);
            this._logLeadEvent('home_valuation_submission_failed', data, error);
            throw error;
        }
    }
    /**
   * Validate address using Google Maps Address Validation API
   * @param {string} addressStr - The address string to validate
   * @returns {Promise<Object|null>} - Validated address data or null if validation fails
   */ async _validateAddressWithGoogleMaps(addressStr) {
        const { config: config, window: window } = this;
        // Ensure Google Maps API key is loaded
        let apiKey = config.googleMapsAPIKey;
        if (!apiKey && window.luxuryPresence?.mapApiLoader) apiKey = await window.luxuryPresence.mapApiLoader.getMapApiKey();
        if (!apiKey) throw new Error('Google Maps API key not configured');
        const controller = new AbortController();
        const timeoutId = setTimeout(()=>controller.abort(), 10000);
        try {
            const response = await fetch(`https://addressvalidation.googleapis.com/v1:validateAddress?key=${apiKey}`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    address: {
                        addressLines: [
                            addressStr
                        ]
                    },
                    enableUspsCass: false
                }),
                signal: controller.signal
            });
            clearTimeout(timeoutId);
            if (!response.ok) {
                const error = new Error(`Address validation failed: ${response.status}`);
                error.status = response.status;
                throw error;
            }
            return response.json();
        } catch (error) {
            clearTimeout(timeoutId);
            throw error;
        }
    }
    /**
   * Check if structured address has all mandatory fields
   * @param {Object} structuredAddress - Structured address object
   * @return {boolean}
   */ _hasMandatoryAddressFields(structuredAddress) {
        return !!(structuredAddress.streetNumber && structuredAddress.streetName && structuredAddress.city && structuredAddress.state && structuredAddress.zipcode);
    }
    /**
   * Log missing mandatory address fields
   * @param {Object} structuredAddress - Structured address object
   */ _logMissingAddressFields(structuredAddress) {
        const missingFields = [];
        if (!structuredAddress.streetNumber) missingFields.push('streetNumber');
        if (!structuredAddress.streetName) missingFields.push('streetName');
        if (!structuredAddress.city) missingFields.push('city');
        if (!structuredAddress.state) missingFields.push('state');
        if (!structuredAddress.zipcode) missingFields.push('zipcode');
        // eslint-disable-next-line no-console
        console.log('Home valuation estimate skipped - missing required fields:', missingFields.join(', '), 'Available fields:', Object.keys(structuredAddress).join(', '));
    }
    /**
   * Build query string from structured address
   * @param {Object} structuredAddress - Structured address object
   * @return {string}
   */ _buildAddressQueryString(structuredAddress) {
        return Object.entries(structuredAddress).map(([key, value])=>`${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join('&');
    }
    /**
   * GET home valuation estimate
   * @param {string} address
   * @param {Object} validatedAddressData - Google Maps validated address data
   * @return {Promise<number|null>}
   */ async _getHomeValuationEstimate(validatedAddressData = null) {
        const { config: config } = this;
        if (!config.websiteApiGatewayUrl) throw new Error('websiteApiGatewayUrl not configured');
        const base = `${config.websiteApiGatewayUrl}${$2aefad83322125c9$var$homeValuationRoute}`;
        // Check if we have validated address data
        if (!validatedAddressData?.result?.address?.addressComponents) return null;
        const structuredAddress = this._transformAddressComponents(validatedAddressData.result.address.addressComponents);
        // Check if all mandatory fields exist
        if (!this._hasMandatoryAddressFields(structuredAddress)) {
            this._logMissingAddressFields(structuredAddress);
            return null;
        }
        // Build URL with query string
        const qs = this._buildAddressQueryString(structuredAddress);
        const homeValURL = `${base}?${qs}`;
        const controller = new AbortController();
        const timeoutId = setTimeout(()=>controller.abort(), 10000);
        try {
            const response = await fetch(homeValURL, {
                headers: {
                    Accept: 'application/json'
                },
                signal: controller.signal
            });
            clearTimeout(timeoutId);
            if (!response.ok) {
                const error = new Error(`Home valuation estimate failed: ${response.status}`);
                error.status = response.status;
                throw error;
            }
            const data = await response.json();
            return data?.valueDollars ?? null;
        } catch (error) {
            clearTimeout(timeoutId);
            // Re-throw to allow retry logic to handle it
            throw error;
        }
    }
}


const $e10bd00497be8876$export$97de66002300ed70 = 'middleName';
// Default lead fields
const $e10bd00497be8876$var$DEFAULT_LEAD_FIELDS = [
    'name',
    'firstName',
    'lastName',
    $e10bd00497be8876$export$97de66002300ed70,
    'email',
    'phone',
    'phoneNumber',
    'source',
    'message',
    'mlsId',
    'sourceUrl'
];
class $e10bd00497be8876$export$3c5380623cf51249 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    /**
   * Initialize Contact Form Controller at build time
   * @param { ConfigController } config
   * @param {Window} window
   * @param {Document} document
   */ constructor(config, window, document){
        super(config, window, document);
        this.forms = [];
        this.homeValuationService = new (0, $2aefad83322125c9$export$2e2bcd8739ae039)(config, window, document);
    }
    /**
   * Initialize Contact Form Controller at run time
   * Attach handlers and events to DOM
   * @param {Object} options
   */ initialize(options = {}) {
        try {
            const { document: document } = this;
            const { selector: selector } = options;
            let forms = [];
            if (selector) forms = document.querySelectorAll(`${selector} form[data-type="contact-form"]`);
            else forms = document.querySelectorAll('form[data-type="contact-form"]');
            forms.forEach((form)=>{
                this._attachSubmitHandler(form);
            // this._attachValidation(form);
            });
            this.forms = this.forms.concat(forms);
        } catch (e) {
            // eslint-disable-next-line no-console
            console.log(e);
        }
    }
    /**
   * Controllers must implement a "destroy" method to be called
   * after page navigation to remove event handlers / cleanup
   */ destroy() {
        this.forms = [];
    }
    /**
   * Handle submit from global context
   * @param {HTMLFormElement} form
   */ submitForm(form) {
        this._handleSubmit(null, form).catch((e)=>console.error(e));
    }
    /**
   * Attach submit event for form
   * @param {HTMLFormElement} contactForm
   */ _attachValidation(contactForm) {
        const { window: window } = this;
        const inputs = contactForm.querySelectorAll('input, select, textarea');
        inputs.forEach((input)=>{
            window.luxuryPresence.validation.applyFieldValidation(input);
        });
    }
    /**
   * Attach submit event for form
   * @param {HTMLFormElement} contactForm
   */ _attachSubmitHandler(contactForm) {
        contactForm.addEventListener('submit', (e)=>this._handleSubmit(e, contactForm));
    }
    /**
   * Extract and process form values
   * @param {HTMLFormElement} contactForm
   * @return {Object} - Processed form values
   */ _extractFormValues(contactForm) {
        const formData = new FormData(contactForm);
        const values = {};
        const nameParts = [];
        const nameKeyRegex = /^name(?:-\d+)?$/;
        formData.forEach((value, key)=>{
            if (typeof value === 'string') {
                const curr = value.trim();
                if (nameKeyRegex.test(key) && curr) nameParts.push(curr);
                const prev = values[key];
                values[key] = prev ? `${prev} ${curr}` : curr;
            } else values[key] = value;
        });
        if (nameParts.length) values.name = nameParts.join(' ').trim();
        else if (!values.name && values.firstName) {
            values.name = values.firstName;
            if (values.lastName) values.name += ` ${values.lastName}`;
        }
        return values;
    }
    /**
   * Build submission data object
   * @param {Object} values - Form values
   * @param {Object} fields - Form fields
   * @param {HTMLFormElement} contactForm - Form element
   * @return {Object} - Submission data
   */ _buildSubmissionData(values, fields, contactForm) {
        const { window: window, config: config } = this;
        const content = Object.keys(values).filter((key)=>!$e10bd00497be8876$var$DEFAULT_LEAD_FIELDS.includes(key)).reduce((result, key)=>{
            // eslint-disable-next-line
            result[key] = values[key];
            return result;
        }, {});
        const { pageId: pageId, companyId: companyId, websiteId: websiteId, pageMeta: pageMeta } = config;
        const utm = window.localStorage.getItem('utm_vars') || '{}';
        const referrer = window.localStorage.getItem('referrer') || '';
        const formId = this._getFormId(contactForm);
        return {
            activity: {
                author_email: values.email,
                author_name: values.name,
                author_phone: values.phone || values.phoneNumber,
                activity_source: values.source || 'CONTACT_INQUIRY',
                comments_attributes: [
                    {
                        text: values.message || undefined
                    }
                ],
                source_url: window.location.href,
                content: {
                    ...content,
                    ...JSON.parse(utm)
                }
            },
            page: {
                pageId: pageId,
                companyId: companyId,
                websiteId: websiteId,
                pageMeta: {
                    ...pageMeta,
                    formId: formId
                }
            },
            companyId: companyId,
            referrer: referrer,
            fields: fields
        };
    }
    /**
   * Handle successful form submission
   * @param {HTMLFormElement} contactForm - Form element
   */ _handleSubmissionSuccess(contactForm) {
        const { window: window } = this;
        const closeDelay = contactForm.dataset.delay || (0, $a3e97e89bbc2a366$export$f037eeffb5561205);
        contactForm.classList.remove('loading');
        contactForm.classList.remove('error');
        contactForm.classList.add('success');
        // TODO: Review producer and classic to deprecate "hide"
        contactForm.querySelectorAll('.success').forEach((el)=>el.classList.remove('hide'));
        contactForm.dispatchEvent(new Event('formsubmitted'));
        setTimeout(()=>{
            window.lpUI.hideClosestModal(contactForm);
            contactForm.reset();
            window.lpUI.sideMenuHide();
            contactForm.querySelectorAll('.success').forEach((el)=>el.classList.add('hide'));
            contactForm.classList.remove('success');
        }, closeDelay);
    }
    /**
   * Submit Contact Form Handler
   * @param {Event} e
   * @param {HTMLFormElement} contactForm
   * @return {Promise<Object>}
   */ async _handleSubmit(e, contactForm) {
        if (e) e.preventDefault();
        if (contactForm.classList.contains('loading')) // Form already submitting
        return;
        // Hide any previous error message and clear error state
        this._hideSubmissionError(contactForm);
        contactForm.classList.remove('error');
        contactForm.classList.add('loading');
        try {
            // Extract form values first (before async operations)
            const values = this._extractFormValues(contactForm);
            // TODO: HoneyPot should still send request
            if (values.middleName) {
                contactForm.classList.remove('loading');
                return;
            }
            const fields = this._getFields(contactForm);
            const data = this._buildSubmissionData(values, fields, contactForm);
            await this._submitLeadRequest(data);
            this._sendGAEvent(data);
            this._handleSubmissionSuccess(contactForm);
        } catch (err) {
            // eslint-disable-next-line no-console
            console.error('Form submission failed:', err);
            contactForm.dispatchEvent(new Event('formsubmiterror'));
            contactForm.classList.remove('loading');
            contactForm.classList.add('error');
            // Show user-friendly error message if available (from home valuation service)
            if (err.userMessage) this._showSubmissionError(contactForm, err.userMessage);
            else this._showSubmissionError(contactForm, 'Something went wrong. Please try again.');
        }
    }
    /**
   * Alias anonymous user with canonical ID using event bus
   * Links the user's anonymous browsing session to their canonical identity
   * @param {Object} data - Form submission data
   * @private
   */ _aliasUserWithEventBus(data) {
        try {
            // Check if event bus library and required methods are available
            if (!this.window.eventBusProvider?.alias || !this.window.eventBusProvider?.isIdentified || !this.window.eventBusProvider?.getDistinctId || !this.window.LuxuryPresenceEventBus?.generateUUIDv5FromCompanyEmail) return; // Event bus or required methods not available
            // Skip if user is already identified
            if (this.window.eventBusProvider.isIdentified()) {
                console.log('[EventBus] User already identified, skipping alias');
                return;
            }
            const email = data.activity?.author_email;
            const { companyId: companyId } = this.config;
            if (!email || !companyId) {
                console.warn('[EventBus] Missing required data for user alias');
                return;
            }
            // Get the anonymous distinct ID from PostHog
            const anonId = this.window.eventBusProvider.getDistinctId();
            if (!anonId) {
                console.warn('[EventBus] No anonymous ID available for alias');
                return;
            }
            // Generate deterministic canonical ID from company + email
            const canonicalId = this.window.LuxuryPresenceEventBus.generateUUIDv5FromCompanyEmail(companyId, email);
            // Create alias linking anonymous ID to canonical ID
            this.window.eventBusProvider.alias({
                anonId: anonId,
                canonicalId: canonicalId
            });
            console.log('[EventBus] User aliased with canonical ID');
        } catch (error) {
            // Never block form submission due to analytics errors
            console.error('[EventBus] User alias failed:', error);
        }
    }
    /**
   * Send Lead Request
   * @param {Object} data
   * @return {Promise<Object>}
   */ async _submitLeadRequest(data) {
        const { config: config } = this;
        // Alias user with event bus before submitting the lead
        this._aliasUserWithEventBus(data);
        if (config.myhomeDashboardEnabled && (data.activity?.activity_source === 'HOME_VALUATION' || data.activity?.activity_source === 'HOME_VALUE')) return this.homeValuationService._submitHomeValuationRequest(data);
        const leadRoute = `${config.leadIngesterUrl}/api/v1/leads`;
        return fetch(leadRoute, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(data)
        }).then((response)=>{
            if (!response.ok) return response.json().then((error)=>{
                throw error;
            });
            return response.json();
        });
    }
    /**
   * Send GA event
   * @param {Object} data
   */ _sendGAEvent(data) {
        const { document: document } = this;
        let event = {
            hitType: 'event',
            eventCategory: 'button',
            eventAction: 'click'
        };
        switch(data.activity.activity_source){
            case 'NEWSLETTER_SIGNUP':
                event.eventLabel = 'Newsletter';
                document.sendGoogleTagManagerEvent('event', 'newsletter_signup');
                break;
            case 'HOME_SEARCH':
                event.eventLabel = 'HomeSearch';
                document.sendGoogleTagManagerEvent('event', 'home_search');
                break;
            case 'HOME_VALUE':
            case 'HOME_VALUATION':
                event.eventLabel = 'HomeValue';
                document.sendGoogleTagManagerEvent('event', 'home_valuation');
                break;
            case 'EBOOK':
                event.eventLabel = 'Ebook';
                document.sendGoogleTagManagerEvent('event', 'ebook_download');
                break;
            case 'CONTACT_INQUIRY':
            default:
                // for contact forms, Marketing has requested that they see a page-view of 'thank-you' as indication of success
                // Note that this will break if we have actual page with url of /thank-you
                event = {
                    hitType: 'pageview',
                    page: '/thank-you'
                };
                document.sendGoogleTagManagerEvent('event', 'contact_inquiry');
                break;
        }
        document.sendGoogleAnalyticsEvent(event);
    }
    /**
   * Gather fields / schema for form, used for display in CRM
   * @param {HTMLFormElement} form
   * @return {Object}
   */ _getFields(form) {
        const inputs = form.querySelectorAll('input, select, textarea');
        const fields = {};
        inputs.forEach((input)=>{
            const { id: id, name: name, type: inputType } = input;
            if (name === $e10bd00497be8876$export$97de66002300ed70) // Honeypot continue
            return true;
            let label = '';
            if (id) {
                const labelNode = form.querySelector(`label[for='${id}']`);
                if (labelNode) label = labelNode.textContent.trim();
                else if (input.placeholder) label = input.placeholder.trim();
            }
            fields[name] = {
                label: label,
                type: input.tagName,
                inputType: input.tagName === 'INPUT' ? inputType : 'text'
            };
        });
        return fields;
    }
    /**
   * Figure out relevant section or div ID for form
   * @param {HTMLFormElement} form
   * @return {string}
   */ _getFormId(form) {
        const SELECTORS = "section[id^='section-'], footer[id], .modal[id^='modal-']";
        const parent = form.closest(SELECTORS);
        return parent?.id ? this._cleanFormId(parent.id) : '';
    }
    /**
   * Remove prefix from formID
   * @param {string} formId
   * @return {string}
   */ _cleanFormId(formId) {
        const PREFIXES = [
            'section-',
            'modal-'
        ];
        for (const prefix of PREFIXES){
            if (formId.startsWith(prefix)) return formId.substring(prefix.length);
        }
        return formId;
    }
    /**
   * Show submission error message on form
   * @param {HTMLFormElement} form
   * @param {string} message
   */ _showSubmissionError(form, message) {
        const errorEl = form.querySelector('.submission-error-message');
        if (errorEl) {
            errorEl.textContent = message || 'Something went wrong. Please try again.';
            errorEl.style.display = 'block';
        }
    }
    /**
   * Hide submission error message on form
   * @param {HTMLFormElement} form
   */ _hideSubmissionError(form) {
        const errorEl = form.querySelector('.submission-error-message');
        if (errorEl) errorEl.style.display = 'none';
    }
}



const $ea6901fdf47e0ec1$var$CALLBACK = '__googleMapsCallback';
const $ea6901fdf47e0ec1$var$GOOGLE_MAPS_URL = 'https://maps.googleapis.com/maps/api/js';
const $ea6901fdf47e0ec1$export$76299006759be400 = 1024;
class $ea6901fdf47e0ec1$export$3c19195edca3fa5c extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    /**
   * Initialize Button Controller at build time
   * @param { ConfigController } config
   * @param {Window} window
   * @param {Document} document
   */ constructor(config, window, document){
        super(config, window, document);
        this.retries = 3;
        this.callbacks = [];
        this.id = `__googleMapsScriptId${Date.now()}`;
        this._apiKey = '';
        this.reset();
    }
    /**
   * Set the Google Maps api key
   * @param {string} apiKey
   */ set apiKey(apiKey) {
        this._apiKey = apiKey;
        this.config.setGoogleMapsAPIKey(apiKey);
    }
    /**
   * Get the Google Maps api key
   * @return {string}
   */ get apiKey() {
        return this._apiKey;
    }
    /**
   * Reset the loader state.
   */ reset() {
        this.deleteScript();
        this.done = false;
        this.loading = false;
        this.errors = [];
        this.onerrorEvent = null;
    }
    /**
   * Destroy
   */ destroy() {
        this.reset();
    }
    /**
   * get map api Key
   * @return {Promise<string>}
   */ async getMapApiKey() {
        if (this.apiKey) return this.apiKey;
        try {
            const response = await fetch(`${this._getBaseUrl()}/api/v1/map`);
            if (!response.ok) throw new Error('Failed to fetch API key');
            const code = await response.text();
            this.apiKey = code;
            return this.apiKey;
        } catch (e) {
            // eslint-disable-next-line no-console
            console.error(e);
            return '';
        }
    }
    /**
   * CreateUrl returns the Google Maps JavaScript API script url ].
   * @return {string}
   */ async createUrl() {
        let url = $ea6901fdf47e0ec1$var$GOOGLE_MAPS_URL;
        url += `?callback=${$ea6901fdf47e0ec1$var$CALLBACK}`;
        const apiKey = await this.getMapApiKey();
        if (apiKey) url += `&key=${apiKey}`;
        url += `&libraries=places`;
        return url;
    }
    /**
   * Set the script on document.
   */ async setScript() {
        if (this.document.getElementById(this.id)) {
            this.callback();
            return;
        }
        const url = await this.createUrl();
        const script = this.document.createElement('script');
        script.id = this.id;
        script.type = 'text/javascript';
        script.src = url;
        script.onerror = this.loadErrorCallback.bind(this);
        script.defer = true;
        script.async = true;
        this.document.head.appendChild(script);
    }
    /**
   * Function to be called if script tag fails
   * @param {Error} e
   */ loadErrorCallback(e) {
        this.errors.push(e);
        if (this.errors.length <= this.retries) {
            const delay = this.errors.length * 2 ** this.errors.length;
            // eslint-disable-next-line no-console
            console.log(`Failed to load Google Maps script, retrying in ${delay} ms.`);
            setTimeout(()=>{
                this.deleteScript();
                this.setScript().catch((e)=>console.error(e));
            }, delay);
        } else {
            this.onerrorEvent = e;
            this.callback();
        }
    }
    /**
   * Delete the script tag
   */ deleteScript() {
        const script = this.document.getElementById(this.id);
        if (script) script.remove();
    }
    /**
   * Load the Google Maps JavaScript API script and return a Promise.
   * @return {Promise}
   */ load() {
        return this.loadPromise();
    }
    /**
   * Load the Google Maps JavaScript API script and return a Promise.
   * @return {Promise}
   */ loadPromise() {
        return new Promise((resolve, reject)=>{
            this.loadCallback((err)=>{
                if (!err) resolve();
                else reject(err);
            });
        });
    }
    /**
   * Load the Google Maps JavaScript API script with a callback.
   * @param {Function<Event>} fn
   */ loadCallback(fn) {
        this.callbacks.push(fn);
        this.execute();
    }
    /**
   * Sets the callback function that will be sent as part of the script URL.
   */ setCallback() {
        this.window.__googleMapsCallback = this.callback.bind(this);
    }
    /**
   * Reset if failed
   */ resetIfRetryingFailed() {
        if (this.failed) this.reset();
    }
    /**
   * This is the function that we set the callback parameter to.
   */ callback() {
        this.done = true;
        this.loading = false;
        this.callbacks.forEach((cb)=>{
            cb(this.onerrorEvent);
        });
        this.callbacks = [];
    }
    /**
   * Set the script a if needed; set the callback
   */ execute() {
        if (this.window.google && this.window.google.maps && this.window.google.maps.version) // Google Maps already loaded
        this.callback();
        this.resetIfRetryingFailed();
        if (this.done) this.callback();
        else if (this.loading) ;
        else {
            this.loading = true;
            this.setCallback();
            this.setScript().catch((e)=>console.error(e));
        }
    }
    /**
   * get base url based on current config
   * @return {string}
   */ _getBaseUrl() {
        // Special handling for page builder since no wag available
        const { isBuilder: isBuilder, websiteApiGatewayUrl: websiteApiGatewayUrl } = this.config;
        return isBuilder ? websiteApiGatewayUrl : '';
    }
    /**
   * Resize static map requests to the max 1024px while preserving aspect ratio
   * @param {number} width
   * @param {number} height
   * @return {{width, height}}
   */ resizeStaticMapDimensions(width, height) {
        if (width <= $ea6901fdf47e0ec1$export$76299006759be400 && height <= $ea6901fdf47e0ec1$export$76299006759be400) return {
            width: width,
            height: height
        };
        // Size param ignored if dimensions exceed STATIC_MAP_MAX_DIM
        const ratio = Math.min($ea6901fdf47e0ec1$export$76299006759be400 / width, $ea6901fdf47e0ec1$export$76299006759be400 / height);
        return {
            width: parseInt(width * ratio),
            height: parseInt(height * ratio)
        };
    }
    /**
   * Convert theme to static api param object
   * @param {Object} theme
   * @return {Object}
   */ convertThemeToStaticApiUrl(theme) {
        // https://developers.google.com/maps/documentation/maps-static/style-reference
        // Google Maps Static API uses a special syntax for it's urls based on the interactive map styles
        return theme.map((t)=>{
            const styles = t.stylers.reduce((acc, s)=>{
                const visibility = s.visibility ? `visibility:${s.visibility}` : '';
                const color = s.color ? `color:${s.color.replace('#', '0x')}` : '';
                const lightness = s.lightness ? `lightness:${s.lightness}` : '';
                return `${acc}|${visibility}${color}${lightness}`;
            }, '');
            const element = t.elementType ? `|element:${t.elementType}` : '';
            return `feature:${t.featureType}${element}${styles}`;
        });
    }
    /**
   * generate digital signature for url
   * @param {string} queryString to sign
   * @return {Promise<string>} digitally signed url
   */ async getMapApiSignedUrl(queryString) {
        try {
            const response = await fetch(`${this._getBaseUrl()}/api/v1/map/signature?${queryString}`);
            if (!response.ok) throw new Error('Failed to fetch signed URL');
            const { url: url } = await response.json();
            return url;
        } catch (e) {
            // eslint-disable-next-line no-console
            console.error(e);
            return '';
        }
    }
    /**
   * Generate static map url
   * @param {number} lat
   * @param {number} lng
   * @param {number} zoom
   * @param {Object} theme
   * @param {number} srcWidth
   * @param {number} srcHeight
   * @return {string}
   */ generateStaticMapUrl(lat, lng, zoom, theme, srcWidth, srcHeight) {
        const baseUrl = 'https://maps.googleapis.com/maps/api/staticmap';
        const { width: width, height: height } = this.resizeStaticMapDimensions(srcWidth, srcHeight);
        const query = {
            center: `${lat},${lng}`,
            zoom: zoom,
            scale: 2,
            size: `${width}x${height}`,
            key: this.apiKey
        };
        if (theme) query.style = this.convertThemeToStaticApiUrl(theme);
        const params = new URLSearchParams();
        Object.entries(query).forEach(([key, value])=>{
            if (Array.isArray(value)) value.forEach((v)=>params.append(key, v.toString()));
            else params.append(key, value.toString());
        });
        return `${baseUrl}?${params.toString()}`;
    }
    /**
   * Generate static map url with digital signature
   * @param {Object} {
   *  srcWidth {number}, required
   *  srcHeight {number}, required
   *  theme {array},
   *  center: `${lat},${lng}`, required
   *  zoom: number, required
   *  markers: `${lat},${lng}`,
   *  scale: number,
   *  otherQueryParams... (these must match what is compatible with google maps static api query params)
   * }
   * @return {Promise<string>} digitally signed url
   */ async generateDigitallySignedStaticMapUrl({ srcWidth: srcWidth, srcHeight: srcHeight, theme: theme, ...query }) {
        const { width: width, height: height } = this.resizeStaticMapDimensions(srcWidth, srcHeight);
        const queryParams = {
            ...query,
            size: `${width}x${height}`
        };
        if (theme) queryParams.style = this.convertThemeToStaticApiUrl(theme);
        const params = new URLSearchParams();
        Object.entries(queryParams).forEach(([key, value])=>{
            if (Array.isArray(value)) value.forEach((v)=>params.append(key, v.toString()));
            else params.append(key, value.toString());
        });
        const queryString = params.toString();
        try {
            // fetch digitally signed url
            return await this.getMapApiSignedUrl(queryString);
        } catch (e) {
            console.error(e);
            return '';
        }
    }
}


/* eslint-disable import/prefer-default-export */ 

class $0a0ad49f13c0b8fd$export$ba9afeb75f20f616 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    // constructor is not needed as it is inherited from BaseController
    /**
   * Controllers must implement a "destroy" method to be called
   * after page navigation to remove event handlers / cleanup
   */ destroy() {}
    /**
   * Places (re-places) a value into the query string under specified key
   *   or removes it if new value is null or undefined
   * @param {string} key
   * @param {string|null|undefined|object|array} value
   * @param {string} url - defaults to window.location.href
   * @return {string}
   */ // eslint-disable-next-line sonarjs/cognitive-complexity
    updateQueryString(key, value, url) {
        // https://stackoverflow.com/questions/5999118/how-can-i-add-or-update-a-query-string-parameter
        if (!url) // eslint-disable-next-line
        url = this.window.location.href;
        let re = new RegExp(`([?&])${key}=.*?(&|#|$)`, 'i');
        let replacement = '';
        if (typeof value !== 'undefined' && value !== null) {
            if (Array.isArray(value)) {
                if (value.length) replacement = this.serializeArray(key, value);
            } else if (typeof value === 'object') {
                re = new RegExp(`([?&])${key}\\[[^=]*\\]=.*?(&|#|$)`, 'i');
                replacement = this.serializeObj(value, '', key);
            } else replacement = `${key}=${encodeURIComponent(value)}`;
        }
        const hash = url.split('#');
        let result = hash[0];
        if (re.test(url)) {
            let clean = result;
            replacement = replacement ? `$1${replacement}$2` : '$1';
            while(re.test(clean)){
                result = clean.replace(re, replacement);
                clean = clean.replace(re, '$1');
            }
            result = result.replace(/(&|\?)$/, '');
        } else if (replacement) {
            const separator = result.indexOf('?') !== -1 ? '&' : '?';
            result += `${separator}${replacement}`;
        }
        if (typeof hash[1] !== 'undefined' && hash[1] !== null) result += `#${hash[1]}`;
        return result;
    }
    /**
   * Returns variable from query string specified by parameter name
   * @param {string} name
   * @param {string} url defaults to window.location.href
   * @return {string|null}
   */ getParameterByName(name, url) {
        if (!url) // eslint-disable-next-line
        url = this.window.location.href;
        // eslint-disable-next-line
        name = name.replace(/[[\]]/g, '\\$&');
        const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`);
        let results = Array.from(RegExp.prototype[Symbol.matchAll].call(regex, url)).flat();
        // check for object like syntax where the last value can be an array eg. advancedFilters[query][statusIds][in][0] or advancedFilters[query][city]
        if (!results.length) {
            const objRegex = new RegExp(`[?&]${name}(\\[.*?\\])=(.*?)(?=&|#|$)`, 'g');
            results = Array.from(RegExp.prototype[Symbol.matchAll].call(objRegex, url)).flat();
            return this._parseParamToObject(results, name === 'advancedFilters');
        }
        // For multiple param values, eg arrays
        /* Results from regex match all come in this form:
    [ '&advancedFilters[query][statusIds][in]=uuid-segundo-123', '[query][statusIds][in]', 'uuid-segundo-123' ]
    So using every third value will be the actual value and the second value will be the path
    */ if (results.length > 3) return results.reduce((acc, value, index)=>{
            if ((index + 1) % 3 === 0) acc.push(decodeURIComponent(value.replace(/\+/g, ' ')));
            return acc;
        }, []);
        if (!results[2]) return '';
        return decodeURIComponent(results[2].replace(/\+/g, ' '));
    }
    /**
   * Generates section specific key to store page number in the URL
   * @param {string} sectionDomId
   * @return {string}
   */ makePageKey(sectionDomId) {
        return sectionDomId.replace('section-', '').replace(/-/g, '');
    }
    /**
   * Generates specific key to store parameter in the URL
   * uses prevsiouly calculated baseKey for section specific parameters
   * @param {Object} formParam
   * @param {string} baseKey pre-calculated base for section specific parameters
   * @return {string}
   */ makeParamKey(formParam, baseKey) {
        return formParam.global ? formParam.urlKey : `${baseKey}-${formParam.urlKey}`;
    }
    /**
   * Gets a set of parameters from window query string
   * always returns value of "page" parameter if present
   * @param {Object[]} formConfig
   * @param {string} sectionDomId
   * @return {Object}
   */ deserializeParams(formConfig, sectionDomId) {
        const params = {};
        const urlPageKey = this.makePageKey(sectionDomId);
        const page = this.getParameterByName(urlPageKey);
        if (page) params.page = parseInt(page);
        if (Array.isArray(formConfig)) formConfig.forEach((formParam)=>{
            const key = this.makeParamKey(formParam, urlPageKey);
            let urlValue = this.getParameterByName(key);
            if (formParam.type === 'int') {
                urlValue = parseInt(urlValue);
                // eslint-disable-next-line
                if (!isFinite(urlValue)) urlValue = null;
            } else if (formParam.type === 'bool' || formParam.type === 'boolean') urlValue = // eslint-disable-next-line
            urlValue === 'true' ? true : urlValue === 'false' ? false : null;
            else if (formParam.type === 'json') try {
                urlValue = JSON.parse(urlValue);
            } catch (e) {
            // no need to do anything
            }
            params[formParam.formKey || formParam.param] = urlValue;
        });
        return params;
    }
    /**
   * Serializes set of parameters defined by formConfig into the URL
   * adding or replacing or removing required parameters
   * @param {Object[]} formConfig
   * @param {string} sectionDomId
   * @param {Object} params
   * @return {string}
   */ serializeParams(formConfig, sectionDomId, params) {
        let result = this.window.location.href;
        const urlPageKey = this.makePageKey(sectionDomId);
        result = this.updateQueryString(urlPageKey, params.page, result);
        if (Array.isArray(formConfig)) formConfig.forEach((formParam)=>{
            const key = this.makeParamKey(formParam, urlPageKey);
            let value = params[formParam.formKey || formParam.param];
            if (formParam.type === 'json' && value !== null && typeof value !== 'undefined') value = JSON.stringify(value);
            result = this.updateQueryString(key, value, result);
        });
        return result;
    }
    /**
   * Formats small number for slider values
   * @param {number} value
   * @param {string} currency
   * @return {string}
   */ formatSliderAtom(value, currency = '') {
        const formattedValue = Number.isInteger(value) ? value : value.toFixed(2);
        return currency + formattedValue;
    }
    /**
   * Formats a number for slider values
   * @param {number} value
   * @param {string} currency
   * @param {string} delimiter
   * @return {string}
   */ formatSliderValue(value, currency = '', delimiter = '') {
        if (value < 1000) return this.formatSliderAtom(value, currency);
        if (value < 1000000) return `${this.formatSliderAtom(value / 1000, currency)}${delimiter}K`;
        return `${this.formatSliderAtom(value / 1000000, currency)}${delimiter}M`;
    }
    /**
   * Format price slider range
   * @param {number} value
   * @param {Object} range
   * @param {string} currency
   * @param {Object} options
   * @return {string}
   */ formatSliderPriceRange(value, range, currency, options) {
        if (range.min === value && value !== 0) return `${options.lowPrefix}${this.formatSliderValue(value, currency, ' ')}`;
        if (range.max === value) return `${this.formatSliderValue(value, currency, ' ')}${options.highSuffix}`;
        return `${this.formatSliderValue(value, currency, ' ')}`;
    }
    /**
   * Format area slider range
   * @param {number} value
   * @param {Object} range
   * @param {string} suffix
   * @param {Object} options
   * @return {string}
   */ formatSliderAreaRange(value, range, suffix, options) {
        if (range.min === value && value !== 0) return `${options.lowPrefix}${this.formatSliderValue(value)} ${suffix}`;
        if (range.max === value) return `${this.formatSliderValue(value)}${options.highSuffix} ${suffix}`;
        return `${this.formatSliderValue(value)} ${suffix}`;
    }
    /**
   * Utility function to get properties search parameters from a set of jQuery objects
   * @param {Object} options
   * @param {jQuery|HTMLElement} [options.queryElement]
   * @param {jQuery|HTMLElement} [options.priceSliderElement]
   * @param {jQuery|HTMLElement} [options.areaSliderElement]
   * @param {jQuery|HTMLElement} [options.neighborhoodSelect]
   * @return {Object}
   */ // eslint-disable-next-line sonarjs/cognitive-complexity
    getSearchFormValues(options) {
        const { queryElement: queryElement, priceSliderElement: priceSliderElement, areaSliderElement: areaSliderElement, neighborhoodSelect: neighborhoodSelect } = options;
        const result = {};
        if (queryElement) result.search = queryElement.value || null;
        if (priceSliderElement) {
            const priceValues = priceSliderElement.value.split(';');
            const priceMinLimit = parseInt(priceSliderElement.dataset.min);
            const priceMaxLimit = parseInt(priceSliderElement.dataset.max);
            const priceMin = parseInt(priceValues[0]);
            const priceMax = parseInt(priceValues[1]);
            result.priceMin = priceMin !== priceMinLimit ? priceMin : null;
            result.priceMax = priceMax !== priceMaxLimit ? priceMax : null;
        }
        if (areaSliderElement) {
            const areaValues = areaSliderElement.value.split(';');
            const areaMinLimit = parseInt(areaSliderElement.dataset.min);
            const areaMaxLimit = parseInt(areaSliderElement.dataset.max);
            const areaMin = parseInt(areaValues[0]);
            const areaMax = parseInt(areaValues[1]);
            result.areaMin = areaMin !== areaMinLimit ? areaMin : null;
            result.areaMax = areaMax !== areaMaxLimit ? areaMax : null;
        }
        if (neighborhoodSelect) result.neighborhoodId = neighborhoodSelect.value || null;
        return result;
    }
    /**
   * Add supports for object typeof values to be encoded on URL
   * Ref: https://stackoverflow.com/questions/1714786/query-string-encoding-of-a-javascript-object
   * @param {*} obj
   * @param {string} prefix
   * @param {string} baseParam used for grouping in case of nested objects
   * @returns
   */ // eslint-disable-next-line sonarjs/cognitive-complexity
    serializeObj(obj, prefix = '', baseParam = '') {
        const result = [];
        for(const prop in obj)if (obj.hasOwnProperty(prop)) {
            const value = obj[prop];
            let k;
            if (baseParam) {
                const newPrefix = prefix ? `[${prefix}][${prop}]` : `[${prop}]`;
                k = `${baseParam}${newPrefix}`;
            } else k = prefix ? `${prefix}[${prop}]` : prop;
            if (value !== null && Array.isArray(value)) {
                if (value.length) result.push(this.serializeArray(k, value));
            } else if (value !== null && typeof value === 'object') result.push(this.serializeObj(value, k));
            else result.push(`${k}=${encodeURIComponent(value)}`);
        }
        return result.join('&');
    }
    /**
   * Adds support for array values to be encoded on URL
   * @param {string} key
   * @param {Array} value
   * @param {string} baseParam
   */ serializeArray(key, value, baseParam = '') {
        const result = [];
        value.forEach((val)=>{
            const paramName = baseParam ? `${baseParam}${key}` : key;
            result.push(`${paramName}=${encodeURIComponent(val)}`);
        });
        return result.join('&');
    }
    /**
   * Private method to process string search values.
   * @param {Array} results comes from regex matchAll.
   * @param {Boolean} isAdvancedFilters flag to determine if the search is for advanced filters.
   * @returns
   */ _parseParamToObject(results, isAdvancedFilters = false) {
        if (!results.length) return null;
        const obj = {};
        for(let i = 0; i < results.length; i++)/* Results from regex match all come in this form:
      [ '&advancedFilters[query][statusIds][in]=uuid-segundo-123', '[query][statusIds][in]', 'uuid-segundo-123' ]
      So using every third value will be the actual value and the second value will be the path
    */ if ((i + 1) % 3 === 0) {
            const value = decodeURIComponent(results[i].replace(/\+/g, ' '));
            const path = results[i - 1];
            Object.assign(obj, this._setObjectPath(path, value, obj, isAdvancedFilters));
        }
        return obj;
    }
    /** *
   * Private method to set object value given a path
   * @param {String} path
   * @param {*} value
   * @param {Object} baseObj
   * @param {Boolean} isAdvancedFilters flag to determine if the search is for advanced filters.
   */ _setObjectPath(path, value, baseObj, isAdvancedFilters = false) {
        // eslint-disable-next-line
        const keys = path.split(/[\[\]]/).filter(Boolean);
        const afArrayKeys = [
            'in',
            'nin',
            'btw',
            'ciin',
            'cinin'
        ];
        const obj = {};
        let ref = obj;
        const valueExists = (0, $fc0a058ae42af628$export$267a1435fe18b8d4)(baseObj, keys.join('.'));
        keys.forEach((key, index)=>{
            if (index === keys.length - 1) {
                if (valueExists) ref[key] = Array.isArray(valueExists) ? [
                    ...valueExists,
                    value
                ] : [
                    valueExists,
                    value
                ];
                else ref[key] = isAdvancedFilters && afArrayKeys.includes(key) ? [
                    value
                ] : value;
            } else {
                ref[key] = baseObj[key] ? baseObj[key] : {};
                ref = ref[key];
            }
        });
        return obj;
    }
}


/* eslint-disable import/prefer-default-export */ 
class $2b1790aa32f109d1$export$43e435c053a109f6 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    /**
   * Initialize Expand Slider Controller at build time
   * @param { ConfigController } config
   * @param {Window} window
   * @param {Document} document
   */ constructor(config, window, document){
        super(config, window, document);
        this._createLightbox = this._createLightbox.bind(this);
        this.expandSliders = [];
    }
    /**
   * Initialize Expand Slider Controller at run time
   * Attach handlers and events to DOM
   * @param {Object} options
   */ initialize(options = {}) {
        try {
            const { document: document } = this;
            const expandSliders = document.querySelectorAll('.has-mobile-expand');
            expandSliders.forEach((block)=>{
                this._addExpandButton(block);
            });
            this.expandSliders = this.expandSliders.concat(expandSliders);
        } catch (e) {
            // eslint-disable-next-line no-console
            console.log(e);
        }
    }
    /**
   * Controllers must implement a "destroy" method to be called
   * after page navigation to remove event handlers / cleanup
   */ destroy() {
        const { document: document } = this;
        document.querySelectorAll('.lp-expand-btn, .lp-expand-btn-wrapper').forEach((element)=>element.remove());
        this.expandSliders = [];
    }
    /**
   * Create expand button for sliders
   * @param {HTMLElement} slider
   */ _addExpandButton(slider) {
        const { document: document } = this;
        const section = slider.closest('section[id]');
        const appendTargetSelector = slider.dataset.append;
        let expandBtn = section.querySelector('.lp-expand-btn');
        if (!expandBtn) {
            expandBtn = document.createElement('button');
            expandBtn.className = 'lp-expand-btn';
            expandBtn.setAttribute('aria-label', 'Open a lightbox');
            expandBtn.innerHTML = `<span class="lp-i lp-i--expand-alt" aria-hidden="true"></span>`;
            if (appendTargetSelector) {
                const appendTarget = section.querySelector(appendTargetSelector);
                if (appendTarget) appendTarget.appendChild(expandBtn);
            } else {
                const wrapper = document.createElement('div');
                wrapper.className = 'lp-expand-btn-wrapper';
                wrapper.style.position = 'relative';
                wrapper.appendChild(expandBtn);
                slider.parentNode.insertBefore(wrapper, slider.nextSibling);
            }
        }
        expandBtn.addEventListener('click', ()=>{
            this._createLightbox({
                slider: slider,
                section: section
            });
        });
    }
    /**
   * Creates a lightbox modal for displaying slider images in a larger view.
   *
   * @param {Object} params - The parameters for the function.
   * @param {HTMLElement} params.slider - The slider element containing images.
   * @param {HTMLElement} params.section - The section element related to the slider.
   * @param {number} [params.initialIndex] - Optional index of the image to show initially.
   */ _createLightbox({ slider: slider, section: section, initialIndex: initialIndex }) {
        const { window: window, document: document } = this;
        const modalId = `lightbox-for-${section?.id}`;
        const isSlickAvailable = window.$ && window.$.fn.slick;
        const isSectionSlickInitialized = isSlickAvailable && slider.slick;
        const isSplideAvailable = typeof window.Splide === 'function';
        const isSectionSplideInitialized = slider.classList.contains('is-initialized') && slider.classList.contains('splide');
        if (typeof window.lpUI.requestScrollLock === 'function') window.lpUI.requestScrollLock(modalId);
        else document.body.style.overflow = 'hidden';
        function createSlickLightbox() {
            const slickOverlayOptions = {
                arrows: true,
                dots: false,
                infinite: true,
                draggable: true,
                prevArrow: '<button type="button" class="lp-lightbox-arrow--prev lp-lightbox-arrow" aria-label="Previous"></button>',
                nextArrow: '<button type="button" class="lp-lightbox-arrow--next lp-lightbox-arrow" aria-label="Next"></button>'
            };
            const modal = document.createElement('div');
            modal.id = modalId;
            modal.className = 'lp-lightbox';
            modal.setAttribute('tabindex', '-1');
            modal.setAttribute('role', 'dialog');
            modal.setAttribute('aria-modal', 'true');
            modal.innerHTML = `
        <button class="lp-lightbox__close" aria-label="close modal"></button>
        <div class="lp-lightbox__content">
          <div class="lp-lightbox__carousel"></div>
        </div>
      `;
            document.body.appendChild(modal);
            const overlaySlider = modal.querySelector('.lp-lightbox__carousel');
            modal.classList.add('show');
            let sourceImages;
            if (isSectionSlickInitialized) {
                sourceImages = slider.slick.$slides.find('img');
                slickOverlayOptions.initialSlide = slider.slick?.currentSlide || 0;
                sourceImages.each(function() {
                    window.$('.lp-lightbox__carousel').append(window.$(this).clone(false).removeAttr('style').wrap('<div class="lp-lightbox__slide"></div>').parent());
                });
            } else {
                sourceImages = slider.querySelectorAll('img');
                sourceImages.forEach((img)=>{
                    const imgClone = img.cloneNode(true);
                    imgClone.removeAttribute('style');
                    const slide = document.createElement('div');
                    slide.className = 'lp-lightbox__slide';
                    slide.appendChild(imgClone);
                    overlaySlider.appendChild(slide);
                });
            }
            window.$(overlaySlider).slick(slickOverlayOptions);
            // Focus modal after it's created
            setTimeout(()=>{
                modal.focus();
            }, 100);
            // Keyboard navigation handler
            const handleKeydown = (e)=>{
                if (!modal.classList.contains('show')) return;
                const prevArrow = modal.querySelector('.lp-lightbox-arrow--prev');
                const nextArrow = modal.querySelector('.lp-lightbox-arrow--next');
                const closeBtn = modal.querySelector('.lp-lightbox__close');
                if (e.key === 'ArrowLeft' && prevArrow) {
                    e.preventDefault();
                    prevArrow.click();
                } else if (e.key === 'ArrowRight' && nextArrow) {
                    e.preventDefault();
                    nextArrow.click();
                } else if (e.key === 'Escape' && closeBtn) {
                    e.preventDefault();
                    closeBtn.click();
                }
            };
            document.addEventListener('keydown', handleKeydown);
            modal.querySelector('.lp-lightbox__close').addEventListener('click', ()=>{
                document.removeEventListener('keydown', handleKeydown);
                modal.classList.remove('show');
                const currentSlide = overlaySlider?.slick ? window.$(overlaySlider).slick('slickCurrentSlide') : 0;
                if (overlaySlider?.slick) window.$(overlaySlider).slick('unslick');
                if (isSectionSlickInitialized) window.$(slider).slick('slickGoTo', currentSlide);
                if (typeof window.lpUI.releaseScrollLock === 'function') window.lpUI.releaseScrollLock(modalId);
                else document.body.style.overflow = '';
                modal.remove();
            });
        }
        function createSplideLightbox() {
            const splideOptions = {
                rewind: true,
                arrows: true,
                arrowPath: '',
                type: 'loop',
                clones: 1,
                pagination: false,
                perPage: 1,
                perMove: 1
            };
            const modal = document.createElement('div');
            modal.id = modalId;
            modal.className = 'lp-lightbox';
            modal.setAttribute('tabindex', '-1');
            modal.setAttribute('role', 'dialog');
            modal.setAttribute('aria-modal', 'true');
            modal.innerHTML = `
      <button class="lp-lightbox__close" aria-label="close modal"></button>
      <div class="lp-lightbox__content">
        <div class="lp-lightbox__carousel splide" role="group" aria-label="Image Gallery">
          <div class="splide__arrows">
            <button class="splide__arrow splide__arrow--prev lp-lightbox-arrow lp-lightbox-arrow--prev"></button>
            <button class="splide__arrow splide__arrow--next lp-lightbox-arrow lp-lightbox-arrow--next"></button>
          </div>
          <div class="splide__track">
            <ul class="splide__list"></ul>
          </div>
        </div>
      </div>
    `;
            if (typeof window.lpUI.requestScrollLock === 'function') window.lpUI.requestScrollLock(modalId);
            else document.body.style.overflow = 'hidden';
            document.body.appendChild(modal);
            const overlaySlider = modal.querySelector('.lp-lightbox__carousel');
            const overlaySliderList = overlaySlider.querySelector('.splide__list');
            modal.classList.add('show');
            let sourceImages;
            if (isSectionSplideInitialized) sourceImages = slider.querySelectorAll('.splide__slide:not(.splide__slide--clone) img');
            else sourceImages = slider.querySelectorAll('img');
            sourceImages.forEach((img)=>{
                const imgClone = img.cloneNode(true);
                imgClone.removeAttribute('style');
                const slide = document.createElement('li');
                slide.className = 'lp-lightbox__slide splide__slide';
                slide.appendChild(imgClone);
                overlaySliderList.appendChild(slide);
            });
            const overlaySplide = new window.Splide(overlaySlider, splideOptions);
            overlaySplide.mount();
            // Navigate to initial index if provided
            if (typeof initialIndex !== 'undefined' && initialIndex >= 0) overlaySplide.go(initialIndex);
            // Focus modal after it's created and mounted
            setTimeout(()=>{
                modal.focus();
            }, 100);
            // Keyboard navigation handler
            const handleKeydown = (e)=>{
                if (!modal.classList.contains('show')) return;
                const prevArrow = modal.querySelector('.splide__arrow--prev');
                const nextArrow = modal.querySelector('.splide__arrow--next');
                const closeBtn = modal.querySelector('.lp-lightbox__close');
                if (e.key === 'ArrowLeft' && prevArrow) {
                    e.preventDefault();
                    prevArrow.click();
                } else if (e.key === 'ArrowRight' && nextArrow) {
                    e.preventDefault();
                    nextArrow.click();
                } else if (e.key === 'Escape' && closeBtn) {
                    e.preventDefault();
                    closeBtn.click();
                }
            };
            document.addEventListener('keydown', handleKeydown);
            modal.querySelector('.lp-lightbox__close').addEventListener('click', ()=>{
                document.removeEventListener('keydown', handleKeydown);
                modal.classList.remove('show');
                if (overlaySplide) overlaySplide.destroy();
                if (typeof window.lpUI.releaseScrollLock === 'function') window.lpUI.releaseScrollLock(modalId);
                else document.body.style.overflow = '';
                modal.remove();
            });
        }
        if (isSlickAvailable && !isSectionSplideInitialized) createSlickLightbox();
        else if (isSplideAvailable) createSplideLightbox();
        else {
            window.luxuryPresence.libs.loadCss(window.luxuryPresence.libs.jsLibsMap.splide.cssSrc);
            window.luxuryPresence.libs.loadJs(window.luxuryPresence.libs.jsLibsMap.splide.jsSrc, ()=>{
                createSplideLightbox();
                window.luxuryPresence.libs.jsLibsMap.splide.isLoaded = true;
            });
        }
    }
}


/* eslint-disable import/prefer-default-export */ 
class $4f184d9bd3037f15$export$7a6215890afba974 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    // constructor is not needed as it is inherited from BaseController
    /**
   * Destroy
   */ destroy() {
        if (!this.window.divolte) this.window.divolteLp = function() {
            (this.window.divolteLp.q = this.window.divolteLp.q || []).push(// eslint-disable-next-line prefer-rest-params
            arguments);
        };
    }
    /**
   * Initialize divolte controller
   * @param {Object} options
   */ initialize(options = {}) {
        const { divolteServiceUrl: divolteServiceUrl } = this.config;
        if (!divolteServiceUrl || this.window.divolte) return;
        this.loadScript();
    }
    /**
   * loads divolte
   */ loadScript() {
        const { divolteServiceUrl: divolteServiceUrl } = this.config;
        const script = this.document.createElement('script');
        script.id = 'divolte-script';
        script.type = 'text/javascript';
        script.defer = true;
        script.async = true;
        script.src = `${divolteServiceUrl}/divolte.js`;
        this.document.head.appendChild(script);
        script.addEventListener('load', this.executeQueue.bind(this));
    }
    /**
   * executeQueue
   */ executeQueue() {
        (this.window.divolteLp.q || []).forEach(([methodName, params])=>{
            this[methodName](params);
        });
        this.window.divolteLp = this.divolteLp.bind(this);
    }
    /**
   * divolteLp
   * @param {string} name
   * @param {Object} params
   */ divolteLp(name, params) {
        try {
            this[name](params);
        } catch (error) {
            // eslint-disable-next-line no-console
            console.log(error);
        }
    }
    /**
   * sendLpEvent
   * @param {string} name
   * @param {Object} params
   */ sendLpEvent(name, params) {
        // Events must be defined in divolte schema! To ensure correct usage, event names are validated here.
        if (!name.includes('pageView')) {
            // Event not defined
            // eslint-disable-next-line no-console
            console.log(`${name} IS NOT SUPPORTED`);
            return;
        }
        const { companyId: companyId, templateId: templateId, websiteId: websiteId, pageId: pageId, shareId: shareId, pageMeta: pageMeta } = this.config;
        const baseParams = {
            companyId: companyId,
            templateId: templateId,
            websiteId: websiteId,
            pageId: pageId,
            shareId: shareId,
            pageMeta: pageMeta
        };
        this.window.divolte.signal(name, Object.assign(baseParams, params));
    }
    /**
   * sendLpPageView
   */ sendLpPageView() {
        this.sendLpEvent('pageView', {});
    }
}


/* eslint-disable import/prefer-default-export */ 
const $102039871668a1df$var$EVENT_BUS_SCRIPT = 'event-bus-js.js';
const $102039871668a1df$var$EVENT_BUS_VERSION = 'v2.1.0';
class $102039871668a1df$export$e22e4b1be0bb6c61 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    // eslint-disable-next-line @typescript-eslint/no-useless-constructor
    constructor(config, window, document){
        super(config, window, document);
    }
    /**
   * Initialize EventBus controller
   * @param {Object} options
   */ initialize(options = {}) {
        const enabled = options.enabled !== undefined ? options.enabled : this.config.eventBus?.enabled;
        if (enabled && this.config.eventBus?.apiKey && this.config.eventBus?.url) this.loadScript();
    }
    /**
   * loads eventBus script
   */ loadScript() {
        const { eventBusUrl: eventBusUrl } = this.config;
        const script = this.document.createElement('script');
        script.id = 'posthog-script';
        script.type = 'text/javascript';
        script.defer = true;
        script.async = true;
        script.src = `${eventBusUrl}/${$102039871668a1df$var$EVENT_BUS_VERSION}/${$102039871668a1df$var$EVENT_BUS_SCRIPT}`;
        this.document.head.appendChild(script);
        script.addEventListener('load', this.executeQueue.bind(this));
    }
    /**
   * executeQueue - Process queued eventBusLp calls
   */ executeQueue() {
        // Initialize the event bus provider using the global EventBusJS
        if (this.window.LuxuryPresenceEventBus) this.window.eventBusProvider = this.window.LuxuryPresenceEventBus.createEventBusProvider({
            apiKey: this.config.eventBus.apiKey,
            host: this.config.eventBus.url
        });
        (this.window.eventBusLp.q || []).forEach(([methodName, params])=>{
            this[methodName](params);
        });
        // Replace queue function with real function
        this.window.eventBusLp = this.eventBusLp.bind(this);
    }
    /**
   * Destroy
   */ destroy() {
        if (!this.window.eventBusProvider) {
            // Reset to queue function if no provider exists
            this.window.eventBusLp = function() {
                (this.window.eventBusLp.q = this.window.eventBusLp.q || []).push(// eslint-disable-next-line prefer-rest-params
                arguments);
            };
            return;
        }
        this.window.eventBusProvider.shutdown();
    }
    /**
   * sendLpEvent
   * @param {string} eventType
   * @param {Object} data
   */ sendLpEvent(eventType, data) {
        // Events must be defined in event-bus schema! To ensure correct usage, event types are validated here.
        if (eventType !== 'user.activity.page.viewed') {
            // Event type not defined
            // eslint-disable-next-line no-console
            console.log(`${eventType} IS NOT SUPPORTED`);
            return;
        }
        if (!this.window.eventBusProvider) return;
        const { companyId: companyId } = this.config;
        const eventData = {
            company: companyId,
            data: {}
        };
        try {
            this.window.eventBusProvider.capture(eventType, eventData);
        } catch (error) {
            // eslint-disable-next-line no-console
            console.log('EventBus capture error:', error);
        }
    }
    /**
   * eventBusLp
   * @param {string} name
   * @param {Object} params
   */ eventBusLp(name, params) {
        try {
            this[name](params);
        } catch (error) {
            // eslint-disable-next-line no-console
            console.log(error);
        }
    }
    /**
   * sendLpPageView
   */ sendLpPageView() {
        this.sendLpEvent('user.activity.page.viewed', {});
    }
}


/* eslint-disable import/prefer-default-export */ 
const $0d25a3fa2e0f4f92$var$EVENT_NAME = 'oauthSuccess';
class $0d25a3fa2e0f4f92$export$b718a981691eae5c extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    /**
   * Initialize Button Controller at build time
   * @param { ConfigController } config
   * @param {Window} window
   * @param {Document} document
   */ constructor(config, window, document){
        super(config, window, document);
        this.successListeners = [];
        this._listenToMessages = this._listenToMessages.bind(this);
        this._listenToOneTapMessage = this._listenToOneTapMessage.bind(this);
    }
    /**
   * Initialize OAuth Controller at run time
   * Swap out special buttons for the iframe
   * @param {Object} options
   */ initialize(options = {}) {
        try {
            // handle google one tap
            if (options.googleSignOnEnabled && !options.iframe) this._renderGoogleOneTap();
            // handle google sign in buttons
            this.document.querySelectorAll('div[data-signin-type="google-sign-in"]').forEach((el)=>this._convertGoogleSignIn(el));
            // handle facebook sign in buttons
            this.document.querySelectorAll('div[data-signin-type="facebook-sign-in"]').forEach((el)=>this._convertFacebookSignIn(el));
        } catch (e) {
            // eslint-disable-next-line no-console
            console.log(e);
        }
    }
    /**
   * Controllers must implement a "destroy" method to be called
   * after page navigation to remove event handlers / cleanup
   */ destroy() {
        this.successListeners.forEach((callback)=>{
            this.window.removeEventListener('message', this._listenToMessages);
            this.window.removeEventListener('message', this._listenToOneTapMessage);
            this.window.removeEventListener($0d25a3fa2e0f4f92$var$EVENT_NAME, this.window[callback]);
        });
    }
    /**
   * Convert google one tap
   */ _renderGoogleOneTap() {
        if (!this._isGoogleOneTapOnCooldown()) {
            const dummyEl = this.document.createElement('div');
            // eslint-disable-next-line no-undef
            google.accounts.id.initializeIntermediate({
                src: this._buildUrlAndCopyAttributes(dummyEl, dummyEl, 'googleOneTap')
            });
            this.window.localStorage.removeItem('googleOneTapExpiration');
            this.window.addEventListener('message', this._listenToOneTapMessage);
        }
    }
    /**
   * Listening for messages from BSS one tap iframes
   * @param {MessageEvent} e
   */ _listenToOneTapMessage(e) {
        const messageTypes = {
            SHOW_INTERMEDIATE_IFRAME: 'show_intermediate_iframe',
            HIDE_INTERMEDIATE_IFRAME: 'hide_intermediate_iframe'
        };
        const iframeId = 'onetap_google_intermediate_iframe';
        const { buyerSellerServiceUrl: buyerSellerServiceUrl } = this.config;
        const { data: data, origin: origin } = e;
        const { type: type, height: height, event: event, source: source, token: token } = data;
        if (type === messageTypes.SHOW_INTERMEDIATE_IFRAME || type === messageTypes.HIDE_INTERMEDIATE_IFRAME) {
            const bssIframe = this.document.getElementById(iframeId);
            if (bssIframe) {
                bssIframe.style.height = height;
                bssIframe.style.display = type === messageTypes.SHOW_INTERMEDIATE_IFRAME ? 'unset' : 'none';
            }
        }
        // these events are generated by our code in the bss iframe
        if (origin === buyerSellerServiceUrl && source === 'GOOGLE_SIGN_ON') {
            if (event === 'success') {
                this._setExpirationLsItem(86400000); // 24 hours
                this._handleQualifyingQuestionsModal(token);
            } else if (event === 'cancel') this._setExpirationLsItem(7200000); // 2 hours
        }
    }
    /**
   * Set expiration local storage item for google one tap
   * @param {number} ms
   */ _setExpirationLsItem(ms) {
        const expiration = new Date().getTime() + ms;
        this.window.localStorage.setItem('googleOneTapExpiration', expiration);
    }
    /**
   * Check if google one tap is expired
   * @return {boolean}
   */ _isGoogleOneTapOnCooldown() {
        const expirationTime = this.window.localStorage.getItem('googleOneTapExpiration');
        return Number(expirationTime) > new Date().getTime();
    }
    /**
   * Convert google sign in buttons
   * @param {HTMLElement} el
   */ _convertGoogleSignIn(el) {
        this._replaceWithIframe('googleSignIn', el);
    }
    /**
   * Convert google sign in buttons
   * @param {HTMLElement} el
   */ _convertFacebookSignIn(el) {
        this._replaceWithIframe('facebookSignIn', el);
    }
    /**
   * Convert google sign in buttons
   * @param {'googleSignIn' | 'facebookSignIn'} provider
   * @param {HTMLElement} el
   */ _replaceWithIframe(provider, el) {
        this._attachSuccessCallback(el);
        const iframe = this.document.createElement('iframe');
        iframe.src = this._buildUrlAndCopyAttributes(el, iframe, provider);
        iframe.dataset.isSocialOauthButton = true;
        el.replaceWith(iframe);
    }
    /**
   * Listening for messages from BSS iframes
   * @param {Event} e
   */ _listenToMessages(e) {
        const { buyerSellerServiceUrl: buyerSellerServiceUrl } = this.config;
        // eslint-disable-next-line sonarjs/no-collapsible-if
        if (e.origin === buyerSellerServiceUrl) {
            if (e.data.event === 'success') {
                const event = new Event($0d25a3fa2e0f4f92$var$EVENT_NAME);
                this.window.dispatchEvent(event);
                this.successListeners.forEach((callback)=>{
                    if (this.window[callback]) this.window[callback](event);
                    else // eslint-disable-next-line no-console
                    console.error(`Callback function ${callback} not found on window object`);
                });
                this.document.documentElement.classList.add('is-login-success');
            }
        }
    }
    /**
   * Attach callback to iframe
   * @param {HTMLElement} el
   */ _attachSuccessCallback(el) {
        this.window.addEventListener('message', this._listenToMessages);
        const callbackFunction = el.dataset.onSuccessFunctionName;
        if (callbackFunction) this.successListeners.push(callbackFunction);
    }
    /**
   * Build Iframe URL
   * @param {HTMLElement} source
   * @param {HTMLElement} target
   * @param {string} provider
   * @return {string}
   */ _buildUrlAndCopyAttributes(source, target, provider) {
        const { buyerSellerServiceUrl: buyerSellerServiceUrl, companyId: companyId, websiteId: websiteId, pageId: pageId, pageMeta: pageMeta } = this.config;
        const { location: location } = this.window;
        const sourceUrl = location.origin + location.pathname;
        const destination = new URL(`${buyerSellerServiceUrl}/buttons/${provider}`);
        const utm = this.window.localStorage.getItem('utm_vars');
        const referrer = this.window.localStorage.getItem('referrer');
        destination.searchParams.append('companyId', companyId);
        destination.searchParams.append('websiteId', websiteId);
        destination.searchParams.append('pageId', pageId);
        destination.searchParams.append('sourceUrl', sourceUrl);
        destination.searchParams.append('pageMeta', JSON.stringify(pageMeta));
        if (utm) destination.searchParams.append('utm', utm);
        if (referrer) destination.searchParams.append('referrer', referrer);
        // Google and Facebook Attributes used to style the social button
        const RESERVED_ATTRIBUTES = [
            'data-size',
            'data-width',
            'data-text',
            'data-button-type',
            'data-shape',
            'data-layout',
            'data-max-rows',
            'data-use-continue-as',
            'data-type',
            'data-theme',
            'data-logo_alignment',
            'data-locale'
        ];
        Array.from(source.attributes).forEach((attribute)=>{
            if (RESERVED_ATTRIBUTES.includes(attribute.nodeName)) destination.searchParams.append(attribute.nodeName, attribute.nodeValue);
            else target.setAttribute(attribute.nodeName === 'id' ? 'data-id' : attribute.nodeName, attribute.nodeValue);
        });
        return destination.toString();
    }
    /**
   * Decode a JWT token to extract payload information
   * @param {string} token - The JWT token to decode
   * @return {Object|null} The decoded payload object or null if decoding fails
   */ _decodeToken(token) {
        try {
            const parts = token.split('.');
            const payload = parts[1];
            const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');
            const padding = 4 - base64.length % 4;
            const padded = padding === 4 ? base64 : base64 + '='.repeat(padding);
            return JSON.parse(atob(padded));
        } catch (error) {
            return null;
        }
    }
    /**
   * Handle qualifying questions modal showing for Google Sign On
   * Decodes the JWT token to extract user email and shows the modal if available
   * @param {string} token - The JWT token containing user information
   */ _handleQualifyingQuestionsModal(token) {
        if (token && this.window.luxuryPresence && this.window.luxuryPresence.qualifyingQuestionsModal) {
            // Decoding only for lead attribution, fine to skip signature verification
            const decoded = this._decodeToken(token);
            if (decoded && decoded.email) this.window.luxuryPresence.qualifyingQuestionsModal.showModal(decoded.email, 'Google Sign On');
        }
    }
}


/* eslint-disable import/prefer-default-export */ 
class $dcf72769f009ff26$export$b900d6fe921fd49c extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    /**
   * Initialize Qualifying Questions Modal Controller at build time
   * @param { ConfigController } config
   * @param {Window} window
   * @param {Document} document
   */ constructor(config, window, document){
        super(config, window, document);
        this.showModal = this.showModal.bind(this);
        this.hasModalBeenSubmitted = this.hasModalBeenSubmitted.bind(this);
        this.modalId = 'qualifying-questions-modal';
        this.cookieKey = 'qualifyingQuestionsModalSubmitted';
        this.qualifyingQuestionsModalEnabled = true;
        // Store references for cleanup
        this.eventListeners = [];
        this.timeouts = [];
    }
    initialize(options = {}) {
        this.qualifyingQuestionsModalEnabled = options.qualifyingQuestionsModalEnabled ?? this.qualifyingQuestionsModalEnabled;
        if (!this.qualifyingQuestionsModalEnabled) return;
        this.attachModalCloseListeners();
    }
    destroy() {
        // Remove all stored event listeners
        this.eventListeners.forEach(({ element: element, event: event, handler: handler })=>{
            if (element && element.removeEventListener) element.removeEventListener(event, handler);
        });
        this.timeouts.forEach((timeoutId)=>{
            clearTimeout(timeoutId);
        });
        this.restoreBodyScroll();
        this.eventListeners = [];
        this.timeouts = [];
    }
    /**
   * Check if modal has been submitted using cookie-based deduplication
   * @return {boolean}
   */ hasModalBeenSubmitted() {
        const cookieValue = this.getCookie(this.cookieKey);
        return cookieValue === 'true';
    }
    /**
   * Set cookie to prevent modal from showing again
   */ setModalSubmittedCookie() {
        this.setCookie(this.cookieKey, 'true', 365); // 1 year
    }
    showModal(email, triggerSource) {
        if (!this.qualifyingQuestionsModalEnabled || this.hasModalBeenSubmitted()) return;
        this.updateEmailValue(email);
        this.updateTriggerSourceValue(triggerSource);
        this.showModalElement();
    }
    /**
   * Get modal element with error handling
   * @return {Element|null}
   */ getModalElement() {
        const modal = this.document.getElementById(this.modalId);
        if (!modal) console.error('Modal element not found:', this.modalId);
        return modal;
    }
    updateEmailValue(email) {
        const modal = this.getModalElement();
        if (!modal) return;
        const emailInput = modal.querySelector('input[name="email"]');
        if (emailInput && typeof email === 'string') emailInput.value = email;
    }
    updateTriggerSourceValue(triggerSource) {
        const modal = this.getModalElement();
        if (!modal) return;
        const triggerSourceInput = modal.querySelector(`#${this.modalId}-triggerSource`);
        if (triggerSourceInput && typeof triggerSource === 'string') triggerSourceInput.value = triggerSource;
    }
    showModalElement() {
        const modal = this.getModalElement();
        if (!modal) return;
        modal.style.display = 'flex';
        this.blockBodyScroll();
    }
    /**
   * Helper method to get cookie value
   * @param {string} name
   * @return {string|null}
   */ getCookie(name) {
        const value = `; ${this.document.cookie}`;
        const parts = value.split(`; ${name}=`);
        if (parts.length === 2) return decodeURIComponent(parts.pop().split(';').shift());
        return null;
    }
    /**
   * Helper method to set cookie
   * @param {string} name
   * @param {string} value
   * @param {number} days
   */ setCookie(name, value, days) {
        let expires = '';
        if (days) {
            const date = new Date();
            date.setTime(date.getTime() + days * 86400000);
            expires = `; expires=${date.toUTCString()}`;
        }
        let attrs = '; path=/; SameSite=Lax';
        if (this.window && this.window.location && this.window.location.protocol === 'https:') attrs += '; Secure';
        this.document.cookie = `${name}=${encodeURIComponent(value || '')}${expires}${attrs}`;
    }
    blockBodyScroll() {
        this._prevOverflow = this.document.body.style.overflow;
        this.document.body.style.overflow = 'hidden';
    }
    restoreBodyScroll() {
        this.document.body.style.overflow = this._prevOverflow || '';
        this._prevOverflow = null;
    }
    attachModalCloseListeners() {
        const modal = this.getModalElement();
        if (!modal) return;
        // Listen for form submission success (when modal closes automatically)
        const form = this.document.getElementById(`${this.modalId}-form`);
        if (form) {
            const formSubmittedHandler = ()=>{
                // Set cookie to prevent showing again and hide modal
                this.setModalSubmittedCookie();
                const timeoutId = setTimeout(()=>{
                    modal.style.display = 'none';
                    this.restoreBodyScroll();
                }, 100);
                this.timeouts.push(timeoutId);
            };
            form.addEventListener('formsubmitted', formSubmittedHandler);
            this.eventListeners.push({
                element: form,
                event: 'formsubmitted',
                handler: formSubmittedHandler
            });
        }
        // Listen for close button clicks
        const closeButton = modal.querySelector('[data-dismiss="modal"]');
        if (closeButton) {
            const closeButtonHandler = ()=>{
                modal.style.display = 'none';
                this.restoreBodyScroll();
            };
            closeButton.addEventListener('click', closeButtonHandler);
            this.eventListeners.push({
                element: closeButton,
                event: 'click',
                handler: closeButtonHandler
            });
        }
        // Listen for backdrop clicks
        const backdropClickHandler = (e)=>{
            // Check if click is on the modal backdrop (not on the modal content)
            if (e.target === modal || e.target.id === this.modalId) {
                modal.style.display = 'none';
                this.restoreBodyScroll();
            }
        };
        modal.addEventListener('click', backdropClickHandler);
        this.eventListeners.push({
            element: modal,
            event: 'click',
            handler: backdropClickHandler
        });
    }
}


/* eslint-disable import/prefer-default-export */ 
class $50eefeef8d1f2372$export$8a2bf06fbae4dde extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    constructor(configController, window, document){
        super(configController, window, document);
        this.isValidating = false;
        this.lastValidationResult = null;
        this.lastValidationTime = null;
        this.validationCacheDuration = 300000; // 5 minutes
    }
    /**
   * Destroy
   */ destroy() {
        this.isValidating = false;
        this.lastValidationResult = null;
        this.lastValidationTime = null;
    }
    /**
   * Validate user session using GraphQL validSession query
   * @param {Object} options - Options for session validation
   * @param {boolean} options.useCache - Whether to use cached validation result
   * @returns {Promise<boolean>} - true if session is valid, false otherwise
   */ async validateSession(options = {}) {
        const { useCache: useCache = true } = options;
        if (useCache && this.lastValidationResult !== null && this.lastValidationTime) {
            const timeSinceLastValidation = Date.now() - this.lastValidationTime;
            if (timeSinceLastValidation < this.validationCacheDuration) return this.lastValidationResult;
        }
        if (this.isValidating) return this.lastValidationResult !== null ? this.lastValidationResult : false;
        this.isValidating = true;
        const query = `
      query {
        validSession {
          success
        }
      }
    `;
        try {
            // query from same domain as the website
            const response = await this.window.fetch(`/graphql`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                credentials: 'include',
                body: JSON.stringify({
                    query: query
                })
            });
            if (!response.ok) {
                // eslint-disable-next-line no-console
                console.error('SessionController: HTTP error during session validation', response.status);
                this.lastValidationResult = false;
                this.lastValidationTime = Date.now();
                return false;
            }
            const data = await response.json();
            if (data.errors) {
                this.lastValidationResult = false;
                this.lastValidationTime = Date.now();
                return false;
            }
            const isValid = data.data?.validSession?.success === true;
            this.lastValidationResult = isValid;
            this.lastValidationTime = Date.now();
            return isValid;
        } catch (error) {
            // eslint-disable-next-line no-console
            console.error('SessionController: Error validating session', error);
            this.lastValidationResult = false;
            this.lastValidationTime = Date.now();
            return false;
        } finally{
            this.isValidating = false;
        }
    }
    /**
   * Clear validation cache
   */ clearCache() {
        this.lastValidationResult = null;
        this.lastValidationTime = null;
    }
}


/* eslint-disable import/prefer-default-export */ 
class $6bb500f67d8e6b7b$export$19036f3e654d7262 extends (0, $7c391e2f7931d60d$export$3b5bd9381a52554c) {
    constructor(config, window, document){
        super(config, window, document);
        this.consentListener = null;
    }
    /**
   * Destroy and cleanup event listeners
   */ destroy() {
        if (this.consentListener) {
            this.document.removeEventListener('cookieyes_consent_update', this.consentListener);
            this.consentListener = null;
        }
    }
    /**
   * Check if cookieyes-consent cookie includes analytics consent
   * @returns {boolean} True if analytics is consented to
   */ hasAnalyticsConsent() {
        const cookieString = this.document.cookie;
        const match = cookieString.match(/cookieyes-consent=([^;]+)/);
        if (!match) return false;
        try {
            const cookieValue = decodeURIComponent(match[1]);
            if (cookieValue.includes(',')) {
                const segments = cookieValue.split(',').map((c)=>c.trim());
                // Handle CookieYes key:value format (e.g., "analytics:yes")
                if (segments.some((s)=>s.includes(':'))) return segments.some((s)=>s === 'analytics:yes');
                return segments.includes('analytics');
            }
            return cookieValue.includes('analytics');
        } catch (error) {
            return false;
        }
    }
    /**
   * Load PostHog and Divolte scripts
   */ loadScript() {
        const shouldAddPostHogScript = !this.document.getElementById('posthog-script');
        const shouldAddDivolteScript = !this.document.getElementById('divolte-script');
        if (shouldAddPostHogScript) this.window.luxuryPresence.eventBus.initialize({
            enabled: this.config.eventBus?.enabled
        });
        if (shouldAddDivolteScript) this.window.luxuryPresence.divolte.initialize({});
    }
    /**
   * Remove PostHog and Divolte scripts
   */ removeScripts() {
        this.window.luxuryPresence?.eventBus?.destroy?.();
        this.window.luxuryPresence?.divolte?.destroy?.();
        this.document.getElementById('posthog-script')?.remove();
        this.document.getElementById('divolte-script')?.remove();
    }
    /**
   * Initialize CookieYes controller
   */ async initialize() {
        const isAuthenticated = await this.window.luxuryPresence.session.validateSession();
        if (this.hasAnalyticsConsent() || isAuthenticated) this.loadScript();
        if (!this.consentListener) {
            this.consentListener = (eventData)=>{
                const data = eventData.detail;
                if (data?.accepted && Array.isArray(data.accepted) && data.accepted.includes('analytics')) this.loadScript();
                else this.removeScripts();
            };
            this.document.addEventListener('cookieyes_consent_update', this.consentListener);
        }
    }
}


const $fa0280e505379701$export$1fd2b467a3644d37 = new (0, $dc851cf3939b6ef5$export$ff0712c26d5458f7)({});
const $fa0280e505379701$export$e12694e911a05f40 = new (0, $0ead03fdb95fa9ce$export$d507f25e63650365)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$3de614e59a842917 = new (0, $d48f9f944810f613$export$ca3218b7861b9cb0)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$fb9b298fdbf31455 = new (0, $68a2d4aa500c7a05$export$61ec8f2b6291ec31)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$178cc3119b453c2a = new (0, $e10bd00497be8876$export$3c5380623cf51249)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$9376af1a01686f2 = new (0, $ea6901fdf47e0ec1$export$3c19195edca3fa5c)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$94d36f806562393e = new (0, $0a0ad49f13c0b8fd$export$ba9afeb75f20f616)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$89e66d1faf94651e = new (0, $2b1790aa32f109d1$export$43e435c053a109f6)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$7743b07270cd6d6c = new (0, $4f184d9bd3037f15$export$7a6215890afba974)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$40a7039551318c37 = new (0, $102039871668a1df$export$e22e4b1be0bb6c61)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$8a0bbf7e7652fcfc = new (0, $0d25a3fa2e0f4f92$export$b718a981691eae5c)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$b313b3f6544c97a3 = new (0, $dcf72769f009ff26$export$b900d6fe921fd49c)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$b526bc4ac03268ef = new (0, $50eefeef8d1f2372$export$8a2bf06fbae4dde)($fa0280e505379701$export$1fd2b467a3644d37, window, document);
const $fa0280e505379701$export$ec41309a2e823376 = new (0, $6bb500f67d8e6b7b$export$19036f3e654d7262)($fa0280e505379701$export$1fd2b467a3644d37, window, document);


/**
 * Attach controller to window for usage
 * @param {string} key
 * @param {any} controller
 */ function $89a8a84b77163415$var$attachController(key, controller) {
    if (window.luxuryPresence[key]) try {
        // New version of sdk, destroy previous
        window.luxuryPresence[key].destroy();
    } catch (e) {
        // eslint-disable-next-line no-console
        console.log(e);
    }
    window.luxuryPresence[key] = controller;
}
$89a8a84b77163415$var$attachController('config', (0, $fa0280e505379701$export$1fd2b467a3644d37));
$89a8a84b77163415$var$attachController('modals', (0, $fa0280e505379701$export$e12694e911a05f40));
$89a8a84b77163415$var$attachController('buttons', (0, $fa0280e505379701$export$3de614e59a842917));
$89a8a84b77163415$var$attachController('validation', (0, $fa0280e505379701$export$fb9b298fdbf31455));
$89a8a84b77163415$var$attachController('contactForms', (0, $fa0280e505379701$export$178cc3119b453c2a));
$89a8a84b77163415$var$attachController('mapApiLoader', (0, $fa0280e505379701$export$9376af1a01686f2));
$89a8a84b77163415$var$attachController('pagination', (0, $fa0280e505379701$export$94d36f806562393e));
$89a8a84b77163415$var$attachController('expandSliders', (0, $fa0280e505379701$export$89e66d1faf94651e));
$89a8a84b77163415$var$attachController('divolte', (0, $fa0280e505379701$export$7743b07270cd6d6c));
$89a8a84b77163415$var$attachController('eventBus', (0, $fa0280e505379701$export$40a7039551318c37));
$89a8a84b77163415$var$attachController('oauth', (0, $fa0280e505379701$export$8a0bbf7e7652fcfc));
$89a8a84b77163415$var$attachController('qualifyingQuestionsModal', (0, $fa0280e505379701$export$b313b3f6544c97a3));
$89a8a84b77163415$var$attachController('session', (0, $fa0280e505379701$export$b526bc4ac03268ef));
$89a8a84b77163415$var$attachController('cookieyes', (0, $fa0280e505379701$export$ec41309a2e823376));
// methods for existing elements (can be removed later after elements updated)
window.luxuryPresence.formatSliderPriceRange = (0, $fa0280e505379701$export$94d36f806562393e).formatSliderPriceRange.bind((0, $fa0280e505379701$export$94d36f806562393e));
window.luxuryPresence.formatSliderAreaRange = (0, $fa0280e505379701$export$94d36f806562393e).formatSliderAreaRange.bind((0, $fa0280e505379701$export$94d36f806562393e));
// method below doesn't use 'this', but just to be safe in case of further method updates
window.luxuryPresence.getSearchFormValues = (0, $fa0280e505379701$export$94d36f806562393e).getSearchFormValues.bind((0, $fa0280e505379701$export$94d36f806562393e));
window.luxuryPresence.handlebarsHelpersFactory = function(handlebarsInstance) {
    return (0, (/*@__PURE__*/$parcel$interopDefault($53de3c160faf5a81$exports)))(handlebarsInstance, {
        isEqual (a, b) {
            // eslint-disable-next-line
            return a == b;
        }
    });
};



})();
//# sourceMappingURL=lp-sdk.js.map

    </script>

    <script>
        var lpGlobalInitialized = false;

        function lpGlobalInit () {
          if (lpGlobalInitialized) {
            return;
          }
            lpGlobalInitialized = true;
            // Initialize wow animation plugin only according to turbolinks
            var wow;
            if (window.WOW) {
                wow = new WOW({
                    animateClass: 'animated',
                    offset: wowOffset,
                    live: false,
                    callback: function(box) {}
                });
            }
            // Initialize handlebar helpers only once
            function handlebarsInit() {
              if (!window.Handlebars) {
                return;
              }
              HandlebarsIntl.registerWith(Handlebars);
              Handlebars.registerHelper(window.luxuryPresence.handlebarsHelpersFactory(Handlebars));
            }

            handlebarsInit();

            /* Initialize Luxury Presence SDK */
            try {
                window.luxuryPresence.config.setCompany("4c87ae7a-8145-44a2-8253-f39b6c97db14", {});
                window.luxuryPresence.config.setWebsite("8f5c232f-d16e-40cf-b261-6a29a59271b6", {
                    myhomeDashboardEnabled: true
                });
                const url = new URL(window.location.href);
                const shareId = url.searchParams.get('shareId');
                window.luxuryPresence.config.setPage("5666b081-1904-44f7-a9c5-54b41e1b56ed", {
                    sourceResource: "",
                    pageElementId: "",
                    pageQueryVariables: {},
                    shareId: "",
                });
                window.luxuryPresence.config.setWebsiteApiGatewayUrl("https://wgw.luxurypresence.com", {});
                window.luxuryPresence.config.setBuyerSellerServiceUrl("https://bss.luxurypresence.com", {});
                    window.luxuryPresence.config.setDivolteServiceUrl("https://t.luxurypresence.com", {});
                  window.luxuryPresence.config.setEventBusUrl("https://cdn.luxurypresence.com/scripts/event-bus-js", {});
                  window.luxuryPresence.config.setEventBus({
                    enabled: true,
                    apiKey: "phc_PMYT31xlmXBaTCwpIRx1v6RrpLVZIuP47N3mOT6KLnr",
                    url: "https://p.luxurypresence.com",
                  });
                window.luxuryPresence.config.setTemplateId("292e3d0e-c228-46ca-b88b-a9b581db5425", {});
                window.luxuryPresence.config.setLeadIngesterUrl("https://leads.luxurypresence.com", {});
                window.luxuryPresence.buttons.initialize({});
                window.luxuryPresence.eventBus.initialize({});
                window.luxuryPresence.contactForms.initialize({});
                window.luxuryPresence.validation.initialize({});
                window.luxuryPresence.expandSliders.initialize({});
                window.luxuryPresence.oauth.initialize({ googleSignOnEnabled: true, iframe: false });
                window.luxuryPresence.qualifyingQuestionsModal.initialize({ qualifyingQuestionsModalEnabled: true });
                    window.luxuryPresence.divolte.initialize({});
            } catch (e) {
                console.log(e);
            }

            /* Inject Section Specific Javascript */
                try {
(function init(sectionDomId) {
  var x, i, j, selElmnt, a, b, c;
  x = document.getElementsByClassName("custom-select");
  for (i = 0; i < x.length; i++) {
    selElmnt = x[i].getElementsByTagName("select")[0];
    a = document.createElement("DIV");
    a.setAttribute("class", "select-selected");
    a.innerHTML = selElmnt.options[selElmnt.selectedIndex].innerHTML;
    x[i].appendChild(a);
    b = document.createElement("DIV");
    b.setAttribute("class", "select-items select-hide");
    for (j = 1; j < selElmnt.length; j++) {
      c = document.createElement("DIV");
      c.innerHTML = selElmnt.options[j].innerHTML;
      c.addEventListener("click", function (e) {
        var y, i, k, s, h;
        s = this.parentNode.parentNode.getElementsByTagName("select")[0];
        h = this.parentNode.previousSibling;
        for (i = 0; i < s.length; i++) {
          if (s.options[i].innerHTML == this.innerHTML) {
            s.selectedIndex = i;
            h.innerHTML = this.innerHTML;
            y = this.parentNode.getElementsByClassName("same-as-selected");
            for (k = 0; k < y.length; k++) {
              y[k].removeAttribute("class");
            }
            this.setAttribute("class", "same-as-selected");
            break;
          }
        }
        h.click();
      });
      b.appendChild(c);
    }
    x[i].appendChild(b);
    a.addEventListener("click", function (e) {
      e.stopPropagation();
      closeAllSelect(this);
      this.nextSibling.classList.toggle("select-hide");
      this.classList.toggle("select-arrow-active");
    });
  }
  function closeAllSelect(elmnt) {
    var x,
      y,
      i,
      arrNo = [];
    x = document.getElementsByClassName("select-items");
    y = document.getElementsByClassName("select-selected");
    for (i = 0; i < y.length; i++) {
      if (elmnt == y[i]) {
        arrNo.push(i);
      } else {
        y[i].classList.remove("select-arrow-active");
      }
    }
    for (i = 0; i < x.length; i++) {
      if (arrNo.indexOf(i)) {
        x[i].classList.add("select-hide");
      }
    }
  }
  document.addEventListener("click", closeAllSelect);
  $('.contact-form-close').click(function () {
    $('body').removeClass('locked');
  });
  $(".contact-form_cls").submit(function (event) {
    $('body').removeClass('locked');
  });
  $('#' + sectionDomId + " .contact-form_cls").on("reset", function () {
    $(this).find(".custom-select").each(function () {
      let linkedSelect = $(this).find("select")[0];
      $(this).find(".select-selected").text(linkedSelect.children[0].innerText);
      $(this).find(".select-items div").removeClass("same-as-selected");
    });
    if ($('#' + sectionDomId + ' .redirect-link').length) {
      $('#' + sectionDomId + ' .redirect-link')[0].click();
    }
  });
})('modal-global-contact-us');
} catch(e) {
console.log(e);
}
                
                
                try {
(function init(sectionDomId, options) {
  var elementSelector = options.elementSelector || 'nav';
  var element = document.querySelector(elementSelector);
  var sections = document.querySelectorAll('body > section');
  var subNavContainers = element.querySelectorAll('.sub-nav');
  var initialBackgroundColor = options.initialBackgroundColor || element.style.backgroundColor;
  var backgroundColorScroll = options.backgroundColorScroll || '#191919';
  var fontColor = options.fontColor || '#fff';
  var fontColorScroll = options.fontColorScroll || '#000';
  var didScroll = false;
  var lastScrollTop = 0;
  var delta = 5;

  // eslint-disable-next-line sonarjs/no-collapsible-if
  if (wow) {
    // Wowjs might not trigger for position fixed elements
    if (window.scrollY > 0) {
      element.querySelectorAll('.wow').forEach(el => wow.show(el));
    }
  }
  function adjustNavPinState() {
    // Remove 'visible' class from all subNavContainers
    for (let i = 0; i < subNavContainers.length; i++) {
      subNavContainers[i].classList.remove('visible');
    }
    if (window.scrollY > 0) {
      element.style.backgroundColor = backgroundColorScroll;
      element.style.color = fontColorScroll;
      element.classList.add('scroll');
    } else {
      element.style.backgroundColor = initialBackgroundColor;
      element.style.color = fontColor;
      element.classList.remove('scroll');
    }
  }
  adjustNavPinState();
  function onScroll() {
    didScroll = true;
  }
  window.addEventListener('scroll', onScroll);

  // eslint-disable-next-line
  var debounceInterval = setInterval(() => {
    if (didScroll) {
      // eslint-disable-next-line
      hasScrolled();
      didScroll = false;
    }
  }, 250);
  function hasScrolled() {
    adjustNavPinState();
    // eslint-disable-next-line
    var navbarHeight = element.offsetHeight;
    // eslint-disable-next-line
    var st = window.scrollY;

    // Make sure they scroll more than delta
    if (Math.abs(lastScrollTop - st) <= delta) {
      return;
    }
    if (st > lastScrollTop && st > navbarHeight) {
      // Scroll Down
      element.style.transform = `translateY(-${navbarHeight}px) scaleY(0)`;
      document.documentElement.style.setProperty('--global-header-height', '0px');

      // Some sections "follow" the navbar with class sticky (i.e. Producer search)
      sections.forEach(section => {
        if (section.classList.contains('sticky')) {
          section.style.top = '0px';
        }
      });
    } else {
      // Scroll Up
      // eslint-disable-next-line
      if (st + window.innerHeight < document.documentElement.scrollHeight) {
        element.style.transform = `translateY(0) scaleY(1)`;
        document.documentElement.style.setProperty('--global-header-height', `${navbarHeight}px`);
        sections.forEach(section => {
          if (section.classList.contains('sticky')) {
            section.style.top = `${navbarHeight}px`;
          }
        });
      }
    }
    lastScrollTop = st;
  }
})('NAVBAR', JSON.parse("{\"fontColor\":\"#fff\",\"elementSelector\":\".header\",\"fontColorScroll\":\"#171819\",\"backgroundColorScroll\":\"#fff\",\"initialBackgroundColor\":\"rgba(0,0,0,0)\"}"));
} catch(e) {
console.log(e);
}
                try {
(function init(sectionDomId) {
  $('body .sidemenu .toggle').click(function () {
    $('body').removeClass('locked');
    $('.hamburger-component').removeClass('active');
  });
  var $globalLoader = $('#global-loader');

  if ($globalLoader[0]) {
    document.body.style.overflow = "hidden";
    document.body.style.width = "100%";
    document.body.style.position = "fixed";
    setTimeout(function () {
      document.body.style.overflow = "";
      document.body.style.width = "";
      document.body.style.position = "";
    }, 1000);
  }
})('global-sidemenu');
} catch(e) {
console.log(e);
}
                
                try {
(function init(sectionDomId) {
  const mapContainer = document.querySelector(`#${sectionDomId} .map-container`);
  window.luxuryPresence.mapApiLoader.load().then(() => {
    if (mapContainer) {
      const lat = mapContainer.getAttribute('data-lat');
      const lng = mapContainer.getAttribute('data-lng');
      const zoom = parseInt(mapContainer.getAttribute('data-zoom') || '12');
      const width = mapContainer.offsetWidth;
      const height = mapContainer.offsetHeight;
      window.luxuryPresence.mapApiLoader.generateDigitallySignedStaticMapUrl({
        srcWidth: parseInt(width),
        srcHeight: parseInt(height),
        zoom,
        center: `${lat},${lng}`,
        markers: `${lat},${lng}`
      }).then(url => {
        const img = document.createElement('img');
        img.setAttribute('src', url);
        img.setAttribute('alt', 'Map');
        img.onclick = function () {
          mapContainer.removeChild(img);
          initializeMap({
            lat: parseFloat(lat),
            lng: parseFloat(lng)
          }, zoom);
        };
        mapContainer.appendChild(img);
      });
    }
  });
  function initializeMap(latLong, zoom = 12) {
    const url = 'https://www.google.com/maps/search/?api=1&query=' + latLong.lat + ',' + latLong.lng;
    const map = new google.maps.Map(mapContainer, {
      center: latLong,
      zoom
    });
    const marker = new google.maps.Marker({
      position: latLong,
      map: map
    });
    marker.addListener('click', function () {
      window.open(url, '_blank');
    });
  }
})('global-footer');
} catch(e) {
console.log(e);
}
                
                try {
(function init(sectionDomId) {
  var _section = $('#' + sectionDomId);
  var _footer = document.getElementById('global-footer');
  const emailInput = _section.find('.js-email-input');
  const emailRegex = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~\-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+/;
  emailInput.on('input', function () {
    if (emailRegex.test(this.value)) {
      this.setCustomValidity('');
    } else {
      this.setCustomValidity('Please enter a valid email address.');
    }
    this.reportValidity();
  });
  _section.find('input[name="name"]').on("keyup", function () {
    if (this.value.replaceAll(/\d/g, "").trim().split(" ").length < 2 || this.value.replaceAll(/\d/g, "").trim() === "") {
      this.setCustomValidity("Please input your first name and last name.");
    } else {
      this.setCustomValidity("");
    }
  });
  _section.find('form').on("reset", function () {
    $(this).addClass("show-success");
  });
  $(window).scroll(function () {
    if ($(this).scrollTop() >= 150) _section.find('.btn-holder').addClass('visible');else _section.find('.btn-holder').removeClass('visible');
  });
  _section.find('.close-btn, .connect-btn').click(function () {
    _section.find('.pop-up').toggle();
    _section.find('.btn-holder').toggle();
  });
  if (!_footer) return;
  const observer = new IntersectionObserver(entries => {
    entries.forEach(entry => {
      if (entry.isIntersecting) _section.hide();else _section.show();
    });
  }, {
    threshold: 0.1
  });
  observer.observe(_footer);
  function selectToDropdown(selectItem) {
    let customDropdown = `
        <div class="custom-select" role="presentation">
        <button class="custom-select-toggle is-placeholder" type="button" aria-haspopup="true" aria-expanded="false"></button>
        <div class="custom-select-menu" style="display: none;max-height: none;">
        <div class="custom-select-content">
        </div>
        </div>
        </div>`;
    $(customDropdown).insertAfter(selectItem);
    let $dropdown = $($(selectItem).next());
    let $dropdownToggle = $dropdown.find(".custom-select-toggle");
    let $dropdownMenu = $dropdown.find(".custom-select-menu");
    let $dropdownContent = $dropdown.find(".custom-select-content");
    $dropdownToggle.addClass($(selectItem).attr("class")).removeClass("dropdown-select");
    $dropdownToggle.attr("id", $(selectItem).attr("id") + "custom");
    $dropdownMenu.attr("aria-labelledby", $dropdownToggle.attr("id"));
    appendOptionButtons(selectItem, $dropdownContent);
    $(selectItem).removeClass().addClass("sr-only");
    var toggleText = $(selectItem).find(":selected").first().text() || $(selectItem).children().first().text();
    $dropdownToggle.html(toggleText);
    $dropdown.on("click", ".custom-select-item", function (e) {
      if ($(this).hasClass("is-disabled")) return;
      let elementNumber = $(this).index();
      let $originalSelect = $(this).closest(".custom-select").siblings("select");
      let $linkedOption = $originalSelect.find("option").eq(elementNumber);
      if (!$linkedOption.prop("selected")) {
        $linkedOption.prop("selected", true);
        $originalSelect.change();
        $(this).addClass("is-selected").siblings(".custom-select-item").removeClass("is-selected");
        $dropdownToggle.html($(this).html());
        closeSelectMenu($(this).closest(".custom-select-menu"));
      }
      $dropdownToggle.removeClass("is-placeholder");
    });
    function convertOptionToButton(option) {
      var optionText = $(option).text();
      var optionValue = $(option).attr("value") || $(option).text();
      var optionIsDisabled = $(option).prop("disabled");
      var outputButton = `<button value="${optionValue}" class="custom-select-item" type="button" ${optionIsDisabled ? "disabled" : ""}>${optionText}</button>`;
      return outputButton;
    }
    function appendOptionButtons(selectItem, appendTarget) {
      $(selectItem).find("option").each(function () {
        let currentButton = convertOptionToButton(this);
        $(appendTarget).append(currentButton);
      });
    }
    function showSelectMenu(selectMenu) {
      var customSelect = $(selectMenu).closest(".custom-select")[0];
      $(customSelect).addClass("open");
      $(selectMenu).slideDown();
    }
    function closeSelectMenu(selectMenu) {
      var customSelect = $(selectMenu).closest(".custom-select")[0];
      $(customSelect).removeClass("open");
      $(selectMenu).slideUp();
    }
    $dropdown.on("click", ".custom-select-toggle", function (e) {
      var $customSelect = $(this).closest(".custom-select");
      var selectMenu = $customSelect.find(".custom-select-menu")[0];
      if ($customSelect.hasClass("open")) {
        closeSelectMenu(selectMenu);
      } else {
        showSelectMenu(selectMenu);
      }
    });
    $(document).on("click", function (e) {
      if ($(e.target).closest(".custom-select").length < 1 && $(".custom-select").hasClass("open")) {
        $(".custom-select.open").each(function () {
          var selectMenu = $(this).find(".custom-select-menu")[0];
          closeSelectMenu(selectMenu);
        });
      }
    });
  }
  $(".pop-up select[name='interest']").each(function () {
    selectToDropdown(this);
  });
})('global-mobile-contact');
} catch(e) {
console.log(e);
}
                
                try {
(function init(sectionDomId, options) {
  let section = null;
  switch (sectionDomId) {
    case 'NAVBAR':
      section = document.querySelector('body > nav, #global-navbar');
      break;
    case 'FOOTER':
      section = document.querySelector('body > footer, #global-footer');
      break;
    case 'SIDEMENU':
      section = document.querySelector('body > div.sidemenu, #global-sidemenu');
      break;
    case 'CONTACT':
      section = document.querySelector('#modal-global-contact-us');
      break;
    case 'MOBILE_CONTACT':
      section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact');
      break;
    case 'SUBSCRIBE':
      // Subscribe Not Implemented
      section = null;
      break;
    case 'ACCOUNT':
      // Account Not Implemented
      section = null;
      break;
    default:
      section = document.querySelector('#' + sectionDomId);
  }
  if (!section) {
    return;
  }

  // Where content / items are rendered
  const dataContainer = section.querySelector('.data-container');
  if (!dataContainer) {
    // no place to render items = no need to query server or do anything else
    return;
  }
  let variables = options.variables || {};

  // Some variables in options may not have been injected - remove
  Object.keys(variables).forEach(function (variableName) {
    if (typeof variables[variableName] === 'string' && variables[variableName].match(/^{{.*}}$/)) {
      delete variables[variableName];
    }
  });

  // Merge page query variables
  if (options.usePageResource) {
    variables = {
      ...variables,
      ...window.luxuryPresence.config.pageMeta.pageQueryVariables[options.resource]
    };
  }

  // Pagination Executes on a Numbered Pagination Container
  //  Or via a load more button
  let mode = 'BUTTONLESS_PAGINATION';
  const container = section.querySelector('.pagination-container');
  const loadMoreButton = section.querySelector(options?.loadMoreSelector);
  if (container) {
    mode = 'NUMBERED_PAGINATION';
  }
  if (loadMoreButton) {
    mode = 'LOAD_MORE_BUTTON';
  }
  let searchContainer = section.querySelector('.search-container');
  const hidePaginationOnFirstPage = options.hidePaginationOnFirstPage || false;
  const eventPrefix = '__pagination-';
  const searchFormParams = options.searchFormParams || (options.resource === 'properties' ? [{
    param: 'neighborhoodId',
    urlKey: 'neighborhood'
  }, {
    param: 'search',
    urlKey: 'search'
  }, {
    param: 'salesPriceGTE',
    urlKey: 'pricemin',
    formKey: 'priceMin',
    type: 'int'
  }, {
    param: 'salesPriceLTE',
    urlKey: 'pricemax',
    formKey: 'priceMax',
    type: 'int'
  }, {
    param: 'livingSpaceSizeGTE',
    urlKey: 'areamin',
    formKey: 'areaMin',
    type: 'int'
  }, {
    param: 'livingSpaceSizeLTE',
    urlKey: 'areamax',
    formKey: 'areaMax',
    type: 'int'
  }] : []);

  // Total entries - initialized in first render
  let totalNumber = 0;
  const DefaultSearchParams = {
    page: 1
  };
  searchFormParams.forEach(function (formParam) {
    DefaultSearchParams[formParam.formKey || formParam.param] = null;
  });
  let searchParams = {
    ...DefaultSearchParams
  };
  const offset = options.variables?.offset || 0;
  let scrollTarget = options.scrollTargetSelector ? section.querySelector(options.scrollTargetSelector) || section : section;
  let scrollOffset = (parseInt(options.scrollOffset, 10) || 0) ?? 100;

  // entries of per page
  // when query variables for a given section would't be filled options.pageSize can store
  // template string, ex: "{{variables.limit}}", below code handles that case and set 9 as a default value
  let pageSize = parseInt(options.pageSize, 10) || 9;

  // Adding mobile pageRange support
  var NARROW_BREAKPOINT = 600;
  var mobileBreakpoint = options.mobileBreakpoint > 0 ? options.mobileBreakpoint : NARROW_BREAKPOINT;
  var paginationMql = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`);

  // Page range (pages on both sides of the current page)
  var mobilePageRange = options.mobilePageRange > 0 ? options.mobilePageRange : 0;
  var desktopPageRange = options.pageRange >= 0 ? options.pageRange : 2;
  var pageRange = paginationMql.matches ? mobilePageRange : desktopPageRange;

  // Whether to display the 'Previous' button
  var showPrevious = true;

  // Whether to display the 'Next' button
  var showNext = true;

  // Whether to display the page buttons
  var showPageNumbers = true;

  // 'Previous' text
  var prevText = options.prevText || '&laquo;';

  // 'Next' text
  var nextText = options.nextText || '&raquo;';

  // Ellipsis text
  var ellipsisText = '&hellip;';
  var classPrefix = 'paginationjs';

  // Default active class
  var activeClassName = 'active';

  // Default disable class
  var disableClassName = 'disabled';

  // Pagination element's position in the container
  var position = 'bottom';

  // Whether to trigger pagination at initialization
  var triggerPagingOnInit = !options.skipInitialLoad;
  var showFirstOnEllipsisShow = true;
  var showLastOnEllipsisShow = true;

  // Instantiated in init()
  var el = null;

  // Controls scrollTop logic
  var firstRender = true;
  var renderBySearch = false;
  var disabled = false;

  // Pagination script class selector
  var paginationScriptSelector = options.paginationPartialName ? `.${options.paginationPartialName}` : '.pagination-script';

  // Property Specific Image Override if No Image
  var propertyPlaceholderImage = window.luxuryPresence.defaults.propertyPlaceholderImage;

  // Construct template
  var templateHTML = section.querySelector(`script${paginationScriptSelector}`)?.innerHTML || '';
  var template = Handlebars.compile(templateHTML);

  // Initialize
  init();
  function init() {
    Object.assign(searchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId));

    // Append/prepend pagination element to the pagination container
    if (mode === 'NUMBERED_PAGINATION') {
      el = document.createElement('div');
      el.className = 'paginationjs';
      container[position === 'bottom' ? 'append' : 'prepend'](el);
    }
    if (searchContainer) {
      initSearchContainer({
        fetchNeighborhoods: searchContainer.dataset.fetchNeighborhoods === 'true',
        fetchPostCategories: searchContainer.dataset.fetchPostCategories === 'true',
        fetchOffices: searchContainer.dataset.fetchOffices === 'true',
        fetchRentalRates: searchContainer.dataset.fetchRentalRates === 'true'
      }, function () {
        syncSearchFormState(searchParams);
      });
    }

    // Bind events
    observer();
  }
  function syncSearchFormState(params) {
    searchContainer.dispatchEvent(new CustomEvent('sync', {
      detail: params
    }));
  }
  function initSearchContainer(options, done) {
    var promises = [];
    if (options.fetchNeighborhoods) {
      promises.push(fetchAllNeighborhoods(function (neighborhoods) {
        searchContainer.dispatchEvent(new CustomEvent('neighborhoods-data', {
          detail: {
            data: neighborhoods.map(function (item) {
              return {
                value: item.id,
                label: item.name
              };
            })
          }
        }));
      }));
    }
    if (options.fetchPostCategories) {
      promises.push(fetchPostCategories(function (categories) {
        searchContainer.dispatchEvent(new CustomEvent('post-categories-data', {
          detail: {
            data: categories
          }
        }));
      }));
    }
    if (options.fetchOffices) {
      promises.push(fetchOffices(function (offices) {
        searchContainer.dispatchEvent(new CustomEvent('offices-data', {
          detail: {
            data: offices
          }
        }));
      }));
    }
    if (options.fetchRentalRates) {
      promises.push(fetchAllRentalRates(function (rentalRates) {
        searchContainer.dispatchEvent(new CustomEvent('rental-rates-data', {
          detail: {
            data: rentalRates
          }
        }));
      }));
    }
    if (promises.length > 0) {
      Promise.all(promises).then(function () {
        done();
      });
    } else {
      // element's custom code is not executed yet, so we're scheduling callback to after element's code
      setTimeout(done);
    }
  }
  function fetchAllNeighborhoods(done) {
    var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl;
    var gqlQuery = 'query ($companyId: String, $withProperties: NeighborhoodPropertiesFilter, $withBlogPosts: NeighborhoodBlogPostsFilter, $offset: Int, $limit: Int) {' + 'neighborhoods (companyId: $companyId, withProperties: $withProperties, withBlogPosts: $withBlogPosts, offset: $offset, limit: $limit) {id, name}}';
    var payload = {};
    payload.offset = 0;
    payload.limit = 100;
    payload.companyId = variables.companyId;
    if (options.resource === 'properties') {
      payload.withProperties = {
        active: true
      };
      ['agentIds', 'tag', 'propertyTypeId', 'statusIds', 'architectureStyle', 'lifestyle', 'salesPriceGTE', 'salesPriceLTE', 'leasePriceGTE', 'leasePriceLTE', 'livingSpaceSizeGTE', 'livingSpaceSizeLTE', 'bathCountGTE', 'bathCountLTE', 'bedroomCountGTE', 'bedroomCountLTE', 'bathCountGTE', 'bathCountLTE', 'bedroomCountGTE', 'bedroomCountLTE', 'featuredListing', 'leaseProperty', 'neighborhoodId', 'developmentId', 'openHouse'].forEach(function (field) {
        if (variables[field] !== undefined && variables[field] !== null) {
          payload.withProperties[field] = variables[field];
        }
      });
    }
    if (options.resource === 'posts') {
      payload.withBlogPosts = {
        active: true
      };
      ['search', 'postStatusId', 'featured', 'categoryId', 'categoryIds', 'neighborhoodId', 'slug'].forEach(function (field) {
        if (variables[field] !== undefined && variables[field] !== null) {
          payload.withBlogPosts[field] = variables[field];
        }
      });
    }
    superagent.post(url + '/graphql').withCredentials().send({
      query: gqlQuery,
      variables: payload
    }).then(function (res) {
      var items = res.body.data && res.body.data.neighborhoods || [];
      done(items, items.length);
    });
  }
  function fetchPostCategories(done) {
    var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl;
    var featured = options.resource === 'posts' && !!variables.featured;
    var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'postCategories (companyId: $companyId, offset: $offset, limit: $limit ' + (featured ? ' withFeaturedPublishedOnly: true' : ' withPublishedOnly: true') + ') {id, name, publishedCount, featuredPublishedCount}}';
    var payload = {};
    payload.offset = 0;
    payload.limit = 100;
    payload.companyId = variables.companyId;
    superagent.post(url + '/graphql').withCredentials().send({
      query: gqlQuery,
      variables: payload
    }).then(function (res) {
      var items = res.body.data && res.body.data.postCategories || [];
      done(items.map(function (item) {
        item.count = featured ? item.featuredPublishedCount : item.publishedCount;
        return item;
      }), items.length);
    });
  }
  function fetchOffices(done) {
    var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl;
    var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'offices (companyId: $companyId, offset: $offset, limit: $limit) {' + 'id, name, tags}}';
    var payload = {
      offset: 0,
      limit: 100,
      companyId: variables.companyId
    };
    superagent.post(url + '/graphql').withCredentials().send({
      query: gqlQuery,
      variables: payload
    }).then(function (res) {
      var items = res.body.data && res.body.data.offices || [];
      done(items, items.length);
    });
  }
  function fetchAllRentalRates(done) {
    var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl;
    var gqlQuery = 'query ($companyId: String, $offset: Int, $limit: Int) {' + 'rentalRates (companyId: $companyId, offset: $offset, limit: $limit) {rentalRateId, label}}';
    var payload = {
      offset: 0,
      limit: 100,
      companyId: variables.companyId
    };
    superagent.post(url + '/graphql').withCredentials().send({
      query: gqlQuery,
      variables: payload
    }).then(function (res) {
      var items = res.body.data && res.body.data.rentalRates || [];
      done(items, items.length);
    }).catch(function (err) {
      console.error('Error fetching rental rates:', err);
      done([], 0);
    });
  }
  function fetchData(params, done) {
    var url = options.url || window.luxuryPresence.defaults.apiGatewayUrl;
    var resource = options.resource;
    var gqlQuery = options.query || window.luxuryPresence.defaults.gql[resource];
    var payload = {};
    try {
      payload = JSON.parse(JSON.stringify(variables));
    } catch (e) {
      Object.keys(variables).forEach(function (variableName) {
        payload[variableName] = variables[variableName];
      });
    }
    payload.offset = (params.page - 1) * pageSize + offset;
    payload.limit = pageSize;
    payload.companyId = options.companyId;
    searchFormParams.forEach(function (formParam) {
      var val = params[formParam.formKey || formParam.param];
      if (val !== null && val !== undefined) {
        objSet(payload, formParam.param, val);
      }
    });

    // TODO: Disabled loading due to jarring effect
    // dataContainer.html('Loading...');
    superagent.post(url + '/graphql').withCredentials().send({
      query: gqlQuery,
      variables: payload
    }).then(function (res) {
      if (res.body.errors) {
        done(res.body.errors);
        return;
      }
      var data = res.body.data || {};
      var resources = data[resource] || [];
      var resourceCount = data[resource + 'Count'] && data[resource + 'Count'].count ? data[resource + 'Count'].count : 0;
      if (resource === 'properties' && propertyPlaceholderImage?.id) {
        resources = resources.map(resource => {
          if (resource.media?.length === 0) {
            return Object.assign(resource, {
              media: [propertyPlaceholderImage]
            });
          }
          return resource;
        });
      }
      done(null, resources, resourceCount);
    });
  }
  function getTotalPage() {
    return Math.ceil(totalNumber / pageSize);
  }
  function renderPaginationList() {
    var totalPages = getTotalPage();
    var rangeStart = searchParams.page - pageRange;
    var rangeEnd = searchParams.page + pageRange;
    if (rangeEnd > totalPages) {
      rangeEnd = totalPages;
      rangeStart = totalPages - pageRange * 2;
      rangeStart = rangeStart < 1 ? 1 : rangeStart;
    }
    if (rangeStart <= 1) {
      rangeStart = 1;
      rangeEnd = Math.min(pageRange * 2 + 1, totalPages);
    }

    // Making sure that 1 more page button is shown in edge positions
    if (pageRange === 0) {
      if (searchParams.page === totalPages) {
        rangeStart = totalPages <= 1 ? 1 : totalPages - 1;
      }
      if (searchParams.page === 1) {
        rangeEnd = Math.min(2, totalPages);
      }
    }

    // Render pagination list
    if (mode === 'NUMBERED_PAGINATION') {
      el.innerHTML = generateHTML({
        currentPage: searchParams.page,
        pageRange: pageRange,
        rangeStart: rangeStart,
        rangeEnd: rangeEnd
      });
      if (totalPages < 2 && hidePaginationOnFirstPage) {
        container.style.display = 'none';
      } else {
        container.style.display = '';
      }
    } else if (mode === 'LOAD_MORE_BUTTON') {
      if (searchParams.page >= totalPages) {
        loadMoreButton.style.display = 'none';
      } else {
        loadMoreButton.style.display = '';
      }
    }
  }
  function render(data) {
    renderPaginationList();

    // Render new content with handlebars
    var html = '';
    if (mode === 'LOAD_MORE_BUTTON' && searchParams.page > 1) {
      // If using load more, append search results to existing results
      html = dataContainer.innerHTML;
    }
    for (var i = 0; i < data.length; i++) {
      var itemData = recursivelyParse(data[i]);
      itemData.sectionIndex = options.sectionIndex;
      itemData.renderOptions = options.renderOptions;
      html += template(itemData);
    }
    dataContainer.innerHTML = html;

    // Scroll Top
    if (!firstRender && mode === 'NUMBERED_PAGINATION' && (!renderBySearch || !options.skipScrollOnSearch)) {
      // Only animate to the top if we replace dataContainer (numbered pagination)
      setTimeout(() => {
        const scrollTargetOffsetTop = scrollTarget.getBoundingClientRect().top + window.scrollY - scrollOffset;
        window.scrollTo({
          top: scrollTargetOffsetTop,
          behavior: 'smooth'
        });
      }, 250);
    }
    return true;
  }
  function generateHTML(args) {
    const totalPages = getTotalPage();
    const {
      rangeStart,
      rangeEnd
    } = args;
    const makeLnk = page => window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, {
      ...searchParams,
      page
    });
    let html = '';
    if (showPrevious || showPageNumbers || showNext) {
      html += '<div class="paginationjs-pages"><ul>';

      // Previous button
      if (showPrevious) {
        if (searchParams.page <= 1) {
          html += `<li class="${classPrefix}-prev ${disableClassName}"><a>${prevText}</a></li>`;
        } else {
          html += `<li class="${classPrefix}-prev J-paginationjs-previous" data-num="${searchParams.page - 1}" title="Previous page"><a href="${makeLnk(searchParams.page - 1)}">${prevText}</a></li>`;
        }
      }

      // Pages
      if (showPageNumbers) {
        if (rangeStart <= 3) {
          for (let i = 1; i < rangeStart; i++) {
            html += `<li class="${classPrefix}-page J-paginationjs-page ${i === searchParams.page ? activeClassName : ''}" data-num="${i}"><a ${i === searchParams.page ? '' : `href="${makeLnk(i)}"`}>${i}</a></li>`;
          }
        } else {
          if (showFirstOnEllipsisShow) {
            html += `<li class="${classPrefix}-page ${classPrefix}-first J-paginationjs-page" data-num="1"><a href="${makeLnk(1)}">1</a></li>`;
          }
          html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`;
        }
        for (let i = rangeStart; i <= rangeEnd; i++) {
          html += `<li class="${classPrefix}-page J-paginationjs-page ${i === searchParams.page ? activeClassName : ''}" data-num="${i}"><a ${i === searchParams.page ? '' : `href="${makeLnk(i)}"`}>${i}</a></li>`;
        }
        if (rangeEnd < totalPages - 2) {
          html += `<li class="${classPrefix}-ellipsis ${disableClassName}"><a>${ellipsisText}</a></li>`;
          if (showLastOnEllipsisShow) {
            html += `<li class="${classPrefix}-page ${classPrefix}-last J-paginationjs-page" data-num="${totalPages}"><a href="${makeLnk(totalPages)}">${totalPages}</a></li>`;
          }
        } else {
          for (let i = rangeEnd + 1; i <= totalPages; i++) {
            html += `<li class="${classPrefix}-page J-paginationjs-page" data-num="${i}"><a href="${makeLnk(i)}">${i}</a></li>`;
          }
        }
      }

      // Next button
      if (showNext) {
        if (searchParams.page >= totalPages) {
          html += `<li class="${classPrefix}-next ${disableClassName}"><a>${nextText}</a></li>`;
        } else {
          html += `<li class="${classPrefix}-next J-paginationjs-next" data-num="${searchParams.page + 1}" title="Next page"><a href="${makeLnk(searchParams.page + 1)}">${nextText}</a></li>`;
        }
      }
      html += '</ul></div>';
    }
    return html;
  }
  function go(newSearchParams, callback, restorationVisit) {
    if (disabled) return;
    var goToPageNumber = newSearchParams.page;

    // Page number is out of bounds
    if (!goToPageNumber || goToPageNumber < 1) return;
    var totalPage = getTotalPage();

    // Page number is out of bounds
    if (!restorationVisit && totalNumber > 0) {
      if (goToPageNumber > totalPage) return;
    }
    if (!options.skipSerialization && (mode === 'NUMBERED_PAGINATION' || searchContainer)) {
      var newURL = window.luxuryPresence.pagination.serializeParams(searchFormParams, sectionDomId, {
        ...newSearchParams,
        page: goToPageNumber !== 1 && mode === 'NUMBERED_PAGINATION' ? newSearchParams.page : null
      });
      if (!areQueryParamsEqual(newSearchParams, searchParams) && !restorationVisit) {
        window.history.pushState({}, '', window.luxuryPresence.getPath(newURL, {
          queryString: true
        }));
      }
    }

    // Fetch and update page
    fetchData(newSearchParams, renderWithData);
    disabled = true;
    function renderWithData(err, data, count) {
      if (err) {
        dataContainer.dispatchEvent(new Event('error'));
      } else {
        searchParams = {
          ...newSearchParams
        };
        totalNumber = count - offset;
        if (data.length === 0) {
          dataContainer.dispatchEvent(new Event('no-data'));
        } else {
          dataContainer.dispatchEvent(new Event('data'));
        }
        render(data);
        firstRender = false;
      }
      disabled = false;
      renderBySearch = false;
    }
  }
  function areQueryParamsEqual(first, second) {
    var differ = Object.keys(first).find(function (key) {
      return first[key] !== undefined && first[key] !== null && first[key] !== second[key];
    });
    if (differ) {
      return false;
    }
    differ = Object.keys(second).find(function (key) {
      return second[key] !== undefined && second[key] !== null && second[key] !== first[key];
    });
    return !differ;
  }
  function next(callback) {
    go({
      ...searchParams,
      page: searchParams.page + 1
    }, callback);
  }
  function previous(callback) {
    go({
      ...searchParams,
      page: searchParams.page - 1
    }, callback);
  }
  function refresh(callback) {
    go(searchParams, callback);
  }
  function update(params, callback) {
    renderBySearch = true;
    go(params, callback);
  }
  function observer() {
    if (searchContainer) {
      searchContainer.addEventListener('search', function (event, newSearchParams) {
        newSearchParams = event.detail || newSearchParams;
        update({
          ...searchParams,
          ...newSearchParams,
          page: 1
        });
      });
      searchContainer.addEventListener('clear-search', function () {
        const defaultSearchParams = {
          ...DefaultSearchParams
        };
        const isCurrentSearchFormStateDefault = areQueryParamsEqual({
          ...defaultSearchParams,
          page: null
        }, {
          ...searchParams,
          page: null
        });

        // if mode is LOAD_MORE_BUTTON we should't make anything on clear
        // when search form have default state
        if (isCurrentSearchFormStateDefault && mode !== 'NUMBERED_PAGINATION') {
          return;
        }

        // if someone initially go to some page and click 'Clear' on search from
        // we should't navigate to first page. We should preserve page value
        if (isCurrentSearchFormStateDefault) {
          defaultSearchParams.page = searchParams.page;
        }
        syncSearchFormState(defaultSearchParams);
        update(defaultSearchParams);
      });
    }
    if (mode === 'LOAD_MORE_BUTTON') {
      loadMoreButton.addEventListener('click', function (event) {
        go({
          ...searchParams,
          page: searchParams.page + 1
        });
        return false;
      });
    }
    if (mode === 'LOAD_MORE_BUTTON' || mode === 'BUTTONLESS_PAGINATION') {
      // Do initial render
      go(Object.assign({}, searchParams, {
        page: 1
      }));
      return;
    }
    if (mode === 'NUMBERED_PAGINATION') {
      // Go to specified page number
      container.addEventListener(eventPrefix + 'go', function (event) {
        let {
          pageNumber,
          done
        } = event.detail || {};
        pageNumber = parseInt(pageNumber, 10);
        if (!pageNumber) {
          return;
        }
        go({
          ...searchParams,
          page: pageNumber
        }, done);
      });

      // Page number button click
      el.addEventListener('click', function (event) {
        let clickTarget = event.target;
        let current = clickTarget.closest('.J-paginationjs-page, .J-paginationjs-previous, .J-paginationjs-next');
        let pageNumber = current?.getAttribute('data-num');
        if (!pageNumber || current.classList.contains(disableClassName) || current.classList.contains(activeClassName)) {
          return;
        } else {
          go({
            ...searchParams,
            page: parseInt(pageNumber, 10)
          });
        }
        event.preventDefault();
      });

      // Whether to load the default page
      var defaultPageNumber = searchParams.page;
      if (triggerPagingOnInit) {
        container.dispatchEvent(new CustomEvent(eventPrefix + 'go', {
          detail: {
            pageNumber: defaultPageNumber
          }
        }));
      }
    }
    window.addEventListener('popstate', function (event) {
      var newParams = Object.assign({}, DefaultSearchParams, window.luxuryPresence.pagination.deserializeParams(searchFormParams, sectionDomId));
      if (!areQueryParamsEqual(newParams, searchParams)) {
        go(newParams, null, true);
        if (searchContainer) {
          syncSearchFormState(newParams);
        }
      }
    });
  }
  function replaceVariables(template, variables) {
    var formattedString;
    for (var key in variables) {
      var value = variables[key];
      var regexp = new RegExp('<%=\\s*' + key + '\\s*%>', 'img');
      formattedString = (formattedString || template).replace(regexp, value);
    }
    return formattedString;
  }
  function isTextEditorValue(obj) {
    return 'raw' in obj || 'gjs' in obj;
  }
  function getTextEditorValue(obj) {
    if (!obj.html) {
      return '';
    }
    var data = obj.html;
    var css = (obj.raw || obj.gjs || {}).css;
    if (css) {
      data = data + '<style>' + css + '</style>';
    }
    return data;
  }

  /**
   * check rendered resources for html and raw properties that could indicate if resource is from an advanced text editor.
   * strips out raw proprties and returns only HTML if it exists.
   * @param {Object} resources a collection retrieved from the database
   * @return {Object} the newly modified object.
   */
  function recursivelyParse(resources) {
    forEach(resources, function (value, key) {
      if (!value) {
        return;
      }
      if (value instanceof Object) {
        if (isTextEditorValue(value)) {
          resources[key] = getTextEditorValue(value);
          return;
        } else {
          return recursivelyParse(value);
        }
      }
      try {
        var parsedData = JSON.parse(value);
        if (isTextEditorValue(parsedData)) {
          resources[key] = getTextEditorValue(parsedData);
        }
      } catch (e) {
        // do nothing if we failed to parse value as JSON
      }
    });
    return resources;
  }
  function forEach(collection, iteratee) {
    var func = Array.isArray(collection) ? arrayEach : baseFor;
    return func(collection, iteratee);
  }
  function baseFor(object, iteratee) {
    if (!object) {
      return;
    }
    var iterable = Object(object);
    var props = Object.keys(object);
    var length = props.length;
    var index = -1;
    while (length--) {
      var key = props[++index];
      if (iteratee(iterable[key], key, iterable) === false) {
        break;
      }
    }
    return object;
  }
  function objSet(obj, path, value) {
    const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g);
    pathArray.reduce((acc, key, i) => {
      if (acc[key] === undefined) acc[key] = {};
      if (i === pathArray.length - 1) acc[key] = value;
      return acc[key];
    }, obj);
  }
  function arrayEach(array, iteratee) {
    var index = -1;
    var length = array.length;
    while (++index < length) {
      if (iteratee(array[index], index, array) === false) {
        break;
      }
    }
    return array;
  }
  function selectPageRangeMode(e) {
    pageRange = e.matches ? mobilePageRange : desktopPageRange;
    renderPaginationList();
  }
  paginationMql.addEventListener('change', selectPageRangeMode);
})('section-739fa5af-02ea-4cbe-a7d6-b74dd396d533', JSON.parse("{\"pageSize\":\"{{variables.limit}}\",\"resource\":\"posts\",\"pageRange\":1,\"variables\":{\"limit\":\"{{variables.limit}}\",\"order\":\"publishedAt\",\"offset\":0,\"sortDir\":\"DESC\",\"companyId\":\"4c87ae7a-8145-44a2-8253-f39b6c97db14\",\"categoryId\":\"{{variables.categoryId}}\",\"postStatusId\":\"5f528253-abb7-484e-95c3-330269ac1102\"},\"hidePaginationOnFirstPage\":true,\"companyId\":\"4c87ae7a-8145-44a2-8253-f39b6c97db14\",\"usePageResource\":false,\"sectionIndex\":2}"));
} catch(e) {
console.log(e);
}
                try {
(function init(sectionDomId) {
  // please write all js here and use sectionDomId in selectors in order of DOM encapsulation
})('section-739fa5af-02ea-4cbe-a7d6-b74dd396d533', 'undefined');
} catch(e) {
console.log(e);
}
                try {
(function init(sectionDomId) {
  const form = $("#" + sectionDomId).find("form");
  const redirectLink = $('#' + sectionDomId + ' .redirect-link');
  form.on("reset", function () {
    redirectPage(redirectLink);
  });
  function redirectPage(link) {
    if (link.length) {
      const rawHref = link.attr('href');
      link.attr('href', setHttp(rawHref));
      link[0].click();
    }
  }
  function setHttp(link) {
    if (link.search(/^http[s]?\:\/\/|\//) == -1) {
      link = 'http://' + link;
    }
    return link;
  }
})('section-afef24ca-36ca-4c7b-bcdc-d61d306fcded', 'undefined');
} catch(e) {
console.log(e);
}
                try {
(function init(sectionDomId, options) {
  let section = null;
  switch (sectionDomId) {
    case 'NAVBAR':
      section = document.querySelector('body > nav, #global-navbar');
      break;
    case 'FOOTER':
      section = document.querySelector('body > footer, #global-footer');
      break;
    case 'SIDEMENU':
      section = document.querySelector('body > div.sidemenu, #global-sidemenu');
      break;
    case 'CONTACT':
      section = document.querySelector('#modal-global-contact-us');
      break;
    case 'MOBILE_CONTACT':
      section = document.querySelector('body > div.mobile-contact-wrapper, #global-mobile-contact');
      break;
    case 'SUBSCRIBE':
      // Subscribe Not Implemented
      section = null;
      break;
    case 'ACCOUNT':
      // Account Not Implemented
      section = null;
      break;
    default:
      section = document.querySelector('#' + sectionDomId);
  }
  if (!section) {
    return;
  }
  var url = window.luxuryPresence.defaults.apiGatewayUrl;
  var companyId = window.luxuryPresence.defaults.companyId;
  var limit = options.limit || 8;
  if (typeof limit === 'string') {
    limit = parseInt(limit, 10) || 8; // this NaN protection also filters out 0 - this is expected
  }
  var templateSelector = options.templateSelector || '.jsIGTemplate';
  var containerSelector = options.containerSelector || '.jsIGContainer';
  var hasDataClass = options.hasDataClass || 'has-data';
  var hideActivateMessage = options.hasDataClass || false;
  var payload = {
    companyId: companyId,
    limit: limit
  };
  if (options.resourceId && typeof options.resourceId === 'string' && !options.resourceId.match(/^{{.*}}$/)) {
    payload.resourceId = options.resourceId;
    payload.resource = options.resource || 'agent';
    payload.fallbackToNoResource = options.fallbackToNoResource === 'true' || options.fallbackToNoResource === true;
  }
  var query = 'query InstagramFeed (\n' + '  $companyId: String\n' + '  $instagramAuthorizationId: String\n' + '  $username: String\n' + (payload.resourceId ? '$resource: InstagramAuthResourceEnum\n $resourceId: ID\n $fallbackToNoResource: Boolean' : '') + '  $limit: Int\n' + ') {\n' + '  instagramFeed (\n' + '  companyId: $companyId\n' + '  instagramAuthorizationId: $instagramAuthorizationId\n' + '  username: $username\n' + (payload.resourceId ? 'resource: $resource\n resourceId: $resourceId\n fallbackToNoResource: $fallbackToNoResource' : '') + '  limit: $limit\n' + '  ) {\n' + '    active\n' + '    feedUrl\n' + '    username\n' + '    items {\n' + '      id\n' + '      caption\n' + '      commentsCount\n' + '      likeCount\n' + '      mediaType\n' + '      mediaUrl\n' + '      permalink\n' + '      shortcode\n' + '      thumbnailUrl\n' + '      timestamp\n' + '      username\n' + '    }\n' + '  }\n' + '}\n';
  var templateHTML = section.querySelector(templateSelector)?.innerHTML || '';
  var template = Handlebars.compile(templateHTML);
  var container = section.querySelector(containerSelector);
  if (options.variables) {
    Object.keys(options.variables).forEach(function (key) {
      if (options.variables.hasOwnProperty(key) && (typeof options.variables[key] !== 'string' || !options.variables[key].match(/^{{.*}}$/))) {
        payload[key] = options.variables[key];
      }
    });
  }
  function getData() {
    var feed = {
      error: true
    };
    superagent.post(url + '/graphql').withCredentials() // for EB
    .send({
      query: query,
      variables: payload
    }).then(res => {
      try {
        if (!res.body.errors) {
          feed = res.body.data.instagramFeed;
          if (!feed.active) {
            if (!hideActivateMessage && sectionDomId === 'section-temp' && container) {
              if (payload.resourceId) {
                container.innerHTML = '<div style="text-align: center">Instagram account is not connected to selected ' + payload.resource + '.<br /> Connect it on the ' + payload.resource + ' page</div>';
              } else {
                container.innerHTML = '<div style="text-align: center">Instagram account is not connected.<br /> Connect it on <a href="/profile">Profile page</a></div>';
              }
            }
          } else {
            if (feed.items.length) {
              if (hasDataClass) {
                section.classList.add(hasDataClass);
              }
              const feedName = feed.username;
              section.querySelectorAll('.jsIGLink').forEach(link => link.setAttribute('href', feed.feedUrl));
              section.querySelectorAll('.jsIGName').forEach(name => {
                name.textContent = '@' + feedName;
                name.setAttribute('title', '@' + feedName);
              });
              if (container && template) {
                container.innerHTML = template(feed);
              }
            }
          }
        }
      } catch (e) {}
      section.dispatchEvent(new CustomEvent('ig-data', {
        detail: feed
      }));
    }).catch(e => {
      console.log('err', e);
      section.dispatchEvent(new CustomEvent('ig-data', {
        detail: feed
      }));
    });
  }
  getData();
})('section-c6c0dcb3-d535-41d1-bef6-549dd0e96317', JSON.parse("{\"limit\":12,\"companyId\":\"4c87ae7a-8145-44a2-8253-f39b6c97db14\",\"sectionIndex\":4}"));
} catch(e) {
console.log(e);
}
                try {
(function init(sectionDomId) {
  const $section = $('#' + sectionDomId);
  const $slider = $section.find('.items-container');
  let slidesCount = 0;
  $section.on('ig-data', function (ev, feed) {
    feed = ev.detail || feed;
    if (feed.active && feed.items.length) {
      slidesCount = feed.items.length;
      buildSlider();
    }
  });
  function buildSlider() {
    if (slidesCount < 8) {
      $slider.css('max-width', `${slidesCount * 300}px`);
    }
    if (slidesCount < 2) {
      return;
    }
    const arrowsStyle = $slider.data('arrows-style') || '';
    const responsive = [{
      breakpoint: 430,
      settings: {
        slidesToShow: 1,
        arrows: true,
        autoplay: true
      }
    }];
    let items = $section.find('.ig-feed').hasClass('no-caption-tile') ? 2 : 1;
    let point = 600;
    while (point < 2500 && items < slidesCount) {
      responsive.unshift({
        breakpoint: point,
        settings: {
          slidesToShow: items,
          autoplay: true
        }
      });
      point += 300;
      items += 1;
    }
    $slider.slick({
      dots: false,
      arrows: false,
      slidesToScroll: 1,
      infinite: true,
      prevArrow: `<button class="slick-prev slick-arrow ${arrowsStyle}" aria-label="Previous"><svg width="7" height="13" fill="none"><path d="M6 1L1 6.5L6 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></button>`,
      nextArrow: `<button class="slick-next slick-arrow ${arrowsStyle}" aria-label="Next"><svg width="7" height="13" fill="none"><path d="M1 1l5 5.5L1 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></button>`,
      slidesToShow: items,
      autoplaySpeed: 3000,
      autoplay: slidesCount > items,
      responsive
    });
  }
})('section-c6c0dcb3-d535-41d1-bef6-549dd0e96317', 'undefined');
} catch(e) {
console.log(e);
}

            var { body } = document;
            var globalNav = body.querySelector(':scope > nav');
            var globalSideMenu = body.querySelector(':scope > div.sidemenu');

            document.querySelectorAll('body > .modal .close').forEach(modalCloseBtn => {
                modalCloseBtn.addEventListener('click', function() {
                window.lpUI.hideClosestModal(modalCloseBtn);
              });
            });

            window.addEventListener('click', function() {
                document.querySelectorAll('.share-popup').forEach(sharedPopup => {
                    sharedPopup.style.display = 'none' ;
                });
            });

            /* Misc Partials / Addons */
            function initWOW() {
                if (wow) {
                    wow.init();
                    wow.scrollHandler();
                    setTimeout(function () {
                        const wowHideStyle = document.getElementById('wow-hide-elements');
                        if(wowHideStyle) {
                            wowHideStyle.disabled = true;
                        }
                    }, 1);
                }
            }

            const wowHideElements =  document.getElementById('wow-hide-elements');
            if (wowHideElements) {
               wowHideElements.disabled = false;
            }

                var globalLoader = document.getElementById('global-loader');
                if (globalLoader) {
                    setTimeout(function() {
                        globalLoader.style.height = "0px";
                        window.sessionStorage.setItem('global_loading_displayed', 'yes');

                        // Remove global-loader to prevent caching issues with turbolinks
                        globalLoader.addEventListener('transitionend',
                                function(e) {
                                    globalLoader.remove();
                                    initWOW();
                                });
                    }, 1000);
                } else {
                    initWOW();
                }

            /* Generic Navbar Handling */
            globalNav?.querySelectorAll('.hamburger-component').forEach(hamburgerComponent => {
                hamburgerComponent.addEventListener('click', function() {
                window.lpUI.sideMenuToggle();
              });
            });
            globalSideMenu?.querySelectorAll('.toggle').forEach(toggleEl => {
                toggleEl.addEventListener('click', function() {
                window.lpUI.sideMenuToggle();
              });
            });

            document.querySelectorAll('body > nav .sub-nav-container > a, body > div.sidemenu .sub-nav-container > a').forEach(linkEl => {
                linkEl.addEventListener('click', function(e) {
                  e.preventDefault();
                  e.stopPropagation();
                  var subNav = linkEl.parentElement.querySelector(':scope > .sub-nav');
                  if (subNav && subNav.classList.contains('visible')){
                    subNav.classList.remove('visible');
                  } else {
                    globalNav?.querySelectorAll('.sub-nav-container .sub-nav').forEach(globalSubNav => {
                      globalSubNav.classList.remove('visible');
                    });
                    globalSideMenu?.querySelectorAll('.sub-nav').forEach(sideMenuSubNav => {
                        sideMenuSubNav.classList.remove('visible');
                    });
                    subNav?.classList.add('visible');
                  }
                });
            });
            window.addEventListener('click', function() {
                document.querySelectorAll('nav .sub-nav.visible, .sidemenu .sub-nav.visible').forEach(subNavEl => {
                    subNavEl.classList.remove('visible');
                });
            });

        }

        document.addEventListener('DOMContentLoaded', lpGlobalInit);

    </script>

    <script type="module">
    function selectorExists(selector) {
        return document.querySelector(selector) !== null;
    }

    // Function to initialize the third-party library
    function initParoller(selector = '.my-paroller') {
        var $parollerElements = $(selector);
        if ($parollerElements.length > 0 && typeof $parollerElements.paroller === 'function') {
            $parollerElements.paroller();
        }
    }

    const parollerSelector = '.my-paroller';

    if (selectorExists(parollerSelector)) {
        window.luxuryPresence.libs.loadJs(window.luxuryPresence.libs.jsLibsMap.paroller.jsSrc, function() {
            initParoller(parollerSelector);
            window.luxuryPresence.libs.jsLibsMap.paroller.isLoaded = true;
        });
    }
    </script>

            <!-- Google Tag Manager (noscript) -->
            <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MKNZMCK"
            height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
            <!-- End Google Tag Manager -->
            <!-- Google Tag Manager (noscript) -->
            <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-T9SFQGHZ"
            height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
            <!-- End Google Tag Manager -->
        
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a0a37170fa4a50d3',t:'MTc4MTIxMDU1NQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>
