{"id":3180,"date":"2022-06-16T15:14:22","date_gmt":"2022-06-16T15:14:22","guid":{"rendered":"https:\/\/spaineasy.com\/?page_id=3180"},"modified":"2026-09-08T17:16:10","modified_gmt":"2026-09-08T17:16:10","slug":"property-search","status":"publish","type":"page","link":"https:\/\/spaineasy.com\/fr\/property-search\/","title":{"rendered":"Property Search"},"content":{"rendered":"<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-padding-top-small:0.5em;--awb-padding-right-small:0px;--awb-padding-bottom-small:0px;--awb-padding-left-small:0px;--awb-margin-top:0px;--awb-margin-bottom:0px;--awb-margin-top-small:0px;--awb-margin-bottom-small:0px;--awb-min-height:1200px;--awb-flex-wrap:wrap;\" id=\"sablewarm\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1216.8px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:0%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:0%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"ole-form-outer\" style=\"min-height:100vh; width:100%; background:#fdfaf1; display:flex; align-items:flex-start; justify-content:center;\">\n  <div id=\"ole-form-root\"><\/div>\n<\/div>\n\n<script>\n(function(){\n\n  \"use strict\";\n\n  \/* =========================================================\n     1) HUBSPOT + OUTPUT CONFIG  (SpainEasy brand)\n     ========================================================= *\/\n  var HS = {\n    portalId: \"26258389\",\n    formGuid: \"14d59464-0052-402a-940c-17bd74709ff3\", \/\/ SpainEasy form \"Your property search (Optimized)\"\n    googleMapsKey: \"AIzaSyC-DNEU1BU8KyQPlRVDRGJEb1cwtZ3W6nk\", \/\/ restricted to spaineasy.com \u2014 enables Spanish city autocomplete (falls back to pills)\n    sendToHubSpot: true,\n    redirectUrl: \"https:\/\/spaineasy.com\/thank-you\/\", \/\/ success -> thank-you page (passes firstname & location params)\n    subscriptionTypeId: 152859509, \/\/ \"Marketing Information\" (account-level)\n    fields: {\n      timing:     \"o_en_tesvous_dans_votre_projet_\",\n      worries:    \"questce_qui_vous_inquite_le_plus_\",\n      budget:     \"budget_pour_l_achat\",\n      location:   \"ville_ou_region_recherchee\",\n      property:   \"quelles_caractristiques_recherchezvous_dans_le_bien_immobilier_\",\n      motivation: \"quelle_est_votre_principale_motivation_pour_acheter_en_espagne_\",\n      service:    \"seriezvous_intress_par_un_service_qui_gre_les_dmarches_sur_place_pour_vous_\",\n      cb_days:    \"jour_rappel_souhaite\",\n      cb_slot:    \"creneau_rappel\",\n      cb_date:    \"date_rappel_souhaitee\",\n      cb_clienttime: \"heure_chez_le_client\", \/\/ single-line text \u2014 local time at the client + their time zone\n      cb_rdv:     \"a_voulu_prendre_rendez_vous\",\n      firstname:  \"firstname\", lastname:\"lastname\", email:\"email\", phone:\"phone\"\n    }\n  };\n\n  var SHOW_HERO = true;\n  var RISKS_FORMAT = \"quiz\";\n  var CLOSE_URL = \"https:\/\/spaineasy.com\/\";\n  var RDV_URL = \"https:\/\/spaineasy.com\/meeting\/\"; \/\/ booking page, used if \"I'd rather book a call\"\n  var PRIVACY_URL = \"https:\/\/spaineasy.com\/privacy\/\";\n  var SCROLL_TOTOP = true;\n  var SCROLL_OFFSET = 24;\n\n  \/* =========================================================\n     2) STEPS  (American English)\n     ========================================================= *\/\n  var STEPS = [\n    { id:\"timing\", type:\"single\", required:true, ebIco:\"award\", heroIco:\"calendar-clock\",\n      heroCap:\"Every project has its own pace \u2014 we move at yours.\",\n      eyebrow:\"Expertise on the buyer's side\",\n      q:\"When would you like to start your search?\",\n      options:[\n        {label:\"As soon as possible\", ic:\"zap\"},\n        {label:\"Within the next 6 months\", ic:\"calendar-days\"},\n        {label:\"Within 12 months\", ic:\"sprout\"},\n        {label:\"It depends on something in progress (selling a home, saving up\u2026)\", ic:\"git-branch\"},\n        {label:\"Just exploring for now\", ic:\"lightbulb\"}\n      ],\n      react:{\n        \"As soon as possible\":{emoji:\"\\u2600\\uFE0F\",msg:\"Ol\u00e9! We can get moving right away.\"},\n        \"Within the next 6 months\":{emoji:\"\\uD83D\\uDDD3\\uFE0F\",msg:\"The ideal window to prepare calmly.\"},\n        \"Within 12 months\":{emoji:\"\\uD83C\\uDF31\",msg:\"Plenty of time to find exactly the right home.\"},\n        \"It depends on something in progress (selling a home, saving up\u2026)\":{emoji:\"\\uD83E\\uDD1D\",msg:\"We move at your pace \u2014 no pressure.\"},\n        \"Just exploring for now\":{emoji:\"\\uD83D\\uDCA1\",msg:\"Explore freely \u2014 we're here whenever you're ready.\"}\n      }},\n\n    { id:\"worries\", type:\"multi\", required:true, ebIco:\"shield-check\", heroIco:\"shield-check\",\n      heroCap:\"Your worries are exactly what we take off your plate.\",\n      eyebrow:\"A buyer's agent who works only for you\",\n      q:\"What worries you most?\", sub:\"Select all that apply\",\n      options:[\n        {label:\"The legal & paperwork (NIE, notary)\", ic:\"file-text\"},\n        {label:\"The language barrier (Spanish)\", ic:\"languages\"},\n        {label:\"Whether the property is sound\", ic:\"search-check\"},\n        {label:\"The distance (flying back & forth from the U.S.)\", ic:\"plane\"},\n        {label:\"The Spanish closing process (less verification than in the U.S.)\", ic:\"scale\"},\n        {label:\"Moving money, currency & taxes\", ic:\"banknote\"},\n        {label:\"Not enough time\", ic:\"clock\"}\n      ],\n      optMsg:{\n        \"The legal & paperwork (NIE, notary)\":{emoji:\"\\uD83D\\uDDC2\\uFE0F\",msg:\"The paperwork \u2014 NIE, notary, bank \u2014 we handle it end to end so you don't have to.\"},\n        \"The language barrier (Spanish)\":{emoji:\"\\uD83D\\uDDE3\\uFE0F\",msg:\"Language barrier? We translate and negotiate in Spanish for you, in plain English.\"},\n        \"Whether the property is sound\":{emoji:\"\\uD83D\\uDD0D\",msg:\"We inspect and vet everything on the ground before you ever commit.\"},\n        \"The distance (flying back & forth from the U.S.)\":{emoji:\"\\u2708\\uFE0F\",msg:\"We're your eyes and ears in Spain \u2014 far fewer transatlantic trips.\"},\n        \"The Spanish closing process (less verification than in the U.S.)\":{emoji:\"\\u2696\\uFE0F\",msg:\"We run our own legal due diligence on top of the notary \u2014 nothing slips through.\"},\n        \"Moving money, currency & taxes\":{emoji:\"\\uD83D\\uDCB1\",msg:\"We connect you with FX and tax pros who know U.S.\u2013Spain transfers cold.\"},\n        \"Not enough time\":{emoji:\"\\u23F3\",msg:\"We do the heavy lifting; you keep the final say.\"}\n      },\n      multiMsg:{\n        \"2\":{emoji:\"\\uD83D\\uDEE1\\uFE0F\",msg:\"Two real concerns \u2014 and they're exactly the ones we secure for you, end to end.\"},\n        \"3\":{emoji:\"\\uD83D\\uDEE1\\uFE0F\",msg:\"Three fair worries. Good news: covering all of them is our core job.\"},\n        \"4\":{emoji:\"\\uD83D\\uDCAA\",msg:\"Lots of questions is normal when buying abroad. That's precisely why SpainEasy exists.\"},\n        \"5\":{emoji:\"\\uD83D\\uDCAA\",msg:\"You're spotting nearly every pitfall \u2014 and you're right. We defuse them one by one.\"},\n        \"6\":{emoji:\"\\uD83E\\uDD1D\",msg:\"You see the whole picture. We take care of each of these for you.\"},\n        \"7\":{emoji:\"\\uD83E\\uDD1D\",msg:\"You see the whole picture. We take care of each of these for you.\"}\n      },\n      reactAny:{emoji:\"\\uD83D\\uDEE1\\uFE0F\",msg:\"Every one of these is our job to handle \u2014 we take care of it all.\"}},\n\n    { id:\"location\", type:\"location\", required:true, ebIco:\"map\", heroIco:\"map-pin\",\n      heroCap:\"All of Spain, coast to coast \u2014 we search everywhere for you.\",\n      eyebrow:\"We cover the whole of Spain\",\n      q:\"Where in Spain are you looking?\", placeholder:\"e.g. Marbella\",\n      cities:[\"Alicante\",\"Barcelona\",\"Benidorm\",\"C\u00e1diz\",\"Estepona\",\"Fuengirola\",\"Girona\",\"Granada\",\"Ibiza\",\"Madrid\",\"M\u00e1laga\",\"Marbella\",\"Mijas\",\"Nerja\",\"Palma de Mallorca\",\"Seville\",\"Sitges\",\"Tarragona\",\"Torrevieja\",\"Valencia\"],\n      regions:[\"Costa del Sol\",\"Costa Blanca\",\"Costa Brava\",\"Costa Dorada\",\"Andalusia\",\"Balearic Islands\",\"Canary Islands\",\"Catalonia\"]},\n\n    { id:\"budget\", type:\"budget\", required:true, ebIco:\"handshake\", heroIco:\"wallet\",\n      heroCap:\"We always negotiate in your interest \u2014 often far more than our fee.\",\n      eyebrow:\"We always negotiate in your interest\",\n      q:\"What's your budget?\", placeholder:\"e.g. $350,000\", min:100000,\n      pills:[150000,200000,250000,300000,400000,500000,750000,1000000,1500000,2000000,3000000],\n      reactRanges:[\n        {max:149999,  emoji:\"\\uD83E\\uDDED\",msg:\"Under $150K it's tighter \u2014 but we still find gems in the right regions.\"},\n        {max:299999,  emoji:\"\\uD83D\\uDD0D\",msg:\"Real opportunities to uncover in this range.\"},\n        {max:499999,  emoji:\"\\u2600\\uFE0F\",msg:\"A sweet spot for a place in the Spanish sun.\"},\n        {max:999999,  emoji:\"\\uD83C\\uDFE1\",msg:\"Enough to aim for something really special.\"},\n        {max:999999999,emoji:\"\\u2728\",msg:\"Ol\u00e9! Spain's high end is wide open to you.\"}\n      ]},\n\n    { id:\"property\", type:\"single\", required:true, ebIco:\"key-round\", heroIco:\"home\",\n      heroCap:\"We hunt for the home that fits you \u2014 not one we happen to have in stock.\",\n      eyebrow:\"Different from an agency selling its own listings\",\n      q:\"What type of property are you looking for?\",\n      options:[\n        {label:\"Apartment \/ condo\", ic:\"building-2\"},\n        {label:\"House\", ic:\"home\"},\n        {label:\"House with yard or pool\", ic:\"trees\"},\n        {label:\"Luxury property\", ic:\"gem\"},\n        {label:\"Other\", ic:\"search\"}\n      ],\n      react:{\n        \"Apartment \/ condo\":{emoji:\"\\uD83C\\uDF07\",msg:\"Easy, bright and low-maintenance \u2014 a Spanish classic.\"},\n        \"House\":{emoji:\"\\uD83C\\uDFE0\",msg:\"Space and sunshine all to yourself.\"},\n        \"House with yard or pool\":{emoji:\"\\uD83C\\uDF3F\",msg:\"Terrace, garden, pool \u2014 the dream.\"},\n        \"Luxury property\":{emoji:\"\\u2728\",msg:\"The high end \u2014 we know exactly where to look.\"},\n        \"Other\":{emoji:\"\\uD83D\\uDD0E\",msg:\"Tell us everything \u2014 we'll find the right fit.\"}\n      }},\n\n    { id:\"motivation\", type:\"single\", required:true, ebIco:\"compass\", heroIco:\"compass\",\n      heroCap:\"Home, getaway, retirement or return \u2014 your goal shapes our search.\",\n      eyebrow:\"Guidance across all of Spain\",\n      q:\"What's your main reason for buying in Spain?\",\n      options:[\n        {label:\"Relocating \/ primary home\", ic:\"sun\"},\n        {label:\"Vacation \/ second home\", ic:\"umbrella\"},\n        {label:\"Retirement\", ic:\"palmtree\"},\n        {label:\"Rental investment\", ic:\"trending-up\"},\n        {label:\"Other\", ic:\"handshake\"}\n      ],\n      react:{\n        \"Relocating \/ primary home\":{emoji:\"\\u2600\\uFE0F\",msg:\"A whole new life in the sun begins.\"},\n        \"Vacation \/ second home\":{emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Your own slice of the Mediterranean to escape to.\"},\n        \"Retirement\":{emoji:\"\\uD83C\\uDF34\",msg:\"Sunshine, slower mornings, lower cost of living \u2014 well earned.\"},\n        \"Rental investment\":{emoji:\"\\uD83D\\uDCC8\",msg:\"Spain's rental market is strong and growing.\"},\n        \"Other\":{emoji:\"\\uD83E\\uDD1D\",msg:\"Whatever your goal, we'll tailor the search to it.\"}\n      }},\n\n    { id:\"service\", type:\"single\", variant:\"yesno\", required:true, ebIco:\"headset\", heroIco:\"concierge-bell\",\n      heroCap:\"We can handle everything on the ground for you \u2014 viewings, paperwork, negotiation.\",\n      eyebrow:\"See what buyers say about us\",\n      q:\"Would you like us to handle the whole process on the ground for you?\",\n      options:[\n        {label:\"Yes \u2014 that would save me so much time\", tone:\"pos\", ic:\"thumbs-up\"},\n        {label:\"No, I'd rather handle it myself\", tone:\"neg\", ic:\"hand\"}\n      ],\n      react:{ \"Yes \u2014 that would save me so much time\":{emoji:\"\\uD83D\\uDE4C\",msg:\"Ol\u00e9! We'll take care of all of it for you.\"} }},\n\n    \/* Educational path: shown only if \"No\" to service (ids edu_*). *\/\n    { id:\"edu_couts\", type:\"teach\", skip:true, quizMix:true, ebIco:\"plane\", heroIco:\"plane\",\n      heroCap:\"Going it alone is possible \u2014 let's just look at what it really involves.\",\n      eyebrow:\"Point 1 \u2014 the hidden costs\",\n      q:\"Buying solo costs more than you'd think \u2014 before you even sign.\",\n      quiz:{ ask:\"To view homes and then close, how many round trips to Spain should a couple plan for?\",\n        options:[{label:\"Just one\"},{label:\"Two\"},{label:\"At least three\",correct:true}],\n        reveal:\"Usually 3 transatlantic round trips (2 viewing trips + the closing), several nights of hotels and days off work \u2014 plus a lawyer to check the documents and a translator, who's required at the notary. The bill adds up fast.\" },\n      body:\"Before the price of the home itself: ~3 transatlantic round trips (viewings + closing), hotel nights, days off work, a lawyer to review documents, and a translator who's required at the notary. Costs people often forget to add up.\" },\n\n    { id:\"edu_notaire\", type:\"teach\", skip:true, quizMix:true, ebIco:\"scale\", heroIco:\"landmark\",\n      heroCap:\"A Spanish notary isn't the same as a U.S. title company or escrow.\",\n      eyebrow:\"Point 2 \u2014 legal safety\",\n      q:\"The notary doesn't check what you might assume.\",\n      quiz:{ ask:\"True or false: a simple admin delay (NIE not issued in time) can cost you money.\",\n        options:[{label:\"False \u2014 you can always reschedule\"},{label:\"True, and it can be expensive\",correct:true}],\n        reveal:\"True. Without your NIE in time, the closing is postponed \u2014 and you can lose the reservation deposit, typically 10% of the price. And the notary checks neither outstanding debts\/liens nor whether the property is legally built.\" },\n      body:\"The notary authenticates the deed but checks neither debts\/liens nor the property's legal status. Worse: a NIE not issued in time can postpone the closing and cost you the reservation deposit \u2014 around 10% of the price.\" },\n\n    { id:\"edu_objectivite\", type:\"teach\", skip:true, ebIco:\"compass\", heroIco:\"user-check\",\n      heroCap:\"Solo, you carry the lawyer, the translator and all the research yourself.\",\n      eyebrow:\"Point 3 \u2014 who's working for you?\",\n      q:\"On your own, everything rests on you.\",\n      quiz:{ ask:\"Buying solo, who verifies the property and defends YOUR interests?\",\n        options:[{label:\"The agency showing the property\"},{label:\"The notary\"},{label:\"You, plus the experts you hire\",correct:true}],\n        reveal:\"You. An agency represents the seller's property \u2014 running checks isn't its job, and some will push you to sign fast. Solo, you must hire a lawyer, a translator and run every search yourself. SpainEasy stands on your side.\" },\n      body:\"Solo, you hire the lawyer, the translator and run every search \u2014 facing agencies that represent the seller's property (verification isn't their job, and some will push you to sign fast). SpainEasy stands on your side: we search, verify, translate and negotiate in your interest.\" },\n\n    { id:\"edu_valeur\", type:\"teach\", skip:true, ebIco:\"piggy-bank\", heroIco:\"piggy-bank\",\n      heroCap:\"\\\"It's probably expensive\\\"\u2026 here's exactly what it gets you.\",\n      eyebrow:\"Point 4 \u2014 the real math\",\n      q:\"\\\"Your service is probably expensive\u2026\\\"\",\n      body:\"Let's be concrete. Here's what our guidance saves you \u2014 and the traps it keeps you out of.\",\n      valueRecap:{\n        saves:[\n          {ic:\"plane\", t:\"Wasted transatlantic trips \u2014 we view homes for you\"},\n          {ic:\"clock\", t:\"Weeks of searching and paperwork\"},\n          {ic:\"languages\", t:\"Lawyer and translator coordinated for you, in English\"},\n          {ic:\"badge-percent\", t:\"We fight to get you the best price (examples on our site)\"}\n        ],\n        avoids:[\n          {ic:\"scale\", t:\"Hidden debts or an illegally-built property going unchecked\"},\n          {ic:\"alarm-clock\", t:\"A late NIE costing you the 10% deposit\"},\n          {ic:\"search-check\", t:\"A non-compliant home or a hidden defect\"},\n          {ic:\"trending-up\", t:\"Overpaying because the deal wasn't negotiated\"}\n        ]\n      },\n      closing:{ t:\"You buy faster, with peace of mind \u2014 and often for less.\", d:\"We handle the utility transfers (water & electricity); the rest (non-resident taxes, IBI, digital certificate, insurance\u2026) is optional, with the same English-speaking team.\" } },\n\n    { id:\"callback\", type:\"callback\", required:false, ebIco:\"phone-call\", heroIco:\"calendar-clock\",\n      heroCap:\"We'll call when it suits you \u2014 or book a time directly.\",\n      eyebrow:\"Reply within 24 hours\",\n      q:\"When's a good time for us to call you?\", sub:\"Pick a day and a window in your local time \u2014 it's optional\",\n      days:[\n        {label:\"Mon\",dow:1},{label:\"Tue\",dow:2},{label:\"Wed\",dow:3},\n        {label:\"Thu\",dow:4},{label:\"Fri\",dow:5},{label:\"Sat\",dow:6}\n      ] },\n\n    { id:\"contact\", type:\"contact\", required:true, ebIco:\"badge-check\", heroIco:\"phone-call\",\n      heroCap:\"Last step \u2014 we'll reach out shortly, no obligation.\",\n      eyebrow:\"Last step\",\n      q:\"Just your details, so we can get back to you quickly.\",\n      consent:\"By submitting this form, you agree to share your details so our team can reach out about your project.\"}\n  ];\n\n  var ORDER = [\"timing\",\"worries\",\"budget\",\"location\",\"property\",\"motivation\",\"service\",\"edu_couts\",\"edu_notaire\",\"edu_objectivite\",\"edu_valeur\",\"callback\",\"contact\"];\n  var RISK_IDS = [\"edu_couts\",\"edu_notaire\",\"edu_objectivite\",\"edu_valeur\"];\n  function isEdu(id){ return RISK_IDS.indexOf(id)>-1; }\n\n  \/* =========================================================\n     2b) CALLBACK \u2014 timezone-aware (US buyer)\n     ========================================================= *\/\n  var US_ZONES = [\n    {l:\"ET\", tz:\"America\/New_York\"},\n    {l:\"CT\", tz:\"America\/Chicago\"},\n    {l:\"MT\", tz:\"America\/Denver\"},\n    {l:\"PT\", tz:\"America\/Los_Angeles\"}\n  ];\n  \/\/ \"Other country\" picker \u2014 short token + IANA zone\n  var WORLD_ZONES = [\n    {l:\"US \u2014 Alaska (AKST)\", s:\"AKST\", tz:\"America\/Anchorage\"},\n    {l:\"US \u2014 Hawaii (HST)\", s:\"HST\", tz:\"Pacific\/Honolulu\"},\n    {l:\"Canada \u2014 Toronto (ET)\", s:\"ET\", tz:\"America\/Toronto\"},\n    {l:\"Canada \u2014 Vancouver (PT)\", s:\"PT\", tz:\"America\/Vancouver\"},\n    {l:\"Mexico \u2014 Mexico City\", s:\"CST\", tz:\"America\/Mexico_City\"},\n    {l:\"Brazil \u2014 S\u00e3o Paulo\", s:\"BRT\", tz:\"America\/Sao_Paulo\"},\n    {l:\"Argentina \u2014 Buenos Aires\", s:\"ART\", tz:\"America\/Argentina\/Buenos_Aires\"},\n    {l:\"UK \/ Ireland \u2014 London\", s:\"UK time\", tz:\"Europe\/London\"},\n    {l:\"Portugal \u2014 Lisbon\", s:\"WET\", tz:\"Europe\/Lisbon\"},\n    {l:\"France \/ Spain \u2014 Paris\", s:\"CET\", tz:\"Europe\/Paris\"},\n    {l:\"Central Europe \u2014 Berlin\", s:\"CET\", tz:\"Europe\/Berlin\"},\n    {l:\"Greece \/ E. Europe \u2014 Athens\", s:\"EET\", tz:\"Europe\/Athens\"},\n    {l:\"Turkey \u2014 Istanbul\", s:\"TRT\", tz:\"Europe\/Istanbul\"},\n    {l:\"Morocco \u2014 Casablanca\", s:\"local time\", tz:\"Africa\/Casablanca\"},\n    {l:\"South Africa \u2014 Johannesburg\", s:\"SAST\", tz:\"Africa\/Johannesburg\"},\n    {l:\"UAE \u2014 Dubai\", s:\"GST\", tz:\"Asia\/Dubai\"},\n    {l:\"Israel \u2014 Tel Aviv\", s:\"local time\", tz:\"Asia\/Jerusalem\"},\n    {l:\"India \u2014 Mumbai\", s:\"IST\", tz:\"Asia\/Kolkata\"},\n    {l:\"Singapore\", s:\"SGT\", tz:\"Asia\/Singapore\"},\n    {l:\"Hong Kong\", s:\"HKT\", tz:\"Asia\/Hong_Kong\"},\n    {l:\"Japan \u2014 Tokyo\", s:\"JST\", tz:\"Asia\/Tokyo\"},\n    {l:\"Australia \u2014 Perth\", s:\"AWST\", tz:\"Australia\/Perth\"},\n    {l:\"Australia \u2014 Sydney\", s:\"AEST\", tz:\"Australia\/Sydney\"},\n    {l:\"New Zealand \u2014 Auckland\", s:\"NZST\", tz:\"Pacific\/Auckland\"}\n  ];\n  \/\/ SpainEasy office: calls only happen during Spanish business hours (Europe\/Madrid, CET\/CEST).\n  var TEAM = { tz:\"Europe\/Madrid\", week:{open:9,close:19}, sat:{open:10,close:14}, localFloor:7, localCeil:21 };\n  function cbDetectIana(){ var tz=\"\"; try{ tz=Intl.DateTimeFormat().resolvedOptions().timeZone||\"\"; }catch(e){} return tz||\"America\/New_York\"; }\n  function cbUsLabelFor(tz){ for(var i=0;i<US_ZONES.length;i++) if(US_ZONES[i].tz===tz) return US_ZONES[i].l; return null; }\n  function cbWorldFor(tz){ for(var j=0;j<WORLD_ZONES.length;j++) if(WORLD_ZONES[j].tz===tz) return WORLD_ZONES[j]; return null; }\n  function cbShortFromTz(tz){ return String(tz||\"\").split(\"\/\").pop().replace(\/_\/g,\" \"); }\n  function cbInitZone(){ if(state.answers.cb_tz) return; var tz=cbDetectIana(); state.answers.cb_tz=tz; var w=cbWorldFor(tz); state.answers.cb_zone = cbUsLabelFor(tz) || (w?w.s:null) || cbShortFromTz(tz); }\n  function cbIsUsZone(){ for(var i=0;i<US_ZONES.length;i++) if(US_ZONES[i].tz===state.answers.cb_tz) return true; return false; }\n  function cbZoneIana(){ if(state.answers.cb_tz) return state.answers.cb_tz; var l=state.answers.cb_zone; for(var i=0;i<US_ZONES.length;i++) if(US_ZONES[i].l===l) return US_ZONES[i].tz; return cbDetectIana(); }\n  function cbZoneShort(){ return state.answers.cb_zone || cbShortFromTz(cbZoneIana()); }\n  var CB_DOWS = {\"Mon\":1,\"Tue\":2,\"Wed\":3,\"Thu\":4,\"Fri\":5,\"Sat\":6};\n  var CB_DAY_FULL = {\"Mon\":\"Monday\",\"Tue\":\"Tuesday\",\"Wed\":\"Wednesday\",\"Thu\":\"Thursday\",\"Fri\":\"Friday\",\"Sat\":\"Saturday\"};\n  var CB_MONTHS = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];\n  function fmt12(h){ h=((h%24)+24)%24; if(h===0) return \"12 AM\"; if(h===12) return \"12 PM\"; return (h<12)? (h+\" AM\") : ((h-12)+\" PM\"); }\n  function cbWantsRdv(){ return state.answers.cb_rdv === true; }\n  function cbIsSaturday(){ return Array.isArray(state.answers.cb_days) && state.answers.cb_days.indexOf(\"Sat\")>-1; }\n  function cbNextDateForDow(dow){ var now=new Date(), d=new Date(now.getFullYear(),now.getMonth(),now.getDate()); var diff=(dow-d.getDay()+7)%7; d.setDate(d.getDate()+diff); return d; }\n  function cbNearestDateObj(){\n    var a=state.answers;\n    if(a.cb_days_indif || !Array.isArray(a.cb_days) || !a.cb_days.length) return null;\n    var times=[];\n    a.cb_days.forEach(function(lbl){ if(CB_DOWS[lbl]!=null) times.push(cbNextDateForDow(CB_DOWS[lbl]).getTime()); });\n    if(!times.length) return null;\n    return new Date(Math.min.apply(null,times));\n  }\n  function cbDateLong(d){ return d ? (CB_DAY_FULL[Object.keys(CB_DOWS).find(function(k){return CB_DOWS[k]===d.getDay();})] || \"\")+\" \"+CB_MONTHS[d.getMonth()]+\" \"+d.getDate() : \"\"; }\n  function cbTzOffsetMin(date, tz){\n    try{\n      var dtf = new Intl.DateTimeFormat(\"en-US\",{timeZone:tz,hour12:false,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\"});\n      var pr = {}; dtf.formatToParts(date).forEach(function(x){ pr[x.type]=x.value; });\n      var asUTC = Date.UTC(pr.year, pr.month-1, pr.day, pr.hour, pr.minute, pr.second);\n      return Math.round((asUTC - date.getTime())\/60000);\n    }catch(e){ return null; }\n  }\n  function cbInstantForLocalHour(dateObj, H, tz){ var guess=Date.UTC(dateObj.getFullYear(),dateObj.getMonth(),dateObj.getDate(),H,0,0); var off=cbTzOffsetMin(new Date(guess),tz); return (off==null)?guess:(guess-off*60000); }\n  function cbTzPartsAt(instant, tz){ var off=cbTzOffsetMin(new Date(instant),tz); var d=new Date(instant+((off||0)*60000)); return {dow:d.getUTCDay(), hour:d.getUTCHours()}; }\n  function cbSlotStartMs(dateObj, hour24){ if(!dateObj || hour24==null) return null; return cbInstantForLocalHour(dateObj, hour24, cbZoneIana()); }\n  function cbBizForMadDow(dow){ if(dow===6) return TEAM.sat; if(dow>=1&&dow<=5) return TEAM.week; return null; }\n  function cbWindowDate(){\n    if(cbIsSaturday()) return cbNextDateForDow(6);\n    var d=cbNearestDateObj(); if(d) return d;\n    var now=new Date(), x=new Date(now.getFullYear(),now.getMonth(),now.getDate());\n    for(var i=0;i<8;i++){ var t=new Date(x); t.setDate(x.getDate()+i); var dw=t.getDay(); if(dw>=1&&dw<=5) return t; }\n    return x;\n  }\n  \/\/ Buyer-local start hours that map to inside SpainEasy's Madrid office hours\n  function cbAllowedHours(){\n    var d=cbWindowDate(); if(!d) return []; var tz=cbZoneIana(), res=[];\n    for(var H=TEAM.localFloor; H<=TEAM.localCeil; H++){\n      var inst=cbInstantForLocalHour(d,H,tz), mp=cbTzPartsAt(inst, TEAM.tz);\n      var biz=cbBizForMadDow(mp.dow); if(!biz) continue;\n      if(mp.hour>=biz.open && mp.hour<=biz.close-1) res.push(H);\n    }\n    return res;\n  }\n  function cbCurrentSlots(){ var a=cbAllowedHours(), out=[]; for(var i=0;i<a.length;i+=2){ var H=a[i]; out.push({h:H, l:fmt12(H)+\"\\u2013\"+fmt12(H+2)}); } return out; }\n  function cbHours(){ return cbAllowedHours(); }\n  function cbHasSlots(){ return cbCurrentSlots().length>0; }\n  function cbSlotLabel(h){ var s=cbCurrentSlots(); for(var i=0;i<s.length;i++) if(s[i].h===h) return s[i].l; return fmt12(h)+\"\\u2013\"+fmt12(h+2); }\n  function cbSlotsHTML(){\n    var slots=cbCurrentSlots(), html=\"\";\n    slots.forEach(function(s){\n      html += '<button type=\"button\" class=\"ole-pill'+(!state.answers.cb_precise && !state.answers.cb_any && state.answers.cb_slot===s.h?\" sel\":\"\")+'\" data-cbslot=\"'+s.h+'\">'+esc(s.l)+'<\/button>';\n    });\n    if(cbHours().length) html += '<button type=\"button\" class=\"ole-pill ole-pill-precise'+(state.answers.cb_precise?\" sel\":\"\")+'\" data-cbprecise=\"1\"><span class=\"ole-pill-ico ole-ico\"><i data-lucide=\"alarm-clock\"><\/i><\/span>Specific time<\/button>';\n    html += '<button type=\"button\" class=\"ole-pill'+(state.answers.cb_any?\" sel\":\"\")+'\" data-cbany=\"1\">Any time that works<\/button>';\n    return html;\n  }\n  function cbHoursHTML(){\n    return cbHours().map(function(hh){\n      return '<button type=\"button\" class=\"ole-pill'+(state.answers.cb_hour===hh?\" sel\":\"\")+'\" data-cbhour=\"'+hh+'\">'+esc(fmt12(hh))+'<\/button>';\n    }).join(\"\");\n  }\n  function cbPreciseMsg(){\n    var h=state.answers.cb_hour; if(h==null) return \"\";\n    return \"We'll do our best to call you around \"+fmt12(h)+\" \"+cbZoneShort()+\". We're based in Spain, so we can't promise the exact minute \u2014 to lock a precise time, book a call.\";\n  }\n  function cbReaction(){\n    var a=state.answers, z=cbZoneShort();\n    if(cbWantsRdv()) return {emoji:\"\\uD83D\\uDCC5\",msg:\"Perfect \u2014 you'll pick your meeting time right after this form.\"};\n    if(a.cb_any) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Great \u2014 we'll find the best moment to reach you during our Spanish office hours.\"};\n    var dObj=cbNearestDateObj(); var dTxt=dObj?cbDateLong(dObj):\"\";\n    if(a.cb_precise && a.cb_hour!=null) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Noted \u2014 we'll do our best to call \"+(dTxt?dTxt+\" \":\"\")+\"around \"+fmt12(a.cb_hour)+\" \"+z+\".\"};\n    var sTxt = a.cb_slot!=null ? cbSlotLabel(a.cb_slot) : \"\";\n    if(dTxt && sTxt) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Great \u2014 we'll aim to call you \"+dTxt+\", \"+sTxt+\" \"+z+\".\"};\n    if(dTxt) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Great \u2014 we'll aim to call you \"+dTxt+\".\"};\n    if(sTxt) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Great \u2014 we'll aim to call you \"+sTxt+\" \"+z+\".\"};\n    if(a.cb_days_indif) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Got it \u2014 we'll call as soon as we can.\"};\n    return null;\n  }\n  function cbRecapText(){\n    var a=state.answers, z=cbZoneShort();\n    if(cbWantsRdv()) return \"You'll book a call right after\";\n    if(a.cb_any){ var dA=cbNearestDateObj(); var dAt=dA?cbDateLong(dA):\"\"; return dAt ? (\"Call \"+dAt+\" \u2014 any time\") : \"Call any time that works\"; }\n    var dObj=cbNearestDateObj(); var dTxt=dObj?cbDateLong(dObj):\"\";\n    if(a.cb_precise && a.cb_hour!=null) return \"Call \"+(dTxt?dTxt+\", \":\"\")+\"around \"+fmt12(a.cb_hour)+\" \"+z;\n    var sTxt = a.cb_slot!=null ? cbSlotLabel(a.cb_slot) : \"\";\n    if(dTxt && sTxt) return \"Call \"+dTxt+\", \"+sTxt+\" \"+z;\n    if(dTxt) return \"Call \"+dTxt;\n    if(sTxt) return \"Call \"+sTxt+\" \"+z;\n    if(a.cb_days_indif) return \"Call as soon as possible\";\n    return \"\";\n  }\n  \/\/ The requested call time expressed in the CLIENT's own local time + zone (for HubSpot \"Heure chez le client\").\n  function cbClientTimeStr(){\n    var a=state.answers, z=cbZoneShort();\n    if(cbWantsRdv()) return \"Will pick a slot on the booking page\";\n    var dObj=cbNearestDateObj(); var dTxt=dObj?cbDateLong(dObj):(a.cb_days_indif?\"Any day\":\"\");\n    var t=\"\";\n    if(a.cb_any) t=\"any time\";\n    else if(a.cb_precise && a.cb_hour!=null) t=\"around \"+fmt12(a.cb_hour);\n    else if(a.cb_slot!=null) t=cbSlotLabel(a.cb_slot);\n    if(!dTxt && !t) return \"\";\n    var s=(dTxt||\"\")+((dTxt&&t)?\", \":\"\")+(t||\"\");\n    return s+\" \"+z+\" (client local time)\";\n  }\n\n  \/* =========================================================\n     3) LOCATION FLAVOR\n     ========================================================= *\/\n  var CITY_REF = {\n    \"Alicante\":\"its Santa B\u00e1rbara castle and beaches\",\n    \"Barcelona\":\"Gaud\u00ed, the Sagrada Fam\u00edlia and Las Ramblas\",\n    \"Benidorm\":\"its skyline and lively beaches\",\n    \"C\u00e1diz\":\"one of the oldest cities in Europe\",\n    \"Estepona\":\"its flower-filled old town\",\n    \"Fuengirola\":\"its easygoing seafront\",\n    \"Girona\":\"its medieval lanes\",\n    \"Granada\":\"the Alhambra and Sierra Nevada\",\n    \"Ibiza\":\"turquoise coves and island life\",\n    \"Madrid\":\"the Prado, Retiro park and city energy\",\n    \"M\u00e1laga\":\"Picasso's hometown\",\n    \"Marbella\":\"the glamour of Puerto Ban\u00fas\",\n    \"Mijas\":\"its whitewashed hillside charm\",\n    \"Nerja\":\"the famous Balc\u00f3n de Europa\",\n    \"Palma de Mallorca\":\"its cathedral and Balearic style\",\n    \"Seville\":\"flamenco, the Giralda and leafy patios\",\n    \"Sitges\":\"its seaside elegance near Barcelona\",\n    \"Tarragona\":\"its Roman amphitheater by the sea\",\n    \"Torrevieja\":\"its pink salt lagoons and sun\",\n    \"Valencia\":\"paella and the City of Arts and Sciences\",\n    \"Costa del Sol\":\"300+ days of sun a year\",\n    \"Costa Blanca\":\"postcard beaches year-round\",\n    \"Costa Brava\":\"wild coves and character\",\n    \"Costa Dorada\":\"golden sand and Roman heritage\",\n    \"Andalusia\":\"flamenco, tapas and the good life\",\n    \"Balearic Islands\":\"light and turquoise water\",\n    \"Canary Islands\":\"eternal spring\",\n    \"Catalonia\":\"sea, mountains and Catalan flair\"\n  };\n  var CITY_NOTE = {\n    \"Alicante\":\"jewel of the Costa Blanca\",\"Barcelona\":\"the city of Gaud\u00ed\",\"Benidorm\":\"Spain's little Manhattan\",\n    \"C\u00e1diz\":\"the oldest city in Europe\",\"Estepona\":\"the garden of the Costa del Sol\",\"Fuengirola\":\"easy seaside living\",\n    \"Girona\":\"a Catalan medieval gem\",\"Granada\":\"the Alhambra city\",\"Ibiza\":\"turquoise island life\",\"Madrid\":\"the heart of Spain\",\n    \"M\u00e1laga\":\"Picasso's birthplace\",\"Marbella\":\"the glamour of the Costa del Sol\",\"Mijas\":\"a whitewashed hill town\",\n    \"Nerja\":\"the Balcony of Europe\",\"Palma de Mallorca\":\"jewel of the Balearics\",\"Seville\":\"the capital of flamenco\",\n    \"Sitges\":\"seaside elegance\",\"Tarragona\":\"Roman heritage by the sea\",\"Torrevieja\":\"pink lagoons and salt flats\",\n    \"Valencia\":\"home of paella\",\"Costa del Sol\":\"300+ days of sun a year\",\"Costa Blanca\":\"sun year-round\",\n    \"Costa Brava\":\"wild coves\",\"Costa Dorada\":\"golden sand & Roman ruins\",\"Andalusia\":\"flamenco & good living\",\n    \"Balearic Islands\":\"turquoise water\",\"Canary Islands\":\"eternal spring\",\"Catalonia\":\"sea and Catalan character\"\n  };\n  var REGION_NOTE = {\n    \"Andaluc\u00eda\":\"Andalusian sun and flamenco\",\"Comunidad Valenciana\":\"sun of the Valencia coast\",\"Comunitat Valenciana\":\"sun of the Valencia coast\",\n    \"Catalu\u00f1a\":\"sea and Catalan character\",\"Catalunya\":\"sea and Catalan character\",\"Islas Baleares\":\"turquoise Balearic water\",\"Illes Balears\":\"turquoise Balearic water\",\n    \"Canarias\":\"eternal Canary spring\",\"Islas Canarias\":\"eternal Canary spring\",\"Regi\u00f3n de Murcia\":\"the gentle Costa C\u00e1lida\",\"Comunidad de Madrid\":\"the heart of Spain\",\n    \"Galicia\":\"Galicia's coast and nature\",\"Pa\u00eds Vasco\":\"Basque sea and cuisine\",\"Andalusia\":\"Andalusian sun and flamenco\"\n  };\n  var LOC_PILL = {\n    \"Alicante\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Alicante: turquoise sea and a lively old town.\"},\n    \"Barcelona\":{emoji:\"\\u2728\",msg:\"Barcelona: the big city that never sleeps.\"},\n    \"Benidorm\":{emoji:\"\\uD83C\\uDFD9\\uFE0F\",msg:\"Benidorm: skyline, beaches and year-round buzz.\"},\n    \"C\u00e1diz\":{emoji:\"\\uD83C\\uDF0A\",msg:\"C\u00e1diz: one of Europe's oldest cities, facing the Atlantic.\"},\n    \"Estepona\":{emoji:\"\\uD83C\\uDF3A\",msg:\"Estepona: the flower-filled gem of the Costa del Sol.\"},\n    \"Fuengirola\":{emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Fuengirola: easygoing, sunny, feet in the water.\"},\n    \"Girona\":{emoji:\"\\uD83C\\uDFF0\",msg:\"Girona: medieval lanes and Catalan calm.\"},\n    \"Granada\":{emoji:\"\\uD83C\\uDFD4\\uFE0F\",msg:\"Granada: the Alhambra with the Sierra Nevada behind it.\"},\n    \"Ibiza\":{emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Ibiza: turquoise coves and island life.\"},\n    \"Madrid\":{emoji:\"\\u2728\",msg:\"Madrid: the vibrant heart of Spain.\"},\n    \"M\u00e1laga\":{emoji:\"\\u2600\\uFE0F\",msg:\"M\u00e1laga: Picasso's birthplace, sunny and alive.\"},\n    \"Marbella\":{emoji:\"\\uD83C\\uDF34\",msg:\"Marbella: all the glamour of the Costa del Sol.\"},\n    \"Mijas\":{emoji:\"\\uD83E\\uDD0D\",msg:\"Mijas: whitewashed charm above the coast.\"},\n    \"Nerja\":{emoji:\"\\uD83C\\uDF05\",msg:\"Nerja: the Balcony of Europe over the Med.\"},\n    \"Palma de Mallorca\":{emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Palma de Mallorca: island elegance in the Balearics.\"},\n    \"Seville\":{emoji:\"\\uD83D\\uDC83\",msg:\"Seville: flamenco, patios and Andalusian living.\"},\n    \"Sitges\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Sitges: seaside elegance just south of Barcelona.\"},\n    \"Tarragona\":{emoji:\"\\uD83C\\uDFDB\\uFE0F\",msg:\"Tarragona: Roman heritage facing the Mediterranean.\"},\n    \"Torrevieja\":{emoji:\"\\uD83C\\uDF38\",msg:\"Torrevieja: pink lagoons and near-constant sun.\"},\n    \"Valencia\":{emoji:\"\\uD83E\\uDD58\",msg:\"Valencia: paella, beaches and modern flair.\"},\n    \"Costa del Sol\":{emoji:\"\\u2600\\uFE0F\",msg:\"The Costa del Sol: 300+ days of sun a year.\"},\n    \"Costa Blanca\":{emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"The Costa Blanca: postcard beaches year-round.\"},\n    \"Costa Brava\":{emoji:\"\\uD83C\\uDF0A\",msg:\"The Costa Brava: wild coves and character.\"},\n    \"Costa Dorada\":{emoji:\"\\uD83C\\uDFDB\\uFE0F\",msg:\"The Costa Dorada: golden sand and Roman heritage.\"},\n    \"Andalusia\":{emoji:\"\\uD83D\\uDC83\",msg:\"Andalusia: sun, sea and the art of living.\"},\n    \"Balearic Islands\":{emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"The Balearics: a slice of Mediterranean paradise.\"},\n    \"Canary Islands\":{emoji:\"\\uD83C\\uDF34\",msg:\"The Canaries: eternal spring, all year long.\"},\n    \"Catalonia\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Catalonia: wild coves, culture and great taste.\"}\n  };\n  var REACTIONS = [\n    {match:[\"malaga\",\"m\u00e1laga\",\"marbella\",\"estepona\",\"fuengirola\",\"nerja\",\"mijas\",\"costa del sol\"],emoji:\"\\u2600\\uFE0F\",msg:\"The Costa del Sol: 300+ days of sun a year.\"},\n    {match:[\"seville\",\"sevilla\",\"cadiz\",\"c\u00e1diz\",\"granada\",\"almeria\",\"almer\u00eda\",\"andaluc\"],emoji:\"\\uD83D\\uDC83\",msg:\"Andalusia: sun, sea and the art of living.\"},\n    {match:[\"alicante\",\"benidorm\",\"calpe\",\"denia\",\"javea\",\"j\u00e1vea\",\"torrevieja\",\"costa blanca\"],emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"The Costa Blanca: postcard beaches year-round.\"},\n    {match:[\"valencia\",\"valence\"],emoji:\"\\uD83E\\uDD58\",msg:\"Valencia: paella, beaches and easy living.\"},\n    {match:[\"murcia\",\"costa calida\",\"costa c\u00e1lida\"],emoji:\"\\uD83C\\uDF05\",msg:\"The Costa C\u00e1lida: the gentlest sea in Spain.\"},\n    {match:[\"barcelona\",\"girona\",\"sitges\",\"lloret\",\"roses\",\"tarragona\",\"costa brava\",\"costa dorada\",\"catal\"],emoji:\"\\uD83C\\uDF0A\",msg:\"Catalonia: wild coves, culture and great taste.\"},\n    {match:[\"palma\",\"mallorca\",\"baleares\",\"balearic\",\"ibiza\",\"menorca\"],emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"The Balearics: a slice of Mediterranean paradise.\"},\n    {match:[\"canar\",\"tenerife\",\"las palmas\",\"fuerteventura\",\"lanzarote\"],emoji:\"\\uD83C\\uDF34\",msg:\"The Canaries: eternal spring, all year long.\"},\n    {match:[\"madrid\"],emoji:\"\\u2728\",msg:\"Madrid: the vibrant heart of Spain.\"}\n  ];\n\n  \/* =========================================================\n     4) UTILITIES\n     ========================================================= *\/\n  var root = document.getElementById(\"ole-form-root\");\n  if(!root) return;\n  var state = { i:0, answers:{}, history:[], locked:false, busy:false, reaction:null };\n  var startTime = Date.now();\n  var gMapsReady = false;\n  var nf = new Intl.NumberFormat(\"en-US\");\n  function fmt(n){ return \"$\" + nf.format(n); }\n  function getCookie(k){ var m=document.cookie.match(\"(^|;)\\\\s*\"+k+\"\\\\s*=\\\\s*([^;]+)\"); return m?m.pop():\"\"; }\n  function esc(s){ var a=String.fromCharCode(38); return String(s).replace(\/&\/g,a+\"#38;\").replace(\/<\/g,a+\"#60;\").replace(\/>\/g,a+\"#62;\").replace(\/\"\/g,a+\"#34;\"); }\n  function refreshIcons(){ if(window.lucide && lucide.createIcons){ try{ lucide.createIcons(); }catch(e){} } }\n  function stepIndexById(id){ for(var i=0;i<STEPS.length;i++) if(STEPS[i].id===id) return i; return -1; }\n  function isRisksPath(){ return \/^no\/i.test(state.answers.service||\"\"); }\n  function hasAnswers(){ for(var k in state.answers){ if(state.answers.hasOwnProperty(k)){ var v=state.answers[k]; if(Array.isArray(v)?v.length:(v!==null&&v!==undefined&&v!==\"\")) return true; } } return false; }\n\n  var LS_KEY=\"spaineasy_form_v1_\"+((location.pathname.match(\/^\\\/([a-z]{2})\\\/\/)||[])[1]||\"en\"), LS_TTL=1000*60*60*24*7;\n  var _saveT=null;\n  function saveState(){ try{ localStorage.setItem(LS_KEY, JSON.stringify({ i:state.i, answers:state.answers, history:state.history, t:Date.now() })); }catch(e){} }\n  function saveSoon(){ clearTimeout(_saveT); _saveT=setTimeout(saveState,250); }\n  function loadState(){\n    try{\n      var raw=localStorage.getItem(LS_KEY); if(!raw) return false;\n      var s=JSON.parse(raw);\n      if(!s || !s.t || (Date.now()-s.t)>LS_TTL){ localStorage.removeItem(LS_KEY); return false; }\n      if(typeof s.i===\"number\" && s.answers && typeof s.answers===\"object\"){\n        state.i=Math.min(Math.max(s.i,0), STEPS.length-1);\n        state.answers=s.answers; state.history=Array.isArray(s.history)?s.history:[];\n        return true;\n      }\n    }catch(e){}\n    return false;\n  }\n  function clearState(){ try{ localStorage.removeItem(LS_KEY); }catch(e){} }\n\n  var MAIL_DOMAINS=[\"gmail.com\",\"yahoo.com\",\"hotmail.com\",\"outlook.com\",\"icloud.com\",\"aol.com\",\"comcast.net\",\"att.net\",\"verizon.net\",\"sbcglobal.net\",\"me.com\",\"live.com\",\"msn.com\",\"ymail.com\",\"protonmail.com\"];\n  var MAIL_TLDS=[\"com\",\"net\",\"org\",\"us\",\"edu\",\"co\",\"io\",\"gov\"];\n  function lev(a,b){ var m=a.length,n=b.length; if(!m) return n; if(!n) return m; var d=[],i,j; for(i=0;i<=m;i++) d[i]=[i]; for(j=0;j<=n;j++) d[0][j]=j; for(i=1;i<=m;i++) for(j=1;j<=n;j++){ var c=a.charAt(i-1)===b.charAt(j-1)?0:1; d[i][j]=Math.min(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+c); } return d[m][n]; }\n  function suggestEmail(email){\n    if(!email) return null;\n    var at=email.lastIndexOf(\"@\"); if(at<1) return null;\n    var local=email.slice(0,at), domain=email.slice(at+1).toLowerCase();\n    if(!domain || domain.indexOf(\".\")<1) return null;\n    if(MAIL_DOMAINS.indexOf(domain)>-1) return null;\n    var best=null,bd=99,i;\n    for(i=0;i<MAIL_DOMAINS.length;i++){ var dd=lev(domain,MAIL_DOMAINS[i]); if(dd<bd){ bd=dd; best=MAIL_DOMAINS[i]; } }\n    if(best && bd>0 && bd<=2) return local+\"@\"+best;\n    var dot=domain.lastIndexOf(\".\"), sld=domain.slice(0,dot), tld=domain.slice(dot+1);\n    if(MAIL_TLDS.indexOf(tld)===-1){ var bt=null,bt2=99; for(i=0;i<MAIL_TLDS.length;i++){ var td=lev(tld,MAIL_TLDS[i]); if(td<bt2){ bt2=td; bt=MAIL_TLDS[i]; } } if(bt && bt2>0 && bt2<=1) return local+\"@\"+sld+\".\"+bt; }\n    return null;\n  }\n\n  function recapHTML(){\n    var a=state.answers, rows=[];\n    function row(ic,val){ if(val) rows.push('<div class=\"ole-recap-item\"><span class=\"ole-recap-ico ole-ico\"><i data-lucide=\"'+ic+'\"><\/i><\/span><span class=\"ole-recap-val\">'+esc(val)+'<\/span><\/div>'); }\n    row(\"home\", a.property);\n    var loc = a.location ? cityName(a.location) : \"\";\n    if(loc){\n      var flavor = CITY_NOTE[loc];\n      if(!flavor){ var m=(a.location||\"\").match(\/\\(([^)]+)\\)\/); if(m) flavor=REGION_NOTE[m[1].trim()]; }\n      var noteFull = flavor ? \"(\"+flavor+\")\" : \"\";\n      var locHtml = esc(loc) + (noteFull ? ' <span class=\"ole-recap-note\" id=\"ole-recap-note\" data-note=\"'+esc(noteFull)+'\"><\/span>' : '');\n      rows.push('<div class=\"ole-recap-item\"><span class=\"ole-recap-ico ole-ico\"><i data-lucide=\"map-pin\"><\/i><\/span><span class=\"ole-recap-val\">'+locHtml+'<\/span><\/div>');\n    }\n    row(\"wallet\", a.budget?fmt(a.budget):\"\");\n    row(\"calendar-clock\", a.timing);\n    row(\"compass\", a.motivation);\n    var cbTxt = cbRecapText();\n    if(cbTxt){ rows.push('<div class=\"ole-recap-item ole-recap-cb\" id=\"ole-recap-cb-edit\" role=\"button\" tabindex=\"0\" aria-label=\"Edit callback time\"><span class=\"ole-recap-ico ole-ico\"><i data-lucide=\"'+(cbWantsRdv()?\"calendar-check\":\"phone-call\")+'\"><\/i><\/span><span class=\"ole-recap-val\">'+esc(cbTxt)+'<\/span><span class=\"ole-recap-edit\"><i data-lucide=\"pencil\"><\/i>Edit<\/span><\/div>'); }\n    if(!rows.length) return \"\";\n    return '<div class=\"ole-recap\"><div class=\"ole-recap-title\"><span class=\"ole-ico\"><i data-lucide=\"clipboard-check\"><\/i><\/span>Your project<\/div>'+rows.join(\"\")+'<\/div>';\n  }\n\n  function cityReaction(v){ if(!v) return null; var s=String(v).toLowerCase(); for(var i=0;i<REACTIONS.length;i++) for(var j=0;j<REACTIONS[i].match.length;j++) if(s.indexOf(REACTIONS[i].match[j].toLowerCase())>-1) return REACTIONS[i]; return null; }\n  function reactionFor(step, value){\n    if(step.type===\"location\"){ return LOC_PILL[value] || cityReaction(value); }\n    if(step.type===\"single\" && step.react){\n      var rb = step.react[value] || null;\n      if(step.id===\"property\" && rb && value!==\"Other\" && state.answers.location){\n        var pcity = cityName(state.answers.location); var ref = CITY_REF[pcity];\n        return { emoji:\"\\uD83D\\uDCCD\", msg: value+\" \"+locWithPrep(pcity)+(ref ? \" \u2014 \"+ref : \"\")+\". Lovely project!\" };\n      }\n      return rb;\n    }\n    if(step.type===\"multi\"){\n      if(!Array.isArray(value) || !value.length) return null;\n      if(value.length===1 && step.optMsg) return step.optMsg[value[0]] || step.reactAny || null;\n      if(step.multiMsg && step.multiMsg[String(value.length)]) return step.multiMsg[String(value.length)];\n      return step.reactAny || null;\n    }\n    if(step.type===\"budget\" && value){ return budgetReaction(value); }\n    return null;\n  }\n  function posHTML(){\n    return '<div class=\"ole-pos\" id=\"ole-pos\">'+\n      '<div class=\"ole-pos-head\"><span class=\"ole-pos-ico ole-ico\"><i data-lucide=\"compass\"><\/i><\/span>'+\n        '<div><strong>Ol\\u00e9 is a buyer\\u2019s hunter, not an agency.<\/strong>'+\n        '<span>We search, verify and negotiate for you, in your interest alone.<\/span><\/div>'+\n      '<\/div>'+\n      '<button type=\"button\" class=\"ole-pos-toggle\" id=\"ole-pos-toggle\" aria-expanded=\"false\">How does it work? <i data-lucide=\"chevron-down\"><\/i><\/button>'+\n      '<div class=\"ole-pos-steps\">'+\n        '<div class=\"ole-pos-step\"><span class=\"ole-pos-step-ico ole-ico\"><i data-lucide=\"search\"><\/i><\/span><div><div class=\"ole-pos-step-t\">We search<\/div><div class=\"ole-pos-step-d\">We hunt down the property that fits you, anywhere in Spain.<\/div><\/div><\/div>'+\n        '<div class=\"ole-pos-step\"><span class=\"ole-pos-step-ico ole-ico\"><i data-lucide=\"shield-check\"><\/i><\/span><div><div class=\"ole-pos-step-t\">We verify<\/div><div class=\"ole-pos-step-d\">Legal status, debts, real condition: we check everything before you commit.<\/div><\/div><\/div>'+\n        '<div class=\"ole-pos-step\"><span class=\"ole-pos-step-ico ole-ico\"><i data-lucide=\"badge-percent\"><\/i><\/span><div><div class=\"ole-pos-step-t\">We negotiate<\/div><div class=\"ole-pos-step-d\">We defend your budget to get the best price, in your interest alone.<\/div><\/div><\/div>'+\n      '<\/div>'+\n    '<\/div>';\n  }\n\n  var CITY_MIN = {\n    \/* --- Values matching Ol\\u00e9's confirmed FR reference (same numeric minimums) --- *\/\n    \"Alicante\":150000, \"Torrevieja\":150000, \"M\\u00e1laga\":200000, \"Fuengirola\":200000,\n    \"Marbella\":250000, \"Estepona\":250000, \"Madrid\":250000, \"Valencia\":170000,\n    \"Seville\":150000, \"Barcelona\":250000,\n    \/* --- Provisional estimates (to confirm) --- *\/\n    \"Benidorm\":150000, \"C\\u00e1diz\":120000, \"Girona\":130000, \"Nerja\":160000,\n    \"Palma de Mallorca\":200000, \"Tarragona\":120000\n    \/* No reference figure yet for: Granada, Ibiza, Mijas, Sitges \\u2014 left unmapped on purpose, falls back to the generic budget-tier reaction below *\/\n  };\n  var REGION_MIN = {\n    \"Andaluc\\u00eda\":70000, \"Comunidad Valenciana\":90000, \"Comunitat Valenciana\":90000,\n    \"Catalu\\u00f1a\":120000, \"Catalunya\":120000, \"Islas Baleares\":200000, \"Illes Balears\":200000,\n    \"Canarias\":130000, \"Islas Canarias\":130000, \"Regi\\u00f3n de Murcia\":70000,\n    \"Comunidad de Madrid\":180000, \"Galicia\":80000, \"Pa\\u00eds Vasco\":150000, \"Euskadi\":150000,\n    \"Cantabria\":110000, \"Asturias\":90000, \"Principado de Asturias\":90000, \"Arag\\u00f3n\":90000,\n    \"Castilla y Le\\u00f3n\":80000, \"Castilla-La Mancha\":70000, \"Extremadura\":60000,\n    \"Navarra\":110000, \"Comunidad Foral de Navarra\":110000, \"La Rioja\":90000\n  };\n  function locMinBudget(){\n    var loc = state.answers.location;\n    if(!loc) return null;\n    var city = cityName(loc);\n    if(CITY_MIN[city] != null) return CITY_MIN[city];\n    var m = String(loc).match(\/\\(([^)]+)\\)\/);\n    if(m && REGION_MIN[m[1].trim()] != null) return REGION_MIN[m[1].trim()];\n    return null;\n  }\n  function budgetReaction(v){\n    if(!v) return null;\n    var hasCity = !!state.answers.location;\n    var place = hasCity ? locWithPrep(cityName(state.answers.location)) : \"\";\n    var min = locMinBudget();\n    if(min != null){\n      if(v < min){\n        var msg = \"Properties \"+place+\" around \"+fmt(v)+\" are rare (plan on at least \"+fmt(min)+\"). Widening the search to nearby towns is often doable, though \\u2014 we\\u2019ll look for the best opportunity for you.\";\n        return { emoji:\"\\ud83e\\udded\", warn:true, msg:msg };\n      }\n      if(v < min*1.4)  return { emoji:\"\\ud83d\\udc4d\", msg:\"A realistic budget \"+place+\": there\\u2019s real opportunity to find something great.\" };\n      if(v < min*2.5)  return { emoji:\"\\u2600\\ufe0f\", msg:\"Good headroom \"+place+\" \\u2014 we can aim for something really special.\" };\n      return { emoji:\"\\u2728\", msg:\"Ol\\u00e9! With this budget \"+place+\", the high end is wide open to you.\" };\n    }\n    var step = STEPS[stepIndexById(\"budget\")];\n    if(step && step.reactRanges){\n      for(var i=0;i<step.reactRanges.length;i++) if(v<=step.reactRanges[i].max) return step.reactRanges[i];\n    }\n    return null;\n  }\n\n  function cityName(v){ return String(v||\"\").split(\"(\")[0].trim(); }\n  function locWithPrep(place){\n    var p=String(place||\"\").trim(); if(!p) return \"\";\n    if(p.indexOf(\"Balearic\")===0 || p.indexOf(\"Canary\")===0) return \"in the \"+p;\n    if(p.indexOf(\"Costa \")===0) return \"on the \"+p;\n    if(p===\"Andalusia\"||p===\"Catalonia\") return \"in \"+p;\n    return \"in \"+p;\n  }\n  function prefersReducedMotion(){ return !!(window.matchMedia && window.matchMedia(\"(prefers-reduced-motion:reduce)\").matches); }\n  function setReaction(step, value){ state.reaction = reactionFor(step, value) || null; }\n  var QUIZ_OK = [\"Spot on \u2014 exactly right.\",\"Correct, nice one!\",\"Got it \u2014 you've got an eye for this.\",\"Exactly \u2014 well played.\",\"Yes! You already know your stuff.\"];\n  var QUIZ_KO = [\"That's the most common trap \u2014 luckily, it's exactly what we secure.\",\"Almost! And that's precisely where we step in.\",\"Not quite \u2014 relax, we handle this for you.\",\"Common mistake: it's exactly why we exist.\",\"Close, but that's the kind of detail we take off your plate.\"];\n  function pickVaried(pool, key){ if(pool.length<=1) return pool[0]; var last=state[key], i; do{ i=Math.floor(Math.random()*pool.length); } while(i===last); state[key]=i; return pool[i]; }\n  function showReaction(step, value, instant){ setReaction(step, value); renderBadge(true, instant); }\n  function heroCapFor(step){\n    if(step.id===\"contact\"){\n      if(isRisksPath()) return \"Ol\u00e9! You see it clearly \u2014 that's exactly why we exist.\";\n      if(state.answers.location) return \"Last step \u2014 we'll reach out soon about your project \"+locWithPrep(cityName(state.answers.location))+\".\";\n    }\n    return step.heroCap||\"\";\n  }\n  function twChars(msg){ var out=\"\"; for(var i=0;i<msg.length;i++){ var ch=msg.charAt(i); out += '<span class=\"ole-tw\">'+(ch===\" \"?\" \":esc(ch))+'<\/span>'; } return out; }\n  function startTyping(b, r){\n    var q = String.fromCharCode(8220);\n    var emoji = r.emoji ? '<span class=\"ole-emoji ole-emoji-live\">'+ r.emoji +'<\/span>' : '';\n    b.className = \"ole-hero-msg reacted typing\";\n    b.innerHTML = '<span class=\"ole-q-mark\">'+q+'<\/span><span class=\"ole-hero-cap\">'+ twChars(r.msg) +'<\/span>'+ emoji + '<span class=\"ole-typing\"><span><\/span><span><\/span><span><\/span><\/span>';\n    b._typingT = setTimeout(function(){\n      b._typingT=null; b.classList.remove(\"typing\"); b.classList.add(\"writing\");\n      var spans=b.querySelectorAll(\".ole-tw\"), emo=b.querySelector(\".ole-emoji-live\"), i=0;\n      (function tick(){ if(i<spans.length){ spans[i].style.opacity=\"1\"; i++; b._twT=setTimeout(tick,15); } else { b._twT=null; if(emo) emo.style.opacity=\"1\"; b.classList.add(\"done\"); } })();\n    }, 520);\n  }\n  function renderBadge(animate, instant){\n    var b=document.getElementById(\"ole-badge\"); if(!b) return;\n    if(b._typingT){ clearTimeout(b._typingT); b._typingT=null; }\n    if(b._twT){ clearTimeout(b._twT); b._twT=null; }\n    b.style.minHeight=\"\";\n    var step=STEPS[state.i], r=state.reaction;\n    if(!r){ b.className=\"ole-hero-msg\"; b.innerHTML='<span class=\"ole-hero-cap\">'+esc(heroCapFor(step))+'<\/span>'; return; }\n    if(animate && !instant && !prefersReducedMotion()){ startTyping(b, r); }\n    else {\n      b.className=\"ole-hero-msg reacted\";\n      b.innerHTML='<span class=\"ole-q-mark\">'+String.fromCharCode(8220)+'<\/span><span class=\"ole-hero-cap\">'+esc(r.msg)+'<\/span>'+(r.emoji?'<span class=\"ole-emoji\">'+r.emoji+'<\/span>':'');\n      if(animate){ void b.offsetWidth; b.classList.add(\"bump\"); setTimeout(function(){ b.classList.remove(\"bump\"); },420); }\n    }\n  }\n\n  \/* =========================================================\n     5) STRUCTURE\n     ========================================================= *\/\n  root.innerHTML =\n    '<div class=\"ole-card\">'+\n      '<div class=\"ole-head\">'+\n        '<div class=\"ole-head-top\">'+\n          '<span class=\"ole-eyebrow\" id=\"ole-eyebrow\"><\/span>'+\n          '<button type=\"button\" class=\"ole-close\" id=\"ole-close\" aria-label=\"Close the form\"><i data-lucide=\"x\"><\/i><\/button>'+\n        '<\/div>'+\n        '<div class=\"ole-progress-wrap\">'+\n          '<div class=\"ole-track\"><div class=\"ole-bar\" id=\"ole-bar\"><span class=\"ole-bar-shine\"><\/span><span class=\"ole-sun\"><\/span><\/div><\/div>'+\n          '<span class=\"ole-count\" id=\"ole-count\"><\/span>'+\n        '<\/div>'+\n      '<\/div>'+\n      '<div class=\"ole-body\" id=\"ole-body\"><\/div>'+\n      '<div class=\"ole-foot\" id=\"ole-foot\"><\/div>'+\n      '<div class=\"ole-confirm\" id=\"ole-confirm\">'+\n        '<div class=\"ole-confirm-sheet\">'+\n          '<div class=\"ole-confirm-ico\"><i data-lucide=\"log-out\"><\/i><\/div>'+\n          '<h4>Leave the form?<\/h4>'+\n          '<p>Your answers won\\u2019t be saved. You\\u2019re just a few steps from your place in the Spanish sun.<\/p>'+\n          '<div class=\"ole-confirm-actions\">'+\n            '<button type=\"button\" class=\"ole-confirm-stay\" id=\"ole-stay\">Keep going<\/button>'+\n            '<button type=\"button\" class=\"ole-confirm-quit\" id=\"ole-quit\">Leave anyway<\/button>'+\n          '<\/div>'+\n        '<\/div>'+\n      '<\/div>'+\n      '<input class=\"ole-hp\" type=\"text\" name=\"Hypot_field\" id=\"ole-hp\" tabindex=\"-1\" autocomplete=\"off\" aria-hidden=\"true\">'+\n    '<\/div>';\n\n  var bodyEl=document.getElementById(\"ole-body\"), barEl=document.getElementById(\"ole-bar\"),\n      countEl=document.getElementById(\"ole-count\"), eyebrowEl=document.getElementById(\"ole-eyebrow\"),\n      footEl=document.getElementById(\"ole-foot\");\n  bodyEl.addEventListener(\"input\", saveSoon);\n  bodyEl.addEventListener(\"change\", saveSoon);\n  bodyEl.addEventListener(\"click\", saveSoon);\n\n  var confirmEl=document.getElementById(\"ole-confirm\");\n  document.getElementById(\"ole-close\").onclick=function(){ if(hasAnswers()){ confirmEl.classList.add(\"show\"); } else { quit(); } };\n  document.getElementById(\"ole-stay\").onclick=function(){ confirmEl.classList.remove(\"show\"); };\n  document.getElementById(\"ole-quit\").onclick=quit;\n  confirmEl.addEventListener(\"click\",function(e){ if(e.target===confirmEl) confirmEl.classList.remove(\"show\"); });\n  function quit(){ clearState(); if(CLOSE_URL){ window.location.href=CLOSE_URL; } else if(window.history && window.history.length>1){ window.history.back(); } else { confirmEl.classList.remove(\"show\"); } }\n\n  \/* =========================================================\n     6) RENDER\n     ========================================================= *\/\n  function stepNumber(){ var seq=ORDER.filter(function(id){ return !isEdu(id) || isRisksPath(); }); return { pos: seq.indexOf(STEPS[state.i].id)+1, total: seq.length }; }\n\n  function render(animClass){\n    var step=STEPS[state.i], n=stepNumber();\n    if(step.type===\"teach\" || step.type===\"callback\") state.reaction=null;\n    var rem=n.total-n.pos;\n    if(step.type===\"contact\") countEl.textContent=\"Last step\";\n    else if(rem===1) countEl.textContent=\"One step to go!\";\n    else if(rem===2) countEl.textContent=\"2 questions left!\";\n    else countEl.textContent=\"Step \"+n.pos+\" \/ \"+n.total;\n    barEl.style.width=Math.round((n.pos\/n.total)*100)+\"%\";\n    eyebrowEl.className=\"ole-eyebrow ebIn\";\n    eyebrowEl.innerHTML=(step.ebIco?'<span class=\"ole-ico ole-eb-ico\"><i data-lucide=\"'+step.ebIco+'\"><\/i><\/span>':'')+esc(step.eyebrow||\"\");\n\n    var wrap=document.createElement(\"div\");\n    wrap.className=\"ole-step \"+(animClass||\"in-right\");\n    wrap.innerHTML=stepHTML(step);\n    bodyEl.innerHTML=\"\"; bodyEl.appendChild(wrap);\n\n    renderFoot(step); wireStep(step, wrap); wireFoot(step); applyCascade(wrap);\n    bodyEl.scrollTop=0; renderBadge(true); refreshIcons(); clearFx(wrap); lockInput(); saveState();\n  }\n\n  function lockNow(){ bodyEl.style.pointerEvents=\"none\"; footEl.style.pointerEvents=\"none\"; }\n  function lockInput(){ lockNow(); setTimeout(function(){ bodyEl.style.pointerEvents=\"\"; footEl.style.pointerEvents=\"\"; state.busy=false; }, 450); }\n  function applyCascade(wrap){\n    if(prefersReducedMotion()) return;\n    var sel=\".ole-q, .ole-teach-body, .ole-quiz-ask, .ole-quiz-opt, .ole-opt, .ole-value-card, .ole-closing, .ole-field, .ole-recap, .ole-info-bonus, .ole-cb-label, .ole-cb-rdv\";\n    var els=[].slice.call(wrap.querySelectorAll(sel));\n    for(var i=0;i<els.length;i++){ els[i].classList.add(\"ole-rise\"); els[i].style.animationDelay=(0.03+Math.min(i,8)*0.05)+\"s\"; }\n  }\n  function clearFx(wrap){\n    setTimeout(function(){\n      wrap.classList.remove(\"in-right\",\"in-left\"); eyebrowEl.classList.remove(\"ebIn\");\n      var fx=wrap.querySelectorAll(\".fx\"); for(var i=0;i<fx.length;i++) fx[i].classList.remove(\"fx\");\n      var rs=wrap.querySelectorAll(\".ole-rise\"); for(var j=0;j<rs.length;j++){ rs[j].classList.remove(\"ole-rise\"); rs[j].style.animationDelay=\"\"; }\n    }, 1000);\n  }\n  function heroHTML(step){ if(!SHOW_HERO) return \"\"; return '<div class=\"ole-hero\"><div class=\"ole-hero-ico ole-ico fx\"><i data-lucide=\"'+(step.heroIco||\"sun\")+'\"><\/i><\/div><div class=\"ole-hero-msg\" id=\"ole-badge\"><\/div><\/div>'; }\n\n  function stepHTML(step){\n    var h=(step.id===\"timing\")?posHTML():\"\";\n    h+=heroHTML(step);\n    h += '<div class=\"ole-q\">'+esc(step.q)+(step.required?' <span class=\"req\">*<\/span>':'')+'<\/div>';\n    if(step.sub) h += '<div class=\"ole-sub\">'+esc(step.sub)+'<\/div>';\n\n    if(step.type===\"single\" || step.type===\"multi\"){\n      h += '<div class=\"ole-options\">';\n      step.options.forEach(function(opt){\n        var label=(typeof opt===\"object\")?opt.label:opt;\n        var icon=(typeof opt===\"object\"&&opt.ic)?opt.ic:\"circle\";\n        var tone=(typeof opt===\"object\"&&opt.tone)?(\" tone-\"+opt.tone):\"\";\n        var sel=isSelected(step,label)?\" sel\":\"\";\n        h += '<button type=\"button\" class=\"ole-opt'+tone+sel+'\" data-type=\"'+step.type+'\" data-val=\"'+esc(label)+'\"><span class=\"ole-opt-ico ole-ico\"><i data-lucide=\"'+icon+'\"><\/i><\/span><span class=\"ole-opt-label\">'+esc(label)+'<\/span><span class=\"ole-mark\"><\/span><\/button>';\n      });\n      h += '<\/div>';\n    }\n    else if(step.type===\"budget\"){\n      var bv=state.answers.budget?nf.format(state.answers.budget):\"\";\n      h += '<div class=\"ole-field has-ico\"><span class=\"ole-field-ico ole-ico\"><i data-lucide=\"dollar-sign\"><\/i><\/span><input class=\"ole-input\" id=\"ole-budget\" inputmode=\"numeric\" autocomplete=\"off\" placeholder=\"'+esc(step.placeholder)+'\" value=\"'+esc(bv)+'\"><\/div>';\n      h += '<div class=\"ole-errmsg\" id=\"err-budget\"><\/div>';\n      h += '<div class=\"ole-pills\">';\n      step.pills.forEach(function(v){ h += '<button type=\"button\" class=\"ole-pill'+(state.answers.budget===v?\" sel\":\"\")+'\" data-budget=\"'+v+'\">'+fmt(v)+'<\/button>'; });\n      h += '<\/div>';\n    }\n    else if(step.type===\"location\"){\n      var lv=state.answers.location||\"\";\n      h += '<div class=\"ole-field has-ico\"><span class=\"ole-field-ico ole-ico\"><i data-lucide=\"search\"><\/i><\/span><input class=\"ole-input\" id=\"ole-loc\" autocomplete=\"off\" placeholder=\"'+esc(step.placeholder)+'\" value=\"'+esc(lv)+'\"><\/div>';\n      h += '<div class=\"ole-pills loc-pills\">';\n      step.cities.forEach(function(c){ h += '<button type=\"button\" class=\"ole-pill'+(state.answers.location===c?\" sel\":\"\")+'\" data-loc=\"'+esc(c)+'\">'+esc(c)+'<\/button>'; });\n      h += '<\/div><div class=\"ole-pills sep loc-pills\">';\n      step.regions.forEach(function(r){ h += '<button type=\"button\" class=\"ole-pill region'+(state.answers.location===r?\" sel\":\"\")+'\" data-loc=\"'+esc(r)+'\"><span class=\"ole-pill-ico ole-ico\"><i data-lucide=\"waves\"><\/i><\/span>'+esc(r)+'<\/button>'; });\n      h += '<\/div>';\n    }\n    else if(step.type===\"teach\"){\n      var showQuiz = step.quiz && (RISKS_FORMAT===\"quiz\" || (RISKS_FORMAT===\"mix\" && step.quizMix));\n      if(showQuiz){\n        h += '<div class=\"ole-quiz\"><div class=\"ole-quiz-ask\">'+esc(step.quiz.ask)+'<\/div><div class=\"ole-quiz-opts\">';\n        step.quiz.options.forEach(function(o,idx){ h += '<button type=\"button\" class=\"ole-quiz-opt\" data-correct=\"'+(o.correct?\"1\":\"0\")+'\" data-idx=\"'+idx+'\"><span class=\"ole-quiz-mark\"><\/span><span class=\"ole-quiz-lbl\">'+esc(o.label)+'<\/span><\/button>'; });\n        h += '<\/div><div class=\"ole-quiz-reveal\" id=\"ole-quiz-reveal\"><div class=\"ole-quiz-reveal-ico ole-ico\"><i data-lucide=\"lightbulb\"><\/i><\/div><div class=\"ole-quiz-reveal-txt\">'+esc(step.quiz.reveal)+'<\/div><\/div><\/div>';\n      } else if(step.body){ h += '<div class=\"ole-teach-body\">'+esc(step.body)+'<\/div>'; }\n      if(step.valueRecap){\n        var vr=step.valueRecap; h += '<div class=\"ole-value\">';\n        if(vr.saves && vr.saves.length){ h += '<div class=\"ole-value-card gain\"><div class=\"ole-value-title\"><span class=\"ole-ico\"><i data-lucide=\"piggy-bank\"><\/i><\/span>What we save you<\/div>'; vr.saves.forEach(function(it){ h += '<div class=\"ole-value-item\"><span class=\"ole-value-ico ole-ico\"><i data-lucide=\"'+it.ic+'\"><\/i><\/span><span>'+esc(it.t)+'<\/span><\/div>'; }); h += '<\/div>'; }\n        if(vr.avoids && vr.avoids.length){ h += '<div class=\"ole-value-card avoid\"><div class=\"ole-value-title\"><span class=\"ole-ico\"><i data-lucide=\"shield-check\"><\/i><\/span>The traps we keep you out of<\/div>'; vr.avoids.forEach(function(it){ h += '<div class=\"ole-value-item\"><span class=\"ole-value-ico ole-ico\"><i data-lucide=\"'+it.ic+'\"><\/i><\/span><span>'+esc(it.t)+'<\/span><\/div>'; }); h += '<\/div>'; }\n        h += '<\/div>';\n      }\n      if(step.closing) h += '<div class=\"ole-closing\"><div class=\"ole-closing-ico ole-ico\"><i data-lucide=\"badge-check\"><\/i><\/div><div><div class=\"ole-closing-t\">'+esc(step.closing.t)+'<\/div><div class=\"ole-closing-d\">'+esc(step.closing.d)+'<\/div><\/div><\/div>';\n    }\n    else if(step.type===\"callback\"){\n      cbInitZone();\n      var zNow=cbZoneShort(); var isOther=!cbIsUsZone();\n      h += '<div class=\"ole-cb-fields'+(state.answers.cb_rdv?\" hidden\":\"\")+'\" id=\"ole-cb-fields\">';\n      h += '<div class=\"ole-cb-label\"><span class=\"ole-ico\"><i data-lucide=\"globe\"><\/i><\/span>Your time zone<\/div>';\n      h += '<div class=\"ole-pills ole-cb-zones\" id=\"ole-cb-zones\">';\n      US_ZONES.forEach(function(z){ h += '<button type=\"button\" class=\"ole-pill'+(!isOther && state.answers.cb_tz===z.tz?\" sel\":\"\")+'\" data-cbzone=\"'+z.l+'\" data-cbtz=\"'+z.tz+'\">'+esc(z.l)+'<\/button>'; });\n      h += '<button type=\"button\" class=\"ole-pill'+(isOther?\" sel\":\"\")+'\" data-cbother=\"1\"><span class=\"ole-pill-ico ole-ico\"><i data-lucide=\"globe-2\"><\/i><\/span>Other country<\/button>';\n      h += '<\/div>';\n      h += '<select class=\"ole-cb-select'+(isOther?\" show\":\"\")+'\" id=\"ole-cb-select\" aria-label=\"Select your time zone\"><option value=\"\">Select your country \/ time zone\u2026<\/option>';\n      WORLD_ZONES.forEach(function(z){ h += '<option value=\"'+esc(z.tz)+'\" data-s=\"'+esc(z.s)+'\"'+(isOther && state.answers.cb_tz===z.tz?\" selected\":\"\")+'>'+esc(z.l)+'<\/option>'; });\n      h += '<\/select>';\n      h += '<div class=\"ole-cb-label sep\"><span class=\"ole-ico\"><i data-lucide=\"calendar\"><\/i><\/span>Day<\/div>';\n      h += '<div class=\"ole-pills ole-cb-days\" id=\"ole-cb-days\">';\n      step.days.forEach(function(d){ var sel=(Array.isArray(state.answers.cb_days)&&state.answers.cb_days.indexOf(d.label)>-1)?\" sel\":\"\"; h += '<button type=\"button\" class=\"ole-pill'+sel+'\" data-cbday=\"'+esc(d.label)+'\" data-dow=\"'+d.dow+'\">'+esc(d.label)+'<\/button>'; });\n      h += '<button type=\"button\" class=\"ole-pill'+(state.answers.cb_days_indif?\" sel\":\"\")+'\" data-cbday-indif=\"1\">Any day<\/button>';\n      h += '<\/div>';\n      h += '<div class=\"ole-cb-label sep\"><span class=\"ole-ico\"><i data-lucide=\"clock\"><\/i><\/span>Time window<\/div>';\n      h += '<div class=\"ole-cb-hint\" id=\"ole-cb-hint\">Shown in your local time ('+esc(zNow)+'). We only call during our Spanish office hours, so these windows already match when we can reach you.<\/div>';\n      h += '<div class=\"ole-pills ole-cb-slots\" id=\"ole-cb-slots\">'+cbSlotsHTML()+'<\/div>';\n      h += '<div class=\"ole-cb-empty\" id=\"ole-cb-empty\" style=\"'+(cbHasSlots()?\"display:none\":\"\")+'\">With the time difference between Spain and your area, live call windows for this day are very limited. Pick <strong>\\u201CAny time that works\\u201D<\/strong> and we\\u2019ll find the best moment \\u2014 or book a call to lock a slot.<\/div>';\n      h += '<div class=\"ole-cb-precise'+(state.answers.cb_precise?\" show\":\"\")+'\" id=\"ole-cb-precise\"><div class=\"ole-cb-precise-inner\"><div class=\"ole-cb-mini\">What time works best?<\/div><div class=\"ole-pills ole-cb-hours\" id=\"ole-cb-hours\">'+cbHoursHTML()+'<\/div><div class=\"ole-cb-precise-note'+(state.answers.cb_precise&&state.answers.cb_hour!=null?\" show\":\"\")+'\" id=\"ole-cb-precise-note\"><span class=\"ole-cb-precise-note-ico ole-ico\"><i data-lucide=\"info\"><\/i><\/span><div class=\"ole-cb-precise-note-body\"><span id=\"ole-cb-precise-note-txt\">'+esc(cbPreciseMsg())+'<\/span><button type=\"button\" class=\"ole-cb-precise-rdv\" id=\"ole-cb-precise-rdv\"><span class=\"ole-ico\"><i data-lucide=\"calendar-check\"><\/i><\/span>Book a call<\/button><\/div><\/div><\/div><\/div>';\n      h += '<div class=\"ole-cb-office\"><span class=\"ole-ico\"><i data-lucide=\"info\"><\/i><\/span><span>We\\u2019re based in Spain and call during our local business hours (9 AM\\u20137 PM CET, Mon\\u2013Fri). We\\u2019ll do our best to reach you in your chosen window.<\/span><\/div>';\n      h += '<\/div>';\n      h += '<button type=\"button\" class=\"ole-cb-rdv'+(state.answers.cb_rdv?\" on\":\"\")+'\" id=\"ole-cb-rdv\" aria-pressed=\"'+(state.answers.cb_rdv?\"true\":\"false\")+'\"><span class=\"ole-cb-rdv-mark\"><\/span><span class=\"ole-cb-rdv-ico ole-ico\"><i data-lucide=\"calendar-check\"><\/i><\/span><span class=\"ole-cb-rdv-txt\">I\\u2019d rather book a call myself<\/span><\/button>';\n      h += '<div class=\"ole-cb-rdv-note'+(state.answers.cb_rdv?\" show\":\"\")+'\" id=\"ole-cb-rdv-note\"><span class=\"ole-cb-rdv-note-ico ole-ico\"><i data-lucide=\"info\"><\/i><\/span><span>At the end of the form, you\\u2019ll be taken to our booking page to pick a time with an advisor directly.<\/span><\/div>';\n    }\n    else if(step.type===\"contact\"){\n      var a=state.answers;\n      h += recapHTML();\n      h += proofHTML();\n      h += '<form class=\"ole-cform\" autocomplete=\"on\" onsubmit=\"return false;\">'+\n           '<div class=\"ole-grid2\">'+ field(\"firstname\",\"First name\",\"text\",a.firstname,\"Jane\",\"given-name\")+ field(\"lastname\",\"Last name\",\"text\",a.lastname,\"Smith\",\"family-name\")+ '<\/div>'+\n           field(\"email\",\"Email\",\"email\",a.email,\"jane.smith@email.com\",\"email\")+\n           '<div class=\"ole-suggest\" id=\"sugg-email\" aria-live=\"polite\"><\/div>'+\n           '<div class=\"ole-phone-msg\" id=\"ole-phone-msg\"><\/div>'+\n           field(\"phone\",\"Phone\",\"tel\",a.phone,\"(555) 123-4567\",\"tel\")+\n           '<div class=\"ole-consent\"><span class=\"ole-ico\"><i data-lucide=\"shield-check\"><\/i><\/span><span>'+esc(step.consent)+' <a class=\"ole-consent-link\" href=\"'+esc(PRIVACY_URL)+'\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy policy<\/a>. <span style=\"color:var(--blue)\">*<\/span><\/span><\/div>'+\n           '<\/form>';\n    }\n    return h;\n  }\n\n  var PROOF_LINES = [\n    'You\\u2019ll work with a dedicated, <strong>English-speaking advisor<\/strong> \u2014 from search to signing.',\n    'We\\u2019re your <strong>eyes and ears<\/strong> on the ground in Spain.',\n    'We handle the paperwork \u2014 <strong>NIE, notary, bank<\/strong> \u2014 so you don\\u2019t have to.',\n    'The best time to start was yesterday. The next best is <strong>now<\/strong>.',\n    'Your place in the Spanish sun could be <strong>closer than you think<\/strong>.'\n  ];\n  function proofHTML(){ return '<div class=\"ole-proof\"><span class=\"ole-proof-ico ole-ico\"><i data-lucide=\"sparkles\"><\/i><\/span><span class=\"ole-proof-rot\" id=\"ole-proof-rot\"><\/span><\/div>'; }\n  function initProof(wrap){\n    var el=wrap.querySelector(\"#ole-proof-rot\"); if(!el) return; var i=0;\n    if(state._proofIv){ clearInterval(state._proofIv); }\n    el.innerHTML='<span class=\"ole-proof-line\">'+PROOF_LINES[0]+'<\/span>';\n    state._proofIv=setInterval(function(){ el.classList.add(\"out\"); setTimeout(function(){ i=(i+1)%PROOF_LINES.length; el.innerHTML='<span class=\"ole-proof-line\">'+PROOF_LINES[i]+'<\/span>'; el.classList.remove(\"out\"); },450); },5200);\n  }\n\n  function field(id,label,type,val,ph,ac){\n    var im=(type===\"email\")?'inputmode=\"email\" ':(type===\"tel\")?'inputmode=\"tel\" ':'';\n    var extra=(type===\"email\")?'autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" ':(type===\"text\")?'autocapitalize=\"words\" ':'';\n    return '<div class=\"ole-field\"><label class=\"ole-label\" for=\"ole-'+id+'\">'+esc(label)+' <span class=\"req\">*<\/span><\/label><input class=\"ole-input\" id=\"ole-'+id+'\" name=\"'+id+'\" type=\"'+type+'\" autocomplete=\"'+(ac||\"on\")+'\" '+im+extra+'value=\"'+esc(val||\"\")+'\" placeholder=\"'+esc(ph)+'\"><div class=\"ole-errmsg\" id=\"err-'+id+'\"><\/div><\/div>';\n  }\n\n  function renderFoot(step){\n    var html=\"\", primary=\"\";\n    if(step.type===\"contact\"){\n      var ctaCity=state.answers.location?cityName(state.answers.location):\"\";\n      var ctaLabel=ctaCity?(\"Start my search \"+locWithPrep(ctaCity)):\"Submit my request\";\n      primary='<button type=\"button\" class=\"ole-next sun\" id=\"ole-next\"><span class=\"ole-spin\" id=\"ole-spin\"><\/span><span id=\"ole-next-label\">'+esc(ctaLabel)+'<\/span> <i data-lucide=\"check\"><\/i><\/button>';\n    } else if(step.type===\"teach\"){ primary='<button type=\"button\" class=\"ole-next\" id=\"ole-next\">'+esc(step.cta||\"Next\")+' <i data-lucide=\"arrow-right\"><\/i><\/button>'; }\n    else if(step.type===\"multi\" || step.type===\"budget\" || step.type===\"location\" || step.type===\"callback\"){ primary='<button type=\"button\" class=\"ole-next\" id=\"ole-next\">Next <i data-lucide=\"arrow-right\"><\/i><\/button>'; }\n    if(primary) html += primary;\n    if(step.type===\"contact\") html += '<div class=\"ole-trust\"><span><i data-lucide=\"lock\"><\/i> No obligation<\/span><span><i data-lucide=\"clock\"><\/i> Reply within 24h<\/span><span><i data-lucide=\"message-circle\"><\/i> English-speaking team<\/span><\/div>';\n    if(step.type===\"teach\" && step.skip) html += '<button type=\"button\" class=\"ole-skip\" id=\"ole-skip\">Skip this step<\/button>';\n    if(state.history.length>0) html += '<button type=\"button\" class=\"ole-back\" id=\"ole-back\"><i data-lucide=\"chevron-left\"><\/i> Back<\/button>';\n    footEl.innerHTML=html;\n  }\n\n  function isSelected(step,label){ var v=state.answers[step.id]; if(step.type===\"multi\") return Array.isArray(v)&&v.indexOf(label)>-1; return v===label; }\n\n  \/* =========================================================\n     7) INTERACTIONS\n     ========================================================= *\/\n  function wireFoot(step){\n    var back=footEl.querySelector(\"#ole-back\"); if(back) back.onclick=prev;\n    var next=footEl.querySelector(\"#ole-next\"); if(!next) return;\n    if(step.type===\"contact\") next.onclick=submit;\n    else if(step.type===\"teach\"){ next.onclick=function(){ nextStep(); }; var sk=footEl.querySelector(\"#ole-skip\"); if(sk) sk.onclick=skipToContact; }\n    else next.onclick=function(){ if(validate(step)) nextStep(); };\n  }\n\n  function wireStep(step, wrap){\n    var posT = wrap.querySelector(\"#ole-pos-toggle\");\n    if(posT) posT.onclick=function(){ var p=wrap.querySelector(\"#ole-pos\"); if(p){ var open=p.classList.toggle(\"open\"); posT.setAttribute(\"aria-expanded\", open?\"true\":\"false\"); } refreshIcons(); };\n    if(step.type===\"single\" || step.type===\"multi\"){\n      wrap.querySelectorAll(\".ole-opt\").forEach(function(btn){\n        btn.onclick=function(){\n          var val=btn.getAttribute(\"data-val\");\n          if(step.type===\"multi\"){\n            var arr=state.answers[step.id]||[]; var k=arr.indexOf(val);\n            if(k>-1) arr.splice(k,1); else arr.push(val);\n            state.answers[step.id]=arr; btn.classList.toggle(\"sel\"); btn.classList.add(\"pulse\");\n            setTimeout(function(){btn.classList.remove(\"pulse\");},350); showReaction(step, arr);\n          } else {\n            wrap.querySelectorAll(\".ole-opt\").forEach(function(b){b.classList.remove(\"sel\");});\n            btn.classList.add(\"sel\",\"pulse\"); state.answers[step.id]=val; setReaction(step, val); lockAdvance();\n          }\n        };\n      });\n    }\n    else if(step.type===\"budget\"){\n      var inp=wrap.querySelector(\"#ole-budget\");\n      function applyBudget(el){\n        var raw=el.value, caret=el.selectionStart==null?raw.length:el.selectionStart;\n        var before=raw.slice(0,caret).replace(\/\\D\/g,\"\").length;\n        var d=raw.replace(\/[^\\d]\/g,\"\"); state.answers.budget=d?parseInt(d,10):null;\n        var f=d?nf.format(parseInt(d,10)):\"\"; el.value=f;\n        var pos=0,seen=0; while(pos<f.length && seen<before){ var c=f.charCodeAt(pos); if(c>=48&&c<=57) seen++; pos++; }\n        try{ el.setSelectionRange(pos,pos); }catch(e){}\n        wrap.querySelectorAll(\".ole-pill\").forEach(function(p){ p.classList.toggle(\"sel\", parseInt(p.dataset.budget,10)===state.answers.budget); });\n        showReaction(step, state.answers.budget, true); setErr(\"budget\",\"\");\n      }\n      inp.addEventListener(\"input\",function(){ applyBudget(inp); });\n      wrap.querySelectorAll(\".ole-pill\").forEach(function(p){ p.onclick=function(){ var v=parseInt(p.dataset.budget,10); state.answers.budget=v; inp.value=nf.format(v); wrap.querySelectorAll(\".ole-pill\").forEach(function(x){x.classList.toggle(\"sel\",x===p);}); setReaction(step, v); lockAdvance(); }; });\n    }\n    else if(step.type===\"location\"){\n      var loc=wrap.querySelector(\"#ole-loc\");\n      var pills=[].slice.call(wrap.querySelectorAll(\".ole-pill\"));\n      pills.forEach(function(p){ p.onclick=function(){ var v=p.getAttribute(\"data-loc\"); state.answers.location=v; loc.value=v; pills.forEach(function(x){x.classList.toggle(\"sel\",x===p);}); setReaction(step, v); lockAdvance(); }; });\n      loc.addEventListener(\"input\",function(){ state.answers.location=loc.value; showReaction(step, loc.value, true); var t=loc.value.toLowerCase().trim(); pills.forEach(function(p){ p.classList.toggle(\"sel\", p.getAttribute(\"data-loc\")===loc.value); p.classList.toggle(\"hidden\", t.length>0 && p.getAttribute(\"data-loc\").toLowerCase().indexOf(t)===-1); }); });\n      if(HS.googleMapsKey) loadGoogleMaps(HS.googleMapsKey, function(){ gMapsReady=true; initLocationAutocomplete(loc, pills, step); });\n    }\n    else if(step.type===\"contact\"){\n      [\"firstname\",\"lastname\",\"email\"].forEach(function(id){ var el=wrap.querySelector(\"#ole-\"+id); if(el) el.addEventListener(\"input\", function(){ if(id===\"email\"){ var lo=el.value.toLowerCase(); if(lo!==el.value){ var p=el.selectionStart; el.value=lo; try{ el.setSelectionRange(p,p); }catch(e){} } } state.answers[id]=el.value; }); });\n      var phEl=wrap.querySelector(\"#ole-phone\"); if(phEl) phEl.addEventListener(\"input\", function(){ state.answers.phone=phEl.value; });\n      var em=wrap.querySelector(\"#ole-email\"), sug=wrap.querySelector(\"#sugg-email\");\n      function clearSug(){ if(sug){ sug.innerHTML=\"\"; sug.classList.remove(\"show\"); } }\n      function checkSug(){ if(!em||!sug) return; var s=suggestEmail(em.value.trim()); if(s){ sug.innerHTML='Did you mean <button type=\"button\" class=\"ole-suggest-link\" data-email=\"'+esc(s)+'\">'+esc(s)+'<\/button>?'; sug.classList.add(\"show\"); } else clearSug(); }\n      if(em){ em.addEventListener(\"blur\", checkSug); em.addEventListener(\"input\", clearSug); }\n      if(sug){ sug.addEventListener(\"click\", function(e){ var t=e.target; if(t&&t.classList&&t.classList.contains(\"ole-suggest-link\")){ em.value=t.getAttribute(\"data-email\"); state.answers.email=em.value; clearSug(); setErr(\"email\",\"\"); em.focus(); } }); }\n      initPhone(wrap); initProof(wrap);\n      var cbEdit=wrap.querySelector(\"#ole-recap-cb-edit\");\n      if(cbEdit){ var goEditCb=function(){ if(state.busy) return; var t=stepIndexById(\"callback\"); if(t<0||t===state.i) return; if(state.history.length && state.history[state.history.length-1]===t) transitionTo(state.history.pop(),-1); else transitionTo(t,-1); }; cbEdit.addEventListener(\"click\", goEditCb); cbEdit.addEventListener(\"keydown\", function(e){ if(e.key===\"Enter\"||e.key===\" \"){ e.preventDefault(); goEditCb(); } }); }\n      var cform=wrap.querySelector(\".ole-cform\"); if(cform) cform.addEventListener(\"keydown\", function(e){ if(e.key===\"Enter\"){ e.preventDefault(); submit(); } });\n      var noteEl=wrap.querySelector(\"#ole-recap-note\");\n      if(noteEl){ var noteTxt=noteEl.getAttribute(\"data-note\")||\"\"; if(noteTxt){ if(state._noteT) clearTimeout(state._noteT); if(state._noteTw) clearTimeout(state._noteTw); state._noteT=setTimeout(function(){ noteEl.classList.add(\"writing\"); var i=0; (function tick(){ noteEl.textContent=noteTxt.slice(0,i); if(i<noteTxt.length){ i++; state._noteTw=setTimeout(tick,30); } else { state._noteTw=null; noteEl.classList.remove(\"writing\"); } })(); },2000); } }\n    }\n    else if(step.type===\"callback\"){\n      var fieldsEl=wrap.querySelector(\"#ole-cb-fields\"), slotsEl=wrap.querySelector(\"#ole-cb-slots\"), noteEl=wrap.querySelector(\"#ole-cb-rdv-note\");\n      var rdvBtn=wrap.querySelector(\"#ole-cb-rdv\"), preciseEl=wrap.querySelector(\"#ole-cb-precise\"), hoursEl=wrap.querySelector(\"#ole-cb-hours\");\n      var pNoteEl=wrap.querySelector(\"#ole-cb-precise-note\"), pNoteTxt=wrap.querySelector(\"#ole-cb-precise-note-txt\"), pRdvBtn=wrap.querySelector(\"#ole-cb-precise-rdv\");\n      var hintEl=wrap.querySelector(\".ole-cb-hint\");\n      var selEl=wrap.querySelector(\"#ole-cb-select\");\n      var emptyEl=wrap.querySelector(\"#ole-cb-empty\");\n      cbInitZone();\n      function cbSyncEmpty(){ if(emptyEl) emptyEl.style.display = cbHasSlots()?\"none\":\"\"; }\n      function cbHint(){ if(hintEl) hintEl.textContent=\"Shown in your local time (\"+cbZoneShort()+\"). We only call during our Spanish office hours, so these windows already match when we can reach you.\"; }\n      function cbUpdate(){ state.reaction=cbReaction(); renderBadge(true); saveSoon(); }\n      function cbSetRdv(on){ state.answers.cb_rdv=on; if(rdvBtn){ rdvBtn.classList.toggle(\"on\",on); rdvBtn.setAttribute(\"aria-pressed\",on?\"true\":\"false\"); } if(fieldsEl) fieldsEl.classList.toggle(\"hidden\",on); if(noteEl) noteEl.classList.toggle(\"show\",on); cbUpdate(); }\n      function cbSyncPrecise(){ if(preciseEl) preciseEl.classList.toggle(\"show\", !!state.answers.cb_precise); if(pNoteEl) pNoteEl.classList.toggle(\"show\", !!(state.answers.cb_precise&&state.answers.cb_hour!=null)); if(pNoteTxt) pNoteTxt.textContent=cbPreciseMsg(); }\n      function cbWireHours(){ if(!hoursEl) return; hoursEl.querySelectorAll(\"[data-cbhour]\").forEach(function(btn){ btn.onclick=function(){ var v=parseInt(btn.getAttribute(\"data-cbhour\"),10), was=btn.classList.contains(\"sel\"); hoursEl.querySelectorAll(\"[data-cbhour]\").forEach(function(b){b.classList.remove(\"sel\");}); if(!was){ btn.classList.add(\"sel\"); state.answers.cb_hour=v; } else state.answers.cb_hour=null; cbSyncPrecise(); cbUpdate(); }; }); }\n      function cbRefreshHours(){ if(!hoursEl) return; var allowed=cbHours(); if(state.answers.cb_hour!=null && allowed.indexOf(state.answers.cb_hour)===-1) state.answers.cb_hour=null; hoursEl.innerHTML=cbHoursHTML(); cbWireHours(); refreshIcons(); }\n      function cbClearAny(){ state.answers.cb_any=false; var ab=slotsEl.querySelector(\"[data-cbany]\"); if(ab) ab.classList.remove(\"sel\"); }\n      function cbWireSlots(){\n        slotsEl.querySelectorAll(\"[data-cbslot]\").forEach(function(btn){ btn.onclick=function(){ var v=parseInt(btn.getAttribute(\"data-cbslot\"),10), was=btn.classList.contains(\"sel\"); slotsEl.querySelectorAll(\"[data-cbslot]\").forEach(function(b){b.classList.remove(\"sel\");}); state.answers.cb_precise=false; state.answers.cb_hour=null; cbClearAny(); var pp=slotsEl.querySelector(\"[data-cbprecise]\"); if(pp) pp.classList.remove(\"sel\"); if(!was){ btn.classList.add(\"sel\"); state.answers.cb_slot=v; } else state.answers.cb_slot=null; cbSyncPrecise(); cbUpdate(); }; });\n        var pBtn=slotsEl.querySelector(\"[data-cbprecise]\");\n        if(pBtn) pBtn.onclick=function(){ var on=!state.answers.cb_precise; state.answers.cb_precise=on; cbClearAny(); if(on){ state.answers.cb_slot=null; slotsEl.querySelectorAll(\"[data-cbslot]\").forEach(function(b){b.classList.remove(\"sel\");}); } else { state.answers.cb_hour=null; } pBtn.classList.toggle(\"sel\",on); cbRefreshHours(); cbSyncPrecise(); cbUpdate(); };\n        var anyBtn=slotsEl.querySelector(\"[data-cbany]\");\n        if(anyBtn) anyBtn.onclick=function(){ var on=!state.answers.cb_any; state.answers.cb_any=on; if(on){ state.answers.cb_slot=null; state.answers.cb_precise=false; state.answers.cb_hour=null; slotsEl.querySelectorAll(\"[data-cbslot]\").forEach(function(b){b.classList.remove(\"sel\");}); var pp=slotsEl.querySelector(\"[data-cbprecise]\"); if(pp) pp.classList.remove(\"sel\"); } anyBtn.classList.toggle(\"sel\",on); cbRefreshHours(); cbSyncPrecise(); cbUpdate(); };\n      }\n      function cbRefreshSlots(){ if(state.answers.cb_slot!=null){ var ok=cbCurrentSlots().some(function(s){return s.h===state.answers.cb_slot;}); if(!ok) state.answers.cb_slot=null; } slotsEl.innerHTML=cbSlotsHTML(); cbWireSlots(); cbRefreshHours(); cbSyncPrecise(); cbSyncEmpty(); refreshIcons(); }\n      function cbSetZone(tz, label){ state.answers.cb_tz=tz; state.answers.cb_zone=label||cbShortFromTz(tz); cbHint(); cbRefreshSlots(); cbUpdate(); }\n      \/\/ US zone pills\n      wrap.querySelectorAll(\"[data-cbzone]\").forEach(function(btn){ btn.onclick=function(){ wrap.querySelectorAll(\"[data-cbzone]\").forEach(function(b){ b.classList.remove(\"sel\"); }); btn.classList.add(\"sel\"); var ob=wrap.querySelector(\"[data-cbother]\"); if(ob) ob.classList.remove(\"sel\"); if(selEl){ selEl.classList.remove(\"show\"); selEl.value=\"\"; } cbSetZone(btn.getAttribute(\"data-cbtz\"), btn.getAttribute(\"data-cbzone\")); }; });\n      \/\/ \"Other country\" pill -> reveal world-zone select\n      var otherBtn=wrap.querySelector(\"[data-cbother]\");\n      if(otherBtn) otherBtn.onclick=function(){ wrap.querySelectorAll(\"[data-cbzone]\").forEach(function(b){ b.classList.remove(\"sel\"); }); otherBtn.classList.add(\"sel\"); if(selEl){ selEl.classList.add(\"show\"); try{ selEl.focus(); }catch(e){} } };\n      if(selEl) selEl.addEventListener(\"change\", function(){ var tz=selEl.value; if(!tz) return; var opt=selEl.options[selEl.selectedIndex]; var s=opt?opt.getAttribute(\"data-s\"):null; wrap.querySelectorAll(\"[data-cbzone]\").forEach(function(b){ b.classList.remove(\"sel\"); }); if(otherBtn) otherBtn.classList.add(\"sel\"); cbSetZone(tz, s); });\n      \/\/ Day pills (Saturday exclusive)\n      wrap.querySelectorAll(\"[data-cbday]\").forEach(function(btn){ btn.onclick=function(){ var label=btn.getAttribute(\"data-cbday\"); state.answers.cb_days_indif=false; var di=wrap.querySelector(\"[data-cbday-indif]\"); if(di) di.classList.remove(\"sel\"); var arr=state.answers.cb_days||[]; var wasSel=arr.indexOf(label)>-1; if(label===\"Sat\"){ arr=wasSel?[]:[\"Sat\"]; } else { arr=arr.filter(function(x){return x!==\"Sat\";}); var k=arr.indexOf(label); if(k>-1) arr.splice(k,1); else arr.push(label); } state.answers.cb_days=arr; wrap.querySelectorAll(\"[data-cbday]\").forEach(function(b){ b.classList.toggle(\"sel\", arr.indexOf(b.getAttribute(\"data-cbday\"))>-1); }); btn.classList.add(\"pulse\"); setTimeout(function(){btn.classList.remove(\"pulse\");},350); cbRefreshSlots(); cbUpdate(); }; });\n      var dind=wrap.querySelector(\"[data-cbday-indif]\");\n      if(dind) dind.onclick=function(){ var on=!dind.classList.contains(\"sel\"); state.answers.cb_days_indif=on; state.answers.cb_days=[]; wrap.querySelectorAll(\"[data-cbday]\").forEach(function(b){b.classList.remove(\"sel\");}); dind.classList.toggle(\"sel\",on); cbRefreshSlots(); cbUpdate(); };\n      cbWireSlots(); cbWireHours(); cbSyncPrecise(); cbSyncEmpty();\n      if(pRdvBtn) pRdvBtn.onclick=function(){ cbSetRdv(true); };\n      if(rdvBtn) rdvBtn.onclick=function(){ cbSetRdv(!state.answers.cb_rdv); };\n    }\n    if(step.type===\"teach\"){\n      var quiz=wrap.querySelector(\".ole-quiz\");\n      if(quiz){\n        var opts=[].slice.call(quiz.querySelectorAll(\".ole-quiz-opt\")); var reveal=quiz.querySelector(\"#ole-quiz-reveal\");\n        opts.forEach(function(b){ b.onclick=function(){ if(quiz.classList.contains(\"answered\")) return; quiz.classList.add(\"answered\"); var correct=b.getAttribute(\"data-correct\")===\"1\"; opts.forEach(function(x){ var isC=x.getAttribute(\"data-correct\")===\"1\"; if(isC){ x.classList.add(\"correct\"); } if(x===b && !correct){ x.classList.add(\"wrong\"); } x.classList.add(\"locked\"); }); if(reveal) reveal.classList.add(\"show\"); state.reaction=correct?{emoji:\"\\uD83D\\uDC4F\",msg:pickVaried(QUIZ_OK,\"_qok\")}:{emoji:\"\\uD83D\\uDE2C\",msg:pickVaried(QUIZ_KO,\"_qko\")}; renderBadge(true); refreshIcons(); }; });\n      }\n    }\n  }\n\n  function lockAdvance(){ if(state.locked) return; state.locked=true; setTimeout(function(){ state.locked=false; nextStep(); }, 340); }\n\n  \/* =========================================================\n     8) VALIDATION\n     ========================================================= *\/\n  function validate(step){\n    if(step.type===\"contact\") return validateContact();\n    if(!step.required) return true;\n    var v=state.answers[step.id];\n    if(step.type===\"multi\") return Array.isArray(v)&&v.length>0;\n    if(step.type===\"budget\"){ if(!v||v<=0){ setErr(\"budget\",\"Enter your budget to continue.\"); return false; } if(step.min&&v<step.min){ setErr(\"budget\",\"We work on projects from \"+fmt(step.min)+\" and up.\"); return false; } setErr(\"budget\",\"\"); return true; }\n    return !!v;\n  }\n  function validateContact(){\n    var ok=true;\n    [[\"firstname\",\"Enter your first name\"],[\"lastname\",\"Enter your last name\"]].forEach(function(f){ var el=document.getElementById(\"ole-\"+f[0]); var v=el.value.trim(); state.answers[f[0]]=v; setErr(f[0], v?\"\":f[1]); if(!v) ok=false; });\n    var ev=document.getElementById(\"ole-email\").value.trim(); state.answers.email=ev;\n    var emOk=\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(ev); setErr(\"email\", emOk?\"\":\"Please enter a valid email\"); if(!emOk) ok=false;\n    var phoneEl=document.getElementById(\"ole-phone\");\n    if(itiPhone && window.intlTelInputUtils){ var phValid=itiPhone.isValidNumber(); state.answers.phone=phValid?itiPhone.getNumber():phoneEl.value.trim(); setErr(\"phone\", phValid?\"\":\"Invalid number for the selected country\"); if(!phValid) ok=false; }\n    else { var pv=phoneEl.value.trim(); state.answers.phone=pv; var phOk=\/^[+0-9][0-9 ().-]{7,}$\/.test(pv); setErr(\"phone\", phOk?\"\":\"Please enter a valid phone number\"); if(!phOk) ok=false; }\n    return ok;\n  }\n  function setErr(id,msg){ var inp=document.getElementById(\"ole-\"+id), err=document.getElementById(\"err-\"+id); if(!inp) return; inp.classList.toggle(\"err\",!!msg); if(err){ err.textContent=msg||\"\"; err.classList.toggle(\"show\",!!msg); } }\n\n  \/* =========================================================\n     9) NAVIGATION\n     ========================================================= *\/\n  function computeNext(){\n    var cur=STEPS[state.i];\n    if(cur.id===\"service\") return stepIndexById(isRisksPath() ? RISK_IDS[0] : \"callback\");\n    var ei=RISK_IDS.indexOf(cur.id);\n    if(ei>-1) return ei<RISK_IDS.length-1 ? stepIndexById(RISK_IDS[ei+1]) : stepIndexById(\"callback\");\n    var n=state.i+1; while(STEPS[n] && isEdu(STEPS[n].id)) n++; return n;\n  }\n  function skipToContact(){ if(state.busy) return; state.history.push(state.i); transitionTo(stepIndexById(\"callback\"),1); }\n  function nextStep(){ if(state.busy) return; var t=computeNext(); if(t>=STEPS.length) return; state.history.push(state.i); transitionTo(t,1); }\n  function prev(){ if(state.busy || !state.history.length) return; transitionTo(state.history.pop(),-1); }\n  function transitionTo(target,dir){ state.busy=true; lockNow(); scrollFormToTop(); var cur=bodyEl.querySelector(\".ole-step\"); cur.classList.remove(\"in-right\",\"in-left\"); cur.classList.add(dir>0?\"out-left\":\"out-right\"); setTimeout(function(){ state.i=target; render(dir>0?\"in-right\":\"in-left\"); }, 300); }\n  function scrollFormToTop(){ if(!SCROLL_TOTOP) return; try{ var reduce=window.matchMedia&&window.matchMedia(\"(prefers-reduced-motion:reduce)\").matches; window.scrollTo({ top:0, left:0, behavior:reduce?\"auto\":\"smooth\" }); }catch(e){ try{ window.scrollTo(0,0); }catch(_e){} } }\n\n  \/* =========================================================\n     10) HUBSPOT SUBMIT\n     ========================================================= *\/\n  function buildFields(){\n    var a=state.answers,f=HS.fields,out=[];\n    function push(name,val){ if(name&&val!=null&&val!==\"\") out.push({name:name,value:String(val)}); }\n    push(f.timing,a.timing);\n    push(f.worries, Array.isArray(a.worries)?a.worries.join(\";\"):a.worries);\n    push(f.budget,a.budget); push(f.location,a.location);\n    push(f.property,a.property); push(f.motivation,a.motivation); push(f.service,a.service);\n    push(f.cb_rdv, cbWantsRdv() ? \"Yes\" : \"\");\n    push(f.cb_clienttime, cbClientTimeStr());\n    if(!cbWantsRdv()){\n      var z=cbZoneShort();\n      var cbDays = a.cb_days_indif ? \"Any day\" : (Array.isArray(a.cb_days) && a.cb_days.length ? a.cb_days.join(\";\") : \"\");\n      push(f.cb_days, cbDays);\n      var cbd=cbNearestDateObj();\n      if(a.cb_any){\n        push(f.cb_slot, \"Any time (\"+z+\")\");\n        var cbMsA = cbd ? cbSlotStartMs(cbd, cbAllowedHours()[0]!=null?cbAllowedHours()[0]:9) : null;\n        push(f.cb_date, cbMsA!=null ? String(cbMsA) : \"\");\n      } else if(a.cb_precise && a.cb_hour!=null){\n        push(f.cb_slot, fmt12(a.cb_hour)+\" \"+z+\" (exact time requested)\");\n        var cbMsP = cbd ? cbSlotStartMs(cbd, a.cb_hour) : null;\n        push(f.cb_date, cbMsP!=null ? String(cbMsP) : \"\");\n      } else if(a.cb_slot!=null){\n        push(f.cb_slot, cbSlotLabel(a.cb_slot)+\" \"+z);\n        var cbMs = cbd ? cbSlotStartMs(cbd, a.cb_slot) : null;\n        push(f.cb_date, cbMs!=null ? String(cbMs) : \"\");\n      }\n    }\n    push(f.firstname,a.firstname); push(f.lastname,a.lastname); push(f.email, a.email?String(a.email).trim().toLowerCase():a.email); push(f.phone,a.phone);\n    return out;\n  }\n  function submit(){\n    var step=STEPS[state.i];\n    if(!validateContact()) return;\n    var hp=document.getElementById(\"ole-hp\"); if(hp && hp.value){ finish(); return; }\n    if(Date.now()-startTime < 3000){ finish(); return; }\n    var btn=document.getElementById(\"ole-next\"), spin=document.getElementById(\"ole-spin\"), label=document.getElementById(\"ole-next-label\");\n    btn.disabled=true; if(spin) spin.style.display=\"inline-block\"; if(label) label.textContent=\"Sending\u2026\";\n    if(!HS.sendToHubSpot){ console.log(\"[SpainEasy] Payload ready:\", buildFields()); setTimeout(finish,800); return; }\n    var ctx={ pageUri:location.href, pageName:document.title };\n    var hutk=getCookie(\"hubspotutk\"); if(hutk) ctx.hutk=hutk;\n    var payload={ fields:buildFields(), context:ctx };\n    if(HS.subscriptionTypeId){ payload.legalConsentOptions={ legitimateInterest:{ value:true, subscriptionTypeId:HS.subscriptionTypeId, legalBasis:\"LEAD\", text:step.consent } }; }\n    fetch(\"https:\/\/api.hsforms.com\/submissions\/v3\/integration\/submit\/\"+HS.portalId+\"\/\"+HS.formGuid, { method:\"POST\", headers:{\"Content-Type\":\"application\/json\"}, body:JSON.stringify(payload) })\n      .then(function(r){ if(!r.ok) return r.json().then(function(e){throw e;}); return r.json(); })\n      .then(function(){ finish(); })\n      .catch(function(err){ console.error(\"[SpainEasy] HubSpot error:\", err); btn.disabled=false; if(spin) spin.style.display=\"none\"; if(label) label.textContent=\"Try again\"; });\n  }\n  \/* GTM \/ Google Ads conversion \u2014 SpainEasy fires a DISTINCT event so US leads are NEVER\n     mixed with the French \"ole_lead_submit\". Rebuild the same Ads\/Meta\/TikTok\/GA4 tags in\n     the SpainEasy GTM container, triggered on Custom Event = \"spaineasy_lead_submit\". *\/\n  function pushEnhancedConversionEvent(cb){\n    window.dataLayer = window.dataLayer || [];\n    var a=state.answers;\n    var email=(a.email||\"\").trim().toLowerCase();\n    var phone=(a.phone||\"\").replace(\/\\s+\/g,\"\");\n    var first=(a.firstname||\"\").trim();\n    var last=(a.lastname||\"\").trim();\n    window.dataLayer.push({\n      event:\"spaineasy_lead_submit\",\n      brand:\"SpainEasy\",\n      lead_email:email, lead_phone:phone, first_name:first, last_name:last,\n      enhanced_conversion_data:{ email:email, phone_number:phone, first_name:first, last_name:last },\n      lead_form_name:\"spaineasy_property_search\",\n      lead_location:a.location||\"\", lead_budget:a.budget||\"\", lead_currency:\"USD\",\n      eventCallback:function(){ if(cb) cb(); }, eventTimeout:1500\n    });\n  }\n  function buildRedirectUrl(){\n    var a=state.answers;\n    if(cbWantsRdv()){\n      var ru=RDV_URL, rq=[];\n      if(a.firstname){ rq.push(\"firstname=\"+encodeURIComponent(a.firstname)); rq.push(\"firstName=\"+encodeURIComponent(a.firstname)); }\n      if(a.lastname){ rq.push(\"lastname=\"+encodeURIComponent(a.lastname)); rq.push(\"lastName=\"+encodeURIComponent(a.lastname)); }\n      if(a.email){ rq.push(\"email=\"+encodeURIComponent(String(a.email).trim().toLowerCase())); }\n      if(a.phone){ rq.push(\"phone=\"+encodeURIComponent(a.phone)); }\n      if(rq.length) ru += (ru.indexOf(\"?\")>-1?\"&\":\"?\")+rq.join(\"&\");\n      return ru;\n    }\n    var u=HS.redirectUrl, q=[];\n    if(a.firstname) q.push(\"firstname=\"+encodeURIComponent(a.firstname));\n    if(a.location)  q.push(\"location=\"+encodeURIComponent(a.location));\n    if(q.length) u += (u.indexOf(\"?\")>-1?\"&\":\"?\")+q.join(\"&\");\n    return u;\n  }\n  function finish(){\n    var done=false;\n    var redirect=(cbWantsRdv() || HS.redirectUrl) ? buildRedirectUrl() : null;\n    function go(){\n      if(done) return; done=true; clearState();\n      if(redirect){ window.location.href=redirect; return; }\n      barEl.style.width=\"100%\"; footEl.innerHTML=\"\";\n      bodyEl.innerHTML='<div class=\"ole-success\"><div class=\"ole-check\"><svg viewBox=\"0 0 40 40\"><path d=\"M11 21 L17 27 L29 13\"\/><\/svg><\/div><h3>All set \u2014 thank you!<\/h3><p>Our team is reviewing your project and will reach out very soon.<\/p><\/div>';\n    }\n    pushEnhancedConversionEvent(go);\n    setTimeout(go, 1800);\n  }\n\n  \/* =========================================================\n     11) GOOGLE PLACES (optional)\n     ========================================================= *\/\n  function loadGoogleMaps(key, cb){\n    if(window.google && google.maps && google.maps.places){ cb&&cb(); return; }\n    if(document.getElementById(\"ole-gmaps\")){ pollMaps(cb); return; }\n    var s=document.createElement(\"script\"); s.id=\"ole-gmaps\"; s.async=true;\n    s.src=\"https:\/\/maps.googleapis.com\/maps\/api\/js?key=\"+encodeURIComponent(key)+\"&libraries=places&loading=async\";\n    s.onload=function(){ pollMaps(cb); }; s.onerror=function(){ console.warn(\"[SpainEasy] Google Maps failed.\"); };\n    document.head.appendChild(s);\n  }\n  function pollMaps(cb){ var n=0,iv=setInterval(function(){ if(window.google&&google.maps&&google.maps.places){clearInterval(iv);cb&&cb();} else if(++n>40){clearInterval(iv);} },150); }\n  function initLocationAutocomplete(input, pills, step){\n    if(!input || input.dataset.acDone) return; input.dataset.acDone=\"1\";\n    try{\n      var ac=new google.maps.places.Autocomplete(input,{ componentRestrictions:{country:\"es\"}, types:[\"(cities)\"], fields:[\"address_components\",\"name\"] });\n      ac.addListener(\"place_changed\", function(){ var place=ac.getPlace(); if(!place||!place.address_components){ state.answers.location=input.value; return; } var city=place.name, region=\"\"; place.address_components.forEach(function(c){ if(c.types.indexOf(\"administrative_area_level_1\")>-1) region=c.long_name; }); var val=region?(city+\" (\"+region+\")\"):city; setTimeout(function(){ input.value=val; state.answers.location=val; },10); if(pills) pills.forEach(function(p){ p.classList.remove(\"sel\",\"hidden\"); }); setReaction(step, val); lockAdvance(); });\n    }catch(e){ console.warn(\"[SpainEasy] Google Places not initialized:\", e); }\n  }\n\n  \/* =========================================================\n     12) LUCIDE ICONS\n     ========================================================= *\/\n  function loadLucide(){ if(window.lucide){ refreshIcons(); return; } if(document.getElementById(\"ole-lucide\")) return; var s=document.createElement(\"script\"); s.id=\"ole-lucide\"; s.async=true; s.src=\"https:\/\/unpkg.com\/lucide@latest\/dist\/umd\/lucide.min.js\"; s.onload=refreshIcons; s.onerror=function(){ console.warn(\"[SpainEasy] Lucide failed.\"); }; document.head.appendChild(s); }\n\n  \/* =========================================================\n     12b) INTERNATIONAL PHONE (US default)\n     ========================================================= *\/\n  var itiPhone=null, lastPhoneIso=null, phoneBlurred=false;\n  function maybeBlurPhone(input){ try{ if(itiPhone && itiPhone.isValidNumber && itiPhone.isValidNumber()){ if(!phoneBlurred){ phoneBlurred=true; setTimeout(function(){ try{ input.blur(); }catch(e){} try{ var btn=document.getElementById(\"ole-next\"); if(btn){ var r=btn.getBoundingClientRect(); var vh=window.innerHeight||document.documentElement.clientHeight; var delta=r.bottom-vh+26; if(delta>4){ var reduce=window.matchMedia&&window.matchMedia(\"(prefers-reduced-motion:reduce)\").matches; window.scrollBy({top:delta,left:0,behavior:reduce?\"auto\":\"smooth\"}); } } }catch(e){} }, 160); } } else { phoneBlurred=false; } }catch(e){} }\n  var COUNTRY_MSG = {\n    us:{emoji:\"\\uD83C\\uDDFA\\uD83C\\uDDF8\",msg:\"Most of our clients are based in the U.S. \u2014 we guide you in English, every step of the way.\"},\n    ca:{emoji:\"\\uD83C\\uDDE8\\uD83C\\uDDE6\",msg:\"Buying from Canada? We're your eyes and ears on the ground in Spain.\"},\n    gb:{emoji:\"\\uD83C\\uDDEC\\uD83C\\uDDE7\",msg:\"Many UK buyers trust us for a smooth, English-speaking purchase in Spain.\"},\n    es:{emoji:\"\\uD83C\\uDDEA\\uD83C\\uDDF8\",msg:\"Already in Spain? We make every step easier, in English, right beside you.\"}\n  };\n  function showPhoneReaction(){ if(!itiPhone||!itiPhone.getSelectedCountryData) return; var input=document.getElementById(\"ole-phone\"); var el=document.getElementById(\"ole-phone-msg\"); var hasDigits=input&&input.value.replace(\/\\D\/g,\"\").length>0; if(!hasDigits){ if(el){ el.className=\"ole-phone-msg\"; el.innerHTML=\"\"; } lastPhoneIso=null; return; } var iso=(itiPhone.getSelectedCountryData()||{}).iso2; if(iso===lastPhoneIso) return; lastPhoneIso=iso; renderPhoneMsg(COUNTRY_MSG[iso]||null); }\n  function renderPhoneMsg(r){ var el=document.getElementById(\"ole-phone-msg\"); if(!el) return; if(!r){ el.className=\"ole-phone-msg\"; el.innerHTML=\"\"; return; } el.innerHTML='<span class=\"ole-q-mark\">'+String.fromCharCode(8220)+'<\/span><span class=\"ole-phone-cap\">'+esc(r.msg)+'<\/span>'+(r.emoji?'<span class=\"ole-emoji\">'+r.emoji+'<\/span>':''); el.className=\"ole-phone-msg show\"; void el.offsetWidth; el.classList.add(\"bumpp\"); setTimeout(function(){ el.classList.remove(\"bumpp\"); },430); }\n  function loadIntlTel(cb){ if(window.intlTelInput){ cb&&cb(); return; } if(document.getElementById(\"ole-iti-js\")){ var n=0,iv=setInterval(function(){ if(window.intlTelInput){clearInterval(iv);cb&&cb();} else if(++n>60){clearInterval(iv);} },150); return; } var css=document.createElement(\"link\"); css.rel=\"stylesheet\"; css.href=\"https:\/\/cdn.jsdelivr.net\/npm\/intl-tel-input@18.2.1\/build\/css\/intlTelInput.css\"; document.head.appendChild(css); var s=document.createElement(\"script\"); s.id=\"ole-iti-js\"; s.async=true; s.src=\"https:\/\/cdn.jsdelivr.net\/npm\/intl-tel-input@18.2.1\/build\/js\/intlTelInput.min.js\"; s.onload=function(){ cb&&cb(); }; s.onerror=function(){ console.warn(\"[SpainEasy] intl-tel-input not loaded (simple field fallback).\"); }; document.head.appendChild(s); }\n  var PHONE_TPL_CACHE={};\n  function phoneTemplate(iso){ if(!iso) return null; if(PHONE_TPL_CACHE[iso]!==undefined) return PHONE_TPL_CACHE[iso]; var tpl=null; try{ var U=window.intlTelInputUtils; if(U){ var ex=U.getExampleNumber(iso,false,U.numberType.MOBILE); var nat=ex?U.formatNumber(ex,iso,U.numberFormat.NATIONAL):\"\"; if(nat&&\/\\d\/.test(nat)) tpl=nat.replace(\/\\d\/g,\"D\"); } }catch(e){} PHONE_TPL_CACHE[iso]=tpl; return tpl; }\n  function applyPhoneTemplate(digits, tpl){ if(!tpl) return digits; var out=\"\",di=0; for(var i=0;i<tpl.length&&di<digits.length;i++){ out += (tpl.charAt(i)===\"D\")?digits.charAt(di++):tpl.charAt(i); } if(di<digits.length) out += digits.slice(di); return out; }\n  function formatPhoneLive(el){ if(!el||!itiPhone||!itiPhone.getSelectedCountryData) return; var iso=(itiPhone.getSelectedCountryData()||{}).iso2; var tpl=phoneTemplate(iso); if(!tpl) return; var raw=el.value, caret=(el.selectionStart==null)?raw.length:el.selectionStart; var before=raw.slice(0,caret).replace(\/\\D\/g,\"\").length; var digits=raw.replace(\/\\D\/g,\"\"); var exact=null; try{ if(itiPhone.isValidNumber&&itiPhone.isValidNumber()){ exact=window.intlTelInputUtils.formatNumber(itiPhone.getNumber(),iso,window.intlTelInputUtils.numberFormat.NATIONAL); } }catch(e){} var f=exact||applyPhoneTemplate(digits,tpl); if(f===raw) return; el.value=f; var pos=0,seen=0; while(pos<f.length&&seen<before){ var c=f.charCodeAt(pos); if(c>=48&&c<=57) seen++; pos++; } try{ el.setSelectionRange(pos,pos); }catch(e){} }\n  \/\/ Adapt the phone country to the visitor: browser locale -> timezone -> IP (with fallback).\n  var TZ_COUNTRY = { \"America\/New_York\":\"us\",\"America\/Detroit\":\"us\",\"America\/Chicago\":\"us\",\"America\/Denver\":\"us\",\"America\/Phoenix\":\"us\",\"America\/Los_Angeles\":\"us\",\"America\/Anchorage\":\"us\",\"Pacific\/Honolulu\":\"us\",\"America\/Toronto\":\"ca\",\"America\/Vancouver\":\"ca\",\"America\/Edmonton\":\"ca\",\"America\/Mexico_City\":\"mx\",\"America\/Sao_Paulo\":\"br\",\"America\/Argentina\/Buenos_Aires\":\"ar\",\"Europe\/London\":\"gb\",\"Europe\/Dublin\":\"ie\",\"Europe\/Paris\":\"fr\",\"Europe\/Madrid\":\"es\",\"Europe\/Berlin\":\"de\",\"Europe\/Lisbon\":\"pt\",\"Europe\/Athens\":\"gr\",\"Europe\/Istanbul\":\"tr\",\"Asia\/Dubai\":\"ae\",\"Asia\/Kolkata\":\"in\",\"Asia\/Singapore\":\"sg\",\"Asia\/Hong_Kong\":\"hk\",\"Asia\/Tokyo\":\"jp\",\"Australia\/Sydney\":\"au\",\"Australia\/Perth\":\"au\",\"Pacific\/Auckland\":\"nz\",\"Africa\/Johannesburg\":\"za\",\"Africa\/Casablanca\":\"ma\",\"Asia\/Jerusalem\":\"il\" };\n  function guessCountryBrowser(){\n    try{ var langs=navigator.languages||[navigator.language||\"\"]; for(var i=0;i<langs.length;i++){ var m=String(langs[i]||\"\").match(\/-([A-Za-z]{2})$\/); if(m) return m[1].toLowerCase(); } }catch(e){}\n    try{ var tz=Intl.DateTimeFormat().resolvedOptions().timeZone||\"\"; if(TZ_COUNTRY[tz]) return TZ_COUNTRY[tz]; }catch(e){}\n    return \"us\";\n  }\n  function geoLookup(cb){\n    var done=false; function fin(c){ if(done) return; done=true; cb((c||\"us\").toLowerCase()); }\n    var t=setTimeout(function(){ fin(guessCountryBrowser()); }, 1300);\n    try{ fetch(\"https:\/\/ipapi.co\/json\/\").then(function(r){ return r.json(); }).then(function(d){ clearTimeout(t); fin((d&&d.country_code?String(d.country_code):\"\")||guessCountryBrowser()); }).catch(function(){ clearTimeout(t); fin(guessCountryBrowser()); }); }\n    catch(e){ clearTimeout(t); fin(guessCountryBrowser()); }\n  }\n  function initPhone(wrap){ var input=(wrap||document).querySelector(\"#ole-phone\"); if(!input||input.dataset.itiDone) return; loadIntlTel(function(){ if(!window.intlTelInput||input.dataset.itiDone) return; input.dataset.itiDone=\"1\"; try{ itiPhone=window.intlTelInput(input,{ initialCountry:\"auto\", geoIpLookup:geoLookup, preferredCountries:[\"us\",\"ca\",\"gb\",\"es\"], separateDialCode:true, autoPlaceholder:\"aggressive\", dropdownContainer:document.body, utilsScript:\"https:\/\/cdn.jsdelivr.net\/npm\/intl-tel-input@18.2.1\/build\/js\/utils.js\" }); lastPhoneIso=null; phoneBlurred=false; input.addEventListener(\"input\",function(){ setErr(\"phone\",\"\"); formatPhoneLive(input); showPhoneReaction(); maybeBlurPhone(input); }); input.addEventListener(\"countrychange\",function(){ setErr(\"phone\",\"\"); formatPhoneLive(input); showPhoneReaction(); }); }catch(e){ console.warn(\"[SpainEasy] international phone not initialized:\", e); itiPhone=null; } }); }\n\n  \/* =========================================================\n     13) BOOT\n     ========================================================= *\/\n  loadLucide(); loadIntlTel();\n  if(HS.googleMapsKey) loadGoogleMaps(HS.googleMapsKey, function(){ gMapsReady=true; });\n  loadState();\n  function oleSlug(s){ return String(s||\"\").toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g,\"\").replace(\/[^a-z0-9]+\/g,\"-\").replace(\/^-+|-+$\/g,\"\"); }\n  var LIEU_ALIAS={ \"valence\":\"Valencia\",\"barcelone\":\"Barcelona\",\"seville\":\"Seville\",\"sevilla\":\"Seville\",\"costa-del-sol\":\"Costa del Sol\",\"costa-blanca\":\"Costa Blanca\",\"costa-brava\":\"Costa Brava\",\"andalusia\":\"Andalusia\",\"andalousie\":\"Andalusia\",\"mallorca\":\"Palma de Mallorca\",\"majorca\":\"Palma de Mallorca\" };\n  (function prefillFromUrl(){ var p; try{ p=new URLSearchParams(window.location.search); }catch(e){ return; } var lieu=p.get(\"location\")||p.get(\"lieu\"); if(!lieu) return; var slug=oleSlug(lieu), loc=STEPS[stepIndexById(\"location\")], label=null; if(LIEU_ALIAS[slug]) label=LIEU_ALIAS[slug]; if(!label && loc){ var all=(loc.cities||[]).concat(loc.regions||[]); for(var i=0;i<all.length;i++){ if(oleSlug(all[i])===slug){ label=all[i]; break; } } } if(!label){ label=slug.split(\"-\").map(function(w){ return w?w.charAt(0).toUpperCase()+w.slice(1):w; }).join(\" \"); } state.answers.location=label; })();\n  render(\"in-right\");\n})();\n<\/script><\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":11871,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"100-width.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-3180","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SpainEasy - Property Search<\/title>\n<meta name=\"description\" content=\"Start your property search by answering our questions. We will get back to you soon to arrange a meeting.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/spaineasy.com\/fr\/property-search\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SpainEasy - Property Search\" \/>\n<meta property=\"og:description\" content=\"Start your property search by answering our questions. We will get back to you soon to arrange a meeting.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/spaineasy.com\/fr\/property-search\/\" \/>\n<meta property=\"og:site_name\" content=\"SpainEasy\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/SpainEasyEstate\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-08T17:16:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"21 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/property-search\\\/\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/property-search\\\/\",\"name\":\"SpainEasy - Property Search\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/property-search\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/property-search\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg\",\"datePublished\":\"2022-06-16T15:14:22+00:00\",\"dateModified\":\"2026-09-08T17:16:10+00:00\",\"description\":\"Start your property search by answering our questions. We will get back to you soon to arrange a meeting.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/property-search\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/spaineasy.com\\\/fr\\\/property-search\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/property-search\\\/#primaryimage\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg\",\"contentUrl\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Maison luxueuse en Espagne avec piscine \u00e0 l'int\u00e9rieur\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/property-search\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Property Search\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/\",\"name\":\"SpainEasy\",\"description\":\"Your personal English-speaking real estate agent in Spain.\",\"publisher\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/#organization\",\"name\":\"SpainEasy\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/spaineasy192.png\",\"contentUrl\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/spaineasy192.png\",\"width\":192,\"height\":192,\"caption\":\"SpainEasy\"},\"image\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/SpainEasyEstate\",\"https:\\\/\\\/www.youtube.com\\\/watch?v=mq5f8eHO6l8\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SpainEasy - Property Search","description":"Start your property search by answering our questions. We will get back to you soon to arrange a meeting.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/spaineasy.com\/fr\/property-search\/","og_locale":"fr_FR","og_type":"article","og_title":"SpainEasy - Property Search","og_description":"Start your property search by answering our questions. We will get back to you soon to arrange a meeting.","og_url":"https:\/\/spaineasy.com\/fr\/property-search\/","og_site_name":"SpainEasy","article_publisher":"https:\/\/www.facebook.com\/SpainEasyEstate","article_modified_time":"2026-09-08T17:16:10+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"21 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/spaineasy.com\/fr\/property-search\/","url":"https:\/\/spaineasy.com\/fr\/property-search\/","name":"SpainEasy - Property Search","isPartOf":{"@id":"https:\/\/spaineasy.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/spaineasy.com\/fr\/property-search\/#primaryimage"},"image":{"@id":"https:\/\/spaineasy.com\/fr\/property-search\/#primaryimage"},"thumbnailUrl":"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg","datePublished":"2022-06-16T15:14:22+00:00","dateModified":"2026-09-08T17:16:10+00:00","description":"Start your property search by answering our questions. We will get back to you soon to arrange a meeting.","breadcrumb":{"@id":"https:\/\/spaineasy.com\/fr\/property-search\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/spaineasy.com\/fr\/property-search\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/spaineasy.com\/fr\/property-search\/#primaryimage","url":"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg","contentUrl":"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg","width":1200,"height":630,"caption":"Maison luxueuse en Espagne avec piscine \u00e0 l'int\u00e9rieur"},{"@type":"BreadcrumbList","@id":"https:\/\/spaineasy.com\/fr\/property-search\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/spaineasy.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Property Search"}]},{"@type":"WebSite","@id":"https:\/\/spaineasy.com\/fr\/#website","url":"https:\/\/spaineasy.com\/fr\/","name":"SpainEasy","description":"Your personal English-speaking real estate agent in Spain.","publisher":{"@id":"https:\/\/spaineasy.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/spaineasy.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/spaineasy.com\/fr\/#organization","name":"SpainEasy","url":"https:\/\/spaineasy.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/spaineasy.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/spaineasy.com\/wp-content\/uploads\/2024\/03\/spaineasy192.png","contentUrl":"https:\/\/spaineasy.com\/wp-content\/uploads\/2024\/03\/spaineasy192.png","width":192,"height":192,"caption":"SpainEasy"},"image":{"@id":"https:\/\/spaineasy.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SpainEasyEstate","https:\/\/www.youtube.com\/watch?v=mq5f8eHO6l8"]}]}},"_links":{"self":[{"href":"https:\/\/spaineasy.com\/fr\/wp-json\/wp\/v2\/pages\/3180","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spaineasy.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spaineasy.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spaineasy.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spaineasy.com\/fr\/wp-json\/wp\/v2\/comments?post=3180"}],"version-history":[{"count":21,"href":"https:\/\/spaineasy.com\/fr\/wp-json\/wp\/v2\/pages\/3180\/revisions"}],"predecessor-version":[{"id":40966,"href":"https:\/\/spaineasy.com\/fr\/wp-json\/wp\/v2\/pages\/3180\/revisions\/40966"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spaineasy.com\/fr\/wp-json\/wp\/v2\/media\/11871"}],"wp:attachment":[{"href":"https:\/\/spaineasy.com\/fr\/wp-json\/wp\/v2\/media?parent=3180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}