{"version":3,"file":"PropertyMapExplorer.DrtaVFPR.mjs","names":["useSyncExternalStore","createStore","useState","useRef","useMemo","useCallback","_Fragment"],"sources":["https:/framerusercontent.com/modules/0UFSSa7jJyhHqMvl4thI/9M5OhppoIpKNoMWmmldU/CanvaseMessage.js","https:/framer.com/m/CanvaseMessage-WA0s.js","https:/esm.sh/zustand@4.5.2/es2022/vanilla.mjs","https:/esm.sh/zustand@4.5.2/vanilla","https:/framerusercontent.com/modules/Smlw7NVtGquZcWBYiQYm/bHpUEFFTxQ6pqkO3qr9S/ListingsFilterStore.js","https:/framer.com/m/ListingsFilterStore-9rp3Gw.js","https:/framerusercontent.com/modules/vnrbRRPnEL3h2ictaPTW/3nlvA2YU0oLdNl7M2pUs/PropertyMapExplorer.js"],"sourcesContent":["// Canvas Message component for providing instructions on component functionality\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";/**\n * @framerIntrinsicWidth 400\n * @framerSupportedLayoutHeight auto\n * @framerDisableUnlink\n */export default function CanvasMessage(props){const{title,message,backgroundColor,titleColor,messageColor,titleFont,messageFont,padding}=props;// const isFixedWidth = props?.style && props.style.width === \"100%\"\n// const isFixedHeight = props?.style && props.style.height === \"100%\"\nreturn /*#__PURE__*/_jsxs(\"div\",{style:{...props.style,width:\"100%\",height:\"100%\",position:\"relative\",backgroundColor,padding:\"32px\",display:\"flex\",flexDirection:\"column\",alignItems:\"center\",justifyContent:\"center\",textAlign:\"center\",border:\"dashed 2px #8B5CF6\",gap:16},children:[/*#__PURE__*/_jsx(\"h2\",{style:{margin:0,color:titleColor,...titleFont},children:title}),/*#__PURE__*/_jsx(\"p\",{style:{margin:0,color:messageColor,whiteSpace:\"pre-wrap\",...messageFont},children:message})]});}addPropertyControls(CanvasMessage,{title:{type:ControlType.String,title:\"Title\",defaultValue:\"Put Message Title Here\"},message:{type:ControlType.String,title:\"Message\",defaultValue:\"Sample Description: Drag the handle on the right side to a Collection List of the products CMS collection or select from the dropdown list. The Collection List must be outside of a page to be connected.\",displayTextArea:true},backgroundColor:{type:ControlType.Color,title:\"Background\",defaultValue:\"#8B5CF61A\"},borderColor:{type:ControlType.Color,title:\"Border Color\",defaultValue:\"#8B5CF6\"},titleColor:{type:ControlType.Color,title:\"Title Color\",defaultValue:\"#8B5CF6\"},messageColor:{type:ControlType.Color,title:\"Message Color\",defaultValue:\"#8B5CF680\"},titleFont:{type:ControlType.Font,title:\"Title Font\",defaultValue:{fontSize:\"18px\",variant:\"Semibold\",letterSpacing:\"-0.01em\",lineHeight:\"1.2em\"},controls:\"extended\",defaultFontType:\"sans-serif\"},messageFont:{type:ControlType.Font,title:\"Message Font\",defaultValue:{fontSize:\"14px\",variant:\"Medium\",letterSpacing:\"-0.01em\",lineHeight:\"1.4em\"},controls:\"extended\",defaultFontType:\"sans-serif\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CanvasMessage\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerIntrinsicWidth\":\"400\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CanvaseMessage.map","/*\n * CanvaseMessage\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/0UFSSa7jJyhHqMvl4thI/9M5OhppoIpKNoMWmmldU/CanvaseMessage.js\"\nexport { default } from \"https://framerusercontent.com/modules/0UFSSa7jJyhHqMvl4thI/9M5OhppoIpKNoMWmmldU/CanvaseMessage.js\"\n","/* esm.sh - zustand@4.5.2/vanilla */\nvar u=e=>{let t,s=new Set,r=(o,c)=>{let n=typeof o==\"function\"?o(t):o;if(!Object.is(n,t)){let d=t;t=c??(typeof n!=\"object\"||n===null)?n:Object.assign({},t,n),s.forEach(b=>b(t,d))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>l,subscribe:o=>(s.add(o),()=>s.delete(o)),destroy:()=>{(import.meta.env?import.meta.env.MODE:void 0)!==\"production\"&&console.warn(\"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"),s.clear()}},l=t=e(r,i,a);return a},p=e=>e?u(e):u,E=e=>((import.meta.env?import.meta.env.MODE:void 0)!==\"production\"&&console.warn(\"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"),p(e));export{p as createStore,E as default};\n//# sourceMappingURL=vanilla.mjs.map","/* esm.sh - zustand@4.5.2/vanilla */\nexport * from \"/zustand@4.5.2/es2022/vanilla.mjs\";\nexport { default } from \"/zustand@4.5.2/es2022/vanilla.mjs\";\n","// Shared cross-component state store for the Property Map Explorer system.\n// Plain TS utility module (not a code component) — hosts the store used by\n// PropertySearchBar.tsx and PropertyMapExplorer.tsx so they stay in sync\n// without being nested in the same component tree.\n//\n// Fix: uses zustand's dependency-free \"vanilla\" store (no bundled React)\n// plus React's own useSyncExternalStore for the hook binding. The regular\n// \"zustand\" entrypoint bundles its own copy of React when loaded from an\n// esm.sh URL, which collides with Framer's React instance and breaks hooks\n// project-wide (symptom: \"Cannot read properties of null (reading 'useRef')\"\n// errors showing up in unrelated component files). This avoids that\n// entirely by only ever importing \"react\" from Framer's own supported\n// import, never a second bundled copy.\nimport{createStore}from\"https://esm.sh/zustand@4.5.2/vanilla\";import{useSyncExternalStore}from\"react\";const initialFilterValues={query:\"\",minPrice:null,maxPrice:null,minBeds:null,propertyType:\"any\",status:\"any\",hoveredListingId:null,selectedListingId:null,mapBounds:null,searchThisAreaEnabled:false};const store=createStore(set=>({...initialFilterValues,setQuery:value=>set({query:value}),setMinPrice:value=>set({minPrice:value}),setMaxPrice:value=>set({maxPrice:value}),setMinBeds:value=>set({minBeds:value}),setPropertyType:value=>set({propertyType:value}),setStatus:value=>set({status:value}),setHoveredListingId:id=>set({hoveredListingId:id}),setSelectedListingId:id=>set({selectedListingId:id}),setMapBounds:bounds=>set({mapBounds:bounds}),setSearchThisAreaEnabled:value=>set({searchThisAreaEnabled:value}),reset:()=>set({...initialFilterValues})}));/**\n * useListingsFilterStore\n *\n * Shared store hook used by PropertySearchBar and PropertyMapExplorer.\n * Import this directly from this file's published URL in any other Framer\n * code file to read/write the same filter state.\n */export function useListingsFilterStore(){return useSyncExternalStore(store.subscribe,store.getState,store.getState);}\nexport const __FramerMetadata__ = {\"exports\":{\"PropertyTypeFilter\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"StatusFilter\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useListingsFilterStore\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ListingsFilterState\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"MapBounds\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ListingsFilterStore.map","/*\n * ListingsFilterStore\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/Smlw7NVtGquZcWBYiQYm/bHpUEFFTxQ6pqkO3qr9S/ListingsFilterStore.js\"\n","// Kelvin's instructions: a universal, CMS-driven \"half-map\" real estate\n// search component — bind a CMS Collection List of listings, and this\n// renders a synced grid + live map (cards left/right, map opposite),\n// filterable via a shared search store so a separate PropertySearchBar\n// component can drive it, AND filterable by panning/zooming the map itself\n// (\"Search This Area\").\n//\n// Architecture: this is a pure controller, not a renderer. It never builds\n// its own card UI — the user designs each listing's card visually via the\n// Collection List item template in Framer. PropertyMapExplorer only decides\n// WHICH items show and in WHAT ORDER, then passes the filtered raw item\n// array back into the Collection List's own render function so the user's\n// card design renders untouched. Done via tree-interception:\n// findRenderFn/cloneTree are a direct port from AnopaCatalog (handles\n// array-wrapped roots and clones by depth rather than function-reference\n// equality, which is what Framer's actual internal shape requires).\n//\n// DATA SOURCE — Collection vs Single Location:\n//\n//   Collection (default) — everything above. Interception, DOM field\n//   extraction, filtering, grid + map.\n//\n//   Single Location — for a Listing Detail Page, where there is no\n//   Collection List to intercept because the page IS one listing. Latitude\n//   and Longitude come in as props bound to the current listing's CMS\n//   fields. One pin, centred on it, no grid. Interception, DOM extraction,\n//   filtering, Search This Area and the hover-card are all skipped. Layout\n//   is forced to Map Only.\n//\n//   Those two controls are ControlType.Number because the Listings\n//   collection stores Latitude/Longitude as Number fields, and Framer only\n//   binds a CMS field to a control of a compatible type. Number controls\n//   can't be empty, so exactly (0, 0) is treated as \"not set\" rather than a\n//   real position — that point is Null Island in the Gulf of Guinea, so\n//   nothing real is being excluded. Unset shows a prompt instead of\n//   dropping a pin in the ocean.\n//\n// CAPTURE INVALIDATION — signature, not length. `captureFn` used to call\n// setRawItems only when the incoming array's LENGTH changed. That silently\n// broke whenever a Collection List filter changed WHICH items were shown\n// without changing HOW MANY — swapping a filter from \"For Sale\" (5 items)\n// to \"Sold\" (5 items) left rawItems, and therefore the map pins and the\n// grid, showing the previous set. Framer hands a fresh array object every\n// render so identity can't be compared either. Now a cheap per-index\n// id/slug signature is built and compared, which catches reordering and\n// same-count swaps as well as length changes. Falls back to being\n// length-sensitive if the raw items expose no id or slug at all.\n//\n// HOVER JITTER FIX — card listeners must not re-attach on every hover.\n// Kelvin reported cards jittering on mouseleave once a Framer hover variant\n// was added to the card design. Root cause on this side: the effect wiring\n// hover/click onto each rendered card had `filters` in its dependency\n// array. `useListingsFilterStore()` is called without a selector, so it\n// returns a NEW object identity on every store update — including the one\n// our own mouseenter just triggered. Every hover therefore tore down and\n// re-attached every card's listeners, rewrote `child.style.cursor` mid\n// animation, and could drop events in flight; with a hover variant\n// animating at the same time that was enough to produce visible jitter.\n// Fixed by reading the store setters through `filtersRef` (updated each\n// render) and dropping `filters` from the effect deps, so listeners attach\n// once per card set instead of once per mouse event. Handlers also no-op\n// when the value hasn't changed. The map-side effects now depend on the\n// primitive `hoveredListingId` rather than the `filters` object, for the\n// same reason.\n//\n// Note there is a SECOND, independent cause of the same symptom that this\n// code cannot fix: a Framer hover variant that changes the card's own\n// layout size or transform moves the card's hit area out from under a\n// stationary cursor, so the browser fires leave → enter → leave by itself.\n// The tell is that it still jitters with this component removed entirely,\n// on a plain Collection List. The fix for that lives in the variant — put\n// the hover trigger on a fixed-size outer frame and animate an inner layer,\n// so the hit area never moves.\n//\n// FIELD EXTRACTION ARCHITECTURE — layer-name matching (Collection mode\n// only). Framer's Collection List only hands this component fields bound to\n// SOME layer in the card template, keyed by an opaque per-collection field\n// ID with no way to recover the human-readable name at runtime. Matching by\n// field ID works for ONE collection but breaks silently the moment a buyer\n// connects a different one — so this matches by LAYER NAME instead, which a\n// buyer sets in Framer's own layers panel and which stays constant\n// regardless of what's bound underneath. For each field the map/filters\n// need, the buyer adds a layer to the card template bound to that CMS\n// field, sized invisible (0 size/opacity, NOT Framer's \"hide\" eye toggle,\n// which can drop the layer from the render tree and the field with it), and\n// names that LAYER to match the corresponding control. At runtime the full\n// unfiltered list is re-rendered through the same render function into a\n// hidden container, giving one direct DOM child per listing, then each card\n// is queried for `[data-framer-name=\"<Layer Name>\"]`.\n//\n// ARGS REPLAY (Link resolution). Kelvin wired a Link onto a layer inside\n// the card template and found that once deployed, clicking always navigated\n// to \"/\" instead of the listing URL. Root cause: the grid re-invoked the\n// render-prop function as `renderFn(filteredRawItems, null, null)`,\n// hardcoding the 2nd/3rd arguments. Framer's own internal call supplies\n// real values there, evidently used for Link/href resolution on nested CMS\n// Link fields — which is why cards still LOOKED right while only the href\n// broke. Fix: `captureFn` stores the FULL original args tuple\n// (`capturedArgsRef`) and every re-invocation replays the trailing args\n// (`...capturedArgsRef.current.slice(1)`).\n//\n// PIN NAVIGATION. Pins are hand-built DOM elements, not the user's React\n// card, so they can't reuse the card's Link. `readLayerHref()` extracts the\n// resolved href off the card's own rendered anchor during DOM extraction:\n// `detailLinkLayerName` is checked first, then it falls back to the FIRST\n// `<a href>` anywhere in the card — so it works with zero configuration\n// when the whole card or its main CTA is already wrapped in a Link.\n//\n// CANVAS. Framer's canvas doesn't execute the render tree the way Preview\n// and the published site do, so interception can't run there. The card side\n// doesn't need it — Framer renders a connected Collection List on canvas\n// natively — so canvas shows the same two-pane layout, respecting Layout,\n// Split Sizing, Card Layout, Columns and Card/Map Padding, with only the\n// MAP pane replaced by a CanvasMessage.\n//\n// IMPORTANT: a Framer Collection List loses its CMS binding when nested\n// INSIDE a component — it has no collection context in there and renders\n// its item template exactly once, so you get a single card. If you wrap\n// this component in your own variants component to build a grid/map\n// toggle, keep the Collection List on the PAGE and pass it into the wrapper\n// as a ComponentInstance property, then forward that into Listings Source.\n// Same constraint AnopaCatalog warns about on canvas.\n//\n// PREVIEW. The map side also shows a message in Framer's Preview, pointing\n// at the published URL, because a Maps key restricted to the published\n// domain renders Google's own \"Oops! Something went wrong\" overlay there —\n// that overlay comes from Google's script and can't be suppressed here.\n// Framer reports BOTH Preview and the published site as\n// RenderTarget.preview, so there is no clean API to tell them apart. This\n// uses a hostname heuristic (`isFramerPreviewHost`) plus a \"Force Live Map\"\n// override. Deliberate consequence: your own *.framer.website staging URL\n// counts as Preview. Remove that entry from PREVIEW_HOST_SUFFIXES if you'd\n// rather staging behave like production.\n//\n// SCROLLBAR. \"Show Scrollbar\" (default off) toggles only the visibility of\n// the card pane's scrollbar chrome. The pane keeps `overflowY: auto` either\n// way, so wheel, trackpad, touch and keyboard scrolling are unaffected.\n// Implemented with a per-instance stylesheet because ::-webkit-scrollbar is\n// a pseudo-element and can't be set inline.\n//\n// Because the grid's markup is user-designed, hover/click sync is wired at\n// the DOM level — each card's top-level container is matched to its listing\n// by array position and given native listeners. This component does NOT\n// force any hover styling onto the card. Our click listener never calls\n// preventDefault(), so a nested Link still navigates normally.\n//\n// KNOWN, NOT YET ADDRESSED: the marker sync effect depends on\n// `hoveredListingId`, so hovering a card still destroys and recreates every\n// OverlayView just to recolour one pin. Functionally correct but wasteful,\n// and it can show as pin flicker with a large listing count. The proper fix\n// is restyling only the affected pins in a separate lightweight effect\n// rather than rebuilding the set.\n//\n// DEFAULT-VISIBILITY GUARANTEE. Google fires an \"idle\" event once right\n// after the map loads, at its default center (continental US). If that were\n// allowed to set the Search This Area viewport filter it would filter every\n// listing out before the map repositioned. The `map.__pmeDidInitialFit`\n// flag gates the idle→setMapBounds listener until after the first real fit.\n//\n// Map provider: Google Maps JavaScript API. Google's terms prohibit using\n// their tiles through another renderer, so this is built directly against\n// `google.maps.Map`. The script loads via a single injected <script> with a\n// global callback, deduped so multiple instances load it once. Custom pins\n// are a hand-rolled OverlayView subclass rather than AdvancedMarkerElement,\n// since Advanced Markers require a cloud Map ID and don't support inline\n// `styles`.\n//\n// Style resolution: Map ID → Advanced Style JSON → the built-in muted\n// default. POI icons within the built-in style are toggled by \"Show\n// Amenities\" — pure styling, no Places API, no extra billing.\n//\n// A Google Maps API key is REQUIRED. If the key/project isn't configured,\n// Google renders its own error overlay inside the container — the fix lives\n// in Cloud Console. Referrer restrictions must include the domain the page\n// actually loads from.\n//\n// A ResizeObserver triggers `google.maps.event.trigger(map, \"resize\")`\n// whenever the container's real pixel size changes — needed because on the\n// live page the container can still be mid-layout (0×0) when the map\n// initializes.\n//\n// Relies on Framer's undocumented internal Collection List shape and on\n// Framer stamping `data-framer-name` on rendered layers. Neither is\n// official API. If the shape isn't recognized this shows a graceful\n// fallback rather than crashing.\nfunction _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useState,useEffect,useRef,useMemo,useCallback,startTransition,cloneElement}from\"react\";import{createPortal}from\"react-dom\";import{addPropertyControls,ControlType,useIsStaticRenderer,RenderTarget}from\"framer\";import{useListingsFilterStore}from\"https://framer.com/m/ListingsFilterStore-9rp3Gw.js\";import CanvasMessage from\"https://framer.com/m/CanvaseMessage-WA0s.js\";// ---------------------------------------------------------------------------\n// Tree interception — ported from AnopaCatalog's findRenderFn / cloneTree\n// ---------------------------------------------------------------------------\nconst MAX_DEPTH=15;function findRenderFn(el,depth=0){if(depth>MAX_DEPTH||!el)return null;if(Array.isArray(el)){for(const c of el){const found=findRenderFn(c,depth);if(found)return found;}return null;}if(el.props?.children&&typeof el.props.children===\"function\"&&el.props.children.length>=1){return{renderFn:el.props.children,depth};}if(Array.isArray(el.props?.children)){for(const c of el.props.children){const found=findRenderFn(c,depth+1);if(found)return found;}return null;}if(el.props?.children&&typeof el.props.children===\"object\"){return findRenderFn(el.props.children,depth+1);}return null;}function cloneTree(root,newFn,targetDepth){if(Array.isArray(root)){return root.map(el=>cloneTree(el,newFn,targetDepth));}function walk(el,d=0){if(!el||typeof el!==\"object\")return el;if(d===targetDepth){return /*#__PURE__*/cloneElement(el,{...el.props,children:newFn});}const cloned=el.props?.children?walk(el.props.children,d+1):el.props?.children;return /*#__PURE__*/cloneElement(el,{...el.props,children:cloned});}return walk(root);}// ---------------------------------------------------------------------------\n// Preview vs published detection (see PREVIEW in the header comment)\n// ---------------------------------------------------------------------------\n// Remove \"framer.website\" from this list if you'd rather your staging URL\n// behave like production and only the editor Preview show the message.\nconst PREVIEW_HOST_SUFFIXES=[\"framer.app\",\"framercanvas.com\",\"framer.website\"];function isFramerPreviewHost(){if(typeof window===\"undefined\")return false;const host=(window.location?.hostname??\"\").toLowerCase();if(!host)return false;if(host===\"localhost\"||host===\"127.0.0.1\")return true;return PREVIEW_HOST_SUFFIXES.some(suffix=>host===suffix||host.endsWith(`.${suffix}`));}// ---------------------------------------------------------------------------\n// Per-instance ids, used for the scrollbar stylesheet\n// ---------------------------------------------------------------------------\nlet pmeIdCounter=0;// ---------------------------------------------------------------------------\n// CMS field extraction — layer-name based. Used ONLY to extract filter/map\n// data. Never used to render the listing.\n// ---------------------------------------------------------------------------\n// `id`/`slug` come from Framer's own always-present item wrapper (not\n// dependent on any layer binding), so these are read from the raw JS object\n// rather than the DOM.\nfunction unwrapRawItem(raw){if(!raw||typeof raw!==\"object\")return{};return raw.fieldData??raw.item??raw.data??raw.fields??raw;}// Cheap change-detection key for a captured item array. See CAPTURE\n// INVALIDATION in the header comment for why length alone isn't enough.\nfunction itemsSignature(items){let sig=\"\";for(let i=0;i<items.length;i++){const u=unwrapRawItem(items[i]);sig+=`${i}:${String(u?.id??u?.slug??\"\")}|`;}return sig;}function cssEscapeSafe(value){if(typeof CSS!==\"undefined\"&&typeof CSS.escape===\"function\"){return CSS.escape(value);}return value.replace(/([ #.;:!\"'~*^$\\[\\]()>+/\\\\])/g,\"\\\\$1\");}// Finds a layer by its Framer layer name within a rendered card and returns\n// its text content.\nfunction readLayerText(cardEl,layerName){if(!cardEl||!layerName||!layerName.trim())return null;const name=layerName.trim();let el=null;try{el=cardEl.querySelector(`[data-framer-name=\"${cssEscapeSafe(name)}\"]`);}catch{// Malformed selector (unusual characters in the layer name) — fall\n// back to a manual scan instead of throwing.\nconst all=cardEl.querySelectorAll(\"[data-framer-name]\");for(const candidate of Array.from(all)){if(candidate.getAttribute(\"data-framer-name\")===name){el=candidate;break;}}}if(!el)return null;const text=el.textContent;return text!=null&&text.trim().length>0?text.trim():null;}// Resolves the detail-page URL for a card: a named layer first (an anchor\n// itself, or containing one), then the FIRST `<a href>` anywhere in the\n// card — so this works with zero setup when the card or its CTA is already\n// wrapped in a Link.\nfunction readLayerHref(cardEl,layerName){if(!cardEl)return null;let namedEl=null;if(layerName&&layerName.trim()){try{namedEl=cardEl.querySelector(`[data-framer-name=\"${cssEscapeSafe(layerName.trim())}\"]`);}catch{namedEl=null;}}let anchor=null;if(namedEl){anchor=namedEl.tagName===\"A\"?namedEl:namedEl.querySelector(\"a[href]\");}if(!anchor){anchor=cardEl.querySelector(\"a[href]\");}if(!anchor)return null;const href=anchor.getAttribute(\"href\");return href&&href.trim().length>0?href.trim():null;}function parseNumericText(text){if(text==null)return null;const cleaned=text.replace(/[^0-9.\\-]/g,\"\");if(!cleaned||cleaned===\"-\"||cleaned===\".\")return null;const n=parseFloat(cleaned);return Number.isFinite(n)?n:null;}function extractMapDataFromDom(raw,index,cardEl,names){const item=unwrapRawItem(raw);const domTitle=readLayerText(cardEl,names.title);return{id:String(item?.id??item?.slug??`listing-${index}`),title:domTitle&&domTitle.length>0?domTitle:`Listing ${index+1}`,price:parseNumericText(readLayerText(cardEl,names.price)),propertyType:readLayerText(cardEl,names.propertyType),status:readLayerText(cardEl,names.status),address:readLayerText(cardEl,names.address),neighborhood:readLayerText(cardEl,names.neighborhood),bedrooms:parseNumericText(readLayerText(cardEl,names.bedrooms)),latitude:parseNumericText(readLayerText(cardEl,names.latitude)),longitude:parseNumericText(readLayerText(cardEl,names.longitude)),detailUrl:readLayerHref(cardEl,names.detailLink)};}// ---------------------------------------------------------------------------\n// Client-side filtering\n// ---------------------------------------------------------------------------\nfunction applyFilters(listings,filters){return listings.filter(l=>{if(filters.query){const q=filters.query.toLowerCase();const haystack=`${l.title} ${l.address??\"\"} ${l.neighborhood??\"\"}`.toLowerCase();if(!haystack.includes(q))return false;}if(filters.minPrice!=null&&(l.price??0)<filters.minPrice)return false;if(filters.maxPrice!=null&&(l.price??Infinity)>filters.maxPrice)return false;if(filters.minBeds!=null&&(l.bedrooms??0)<filters.minBeds)return false;if(filters.propertyType!==\"any\"&&l.propertyType!==filters.propertyType)return false;if(filters.status!==\"any\"&&l.status!==filters.status)return false;if(filters.searchThisAreaEnabled&&filters.mapBounds){const b=filters.mapBounds;if(l.latitude==null||l.longitude==null)return false;if(l.latitude>b.north||l.latitude<b.south||l.longitude>b.east||l.longitude<b.west)return false;}return true;});}// ---------------------------------------------------------------------------\n// Small helpers\n// ---------------------------------------------------------------------------\nfunction StateMessage({text,textColor}){return /*#__PURE__*/_jsx(\"div\",{style:{padding:24,textAlign:\"center\",color:textColor,opacity:.65,fontSize:13},children:text});}const BASE_GOOGLE_STYLE=[{elementType:\"geometry\",stylers:[{color:\"#f2efe9\"}]},{elementType:\"labels.text.fill\",stylers:[{color:\"#6b6558\"}]},{elementType:\"labels.text.stroke\",stylers:[{color:\"#f2efe9\"}]},{featureType:\"administrative\",elementType:\"geometry\",stylers:[{visibility:\"off\"}]},{featureType:\"administrative\",elementType:\"labels.icon\",stylers:[{visibility:\"off\"}]},{featureType:\"poi\",elementType:\"geometry\",stylers:[{color:\"#e6e2d6\"}]},{featureType:\"poi.park\",elementType:\"geometry\",stylers:[{color:\"#d7e4d3\"}]},{featureType:\"road\",elementType:\"geometry\",stylers:[{color:\"#ffffff\"}]},{featureType:\"road\",elementType:\"geometry.stroke\",stylers:[{color:\"#e3ddd0\"}]},{featureType:\"road\",elementType:\"labels.icon\",stylers:[{visibility:\"off\"}]},{featureType:\"road.highway\",elementType:\"geometry\",stylers:[{color:\"#f5efe3\"}]},{featureType:\"road.arterial\",elementType:\"labels\",stylers:[{visibility:\"simplified\"}]},{featureType:\"transit\",stylers:[{visibility:\"off\"}]},{featureType:\"water\",elementType:\"geometry\",stylers:[{color:\"#cfd8dc\"}]}];function buildDefaultGoogleStyle(showAmenities){if(showAmenities)return BASE_GOOGLE_STYLE;return[...BASE_GOOGLE_STYLE,{featureType:\"poi\",elementType:\"labels.icon\",stylers:[{visibility:\"off\"}]},{featureType:\"poi\",elementType:\"labels.text\",stylers:[{visibility:\"off\"}]}];}let googleMapsLoadingPromise=null;function loadGoogleMaps(apiKey){if(typeof window===\"undefined\")return Promise.reject(new Error(\"no window\"));const w=window;if(w.google?.maps?.Map)return Promise.resolve(w.google);if(googleMapsLoadingPromise)return googleMapsLoadingPromise;googleMapsLoadingPromise=new Promise((resolve,reject)=>{const callbackName=\"__pmeGoogleMapsInit\";w[callbackName]=()=>resolve(w.google);const script=document.createElement(\"script\");script.src=`https://maps.googleapis.com/maps/api/js?key=${encodeURIComponent(apiKey)}&v=weekly&callback=${callbackName}`;script.async=true;script.onerror=()=>{googleMapsLoadingPromise=null;reject(new Error(\"Failed to load Google Maps JS API\"));};document.head.appendChild(script);});return googleMapsLoadingPromise;}function createMarkerOverlayClass(google){return class PriceMarkerOverlay extends google.maps.OverlayView{onAdd(){const panes=this.getPanes();panes?.overlayMouseTarget.appendChild(this.el);}draw(){const projection=this.getProjection();if(!projection)return;const point=projection.fromLatLngToDivPixel(this.position);if(!point)return;this.el.style.left=`${point.x}px`;this.el.style.top=`${point.y}px`;this.el.style.transform=\"translate(-50%, -100%)\";}onRemove(){this.el.removeEventListener(\"mouseenter\",this.onEnter);this.el.removeEventListener(\"mouseleave\",this.onLeave);this.el.removeEventListener(\"click\",this.onClick);this.el.parentNode?.removeChild(this.el);}constructor(position,el,onEnter,onLeave,onClick){super();_define_property(this,\"position\",void 0);_define_property(this,\"el\",void 0);_define_property(this,\"onEnter\",void 0);_define_property(this,\"onLeave\",void 0);_define_property(this,\"onClick\",void 0);this.position=position;this.el=el;this.onEnter=onEnter;this.onLeave=onLeave;this.onClick=onClick;this.el.style.position=\"absolute\";this.el.addEventListener(\"mouseenter\",this.onEnter);this.el.addEventListener(\"mouseleave\",this.onLeave);this.el.addEventListener(\"click\",this.onClick);}};}function createSimpleOverlayClass(google){return class SimplePositionOverlay extends google.maps.OverlayView{onAdd(){this.getPanes()?.floatPane.appendChild(this.el);}draw(){const projection=this.getProjection();if(!projection)return;const point=projection.fromLatLngToDivPixel(this.position);if(!point)return;this.el.style.left=`${point.x}px`;this.el.style.top=`${point.y}px`;}onRemove(){this.el.parentNode?.removeChild(this.el);}setPosition(position){this.position=position;this.draw();}constructor(position,el){super();_define_property(this,\"position\",void 0);_define_property(this,\"el\",void 0);this.position=position;this.el=el;}};}// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n/**\n * Property Map Explorer\n *\n * COLLECTION — bind a CMS Collection List of listings to \"Listings Source\"\n * and this renders your own card design as a filterable grid synced with a\n * live Google Map, filterable via the shared Listings Filter Store and by\n * panning/zooming the map. This never restyles your cards; it only controls\n * which listings show, in what order, and syncs hover/click with the map.\n *\n * For the map/filters to work: for each field you need (Latitude and\n * Longitude at minimum) add a layer to the item template bound to that CMS\n * field, made invisible via 0 size/opacity (not Framer's hide toggle), and\n * name that LAYER to match the control in Field Mapping.\n *\n * Keep the Collection List on the PAGE, not inside a component — a nested\n * Collection List has no CMS context and renders its item template once.\n *\n * SINGLE LOCATION — for a Listing Detail Page. Bind that listing's CMS\n * latitude/longitude to the Latitude and Longitude controls and this drops\n * one pin and centres on it. No grid, no filters, no interception.\n *\n * @framerIntrinsicWidth 1200\n * @framerIntrinsicHeight 720\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function PropertyMapExplorer(props){const{dataSource=\"collection\",singleLatitude=0,singleLongitude=0,singleLabel=\"\",listingsSource,loadingState,emptyState,layoutMode=\"split\",mapPosition=\"right\",gridWidthMode=\"percentage\",mapWidth=45,gridMaxWidth=420,gridLayout=\"stack\",gridColumns=2,gridGap=16,cardPadding=\"16px\",mapPadding=\"0px\",showScrollbar=false,fieldMapping,mapSettings,messages,accentColor=\"#2563EB\",textColor=\"#111111\",style}=props;const{latitudeLayerName=\"Latitude\",longitudeLayerName=\"Longitude\",priceLayerName=\"Price\",titleLayerName=\"Title\",statusLayerName=\"Status\",propertyTypeLayerName=\"Property Type\",bedroomsLayerName=\"Bedrooms\",addressLayerName=\"Address\",neighborhoodLayerName=\"Neighborhood\",detailLinkLayerName=\"Detail Link\"}=fieldMapping??{};const{googleMapsApiKey=\"\",googleMapId=\"\",mapStyleJson=\"\",initialZoom=12,showSearchThisArea=true,showAmenities=true,pinStyle=\"price\",pinPadding=\"6px 10px\",pinBackground=\"#FFFFFF\",pinColor=\"#111111\",pinAccentTextColor=\"#FFFFFF\",pinRadius=999,pinFontSize=12,pinFontWeight=\"600\",pinBorderWidth=1,pinBorderColor=\"rgba(0,0,0,0.1)\",pinAccentBorderColor=\"\",pinShadow=true,pinNavigate=true,showCardOnHover=false,hoverCardWidth=280,hoverCardOffset=14,forceLiveMap=false}=mapSettings??{};const{loadingLabel=\"Loading listings…\",emptyLabel=\"No listings match your search.\",errorLabel=\"⚠️ CMS structure not recognized. Connect a Collection List with listing data to the Listings Source slot.\",noApiKeyLabel=\"Add a Google Maps API key (see Map Settings) to enable the map.\",mapLoadErrorLabel=\"⚠️ Google Maps failed to load. Check your API key and that the Maps JavaScript API is enabled in Google Cloud Console.\",previewLabel=\"Google Maps keys are usually restricted to the published domain, so the live map can't render inside Framer's Preview. Open your published URL to see the map, pins and Search This Area filtering. To render it here anyway, turn on Force Live Map in Map Settings.\"}=messages??{};const isCanvas=RenderTarget.current()===RenderTarget.canvas;const isStatic=useIsStaticRenderer();const isSingle=dataSource===\"single\";const effectiveLayout=isSingle?\"mapOnly\":layoutMode;const[isPreviewHost,setIsPreviewHost]=useState(false);useEffect(()=>{setIsPreviewHost(isFramerPreviewHost());},[]);const showPreviewNotice=!isCanvas&&!isStatic&&!forceLiveMap&&isPreviewHost;const idRef=useRef(null);if(idRef.current===null)idRef.current=`pme${++pmeIdCounter}`;const scrollClass=`pme-cards-${idRef.current}`;// Only the visibility of the scrollbar chrome is toggled — the pane\n// keeps overflowY: auto either way.\nconst scrollbarCSS=showScrollbar?`.${scrollClass}{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,0.25) transparent;-ms-overflow-style:auto;}`+`.${scrollClass}::-webkit-scrollbar{width:8px;height:8px;}`+`.${scrollClass}::-webkit-scrollbar-track{background:transparent;}`+`.${scrollClass}::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.25);border-radius:999px;}`+`.${scrollClass}::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,0.4);}`:`.${scrollClass}{scrollbar-width:none;-ms-overflow-style:none;}`+`.${scrollClass}::-webkit-scrollbar{display:none;width:0;height:0;}`;const gridPaneStyle=effectiveLayout===\"gridOnly\"?{width:\"100%\"}:gridWidthMode===\"maxWidth\"?{flex:`0 1 ${gridMaxWidth}px`,maxWidth:gridMaxWidth,minWidth:0}:{width:`${100-mapWidth}%`,flexShrink:0};const mapPaneStyle=effectiveLayout===\"mapOnly\"?{width:\"100%\"}:gridWidthMode===\"maxWidth\"?{flex:\"1 1 auto\",minWidth:0}:{width:`${mapWidth}%`,flexShrink:0};const layerNames=useMemo(()=>({title:titleLayerName,price:priceLayerName,status:statusLayerName,propertyType:propertyTypeLayerName,bedrooms:bedroomsLayerName,address:addressLayerName,neighborhood:neighborhoodLayerName,latitude:latitudeLayerName,longitude:longitudeLayerName,detailLink:detailLinkLayerName}),[titleLayerName,priceLayerName,statusLayerName,propertyTypeLayerName,bedroomsLayerName,addressLayerName,neighborhoodLayerName,latitudeLayerName,longitudeLayerName,detailLinkLayerName]);// --- CMS data capture via tree interception ---\nconst[rawItems,setRawItems]=useState(null);// Signature of the last captured array — see CAPTURE INVALIDATION in\n// the header. Length alone missed same-count filter swaps.\nconst capturedSigRef=useRef(null);const capturedArgsRef=useRef([]);const found=useMemo(()=>{if(isCanvas||isSingle||!listingsSource)return null;return findRenderFn(listingsSource);},[isCanvas,isSingle,listingsSource]);const interceptFailed=!isCanvas&&!isSingle&&(!listingsSource||!found);const captureFn=useCallback((...args)=>{const items=Array.isArray(args[0])?args[0]:[];const sig=itemsSignature(items);if(sig!==capturedSigRef.current){capturedSigRef.current=sig;startTransition(()=>setRawItems(items));}capturedArgsRef.current=args;return found?found.renderFn(...args):null;},[found]);const captureTree=useMemo(()=>{if(isCanvas||isSingle||!listingsSource||!found)return null;return cloneTree(listingsSource,captureFn,found.depth);},[isCanvas,isSingle,listingsSource,found,captureFn]);// --- DOM-based field extraction (layer-name matching) ---\nconst discoveryContainerRef=useRef(null);const[mapData,setMapData]=useState([]);const discoveryContent=useMemo(()=>{if(isCanvas||isSingle||!found||!rawItems||rawItems.length===0)return null;return found.renderFn(rawItems,...capturedArgsRef.current.slice(1));},[isCanvas,isSingle,found,rawItems]);useEffect(()=>{if(isCanvas||isSingle)return;if(!rawItems||rawItems.length===0){setMapData([]);return;}const container=discoveryContainerRef.current;if(!container)return;const cardEls=Array.from(container.children);const extracted=rawItems.map((raw,i)=>extractMapDataFromDom(raw,i,cardEls[i],layerNames));setMapData(extracted);// eslint-disable-next-line react-hooks/exhaustive-deps\n},[isCanvas,isSingle,rawItems,layerNames,discoveryContent]);const rawById=useMemo(()=>{const map=new Map;if(!rawItems)return map;rawItems.forEach((raw,i)=>{map.set(mapData[i]?.id??`listing-${i}`,raw);});return map;},[rawItems,mapData]);// --- Single Location data, built straight from props ---\nconst singleMapData=useMemo(()=>{if(!isSingle)return[];const lat=Number(singleLatitude);const lng=Number(singleLongitude);if(!Number.isFinite(lat)||!Number.isFinite(lng))return[];// Number controls can't be empty, so exactly (0, 0) means \"not set\".\n// That point is Null Island in the Gulf of Guinea — no real listing.\nif(lat===0&&lng===0)return[];return[{id:\"single-location\",title:singleLabel.trim()||\"Location\",price:null,propertyType:null,status:null,address:null,neighborhood:null,bedrooms:null,latitude:lat,longitude:lng,detailUrl:null}];},[isSingle,singleLatitude,singleLongitude,singleLabel]);// --- Shared filter store ---\nconst filters=useListingsFilterStore();// `useListingsFilterStore()` is called without a selector, so `filters`\n// is a NEW object on every store update — including ones our own hover\n// handlers cause. Anything that would otherwise put `filters` in a\n// dependency array reads it through this ref instead. See HOVER JITTER\n// FIX in the header comment.\nconst filtersRef=useRef(filters);useEffect(()=>{filtersRef.current=filters;});// Closing the hover card is deferred so the pointer can travel from the\n// pin onto the card itself without the card disappearing mid-journey.\nconst hoverCloseTimer=useRef(null);const cancelHoverClose=useCallback(()=>{if(hoverCloseTimer.current){clearTimeout(hoverCloseTimer.current);hoverCloseTimer.current=null;}},[]);const closeHoverSoon=useCallback(()=>{cancelHoverClose();hoverCloseTimer.current=setTimeout(()=>{const f=filtersRef.current;if(f.hoveredListingId!==null)f.setHoveredListingId(null);},180);},[cancelHoverClose]);useEffect(()=>()=>cancelHoverClose(),[cancelHoverClose]);// Primitive, so it IS a stable dependency — unlike `filters`.\nconst hoveredListingId=filters.hoveredListingId;useEffect(()=>{// Viewport filtering is meaningless for a single fixed point.\nfilters.setSearchThisAreaEnabled(isSingle?false:showSearchThisArea);// eslint-disable-next-line react-hooks/exhaustive-deps\n},[showSearchThisArea,isSingle]);const collectionFiltered=useMemo(()=>applyFilters(mapData,filters),[mapData,filters.query,filters.minPrice,filters.maxPrice,filters.minBeds,filters.propertyType,filters.status,filters.searchThisAreaEnabled,filters.mapBounds]);const filteredMapData=isSingle?singleMapData:collectionFiltered;const filteredRawItems=useMemo(()=>isSingle?[]:filteredMapData.map(l=>rawById.get(l.id)).filter(Boolean),[isSingle,filteredMapData,rawById]);// --- Visible grid ---\nconst gridContainerRef=useRef(null);const gridContent=useMemo(()=>{if(isCanvas||isSingle||!found||filteredRawItems.length===0)return null;return found.renderFn(filteredRawItems,...capturedArgsRef.current.slice(1));},[isCanvas,isSingle,found,filteredRawItems]);// Hover/click sync wired at the DOM level, matched to listings by array\n// position. `filters` is deliberately NOT a dependency — see HOVER\n// JITTER FIX. Listeners attach once per card set, not per mouse event,\n// and handlers no-op when the value hasn't changed.\nuseEffect(()=>{if(isCanvas||isSingle)return;const container=gridContainerRef.current;if(!container)return;const children=Array.from(container.children);const cleanups=[];children.forEach((child,i)=>{const listing=filteredMapData[i];if(!listing)return;child.style.cursor=\"pointer\";const onEnter=()=>{const f=filtersRef.current;if(f.hoveredListingId!==listing.id)f.setHoveredListingId(listing.id);};const onLeave=()=>{const f=filtersRef.current;if(f.hoveredListingId!==null)f.setHoveredListingId(null);};const onClick=()=>{filtersRef.current.setSelectedListingId(listing.id);};child.addEventListener(\"mouseenter\",onEnter);child.addEventListener(\"mouseleave\",onLeave);child.addEventListener(\"click\",onClick);cleanups.push(()=>{child.removeEventListener(\"mouseenter\",onEnter);child.removeEventListener(\"mouseleave\",onLeave);child.removeEventListener(\"click\",onClick);});});return()=>cleanups.forEach(fn=>fn());},[isCanvas,isSingle,gridContent,filteredMapData]);// --- Map lifecycle ---\nconst mapContainerRef=useRef(null);const mapRef=useRef(null);const googleRef=useRef(null);const overlayClassRef=useRef(null);const simpleOverlayClassRef=useRef(null);const markersRef=useRef([]);const hoverOverlayRef=useRef(null);const resizeObserverRef=useRef(null);const[mapReady,setMapReady]=useState(false);const[mapLoadError,setMapLoadError]=useState(false);const[hoverCardEl]=useState(()=>typeof document!==\"undefined\"?document.createElement(\"div\"):null);useEffect(()=>{if(!hoverCardEl)return;hoverCardEl.style.position=\"absolute\";hoverCardEl.style.zIndex=\"20\";// Interactive only when the hover card is switched on, so a Link\n// inside the card design is actually clickable.\nhoverCardEl.style.pointerEvents=showCardOnHover?\"auto\":\"none\";// Offset moved out of the transform and into transparent padding:\n// same visual spacing, but the hit area now reaches down to the pin\n// so the pointer never leaves a hoverable element on the way over.\nhoverCardEl.style.paddingBottom=`${hoverCardOffset}px`;hoverCardEl.style.transform=\"translate(-50%, -100%)\";if(!showCardOnHover)return;const onCardEnter=()=>cancelHoverClose();const onCardLeave=()=>closeHoverSoon();hoverCardEl.addEventListener(\"mouseenter\",onCardEnter);hoverCardEl.addEventListener(\"mouseleave\",onCardLeave);return()=>{hoverCardEl.removeEventListener(\"mouseenter\",onCardEnter);hoverCardEl.removeEventListener(\"mouseleave\",onCardLeave);};},[hoverCardEl,hoverCardOffset,showCardOnHover,cancelHoverClose,closeHoverSoon]);const searchThisAreaActiveRef=useRef(showSearchThisArea&&!isSingle);useEffect(()=>{searchThisAreaActiveRef.current=showSearchThisArea&&!isSingle;},[showSearchThisArea,isSingle]);const setMapBoundsRef=useRef(filters.setMapBounds);useEffect(()=>{setMapBoundsRef.current=filters.setMapBounds;},[filters.setMapBounds]);useEffect(()=>{if(isCanvas||isStatic||typeof window===\"undefined\")return;if(showPreviewNotice)return;if(!mapContainerRef.current||effectiveLayout===\"gridOnly\")return;if(!googleMapsApiKey||!googleMapsApiKey.trim())return;let cancelled=false;startTransition(()=>setMapLoadError(false));loadGoogleMaps(googleMapsApiKey.trim()).then(google=>{if(cancelled||!mapContainerRef.current)return;googleRef.current=google;overlayClassRef.current=createMarkerOverlayClass(google);simpleOverlayClassRef.current=createSimpleOverlayClass(google);const mapOptions={center:{lat:39.8283,lng:-98.5795},zoom:initialZoom,disableDefaultUI:true,zoomControl:true,clickableIcons:false};if(googleMapId&&googleMapId.trim()){mapOptions.mapId=googleMapId.trim();}else{let styles=buildDefaultGoogleStyle(showAmenities);if(mapStyleJson&&mapStyleJson.trim()){try{const parsed=JSON.parse(mapStyleJson);if(Array.isArray(parsed))styles=parsed;}catch{// Invalid JSON — keep the muted default.\n}}mapOptions.styles=styles;}const map=new google.maps.Map(mapContainerRef.current,mapOptions);map.addListener(\"idle\",()=>{if(!searchThisAreaActiveRef.current)return;// Ignore the automatic idle right after first load at\n// the default center — see DEFAULT-VISIBILITY GUARANTEE.\nif(!map.__pmeDidInitialFit)return;const b=map.getBounds();if(!b)return;const ne=b.getNorthEast();const sw=b.getSouthWest();setMapBoundsRef.current({north:ne.lat(),south:sw.lat(),east:ne.lng(),west:sw.lng()});});mapRef.current=map;startTransition(()=>setMapReady(true));if(typeof ResizeObserver!==\"undefined\"&&mapContainerRef.current){const observer=new ResizeObserver(()=>{google.maps.event.trigger(map,\"resize\");});observer.observe(mapContainerRef.current);resizeObserverRef.current=observer;}}).catch(()=>{if(!cancelled)startTransition(()=>setMapLoadError(true));});return()=>{cancelled=true;if(resizeObserverRef.current){resizeObserverRef.current.disconnect();resizeObserverRef.current=null;}markersRef.current.forEach(m=>m.setMap(null));markersRef.current=[];if(hoverOverlayRef.current){hoverOverlayRef.current.setMap(null);hoverOverlayRef.current=null;}if(mapRef.current&&googleRef.current){googleRef.current.maps.event.clearInstanceListeners(mapRef.current);}mapRef.current=null;startTransition(()=>setMapReady(false));};// eslint-disable-next-line react-hooks/exhaustive-deps\n},[isCanvas,isStatic,showPreviewNotice,googleMapsApiKey,googleMapId,mapStyleJson,showAmenities,effectiveLayout,initialZoom]);// --- Marker sync ---\n// Depends on the primitive hoveredListingId, not the filters object.\n// See KNOWN, NOT YET ADDRESSED for why this still rebuilds every pin.\nuseEffect(()=>{if(isCanvas)return;const map=mapRef.current;const google=googleRef.current;const OverlayClass=overlayClassRef.current;if(!map||!google||!OverlayClass||!mapReady)return;markersRef.current.forEach(m=>m.setMap(null));markersRef.current=[];const points=[];const newMarkers=[];// Left unset, the hovered border tracks the shared Accent colour, so\n// there is one less thing to configure for the common case.\nconst resolvedAccentBorder=pinAccentBorderColor&&pinAccentBorderColor.trim()?pinAccentBorderColor:accentColor;filteredMapData.forEach(listing=>{if(listing.latitude==null||listing.longitude==null)return;const position=new google.maps.LatLng(listing.latitude,listing.longitude);points.push({lat:listing.latitude,lng:listing.longitude});const isHovered=hoveredListingId===listing.id;// No href when navigation is off, and none in Single Location\n// mode where there is no listing to point at.\nconst pinHref=pinNavigate&&!isSingle&&listing.detailUrl?listing.detailUrl:null;const el=document.createElement(pinHref?\"a\":\"div\");el.setAttribute(\"aria-label\",listing.title);if(!pinHref)el.setAttribute(\"role\",\"button\");if(pinStyle===\"marker\"){el.style.cssText=`\n                    width: 18px;\n                    height: 18px;\n                    border-radius: 50%;\n                    cursor: pointer;\n                    background: ${isHovered?accentColor:\"#FFFFFF\"};\n                    border: 3px solid ${accentColor};\n                    box-shadow: 0 2px 6px rgba(0,0,0,0.3);\n                    transition: background 120ms ease, transform 120ms ease;\n                    transform: ${isHovered?\"scale(1.15)\":\"scale(1)\"};\n                `;}else{el.style.cssText=`\n                    padding: ${pinPadding};\n                    border-radius: ${pinRadius}px;\n                    font-size: ${pinFontSize}px;\n                    font-weight: ${pinFontWeight};\n                    font-family: inherit;\n                    white-space: nowrap;\n                    cursor: pointer;\n                    background: ${isHovered?accentColor:pinBackground};\n                    color: ${isHovered?pinAccentTextColor:pinColor};\n                    box-shadow: ${pinShadow?\"0 2px 8px rgba(0,0,0,0.18)\":\"none\"};\n                    border: ${pinBorderWidth}px solid ${isHovered?resolvedAccentBorder:pinBorderColor};\n                    transform-origin: center bottom;\n                    transition: transform 120ms ease, background 120ms ease;\n                `;el.textContent=listing.price?`$${Math.round(listing.price).toLocaleString()}`:listing.title;}// `cssText` above replaces all inline styles, so anchor-specific\n// styling has to land after it rather than before.\nif(pinHref){el.href=pinHref;el.style.textDecoration=\"none\";el.style.color=el.style.color||\"inherit\";el.style.display=pinStyle===\"marker\"?\"block\":\"inline-block\";}const overlay=new OverlayClass(position,el,()=>{cancelHoverClose();const f=filtersRef.current;if(f.hoveredListingId!==listing.id)f.setHoveredListingId(listing.id);},()=>{closeHoverSoon();},()=>{filtersRef.current.setSelectedListingId(listing.id);// Real anchor: let the browser navigate. That is what\n// preserves cmd/ctrl/middle-click \"open in new tab\".\nif(pinHref)return;if(!pinNavigate)return;if(listing.detailUrl){window.location.href=listing.detailUrl;}});overlay.setMap(map);newMarkers.push(overlay);});markersRef.current=newMarkers;// Auto-fit once only — after that the visitor drives the viewport.\nif(!map.__pmeDidInitialFit&&points.length>0){map.__pmeDidInitialFit=true;if(points.length>1){const bounds=new google.maps.LatLngBounds;points.forEach(p=>bounds.extend(p));map.fitBounds(bounds,60);}else{map.setCenter(points[0]);map.setZoom(initialZoom);}}},[isCanvas,mapReady,filteredMapData,hoveredListingId,pinStyle,pinPadding,pinBackground,pinColor,pinAccentTextColor,pinRadius,pinFontSize,pinFontWeight,pinBorderWidth,pinBorderColor,pinAccentBorderColor,pinShadow,pinNavigate,isSingle,accentColor,textColor,initialZoom]);// --- Hover-card overlay sync ---\nuseEffect(()=>{if(isCanvas||isSingle||!mapReady)return;const google=googleRef.current;const map=mapRef.current;const SimpleOverlay=simpleOverlayClassRef.current;if(!google||!map||!SimpleOverlay||!hoverCardEl)return;const listing=showCardOnHover?filteredMapData.find(l=>l.id===hoveredListingId):null;if(!listing||listing.latitude==null||listing.longitude==null){if(hoverOverlayRef.current){hoverOverlayRef.current.setMap(null);hoverOverlayRef.current=null;}return;}const position=new google.maps.LatLng(listing.latitude,listing.longitude);if(!hoverOverlayRef.current){hoverOverlayRef.current=new SimpleOverlay(position,hoverCardEl);hoverOverlayRef.current.setMap(map);}else{hoverOverlayRef.current.setPosition(position);}},[isCanvas,isSingle,mapReady,showCardOnHover,hoveredListingId,filteredMapData,hoverCardEl]);// --- Canvas ---\nif(isCanvas){return /*#__PURE__*/_jsxs(\"div\",{style:{position:\"relative\",width:\"100%\",height:\"100%\",display:\"flex\",flexDirection:mapPosition===\"left\"?\"row-reverse\":\"row\",overflow:\"hidden\",...style},children:[effectiveLayout!==\"mapOnly\"&&/*#__PURE__*/_jsx(\"div\",{style:{...gridPaneStyle,height:\"100%\",overflowY:\"auto\",boxSizing:\"border-box\",padding:cardPadding},children:!listingsSource?/*#__PURE__*/_jsx(CanvasMessage,{title:\"Listings Source not connected\",message:\"Connect a CMS Collection List to see your card design here. Keep the list on the page, not inside a component — a nested Collection List has no CMS context and renders one card.\"}):/*#__PURE__*/_jsx(\"div\",{style:{display:gridLayout===\"grid\"?\"grid\":\"flex\",flexDirection:gridLayout===\"stack\"?\"column\":undefined,gridTemplateColumns:gridLayout===\"grid\"?`repeat(${gridColumns}, minmax(0, 1fr))`:undefined,gap:gridGap},children:listingsSource})}),effectiveLayout!==\"gridOnly\"&&/*#__PURE__*/_jsx(\"div\",{style:{...mapPaneStyle,height:\"100%\"},children:/*#__PURE__*/_jsx(CanvasMessage,{title:isSingle?\"Single Location — Preview in Browser\":\"Live Map — Preview in Browser\",message:isSingle?\"Bind this listing's Latitude and Longitude CMS fields to the controls in the panel. Google Maps can't render inside Framer's canvas — open your published URL to see the pin.\":\"Google Maps can't render inside Framer's canvas. Open your published URL to see the live map, pins, and Search This Area filtering.\"})})]});}// --- Render (Preview / live / published) ---\nreturn /*#__PURE__*/_jsxs(\"div\",{style:{position:\"relative\",width:\"100%\",height:\"100%\",display:\"flex\",flexDirection:mapPosition===\"left\"?\"row-reverse\":\"row\",overflow:\"hidden\",...style},children:[/*#__PURE__*/_jsx(\"style\",{children:scrollbarCSS}),!isSingle&&/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":\"true\",style:{position:\"absolute\",width:0,height:0,overflow:\"hidden\",opacity:0,pointerEvents:\"none\"},children:captureTree}),!isSingle&&/*#__PURE__*/_jsx(\"div\",{ref:discoveryContainerRef,\"aria-hidden\":\"true\",style:{position:\"absolute\",width:0,height:0,overflow:\"hidden\",opacity:0,pointerEvents:\"none\"},children:discoveryContent}),effectiveLayout!==\"mapOnly\"&&/*#__PURE__*/_jsxs(\"div\",{className:scrollClass,style:{...gridPaneStyle,height:\"100%\",overflowY:\"auto\",boxSizing:\"border-box\",padding:cardPadding},children:[interceptFailed&&/*#__PURE__*/_jsx(StateMessage,{text:errorLabel,textColor:textColor}),!interceptFailed&&rawItems===null&&(loadingState?/*#__PURE__*/_jsx(_Fragment,{children:loadingState}):/*#__PURE__*/_jsx(StateMessage,{text:loadingLabel,textColor:textColor})),!interceptFailed&&rawItems!==null&&filteredMapData.length===0&&(emptyState?/*#__PURE__*/_jsx(_Fragment,{children:emptyState}):/*#__PURE__*/_jsx(StateMessage,{text:emptyLabel,textColor:textColor})),/*#__PURE__*/_jsx(\"div\",{ref:gridContainerRef,style:{display:gridLayout===\"grid\"?\"grid\":\"flex\",flexDirection:gridLayout===\"stack\"?\"column\":undefined,gridTemplateColumns:gridLayout===\"grid\"?`repeat(${gridColumns}, minmax(0, 1fr))`:undefined,gap:gridGap},children:gridContent})]}),effectiveLayout!==\"gridOnly\"&&/*#__PURE__*/_jsx(\"div\",{style:{...mapPaneStyle,height:\"100%\",position:\"relative\"},children:showPreviewNotice?/*#__PURE__*/_jsx(CanvasMessage,{title:\"Live Map — Open Published URL\",message:previewLabel}):/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"div\",{ref:mapContainerRef,style:{position:\"absolute\",inset:mapPadding}}),hoverCardEl&&!isSingle&&showCardOnHover&&hoveredListingId&&found&&/*#__PURE__*/createPortal(/*#__PURE__*/_jsx(\"div\",{style:{width:hoverCardWidth},children:found.renderFn([rawById.get(hoveredListingId)].filter(Boolean),...capturedArgsRef.current.slice(1))}),hoverCardEl),isStatic&&/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:mapPadding,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",background:\"#E5E1D8\",color:textColor,fontSize:13},children:\"Map preview\"}),!isStatic&&(!googleMapsApiKey||!googleMapsApiKey.trim())&&/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:mapPadding,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",textAlign:\"center\",padding:24,background:\"#F3F1EC\",color:textColor,fontSize:13},children:noApiKeyLabel}),!isStatic&&googleMapsApiKey&&mapLoadError&&/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:mapPadding,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",textAlign:\"center\",padding:24,background:\"#F3F1EC\",color:textColor,fontSize:13},children:mapLoadErrorLabel}),!isStatic&&isSingle&&singleMapData.length===0&&/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:mapPadding,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",textAlign:\"center\",padding:24,background:\"#F3F1EC\",color:textColor,fontSize:13},children:\"Bind this listing's Latitude and Longitude CMS fields to place the pin.\"})]})})]});}addPropertyControls(PropertyMapExplorer,{dataSource:{type:ControlType.Enum,title:\"Data Source\",options:[\"collection\",\"single\"],optionTitles:[\"Collection\",\"Single Location\"],defaultValue:\"collection\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\",description:\"Collection: bind a Collection List and get the filterable grid + map. Single Location: for a listing detail page — no Collection List, just bind this listing's Latitude and Longitude below. Layout is forced to Map Only.\"},singleLatitude:{type:ControlType.Number,title:\"Latitude\",defaultValue:0,min:-90,max:90,step:1e-6,displayStepper:false,hidden:props=>props.dataSource!==\"single\",description:\"Bind to the listing's Latitude CMS field. Left at 0 with Longitude also 0, the pin is treated as unset.\"},singleLongitude:{type:ControlType.Number,title:\"Longitude\",defaultValue:0,min:-180,max:180,step:1e-6,displayStepper:false,hidden:props=>props.dataSource!==\"single\",description:\"Bind to the listing's Longitude CMS field. Left at 0 with Latitude also 0, the pin is treated as unset.\"},singleLabel:{type:ControlType.String,title:\"Pin Label\",defaultValue:\"\",placeholder:\"Listing name\",hidden:props=>props.dataSource!==\"single\",description:\"Optional — shown on the price-style pin and used as its accessibility label.\"},listingsSource:{type:ControlType.ComponentInstance,title:\"Listings Source\",hidden:props=>props.dataSource===\"single\",description:\"Connect a Collection List bound to your listings collection. Keep it on the PAGE — a Collection List nested inside a component loses its CMS context and renders one card. Fields the map/filters need (Latitude, Longitude, and optionally Price/Status/Property Type/Bedrooms/Address/Neighborhood) must each be bound to a layer in the card template — even an invisible one — named to match the matching control in Field Mapping.\"},loadingState:{type:ControlType.ComponentInstance,title:\"Loading State\",hidden:props=>props.dataSource===\"single\",description:\"Optional — shown while listings load. Falls back to the Loading text in Messages.\"},emptyState:{type:ControlType.ComponentInstance,title:\"Empty State\",hidden:props=>props.dataSource===\"single\",description:\"Optional — shown when no listings match the current filters. Falls back to the Empty text in Messages.\"},layoutMode:{type:ControlType.Enum,title:\"Layout\",options:[\"split\",\"mapOnly\",\"gridOnly\"],optionTitles:[\"Split (Half-Map)\",\"Map Only\",\"Grid Only\"],defaultValue:\"split\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\",hidden:props=>props.dataSource===\"single\"},mapPosition:{type:ControlType.Enum,title:\"Map Position\",options:[\"left\",\"right\"],optionTitles:[\"Left\",\"Right\"],defaultValue:\"right\",displaySegmentedControl:true,hidden:props=>props.dataSource===\"single\"||props.layoutMode!==\"split\"},gridWidthMode:{type:ControlType.Enum,title:\"Split Sizing\",options:[\"percentage\",\"maxWidth\"],optionTitles:[\"Percentage Split\",\"Card Max Width\"],defaultValue:\"percentage\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\",hidden:props=>props.dataSource===\"single\"||props.layoutMode!==\"split\",description:\"Percentage Split: both sides sized proportionally via Map Width. Card Max Width: the card side caps at a fixed pixel width and the map stretches to fill what remains.\"},mapWidth:{type:ControlType.Number,title:\"Map Width\",defaultValue:45,min:30,max:70,step:1,unit:\"%\",hidden:props=>props.dataSource===\"single\"||props.layoutMode!==\"split\"||props.gridWidthMode!==\"percentage\"},gridMaxWidth:{type:ControlType.Number,title:\"Card Max Width\",defaultValue:420,min:240,max:800,step:10,unit:\"px\",hidden:props=>props.dataSource===\"single\"||props.layoutMode!==\"split\"||props.gridWidthMode!==\"maxWidth\"},gridLayout:{type:ControlType.Enum,title:\"Card Layout\",options:[\"stack\",\"grid\"],optionTitles:[\"Stack\",\"Grid\"],defaultValue:\"stack\",displaySegmentedControl:true,hidden:props=>props.dataSource===\"single\"||props.layoutMode===\"mapOnly\"},gridColumns:{type:ControlType.Number,title:\"Columns\",defaultValue:2,min:1,max:4,step:1,hidden:props=>props.dataSource===\"single\"||props.layoutMode===\"mapOnly\"||props.gridLayout!==\"grid\"},gridGap:{type:ControlType.Number,title:\"Grid Gap\",defaultValue:16,min:0,max:64,step:2,unit:\"px\",hidden:props=>props.dataSource===\"single\"||props.layoutMode===\"mapOnly\"},cardPadding:{type:ControlType.Padding,title:\"Card Padding\",defaultValue:\"16px\",hidden:props=>props.dataSource===\"single\"||props.layoutMode===\"mapOnly\"},showScrollbar:{type:ControlType.Boolean,title:\"Show Scrollbar\",defaultValue:false,enabledTitle:\"Show\",disabledTitle:\"Hide\",hidden:props=>props.dataSource===\"single\"||props.layoutMode===\"mapOnly\",description:\"Toggles only the visibility of the card list's scrollbar. The list still scrolls either way — wheel, trackpad, touch and keyboard are unaffected.\"},mapPadding:{type:ControlType.Padding,title:\"Map Padding\",defaultValue:\"0px\",hidden:props=>props.dataSource!==\"single\"&&props.layoutMode===\"gridOnly\"},fieldMapping:{type:ControlType.Object,title:\"Field Mapping\",hidden:props=>props.dataSource===\"single\",controls:{latitudeLayerName:{type:ControlType.String,title:\"Latitude\",defaultValue:\"Latitude\",description:\"Required for map pins. Add an invisible layer to the card template bound to Latitude and name the LAYER exactly this — not the field name, the layer's own name.\"},longitudeLayerName:{type:ControlType.String,title:\"Longitude\",defaultValue:\"Longitude\",description:\"Required for map pins. Same process as Latitude.\"},priceLayerName:{type:ControlType.String,title:\"Price\",defaultValue:\"Price\",description:\"Optional — used for pin labels and price-range filtering.\"},titleLayerName:{type:ControlType.String,title:\"Title\",defaultValue:\"Title\",description:'Optional — falls back to \"Listing 1/2/3…\" if not found.'},statusLayerName:{type:ControlType.String,title:\"Status\",defaultValue:\"Status\",description:\"Optional — used for the Status filter.\"},propertyTypeLayerName:{type:ControlType.String,title:\"Property Type\",defaultValue:\"Property Type\",description:\"Optional — used for the Property Type filter.\"},bedroomsLayerName:{type:ControlType.String,title:\"Bedrooms\",defaultValue:\"Bedrooms\",description:\"Optional — used for the minimum-bedrooms filter.\"},addressLayerName:{type:ControlType.String,title:\"Address\",defaultValue:\"Address\",description:\"Optional — included in text search matching.\"},neighborhoodLayerName:{type:ControlType.String,title:\"Neighborhood\",defaultValue:\"Neighborhood\",description:\"Optional — included in text search matching.\"},detailLinkLayerName:{type:ControlType.String,title:\"Detail Link\",defaultValue:\"Detail Link\",description:\"Powers map pin navigation. Only needed if the card has multiple links and you need to specify which is the detail-page one — otherwise the first link found is used.\"}}},mapSettings:{type:ControlType.Object,title:\"Map Settings\",controls:{googleMapsApiKey:{type:ControlType.String,title:\"Google Maps Key\",defaultValue:\"\",placeholder:\"AIzaSy...\",description:'Required. Create a key in Google Cloud Console, enable the \"Maps JavaScript API\", and enable billing. Restrict the key to your domain before shipping. Changing this requires a page reload, since Google Maps loads once per page.'},forceLiveMap:{type:ControlType.Boolean,title:\"Force Live Map\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"By default the map is replaced with a message in Framer's Preview, because a domain-restricted key renders Google's own error overlay there. Turn on to attempt the real map in Preview anyway. Detection is by hostname (framer.app, framercanvas.com, framer.website, localhost), so your staging URL counts as Preview.\"},googleMapId:{type:ControlType.String,title:\"Map ID\",defaultValue:\"\",placeholder:\"Cloud-based styling Map ID\",description:\"Optional but recommended for a cloud-managed look — Cloud Console → Map Styles. Overrides Style JSON when set.\"},mapStyleJson:{type:ControlType.String,title:\"Advanced: Style JSON\",defaultValue:\"\",displayTextArea:true,placeholder:\"Paste a Google Maps style array (JSON) — ignored if Map ID is set\",description:\"Optional: paste a classic style array from Google's styling wizard. Leave both blank to use the built-in muted default.\"},showAmenities:{type:ControlType.Boolean,title:\"Show Amenities\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"Shows Google's built-in points-of-interest icons. Free — just a style setting. Only affects the built-in default style.\"},initialZoom:{type:ControlType.Number,title:\"Initial Zoom\",defaultValue:12,min:1,max:20,step:.5},showSearchThisArea:{type:ControlType.Boolean,title:\"Search This Area\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"When on, panning/zooming re-filters the grid to listings inside the visible viewport. Listings always show by default on load. Ignored in Single Location mode.\"},pinStyle:{type:ControlType.Enum,title:\"Pin Style\",options:[\"price\",\"marker\"],optionTitles:[\"Price Pin\",\"Marker Pin\"],defaultValue:\"price\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\"},pinPadding:{type:ControlType.Padding,title:\"Pin Padding\",defaultValue:\"6px 10px\",hidden:props=>props.pinStyle===\"marker\"},pinRadius:{type:ControlType.Number,title:\"Pin Radius\",defaultValue:999,min:0,max:999,step:1,unit:\"px\",hidden:props=>props.pinStyle===\"marker\",description:\"999 keeps it fully rounded. Drop it for a squarer tag.\"},pinFontSize:{type:ControlType.Number,title:\"Pin Font Size\",defaultValue:12,min:8,max:24,step:1,unit:\"px\",hidden:props=>props.pinStyle===\"marker\"},pinFontWeight:{type:ControlType.Enum,title:\"Pin Font Weight\",options:[\"400\",\"500\",\"600\",\"700\",\"800\"],optionTitles:[\"Regular\",\"Medium\",\"Semibold\",\"Bold\",\"Extrabold\"],defaultValue:\"600\",hidden:props=>props.pinStyle===\"marker\"},pinBackground:{type:ControlType.Color,title:\"Pin Background\",defaultValue:\"#FFFFFF\",hidden:props=>props.pinStyle===\"marker\"},pinColor:{type:ControlType.Color,title:\"Pin Text\",defaultValue:\"#111111\",hidden:props=>props.pinStyle===\"marker\"},pinAccentTextColor:{type:ControlType.Color,title:\"Pin Text (Accent)\",defaultValue:\"#FFFFFF\",hidden:props=>props.pinStyle===\"marker\",description:\"Pin text colour while hovered, when the background flips to Accent.\"},pinBorderWidth:{type:ControlType.Number,title:\"Pin Border\",defaultValue:1,min:0,max:6,step:1,unit:\"px\",hidden:props=>props.pinStyle===\"marker\",description:\"Set to 0 for no border.\"},pinBorderColor:{type:ControlType.Color,title:\"Pin Border Color\",defaultValue:\"rgba(0,0,0,0.1)\",hidden:props=>props.pinStyle===\"marker\"||props.pinBorderWidth===0},pinAccentBorderColor:{type:ControlType.Color,title:\"Pin Border (Accent)\",hidden:props=>props.pinStyle===\"marker\"||props.pinBorderWidth===0,description:\"Border colour while hovered. Leave empty to follow the Accent colour automatically.\"},pinShadow:{type:ControlType.Boolean,title:\"Pin Shadow\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",hidden:props=>props.pinStyle===\"marker\"},pinNavigate:{type:ControlType.Boolean,title:\"Should Navigate\",defaultValue:true,enabledTitle:\"Yes\",disabledTitle:\"No\",description:\"When on, pins are real links to the listing's detail page — so cmd/middle-click opens a new tab. When off, clicking a pin only selects it.\"},showCardOnHover:{type:ControlType.Boolean,title:\"Show Card on Hover\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"Hovering a map pin floats your designed listing card above it. Collection mode only.\"},hoverCardWidth:{type:ControlType.Number,title:\"Hover Card Width\",defaultValue:280,min:120,max:600,step:10,unit:\"px\",hidden:props=>!props.showCardOnHover},hoverCardOffset:{type:ControlType.Number,title:\"Hover Card Offset\",defaultValue:14,min:0,max:80,step:1,unit:\"px\",hidden:props=>!props.showCardOnHover}}},accentColor:{type:ControlType.Color,title:\"Accent\",defaultValue:\"#2563EB\",description:\"Used for map pin highlight on hover.\"},textColor:{type:ControlType.Color,title:\"State Text Color\",defaultValue:\"#111111\",description:\"Loading / empty / error / map-state message text only.\"},messages:{type:ControlType.Object,title:\"Messages\",controls:{loadingLabel:{type:ControlType.String,title:\"Loading\",defaultValue:\"Loading listings…\"},emptyLabel:{type:ControlType.String,title:\"Empty\",defaultValue:\"No listings match your search.\"},errorLabel:{type:ControlType.String,title:\"Error\",defaultValue:\"⚠️ CMS structure not recognized. Connect a Collection List with listing data to the Listings Source slot.\",displayTextArea:true},noApiKeyLabel:{type:ControlType.String,title:\"No Key\",defaultValue:\"Add a Google Maps API key (see Map Settings) to enable the map.\",displayTextArea:true},mapLoadErrorLabel:{type:ControlType.String,title:\"Map Load Error\",defaultValue:\"⚠️ Google Maps failed to load. Check your API key and that the Maps JavaScript API is enabled in Google Cloud Console.\",displayTextArea:true},previewLabel:{type:ControlType.String,title:\"Preview Notice\",defaultValue:\"Google Maps keys are usually restricted to the published domain, so the live map can't render inside Framer's Preview. Open your published URL to see the map, pins and Search This Area filtering. To render it here anyway, turn on Force Live Map in Map Settings.\",displayTextArea:true}}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"PropertyMapExplorer\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicWidth\":\"1200\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"720\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./PropertyMapExplorer.map"],"mappings":"0RAKG,SAAwB,EAAc,EAAM,CAAC,GAAK,CAAC,QAAM,UAAQ,kBAAgB,aAAW,eAAa,YAAU,cAAY,WAAS,EAE3I,OAAoB,EAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAM,MAAM,MAAM,OAAO,OAAO,OAAO,SAAS,WAAW,kBAAgB,QAAQ,OAAO,QAAQ,OAAO,cAAc,SAAS,WAAW,SAAS,eAAe,SAAS,UAAU,SAAS,OAAO,qBAAqB,IAAI,EAAE,EAAE,SAAS,CAAc,EAAK,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAW,GAAG,CAAS,EAAE,SAAS,CAAK,CAAC,EAAe,EAAK,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAa,WAAW,WAAW,GAAG,CAAW,EAAE,SAAS,CAAO,CAAC,CAAC,CAAC,CAAC,CAAE,iBAN9a,KAAoD,EAM2X,GAAoB,EAAc,CAAC,MAAM,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,wBAAwB,EAAE,QAAQ,CAAC,KAAK,EAAY,OAAO,MAAM,UAAU,aAAa,6MAA6M,gBAAgB,EAAI,EAAE,gBAAgB,CAAC,KAAK,EAAY,MAAM,MAAM,aAAa,aAAa,WAAW,EAAE,YAAY,CAAC,KAAK,EAAY,MAAM,MAAM,eAAe,aAAa,SAAS,EAAE,WAAW,CAAC,KAAK,EAAY,MAAM,MAAM,cAAc,aAAa,SAAS,EAAE,aAAa,CAAC,KAAK,EAAY,MAAM,MAAM,gBAAgB,aAAa,WAAW,EAAE,UAAU,CAAC,KAAK,EAAY,KAAK,MAAM,aAAa,aAAa,CAAC,SAAS,OAAO,QAAQ,WAAW,cAAc,UAAU,WAAW,OAAO,EAAE,SAAS,WAAW,gBAAgB,YAAY,EAAE,YAAY,CAAC,KAAK,EAAY,KAAK,MAAM,eAAe,aAAa,CAAC,SAAS,OAAO,QAAQ,SAAS,cAAc,UAAU,WAAW,OAAO,EAAE,SAAS,WAAW,gBAAgB,YAAY,CAAC,CAAC,qBCAv9C,oBCNtH,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,OAAO,GAAG,WAAU,GAAU,EAAE,OAAO,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,UAAU,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,OAAO,KAAK,IAAI,OAAO,KAAK,IAAI,KAAK,IAAK,MAAK,cAAc,QAAQ,KAAK,wMAAwM,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,6BEkBlmB,SAAgB,IAAwB,CAAC,OAAOA,GAAqB,EAAM,UAAU,EAAM,SAAS,EAAM,QAAQ,CAAE,uBAN1D,IAAwC,EAAO,EAAoB,CAAC,MAAM,GAAG,SAAS,KAAK,SAAS,KAAK,QAAQ,KAAK,aAAa,MAAM,OAAO,MAAM,iBAAiB,KAAK,kBAAkB,KAAK,UAAU,KAAK,sBAAsB,EAAK,EAAQ,EAAMC,EAAY,IAAM,CAAC,GAAG,EAAoB,SAAS,GAAO,EAAI,CAAC,MAAM,CAAK,CAAC,EAAE,YAAY,GAAO,EAAI,CAAC,SAAS,CAAK,CAAC,EAAE,YAAY,GAAO,EAAI,CAAC,SAAS,CAAK,CAAC,EAAE,WAAW,GAAO,EAAI,CAAC,QAAQ,CAAK,CAAC,EAAE,gBAAgB,GAAO,EAAI,CAAC,aAAa,CAAK,CAAC,EAAE,UAAU,GAAO,EAAI,CAAC,OAAO,CAAK,CAAC,EAAE,oBAAoB,GAAI,EAAI,CAAC,iBAAiB,CAAE,CAAC,EAAE,qBAAqB,GAAI,EAAI,CAAC,kBAAkB,CAAE,CAAC,EAAE,aAAa,GAAQ,EAAI,CAAC,UAAU,CAAM,CAAC,EAAE,yBAAyB,GAAO,EAAI,CAAC,sBAAsB,CAAK,CAAC,EAAE,UAAU,EAAI,CAAC,GAAG,CAAmB,CAAC,CAAC,EAAE,wBE4Kr1B,SAAS,EAAiB,EAAI,EAAI,EAAM,CAAmI,OAA/H,KAAO,EAAK,OAAO,eAAe,EAAI,EAAI,CAAO,QAAM,WAAW,GAAK,aAAa,GAAK,SAAS,EAAI,CAAC,EAAQ,EAAI,GAAK,EAAc,CAAI,CAGnK,SAAS,EAAa,EAAG,EAAM,EAAE,CAAC,GAAG,EAAM,IAAW,CAAC,EAAG,OAAO,KAAK,GAAG,MAAM,QAAQ,CAAE,EAAE,CAAC,IAAI,IAAM,KAAK,EAAG,CAAC,IAAM,EAAM,EAAa,EAAE,CAAK,EAAE,GAAG,EAAM,OAAO,CAAM,CAAC,OAAO,IAAK,CAAC,GAAG,EAAG,OAAO,UAAU,OAAO,EAAG,MAAM,UAAW,YAAY,EAAG,MAAM,SAAS,QAAQ,EAAG,MAAM,CAAC,SAAS,EAAG,MAAM,SAAS,OAAK,EAAG,GAAG,MAAM,QAAQ,EAAG,OAAO,QAAQ,EAAE,CAAC,IAAI,IAAM,KAAK,EAAG,MAAM,SAAS,CAAC,IAAM,EAAM,EAAa,EAAE,EAAM,CAAC,EAAE,GAAG,EAAM,OAAO,CAAM,CAAC,OAAO,IAAK,CAA6G,OAAzG,EAAG,OAAO,UAAU,OAAO,EAAG,MAAM,UAAW,SAAiB,EAAa,EAAG,MAAM,SAAS,EAAM,CAAC,EAAU,IAAK,CAAC,SAAS,GAAU,EAAK,EAAM,EAAY,CAAC,GAAG,MAAM,QAAQ,CAAI,EAAG,OAAO,EAAK,IAAI,GAAI,GAAU,EAAG,EAAM,CAAW,CAAC,EAAG,SAAS,EAAK,EAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAI,OAAO,GAAK,SAAS,OAAO,EAAG,GAAG,IAAI,EAAa,OAAoB,EAAa,EAAG,CAAC,GAAG,EAAG,MAAM,SAAS,CAAK,CAAC,EAAG,IAAM,EAAO,EAAG,OAAO,SAAS,EAAK,EAAG,MAAM,SAAS,EAAE,CAAC,EAAE,EAAG,OAAO,SAAS,OAAoB,EAAa,EAAG,CAAC,GAAG,EAAG,MAAM,SAAS,CAAM,CAAC,CAAE,CAAC,OAAO,EAAK,CAAI,CAAE,CAKz7B,SAAS,IAAqB,CAAC,GAAU,IAAS,OAAY,MAAO,GAAM,IAAM,GAAM,EAAO,UAAU,UAAU,GAAA,CAAI,YAAY,EAA8E,OAAxE,EAAqB,IAAO,aAAa,IAAO,aAA+B,GAAsB,KAAK,GAAQ,IAAO,GAAQ,EAAK,SAAS,IAAI,GAAQ,CAAC,EAAhJ,EAAkJ,CAUrX,SAAS,GAAc,EAAI,CAAyC,MAArC,CAAC,GAAK,OAAO,GAAM,SAAe,CAAC,EAAS,EAAI,WAAW,EAAI,MAAM,EAAI,MAAM,EAAI,QAAQ,CAAI,CAE9H,SAAS,GAAe,EAAM,CAAC,IAAI,EAAI,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAM,OAAO,IAAI,CAAC,IAAM,EAAE,GAAc,EAAM,EAAE,EAAE,GAAK,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,EAAE,EAAG,CAAC,OAAO,CAAI,CAAC,SAAS,EAAc,EAAM,CAAwF,OAApF,OAAO,IAAM,KAAa,OAAO,IAAI,QAAS,WAAmB,IAAI,OAAO,CAAK,EAAU,EAAM,QAAQ,+BAA+B,MAAM,CAAE,CAEnV,SAAS,EAAc,EAAO,EAAU,CAAC,GAAG,CAAC,GAAQ,CAAC,GAAW,CAAC,EAAU,KAAK,EAAE,OAAO,KAAK,IAAM,EAAK,EAAU,KAAK,EAAM,EAAG,KAAK,GAAG,CAAC,EAAG,EAAO,cAAc,sBAAsB,EAAc,CAAI,EAAE,GAAG,CAAE,MAAM,CAExN,IAAM,EAAI,EAAO,iBAAiB,oBAAoB,EAAE,IAAI,IAAM,KAAa,MAAM,KAAK,CAAG,EAAG,GAAG,EAAU,aAAa,kBAAkB,IAAI,EAAK,CAAC,EAAG,EAAU,KAAM,CAAE,CAAC,GAAG,CAAC,EAAG,OAAO,KAAK,IAAM,EAAK,EAAG,YAAY,OAAO,GAAM,MAAM,EAAK,KAAK,CAAC,CAAC,OAAO,EAAE,EAAK,KAAK,EAAE,IAAK,CAIlR,SAAS,GAAc,EAAO,EAAU,CAAC,GAAG,CAAC,EAAO,OAAO,KAAK,IAAI,EAAQ,KAAK,GAAG,GAAW,EAAU,KAAK,EAAG,GAAG,CAAC,EAAQ,EAAO,cAAc,sBAAsB,EAAc,EAAU,KAAK,CAAC,EAAE,GAAG,CAAE,MAAM,CAAC,EAAQ,IAAK,CAAE,IAAI,EAAO,KAA4I,GAApI,IAAS,EAAO,EAAQ,UAAU,IAAI,EAAQ,EAAQ,cAAc,SAAS,GAAG,AAAY,IAAO,EAAO,cAAc,SAAS,EAAM,CAAC,EAAO,OAAO,KAAK,IAAM,EAAK,EAAO,aAAa,MAAM,EAAE,OAAO,GAAM,EAAK,KAAK,CAAC,CAAC,OAAO,EAAE,EAAK,KAAK,EAAE,IAAK,CAAC,SAAS,EAAiB,EAAK,CAAC,GAAG,GAAM,KAAK,OAAO,KAAK,IAAM,EAAQ,EAAK,QAAQ,aAAa,EAAE,EAAE,GAAG,CAAC,GAAS,IAAU,KAAK,IAAU,IAAI,OAAO,KAAK,IAAM,EAAE,WAAW,CAAO,EAAE,OAAO,OAAO,SAAS,CAAC,EAAE,EAAE,IAAK,CAAC,SAAS,GAAsB,EAAI,EAAM,EAAO,EAAM,CAAC,IAAM,EAAK,GAAc,CAAG,EAAQ,EAAS,EAAc,EAAO,EAAM,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,GAAM,IAAI,GAAM,MAAM,WAAW,GAAO,EAAE,MAAM,GAAU,EAAS,OAAO,EAAE,EAAS,WAAW,EAAM,IAAI,MAAM,EAAiB,EAAc,EAAO,EAAM,KAAK,CAAC,EAAE,aAAa,EAAc,EAAO,EAAM,YAAY,EAAE,OAAO,EAAc,EAAO,EAAM,MAAM,EAAE,QAAQ,EAAc,EAAO,EAAM,OAAO,EAAE,aAAa,EAAc,EAAO,EAAM,YAAY,EAAE,SAAS,EAAiB,EAAc,EAAO,EAAM,QAAQ,CAAC,EAAE,SAAS,EAAiB,EAAc,EAAO,EAAM,QAAQ,CAAC,EAAE,UAAU,EAAiB,EAAc,EAAO,EAAM,SAAS,CAAC,EAAE,UAAU,GAAc,EAAO,EAAM,UAAU,CAAC,CAAE,CAGv7C,SAAS,GAAa,EAAS,EAAQ,CAAC,OAAO,EAAS,OAAO,GAAG,CAAC,GAAG,EAAQ,MAAM,CAAC,IAAM,EAAE,EAAQ,MAAM,YAAY,EAAmF,GAAG,CAArE,GAAG,EAAE,MAAM,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,cAAc,KAAK,YAAyB,CAAC,CAAC,SAAS,CAAC,EAAE,MAAO,EAAM,CAA+S,GAA3S,EAAQ,UAAU,OAAO,EAAE,OAAO,GAAG,EAAQ,UAAyB,EAAQ,UAAU,OAAO,EAAE,OAAO,KAAU,EAAQ,UAAyB,EAAQ,SAAS,OAAO,EAAE,UAAU,GAAG,EAAQ,SAAwB,EAAQ,eAAe,OAAO,EAAE,eAAe,EAAQ,cAA6B,EAAQ,SAAS,OAAO,EAAE,SAAS,EAAQ,OAAO,MAAO,GAAM,GAAG,EAAQ,uBAAuB,EAAQ,UAAU,CAAC,IAAM,EAAE,EAAQ,UAA8D,GAAjD,EAAE,UAAU,MAAM,EAAE,WAAW,MAAqB,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,MAAO,EAAM,CAAC,MAAO,EAAK,CAAC,CAAE,CAGn1B,SAAS,GAAa,CAAC,OAAK,aAAW,CAAC,OAAoB,EAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,UAAU,SAAS,MAAM,EAAU,QAAQ,IAAI,SAAS,EAAE,EAAE,SAAS,CAAI,CAAC,CAAE,CAAghC,SAAS,GAAwB,EAAc,CAA2C,OAAvC,EAAqB,EAAwB,CAAC,GAAG,EAAkB,CAAC,YAAY,MAAM,YAAY,cAAc,QAAQ,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,MAAM,YAAY,cAAc,QAAQ,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAE,CAAmC,SAAS,GAAe,EAAO,CAAC,GAAU,IAAS,OAAY,OAAO,QAAQ,OAAW,MAAM,WAAW,CAAC,EAAE,IAAM,EAAE,EAA2kB,OAAjkB,EAAE,QAAQ,MAAM,IAAW,QAAQ,QAAQ,EAAE,MAAM,EAAK,IAAyD,EAAyB,IAAI,SAAS,EAAQ,IAAS,CAAC,IAAM,EAAa,sBAAsB,EAAE,OAAkB,EAAQ,EAAE,MAAM,EAAE,IAAM,EAAO,SAAS,cAAc,QAAQ,EAAE,EAAO,IAAI,+CAA+C,mBAAmB,CAAM,EAAE,qBAAqB,IAAe,EAAO,MAAM,GAAK,EAAO,YAAY,CAAC,EAAyB,KAAK,EAAW,MAAM,mCAAmC,CAAC,CAAE,EAAE,SAAS,KAAK,YAAY,CAAM,CAAE,CAAC,EAAS,EAAyB,CAAC,SAAS,GAAyB,EAAO,CAAC,OAAO,cAAiC,EAAO,KAAK,WAAW,CAAC,OAAO,CAA6B,KAAX,SAAe,CAAC,EAAE,mBAAmB,YAAY,KAAK,EAAE,CAAE,CAAC,MAAM,CAAC,IAAM,EAAW,KAAK,cAAc,EAAE,GAAG,CAAC,EAAW,OAAO,IAAM,EAAM,EAAW,qBAAqB,KAAK,QAAQ,EAAM,IAAa,KAAK,GAAG,MAAM,KAAK,GAAG,EAAM,EAAE,IAAI,KAAK,GAAG,MAAM,IAAI,GAAG,EAAM,EAAE,IAAI,KAAK,GAAG,MAAM,UAAU,yBAAyB,CAAC,UAAU,CAAC,KAAK,GAAG,oBAAoB,aAAa,KAAK,OAAO,EAAE,KAAK,GAAG,oBAAoB,aAAa,KAAK,OAAO,EAAE,KAAK,GAAG,oBAAoB,QAAQ,KAAK,OAAO,EAAE,KAAK,GAAG,YAAY,YAAY,KAAK,EAAE,CAAE,CAAC,YAAY,EAAS,EAAG,EAAQ,EAAQ,EAAQ,CAAC,MAAM,EAAE,EAAiB,KAAK,WAAW,IAAK,EAAC,EAAE,EAAiB,KAAK,KAAK,IAAK,EAAC,EAAE,EAAiB,KAAK,UAAU,IAAK,EAAC,EAAE,EAAiB,KAAK,UAAU,IAAK,EAAC,EAAE,EAAiB,KAAK,UAAU,IAAK,EAAC,EAAE,KAAK,SAAS,EAAS,KAAK,GAAG,EAAG,KAAK,QAAQ,EAAQ,KAAK,QAAQ,EAAQ,KAAK,QAAQ,EAAQ,KAAK,GAAG,MAAM,SAAS,WAAW,KAAK,GAAG,iBAAiB,aAAa,KAAK,OAAO,EAAE,KAAK,GAAG,iBAAiB,aAAa,KAAK,OAAO,EAAE,KAAK,GAAG,iBAAiB,QAAQ,KAAK,OAAO,CAAE,CAAC,CAAE,CAAC,SAAS,GAAyB,EAAO,CAAC,OAAO,cAAoC,EAAO,KAAK,WAAW,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,EAAE,UAAU,YAAY,KAAK,EAAE,CAAE,CAAC,MAAM,CAAC,IAAM,EAAW,KAAK,cAAc,EAAE,GAAG,CAAC,EAAW,OAAO,IAAM,EAAM,EAAW,qBAAqB,KAAK,QAAQ,EAAM,IAAa,KAAK,GAAG,MAAM,KAAK,GAAG,EAAM,EAAE,IAAI,KAAK,GAAG,MAAM,IAAI,GAAG,EAAM,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,YAAY,YAAY,KAAK,EAAE,CAAE,CAAC,YAAY,EAAS,CAAC,KAAK,SAAS,EAAS,KAAK,KAAK,CAAE,CAAC,YAAY,EAAS,EAAG,CAAC,MAAM,EAAE,EAAiB,KAAK,WAAW,IAAK,EAAC,EAAE,EAAiB,KAAK,KAAK,IAAK,EAAC,EAAE,KAAK,SAAS,EAAS,KAAK,GAAG,CAAG,CAAC,CAAE,CA6Bh/H,SAAwB,EAAoB,EAAM,CAAC,GAAK,CAAC,aAAW,aAAa,iBAAe,EAAE,kBAAgB,EAAE,eAAY,GAAG,iBAAe,gBAAa,cAAW,cAAW,QAAQ,cAAY,QAAQ,gBAAc,aAAa,WAAS,GAAG,eAAa,IAAI,aAAW,QAAQ,eAAY,EAAE,WAAQ,GAAG,cAAY,OAAO,aAAW,MAAM,iBAAc,GAAM,gBAAa,cAAY,YAAS,cAAY,UAAU,YAAU,UAAU,UAAO,EAAW,CAAC,oBAAkB,WAAW,qBAAmB,YAAY,kBAAe,QAAQ,kBAAe,QAAQ,kBAAgB,SAAS,wBAAsB,gBAAgB,qBAAkB,WAAW,oBAAiB,UAAU,yBAAsB,eAAe,uBAAoB,eAAe,IAAc,CAAC,EAAO,CAAC,mBAAiB,GAAG,eAAY,GAAG,gBAAa,GAAG,eAAY,GAAG,qBAAmB,GAAK,iBAAc,GAAK,YAAS,QAAQ,cAAW,WAAW,iBAAc,UAAU,YAAS,UAAU,sBAAmB,UAAU,aAAU,IAAI,eAAY,GAAG,iBAAc,MAAM,kBAAe,EAAE,kBAAe,kBAAkB,uBAAqB,GAAG,aAAU,GAAK,eAAY,GAAK,kBAAgB,GAAM,kBAAe,IAAI,mBAAgB,GAAG,gBAAa,IAAO,GAAa,CAAC,EAAO,CAAC,gBAAa,oBAAoB,cAAW,iCAAiC,cAAW,4GAA4G,iBAAc,kEAAkE,qBAAkB,yHAAyH,gBAAa,yQAAyQ,IAAU,CAAC,EAAQ,EAAS,GAAa,QAAQ,IAAI,GAAa,OAAa,EAAS,GAAoB,EAAQ,EAAS,IAAa,SAAe,EAAgB,EAAS,UAAU,GAAgB,CAAC,GAAc,IAAkBC,EAAS,EAAK,EAAE,MAAc,CAAC,GAAiB,GAAoB,CAAC,CAAE,EAAE,CAAC,CAAC,EAAE,IAAM,GAAkB,CAAC,GAAU,CAAC,GAAU,CAAC,IAAc,GAAoB,GAAMC,EAAO,IAAI,EAAK,GAAM,UAAU,OAAK,GAAM,QAAQ,MAAM,EAAE,MAAe,IAAM,EAAY,aAAa,GAAM,UAE35E,GAAa,GAAc,IAAI,EAAY,+FAAkG,EAAY,6CAAgD,EAAY,qDAAwD,EAAY,8EAAiF,EAAY,8DAA8D,IAAI,EAAY,kDAAqD,EAAY,qDAA2D,GAAc,IAAkB,WAAW,CAAC,MAAM,MAAM,EAAE,IAAgB,WAAW,CAAC,KAAK,OAAO,EAAa,IAAI,SAAS,EAAa,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,EAAS,GAAG,WAAW,CAAC,EAAQ,GAAa,IAAkB,UAAU,CAAC,MAAM,MAAM,EAAE,IAAgB,WAAW,CAAC,KAAK,WAAW,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG,EAAS,GAAG,WAAW,CAAC,EAAQ,GAAWC,OAAa,CAAC,MAAM,GAAe,MAAM,GAAe,OAAO,EAAgB,aAAa,EAAsB,SAAS,GAAkB,QAAQ,GAAiB,aAAa,GAAsB,SAAS,EAAkB,UAAU,EAAmB,WAAW,EAAmB,GAAG,CAAC,GAAe,GAAe,EAAgB,EAAsB,GAAkB,GAAiB,GAAsB,EAAkB,EAAmB,EAAmB,CAAC,EACl4C,CAAC,EAAS,IAAaF,EAAS,IAAI,EAEnC,GAAeC,EAAO,IAAI,EAAQ,GAAgBA,EAAO,CAAC,CAAC,EAAQ,EAAMC,MAAgB,GAAU,GAAU,CAAC,EAAsB,KAAY,EAAa,CAAc,EAAI,CAAC,EAAS,EAAS,CAAc,CAAC,EAAQ,GAAgB,CAAC,GAAU,CAAC,IAAW,CAAC,GAAgB,CAAC,GAAa,GAAUC,GAAa,GAAG,IAAO,CAAC,IAAM,EAAM,MAAM,QAAQ,EAAK,EAAE,EAAE,EAAK,GAAG,CAAC,EAAQ,EAAI,GAAe,CAAK,EAAoI,OAA/H,IAAM,GAAe,UAAS,GAAe,QAAQ,EAAI,MAAoB,GAAY,CAAK,CAAC,GAAG,GAAgB,QAAQ,EAAY,EAAM,EAAM,SAAS,GAAG,CAAI,EAAE,IAAK,EAAE,CAAC,CAAK,CAAC,EAAQ,GAAYD,MAAgB,GAAU,GAAU,CAAC,GAAgB,CAAC,EAAa,KAAY,GAAU,EAAe,GAAU,EAAM,KAAK,EAAI,CAAC,EAAS,EAAS,EAAe,EAAM,EAAS,CAAC,EAC3wB,GAAsBD,EAAO,IAAI,EAAO,CAAC,GAAQ,IAAYD,EAAS,CAAC,CAAC,EAAQ,GAAiBE,MAAgB,GAAU,GAAU,CAAC,GAAO,CAAC,GAAU,EAAS,SAAS,EAAS,KAAY,EAAM,SAAS,EAAS,GAAG,GAAgB,QAAQ,MAAM,CAAC,CAAC,EAAI,CAAC,EAAS,EAAS,EAAM,CAAQ,CAAC,EAAE,MAAc,CAAC,GAAG,GAAU,EAAS,OAAO,GAAG,CAAC,GAAU,EAAS,SAAS,EAAE,CAAC,GAAW,CAAC,CAAC,EAAE,MAAO,CAAC,IAAM,EAAU,GAAsB,QAAQ,GAAG,CAAC,EAAU,OAAO,IAAM,EAAQ,MAAM,KAAK,EAAU,QAAQ,EAAQ,EAAU,EAAS,KAAK,EAAI,IAAI,GAAsB,EAAI,EAAE,EAAQ,GAAG,EAAU,CAAC,EAAE,GAAW,CAAS,CAC5mB,EAAE,CAAC,EAAS,EAAS,EAAS,GAAW,EAAgB,CAAC,EAAE,IAAM,GAAQA,MAAY,CAAC,IAAM,EAAI,IAAI,IAAsG,OAA9F,GAAoB,EAAS,SAAS,EAAI,IAAI,CAAC,EAAI,IAAI,GAAQ,EAAE,EAAE,IAAI,WAAW,IAAI,CAAG,CAAE,CAAC,EAA5E,CAAyF,EAAE,CAAC,EAAS,EAAO,CAAC,EACpO,GAAcA,MAAY,CAAC,GAAG,CAAC,EAAS,MAAM,CAAC,EAAE,IAAM,EAAI,OAAO,CAAc,EAAQ,EAAI,OAAO,CAAe,EAE3F,MAFgG,CAAC,OAAO,SAAS,CAAG,GAAG,CAAC,OAAO,SAAS,CAAG,GAErK,IAAM,GAAG,IAAM,EAAQ,CAAC,EAAQ,CAAC,CAAC,GAAG,kBAAkB,MAAM,GAAY,KAAK,GAAG,WAAW,MAAM,KAAK,aAAa,KAAK,OAAO,KAAK,QAAQ,KAAK,aAAa,KAAK,SAAS,KAAK,SAAS,EAAI,UAAU,EAAI,UAAU,IAAI,CAAC,CAAE,EAAE,CAAC,EAAS,EAAe,EAAgB,EAAW,CAAC,EAClR,EAAQ,GAAuB,EAK/B,EAAWD,EAAO,CAAO,EAAE,MAAc,CAAC,EAAW,QAAQ,CAAQ,CAAC,EAE5E,IAAM,GAAgBA,EAAO,IAAI,EAAQ,EAAiBE,MAAgB,CAAC,AAAkE,GAAgB,WAAtD,aAAa,GAAgB,OAAO,EAA0B,KAAM,EAAE,CAAC,CAAC,EAAQ,GAAeA,MAAgB,CAAC,EAAiB,EAAE,GAAgB,QAAQ,eAAe,CAAC,IAAM,EAAE,EAAW,QAAW,EAAE,mBAAmB,MAAK,EAAE,oBAAoB,IAAI,CAAE,EAAE,GAAG,CAAE,EAAE,CAAC,CAAgB,CAAC,EAAE,UAAkB,EAAiB,EAAE,CAAC,CAAgB,CAAC,EAC1b,IAAM,EAAiB,EAAQ,iBAAiB,MAAc,CAC9D,EAAQ,yBAAyB,IAAe,CAAkB,CAClE,EAAE,CAAC,EAAmB,CAAQ,CAAC,EAAE,IAAM,GAAmBD,MAAY,GAAa,GAAQ,CAAO,EAAE,CAAC,GAAQ,EAAQ,MAAM,EAAQ,SAAS,EAAQ,SAAS,EAAQ,QAAQ,EAAQ,aAAa,EAAQ,OAAO,EAAQ,sBAAsB,EAAQ,SAAS,CAAC,EAAQ,EAAgB,EAAS,GAAc,GAAyB,GAAiBA,MAAY,EAAS,CAAC,EAAE,EAAgB,IAAI,GAAG,GAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,OAAO,EAAE,CAAC,EAAS,EAAgB,EAAO,CAAC,EACxc,GAAiBD,EAAO,IAAI,EAAQ,GAAYC,MAAgB,GAAU,GAAU,CAAC,GAAO,GAAiB,SAAS,EAAS,KAAY,EAAM,SAAS,GAAiB,GAAG,GAAgB,QAAQ,MAAM,CAAC,CAAC,EAAI,CAAC,EAAS,EAAS,EAAM,EAAgB,CAAC,EAIlQ,MAAc,CAAC,GAAG,GAAU,EAAS,OAAO,IAAM,EAAU,GAAiB,QAAQ,GAAG,CAAC,EAAU,OAAO,IAAM,EAAS,MAAM,KAAK,EAAU,QAAQ,EAAQ,EAAS,CAAC,EAA6rB,OAA3rB,EAAS,SAAS,EAAM,IAAI,CAAC,IAAM,EAAQ,EAAgB,GAAG,GAAG,CAAC,EAAQ,OAAO,EAAM,MAAM,OAAO,UAAU,IAAM,MAAY,CAAC,IAAM,EAAE,EAAW,QAAW,EAAE,mBAAmB,EAAQ,IAAG,EAAE,oBAAoB,EAAQ,EAAE,CAAE,EAAQ,MAAY,CAAC,IAAM,EAAE,EAAW,QAAW,EAAE,mBAAmB,MAAK,EAAE,oBAAoB,IAAI,CAAE,EAAQ,MAAY,CAAC,EAAW,QAAQ,qBAAqB,EAAQ,EAAE,CAAE,EAAE,EAAM,iBAAiB,aAAa,CAAO,EAAE,EAAM,iBAAiB,aAAa,CAAO,EAAE,EAAM,iBAAiB,QAAQ,CAAO,EAAE,EAAS,SAAS,CAAC,EAAM,oBAAoB,aAAa,CAAO,EAAE,EAAM,oBAAoB,aAAa,CAAO,EAAE,EAAM,oBAAoB,QAAQ,CAAO,CAAE,CAAC,CAAE,CAAC,MAAY,EAAS,QAAQ,GAAI,EAAG,CAAC,CAAE,EAAE,CAAC,EAAS,EAAS,GAAY,CAAe,CAAC,EAC37B,IAAM,EAAgBD,EAAO,IAAI,EAAQ,EAAOA,EAAO,IAAI,EAAQ,EAAUA,EAAO,IAAI,EAAQ,GAAgBA,EAAO,IAAI,EAAQ,GAAsBA,EAAO,IAAI,EAAQ,EAAWA,EAAO,CAAC,CAAC,EAAQ,EAAgBA,EAAO,IAAI,EAAQ,GAAkBA,EAAO,IAAI,EAAO,CAAC,GAAS,IAAaD,EAAS,EAAK,EAAO,CAAC,GAAa,IAAiBA,EAAS,EAAK,EAAO,CAAC,GAAaA,MAAa,OAAO,SAAW,IAAY,SAAS,cAAc,KAAK,EAAE,IAAI,EAAE,MAAc,CAK9W,GALkX,CAAC,IAAmB,EAAY,MAAM,SAAS,WAAW,EAAY,MAAM,OAAO,KAEjjB,EAAY,MAAM,cAAc,EAAgB,OAAO,OAGvD,EAAY,MAAM,cAAc,GAAG,GAAgB,IAAI,EAAY,MAAM,UAAU,yBAA4B,CAAC,GAAgB,OAAO,IAAM,MAAgB,EAAiB,EAAQ,MAAgB,GAAe,EAAgH,OAA9G,EAAY,iBAAiB,aAAa,CAAW,EAAE,EAAY,iBAAiB,aAAa,CAAW,MAAY,CAAC,EAAY,oBAAoB,aAAa,CAAW,EAAE,EAAY,oBAAoB,aAAa,CAAW,CAAE,CAAE,EAAE,CAAC,EAAY,GAAgB,EAAgB,EAAiB,EAAc,CAAC,EAAE,IAAM,GAAwBC,EAAO,GAAoB,CAAC,CAAQ,EAAE,MAAc,CAAC,GAAwB,QAAQ,GAAoB,CAAC,CAAS,EAAE,CAAC,EAAmB,CAAQ,CAAC,EAAE,IAAM,GAAgBA,EAAO,EAAQ,YAAY,EA2C1vB,OA3C4vB,MAAc,CAAC,GAAgB,QAAQ,EAAQ,YAAa,EAAE,CAAC,EAAQ,YAAY,CAAC,EAAE,MAAc,CAAwJ,GAApJ,GAAU,GAAiB,IAAS,QAAsB,IAA4B,CAAC,EAAgB,SAAS,IAAkB,YAAqB,CAAC,GAAkB,CAAC,EAAiB,KAAK,EAAE,OAAO,IAAI,EAAU,GAGpgB,OAH0gB,MAAoB,GAAgB,EAAK,CAAC,EAAE,GAAe,EAAiB,KAAK,CAAC,CAAC,CAAC,KAAK,GAAQ,CAAC,GAAG,GAAW,CAAC,EAAgB,QAAQ,OAAO,EAAU,QAAQ,EAAO,GAAgB,QAAQ,GAAyB,CAAM,EAAE,GAAsB,QAAQ,GAAyB,CAAM,EAAE,IAAM,EAAW,CAAC,OAAO,CAAC,IAAI,QAAQ,IAAI,QAAQ,EAAE,KAAK,GAAY,iBAAiB,GAAK,YAAY,GAAK,eAAe,EAAK,EAAE,GAAG,IAAa,GAAY,KAAK,EAAG,EAAW,MAAM,GAAY,KAAK,MAAO,CAAC,IAAI,EAAO,GAAwB,EAAa,EAAE,GAAG,IAAc,GAAa,KAAK,EAAG,GAAG,CAAC,IAAM,EAAO,KAAK,MAAM,EAAY,EAAK,MAAM,QAAQ,CAAM,IAAE,EAAO,EAAO,MAAM,CACluD,CAAE,EAAW,OAAO,CAAO,CAAC,IAAM,EAAI,IAAI,EAAO,KAAK,IAAI,EAAgB,QAAQ,CAAU,EAEiL,GAF/K,EAAI,YAAY,WAAW,CAEzH,GAF6H,CAAC,GAAwB,SAEnJ,CAAC,EAAI,mBAAmB,OAAO,IAAM,EAAE,EAAI,UAAU,EAAE,GAAG,CAAC,EAAE,OAAO,IAAM,EAAG,EAAE,aAAa,EAAQ,EAAG,EAAE,aAAa,EAAE,GAAgB,QAAQ,CAAC,MAAM,EAAG,IAAI,EAAE,MAAM,EAAG,IAAI,EAAE,KAAK,EAAG,IAAI,EAAE,KAAK,EAAG,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,EAAO,QAAQ,EAAI,MAAoB,GAAY,EAAI,CAAC,EAAK,OAAO,eAAiB,KAAa,EAAgB,QAAQ,CAAC,IAAM,EAAS,IAAI,mBAAmB,CAAC,EAAO,KAAK,MAAM,QAAQ,EAAI,QAAQ,CAAE,CAAC,EAAE,EAAS,QAAQ,EAAgB,OAAO,EAAE,GAAkB,QAAQ,CAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAK,GAAU,MAAoB,GAAgB,EAAI,CAAC,CAAE,CAAC,MAAY,CAAC,EAAU,GAAK,AAAqE,GAAkB,WAAzD,GAAkB,QAAQ,WAAW,EAA4B,MAAM,EAAW,QAAQ,QAAQ,GAAG,EAAE,OAAO,IAAI,CAAC,EAAE,EAAW,QAAQ,CAAC,EAAE,AAAiE,EAAgB,WAArD,EAAgB,QAAQ,OAAO,IAAI,EAA0B,MAAS,EAAO,SAAS,EAAU,SAAS,EAAU,QAAQ,KAAK,MAAM,uBAAuB,EAAO,OAAO,EAAG,EAAO,QAAQ,KAAK,MAAoB,GAAY,EAAK,CAAC,CAAE,CACjgC,EAAE,CAAC,EAAS,EAAS,GAAkB,EAAiB,GAAY,GAAa,GAAc,EAAgB,EAAW,CAAC,EAG3H,MAAc,CAAC,GAAG,EAAS,OAAO,IAAM,EAAI,EAAO,QAAc,EAAO,EAAU,QAAc,EAAa,GAAgB,QAAQ,GAAG,CAAC,GAAK,CAAC,GAAQ,CAAC,GAAc,CAAC,GAAS,OAAO,EAAW,QAAQ,QAAQ,GAAG,EAAE,OAAO,IAAI,CAAC,EAAE,EAAW,QAAQ,CAAC,EAAE,IAAM,EAAO,CAAC,EAAQ,EAAW,CAAC,EAEvR,EAAqB,GAAsB,EAAqB,KAAK,EAAE,EAAqB,EA+BlG,GA/B8G,EAAgB,QAAQ,GAAS,CAAC,GAAG,EAAQ,UAAU,MAAM,EAAQ,WAAW,KAAK,OAAO,IAAM,EAAS,IAAI,EAAO,KAAK,OAAO,EAAQ,SAAS,EAAQ,SAAS,EAAE,EAAO,KAAK,CAAC,IAAI,EAAQ,SAAS,IAAI,EAAQ,SAAS,CAAC,EAAE,IAAM,EAAU,IAAmB,EAAQ,GAEnX,EAAQ,IAAa,CAAC,GAAU,EAAQ,UAAU,EAAQ,UAAU,KAAW,EAAG,SAAS,cAAc,EAAQ,IAAI,KAAK,EAAE,EAAG,aAAa,aAAa,EAAQ,KAAK,EAAM,GAAQ,EAAG,aAAa,OAAO,QAAQ,EAAK,KAAW,SAAU,EAAG,MAAM,QAAQ;;;;;kCAKlO,EAAU,EAAY,UAAU;wCAC1B,EAAY;;;iCAGnB,EAAU,cAAc,WAAW;mBAC5C,EAAG,MAAM,QAAQ;+BACV,GAAW;qCACL,GAAU;iCACd,GAAY;mCACV,GAAc;;;;kCAIf,EAAU,EAAY,GAAc;6BACzC,EAAU,GAAmB,GAAS;kCACjC,GAAU,6BAA6B,OAAO;8BAClD,GAAe,WAAW,EAAU,EAAqB,GAAe;;;kBAGpF,EAAG,YAAY,EAAQ,MAAM,IAAI,KAAK,MAAM,EAAQ,KAAK,CAAC,CAAC,eAAe,IAAI,EAAQ,OAErG,IAAS,EAAG,KAAK,EAAQ,EAAG,MAAM,eAAe,OAAO,EAAG,MAAM,MAAM,EAAG,MAAM,OAAO,UAAU,EAAG,MAAM,QAAQ,KAAW,SAAS,QAAQ,gBAAgB,IAAM,EAAQ,IAAI,EAAa,EAAS,MAAO,CAAC,EAAiB,EAAE,IAAM,EAAE,EAAW,QAAW,EAAE,mBAAmB,EAAQ,IAAG,EAAE,oBAAoB,EAAQ,EAAE,CAAE,MAAM,CAAC,GAAe,CAAE,MAAM,CAAC,EAAW,QAAQ,qBAAqB,EAAQ,EAAE,EAElZ,IAAmB,IAAsB,EAAQ,YAAW,EAAO,SAAS,KAAK,EAAQ,UAAW,CAAC,EAAE,EAAQ,OAAO,CAAG,EAAE,EAAW,KAAK,CAAO,CAAE,CAAC,EAAE,EAAW,QAAQ,EAC1K,CAAC,EAAI,oBAAoB,EAAO,OAAO,EAA+B,GAA5B,EAAI,mBAAmB,GAAQ,EAAO,OAAO,EAAE,CAAC,IAAM,EAAO,IAAI,EAAO,KAAK,aAAa,EAAO,QAAQ,GAAG,EAAO,OAAO,CAAC,CAAC,EAAE,EAAI,UAAU,EAAO,EAAE,CAAE,MAAM,EAAI,UAAU,EAAO,EAAE,EAAE,EAAI,QAAQ,EAAW,CAAI,EAAE,CAAC,EAAS,GAAS,EAAgB,EAAiB,GAAS,GAAW,GAAc,GAAS,GAAmB,GAAU,GAAY,GAAc,GAAe,GAAe,EAAqB,GAAU,GAAY,EAAS,EAAY,EAAU,EAAW,CAAC,EAC1gB,MAAc,CAAC,GAAG,GAAU,GAAU,CAAC,GAAS,OAAO,IAAM,EAAO,EAAU,QAAc,EAAI,EAAO,QAAc,EAAc,GAAsB,QAAQ,GAAG,CAAC,GAAQ,CAAC,GAAK,CAAC,GAAe,CAAC,EAAY,OAAO,IAAM,EAAQ,EAAgB,EAAgB,KAAK,GAAG,EAAE,KAAK,CAAgB,EAAE,KAAK,GAAG,CAAC,GAAS,EAAQ,UAAU,MAAM,EAAQ,WAAW,KAAK,CAAC,AAAiE,EAAgB,WAArD,EAAgB,QAAQ,OAAO,IAAI,EAA0B,MAAM,MAAO,CAAC,IAAM,EAAS,IAAI,EAAO,KAAK,OAAO,EAAQ,SAAS,EAAQ,SAAS,EAAM,EAAgB,QAAmH,EAAgB,QAAQ,YAAY,CAAQ,GAAtJ,EAAgB,QAAQ,IAAI,EAAc,EAAS,CAAW,EAAE,EAAgB,QAAQ,OAAO,CAAG,EAAuD,EAAE,CAAC,EAAS,EAAS,GAAS,EAAgB,EAAiB,EAAgB,CAAW,CAAC,EACxyB,EAA8B,EAAM,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,MAAM,OAAO,OAAO,OAAO,QAAQ,OAAO,cAAc,IAAc,OAAO,cAAc,MAAM,SAAS,SAAS,GAAG,EAAK,EAAE,SAAS,CAAC,IAAkB,WAAwB,EAAK,MAAM,CAAC,MAAM,CAAC,GAAG,GAAc,OAAO,OAAO,UAAU,OAAO,UAAU,aAAa,QAAQ,CAAW,EAAE,SAAU,EAAiS,EAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAa,OAAO,OAAO,OAAO,cAAc,IAAa,QAAQ,SAAS,IAAA,GAAU,oBAAoB,IAAa,OAAO,UAAU,GAAY,mBAAmB,IAAA,GAAU,IAAI,EAAO,EAAE,SAAS,CAAc,CAAC,EAAxf,EAAK,EAAc,CAAC,MAAM,gCAAgC,QAAQ,mLAAmL,CAAC,CAAmQ,CAAC,EAAE,IAAkB,YAAyB,EAAK,MAAM,CAAC,MAAM,CAAC,GAAG,GAAa,OAAO,MAAM,EAAE,SAAsB,EAAK,EAAc,CAAC,MAAM,EAAS,uCAAuC,gCAAgC,QAAQ,EAAS,gLAAgL,qIAAqI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACh6C,EAAM,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,MAAM,OAAO,OAAO,OAAO,QAAQ,OAAO,cAAc,IAAc,OAAO,cAAc,MAAM,SAAS,SAAS,GAAG,EAAK,EAAE,SAAS,CAAc,EAAK,QAAQ,CAAC,SAAS,EAAY,CAAC,EAAE,CAAC,GAAuB,EAAK,MAAM,CAAC,cAAc,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,OAAO,EAAE,SAAS,SAAS,QAAQ,EAAE,cAAc,MAAM,EAAE,SAAS,EAAW,CAAC,EAAE,CAAC,GAAuB,EAAK,MAAM,CAAC,IAAI,GAAsB,cAAc,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,OAAO,EAAE,SAAS,SAAS,QAAQ,EAAE,cAAc,MAAM,EAAE,SAAS,EAAgB,CAAC,EAAE,IAAkB,WAAwB,EAAM,MAAM,CAAC,UAAU,EAAY,MAAM,CAAC,GAAG,GAAc,OAAO,OAAO,UAAU,OAAO,UAAU,aAAa,QAAQ,CAAW,EAAE,SAAS,CAAC,IAA8B,EAAK,GAAa,CAAC,KAAK,GAAqB,WAAS,CAAC,EAAE,CAAC,IAAiB,IAAW,OAAO,GAA0B,EAAKG,EAAU,CAAC,SAAS,EAAY,CAAC,EAAe,EAAK,GAAa,CAAC,KAAK,GAAuB,WAAS,CAAC,GAAG,CAAC,IAAiB,IAAW,MAAM,EAAgB,SAAS,IAAI,GAAwB,EAAKA,EAAU,CAAC,SAAS,EAAU,CAAC,EAAe,EAAK,GAAa,CAAC,KAAK,GAAqB,WAAS,CAAC,GAAgB,EAAK,MAAM,CAAC,IAAI,GAAiB,MAAM,CAAC,QAAQ,IAAa,OAAO,OAAO,OAAO,cAAc,IAAa,QAAQ,SAAS,IAAA,GAAU,oBAAoB,IAAa,OAAO,UAAU,GAAY,mBAAmB,IAAA,GAAU,IAAI,EAAO,EAAE,SAAS,EAAW,CAAC,CAAC,CAAC,CAAC,EAAE,IAAkB,YAAyB,EAAK,MAAM,CAAC,MAAM,CAAC,GAAG,GAAa,OAAO,OAAO,SAAS,UAAU,EAAE,SAAS,GAA+B,EAAK,EAAc,CAAC,MAAM,gCAAgC,QAAQ,EAAY,CAAC,EAAe,EAAMA,EAAU,CAAC,SAAS,CAAc,EAAK,MAAM,CAAC,IAAI,EAAgB,MAAM,CAAC,SAAS,WAAW,MAAM,CAAU,CAAC,CAAC,EAAE,GAAa,CAAC,GAAU,GAAiB,GAAkB,GAAoB,EAA0B,EAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAc,EAAE,SAAS,EAAM,SAAS,CAAC,GAAQ,IAAI,CAAgB,CAAC,CAAC,CAAC,OAAO,OAAO,EAAE,GAAG,GAAgB,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAW,EAAE,GAAuB,EAAK,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,MAAM,EAAW,QAAQ,OAAO,WAAW,SAAS,eAAe,SAAS,WAAW,UAAU,MAAM,EAAU,SAAS,EAAE,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,IAAW,CAAC,GAAkB,CAAC,EAAiB,KAAK,IAAiB,EAAK,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,MAAM,EAAW,QAAQ,OAAO,WAAW,SAAS,eAAe,SAAS,UAAU,SAAS,QAAQ,GAAG,WAAW,UAAU,MAAM,EAAU,SAAS,EAAE,EAAE,SAAS,EAAa,CAAC,EAAE,CAAC,GAAU,GAAkB,IAA2B,EAAK,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,MAAM,EAAW,QAAQ,OAAO,WAAW,SAAS,eAAe,SAAS,UAAU,SAAS,QAAQ,GAAG,WAAW,UAAU,MAAM,EAAU,SAAS,EAAE,EAAE,SAAS,EAAiB,CAAC,EAAE,CAAC,GAAU,GAAU,GAAc,SAAS,GAAgB,EAAK,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,MAAM,EAAW,QAAQ,OAAO,WAAW,SAAS,eAAe,SAAS,UAAU,SAAS,QAAQ,GAAG,WAAW,UAAU,MAAM,EAAU,SAAS,EAAE,EAAE,SAAS,yEAAyE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,mCA1Ih/F,IAA8F,KAAoC,KAAqF,KAAuF,IAAuE,EAGpnB,GAAU,GAKV,GAAsB,CAAC,aAAa,mBAAmB,gBAAgB,EAGzE,GAAa,EAuB4J,EAAkB,CAAC,CAAC,YAAY,WAAW,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,mBAAmB,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,qBAAqB,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,iBAAiB,YAAY,WAAW,QAAQ,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,iBAAiB,YAAY,cAAc,QAAQ,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,MAAM,YAAY,WAAW,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,WAAW,YAAY,WAAW,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,OAAO,YAAY,WAAW,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,OAAO,YAAY,kBAAkB,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,OAAO,YAAY,cAAc,QAAQ,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,eAAe,YAAY,WAAW,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,gBAAgB,YAAY,SAAS,QAAQ,CAAC,CAAC,WAAW,YAAY,CAAC,CAAC,EAAE,CAAC,YAAY,UAAU,QAAQ,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,QAAQ,YAAY,WAAW,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAoR,EAAyB,KAwGqxD,GAAoB,EAAoB,CAAC,WAAW,CAAC,KAAK,EAAY,KAAK,MAAM,cAAc,QAAQ,CAAC,aAAa,QAAQ,EAAE,aAAa,CAAC,aAAa,iBAAiB,EAAE,aAAa,aAAa,wBAAwB,GAAK,0BAA0B,WAAW,YAAY,6NAA6N,EAAE,eAAe,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,EAAE,IAAI,IAAI,IAAI,GAAG,KAAK,KAAK,eAAe,GAAM,OAAO,GAAO,EAAM,aAAa,SAAS,YAAY,yGAAyG,EAAE,gBAAgB,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,eAAe,GAAM,OAAO,GAAO,EAAM,aAAa,SAAS,YAAY,yGAAyG,EAAE,YAAY,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,GAAG,YAAY,eAAe,OAAO,GAAO,EAAM,aAAa,SAAS,YAAY,8EAA8E,EAAE,eAAe,CAAC,KAAK,EAAY,kBAAkB,MAAM,kBAAkB,OAAO,GAAO,EAAM,aAAa,SAAS,YAAY,0aAA0a,EAAE,aAAa,CAAC,KAAK,EAAY,kBAAkB,MAAM,gBAAgB,OAAO,GAAO,EAAM,aAAa,SAAS,YAAY,mFAAmF,EAAE,WAAW,CAAC,KAAK,EAAY,kBAAkB,MAAM,cAAc,OAAO,GAAO,EAAM,aAAa,SAAS,YAAY,wGAAwG,EAAE,WAAW,CAAC,KAAK,EAAY,KAAK,MAAM,SAAS,QAAQ,CAAC,QAAQ,UAAU,UAAU,EAAE,aAAa,CAAC,mBAAmB,WAAW,WAAW,EAAE,aAAa,QAAQ,wBAAwB,GAAK,0BAA0B,WAAW,OAAO,GAAO,EAAM,aAAa,QAAQ,EAAE,YAAY,CAAC,KAAK,EAAY,KAAK,MAAM,eAAe,QAAQ,CAAC,OAAO,OAAO,EAAE,aAAa,CAAC,OAAO,OAAO,EAAE,aAAa,QAAQ,wBAAwB,GAAK,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,OAAO,EAAE,cAAc,CAAC,KAAK,EAAY,KAAK,MAAM,eAAe,QAAQ,CAAC,aAAa,UAAU,EAAE,aAAa,CAAC,mBAAmB,gBAAgB,EAAE,aAAa,aAAa,wBAAwB,GAAK,0BAA0B,WAAW,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,QAAQ,YAAY,wKAAwK,EAAE,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,KAAK,IAAI,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,SAAS,EAAM,gBAAgB,YAAY,EAAE,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,iBAAiB,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,SAAS,EAAM,gBAAgB,UAAU,EAAE,WAAW,CAAC,KAAK,EAAY,KAAK,MAAM,cAAc,QAAQ,CAAC,QAAQ,MAAM,EAAE,aAAa,CAAC,QAAQ,MAAM,EAAE,aAAa,QAAQ,wBAAwB,GAAK,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,SAAS,EAAE,YAAY,CAAC,KAAK,EAAY,OAAO,MAAM,UAAU,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,WAAW,EAAM,aAAa,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,KAAK,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,SAAS,EAAE,YAAY,CAAC,KAAK,EAAY,QAAQ,MAAM,eAAe,aAAa,OAAO,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,SAAS,EAAE,cAAc,CAAC,KAAK,EAAY,QAAQ,MAAM,iBAAiB,aAAa,GAAM,aAAa,OAAO,cAAc,OAAO,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,UAAU,YAAY,mJAAmJ,EAAE,WAAW,CAAC,KAAK,EAAY,QAAQ,MAAM,cAAc,aAAa,MAAM,OAAO,GAAO,EAAM,aAAa,UAAU,EAAM,aAAa,UAAU,EAAE,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,gBAAgB,OAAO,GAAO,EAAM,aAAa,SAAS,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,WAAW,YAAY,kKAAkK,EAAE,mBAAmB,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,YAAY,YAAY,kDAAkD,EAAE,eAAe,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,QAAQ,YAAY,2DAA2D,EAAE,eAAe,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,QAAQ,YAAY,yDAAyD,EAAE,gBAAgB,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,SAAS,YAAY,wCAAwC,EAAE,sBAAsB,CAAC,KAAK,EAAY,OAAO,MAAM,gBAAgB,aAAa,gBAAgB,YAAY,+CAA+C,EAAE,kBAAkB,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,WAAW,YAAY,kDAAkD,EAAE,iBAAiB,CAAC,KAAK,EAAY,OAAO,MAAM,UAAU,aAAa,UAAU,YAAY,8CAA8C,EAAE,sBAAsB,CAAC,KAAK,EAAY,OAAO,MAAM,eAAe,aAAa,eAAe,YAAY,8CAA8C,EAAE,oBAAoB,CAAC,KAAK,EAAY,OAAO,MAAM,cAAc,aAAa,cAAc,YAAY,sKAAsK,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,EAAY,OAAO,MAAM,eAAe,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAY,OAAO,MAAM,kBAAkB,aAAa,GAAG,YAAY,YAAY,YAAY,qOAAqO,EAAE,aAAa,CAAC,KAAK,EAAY,QAAQ,MAAM,iBAAiB,aAAa,GAAM,aAAa,KAAK,cAAc,MAAM,YAAY,4TAA4T,EAAE,YAAY,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,GAAG,YAAY,6BAA6B,YAAY,gHAAgH,EAAE,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,uBAAuB,aAAa,GAAG,gBAAgB,GAAK,YAAY,oEAAoE,YAAY,yHAAyH,EAAE,cAAc,CAAC,KAAK,EAAY,QAAQ,MAAM,iBAAiB,aAAa,GAAK,aAAa,KAAK,cAAc,MAAM,YAAY,yHAAyH,EAAE,YAAY,CAAC,KAAK,EAAY,OAAO,MAAM,eAAe,aAAa,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE,mBAAmB,CAAC,KAAK,EAAY,QAAQ,MAAM,mBAAmB,aAAa,GAAK,aAAa,KAAK,cAAc,MAAM,YAAY,iKAAiK,EAAE,SAAS,CAAC,KAAK,EAAY,KAAK,MAAM,YAAY,QAAQ,CAAC,QAAQ,QAAQ,EAAE,aAAa,CAAC,YAAY,YAAY,EAAE,aAAa,QAAQ,wBAAwB,GAAK,0BAA0B,UAAU,EAAE,WAAW,CAAC,KAAK,EAAY,QAAQ,MAAM,cAAc,aAAa,WAAW,OAAO,GAAO,EAAM,WAAW,QAAQ,EAAE,UAAU,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,IAAI,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,KAAK,KAAK,OAAO,GAAO,EAAM,WAAW,SAAS,YAAY,wDAAwD,EAAE,YAAY,CAAC,KAAK,EAAY,OAAO,MAAM,gBAAgB,aAAa,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,KAAK,OAAO,GAAO,EAAM,WAAW,QAAQ,EAAE,cAAc,CAAC,KAAK,EAAY,KAAK,MAAM,kBAAkB,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,KAAK,EAAE,aAAa,CAAC,UAAU,SAAS,WAAW,OAAO,WAAW,EAAE,aAAa,MAAM,OAAO,GAAO,EAAM,WAAW,QAAQ,EAAE,cAAc,CAAC,KAAK,EAAY,MAAM,MAAM,iBAAiB,aAAa,UAAU,OAAO,GAAO,EAAM,WAAW,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAY,MAAM,MAAM,WAAW,aAAa,UAAU,OAAO,GAAO,EAAM,WAAW,QAAQ,EAAE,mBAAmB,CAAC,KAAK,EAAY,MAAM,MAAM,oBAAoB,aAAa,UAAU,OAAO,GAAO,EAAM,WAAW,SAAS,YAAY,qEAAqE,EAAE,eAAe,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,GAAO,EAAM,WAAW,SAAS,YAAY,yBAAyB,EAAE,eAAe,CAAC,KAAK,EAAY,MAAM,MAAM,mBAAmB,aAAa,kBAAkB,OAAO,GAAO,EAAM,WAAW,UAAU,EAAM,iBAAiB,CAAC,EAAE,qBAAqB,CAAC,KAAK,EAAY,MAAM,MAAM,sBAAsB,OAAO,GAAO,EAAM,WAAW,UAAU,EAAM,iBAAiB,EAAE,YAAY,qFAAqF,EAAE,UAAU,CAAC,KAAK,EAAY,QAAQ,MAAM,aAAa,aAAa,GAAK,aAAa,KAAK,cAAc,MAAM,OAAO,GAAO,EAAM,WAAW,QAAQ,EAAE,YAAY,CAAC,KAAK,EAAY,QAAQ,MAAM,kBAAkB,aAAa,GAAK,aAAa,MAAM,cAAc,KAAK,YAAY,4IAA4I,EAAE,gBAAgB,CAAC,KAAK,EAAY,QAAQ,MAAM,qBAAqB,aAAa,GAAM,aAAa,KAAK,cAAc,MAAM,YAAY,sFAAsF,EAAE,eAAe,CAAC,KAAK,EAAY,OAAO,MAAM,mBAAmB,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK,OAAO,GAAO,CAAC,EAAM,eAAe,EAAE,gBAAgB,CAAC,KAAK,EAAY,OAAO,MAAM,oBAAoB,aAAa,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,KAAK,OAAO,GAAO,CAAC,EAAM,eAAe,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,EAAY,MAAM,MAAM,SAAS,aAAa,UAAU,YAAY,sCAAsC,EAAE,UAAU,CAAC,KAAK,EAAY,MAAM,MAAM,mBAAmB,aAAa,UAAU,YAAY,wDAAwD,EAAE,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,SAAS,CAAC,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,UAAU,aAAa,mBAAmB,EAAE,WAAW,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,gCAAgC,EAAE,WAAW,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,4GAA4G,gBAAgB,EAAI,EAAE,cAAc,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,kEAAkE,gBAAgB,EAAI,EAAE,kBAAkB,CAAC,KAAK,EAAY,OAAO,MAAM,iBAAiB,aAAa,yHAAyH,gBAAgB,EAAI,EAAE,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,iBAAiB,aAAa,wQAAwQ,gBAAgB,EAAI,CAAC,CAAC,CAAC,CAAC"}