{"id":46084,"date":"2026-10-12T11:57:16","date_gmt":"2026-10-12T15:57:16","guid":{"rendered":"https:\/\/prodispo.ca\/prodispo-search-results\/"},"modified":"2026-10-16T12:03:07","modified_gmt":"2026-10-16T16:03:07","slug":"results-search","status":"publish","type":"page","link":"https:\/\/prodispo.ca\/en\/results-search\/","title":{"rendered":"ProDispo &#8211; Search Results"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"46084\" class=\"elementor elementor-46084 elementor-45758\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d267c7d e-flex e-con-boxed e-con e-parent\" data-id=\"d267c7d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-692a3f6 elementor-widget elementor-widget-html\" data-id=\"692a3f6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n<div id=\"pd-ia-test\">\n<style>\n#pd-ia-test{\n  max-width:780px;\n  margin:30px auto;\n  padding:26px;\n  background:#fff;\n  color:#0a1a44;\n  border:1px solid #e1e8f5;\n  border-radius:18px;\n  box-shadow:0 8px 24px rgba(10,26,68,.07);\n  font-family:inherit;\n}\n#pd-ia-test *{box-sizing:border-box}\n#pd-ia-test [hidden]{display:none!important}\n\n#pd-ia-test h2{\n  margin:0 0 10px;\n  font-size:25px;\n  font-weight:700;\n  text-align:center;\n  color:#0a1a44;\n}\n#pd-ia-test .pd-subtitle{\n  margin:0 0 20px;\n  color:#667085;\n  text-align:center;\n  line-height:1.5;\n}\n\n\/* Grande barre de recherche *\/\n\n#pd-ia-test .pd-input-wrap{\n  position:relative;\n  border:1px solid #dce3ec;\n  border-radius:14px;\n  background:#fff;\n  min-height:210px;\n  overflow:hidden;\n}\n#pd-ia-test .pd-input-wrap:focus-within{\n  border-color:#0a1a44;\n  box-shadow:0 0 0 3px rgba(10,26,68,.08);\n}\n#pd-ia-test textarea{\n  display:block;\n  width:100%;\n  height:125px;\n  min-height:125px;\n  padding:19px 53px 15px 19px;\n  background:transparent;\n  color:#0a1a44;\n  border:0!important;\n  border-radius:0;\n  outline:none!important;\n  box-shadow:none!important;\n  font:inherit;\n  font-size:16px;\n  line-height:1.65;\n  resize:none;\n}\n#pd-ia-test textarea::placeholder{\n  color:#8b95a5;\n  opacity:1;\n}\n#pd-ia-test .pd-input-notice{\n  position:absolute;\n  left:19px;\n  right:70px;\n  bottom:18px;\n  margin:0;\n  color:#8b95a5;\n  font-size:12px;\n  line-height:1.6;\n  pointer-events:none;\n}\n#pd-ia-test .pd-clear-main{\n  position:absolute;\n  top:12px;\n  right:12px;\n  width:31px;\n  height:31px;\n  padding:0;\n  border:0;\n  border-radius:50%;\n  background:#f2f5fa;\n  color:#0a1a44;\n  font:inherit;\n  font-size:22px;\n  line-height:1;\n  cursor:pointer;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n}\n#pd-ia-test .pd-clear-main:hover{\n  background:#e4eaf4;\n}\n\n\/* Indicateur d'analyse dans la barre *\/\n\n#pd-ia-test .pd-analysis-loading{\n  position:absolute;\n  inset:0;\n  z-index:5;\n  display:flex;\n  flex-direction:column;\n  align-items:center;\n  justify-content:center;\n  gap:12px;\n  background:rgba(255,255,255,.97);\n  border-radius:14px;\n  color:#0a1a44;\n  font-size:16px;\n  font-weight:600;\n}\n#pd-ia-test .pd-analysis-spinner{\n  width:38px;\n  height:38px;\n  border:3px solid #dce3ec;\n  border-top-color:#0a1a44;\n  border-radius:50%;\n  animation:pd-ia-spin .75s linear infinite;\n}\n\n\/* Microphones et g\u00e9olocalisation *\/\n\n#pd-ia-test .pd-mic,\n#pd-ia-test .pd-geolocate{\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  flex:0 0 40px;\n  width:40px;\n  height:40px;\n  padding:0;\n  border:1px solid #dce3ec;\n  border-radius:50%;\n  background:#f2f5fa;\n  color:#0a1a44;\n  cursor:pointer;\n}\n#pd-ia-test .pd-mic-main{\n  position:absolute;\n  right:13px;\n  bottom:13px;\n}\n#pd-ia-test .pd-mic svg,\n#pd-ia-test .pd-geolocate svg{\n  width:20px;\n  height:20px;\n  fill:none;\n  stroke:currentColor;\n  stroke-width:2;\n  stroke-linecap:round;\n  stroke-linejoin:round;\n}\n#pd-ia-test .pd-mic.is-listening{\n  background:#c62828;\n  border-color:#c62828;\n  color:#fff;\n}\n#pd-ia-test .pd-mic.is-listening:hover{\n  background:#c62828;\n}\n#pd-ia-test .pd-mic:hover:not(:disabled),\n#pd-ia-test .pd-geolocate:hover:not(:disabled){\n  background:#e4eaf4;\n}\n#pd-ia-test .pd-mic:disabled,\n#pd-ia-test .pd-geolocate:disabled{\n  opacity:.45;\n  cursor:not-allowed;\n}\n\n\/* Messages *\/\n\n#pd-ia-test .pd-status{\n  min-height:0;\n  margin-top:7px;\n  color:#667085;\n  font-size:13px;\n  line-height:1.5;\n}\n#pd-ia-test .pd-status:empty{\n  display:none;\n}\n#pd-ia-test .pd-status.is-error{\n  color:#b42318;\n}\n\n\/* Zone des crit\u00e8res *\/\n\n#pd-ia-test .pd-review{\n  margin-top:22px;\n  padding:20px;\n  background:#f7f9fd;\n  border:1px solid #e1e8f5;\n  border-radius:14px;\n}\n#pd-ia-test .pd-review-intro{\n  margin:0 0 15px;\n  color:#667085;\n  font-size:14px;\n  line-height:1.5;\n}\n#pd-ia-test .pd-field{\n  position:relative;\n  padding:12px 0;\n  border-bottom:1px solid #e1e8f5;\n}\n#pd-ia-test .pd-field:last-child{\n  border-bottom:0;\n}\n#pd-ia-test .pd-field-heading{\n  display:flex;\n  align-items:center;\n  flex-wrap:wrap;\n  gap:7px 10px;\n  margin-bottom:7px;\n}\n#pd-ia-test .pd-field-title{\n  display:inline-block;\n  margin:0;\n  color:#0a1a44;\n  font-size:14px;\n  font-weight:600;\n}\n#pd-ia-test .pd-selected{\n  display:flex;\n  flex-wrap:wrap;\n  align-items:center;\n  gap:6px;\n  min-width:0;\n}\n#pd-ia-test .pd-chip{\n  display:inline-flex;\n  align-items:center;\n  gap:7px;\n  max-width:100%;\n  padding:5px 9px;\n  background:#fff;\n  color:#0a1a44;\n  border:1px solid #dce3ec;\n  border-radius:999px;\n  font-size:13px;\n  line-height:1.4;\n}\n#pd-ia-test .pd-chip-label{\n  overflow-wrap:anywhere;\n}\n#pd-ia-test .pd-chip button{\n  flex-shrink:0;\n  padding:0 2px;\n  border:0;\n  background:transparent;\n  color:#667085;\n  font-size:17px;\n  line-height:1;\n  cursor:pointer;\n}\n#pd-ia-test .pd-chip button:hover{\n  color:#b42318;\n}\n#pd-ia-test .pd-field-controls{\n  display:flex;\n  align-items:center;\n  gap:8px;\n}\n#pd-ia-test .pd-input-holder{\n  position:relative;\n  flex:1;\n  min-width:0;\n}\n#pd-ia-test .pd-field-input{\n  display:block;\n  width:100%;\n  height:44px;\n  padding:9px 12px;\n  background:#fff;\n  color:#0a1a44;\n  border:1px solid #dce3ec;\n  border-radius:10px;\n  font:inherit;\n  font-size:15px;\n}\n#pd-ia-test .pd-field-input:focus{\n  outline:none;\n  border-color:#0a1a44;\n  box-shadow:0 0 0 3px rgba(10,26,68,.08);\n}\n#pd-ia-test .pd-field-input::placeholder{\n  color:#8b95a5;\n  opacity:1;\n}\n#pd-ia-test .pd-clear-field{\n  flex:0 0 25px;\n  width:25px;\n  height:35px;\n  padding:0;\n  border:0;\n  background:transparent;\n  color:#667085;\n  font-size:21px;\n  cursor:pointer;\n}\n#pd-ia-test .pd-dropdown{\n  position:absolute;\n  z-index:9999;\n  top:calc(100% + 4px);\n  left:0;\n  right:0;\n  max-height:210px;\n  overflow-y:auto;\n  background:#fff;\n  border:1px solid #dce3ec;\n  border-radius:10px;\n  box-shadow:0 8px 20px rgba(10,26,68,.12);\n}\n#pd-ia-test .pd-option{\n  display:block;\n  width:100%;\n  padding:11px 12px;\n  border:0;\n  border-bottom:1px solid #edf0f5;\n  background:#fff;\n  color:#0a1a44;\n  font:inherit;\n  font-size:14px;\n  text-align:left;\n  cursor:pointer;\n}\n#pd-ia-test .pd-option:hover{\n  background:#eef3fb;\n}\n#pd-ia-test .pd-field-message{\n  margin-top:6px;\n  color:#b42318;\n  font-size:13px;\n}\n#pd-ia-test .pd-field-message.is-info{\n  color:#667085;\n}\n#pd-ia-test .pd-spinner{\n  display:inline-block;\n  width:16px;\n  height:16px;\n  flex:0 0 16px;\n  border:2px solid #d5deee;\n  border-top-color:#0a1a44;\n  border-radius:50%;\n  animation:pd-ia-spin .75s linear infinite;\n}\n#pd-ia-test .pd-field.is-processing .pd-field-input{\n  background:#fbfcff;\n}\n\n\/* Boutons finaux *\/\n\n#pd-ia-test .pd-actions{\n  display:flex;\n  flex-wrap:wrap;\n  gap:10px;\n  margin-top:15px;\n}\n#pd-ia-test .pd-button{\n  padding:13px 19px;\n  border:0;\n  border-radius:999px;\n  font:inherit;\n  font-size:15px;\n  font-weight:600;\n  cursor:pointer;\n}\n#pd-ia-test .pd-primary{\n  flex:1;\n  background:#0a1a44;\n  color:#fff;\n}\n#pd-ia-test .pd-primary:hover{\n  background:#173477;\n}\n#pd-ia-test .pd-secondary{\n  background:#f0f3f8;\n  color:#0a1a44;\n}\n\n@keyframes pd-ia-spin{\n  to{transform:rotate(360deg)}\n}\n\n@media(max-width:600px){\n  #pd-ia-test{\n    margin:15px auto;\n    padding:18px 14px;\n  }\n  #pd-ia-test h2{\n    font-size:21px;\n  }\n #pd-ia-test .pd-input-wrap{\n  min-height:245px;\n}\n#pd-ia-test textarea{\n  height:150px;\n  min-height:150px;\n}\n  #pd-ia-test .pd-input-notice{\n    right:65px;\n    font-size:11px;\n  }\n  #pd-ia-test .pd-review{\n    padding:14px;\n  }\n  #pd-ia-test .pd-actions{\n    flex-direction:column;\n  }\n  #pd-ia-test .pd-mic,\n  #pd-ia-test .pd-geolocate{\n    flex-basis:38px;\n    width:38px;\n    height:38px;\n  }\n}\n\n\/* R\u00e9sum\u00e9 compact et filtres d\u00e9pliables *\/\n#pd-ia-test .pd-review{margin-top:15px;padding:0;background:transparent;border:0;border-radius:0}\n#pd-ia-test .pd-criteria-summary{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px}\n#pd-ia-test .pd-summary-chip{display:inline-flex;align-items:center;gap:7px;max-width:100%;padding:6px 10px;background:#f3f7ff;border:1px solid #dce3ec;border-radius:999px;color:#0a1a44;font-size:13px;line-height:1.4}\n#pd-ia-test .pd-summary-chip>span{overflow-wrap:anywhere}\n#pd-ia-test .pd-summary-chip button{padding:0 2px;border:0;background:transparent;color:#667085;font-size:17px;cursor:pointer;line-height:1}\n#pd-ia-test .pd-summary-empty{font-size:13px;color:#667085}\n#pd-ia-test .pd-toggle-filters{display:inline-flex;align-items:center;gap:7px;width:auto;padding:6px 0;border:0;background:transparent;color:#0a1a44;font:inherit;font-size:13px;text-decoration:underline;text-underline-offset:3px;cursor:pointer}\n#pd-ia-test .pd-toggle-filters span{display:inline-block;transition:transform .15s}\n#pd-ia-test .pd-toggle-filters[aria-expanded=\"true\"] span{transform:rotate(180deg)}\n#pd-ia-test .pd-filters-panel{margin-top:12px;padding:14px 17px;background:#f7f9fd;border:1px solid #e1e8f5;border-radius:12px}\n#pd-ia-test .pd-actions{display:flex;justify-content:flex-start;align-items:center;flex-direction:row;flex-wrap:wrap;gap:15px;margin-top:14px}\n#pd-ia-test #pd-ia-see-results{display:inline-flex;flex:0 0 auto;width:auto;min-width:0;padding:9px 15px;border-radius:999px;background:#0a1a44;color:#fff;font-size:13px;line-height:1.4;box-shadow:none}\n#pd-ia-test #pd-ia-back{display:inline-flex;flex:0 0 auto;width:auto;min-width:0;padding:6px 0;border:0;border-radius:0;background:transparent;color:#667085;font-size:13px;font-weight:400;text-decoration:underline;text-underline-offset:3px;box-shadow:none}\n#pd-ia-test #pd-ia-back:hover{background:transparent;color:#0a1a44}\n@media(max-width:600px){#pd-ia-test .pd-review{padding:0}#pd-ia-test .pd-actions{flex-direction:row;gap:12px}#pd-ia-test .pd-filters-panel{padding:12px}}\n\n\n\/* Bureau : le logo reste visible, sans marge n\u00e9gative ni chevauchement. *\/\n@media (min-width:1025px){\n  #pd-ia-test #pd-ia-start > .pd-brand-logo{\n    display:block!important;\n    width:min(420px,85%)!important;\n    max-width:100%!important;\n    height:auto!important;\n    max-height:none!important;\n    margin:0 auto 0px!important;\n    position:relative!important;\n    top:auto!important;\n    transform:none!important;\n    object-fit:contain!important;\n  }\n  #pd-ia-test #pd-ia-start > .pd-input-wrap{\n    position:relative!important;\n    top:auto!important;\n    margin-top:0!important;\n  }\n  #pd-ia-test #pd-ia-start > .pd-search-example{\n    position:relative!important;\n    top:auto!important;\n  }\n}\n\n\/* Pr\u00e9sentation \u00e9pur\u00e9e de la recherche \u2014 moteur JS conserv\u00e9 *\/\n#pd-ia-test{\n  max-width:1100px;\n  margin:0 auto;\n  padding:0 22px 40px;\n  background:transparent;\n  border:0;\n  border-radius:0;\n  box-shadow:none;\n}\n#pd-ia-test #pd-ia-start{text-align:center}\n\n#pd-ia-test .pd-brand-logo{\n  display:block;\n  width:min(420px,85%);\n  height:auto;\n  max-height:none;\n  object-fit:contain;\n  margin:0 auto 32px;\n}\n\n#pd-ia-test h2{\n  margin:0 auto 28px;\n  font-size:clamp(19px,2.4vw,30px);\n  font-weight:700;\n  line-height:1.35;\n  color:#0a1a44;\n}\n\n\n#pd-ia-test .pd-hero-title{\n  display:flex;\n  justify-content:center;\n  align-items:center;\n  flex-wrap:wrap;\n  column-gap:65px;\n  row-gap:10px;\n}\n\n#pd-ia-test .pd-hero-arrow{\n  font-weight:400;\n  color:#71809b;\n}\n\n@media(max-width:600px){\n  #pd-ia-test .pd-hero-title{\n    column-gap:16px;\n    row-gap:6px;\n  }\n}\n\n\n#pd-ia-test .pd-input-wrap{\n  min-height:76px;\n  height:auto;\n  border:1px solid #e1e6ef;\n  border-radius:999px;\n  background:#fff;\n  box-shadow:0 9px 25px rgba(10,26,68,.09);\n  overflow:hidden;\n}\n#pd-ia-test .pd-input-wrap:focus-within{\n  border-color:#b6c5df;\n  box-shadow:0 9px 25px rgba(10,26,68,.09);\n}\n#pd-ia-test .pd-search-icon{\n  position:absolute;\n  top:50%;left:26px;\n  width:24px;height:24px;\n  transform:translateY(-50%);\n  fill:none;stroke:#697995;stroke-width:2;\n  stroke-linecap:round;\n  pointer-events:none;\n}\n#pd-ia-test textarea{\n  display:block;\n  height:74px;\n  min-height:74px;\n  padding:23px 115px 15px 73px;\n  line-height:1.5;\n  font-size:18px;\n  text-align:left;\n  resize:none;\n}\n#pd-ia-test .pd-clear-main{\n  top:50%;right:79px;\n  transform:translateY(-50%);\n  width:27px;height:27px;\n  font-size:19px;\n  background:transparent;\n}\n#pd-ia-test .pd-mic-main{\n  top:50%;right:13px;bottom:auto;\n  transform:translateY(-50%);\n  width:49px;height:49px;\n  border:0;\n  background:#f0f5fb;\n}\n#pd-ia-test .pd-mic-main svg{width:25px;height:25px}\n#pd-ia-test .pd-search-example{\n  margin:24px auto 0;\n  color:#72809e;\n  font-size:15px;\n  line-height:1.5;\n  text-align:center;\n}\n#pd-ia-test .pd-analysis-loading{border-radius:999px}\n#pd-ia-test .pd-review{max-width:100%;margin-top:20px}\n@media(max-width:600px){\n  #pd-ia-test{padding:22px 12px 30px;margin:0 auto}\n#pd-ia-test .pd-brand-logo{width:min(300px,85%);margin-bottom:24px}\n  #pd-ia-test h2{font-size:19px;margin-bottom:22px}\n  #pd-ia-test .pd-input-wrap{min-height:65px}\n  #pd-ia-test .pd-search-icon{left:17px;width:20px;height:20px}\n  #pd-ia-test textarea{height:64px;min-height:64px;padding:20px 89px 12px 48px;font-size:15px}\n  #pd-ia-test .pd-mic-main{width:40px;height:40px;right:9px}\n  #pd-ia-test .pd-mic-main svg{width:21px;height:21px}\n  #pd-ia-test .pd-clear-main{right:54px;width:23px;height:23px}\n  #pd-ia-test .pd-search-example{font-size:13px;margin-top:14px}\n}\n@media(max-width:600px){\n  #pd-ia-test{\n    margin-top:0;\n  }\n}\n\n\/* Positionnement naturel : logo, barre et exemple restent dans le flux de page. *\/\n#pd-ia-test .pd-hero-title,\n#pd-ia-test .pd-input-wrap,\n#pd-ia-test .pd-search-example{\n  position:relative;\n  top:auto;\n}\n\n\n\/* ===== R\u00e9sultats sur une seule ligne, sans d\u00e9placer la recherche ===== *\/\n#pd-ia-test .pd-review{\n  position:relative; top:auto;\n  margin-top:28px; padding:18px 20px 20px;\n  border:1px solid #e1e8f5; border-radius:16px;\n  background:#fff; box-shadow:0 6px 22px rgba(10,26,68,.045);\n}\n#pd-ia-test .pd-analysis-intro{\n  margin:0 0 18px; font-size:17px; font-weight:600;\n  color:#0a1a44; line-height:1.45;\n}\n#pd-ia-test .pd-criteria-summary,\n#pd-ia-test .pd-toggle-filters{display:none!important}\n#pd-ia-test .pd-filters-panel{\n  display:block; margin:0; padding:0; border:0;\n  background:transparent; overflow:visible;\n}\n#pd-ia-test #pd-ia-fields{\n  display:grid; grid-template-columns:repeat(7,minmax(0,1fr));\n  gap:8px; align-items:start;\n}\n#pd-ia-test .pd-field{\n  position:relative; min-width:0; padding:0 5px 8px;\n  border:0; border-right:1px solid #e9edf5;\n}\n#pd-ia-test .pd-field:last-child{border-right:0}\n#pd-ia-test .pd-field-heading{\n  display:block; margin:0; min-width:0;\n}\n#pd-ia-test .pd-field-title{\n  display:block; width:100%; min-height:37px;\n  padding:5px 3px; border:0; background:transparent;\n  color:#0a1a44; font:inherit; font-size:12px;\n  font-weight:700; text-align:left; line-height:1.25;\n  cursor:pointer; overflow-wrap:anywhere;\n}\n#pd-ia-test .pd-field-title:hover,\n#pd-ia-test .pd-field-title[aria-expanded=\"true\"]{color:#2858a8}\n#pd-ia-test .pd-field-title::after{content:\" \u25be\"; color:#8392ab; font-size:11px}\n#pd-ia-test .pd-selected{\n  display:flex; flex-wrap:wrap; gap:4px;\n  min-height:32px; align-content:flex-start; padding:3px 0;\n}\n#pd-ia-test .pd-chip{\n  padding:4px 6px; border-radius:7px; font-size:11px;\n  line-height:1.3; gap:4px; overflow-wrap:anywhere;\n}\n#pd-ia-test .pd-chip button{font-size:15px}\n#pd-ia-test .pd-field-controls{\n  position:absolute; top:100%; left:0;\n  z-index:100; width:clamp(250px,27vw,355px);\n  display:flex; padding:11px; border:1px solid #dce3ec;\n  border-radius:12px; background:#fff;\n  box-shadow:0 12px 32px rgba(10,26,68,.17);\n}\n#pd-ia-test .pd-field:nth-child(n+5) .pd-field-controls{\n  left:auto; right:0;\n}\n#pd-ia-test .pd-field-controls[hidden]{display:none!important}\n#pd-ia-test .pd-field-input{height:40px; font-size:14px}\n#pd-ia-test .pd-field-message{\n  position:absolute; z-index:101; top:calc(100% + 65px);\n  left:0; width:260px; padding:7px; border-radius:6px;\n  background:#fff; box-shadow:0 4px 12px rgba(10,26,68,.07);\n}\n#pd-ia-test .pd-field:nth-child(n+5) .pd-field-message{left:auto;right:0}\n#pd-ia-test .pd-field-message[hidden]{display:none!important}\n#pd-ia-test .pd-spinner{margin-top:5px}\n#pd-ia-test .pd-keyboard{\n  flex:0 0 34px; height:40px; padding:0; border:1px solid #dce3ec;\n  border-radius:50%; background:#fff; color:#0a1a44;\n  cursor:pointer; font-size:19px;\n}\n\/* Rapprocher le bouton principal des crit\u00e8res *\/\n#pd-ia-test .pd-selected{min-height:0;padding-bottom:0}\n#pd-ia-test .pd-field{padding-bottom:0}\n#pd-ia-test #pd-ia-fields{margin-bottom:0}\n#pd-ia-test #pd-ia-review-status:empty{display:none;margin:0}\n#pd-ia-test .pd-actions{margin-top:4px}\n\n#pd-ia-test #pd-ia-see-results{\n  max-width:100%; white-space:normal; text-align:center;\n  padding:12px 18px; font-size:14px;\n}\n@media(max-width:850px){\n  #pd-ia-test #pd-ia-fields{\n    display:flex; overflow-x:auto; gap:8px; padding-bottom:10px;\n    scrollbar-width:thin;\n  }\n  #pd-ia-test .pd-field{flex:0 0 142px}\n  #pd-ia-test .pd-field-controls{\n    position:fixed; top:auto; left:12px!important; right:12px!important;\n    bottom:16px; width:auto; max-width:none; z-index:99999;\n  }\n  #pd-ia-test .pd-field-message{position:static; width:auto;box-shadow:none}\n  #pd-ia-test .pd-review{padding:14px 12px}\n  #pd-ia-test .pd-analysis-intro{font-size:15px}\n}\n@media(max-width:600px){\n  #pd-ia-test .pd-review{top:0;margin-top:20px}\n}\n\n\n\/* Criterions : en-t\u00eates align\u00e9s et r\u00e9ellement interactifs *\/\n#pd-ia-test #pd-ia-fields{align-items:stretch}\n#pd-ia-test .pd-field{z-index:1}\n#pd-ia-test .pd-field.is-editor-open{z-index:200}\n#pd-ia-test .pd-field-heading{\n  display:flex; flex-direction:column; align-items:stretch;\n  gap:0; margin:0; cursor:pointer;\n}\n#pd-ia-test .pd-field-title{\n  display:block; box-sizing:border-box; width:100%;\n  height:48px; min-height:48px; margin:0;\n  padding:4px 3px; line-height:1.3;\n  cursor:pointer; pointer-events:auto;\n}\n#pd-ia-test .pd-field-title:focus-visible{\n  outline:2px solid #2858a8; outline-offset:2px;\n}\n#pd-ia-test .pd-field-controls:not([hidden]){display:flex!important}\n#pd-ia-test .pd-field-controls[hidden]{display:none!important}\n\n\n\/* Alignement strict des sept intitul\u00e9s sur une m\u00eame ligne *\/\n#pd-ia-test #pd-ia-fields .pd-field-heading{\n  display:flex;\n  flex-direction:column;\n  justify-content:flex-start;\n  align-items:stretch;\n}\n#pd-ia-test #pd-ia-fields .pd-field-title{\n  display:flex;\n  align-items:flex-start;\n  justify-content:flex-start;\n  box-sizing:border-box;\n  height:52px;\n  min-height:52px;\n  padding:8px 3px 0;\n  margin:0;\n  line-height:1.3;\n  vertical-align:top;\n  text-align:left;\n}\n#pd-ia-test #pd-ia-fields .pd-selected{\n  margin:0;\n  align-self:stretch;\n}\n\n\n\/* Organisation dynamique : crit\u00e8res d\u00e9tect\u00e9s, puis crit\u00e8res \u00e0 pr\u00e9ciser *\/\n#pd-ia-test #pd-ia-fields{display:block!important}\n#pd-ia-test .pd-criteria-row{display:flex;flex-wrap:nowrap;gap:0;align-items:stretch;width:100%;}\n#pd-ia-test .pd-criteria-row--identified{margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid #e9edf5;}\n#pd-ia-test .pd-criteria-row--optional{margin-bottom:10px;}\n#pd-ia-test .pd-criteria-row .pd-field{flex:1 1 0;min-width:0;padding:0 12px;border-right:1px solid #e9edf5;}\n#pd-ia-test .pd-criteria-row .pd-field:first-child{padding-left:3px}\n#pd-ia-test .pd-criteria-row .pd-field:last-child{border-right:0}\n#pd-ia-test .pd-criteria-row .pd-field-title{height:42px;min-height:42px;padding:5px 3px 0}\n#pd-ia-test .pd-editor-dock{display:block;width:min(760px,100%);margin:10px auto 14px;position:relative;z-index:100}\n#pd-ia-test .pd-editor-dock[hidden]{display:none!important}\n#pd-ia-test .pd-editor-dock .pd-field-controls{display:flex;position:relative;top:auto;left:auto;right:auto;width:100%;max-width:none;box-sizing:border-box;padding:12px;gap:10px;align-items:center;box-shadow:0 8px 24px rgba(10,26,68,.1)}\n#pd-ia-test .pd-editor-dock .pd-input-holder{flex:1;min-width:0}\n#pd-ia-test .pd-editor-dock .pd-field-input{width:100%;min-width:0}\n#pd-ia-test .pd-editor-dock .pd-field-message{position:static;width:100%;box-shadow:none}\n#pd-ia-test .pd-editor-dock .pd-dropdown{z-index:300}\n#pd-ia-test .pd-editor-dock .pd-editor-close{flex:0 0 34px;border:0;background:transparent;color:#667085;font-size:25px;cursor:pointer}\n#pd-ia-test .pd-editor-dock .pd-mic{flex-shrink:0}\n#pd-ia-test .pd-actions{margin-top:10px!important}\n@media(max-width:850px){\n #pd-ia-test .pd-criteria-row{overflow-x:auto;flex-wrap:nowrap;scrollbar-width:thin}\n #pd-ia-test .pd-criteria-row .pd-field{flex:0 0 145px}\n #pd-ia-test .pd-editor-dock .pd-field-controls{position:relative!important;left:auto!important;right:auto!important;bottom:auto!important;top:auto!important;width:100%!important}\n}\n\n\n\/* Recherche d'un crit\u00e8re : panneau unique, centr\u00e9 \u00e0 l'\u00e9cran *\/\n#pd-ia-test .pd-editor-dock:not([hidden]){\n  display:block!important;\n  position:fixed!important;\n  top:50%!important;\n  left:50%!important;\n  transform:translate(-50%,-50%)!important;\n  width:min(850px,calc(100vw - 36px))!important;\n  max-width:850px!important;\n  margin:0!important;\n  z-index:999999!important;\n}\n#pd-ia-test .pd-editor-dock .pd-field-controls{\n  padding:19px 20px!important;\n  border:1px solid #cbd8ed!important;\n  border-radius:22px!important;\n  background:white!important;\n  box-shadow:0 22px 75px rgba(10,26,68,.22)!important;\n}\n#pd-ia-test .pd-editor-dock .pd-field-input{\n  font-size:18px!important;\n  min-height:48px!important;\n}\n#pd-ia-test .pd-editor-dock .pd-field-message{\n  background:white;\n  border-radius:10px;\n  margin-top:6px;\n}\n@media(max-width:600px){\n  #pd-ia-test .pd-editor-dock .pd-field-controls{padding:12px!important;gap:5px!important}\n  #pd-ia-test .pd-editor-dock .pd-field-input{font-size:15px!important}\n}\n\n\n\/* Hi\u00e9rarchie visuelle : recherche initiale, r\u00e9sultats, pr\u00e9cisions *\/\n#pd-ia-test .pd-review{\n  padding:13px 17px 14px!important;\n  border:1px solid #dce6f5!important;\n  box-shadow:0 4px 14px rgba(10,26,68,.035)!important;\n}\n#pd-ia-test .pd-analysis-intro{\n  margin:0 0 9px!important;\n  font-size:15px!important;\n  font-weight:650!important;\n}\n#pd-ia-test .pd-filters-panel{margin:0!important}\n#pd-ia-test .pd-criteria-row--identified{\n  margin-bottom:6px!important;\n  padding-bottom:6px!important;\n  border-bottom:1px solid #e8eef7!important;\n}\n#pd-ia-test .pd-criteria-row--optional{\n  margin-bottom:3px!important;\n  padding:4px 0 0!important;\n  background:#fafcff;\n  border-radius:8px;\n}\n#pd-ia-test .pd-criteria-row .pd-field{\n  padding:0 10px!important;\n  min-height:0!important;\n}\n#pd-ia-test .pd-criteria-row .pd-field-title{\n  height:auto!important;\n  min-height:25px!important;\n  padding:3px 2px 2px!important;\n  font-size:12px!important;\n  line-height:1.3!important;\n}\n#pd-ia-test .pd-criteria-row--optional .pd-field-title{\n  color:#506484!important;\n  font-weight:550!important;\n}\n#pd-ia-test .pd-criteria-row .pd-selected{\n  min-height:0!important;\n  padding:1px 0!important;\n  gap:4px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-chip{\n  padding:3px 6px!important;\n  font-size:11px!important;\n}\n#pd-ia-test .pd-actions{\n  margin:8px 0 0!important;\n  justify-content:center!important;\n}\n#pd-ia-test #pd-ia-see-results{\n  padding:10px 22px!important;\n  font-size:14px!important;\n  border-radius:999px!important;\n  letter-spacing:.01em;\n}\n#pd-ia-test #pd-ia-review-status:empty{display:none!important}\n@media(max-width:600px){\n  #pd-ia-test .pd-review{padding:12px!important}\n  #pd-ia-test .pd-actions{margin-top:8px!important}\n  #pd-ia-test #pd-ia-see-results{width:100%!important;justify-content:center!important}\n}\n\n\n\/* S\u00e9parer clairement les rang\u00e9es de crit\u00e8res s\u00e9lectionn\u00e9s *\/\n#pd-ia-test .pd-criteria-row--identified{row-gap:16px!important;}\n\n\/* Deux encadr\u00e9s distincts et compacts pour les crit\u00e8res *\/\n#pd-ia-test .pd-review{\n  border:0!important;\n  box-shadow:none!important;\n  background:transparent!important;\n  padding:0!important;\n}\n#pd-ia-test .pd-analysis-intro{margin:0 0 9px!important}\n#pd-ia-test .pd-criteria-row--identified,\n#pd-ia-test .pd-criteria-row--optional{\n  display:flex!important;\n  flex-wrap:wrap!important;\n  justify-content:flex-start!important;\n  align-items:flex-start!important;\n  gap:4px!important;\n  padding:10px 12px!important;\n  margin:0 0 8px!important;\n  border:1px solid #e8ebf0!important;\n  border-radius:12px!important;\n  background:#f7f8fa!important;\n}\n#pd-ia-test .pd-criteria-row--optional{background:#fafafa!important}\n#pd-ia-test .pd-criteria-row--identified .pd-field{\n  flex:0 1 auto!important;\n  min-width:135px!important;\n  max-width:100%!important;\n  padding:0 13px!important;\n}\n#pd-ia-test .pd-criteria-row--optional .pd-field{\n  flex:1 1 135px!important;\n  min-width:115px!important;\n  padding:0 10px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-field:first-child{padding-left:2px!important}\n#pd-ia-test .pd-criteria-row .pd-field:last-child{border-right:0!important}\n#pd-ia-test .pd-actions-outside{\n  display:flex!important;\n  justify-content:center!important;\n  margin:10px 0 18px!important;\n}\n#pd-ia-test .pd-actions-outside[hidden]{display:none!important}\n@media(max-width:600px){\n  #pd-ia-test .pd-criteria-row--identified .pd-field,\n  #pd-ia-test .pd-criteria-row--optional .pd-field{flex:1 1 130px!important;min-width:0!important}\n}\n\n\n#pd-ia-test .pd-criteria-row--identified{row-gap:16px!important;}\n\n\/* Lisibilit\u00e9 + position du bouton + traitement dans la barre active *\/\n#pd-ia-test .pd-criteria-row .pd-field-title{\n  font-size:18px!important; \/* 12px x 1,5 *\/\n  line-height:1.3!important;\n  min-height:30px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-chip{\n  font-size:16.5px!important; \/* 11px x 1,5 *\/\n  line-height:1.35!important;\n  padding:5px 9px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-field{\n  min-width:0;\n}\n#pd-ia-test .pd-criteria-row--identified .pd-field{\n  min-width:165px!important;\n}\n#pd-ia-test .pd-criteria-row--optional .pd-field{\n  min-width:150px!important;\n}\n\/* L'encadr\u00e9 est remont\u00e9 de 100px par le CSS existant :\n   on retire aussi cet espace du flux pour que le bouton le suive. *\/\n#pd-ia-test .pd-review:not([hidden]){\n  margin-bottom:-100px!important;\n}\n#pd-ia-test .pd-actions-outside{\n  margin:8px 0 14px!important;\n}\n\/* Spinner int\u00e9gr\u00e9 au champ en cours, sans masquer le texte. *\/\n#pd-ia-test .pd-editor-dock .pd-input-holder{\n  position:relative!important;\n}\n#pd-ia-test .pd-editor-dock .pd-field-input{\n  padding-right:42px!important;\n}\n#pd-ia-test .pd-editor-dock .pd-input-holder > .pd-spinner{\n  position:absolute!important;\n  top:50%!important;\n  right:13px!important;\n  transform:translateY(-50%);\n  margin:0!important;\n  z-index:3;\n}\n#pd-ia-test .pd-spinner[hidden]{display:none!important}\n@media(max-width:600px){\n  #pd-ia-test .pd-criteria-row .pd-field-title{font-size:16px!important}\n  #pd-ia-test .pd-criteria-row .pd-chip{font-size:15px!important}\n}\n\n\n\/* Ajustements de pr\u00e9sentation : 9 octobre *\/\n#pd-ia-test .pd-criteria-row--identified{\n  margin-bottom:0!important;\n}\n#pd-ia-test .pd-optional-heading{\n  font-size:15px;\n  font-weight:650;\n  line-height:1.4;\n  color:#0a1a44;\n  margin:15px 0 7px!important;\n}\n#pd-ia-test #pd-ia-see-results{\n  font-size:17px!important;\n  font-weight:700!important;\n  padding:14px 30px!important;\n  min-height:52px!important;\n  line-height:1.4!important;\n}\n@media(max-width:600px){\n  #pd-ia-test #pd-ia-see-results{\n    font-size:16px!important;\n    padding:13px 18px!important;\n  }\n}\n\n\n\/* 10 octobre : options compact\u00e9es, compteurs et \u00e9tats de recherche *\/\n#pd-ia-test .pd-criteria-row .pd-selected{position:relative;display:flex;align-items:center;flex-wrap:nowrap;gap:5px;min-width:0}\n#pd-ia-test .pd-criteria-row .pd-chip{white-space:nowrap;max-width:100%;min-width:0}\n#pd-ia-test .pd-criteria-row .pd-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n#pd-ia-test .pd-chip-more{display:inline-flex;align-items:center;justify-content:center;border:1px solid #d8e2f1;border-radius:7px;background:#eaf0f8;color:#0a1a44;font:inherit;font-size:15px;font-weight:700;padding:5px 8px;cursor:pointer;white-space:nowrap;flex-shrink:0}\n#pd-ia-test .pd-chip-more:hover{background:#dfe9f7}\n#pd-ia-test .pd-chip-extras{position:absolute;left:0;top:calc(100% + 6px);z-index:250;background:white;border:1px solid #d8e2f1;border-radius:10px;box-shadow:0 10px 24px rgba(10,26,68,.13);padding:10px;min-width:180px;max-width:min(350px,90vw);display:flex;flex-wrap:wrap;gap:6px}\n#pd-ia-test .pd-chip-extras[hidden]{display:none!important}\n#pd-ia-test .pd-criteria-row .pd-field{overflow:visible}\n#pd-ia-test .pd-editor-dock .pd-input-holder > .pd-spinner:not([hidden]){left:50%!important;right:auto!important;top:50%!important;transform:translate(-50%,-50%)!important;z-index:5!important}\n#pd-ia-test .pd-editor-dock .pd-input-holder:has(.pd-spinner:not([hidden])) .pd-field-input{color:transparent!important}\n#pd-ia-test .pd-analysis-loading{border-radius:999px!important;flex-direction:row!important;gap:12px!important;background:rgba(255,255,255,.97)!important}\n#pd-ia-test .pd-analysis-spinner{width:24px!important;height:24px!important;border-width:3px!important}\n#pd-ia-test textarea::placeholder,#pd-ia-test .pd-field-input::placeholder{opacity:1}\n@media(max-width:700px){#pd-ia-test .pd-criteria-row .pd-chip{font-size:14px!important}#pd-ia-test .pd-chip-more{font-size:13px}}\n\n\n\/* Pr\u00e9sentation optimis\u00e9e : exemple seulement avant analyse. *\/\n#pd-ia-test.pd-has-analysis .pd-search-example{\n  display:none!important;\n}\n\/* Les deux blocs restent distincts et respirent davantage. *\/\n#pd-ia-test .pd-criteria-row--identified{\n  margin-bottom:0!important;\n}\n#pd-ia-test .pd-optional-heading{\n  margin-top:22px!important;\n  margin-bottom:8px!important;\n}\n\/* Bouton centr\u00e9, d\u00e9tach\u00e9 des crit\u00e8res sans grand vide. *\/\n#pd-ia-test .pd-actions-outside{\n  margin:24px 0 18px!important;\n}\n\/* Quand l'exemple dispara\u00eet, les r\u00e9sultats occupent l'espace lib\u00e9r\u00e9. *\/\n#pd-ia-test.pd-has-analysis .pd-review:not([hidden]){\n  margin-top:10px!important;\n}\n@media(max-width:600px){\n  #pd-ia-test .pd-optional-heading{margin-top:18px!important}\n  #pd-ia-test .pd-actions-outside{margin-top:20px!important}\n}\n\/* Menu des crit\u00e8res suppl\u00e9mentaires (+3, +4, etc.) *\/\n#pd-ia-test [class*=\"popover\"],\n#pd-ia-test [class*=\"overflow-menu\"] {\n  background-color: #ffffff !important;\n  opacity: 1 !important;\n  backdrop-filter: none !important;\n  box-shadow: 0 8px 24px rgba(10, 26, 68, 0.16) !important;\n  z-index: 9999 !important;\n}\n\n\/* Ajustements de lisibilit\u00e9 et de compacit\u00e9 *\/\n#pd-ia-test .pd-input-wrap{\n  min-height:72px!important;\n  height:72px!important;\n}\n#pd-ia-test .pd-analysis-intro,\n#pd-ia-test .pd-optional-heading{\n  font-size:18px!important;\n  line-height:1.35!important;\n  font-weight:700!important;\n  color:#0a1a44!important;\n}\n#pd-ia-test .pd-criteria-row--identified{\n  background:#f0f3f7!important;\n  border-color:#dfe5ed!important;\n}\n#pd-ia-test .pd-criteria-row--optional{\n  background:#f4f5f7!important;\n  border-color:#e0e4e9!important;\n}\n\n\/* ===== Ajustements cellulaires : interface de recherche ===== *\/\n@media (max-width:600px){\n  #pd-ia-test{width:100%!important;max-width:100%!important;margin:0 auto!important;padding:12px 10px 22px!important;overflow:visible!important}\n  #pd-ia-test #pd-ia-start{margin:0!important;padding:0!important;min-height:0!important}\n  #pd-ia-test .pd-brand-logo{width:min(245px,78%)!important;max-width:100%!important;margin:4px auto 12px!important}\n  #pd-ia-test .pd-hero-title{position:static!important;top:auto!important;display:flex!important;flex-wrap:wrap!important;gap:2px 7px!important;margin:0 auto 18px!important;font-size:clamp(17px,4.5vw,20px)!important;line-height:1.35!important;justify-content:center!important}\n  #pd-ia-test .pd-hero-arrow{margin:0 2px!important}\n  #pd-ia-test .pd-input-wrap{position:relative!important;top:auto!important;min-height:62px!important;height:62px!important;width:100%!important;overflow:hidden!important}\n  #pd-ia-test textarea{height:60px!important;min-height:60px!important;max-height:60px!important;overflow-y:auto!important;padding:15px 81px 10px 48px!important;font-size:15px!important;line-height:1.35!important;resize:none!important}\n  #pd-ia-test .pd-search-icon{left:16px!important;width:19px!important;height:19px!important}\n  #pd-ia-test .pd-clear-main{right:51px!important;width:20px!important;height:25px!important}\n  #pd-ia-test .pd-mic-main{right:7px!important;width:39px!important;height:39px!important}\n  #pd-ia-test .pd-search-example{position:static!important;top:auto!important;margin:12px auto 0!important;padding:0 4px!important;font-size:12.5px!important;line-height:1.45!important}\n  #pd-ia-test .pd-review{position:static!important;top:auto!important;margin-top:16px!important;margin-bottom:0!important;padding:12px 10px!important}\n  #pd-ia-test .pd-review:not([hidden]){margin-bottom:0!important}\n  #pd-ia-test .pd-actions-outside{margin:16px 0 12px!important}\n  #pd-ia-test .pd-analysis-intro,#pd-ia-test .pd-optional-heading{font-size:16px!important}\n}\n\/* ===== Correctif mobile final : compacit\u00e9 et contr\u00f4les sans d\u00e9bordement ===== *\/\n@media (max-width:600px){\n  #pd-ia-test{padding:0 12px 18px!important;min-width:0!important}\n  #pd-ia-test #pd-ia-start{width:100%!important;min-width:0!important}\n  \/* Le PNG du logo comporte des marges transparentes internes. *\/\n  #pd-ia-test .pd-brand-logo{display:block!important;width:min(230px,76%)!important;height:auto!important;margin:-25px auto -42px!important}\n  #pd-ia-test .pd-hero-title{margin:0 auto 14px!important;font-size:clamp(16px,4.2vw,18px)!important;line-height:1.35!important;column-gap:6px!important;row-gap:2px!important}\n  #pd-ia-test .pd-input-wrap{display:block!important;width:100%!important;min-width:0!important;min-height:60px!important;height:60px!important;border-radius:32px!important;overflow:hidden!important}\n  #pd-ia-test textarea#pd-ia-demande{display:block!important;box-sizing:border-box!important;width:100%!important;height:58px!important;min-height:58px!important;max-height:58px!important;margin:0!important;padding:17px 89px 8px 47px!important;overflow-y:hidden!important;overflow-x:hidden!important;resize:none!important;font-size:14px!important;line-height:1.35!important;border:0!important;box-shadow:none!important}\n  #pd-ia-test .pd-search-icon{left:15px!important;width:19px!important;height:19px!important}\n  #pd-ia-test .pd-clear-main{right:49px!important;top:50%!important;transform:translateY(-50%)!important;width:19px!important;height:24px!important;flex-shrink:0!important}\n  #pd-ia-test .pd-mic-main{right:6px!important;top:50%!important;transform:translateY(-50%)!important;width:38px!important;height:38px!important;flex-shrink:0!important}\n  #pd-ia-test .pd-mic-main svg{width:21px!important;height:21px!important}\n  #pd-ia-test .pd-search-example{margin:12px auto 0!important;padding:0 4px!important;font-size:12.5px!important;line-height:1.4!important}\n  #pd-ia-test .pd-review{margin-top:14px!important}\n}\n@media (max-width:360px){\n  #pd-ia-test .pd-brand-logo{width:215px!important}\n  #pd-ia-test textarea#pd-ia-demande{font-size:13px!important;padding-right:83px!important}\n  #pd-ia-test .pd-hero-title{font-size:16px!important}\n}\n\n\/* Harmonisation des deux encadr\u00e9s de crit\u00e8res : m\u00eames contours et s\u00e9parateurs.\n   Les fonds distincts conservent leur r\u00f4le (identifi\u00e9s \/ \u00e0 pr\u00e9ciser). *\/\n#pd-ia-test .pd-criteria-row--identified,\n#pd-ia-test .pd-criteria-row--optional{\n  border:1px solid #dfe5ed!important;\n  border-radius:12px!important;\n  box-shadow:none!important;\n}\n#pd-ia-test .pd-criteria-row--identified .pd-field,\n#pd-ia-test .pd-criteria-row--optional .pd-field{\n  border-right:1px solid #e1e6ed!important;\n}\n#pd-ia-test .pd-criteria-row--identified .pd-field:last-child,\n#pd-ia-test .pd-criteria-row--optional .pd-field:last-child{\n  border-right:0!important;\n}\n\/* La version mobile peut r\u00e9partir les crit\u00e8res sur plusieurs rang\u00e9es.\n   On \u00e9vite alors les s\u00e9parateurs verticaux coup\u00e9s ou isol\u00e9s. *\/\n@media(max-width:600px){\n  #pd-ia-test .pd-criteria-row--identified .pd-field,\n  #pd-ia-test .pd-criteria-row--optional .pd-field{\n    border-right:0!important;\n  }\n}\n\n\n\/* Bouton de recherche : \u00e9tat de redirection *\/\n#pd-ia-test #pd-ia-see-results.pd-is-loading,\n#pd-ia-test #pd-ia-see-results.pd-is-loading:hover,\n#pd-ia-test #pd-ia-see-results.pd-is-loading:focus{\n  background:#fff!important;\n  color:#0a1a44!important;\n  border:1px solid #0a1a44!important;\n  opacity:1!important;\n  cursor:wait!important;\n  box-shadow:none!important;\n}\n#pd-ia-test #pd-ia-see-results.pd-is-loading{display:inline-flex!important;align-items:center;justify-content:center;gap:10px}\n#pd-ia-test #pd-ia-see-results .pd-launch-spinner{\n  display:inline-block;width:17px;height:17px;flex:0 0 17px;\n  border:2px solid rgba(10,26,68,.20);border-top-color:#0a1a44;\n  border-radius:50%;animation:pd-launch-spin .75s linear infinite;\n}\n@keyframes pd-launch-spin{to{transform:rotate(360deg)}}\n@media(prefers-reduced-motion:reduce){#pd-ia-test #pd-ia-see-results .pd-launch-spinner{animation-duration:1.8s}}\n\n\/* Message explicatif discret : la recherche reste le point focal.\n   Classe pd-hero-title conserv\u00e9e pour le masquage JavaScript existant. *\/\n#pd-ia-test .pd-hero-title{\n  display:block!important;\n  text-align:center;\n  width:100%;\n  margin:55px auto 0!important;\n}\n#pd-ia-test .pd-hero-line{\n  display:flex;\n  justify-content:center;\n  align-items:baseline;\n  flex-wrap:wrap;\n  column-gap:7px;\n  row-gap:3px;\n  margin:0 0 24px!important;\n  font-size:clamp(15px,1.4vw,18px)!important;\n  font-weight:400!important;\n  line-height:1.5;\n  color:#71809b!important;\n}\n#pd-ia-test .pd-hero-line .pd-hero-question{\n  font-weight:400!important;\n  color:#71809b!important;\n}\n#pd-ia-test .pd-hero-from{font-weight:400!important;margin-right:4px!important}\n#pd-ia-test .pd-hero-line .pd-hero-arrow{margin:0 5px!important;color:#71809b!important}\n#pd-ia-test .pd-hero-with{\n  font-size:14px!important;\n  font-weight:400!important;\n  color:#71809b!important;\n  margin-bottom:9px!important;\n}\n#pd-ia-test .pd-hero-feature{\n  font-size:clamp(19px,1.9vw,23px)!important;\n  font-weight:600!important;\n  color:#0a1a44!important;\n  line-height:1.4;\n}\n#pd-ia-test .pd-hero-description{\n  font-size:14px!important;\n  line-height:1.6;\n  color:#71809b!important;\n  margin:14px auto 0!important;\n  max-width:680px;\n}\n@media(max-width:700px){\n  #pd-ia-test .pd-hero-title{margin:35px auto 0!important}\n  #pd-ia-test .pd-hero-line{font-size:15px!important;column-gap:5px;row-gap:3px;margin-bottom:19px!important}\n  #pd-ia-test .pd-hero-from{margin-right:2px!important}\n  #pd-ia-test .pd-hero-line .pd-hero-arrow{margin:0 3px!important}\n  #pd-ia-test .pd-hero-feature{font-size:20px!important}\n  #pd-ia-test .pd-hero-description{font-size:13px!important;margin-top:12px!important}\n}\n\n\/* Retouche finale : meilleur contraste, sans modifier la hi\u00e9rarchie. *\/\n#pd-ia-test .pd-search-example{color:#526584!important}\n#pd-ia-test .pd-hero-with{color:#526584!important}\n#pd-ia-test .pd-hero-description{color:#526584!important}\n\/* Respecter le masquage du message explicatif durant et apres analyse. *\/\n#pd-ia-test .pd-hero-title[hidden]{display:none!important;}\n\n\/* Quatre usages sans titre : une rang\u00e9e sur ordinateur, adaptatif sur mobile. *\/\n#pd-ia-test .pd-use-cases{max-width:1160px;width:100%;margin:45px auto 0;text-align:left}\n#pd-ia-test .pd-use-cases-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}\n#pd-ia-test .pd-use-case{min-width:0;padding:17px 15px;border:1px solid #e4e9f0;border-radius:13px;background:#fafbfd;box-shadow:0 1px 3px rgba(10,26,68,.025)}\n#pd-ia-test .pd-use-case-title{display:flex;align-items:center;gap:7px;font-size:13.5px;font-weight:600;color:#223044;margin:0 0 8px;line-height:1.35}\n#pd-ia-test .pd-use-case-icon{flex:0 0 auto;font-size:17px;color:#7586a2;line-height:1}\n#pd-ia-test .pd-use-case-description{font-size:12.5px;line-height:1.55;color:#53647D;margin:0}\n@media(max-width:950px){#pd-ia-test .pd-use-cases-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}\n@media(max-width:620px){#pd-ia-test .pd-use-cases{margin-top:26px}#pd-ia-test .pd-use-cases-grid{grid-template-columns:1fr;gap:10px}#pd-ia-test .pd-use-case{padding:15px 17px}}\n\n\/* Mobile : r\u00e9duire l'en-t\u00eate seulement apr\u00e8s une analyse IA. *\/\n@media (max-width:600px){\n  #pd-ia-test.pd-has-analysis .pd-brand-logo{\n    width:135px!important;\n    margin:-32px auto -57px!important;\n  }\n  #pd-ia-test.pd-has-analysis .pd-review{\n    margin-top:8px!important;\n  }\n  #pd-ia-test.pd-has-analysis .pd-optional-heading{\n    margin-top:10px!important;\n  }\n  #pd-ia-test.pd-has-analysis .pd-actions-outside{\n    margin:10px 0 8px!important;\n  }\n}\n\n\n\/* Barre de recherche : contour discret au repos, bleu ProDispo \u00e0 l'interaction. *\/\n#pd-ia-test .pd-input-wrap{\n  border:1px solid #DCE4EF!important;\n  transition:border-color .2s ease,box-shadow .2s ease;\n}\n@media (hover:hover) and (pointer:fine){\n  #pd-ia-test .pd-input-wrap:hover{\n    border-color:#082765!important;\n  }\n}\n#pd-ia-test .pd-input-wrap:focus-within,\n#pd-ia-test .pd-input-wrap:has(.pd-mic.is-listening){\n  border:2px solid #082765!important;\n}\n@media (prefers-reduced-motion:reduce){\n  #pd-ia-test .pd-input-wrap{transition:none}\n}\n\n\n\/* Bloc explicatif compact : m\u00eame position verticale qu'avant, titre suivi d'une phrase. *\/\n#pd-ia-test .pd-hero-title > .pd-hero-feature{\n  display:block;\n  margin:0!important;\n  font-size:clamp(19px,1.9vw,23px)!important;\n  line-height:1.4!important;\n  font-weight:600!important;\n}\n#pd-ia-test .pd-hero-title > .pd-hero-description{\n  margin:12px auto 0!important;\n  max-width:960px;\n  line-height:1.6;\n}\n@media(max-width:700px){\n  #pd-ia-test .pd-hero-title > .pd-hero-description{margin-top:10px!important}\n}\n\/* Rapprocher la barre de recherche du logo sur ordinateur *\/\n@media (min-width: 1025px) {\n  #pd-ia-test #pd-ia-start > .pd-input-wrap {\n    margin-top: -65px !important;\n  }\n}\n\/* Remonter ensemble le logo, la barre et l'exemple *\/\n@media (min-width: 1025px) {\n  #pd-ia-test #pd-ia-start {\n    margin-top: -40px !important;\n  }\n}\n\/* Espace sous l'exemple de recherche *\/\n@media (min-width: 1025px) {\n\n  #pd-ia-test .pd-search-example {\n    margin-bottom: 105px !important;\n  }\n\n  \/* Dimensions de la barre de recherche *\/\n  #pd-ia-test .pd-input-wrap {\n    width: 100% !important;\n    max-width: 850px !important;\n    height: 60px !important;\n    min-height: 60px !important;\n    margin-left: auto !important;\n    margin-right: auto !important;\n    box-sizing: border-box !important;\n    display: flex !important;\n    align-items: center !important;\n  }\n\n  \/* Centrage vertical du texte *\/\n  #pd-ia-test .pd-input-wrap textarea {\n    position: relative !important;\n    top: 0 !important;\n    transform: none !important;\n    height: 24px !important;\n    min-height: 24px !important;\n    max-height: 120px !important;\n    line-height: 24px !important;\n    padding: 0 0 0 65px !important;\n    margin: 0 !important;\n    align-self: center !important;\n    overflow-y: auto !important;\n    box-sizing: border-box !important;\n  }\n\n}\n\n\/* Ajustements finaux FR : lisibilit\u00e9 et pictogrammes, sans modifier l'en-t\u00eate. *\/\n#pd-ia-test .pd-search-example,\n#pd-ia-test .pd-use-case-description{\n  color:#34445C!important;\n  font-weight:400!important;\n  opacity:1!important;\n}\n#pd-ia-test .pd-use-case-icon{\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  width:21px;\n  height:21px;\n  flex:0 0 21px;\n  color:#234B82;\n}\n#pd-ia-test .pd-use-case-icon svg{\n  display:block;\n  width:21px;\n  height:21px;\n}\n#pd-ia-test .pd-hero-slogan strong{font-weight:700;}\n\n\/* Correctif : bouton de lancement toujours visible sous les crit\u00e8res analys\u00e9s. *\/\n#pd-ia-test .pd-review:not([hidden]){\n  margin-bottom:0!important;\n}\n#pd-ia-test .pd-actions-outside:not([hidden]){\n  display:flex!important;\n  justify-content:center!important;\n  position:relative!important;\n  visibility:visible!important;\n  opacity:1!important;\n  margin:18px auto 24px!important;\n  padding:0 12px!important;\n  width:100%!important;\n}\n#pd-ia-test .pd-actions-outside:not([hidden]) #pd-ia-see-results{\n  display:inline-flex!important;\n  visibility:visible!important;\n  opacity:1!important;\n}\n\n\/* Hauteur dynamique des champs et des puces suppl\u00e9mentaires *\/\n#pd-ia-test .pd-criteria-row--identified,\n#pd-ia-test .pd-criteria-row--optional{\n  display:flex!important;\n  flex-wrap:wrap!important;\n  justify-content:flex-start!important;\n  align-items:flex-start!important;\n  gap:4px!important;\n  padding:10px 12px!important;\n  margin:0 0 8px!important;\n  border:1px solid #e8ebf0!important;\n  border-radius:12px!important;\n  background:#f7f8fa!important;\n}\n#pd-ia-test .pd-criteria-row--optional{background:#fafafa!important}\n#pd-ia-test .pd-criteria-row--identified .pd-field{\n  flex:0 1 auto!important;\n  min-width:135px!important;\n  max-width:100%!important;\n  padding:0 13px!important;\n}\n#pd-ia-test .pd-criteria-row--optional .pd-field{\n  flex:1 1 135px!important;\n  min-width:115px!important;\n  padding:0 10px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-field:first-child{padding-left:2px!important}\n#pd-ia-test .pd-criteria-row .pd-field:last-child{border-right:0!important}\n#pd-ia-test .pd-actions-outside{\n  display:flex!important;\n  justify-content:center!important;\n  margin:10px 0 18px!important;\n}\n#pd-ia-test .pd-actions-outside[hidden]{display:none!important}\n@media(max-width:600px){\n  #pd-ia-test .pd-criteria-row--identified .pd-field,\n  #pd-ia-test .pd-criteria-row--optional .pd-field{flex:1 1 130px!important;min-width:0!important}\n}\n\n\n#pd-ia-test .pd-criteria-row--identified{row-gap:16px!important;}\n\n\/* Lisibilit\u00e9 + position du bouton + traitement dans la barre active *\/\n#pd-ia-test .pd-criteria-row .pd-field-title{\n  font-size:18px!important; \/* 12px x 1,5 *\/\n  line-height:1.3!important;\n  min-height:30px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-chip{\n  font-size:16.5px!important; \/* 11px x 1,5 *\/\n  line-height:1.35!important;\n  padding:5px 9px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-field{\n  min-width:0;\n}\n#pd-ia-test .pd-criteria-row--identified .pd-field{\n  min-width:165px!important;\n}\n#pd-ia-test .pd-criteria-row--optional .pd-field{\n  min-width:150px!important;\n}\n\/* L'encadr\u00e9 est remont\u00e9 de 100px par le CSS existant :\n   on retire aussi cet espace du flux pour que le bouton le suive. *\/\n#pd-ia-test .pd-review:not([hidden]){\n  margin-bottom:-100px!important;\n}\n#pd-ia-test .pd-actions-outside{\n  margin:8px 0 14px!important;\n}\n\/* Spinner int\u00e9gr\u00e9 au champ en cours, sans masquer le texte. *\/\n#pd-ia-test .pd-editor-dock .pd-input-holder{\n  position:relative!important;\n}\n#pd-ia-test .pd-editor-dock .pd-field-input{\n  padding-right:42px!important;\n}\n#pd-ia-test .pd-editor-dock .pd-input-holder > .pd-spinner{\n  position:absolute!important;\n  top:50%!important;\n  right:13px!important;\n  transform:translateY(-50%);\n  margin:0!important;\n  z-index:3;\n}\n#pd-ia-test .pd-spinner[hidden]{display:none!important}\n@media(max-width:600px){\n  #pd-ia-test .pd-criteria-row .pd-field-title{font-size:16px!important}\n  #pd-ia-test .pd-criteria-row .pd-chip{font-size:15px!important}\n}\n\n\n\/* Ajustements de pr\u00e9sentation : 9 octobre *\/\n#pd-ia-test .pd-criteria-row--identified{\n  margin-bottom:0!important;\n}\n#pd-ia-test .pd-optional-heading{\n  font-size:15px;\n  font-weight:650;\n  line-height:1.4;\n  color:#0a1a44;\n  margin:15px 0 7px!important;\n}\n#pd-ia-test #pd-ia-see-results{\n  font-size:17px!important;\n  font-weight:700!important;\n  padding:14px 30px!important;\n  min-height:52px!important;\n  line-height:1.4!important;\n}\n@media(max-width:600px){\n  #pd-ia-test #pd-ia-see-results{\n    font-size:16px!important;\n    padding:13px 18px!important;\n  }\n}\n\n\n\/* 10 octobre : options compact\u00e9es, compteurs et \u00e9tats de recherche *\/\n#pd-ia-test .pd-criteria-row .pd-selected{position:relative;display:flex;align-items:center;flex-wrap:nowrap;gap:5px;min-width:0}\n#pd-ia-test .pd-criteria-row .pd-chip{white-space:nowrap;max-width:100%;min-width:0}\n#pd-ia-test .pd-criteria-row .pd-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n#pd-ia-test .pd-chip-more{display:inline-flex;align-items:center;justify-content:center;border:1px solid #d8e2f1;border-radius:7px;background:#eaf0f8;color:#0a1a44;font:inherit;font-size:15px;font-weight:700;padding:5px 8px;cursor:pointer;white-space:nowrap;flex-shrink:0}\n#pd-ia-test .pd-chip-more:hover{background:#dfe9f7}\n#pd-ia-test .pd-chip-extras{position:absolute;left:0;top:calc(100% + 6px);z-index:250;background:white;border:1px solid #d8e2f1;border-radius:10px;box-shadow:0 10px 24px rgba(10,26,68,.13);padding:10px;min-width:180px;max-width:min(350px,90vw);display:flex;flex-wrap:wrap;gap:6px}\n#pd-ia-test .pd-chip-extras[hidden]{display:none!important}\n#pd-ia-test .pd-criteria-row .pd-field{overflow:visible}\n#pd-ia-test .pd-editor-dock .pd-input-holder > .pd-spinner:not([hidden]){left:50%!important;right:auto!important;top:50%!important;transform:translate(-50%,-50%)!important;z-index:5!important}\n#pd-ia-test .pd-editor-dock .pd-input-holder:has(.pd-spinner:not([hidden])) .pd-field-input{color:transparent!important}\n#pd-ia-test .pd-analysis-loading{border-radius:999px!important;flex-direction:row!important;gap:12px!important;background:rgba(255,255,255,.97)!important}\n#pd-ia-test .pd-analysis-spinner{width:24px!important;height:24px!important;border-width:3px!important}\n#pd-ia-test textarea::placeholder,#pd-ia-test .pd-field-input::placeholder{opacity:1}\n@media(max-width:700px){#pd-ia-test .pd-criteria-row .pd-chip{font-size:14px!important}#pd-ia-test .pd-chip-more{font-size:13px}}\n\n\n\/* Pr\u00e9sentation optimis\u00e9e : exemple seulement avant analyse. *\/\n#pd-ia-test.pd-has-analysis .pd-search-example{\n  display:none!important;\n}\n\/* Les deux blocs restent distincts et respirent davantage. *\/\n#pd-ia-test .pd-criteria-row--identified{\n  margin-bottom:0!important;\n}\n#pd-ia-test .pd-optional-heading{\n  margin-top:22px!important;\n  margin-bottom:8px!important;\n}\n\/* Bouton centr\u00e9, d\u00e9tach\u00e9 des crit\u00e8res sans grand vide. *\/\n#pd-ia-test .pd-actions-outside{\n  margin:24px 0 18px!important;\n}\n\/* Quand l'exemple dispara\u00eet, les r\u00e9sultats occupent l'espace lib\u00e9r\u00e9. *\/\n#pd-ia-test.pd-has-analysis .pd-review:not([hidden]){\n  margin-top:10px!important;\n}\n@media(max-width:600px){\n  #pd-ia-test .pd-optional-heading{margin-top:18px!important}\n  #pd-ia-test .pd-actions-outside{margin-top:20px!important}\n}\n\/* Menu des crit\u00e8res suppl\u00e9mentaires (+3, +4, etc.) *\/\n#pd-ia-test [class*=\"popover\"],\n#pd-ia-test [class*=\"overflow-menu\"] {\n  background-color: #ffffff !important;\n  opacity: 1 !important;\n  backdrop-filter: none !important;\n  box-shadow: 0 8px 24px rgba(10, 26, 68, 0.16) !important;\n  z-index: 9999 !important;\n}\n\n\/* Ajustements de lisibilit\u00e9 et de compacit\u00e9 *\/\n#pd-ia-test .pd-input-wrap{\n  min-height:72px!important;\n  height:72px!important;\n}\n#pd-ia-test .pd-analysis-intro,\n#pd-ia-test .pd-optional-heading{\n  font-size:18px!important;\n  line-height:1.35!important;\n  font-weight:700!important;\n  color:#0a1a44!important;\n}\n#pd-ia-test .pd-criteria-row--identified{\n  background:#f0f3f7!important;\n  border-color:#dfe5ed!important;\n}\n#pd-ia-test .pd-criteria-row--optional{\n  background:#f4f5f7!important;\n  border-color:#e0e4e9!important;\n}\n\n\/* ===== Ajustements cellulaires : interface de recherche ===== *\/\n@media (max-width:600px){\n  #pd-ia-test{width:100%!important;max-width:100%!important;margin:0 auto!important;padding:12px 10px 22px!important;overflow:visible!important}\n  #pd-ia-test #pd-ia-start{margin:0!important;padding:0!important;min-height:0!important}\n  #pd-ia-test .pd-brand-logo{width:min(245px,78%)!important;max-width:100%!important;margin:4px auto 12px!important}\n  #pd-ia-test .pd-hero-title{position:static!important;top:auto!important;display:flex!important;flex-wrap:wrap!important;gap:2px 7px!important;margin:0 auto 18px!important;font-size:clamp(17px,4.5vw,20px)!important;line-height:1.35!important;justify-content:center!important}\n  #pd-ia-test .pd-hero-arrow{margin:0 2px!important}\n  #pd-ia-test .pd-input-wrap{position:relative!important;top:auto!important;min-height:62px!important;height:62px!important;width:100%!important;overflow:hidden!important}\n  #pd-ia-test textarea{height:60px!important;min-height:60px!important;max-height:60px!important;overflow-y:auto!important;padding:15px 81px 10px 48px!important;font-size:15px!important;line-height:1.35!important;resize:none!important}\n  #pd-ia-test .pd-search-icon{left:16px!important;width:19px!important;height:19px!important}\n  #pd-ia-test .pd-clear-main{right:51px!important;width:20px!important;height:25px!important}\n  #pd-ia-test .pd-mic-main{right:7px!important;width:39px!important;height:39px!important}\n  #pd-ia-test .pd-search-example{position:static!important;top:auto!important;margin:12px auto 0!important;padding:0 4px!important;font-size:12.5px!important;line-height:1.45!important}\n  #pd-ia-test .pd-review{position:static!important;top:auto!important;margin-top:16px!important;margin-bottom:0!important;padding:12px 10px!important}\n  #pd-ia-test .pd-review:not([hidden]){margin-bottom:0!important}\n  #pd-ia-test .pd-actions-outside{margin:16px 0 12px!important}\n  #pd-ia-test .pd-analysis-intro,#pd-ia-test .pd-optional-heading{font-size:16px!important}\n}\n\/* ===== Correctif mobile final : compacit\u00e9 et contr\u00f4les sans d\u00e9bordement ===== *\/\n@media (max-width:600px){\n  #pd-ia-test{padding:0 12px 18px!important;min-width:0!important}\n  #pd-ia-test #pd-ia-start{width:100%!important;min-width:0!important}\n  \/* Le PNG du logo comporte des marges transparentes internes. *\/\n  #pd-ia-test .pd-brand-logo{display:block!important;width:min(230px,76%)!important;height:auto!important;margin:-25px auto -42px!important}\n  #pd-ia-test .pd-hero-title{margin:0 auto 14px!important;font-size:clamp(16px,4.2vw,18px)!important;line-height:1.35!important;column-gap:6px!important;row-gap:2px!important}\n  #pd-ia-test .pd-input-wrap{display:block!important;width:100%!important;min-width:0!important;min-height:60px!important;height:60px!important;border-radius:32px!important;overflow:hidden!important}\n  #pd-ia-test textarea#pd-ia-demande{display:block!important;box-sizing:border-box!important;width:100%!important;height:58px!important;min-height:58px!important;max-height:58px!important;margin:0!important;padding:17px 89px 8px 47px!important;overflow-y:hidden!important;overflow-x:hidden!important;resize:none!important;font-size:14px!important;line-height:1.35!important;border:0!important;box-shadow:none!important}\n  #pd-ia-test .pd-search-icon{left:15px!important;width:19px!important;height:19px!important}\n  #pd-ia-test .pd-clear-main{right:49px!important;top:50%!important;transform:translateY(-50%)!important;width:19px!important;height:24px!important;flex-shrink:0!important}\n  #pd-ia-test .pd-mic-main{right:6px!important;top:50%!important;transform:translateY(-50%)!important;width:38px!important;height:38px!important;flex-shrink:0!important}\n  #pd-ia-test .pd-mic-main svg{width:21px!important;height:21px!important}\n  #pd-ia-test .pd-search-example{margin:12px auto 0!important;padding:0 4px!important;font-size:12.5px!important;line-height:1.4!important}\n  #pd-ia-test .pd-review{margin-top:14px!important}\n}\n@media (max-width:360px){\n  #pd-ia-test .pd-brand-logo{width:215px!important}\n  #pd-ia-test textarea#pd-ia-demande{font-size:13px!important;padding-right:83px!important}\n  #pd-ia-test .pd-hero-title{font-size:16px!important}\n}\n\n\/* Harmonisation des deux encadr\u00e9s de crit\u00e8res : m\u00eames contours et s\u00e9parateurs.\n   Les fonds distincts conservent leur r\u00f4le (identifi\u00e9s \/ \u00e0 pr\u00e9ciser). *\/\n#pd-ia-test .pd-criteria-row--identified,\n#pd-ia-test .pd-criteria-row--optional{\n  border:1px solid #dfe5ed!important;\n  border-radius:12px!important;\n  box-shadow:none!important;\n}\n#pd-ia-test .pd-criteria-row--identified .pd-field,\n#pd-ia-test .pd-criteria-row--optional .pd-field{\n  border-right:1px solid #e1e6ed!important;\n}\n#pd-ia-test .pd-criteria-row--identified .pd-field:last-child,\n#pd-ia-test .pd-criteria-row--optional .pd-field:last-child{\n  border-right:0!important;\n}\n\/* La version mobile peut r\u00e9partir les crit\u00e8res sur plusieurs rang\u00e9es.\n   On \u00e9vite alors les s\u00e9parateurs verticaux coup\u00e9s ou isol\u00e9s. *\/\n@media(max-width:600px){\n  #pd-ia-test .pd-criteria-row--identified .pd-field,\n  #pd-ia-test .pd-criteria-row--optional .pd-field{\n    border-right:0!important;\n  }\n}\n\n\n\/* Bouton de recherche : \u00e9tat de redirection *\/\n#pd-ia-test #pd-ia-see-results.pd-is-loading,\n#pd-ia-test #pd-ia-see-results.pd-is-loading:hover,\n#pd-ia-test #pd-ia-see-results.pd-is-loading:focus{\n  background:#fff!important;\n  color:#0a1a44!important;\n  border:1px solid #0a1a44!important;\n  opacity:1!important;\n  cursor:wait!important;\n  box-shadow:none!important;\n}\n#pd-ia-test #pd-ia-see-results.pd-is-loading{display:inline-flex!important;align-items:center;justify-content:center;gap:10px}\n#pd-ia-test #pd-ia-see-results .pd-launch-spinner{\n  display:inline-block;width:17px;height:17px;flex:0 0 17px;\n  border:2px solid rgba(10,26,68,.20);border-top-color:#0a1a44;\n  border-radius:50%;animation:pd-launch-spin .75s linear infinite;\n}\n@keyframes pd-launch-spin{to{transform:rotate(360deg)}}\n@media(prefers-reduced-motion:reduce){#pd-ia-test #pd-ia-see-results .pd-launch-spinner{animation-duration:1.8s}}\n\n\/* Message explicatif discret : la recherche reste le point focal.\n   Classe pd-hero-title conserv\u00e9e pour le masquage JavaScript existant. *\/\n#pd-ia-test .pd-hero-title{\n  display:block!important;\n  text-align:center;\n  width:100%;\n  margin:55px auto 0!important;\n}\n#pd-ia-test .pd-hero-line{\n  display:flex;\n  justify-content:center;\n  align-items:baseline;\n  flex-wrap:wrap;\n  column-gap:7px;\n  row-gap:3px;\n  margin:0 0 24px!important;\n  font-size:clamp(15px,1.4vw,18px)!important;\n  font-weight:400!important;\n  line-height:1.5;\n  color:#71809b!important;\n}\n#pd-ia-test .pd-hero-line .pd-hero-question{\n  font-weight:400!important;\n  color:#71809b!important;\n}\n#pd-ia-test .pd-hero-from{font-weight:400!important;margin-right:4px!important}\n#pd-ia-test .pd-hero-line .pd-hero-arrow{margin:0 5px!important;color:#71809b!important}\n#pd-ia-test .pd-hero-with{\n  font-size:14px!important;\n  font-weight:400!important;\n  color:#71809b!important;\n  margin-bottom:9px!important;\n}\n#pd-ia-test .pd-hero-feature{\n  font-size:clamp(19px,1.9vw,23px)!important;\n  font-weight:600!important;\n  color:#0a1a44!important;\n  line-height:1.4;\n}\n#pd-ia-test .pd-hero-description{\n  font-size:14px!important;\n  line-height:1.6;\n  color:#71809b!important;\n  margin:14px auto 0!important;\n  max-width:680px;\n}\n@media(max-width:700px){\n  #pd-ia-test .pd-hero-title{margin:35px auto 0!important}\n  #pd-ia-test .pd-hero-line{font-size:15px!important;column-gap:5px;row-gap:3px;margin-bottom:19px!important}\n  #pd-ia-test .pd-hero-from{margin-right:2px!important}\n  #pd-ia-test .pd-hero-line .pd-hero-arrow{margin:0 3px!important}\n  #pd-ia-test .pd-hero-feature{font-size:20px!important}\n  #pd-ia-test .pd-hero-description{font-size:13px!important;margin-top:12px!important}\n}\n\n\/* Retouche finale : meilleur contraste, sans modifier la hi\u00e9rarchie. *\/\n#pd-ia-test .pd-search-example{color:#526584!important}\n#pd-ia-test .pd-hero-with{color:#526584!important}\n#pd-ia-test .pd-hero-description{color:#526584!important}\n\/* Respecter le masquage du message explicatif durant et apres analyse. *\/\n#pd-ia-test .pd-hero-title[hidden]{display:none!important;}\n\n\/* Quatre usages sans titre : une rang\u00e9e sur ordinateur, adaptatif sur mobile. *\/\n#pd-ia-test .pd-use-cases{max-width:1160px;width:100%;margin:45px auto 0;text-align:left}\n#pd-ia-test .pd-use-cases-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}\n#pd-ia-test .pd-use-case{min-width:0;padding:17px 15px;border:1px solid #e4e9f0;border-radius:13px;background:#fafbfd;box-shadow:0 1px 3px rgba(10,26,68,.025)}\n#pd-ia-test .pd-use-case-title{display:flex;align-items:center;gap:7px;font-size:13.5px;font-weight:600;color:#223044;margin:0 0 8px;line-height:1.35}\n#pd-ia-test .pd-use-case-icon{flex:0 0 auto;font-size:17px;color:#7586a2;line-height:1}\n#pd-ia-test .pd-use-case-description{font-size:12.5px;line-height:1.55;color:#53647D;margin:0}\n@media(max-width:950px){#pd-ia-test .pd-use-cases-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}\n@media(max-width:620px){#pd-ia-test .pd-use-cases{margin-top:26px}#pd-ia-test .pd-use-cases-grid{grid-template-columns:1fr;gap:10px}#pd-ia-test .pd-use-case{padding:15px 17px}}\n\n\/* Mobile : r\u00e9duire l'en-t\u00eate seulement apr\u00e8s une analyse IA. *\/\n@media (max-width:600px){\n  #pd-ia-test.pd-has-analysis .pd-brand-logo{\n    width:135px!important;\n    margin:-32px auto -57px!important;\n  }\n  #pd-ia-test.pd-has-analysis .pd-review{\n    margin-top:8px!important;\n  }\n  #pd-ia-test.pd-has-analysis .pd-optional-heading{\n    margin-top:10px!important;\n  }\n  #pd-ia-test.pd-has-analysis .pd-actions-outside{\n    margin:10px 0 8px!important;\n  }\n}\n\n\n\/* Barre de recherche : contour discret au repos, bleu ProDispo \u00e0 l'interaction. *\/\n#pd-ia-test .pd-input-wrap{\n  border:1px solid #DCE4EF!important;\n  transition:border-color .2s ease,box-shadow .2s ease;\n}\n@media (hover:hover) and (pointer:fine){\n  #pd-ia-test .pd-input-wrap:hover{\n    border-color:#082765!important;\n  }\n}\n#pd-ia-test .pd-input-wrap:focus-within,\n#pd-ia-test .pd-input-wrap:has(.pd-mic.is-listening){\n  border:2px solid #082765!important;\n}\n@media (prefers-reduced-motion:reduce){\n  #pd-ia-test .pd-input-wrap{transition:none}\n}\n\n\n\/* Bureau : le logo reste visible, sans marge n\u00e9gative ni chevauchement. *\/\n@media (min-width:1025px){\n  #pd-ia-test #pd-ia-start > .pd-brand-logo{\n    display:block!important;\n    width:min(420px,85%)!important;\n    max-width:100%!important;\n    height:auto!important;\n    max-height:none!important;\n    margin:0 auto 0px!important;\n    position:relative!important;\n    top:auto!important;\n    transform:none!important;\n    object-fit:contain!important;\n  }\n  #pd-ia-test #pd-ia-start > .pd-input-wrap{\n    position:relative!important;\n    top:auto!important;\n    margin-top:0!important;\n  }\n  #pd-ia-test #pd-ia-start > .pd-search-example{\n    position:relative!important;\n    top:auto!important;\n  }\n}\n\n\/* Bloc explicatif compact : m\u00eame position verticale qu'avant, titre suivi d'une phrase. *\/\n#pd-ia-test .pd-hero-title > .pd-hero-feature{\n  display:block;\n  margin:0!important;\n  font-size:clamp(19px,1.9vw,23px)!important;\n  line-height:1.4!important;\n  font-weight:600!important;\n}\n#pd-ia-test .pd-hero-title > .pd-hero-description{\n  margin:12px auto 0!important;\n  max-width:960px;\n  line-height:1.6;\n}\n@media(max-width:700px){\n  #pd-ia-test .pd-hero-title > .pd-hero-description{margin-top:10px!important}\n}\n\/* Rapprocher la barre de recherche du logo sur ordinateur *\/\n@media (min-width: 1025px) {\n  #pd-ia-test #pd-ia-start > .pd-input-wrap {\n    margin-top: -65px !important;\n  }\n}\n\/* Remonter ensemble le logo, la barre et l'exemple *\/\n@media (min-width: 1025px) {\n  #pd-ia-test #pd-ia-start {\n    margin-top: -40px !important;\n  }\n}\n\/* Espace sous l'exemple de recherche *\/\n@media (min-width: 1025px) {\n\n  #pd-ia-test .pd-search-example {\n    margin-bottom: 105px !important;\n  }\n\n  \/* Dimensions de la barre de recherche *\/\n  #pd-ia-test .pd-input-wrap {\n    width: 100% !important;\n    max-width: 850px !important;\n    height: 60px !important;\n    min-height: 60px !important;\n    margin-left: auto !important;\n    margin-right: auto !important;\n    box-sizing: border-box !important;\n    display: flex !important;\n    align-items: center !important;\n  }\n\n  \/* Centrage vertical du texte *\/\n  #pd-ia-test .pd-input-wrap textarea {\n    position: relative !important;\n    top: 0 !important;\n    transform: none !important;\n    height: 24px !important;\n    min-height: 24px !important;\n    max-height: 120px !important;\n    line-height: 24px !important;\n    padding: 0 0 0 65px !important;\n    margin: 0 !important;\n    align-self: center !important;\n    overflow-y: auto !important;\n    box-sizing: border-box !important;\n  }\n\n}\n\n\/* Refinements: clearer text, recognizable matching icons, compact two-line hero. *\/\n#pd-ia-test .pd-use-case-description{color:#34445C!important}\n#pd-ia-test .pd-use-case-icon{display:inline-flex;align-items:center;justify-content:center;width:21px;height:21px;color:#234B82;flex:0 0 21px}\n#pd-ia-test .pd-use-case-icon svg{display:block;width:21px;height:21px}\n#pd-ia-test .pd-hero-description .pd-hero-promise{font-weight:700;color:#0a1a44}\n\n\/* Accessibility refinements: example and four cards; header\/CTA unchanged. *\/\n#pd-ia-test .pd-search-example{color:#34445C!important;font-weight:400!important;opacity:1!important}\n#pd-ia-test .pd-use-case-description{color:#34445C!important;font-weight:400!important;opacity:1!important}\n\/* Emphasize the promise subtly without adding forced line breaks. *\/\n#pd-ia-test .pd-hero-description .pd-hero-promise{font-size:1.06em!important;font-weight:700!important;color:#0a1a44!important}\n\n\/* Keep the search launch action visible below analyzed criteria. *\/\n#pd-ia-test .pd-review:not([hidden]){margin-bottom:0!important;}\n#pd-ia-test .pd-actions-outside:not([hidden]){\n  display:flex!important;\n  justify-content:center!important;\n  position:relative!important;\n  visibility:visible!important;\n  opacity:1!important;\n  margin:18px auto 24px!important;\n  padding:0 12px!important;\n  width:100%!important;\n}\n#pd-ia-test .pd-actions-outside:not([hidden]) #pd-ia-see-results{\n  display:inline-flex!important;\n  visibility:visible!important;\n  opacity:1!important;\n}\n\n\/* 11 octobre \u2014 Hauteur automatique des crit\u00e8res analys\u00e9s.\n   Les \u00e9tiquettes et les s\u00e9lections restent dans le flux normal,\n   m\u00eame si les professions occupent plusieurs lignes. *\/\n#pd-ia-test .pd-criteria-row--identified,\n#pd-ia-test .pd-criteria-row--optional{\n  height:auto!important;\n  min-height:0!important;\n  max-height:none!important;\n  overflow:visible!important;\n  align-items:stretch!important;\n  align-content:flex-start!important;\n  row-gap:14px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-field{\n  display:flex!important;\n  flex-direction:column!important;\n  align-self:stretch!important;\n  height:auto!important;\n  min-height:0!important;\n  max-height:none!important;\n  overflow:visible!important;\n  box-sizing:border-box!important;\n  padding-top:4px!important;\n  padding-bottom:6px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-field-heading{\n  display:flex!important;\n  flex-direction:column!important;\n  align-items:stretch!important;\n  flex:0 0 auto!important;\n  height:auto!important;\n  min-height:0!important;\n  max-height:none!important;\n  overflow:visible!important;\n}\n#pd-ia-test .pd-criteria-row .pd-field-title{\n  display:block!important;\n  flex:0 0 auto!important;\n  height:auto!important;\n  min-height:0!important;\n  max-height:none!important;\n  padding:3px 2px 6px!important;\n  white-space:normal!important;\n  overflow-wrap:break-word!important;\n}\n#pd-ia-test .pd-criteria-row .pd-selected{\n  display:flex!important;\n  flex-wrap:wrap!important;\n  align-items:flex-start!important;\n  align-content:flex-start!important;\n  flex:0 0 auto!important;\n  height:auto!important;\n  min-height:0!important;\n  max-height:none!important;\n  overflow:visible!important;\n  margin:0!important;\n  padding:0 0 3px!important;\n  gap:6px!important;\n}\n#pd-ia-test .pd-criteria-row .pd-chip{\n  flex:0 1 auto!important;\n  max-width:100%!important;\n}\n#pd-ia-test .pd-criteria-row .pd-chip-label{\n  min-width:0!important;\n  max-width:100%!important;\n}\n@media(max-width:600px){\n  #pd-ia-test .pd-criteria-row--identified,\n  #pd-ia-test .pd-criteria-row--optional{\n    row-gap:12px!important;\n  }\n}\n\n\/* Fix: expanded +N chips must take up real vertical space, not overlap next row. *\/\n#pd-ia-test .pd-criteria-row .pd-chip-extras:not([hidden]){\n  position:static!important;\n  inset:auto!important;\n  display:flex!important;\n  flex-wrap:wrap!important;\n  flex-basis:100%!important;\n  width:fit-content!important;\n  max-width:100%!important;\n  min-width:0!important;\n  margin:6px 0 2px!important;\n  box-sizing:border-box!important;\n  z-index:auto!important;\n}\n#pd-ia-test .pd-criteria-row .pd-selected{\n  height:auto!important;\n  min-height:0!important;\n  max-height:none!important;\n  flex-wrap:wrap!important;\n  align-content:flex-start!important;\n  overflow:visible!important;\n}\n#pd-ia-test .pd-criteria-row--identified,\n#pd-ia-test .pd-criteria-row--optional{\n  height:auto!important;\n  min-height:0!important;\n  max-height:none!important;\n  overflow:visible!important;\n}\n\n@media(max-width:600px){\n #pd-ia-test .pd-hero-description .pd-hero-slogan,\n #pd-ia-test .pd-hero-description .pd-hero-sentence{display:block!important;width:100%!important;margin:0 auto 5px!important;line-height:1.45!important}\n #pd-ia-test .pd-hero-description .pd-hero-separator{display:none!important}\n}\n\n\/* Rayon : libell\u00e9 et s\u00e9lection ensemble, dans Localisation. *\/\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control{\n  position:static!important;float:none!important;clear:both!important;\n  display:flex!important;flex-direction:row!important;align-items:center!important;\n  justify-content:flex-start!important;flex-wrap:wrap!important;\n  width:100%!important;max-width:100%!important;box-sizing:border-box!important;\n  margin:9px 0 0!important;padding:8px 0 0!important;\n  border-top:1px solid #dfe6f2!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-title{\n  display:inline-block!important;position:static!important;float:none!important;\n  width:auto!important;margin:0!important;padding:0!important;\n  color:#0a1a44!important;font-size:12px!important;font-weight:700!important;\n  white-space:normal!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control select{\n  display:inline-block!important;position:static!important;float:none!important;\n  flex:0 1 170px!important;min-width:115px!important;max-width:180px!important;\n  width:auto!important;margin:0!important;\n  border:1px solid #d9e2f1!important;border-radius:9px!important;\n  padding:7px 10px!important;background:#fff!important;\n  font:inherit!important;font-weight:400!important;color:#0a1a44!important;\n}\n\n\/* Rayon int\u00e9gr\u00e9 \u00e0 la carte Localisation *\/\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control{\n  display:flex!important;align-items:center!important;justify-content:flex-start!important;\n  flex-wrap:wrap!important;gap:6px!important;margin:10px 0 0!important;\n  padding-top:9px!important;border-top:1px solid #dfe6f2!important;\n  font-size:12px!important;width:100%!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control label{white-space:normal!important}\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control select{\n  flex:1 1 100px!important;max-width:none!important;min-width:95px!important;\n}\n#pd-ia-test #pdr-current-chips{display:flex!important;flex-wrap:wrap!important;gap:7px!important}\n\n\/* Rayon : titre et menu dans la carte Localisation, sous l'adresse. *\/\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control{\n  display:flex!important;flex-direction:column!important;align-items:flex-start!important;\n  justify-content:flex-start!important;gap:6px!important;width:100%!important;\n  margin:10px 0 0!important;padding:0!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-title{\n  display:block!important;position:static!important;visibility:visible!important;\n  font-size:12px!important;font-weight:700!important;line-height:1.4!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control select{\n  display:block!important;width:min(210px,100%)!important;max-width:210px!important;\n  flex:0 0 auto!important;min-height:38px!important;\n  border:1px solid #d9e2f1!important;border-radius:9px!important;\n  padding:6px 10px!important;background:#fff!important;color:#0a1a44!important;\n}\n\n\/* X plus grand et espacement avec le microphone *\/\n\n\/* Barre de recherche principale - ordinateur *\/\n#pd-ia-test .pd-clear-main {\n  font-size: 28px !important;\n  right: 88px !important;\n}\n\n\/* Barres des crit\u00e8res *\/\n#pd-ia-test .pd-clear-field {\n  font-size: 28px !important;\n  margin-right: 10px !important;\n}\n\n\/* Barre principale - cellulaire *\/\n@media (max-width: 600px) {\n  #pd-ia-test .pd-clear-main {\n    font-size: 28px !important;\n    right: 59px !important;\n  }\n}\n\n#pd-ia-test .pdr-service-hint{\n  margin:12px 0 8px;\n  padding:11px 14px;\n  border-left:3px solid #0a1a44;\n  border-radius:6px;\n  background:#f1f5fb;\n  color:#0a1a44;\n  font-size:14px;\n  font-weight:600;\n  line-height:1.5;\n}\n\n\/* Pastilles interactives : remplacer le bouton de modification g\u00e9n\u00e9ral. *\/\n#pd-ia-test #pdr-open-filters{display:none!important}\n#pd-ia-test .pdr-interactive-chip{cursor:pointer;font-family:inherit;line-height:1.3;text-align:left}\n#pd-ia-test .pdr-interactive-chip:hover,#pd-ia-test .pdr-interactive-chip:focus-visible{border-color:#17479e!important;background:#f2f6ff!important;outline-offset:2px}\n#pd-ia-test .pdr-more-chip{border-color:#17479e!important;color:#17479e!important}\n\n<\/style>\n<style>\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control{justify-content:flex-start!important;flex:0 0 auto!important}\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control select{max-width:180px!important;flex:0 1 170px!important}\n<\/style>\n\n<style>\n\/* Page de r\u00e9sultats : m\u00eame moteur IA que l'accueil, pr\u00e9sentation compacte. *\/\n#pd-ia-test{position:relative!important;width:100%!important;max-width:none!important;margin:0 auto 14px!important;padding:12px 16px!important;border:1px solid #dbe5f5!important;border-radius:17px!important;background:#fff!important;box-shadow:0 8px 25px rgba(10,26,68,.08)!important;overflow:visible!important;z-index:100!important}\n#pd-ia-test #pd-ia-start{display:flex!important;align-items:center!important;gap:15px!important;flex-wrap:nowrap!important;width:100%!important;min-height:56px!important;position:relative!important;padding:0!important;margin:0!important}\n#pd-ia-test #pd-ia-start>.pd-brand-logo{display:block!important;position:static!important;transform:none!important;width:185px!important;max-width:185px!important;height:auto!important;max-height:50px!important;object-fit:contain!important;margin:0!important;flex:0 0 185px!important}\n#pd-ia-test #pd-ia-start>.pd-input-wrap{position:relative!important;display:flex!important;flex:1 1 auto!important;min-width:100px!important;max-width:none!important;width:auto!important;margin:0!important;top:auto!important;left:auto!important;right:auto!important;transform:none!important;border-radius:30px!important;min-height:52px!important}\n#pd-ia-test #pd-ia-demande{min-height:44px!important;max-height:76px!important;resize:none!important;padding-top:12px!important;padding-bottom:8px!important;font-size:15px!important}\n#pd-ia-test #pd-ia-start>.pd-search-example,#pd-ia-test #pd-ia-start>.pd-hero-title,#pd-ia-test #pd-ia-start>.pd-status{display:none!important}\n#pd-ia-test .pdr-run-search{flex:0 0 auto!important;position:static!important;border:0!important;border-radius:24px!important;background:#17479e!important;color:#fff!important;font-size:13px!important;font-weight:800!important;padding:13px 17px!important;min-height:44px!important;cursor:pointer!important;white-space:nowrap!important}\n#pd-ia-test .pdr-criteria-row{display:flex!important;align-items:center!important;gap:9px!important;flex-wrap:wrap!important;margin:8px 0 0!important}\n#pd-ia-test #pdr-current-chips{display:flex;gap:8px;flex-wrap:wrap;align-items:center}\n#pd-ia-test .pdr-current-chip{display:inline-flex;border:1px solid #e1e9f6;border-radius:24px;background:#fff;padding:7px 13px;font-weight:700;font-size:12px;color:#0a1a44;box-shadow:0 3px 10px rgba(10,26,68,.05)}\n#pd-ia-test #pdr-open-filters{display:none!important;border:1.5px solid #1856f0;background:#fff;border-radius:25px;color:#17479e;padding:9px 14px;font-size:13px;font-weight:800;cursor:pointer}\n#pd-ia-test #pd-ia-result{position:fixed!important;right:clamp(12px,3vw,56px)!important;top:clamp(115px,21vh,195px)!important;left:auto!important;bottom:auto!important;transform:none!important;width:min(470px,calc(100vw - 24px))!important;max-width:none!important;max-height:calc(100dvh - clamp(115px,21vh,195px) - 14px)!important;overflow:hidden!important;display:flex!important;flex-direction:column!important;gap:8px!important;margin:0!important;padding:16px 18px!important;border:1px solid #dbe5f5!important;border-radius:16px!important;background:#fff!important;box-shadow:0 15px 42px rgba(10,26,68,.19)!important;z-index:2147482000!important}\n#pd-ia-test #pd-ia-result[hidden]{display:none!important}\n#pd-ia-test #pd-ia-result:has(#pd-ia-filters-panel[hidden]){display:none!important}\n#pd-ia-test .pdr-panel-title{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:15px;flex-shrink:0}\n#pd-ia-test #pdr-close-filters{border:0;background:transparent;font-size:24px;color:#0a1a44;cursor:pointer}\n#pd-ia-test .pd-analysis-intro,#pd-ia-test #pd-ia-summary,#pd-ia-test #pd-ia-toggle-filters{display:none!important}\n#pd-ia-test #pd-ia-filters-panel{display:block!important;position:relative!important;top:auto!important;left:auto!important;right:auto!important;bottom:auto!important;transform:none!important;min-height:0!important;flex:1 1 auto!important;overflow-y:auto!important;overflow-x:visible!important;width:100%!important;max-width:none!important;margin:0!important;padding:0 3px!important;background:transparent!important;border:0!important;box-shadow:none!important}\n#pd-ia-test #pd-ia-filters-panel[hidden]{display:none!important}\n#pd-ia-test #pd-ia-fields{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:8px 10px!important;width:100%!important;max-width:none!important;align-items:start!important}\n#pd-ia-test #pd-ia-fields>.pd-field{min-width:0!important;width:100%!important;margin:0!important;padding:7px 8px!important;border:1px solid #e2e9f5!important;border-radius:10px!important;box-shadow:none!important;background:#fff!important}\n#pd-ia-test #pd-ia-fields .pd-field-heading{margin:0!important;padding:0!important;min-height:25px!important}\n#pd-ia-test #pd-ia-fields .pd-field-label{font-size:12px!important;line-height:1.3!important}\n#pd-ia-test #pd-ia-fields .pd-field-controls{margin:4px 0 0!important}\n#pd-ia-test #pd-ia-fields input{font-size:12px!important;min-height:32px!important}\n#pd-ia-test #pd-ia-editor-dock{position:relative!important;width:100%!important;max-width:none!important;grid-column:1\/-1!important}\n#pd-ia-test .pdr-radius-control{margin:9px 0 0!important;display:flex;align-items:center;gap:12px;font-size:12px;font-weight:800}\n#pd-ia-test .pdr-radius-control select{flex:1;min-height:38px;border:1px solid #d9e2f1;border-radius:9px;background:#fff;color:#0a1a44;padding:6px}\n#pd-ia-test .pdr-panel-actions{flex:0 0 auto;display:flex;justify-content:flex-end;margin-top:4px}\n#pd-ia-test #pdr-apply-filters{background:#17479e;color:white;border:0;border-radius:10px;padding:11px 15px;font-weight:800;cursor:pointer}\n#pd-ia-test #pd-ia-review-status{font-size:12px!important;margin:0!important}\n#pd-ia-test #pd-ia-actions-outside{display:none!important}\n@media(max-width:767px){#pd-ia-test{padding:9px!important}#pd-ia-test #pd-ia-start{gap:6px!important;flex-wrap:wrap!important}#pd-ia-test #pd-ia-start>.pd-brand-logo{width:110px!important;flex:0 0 110px!important}#pd-ia-test #pd-ia-start>.pd-input-wrap{flex:1 1 calc(100% - 120px)!important;min-width:0!important}#pd-ia-test .pdr-run-search{width:100%!important;padding:9px!important}#pd-ia-test #pd-ia-result{top:auto!important;left:0!important;right:0!important;bottom:0!important;width:100%!important;max-height:88dvh!important;border-radius:18px 18px 0 0!important;padding:14px!important}#pd-ia-test #pd-ia-fields{grid-template-columns:1fr!important}#pd-ia-test .pdr-current-chip{font-size:11px!important;padding:6px 9px!important}}\n<\/style>\n\n\n<style>\n\/* ProDispo r\u00e9sultats \u2014 panneau horizontal et \u00e9diteur pleine largeur *\/\n#pd-ia-test #pd-ia-result{\n  position:fixed!important;\n  top:clamp(125px,19vh,180px)!important;\n  right:clamp(12px,3vw,50px)!important;\n  left:auto!important;\n  bottom:auto!important;\n  width:min(960px,calc(100vw - 32px))!important;\n  max-width:none!important;\n  max-height:calc(100dvh - clamp(125px,19vh,180px) - 12px)!important;\n  overflow:hidden!important;\n  display:flex!important;\n  flex-direction:column!important;\n  padding:18px 20px!important;\n  gap:12px!important;\n}\n#pd-ia-test #pd-ia-result[hidden],\n#pd-ia-test #pd-ia-result:has(#pd-ia-filters-panel[hidden]){display:none!important}\n#pd-ia-test #pd-ia-filters-panel{\n  overflow-y:auto!important;\n  overflow-x:hidden!important;\n  min-height:0!important;\n  padding:2px 4px 10px!important;\n}\n#pd-ia-test #pd-ia-fields{\n  display:flex!important;\n  flex-direction:column!important;\n  gap:8px!important;\n  align-items:stretch!important;\n}\n#pd-ia-test #pd-ia-fields>.pd-criteria-row,\n#pd-ia-test #pd-ia-fields>.pd-criteria-row--identified,\n#pd-ia-test #pd-ia-fields>.pd-criteria-row--optional{\n  display:grid!important;\n  grid-template-columns:repeat(4,minmax(0,1fr))!important;\n  gap:10px!important;\n  width:100%!important;\n  max-width:none!important;\n  padding:0!important;\n  margin:0!important;\n  border:0!important;\n  overflow:visible!important;\n  height:auto!important;\n  min-height:0!important;\n  align-items:stretch!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field{\n  display:block!important;\n  min-width:0!important;\n  width:100%!important;\n  max-width:none!important;\n  padding:10px!important;\n  border:1px solid #e1e9f6!important;\n  border-radius:12px!important;\n  background:#f8faff!important;\n  overflow:visible!important;\n  height:auto!important;\n  min-height:62px!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field-title{\n  font-size:13px!important;\n  line-height:1.3!important;\n  overflow-wrap:anywhere!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field-heading{min-height:0!important}\n#pd-ia-test .pd-optional-heading{display:none!important}\n#pd-ia-test #pd-ia-editor-dock{\n  display:block!important;\n  width:100%!important;\n  max-width:none!important;\n  margin:4px 0 0!important;\n  padding:0!important;\n  position:relative!important;\n  z-index:1000!important;\n  overflow:visible!important;\n}\n#pd-ia-test #pd-ia-editor-dock[hidden]{display:none!important}\n#pd-ia-test #pd-ia-editor-dock .pd-field-controls{\n  display:flex!important;\n  position:relative!important;\n  width:100%!important;\n  max-width:none!important;\n  min-width:0!important;\n  padding:12px!important;\n  gap:9px!important;\n  border:1px solid #dbe5f5!important;\n  border-radius:14px!important;\n  background:#fff!important;\n  box-sizing:border-box!important;\n}\n#pd-ia-test #pd-ia-editor-dock .pd-input-holder{\n  flex:1 1 auto!important;\n  min-width:0!important;\n  width:auto!important;\n  max-width:none!important;\n}\n#pd-ia-test #pd-ia-editor-dock .pd-field-input{\n  display:block!important;\n  width:100%!important;\n  max-width:none!important;\n  min-width:0!important;\n  font-size:15px!important;\n  min-height:48px!important;\n  padding:10px 14px!important;\n  text-overflow:clip!important;\n}\n#pd-ia-test #pd-ia-editor-dock .pd-dropdown{\n  width:100%!important;\n  max-width:none!important;\n  z-index:2000!important;\n}\n#pd-ia-test #pd-ia-editor-dock .pd-field-message{width:100%!important}\n#pd-ia-test .pdr-radius-control{flex:0 0 auto!important;justify-content:flex-end!important}\n#pd-ia-test .pdr-radius-control select{max-width:190px!important}\n#pd-ia-test .pdr-panel-actions{flex:0 0 auto!important}\n@media(max-width:900px){\n  #pd-ia-test #pd-ia-fields>.pd-criteria-row{grid-template-columns:repeat(2,minmax(0,1fr))!important}\n  #pd-ia-test #pd-ia-result{width:min(720px,calc(100vw - 24px))!important}\n}\n@media(max-width:767px){\n  #pd-ia-test #pd-ia-result{\n    top:auto!important;bottom:0!important;left:0!important;right:0!important;\n    width:100%!important;max-height:90dvh!important;padding:14px!important;\n  }\n  #pd-ia-test #pd-ia-fields>.pd-criteria-row{grid-template-columns:repeat(2,minmax(0,1fr))!important}\n  #pd-ia-test #pd-ia-editor-dock .pd-field-controls{gap:5px!important;padding:8px!important}\n  #pd-ia-test #pd-ia-editor-dock .pd-field-input{font-size:14px!important;padding:9px!important}\n}\n@media(max-width:420px){\n  #pd-ia-test #pd-ia-fields>.pd-criteria-row{grid-template-columns:1fr 1fr!important}\n  #pd-ia-test #pd-ia-fields .pd-field{padding:8px!important}\n}\n<\/style>\n\n\n<style>\n\/* R\u00e9sultats : logo plus pr\u00e9sent, barre de recherche prioritaire *\/\n#pd-ia-test #pd-ia-start>.pd-brand-logo{\n  width:250px!important;max-width:250px!important;flex:0 0 250px!important;\n  max-height:76px!important;height:70px!important;object-fit:contain!important;\n}\n#pd-ia-test #pd-ia-start>.pd-input-wrap{flex:1 1 auto!important;min-width:0!important}\n@media(max-width:767px){\n  #pd-ia-test #pd-ia-start>.pd-brand-logo{\n    width:135px!important;max-width:135px!important;flex:0 0 135px!important;\n    height:54px!important;max-height:54px!important;\n  }\n  #pd-ia-test #pd-ia-start>.pd-input-wrap{flex:1 1 calc(100% - 145px)!important}\n}\n\/* R\u00e9sultats r\u00e9initialis\u00e9s : le moteur reste accessible, pas de r\u00e9sultats affich\u00e9s. *\/\nbody.pdr-search-empty .pdr-blank-map-note{\n  display:flex!important;align-items:center;justify-content:center;min-height:280px;\n  padding:24px;text-align:center;font-size:16px;color:#64748b;\n  background:#f8fafc;border:1px solid #dbe5f5;border-radius:15px;\n}\n<\/style>\n\n\n<style>\n\/* R\u00e9sultats : continuit\u00e9 visuelle avec l'accueil, logo centr\u00e9 et r\u00e9duit *\/\n#pd-ia-test #pd-ia-start{\n  display:flex!important;flex-direction:column!important;flex-wrap:nowrap!important;\n  align-items:center!important;justify-content:center!important;gap:4px!important;\n  width:100%!important;min-height:0!important;\n}\n#pd-ia-test #pd-ia-start>.pd-brand-logo{\n  display:block!important;position:static!important;\n  width:290px!important;max-width:min(290px,75vw)!important;\n  height:88px!important;max-height:88px!important;\n  flex:0 0 auto!important;margin:0 auto!important;\n  object-fit:contain!important;\n}\n#pd-ia-test #pd-ia-start>.pd-input-wrap{\n  display:flex!important;width:min(1100px,100%)!important;max-width:1100px!important;\n  min-width:0!important;flex:0 1 auto!important;\n  min-height:70px!important;margin:0 auto!important;\n  border:2px solid #0a286b!important;border-radius:999px!important;\n  box-sizing:border-box!important;\n}\n#pd-ia-test #pd-ia-demande{\n  font-size:18px!important;min-height:58px!important;\n  padding-top:17px!important;padding-bottom:10px!important;\n}\n#pd-ia-test .pdr-criteria-row{justify-content:center!important;margin-top:9px!important}\n#pd-ia-test #pd-ia-start .pdr-run-search{display:none!important}\n@media(max-width:767px){\n  #pd-ia-test #pd-ia-start{gap:2px!important}\n  #pd-ia-test #pd-ia-start>.pd-brand-logo{\n    width:210px!important;max-width:75vw!important;height:68px!important;max-height:68px!important;\n    flex:0 0 auto!important;\n  }\n  #pd-ia-test #pd-ia-start>.pd-input-wrap{\n    width:100%!important;max-width:100%!important;min-height:58px!important;\n    flex:0 1 auto!important;\n  }\n  #pd-ia-test #pd-ia-demande{font-size:15px!important;min-height:48px!important;padding-top:12px!important}\n  #pd-ia-test .pdr-criteria-row{justify-content:flex-start!important}\n}\n<\/style>\n\n\n<style>\n\/* Page de r\u00e9sultats : logo \u00e0 gauche, recherche r\u00e9duite d\u2019un tiers.\n   Les fonctions du moteur IA et de JetEngine ne sont pas modifi\u00e9es. *\/\n#pd-ia-test{\n  position:relative!important;\n  padding:12px 16px 10px!important;\n  margin:0 auto 10px!important;\n  min-height:0!important;\n}\n#pd-ia-test #pd-ia-start{\n  display:flex!important;\n  align-items:center!important;\n  justify-content:flex-start!important;\n  gap:16px!important;\n  width:100%!important;\n  margin:0!important;\n  padding:0!important;\n  min-height:0!important;\n}\n#pd-ia-test #pd-ia-start>.pd-brand-logo{\n  display:block!important;\n  position:static!important;\n  width:185px!important;\n  max-width:185px!important;\n  height:64px!important;\n  max-height:64px!important;\n  flex:0 0 185px!important;\n  margin:0!important;\n  object-fit:contain!important;\n  object-position:center!important;\n  transform:none!important;\n}\n#pd-ia-test #pd-ia-start>.pd-input-wrap{\n  display:flex!important;\n  position:relative!important;\n  width:calc((100% - 230px)*.67)!important;\n  max-width:900px!important;\n  min-width:0!important;\n  min-height:54px!important;\n  height:auto!important;\n  margin:0!important;\n  border:1.5px solid #0a286b!important;\n  border-radius:999px!important;\n  box-sizing:border-box!important;\n  flex:0 1 auto!important;\n}\n#pd-ia-test #pd-ia-demande{\n  min-height:44px!important;\n  max-height:82px!important;\n  font-size:15px!important;\n  padding-top:12px!important;\n  padding-bottom:7px!important;\n  line-height:1.4!important;\n}\n#pd-ia-test .pdr-criteria-row{\n  display:flex!important;\n  align-items:center!important;\n  justify-content:flex-start!important;\n  margin:8px 0 0!important;\n  gap:8px!important;\n  min-height:32px!important;\n  flex-wrap:wrap!important;\n}\n#pd-ia-test #pdr-current-chips{justify-content:flex-start!important;gap:7px!important}\n#pd-ia-test .pdr-current-chip{padding:6px 11px!important;font-size:12px!important}\n#pd-ia-test #pdr-open-filters{\n  position:absolute!important;\n  top:12px!important;\n  right:16px!important;\n  height:54px!important;\n  min-width:196px!important;\n  margin:0!important;\n  padding:0 14px!important;\n  display:inline-flex!important;\n  align-items:center!important;\n  justify-content:center!important;\n  white-space:nowrap!important;\n  font-size:13px!important;\n  box-sizing:border-box!important;\n}\n\/* Localisation plus large que les autres crit\u00e8res, sans d\u00e9border. *\/\n#pd-ia-test #pd-ia-fields .pd-field:has(.pd-field-title[data-pd-key=\"ville\"]){\n  grid-column:span 2!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field:has(.pd-field-title[data-pd-key=\"ville\"]) .pd-selected{\n  max-width:100%!important;\n  overflow:visible!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field:has(.pd-field-title[data-pd-key=\"ville\"]) .pd-selected>*{\n  max-width:100%!important;\n  white-space:normal!important;\n  overflow-wrap:anywhere!important;\n}\n\/* Libell\u00e9 long : retour \u00e0 la ligne sans tronquer. *\/\n#pd-ia-test #pd-ia-fields .pd-field:has(.pd-field-title[data-pd-key=\"ordre\"]){\n  grid-column:span 2!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field:has(.pd-field-title[data-pd-key=\"ordre\"]) .pd-field-title{\n  white-space:normal!important;\n  text-align:left!important;\n  line-height:1.35!important;\n}\n@media(max-width:1050px){\n  #pd-ia-test #pd-ia-start>.pd-brand-logo{\n    width:140px!important;max-width:140px!important;flex-basis:140px!important;\n  }\n  #pd-ia-test #pd-ia-start>.pd-input-wrap{width:calc(100% - 170px)!important;max-width:none!important}\n  #pd-ia-test #pdr-open-filters{position:static!important;height:42px!important;min-width:0!important}\n}\n@media(max-width:767px){\n  #pd-ia-test{padding:10px!important}\n  #pd-ia-test #pd-ia-start{gap:8px!important;align-items:center!important}\n  #pd-ia-test #pd-ia-start>.pd-brand-logo{\n    width:86px!important;max-width:86px!important;flex:0 0 86px!important;\n    height:48px!important;max-height:48px!important;\n  }\n  #pd-ia-test #pd-ia-start>.pd-input-wrap{\n    width:calc(100% - 94px)!important;\n    min-height:52px!important;max-width:none!important;\n  }\n  #pd-ia-test #pd-ia-demande{font-size:14px!important;min-height:43px!important}\n  #pd-ia-test .pdr-criteria-row{margin-top:8px!important;padding-bottom:0!important}\n  #pd-ia-test #pdr-open-filters{height:38px!important;padding:0 14px!important}\n  #pd-ia-test #pd-ia-fields .pd-field:has(.pd-field-title[data-pd-key=\"ville\"]),\n  #pd-ia-test #pd-ia-fields .pd-field:has(.pd-field-title[data-pd-key=\"ordre\"]){grid-column:span 2!important}\n}\n<\/style>\n\n<style>\n\/* R\u00e9sultats : logo, recherche et bouton SUR LA M\u00caME LIGNE *\/\n@media (min-width: 768px){\n  #pd-ia-test #pd-ia-start{\n    display:flex!important; flex-direction:row!important; flex-wrap:nowrap!important;\n    justify-content:space-between!important; align-items:center!important;\n    gap:18px!important; min-height:56px!important;\n  }\n  #pd-ia-test #pd-ia-start>.pd-brand-logo{\n    display:block!important;position:static!important;transform:none!important;\n    width:185px!important;max-width:185px!important;flex:0 0 185px!important;\n    height:54px!important;max-height:54px!important;margin:0!important;\n    object-fit:contain!important;\n  }\n  #pd-ia-test #pd-ia-start>.pd-input-wrap{\n    position:relative!important;display:flex!important;\n    width:auto!important;max-width:850px!important;min-width:0!important;\n    flex:1 1 650px!important;margin:0!important;transform:none!important;\n  }\n  #pd-ia-test #pd-ia-start>#pdr-open-filters{\n    display:inline-flex!important;position:static!important;top:auto!important;right:auto!important;\n    width:auto!important;min-width:196px!important;flex:0 0 auto!important;\n    height:52px!important;margin:0!important;white-space:nowrap!important;\n    align-items:center!important;justify-content:center!important;\n  }\n}\n@media (max-width:767px){\n  #pd-ia-test #pd-ia-start{display:flex!important;flex-wrap:wrap!important;gap:8px!important;align-items:center!important}\n  #pd-ia-test #pd-ia-start>.pd-brand-logo{width:86px!important;flex:0 0 86px!important;margin:0!important}\n  #pd-ia-test #pd-ia-start>.pd-input-wrap{flex:1 1 calc(100% - 100px)!important;width:auto!important;min-width:0!important;margin:0!important}\n  #pd-ia-test #pd-ia-start>#pdr-open-filters{position:static!important;flex:0 0 auto!important;margin-left:auto!important;min-width:0!important;height:40px!important}\n}\n<\/style>\n\n\n<style>\n\/* Ajustements exclusifs \u00e0 la page de r\u00e9sultats sur t\u00e9l\u00e9phone. *\/\n@media (max-width:767px) {\n  #pd-ia-test #pd-ia-start > .pd-brand-logo {display:none!important}\n  #pd-ia-test #pd-ia-start > .pd-input-wrap {\n    flex:1 1 100%!important;width:100%!important;max-width:100%!important;\n    min-width:0!important;margin:0!important;\n  }\n  #pd-ia-test #pd-ia-start > #pdr-open-filters {\n    order:5!important;position:static!important;display:flex!important;\n    width:max-content!important;max-width:100%!important;\n    margin:9px 0 0 auto!important;flex:0 0 auto!important;\n  }\n  #pd-ia-test .pdr-criteria-row {order:3!important;width:100%!important;margin:9px 0 0!important}\n  #pd-ia-test #pd-ia-start {display:flex!important;flex-direction:column!important;align-items:stretch!important}\n  #pd-ia-test #pdr-current-chips {display:flex!important;flex-wrap:wrap!important;min-width:0!important;width:100%!important}\n  #pd-ia-test .pdr-current-chip {\n    display:inline-flex!important;align-items:center!important;gap:7px!important;\n    max-width:100%!important;min-width:0!important;white-space:normal!important;\n    overflow-wrap:anywhere!important;word-break:normal!important;\n    line-height:1.4!important;padding:7px 10px!important;\n  }\n  #pd-ia-test .pdr-current-chip .pdr-chip-text {min-width:0;overflow-wrap:anywhere}\n  #pd-ia-test .pdr-current-chip .pdr-chip-remove {\n    flex:0 0 25px!important;display:inline-flex!important;align-items:center!important;\n    justify-content:center!important;border:0!important;background:transparent!important;\n    color:#a32929!important;font-size:22px!important;font-weight:700!important;\n    min-width:25px!important;min-height:30px!important;padding:0!important;\n  }\n  \/* Le panneau reste accessible, et l'\u00e9diteur flotte au centre de la zone visible. *\/\n  #pd-ia-test #pd-ia-result {\n    top:0!important;bottom:0!important;left:0!important;right:0!important;\n    width:100%!important;height:100dvh!important;max-height:100dvh!important;\n    border-radius:0!important;padding:14px 12px!important;\n  }\n  #pd-ia-test #pd-ia-editor-dock:not([hidden]) {\n    position:fixed!important;left:12px!important;right:12px!important;\n    top:var(--pdr-editor-top,42dvh)!important;bottom:auto!important;\n    transform:translateY(-50%)!important;\n    width:calc(100vw - 24px)!important;max-width:none!important;\n    margin:0!important;padding:6px!important;z-index:2147483000!important;\n    background:#fff!important;border:1px solid #dbe5f5!important;\n    border-radius:15px!important;box-shadow:0 14px 45px rgba(10,26,68,.28)!important;\n  }\n  #pd-ia-test #pd-ia-editor-dock .pd-field-controls {flex-wrap:nowrap!important}\n  #pd-ia-test #pd-ia-editor-dock .pd-field-input {font-size:16px!important;min-width:0!important}\n  #pd-ia-test .pd-mic.is-listening {\n    background:#d62828!important;color:#fff!important;border-color:#d62828!important;\n    box-shadow:0 0 0 4px rgba(214,40,40,.2)!important;\n  }\n}\n<\/style>\n\n\n<style id=\"pdr-suppression-modale-globale\">\n\/* Conserver les composants et leurs \u00e9couteurs internes, sans afficher l\u2019ancienne interface globale. *\/\n#pd-ia-test #pdr-open-filters { display:none !important; }\n\/* Les pastilles ouvrent le panneau de crit\u00e8res \u00e0 la demande. *\/\n#pd-ia-test #pd-ia-result:has(#pd-ia-filters-panel[hidden]) { display:none !important; }\n#pd-ia-test #pd-ia-result:not(:has(#pd-ia-filters-panel[hidden])) { display:block !important; }\n<\/style>\n<style id=\"pdr-final-inline-criteria\">\n#pd-ia-test #pdr-open-filters,#pd-ia-test #pd-ia-result{display:none!important}\n#pd-ia-test{position:relative!important}\n#pd-ia-test #pd-ia-start{justify-content:center!important}\n#pd-ia-test #pd-ia-start>.pd-input-wrap{flex:0 1 1080px!important;max-width:1080px!important;margin-left:auto!important;margin-right:auto!important}\n#pd-ia-test .pdr-criteria-row{display:flex!important;justify-content:center!important;width:100%!important;margin:12px auto 0!important;position:relative!important}\n#pd-ia-test #pdr-current-chips{display:flex!important;justify-content:center!important;flex-wrap:wrap!important;gap:7px!important;width:100%!important}\n#pd-ia-test .pdr-current-chip{cursor:pointer!important;white-space:normal!important;font-weight:600!important;padding:7px 11px!important}\n#pd-ia-test .pdr-other-criteria{display:flex;flex-wrap:wrap;gap:8px}\n#pd-ia-test .pdr-other-criterion{border:1px solid #dce5f4;background:#f7faff;border-radius:9px;padding:9px 12px;color:#0a1a44;cursor:pointer;font-weight:600}\n#pd-ia-test .pdr-more-chip{border-color:#17479e!important;color:#17479e!important}\n#pd-ia-test #pdr-chip-popover{position:absolute!important;z-index:2147483000!important;width:min(390px,calc(100vw - 36px))!important;max-height:min(65vh,570px)!important;overflow:auto!important;padding:14px!important;background:#fff!important;border:1px solid #dce5f4!important;border-radius:14px!important;box-shadow:0 12px 35px rgba(10,26,68,.19)!important;color:#0a1a44!important}\n#pd-ia-test #pdr-chip-popover[hidden]{display:none!important}\n#pd-ia-test .pdr-chip-popover-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}\n#pd-ia-test #pdr-chip-popover-close{border:0;background:none;font-size:24px;cursor:pointer}\n#pd-ia-test #pdr-chip-popover-body{display:block!important;min-height:40px}\n#pd-ia-test #pdr-chip-popover-body>.pd-field{display:block!important;width:100%!important;padding:8px!important;background:#fff!important}\n#pd-ia-test #pdr-chip-popover-body #pd-ia-editor-dock{display:block!important;position:static!important;transform:none!important;width:100%!important;max-width:100%!important;box-shadow:none!important;background:transparent!important;border:0!important;padding:0!important}\n#pd-ia-test #pdr-chip-popover-body .pd-field-controls{display:block!important;position:static!important;max-width:100%!important}\n#pd-ia-test #pdr-chip-popover:not([hidden]) #pdr-chip-popover-body .pd-field.is-editor-open .pd-field-controls{display:block!important;visibility:visible!important}\n#pd-ia-test #pdr-chip-popover:not([hidden]) #pdr-chip-popover-body #pd-ia-editor-dock:has(.pd-field-controls){display:block!important;visibility:visible!important;min-height:120px!important}\n#pd-ia-test #pdr-chip-popover-apply{margin-top:12px;background:#17479e;color:#fff;border:0;border-radius:9px;padding:10px 13px;font-weight:700;cursor:pointer}\n@media(max-width:767px){#pd-ia-test #pd-ia-start>.pd-input-wrap{flex:1 1 calc(100% - 120px)!important}#pd-ia-test .pdr-criteria-row{justify-content:center!important}#pd-ia-test #pdr-current-chips{justify-content:center!important}#pd-ia-test #pdr-chip-popover{left:8px!important;right:8px!important;width:calc(100% - 16px)!important}}\n\n\/* Correctif final : l'ancien panneau ne doit jamais appara\u00eetre, m\u00eame durant le chargement. *\/\n#pd-ia-test #pd-ia-result,\n#pd-ia-test #pd-ia-result:not([hidden]),\n#pd-ia-test #pd-ia-result:not(:has(#pd-ia-filters-panel[hidden])) { display:none!important; visibility:hidden!important; }\n#pd-ia-test #pdr-open-filters { display:none!important; }\n#pd-ia-test #pdr-chip-popover[hidden] { display:none!important; }\n#pd-ia-test #pdr-chip-popover .pdr-chip-popover-head { min-height:36px; gap:16px; }\n#pd-ia-test #pdr-chip-popover-close { display:flex!important;align-items:center;justify-content:center;flex:0 0 36px!important;width:36px!important;height:36px!important;border-radius:50%!important;background:#eef3fb!important;color:#071c4a!important;font-size:27px!important;font-weight:700!important;line-height:1!important;cursor:pointer!important; }\n#pd-ia-test #pdr-chip-popover-close:hover { background:#dce8fa!important; }\n#pdr-map-loading-screen[hidden] { display:none!important; }\n#pdr-map-loading-screen { position:fixed!important;inset:0!important;z-index:2147483646!important;display:flex!important;flex-direction:column!important;justify-content:center!important;align-items:center!important;gap:18px!important;background:rgba(255,255,255,.92)!important;backdrop-filter:blur(5px)!important;color:#0a245b!important;text-align:center!important;padding:24px!important; }\n#pdr-map-loading-screen .pdr-load-wheel { display:block;width:76px;height:76px;border:7px solid #d8e6ff;border-top-color:#17479e;border-radius:50%;animation:pdrMapSpin .8s linear infinite; }\n#pdr-map-loading-screen .pdr-load-title { font-size:clamp(19px,3vw,28px);font-weight:800; }\n#pdr-map-loading-screen .pdr-load-subtitle { font-size:15px;max-width:420px; }\n@keyframes pdrMapSpin { to { transform:rotate(360deg); } }\n@media(prefers-reduced-motion:reduce){#pdr-map-loading-screen .pdr-load-wheel{animation-duration:2s}}\n<\/style>\n<div id=\"pdr-map-loading-screen\" role=\"status\" aria-live=\"polite\" aria-label=\"Loading results\" hidden>\n  <span class=\"pdr-load-wheel\" aria-hidden=\"true\"><\/span>\n  <span class=\"pdr-load-title\">Searching\u2026<\/span>\n  <span class=\"pdr-load-subtitle\">We are preparing your results and the ProDispo map.<\/span>\n<\/div>\n<section id=\"pd-ia-start\">\n\n \n\n\n\n  <div class=\"pd-input-wrap\">\n    <svg class=\"pd-search-icon\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"10.8\" cy=\"10.8\" r=\"6.8\"><\/circle><path d=\"m16 16 5 5\"><\/path><\/svg>\n\n    <textarea id=\"pd-ia-demande\" maxlength=\"1000\" aria-label=\"How can ProDispo help you?\" placeholder=\"How can ProDispo help you?\"><\/textarea>\n\n    <button type=\"button\" id=\"pd-ia-clear\" class=\"pd-clear-main\" aria-label=\"Clear request\" title=\"Clear Request\">\u00d7<\/button>\n\n\n\n    <button type=\"button\" id=\"pd-ia-mic\" class=\"pd-mic pd-mic-main\" aria-label=\"Dictate my request\" aria-pressed=\"false\"><\/button>\n\n    <div id=\"pd-ia-loading\" class=\"pd-analysis-loading\" role=\"status\" aria-live=\"polite\" hidden=\"\">\n      <span class=\"pd-analysis-spinner\"><\/span>\n      <span>Analyzing...<\/span>\n    <\/div>\n\n  <\/div>\n\n  <button type=\"button\" id=\"pdr-open-filters\" aria-expanded=\"false\" aria-controls=\"pd-ia-filters-panel\" hidden style=\"display:none!important\" tabindex=\"-1\">Edit Criteria<\/button>\n\n  <p class=\"pd-search-example\">E.g.: I need help preparing my meals. <\/p>\n\n<div class=\"pd-hero-title\">\n  <h2 class=\"pd-hero-feature\">Is there a ProDispo?<\/h2>\n  <p class=\"pd-hero-description\"><span class=\"pd-hero-slogan\"><strong>From \"Who does this?\" to \"Who is available?\"<\/strong><\/span><span class=\"pd-hero-separator\"> \u2014 <\/span><span class=\"pd-hero-sentence\">One request, multiple candidates.<\/span> <span class=\"pd-hero-sentence\">Those who are available respond to you.<\/span><\/p>\n  <div class=\"pd-use-cases\" aria-label=\"Who is ProDispo for\">\n    <div class=\"pd-use-cases-grid\">\n      <div class=\"pd-use-case\"><h4 class=\"pd-use-case-title\"><span class=\"pd-use-case-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 10 9-7 9 7\"><\/path><path d=\"M5 9v12h14V9\"><\/path><path d=\"M9 21v-7h6v7\"><\/path><\/svg><\/span>Services for Individuals<\/h4><p class=\"pd-use-case-description\">Find help for personal, family, and daily needs.<\/p><\/div>\n      <div class=\"pd-use-case\"><h4 class=\"pd-use-case-title\"><span class=\"pd-use-case-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"7\" width=\"18\" height=\"14\" rx=\"2\"><\/rect><path d=\"M8 7V5a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M3 13h18M10 13v2h4v-2\"><\/path><\/svg><\/span>Services for Businesses<\/h4><p class=\"pd-use-case-description\">Identify resources to meet an organization's needs.<\/p><\/div>\n      <div class=\"pd-use-case\"><h4 class=\"pd-use-case-title\"><span class=\"pd-use-case-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"9\" cy=\"8\" r=\"3\"><\/circle><path d=\"M3 20v-2a6 6 0 0 1 12 0v2M17 11a3 3 0 1 0-1-5.8M18 14a5 5 0 0 1 3 5v1\"><\/path><\/svg><\/span>Professional Referencing<\/h4><p class=\"pd-use-case-description\">Find an available colleague for a replacement or client redirection.<\/p><\/div>\n      <div class=\"pd-use-case\"><h4 class=\"pd-use-case-title\"><span class=\"pd-use-case-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"10\" cy=\"8\" r=\"3\"><\/circle><path d=\"M3 20v-2a7 7 0 0 1 11-5.7\"><\/path><circle cx=\"17\" cy=\"17\" r=\"4\"><\/circle><path d=\"m20 20 2 2\"><\/path><\/svg><\/span>Recruitment<\/h4><p class=\"pd-use-case-description\">Identify profiles open to employment or collaboration opportunities.<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n  <div id=\"pd-ia-voice-status\" class=\"pd-status\" role=\"status\" aria-live=\"polite\"><\/div>\n<\/section>\n\n<div class=\"pdr-criteria-row\"><div id=\"pdr-current-chips\" aria-live=\"polite\"><\/div><\/div>\n<section id=\"pd-ia-result\" class=\"pd-review\" hidden=\"\">\n  <div class=\"pdr-panel-title\"><strong>Edit Search Criteria<\/strong><button type=\"button\" id=\"pdr-close-filters\" aria-label=\"Close search criteria\">\u00d7<\/button><\/div>\n  <p class=\"pd-analysis-intro\">Your need corresponds to:<\/p>\n  <div id=\"pd-ia-summary\" class=\"pd-criteria-summary\" aria-label=\"Identified criteria\" hidden=\"\"><\/div>\n  <button type=\"button\" id=\"pd-ia-toggle-filters\" class=\"pd-toggle-filters\" hidden=\"\" aria-expanded=\"true\" aria-controls=\"pd-ia-filters-panel\">Refine my search<\/button>\n  <div id=\"pd-ia-filters-panel\" class=\"pd-filters-panel\">\n    <div id=\"pd-ia-fields\"><\/div>\n    <div class=\"pdr-radius-control\"><span class=\"pdr-radius-title\">Search Radius<\/span><select id=\"pdr-radius\" aria-label=\"Search radius\"><option value=\"\">Any distance<\/option><option value=\"5\">5 km<\/option><option value=\"10\">10 km<\/option><option value=\"25\">25 km<\/option><option value=\"50\">50 km<\/option><option value=\"100\">100 km<\/option><option value=\"250\">250 km<\/option><option value=\"500\">500 km<\/option><\/select><\/div>\n\n\n    <div id=\"pd-ia-editor-dock\" class=\"pd-editor-dock\" hidden aria-label=\"Refine a criterion\"><\/div>\n  <\/div>\n\n  <div class=\"pdr-panel-actions\"><button type=\"button\" id=\"pdr-apply-filters\">Apply Criteria \u2197<\/button><\/div>\n  <div id=\"pd-ia-review-status\" class=\"pd-status\" role=\"status\" aria-live=\"polite\"><\/div>\n\n<\/section>\n<div class=\"pd-actions pd-actions-outside\" id=\"pd-ia-actions-outside\" hidden=\"\">\n  <button type=\"button\" id=\"pd-ia-see-results\" class=\"pd-button pd-primary\">Launch ProDispo Search<\/button>\n<\/div>\n\n<script>\n(function(){\n\"use strict\";\n\/\/ Le bouton suit la visibilit\u00e9 des crit\u00e8res sans \u00eatre dans leurs encadr\u00e9s.\nconst pdResultSection=document.getElementById(\"pd-ia-result\");\nconst pdExternalActions=document.getElementById(\"pd-ia-actions-outside\");\nif(pdResultSection&&pdExternalActions){\n  const syncActions=()=>{\n    const hasAnalysis=!pdResultSection.hidden;\n    pdExternalActions.hidden=!hasAnalysis;\n    const pdRoot=document.getElementById(\"pd-ia-test\");\n    if(pdRoot)pdRoot.classList.toggle(\"pd-has-analysis\",hasAnalysis);\n  };\n  new MutationObserver(syncActions).observe(pdResultSection,{attributes:true,attributeFilter:[\"hidden\"]});\n  syncActions();\n}\n\n\/* =========================================================\n   CONFIGURATION\n   ========================================================= *\/\n\nconst CONFIG={\n  analyser:\"\/wp-json\/prodispo-ia\/v1\/analyser\",\n  glossaires:\"\/wp-json\/prodispo-ia\/v1\/glossaires\",\n  interpreter:\"\/wp-json\/prodispo-ia\/v1\/interpreter-critere\",\n\n  \/* INSCRIRE LA CL\u00c9 GOOGLE ICI, UNE SEULE FOIS *\/\n  googleKey:\"AIzaSyDETxhF7k0FM8RInHGS3Q7fDZvojOE9MSU\",\n\n  textDelay:4500,\n  voiceDelay:1500,\n  locationDelay:400\n};\n\nconst DEFINITIONS=[\n  {\n    key:\"profil\",\n    title:\"Profile type\",\n    placeholder:\"Describe the profile type you are looking for.\",\n    multiple:true\n  },\n  {\n    key:\"professions\",\n    title:\"Suggested professions\",\n    placeholder:\"Describe your needs\u2026\",\n    multiple:true\n  },\n  {\n    key:\"specialites\",\n    title:\"Suggested specialties\",\n    placeholder:\"Specify the specialty you need.\",\n    multiple:true\n  },\n  {\n    key:\"ville\",\n    title:\"Location\",\n    placeholder:\"Specify a city, town, or geographic area.\",\n    location:true\n  },\n  {\n    key:\"genre\",\n    title:\"Provider gender\",\n    placeholder:\"Specify the provider\u2019s gender.\",\n    multiple:true\n  },\n  {\n    key:\"langues\",\n    title:\"Consultation language\",\n    placeholder:\"Specify your preferred consultation language.\",\n    multiple:true\n  },\n  {\n    key:\"lieux\",\n    title:\"Service delivery location\",\n    placeholder:\"Specify where the service should take place.\",\n    multiple:true\n  },\n  {\n    key:\"ordre\",\n    title:\"Regulatory body membership required?\",\n    placeholder:\"Do you require membership in a regulatory body?\",\n    multiple:false\n  }\n];\n\nconst VALUE_KEYS={\n  profil:\"profil_values\",\n  professions:\"professions_values\",\n  specialites:\"specialites_values\",\n  genre:\"genre_values\",\n  langues:\"langues_values\",\n  lieux:\"lieu_values\",\n  ordre:\"ordre_values\"\n};\n\nconst LABEL_KEYS={\n  profil:\"profil\",\n  professions:\"professions\",\n  specialites:\"specialites\",\n  genre:\"genre\",\n  langues:\"langues\",\n  lieux:\"lieux\",\n  ordre:\"ordre\"\n};\n\nconst DEFAULT_UNRESTRICTED=new Set([\n  \"profil\",\n  \"genre\",\"langues\",\"lieux\",\"ordre\"\n]);\n\nconst AI_FIELDS=new Set([\n  \"professions\",\"specialites\",\"langues\",\"genre\",\"profil\",\"lieux\",\"ordre\"\n]);\n\nconst MIC_SVG=`\n<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n  <rect x=\"9\" y=\"2\" width=\"6\" height=\"12\" rx=\"3\"><\/rect>\n  <path d=\"M5 10a7 7 0 0 0 14 0\"><\/path>\n  <path d=\"M12 17v5\"><\/path>\n  <path d=\"M8 22h8\"><\/path>\n<\/svg>`;\n\nconst GEO_SVG=`\n<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n  <circle cx=\"12\" cy=\"12\" r=\"8\"><\/circle>\n  <circle cx=\"12\" cy=\"12\" r=\"2\"><\/circle>\n  <path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\"><\/path>\n<\/svg>`;\n\nfunction normalize(value){\n  return String(value||\"\")\n    .normalize(\"NFD\")\n    .replace(\/[\\u0300-\\u036f]\/g,\"\")\n    .toLowerCase()\n    .replace(\/[\u2019']\/g,\" \")\n    .replace(\/[^a-z0-9]+\/g,\" \")\n    .trim()\n    .replace(\/\\s+\/g,\" \");\n}\n\nfunction init(){\n  const root=document.getElementById(\"pd-ia-test\");\n  if(!root||root.dataset.initialized===\"1\")return;\n\n  const $=selector=>root.querySelector(selector);\n\n  const textarea=$(\"#pd-ia-demande\");\n  const pdDesktopPlaceholder='How can ProDispo help you?';\n  const pdCriteriaUpdatedMessage='Your search criteria have been updated.';\n  let pdCriteriaUpdatedNotice=false;\n  const pdMobilePlaceholder='What do you need?';\n  function pdPlaceholderForViewport(){return window.matchMedia(\"(max-width:600px)\").matches?pdMobilePlaceholder:pdDesktopPlaceholder;}\n  function pdApplyResponsivePlaceholder(){\n    const value=pdPlaceholderForViewport();\n    textarea.dataset.originalPlaceholder=value;\n    if(!\/^(\u00c9coute en cours|Listening)\/i.test(textarea.placeholder))textarea.placeholder=pdCriteriaUpdatedNotice?pdCriteriaUpdatedMessage:value;\n  }\n  pdApplyResponsivePlaceholder();\n  window.addEventListener(\"resize\",pdApplyResponsivePlaceholder);\n\n  const result=$(\"#pd-ia-result\");\n  const fieldsContainer=$(\"#pd-ia-fields\");\n  const editorDock=$(\"#pd-ia-editor-dock\");\n  const summaryContainer=$(\"#pd-ia-summary\");\n  const filtersToggle=$(\"#pd-ia-toggle-filters\");\n  const filtersPanel=$(\"#pd-ia-filters-panel\");\n  const voiceStatus=$(\"#pd-ia-voice-status\");\n  const reviewStatus=$(\"#pd-ia-review-status\");\n  const analysisLoading=$(\"#pd-ia-loading\");\n  const clearButton=$(\"#pd-ia-clear\");\n  const mainMic=$(\"#pd-ia-mic\");\n  const resultsButton=$(\"#pd-ia-see-results\");\n\n  if(!summaryContainer||!filtersToggle||!filtersPanel||\n     !textarea||!result||!fieldsContainer||!editorDock||\n     !voiceStatus||!reviewStatus||!analysisLoading||\n     !clearButton||!mainMic||!resultsButton){\n    return;\n  }\n\n  function setFiltersOpen(open){\n    filtersPanel.hidden=!open;\n    filtersToggle.setAttribute(\"aria-expanded\",String(open));\n  }\n  filtersToggle.addEventListener(\"click\",()=>{\n    setFiltersOpen(filtersPanel.hidden);\n  });\n\n  root.dataset.initialized=\"1\";\n  mainMic.innerHTML=MIC_SVG;\n\n  let glossaries={};\n  let glossaryReady=false;\n  let glossaryPromise=null;\n\n  const ui={};\n  const selected={};\n  const fieldTimers={};\n  const fieldControllers={};\n  const fieldVersions={};\n\n  let lastData=null;\n  let lastSuccessfulText=\"\";\n  let analysisController=null;\n  let analysisVersion=0;\n  let analysisTimer=null;\n  let analyzing=false;\n\n  let city=\"\";\n  let confirmedLocation=null;\n  \/\/ A location selected in the clarification popup remains provisional until Apply.\n  let pdPendingLocationApproval=false;\n  let locationVersion=0;\n  let locationTimer=null;\n  let locationQuery=\"\";\n  let pdAmbiguousLocation=false;\n  let pdLocationLookupPending=false;\n  let geographicScope=\"non_precisee\";\n  let distanceKm=0;\n  let manualRadius=null;\n  let restoredFromURL=false;\n  let pdLocationMustBeChosen=false;\n  let pdInitialRequestAnalyzed=false;\n\n  let googlePlacesPromise=null;\n\n  const SpeechRecognition=\n    window.SpeechRecognition||window.webkitSpeechRecognition;\n\n  let recognition=null;\n  let listening=false;\n  let voiceField=null;\n  let voiceBase=\"\";\n  let voiceFinal=\"\";\n  let voiceResults={};\n  let voiceStopTimer=null;\n  let voiceShouldAnalyze=false;\n  let voiceSilentStop=false;\n  let voiceError=false;\n  let voiceCancelled=false;\n  let initialSearchVoice=false;\n  \/\/ Pr\u00e9serve le choix vocal sur les recherches successives de cette page.\n  \/\/ Une recherche provenant de l\u2019accueil exige un indicateur transmis par l\u2019accueil.\n  try{\n    initialSearchVoice=sessionStorage.getItem(\"pd-results-voice-mode\")===\"1\" ||\n      new URLSearchParams(location.search).get(\"pd_voice\")===\"1\";\n  }catch(e){}\n  let activeEditor=null;\n\n  function setStatus(element,message,error){\n    element.textContent=message||\"\";\n    element.classList.toggle(\"is-error\",!!error);\n  }\n\n  function setFieldMessage(key,message,error){\n    const field=ui[key];\n    if(!field)return;\n\n    field.message.textContent=message||\"\";\n    field.message.hidden=!message;\n    field.message.classList.toggle(\"is-info\",!error);\n  }\n\n  function setProcessing(key,value){\n    const field=ui[key];\n    if(!field)return;\n\n    field.row.classList.toggle(\"is-processing\",!!value);\n    field.spinner.hidden=!value;\n    field.input.setAttribute(\"aria-busy\",String(!!value));\n  }\n\n  function requestText(){\n    return textarea.value.trim().replace(\/\\s+\/g,\" \");\n  }\n\n  function stopAnalysisTimer(){\n    if(analysisTimer){\n      clearTimeout(analysisTimer);\n      analysisTimer=null;\n    }\n  }\n\n  function stopFieldTimer(key){\n    if(fieldTimers[key]){\n      clearTimeout(fieldTimers[key]);\n      fieldTimers[key]=null;\n    }\n  }\n\n  function cancelFieldRequest(key){\n    stopFieldTimer(key);\n    fieldVersions[key]=(fieldVersions[key]||0)+1;\n\n    if(fieldControllers[key]){\n      fieldControllers[key].abort();\n      fieldControllers[key]=null;\n    }\n\n    setProcessing(key,false);\n  }\n\n  function cancelAllFieldRequests(){\n    DEFINITIONS.forEach(def=>{\n      if(!def.location)cancelFieldRequest(def.key);\n    });\n  }\n\n  function cancelAnalysis(){\n    analysisVersion++;\n\n    if(analysisController){\n      analysisController.abort();\n      analysisController=null;\n    }\n\n    analyzing=false;\n    analysisLoading.hidden=true;\n  }\n\n  function pdShowMapLoader(message){\n    const overlay=document.getElementById(\"pdr-map-loading-screen\");\n    if(!overlay)return;\n    const label=overlay.querySelector(\".pdr-load-title\");\n    if(label&&message)label.textContent=message;\n    overlay.hidden=false;\n  }\n  function pdHideMapLoader(){\n    const overlay=document.getElementById(\"pdr-map-loading-screen\");\n    if(overlay)overlay.hidden=true;\n  }\n  \/\/ Au retour sur la page, maintenir un indicateur pendant la pr\u00e9paration de la carte.\n  try{\n    const started=Number(sessionStorage.getItem(\"pdr_map_loading_since\")||0);\n    sessionStorage.removeItem(\"pdr_map_loading_since\");\n    if(started&&Date.now()-started<30000){\n      pdShowMapLoader(\"Loading results and map\u2026\");\n      const began=Date.now();\n      const finish=()=>{\n        if(Date.now()-began<900){setTimeout(finish,900-(Date.now()-began));return;}\n        pdHideMapLoader();\n      };\n      window.addEventListener(\"load\",()=>setTimeout(finish,650),{once:true});\n      setTimeout(finish,9000); \/\/ S\u00e9curit\u00e9 si la carte tarde ou ne r\u00e9pond pas.\n      if(document.readyState===\"complete\")setTimeout(finish,1100);\n    }\n  }catch(e){}\n  function setAnalysisLoading(value){\n    analyzing=value;\n    analysisLoading.hidden=!value;\n    textarea.setAttribute(\"aria-busy\",String(!!value));\n  }\n\n  function resetSelections(){\n    DEFINITIONS.forEach(def=>{\n      if(!def.location)selected[def.key]=[];\n    });\n\n    city=\"\";\n    confirmedLocation=null;\n    locationQuery=\"\";\n    locationVersion++;\n    geographicScope=\"non_precisee\";\n    distanceKm=0;\n    manualRadius=null;\n  }\n\n  resetSelections();\n\n  function getOptions(key){\n    const glossary=glossaries[key];\n\n    return glossary&&Array.isArray(glossary.options)\n      ?glossary.options:[];\n  }\n\n  \/\/ La langue de la PAGE (et non celle du texte soumis \u00e0 l'IA) d\u00e9termine les libell\u00e9s.\n  \/\/ WPML utilise normalement \/en\/ pour les pages anglaises.\n  function displayLanguage(){\n    \/\/ This Elementor block is dedicated to the English results page.\n    \/\/ Do not rely on the URL or document lang, which can be inconsistent in WPML.\n    return \"en\";\n  }\n\n  \/\/ Valeurs stables du glossaire \u00ab Service delivery location \u00bb (ID 18).\n  \/\/ \u00c9vite qu'une \u00e9tiquette renvoy\u00e9e en anglais par l'IA remplace le libell\u00e9 FR.\n  const CONSULTATION_LABELS={\n    a_domicile:{fr:\"Au domicile du client\",en:\"At the client's home\"},\n    bureau_professionnel:{fr:\"Bureau du professionnel\",en:\"Professional's office\"},\n    bureau_du_professionnel:{fr:\"Bureau du professionnel\",en:\"Professional's office\"},\n    videoconference:{fr:\"Vid\u00e9oconf\u00e9rence\",en:\"Video consultation\"},\n    _:{fr:\"No preference\",en:\"No preference\"}\n  };\n\n  function labelFor(option){\n    if(!option)return \"\";\n    const language=\"en\";\n    const value=String(option.value||\"\");\n    if(getOptions(\"lieux\").includes(option)&&CONSULTATION_LABELS[value]){\n      return CONSULTATION_LABELS[value][language];\n    }\n    \/\/ Libell\u00e9s d'affichage propres \u00e0 la page des r\u00e9sultats EN.\n    \/\/ Les Field Value JetEngine restent inchang\u00e9es pour les filtres.\n    if(getOptions(\"profil\").includes(option)){\n      const PROFILE_DISPLAY_LABELS={\n        pro:\"Offers services\",\n        emploi:\"Employment or Internship\"\n      };\n      if(Object.prototype.hasOwnProperty.call(PROFILE_DISPLAY_LABELS,value)){\n        return PROFILE_DISPLAY_LABELS[value];\n      }\n    }\n    \/\/ Toujours privil\u00e9gier le champ du glossaire correspondant \u00e0 la page.\n    \/\/ L'autre langue n'est utilis\u00e9e qu'en dernier recours si la traduction manque.\n    const preferred=language===\"en\"?option.label_en:option.label_fr;\n    const fallback=language===\"en\"?option.label_fr:option.label_en;\n    return preferred||fallback||value;\n  }\n\n  function optionByValue(key,value){\n    return getOptions(key).find(option=>\n      String(option.value)===String(value)\n    )||null;\n  }\n\n  function optionByLabel(key,label){\n    const target=normalize(label);\n\n    return getOptions(key).find(option=>\n      normalize(option.label_fr)===target||\n      normalize(option.label_en)===target\n    )||null;\n  }\n\n  \/\/ Correspondance explicite avec un libell\u00e9 complet du glossaire.\n  \/\/ Tol\u00e8re les pluriels simples (soin\/soins), mais pas les sous-cha\u00eenes\n  \/\/ g\u00e9n\u00e9riques : \u00ab soin des pieds \u00bb ne devient pas \u00ab soins de sant\u00e9 \u00e0 domicile \u00bb.\n  function glossaryPhraseTokens(text){\n    return normalize(text).split(\" \").filter(Boolean).map(token=>\n      token.length>3&&token.endsWith(\"s\")&&!token.endsWith(\"ss\")\n        ?token.slice(0,-1):token\n    );\n  }\n\n  function explicitGlossaryMatches(key,request){\n    const words=glossaryPhraseTokens(request);\n    if(!words.length)return [];\n    const candidates=[];\n    getOptions(key).forEach(option=>{\n      if(String(option.value)===\"_\")return;\n      const labels=[option.label_fr,option.label_en].filter(Boolean);\n      let best=0;\n      labels.forEach(label=>{\n        const tokens=glossaryPhraseTokens(label);\n        \/\/ \u00c9viter les libell\u00e9s trop vagues \u00e0 un seul mot.\n        if(tokens.length===1&&tokens[0].length<6)return;\n        if(!tokens.length||tokens.length>words.length)return;\n        for(let i=0;i<=words.length-tokens.length;i++){\n          if(tokens.every((word,j)=>word===words[i+j])){\n            best=Math.max(best,tokens.length);\n            break;\n          }\n        }\n      });\n      if(best)candidates.push({option,score:best});\n    });\n    if(!candidates.length)return [];\n    const highest=Math.max(...candidates.map(item=>item.score));\n    \/\/ Pr\u00e9f\u00e9rer le libell\u00e9 le plus pr\u00e9cis, sans emp\u00eacher deux libell\u00e9s\n    \/\/ distincts et explicitement mentionn\u00e9s d'\u00eatre s\u00e9lectionn\u00e9s.\n    return candidates.filter(item=>item.score===highest).map(item=>item.option);\n  }\n\n  \/\/ Respect explicit building context when choosing professions from the glossary.\n  \/\/ Only use existing glossary entries; never manufacture profession IDs.\n  function professionBuildingContext(request){\n    const text=normalize(request);\n    const commercial=\/\\b(magasin|boutique|commerce|commercial|commerciale|commerciaux|entreprise|local commercial|locaux commerciaux|restaurant|hotel|shop|store|retail|business premises|commercial property|commercial building|office building)\\b\/.test(text);\n    const residential=\/\\b(maison|residence|residentiel|residentielle|residentiels|appartement|condo|logement|domicile|chez moi|chez nous|my house|my home|apartment|residential|condominium)\\b\/.test(text);\n    return commercial&&!residential?\"commercial\":residential&&!commercial?\"residential\":null;\n  }\n\n  function professionSector(option){\n    const label=normalize([option.label_fr,option.label_en].filter(Boolean).join(\" \"));\n    const residential=\/\\b(residentiel|residentielle|residentiels|residential|domestique)\\b\/.test(label);\n    const commercial=\/\\b(commercial|commerciale|commerciaux|commerciales)\\b\/.test(label);\n    if(residential&&!commercial)return \"residential\";\n    if(commercial&&!residential)return \"commercial\";\n    return null;\n  }\n\n  function refineProfessionMatches(matches,request){\n    const context=professionBuildingContext(request);\n    if(!context)return matches;\n    const options=getOptions(\"professions\");\n    const kept=matches.filter(option=>{\n      const sector=professionSector(option);\n      return !sector||sector===context;\n    });\n    \/\/ When an explicit commercial\/residential renovation request was made,\n    \/\/ prefer the matching sector-specific renovation category if present.\n    const text=normalize(request);\n    const renovation=\/\\b(renovation|renover|renove|renovations|remodel|remodeling|renovate|renovating|construction|travaux)\\b\/.test(text);\n    if(renovation){\n      const sectorRenovations=options.filter(option=>{\n        if(String(option.value)===\"_\"||professionSector(option)!==context)return false;\n        const label=normalize([option.label_fr,option.label_en].filter(Boolean).join(\" \"));\n        return \/\\b(renovation|renovations|construction|remodel|renovating)\\b\/.test(label);\n      });\n      sectorRenovations.forEach(option=>{\n        if(!kept.some(item=>String(item.value)===String(option.value)))kept.unshift(option);\n      });\n    }\n    return kept;\n  }\n\n  \/\/ Common job names and equivalent service expressions. Resolve to REAL glossary\n  \/\/ options; never create an ID or use these terms as labels in the results.\n  function professionAliases(query,mode){\n    const q=normalize(query);\n    const options=getOptions(\"professions\");\n    const combined=option=>normalize([option.label_fr,option.label_en].filter(Boolean).join(\" \"));\n    const results=[];\n    const addWhere=(test)=>options.forEach(option=>{\n      if(String(option.value)===\"_\"||!test(combined(option)))return;\n      if(!results.some(item=>String(item.value)===String(option.value)))results.push(option);\n    });\n    \/\/ Tax preparation: identify the specialized glossary profession from everyday\n    \/\/ language, while keeping the AI's other relevant matches (e.g. CPA).\n    \/\/ Never create an artificial category: match existing FR\/EN glossary labels.\n    const taxIntent=\/\\b(impot|impots|declaration de revenu|declaration des revenus|declaration fiscale|rapport d impot|rapport d impots|tax return|tax returns|income tax|income taxes|tax filing|file my taxes|filing taxes|prepare my taxes|tax preparation|tax preparer|personal taxes|self employed taxes)\\b\/.test(q);\n    const businessTax=\/\\b(impot des societes|impots des societes|impot des entreprises|impots des entreprises|fiscalite des entreprises|corporate tax|corporate taxes|business taxes|company taxes|business tax return)\\b\/.test(q);\n    if(taxIntent){\n      if(businessTax){\n        addWhere(label=>\/\\b(fiscalite des entreprises|impots des entreprises|impot des societes|corporate tax|business tax)\\b\/.test(label));\n      }else{\n        addWhere(label=>\/\\b(impots des particuliers|impot des particuliers|travailleurs autonomes|travailleur autonome|personal tax|individual tax|self.employed tax|income tax preparation|tax returns for individuals)\\b\/.test(label));\n        \/\/ Personal income tax can be prepared by both specialized tax providers\n        \/\/ and CPAs. Include BOTH real glossary professions, without creating IDs.\n        addWhere(label=>\/\\b(comptabilite cpa|comptable professionnel agree|comptable professionnel accredite|accounting cpa|chartered professional accountant|certified professional accountant|cpa accounting)\\b\/.test(label));\n      }\n    }\n    const painting=\/\\b(peintre|peintres|painter|painters|house painter|building painter|painting contractor)\\b\/.test(q);\n    const artistic=\/\\b(artiste|artist|portrait|portraitiste|dessinateur|illustration|canvas|toile|tableau|artwork)\\b\/.test(q);\n    const building=\/\\b(batiment|building|mur|murs|wall|walls|maison|house|home|magasin|store|shop|commerce|commercial|renovation|renover|repeindre|repaint|peindre|paint a|paint my)\\b\/.test(q);\n    if(painting){\n      \/\/ The filter is exploratory: show both senses for a bare \"painter\".\n      \/\/ For an explicit building context, prefer the building painting trade.\n      addWhere(label=>\/\\b(peinture|painting)\\b\/.test(label)&&!\/\\b(artiste|artist|portrait|dessinateur)\\b\/.test(label));\n      if((mode===\"filter\"&&!building)||artistic){\n        addWhere(label=>\/\\b(artiste peintre|portraitiste|artist painter|portrait painter)\\b\/.test(label));\n      }\n      if(mode===\"analysis\"&&artistic&&!building){\n        return results.filter(option=>\/\\b(artiste|artist|portrait|dessinateur)\\b\/.test(combined(option)));\n      }\n    }\n    const disaster=\/\\b(sinistre|sinistres|disaster|flood|flooding|fire damage|water damage|degat d eau|degats d eau|incendie|smoke damage)\\b\/.test(q);\n    const cleaning=\/\\b(menage|nettoyage|nettoyer|nettoyages|clean|cleaning|cleanup|clean up|restoration|remise en etat)\\b\/.test(q);\n    if(disaster&&cleaning){\n      addWhere(label=>\/\\b(nettoyage apres sinistre|disaster cleanup|disaster cleaning|post disaster cleaning|post disaster cleanup)\\b\/.test(label));\n    }\n    return results;\n  }\n\n  \/\/ Contexte fiscal explicite : filtrer les suggestions IA trop larges.\n  \/\/ Les deux familles (personnelle et entreprise) sont mutuellement exclusives.\n  function pdTaxContext(request){\n    const q=normalize(String(request||\"\"));\n    const tax=\/\\b(impot|impots|fiscalite|fiscal|tax|taxes|taxation|declaration de revenus?|declarations? de revenus?|rapport d impots?|income tax|tax returns?|tax filing|tax preparation)\\b\/.test(q);\n    if(!tax)return null;\n    const business=\/\\b(compagnie|compagnies|entreprise|entreprises|societe|societes|corporation|corporatif|corporative|commerciale?|incorpore|incorporee|incorporation|business|businesses|company|companies|corporate|corporation|incorporated|small business)\\b\/.test(q);\n    const personal=\/\\b(particulier|particuliers|personnel|personnels|personnelle|personnelles|travailleur autonome|travailleurs autonomes|self employed|self employment|personal|individual)\\b\/.test(q);\n    return business?\"business\":personal?\"personal\":\"personal\";\n  }\n  function pdTaxProfessionMatches(request){\n    const context=pdTaxContext(request);\n    if(!context)return null;\n    const options=getOptions(\"professions\");\n    const label=option=>normalize([option.label_fr,option.label_en].filter(Boolean).join(\" \"));\n    const results=[];\n    const add=test=>options.forEach(option=>{\n      if(String(option.value)===\"_\"||!test(label(option)))return;\n      if(!results.some(item=>String(item.value)===String(option.value)))results.push(option);\n    });\n    if(context===\"business\"){\n      add(l=>\/\\b(fiscalite|taxation|tax consulting|tax advisory|tax services)\\b\/.test(l)&&!(\/\\b(particulier|personal|individual|travailleur autonome|self employed)\\b\/.test(l)));\n    }else{\n      add(l=>\/\\b(impots des particuliers|impot des particuliers|travailleurs autonomes|personal income tax|self employed taxes|individual tax)\\b\/.test(l));\n    }\n    add(l=>\/\\b(comptabilite cpa|comptable professionnel agree|comptable professionnel accredite|accounting cpa|chartered professional accountant|certified professional accountant)\\b\/.test(l));\n    return results;\n  }\n  function pdTaxSpecialtyMatches(request){\n    const context=pdTaxContext(request);\n    if(!context)return null;\n    if(context===\"business\"){\n      \/\/ Ne pas appliquer des sp\u00e9cialit\u00e9s personnelles aux imp\u00f4ts d'entreprise.\n      return getOptions(\"specialites\").filter(option=>{\n        const l=normalize([option.label_fr,option.label_en].filter(Boolean).join(\" \"));\n        return \/\\b(impots des entreprises|impot des entreprises|fiscalite des entreprises|corporate tax|business tax)\\b\/.test(l);\n      });\n    }\n    \/\/ Pour les particuliers, conserver uniquement les sp\u00e9cialit\u00e9s personnelles\n    \/\/ d\u00e9j\u00e0 identifi\u00e9es par l'IA (ne pas ajouter des cat\u00e9gories au hasard).\n    return null;\n  }\n\n  function findMatches(key,query){\n    const text=normalize(query);\n    if(!text)return [];\n    const direct=getOptions(key).filter(option=>\n      normalize(option.label_fr).includes(text)||normalize(option.label_en).includes(text)\n    );\n    if(key!==\"professions\")return direct.slice(0,12);\n    const merged=[];\n    [...professionAliases(query,\"filter\"),...direct].forEach(option=>{\n      if(!merged.some(item=>String(item.value)===String(option.value)))merged.push(option);\n    });\n    return merged.slice(0,12);\n  }\n\n  function resolveConsultationSynonym(text){\n    const value=normalize(text);\n\n    const groups=[\n      {\n        test:\/\\b(en ligne|a distance|a distanciel|en virtuel|virtuellement|par video|videoconference|visioconference|visio|zoom|teams|teleconsultation|online|remote|virtual)\\b\/,\n        labels:[\"visioconference\",\"videoconference\",\"video\",\"online\",\"virtual\"]\n      },\n      {\n        test:\/\\b(a domicile|chez moi|chez nous|a la maison|chez le client|chez le patient|at home|home visit)\\b\/,\n        labels:[\"domicile\",\"home\"]\n      },\n      {\n        test:\/\\b(en bureau|au bureau|en cabinet|au cabinet|en clinique|sur place|in office|in person)\\b\/,\n        labels:[\"bureau\",\"cabinet\",\"office\"]\n      }\n    ];\n\n    const matching=groups.filter(group=>group.test.test(value));\n    if(matching.length!==1)return null;\n\n    return getOptions(\"lieux\").find(option=>{\n      const combined=normalize(\n        (option.label_fr||\"\")+\" \"+\n        (option.label_en||\"\")+\" \"+\n        (option.value||\"\")\n      );\n\n      return matching[0].labels.some(term=>\n        combined.includes(normalize(term))\n      );\n    })||null;\n  }\n\n  function localInterpretation(key,text){\n    const normalized=normalize(text);\n\n    if(key===\"lieux\"){\n      return resolveConsultationSynonym(text);\n    }\n\n    if(key===\"genre\"){\n      const options=getOptions(\"genre\");\n      const byLabel=(name)=>options.find(option=>\n        normalize(String(option.value||\"\")+\" \"+String(option.label_fr||\"\")+\" \"+String(option.label_en||\"\"))\n          .split(\/\\s+\/).includes(name)\n      );\n      const found=[];\n      const add=option=>{if(option&&!found.some(x=>String(x.value)===String(option.value)))found.push(option);};\n      const female=\/\\b(femme|femmes|feminin|female|woman|women)\\b\/.test(normalized);\n      const male=\/\\b(homme|hommes|masculin|male|man|men)\\b\/.test(normalized);\n      if(female)add(byLabel(\"femme\")||byLabel(\"female\"));\n      if(male)add(byLabel(\"homme\")||byLabel(\"male\"));\n      const other=\/\\b(autre|other|non binaire|non binary|nonbinary|genderqueer|genre fluide|gender fluid|agenre|transgenre|trans|queer|neutre|non conforme|ni homme ni femme)\\b\/.test(normalized);\n      const unrestricted=\/\\b(peu importe|sans preference|indifferent|tous les genres|n importe quel genre)\\b\/.test(normalized);\n      if(other&&!unrestricted)add(byLabel(\"autre\")||byLabel(\"other\"));\n      return found.length?found:null;\n    }\n\n    return null;\n  }\n\n  async function fetchJSON(url,options){\n    const response=await fetch(url,options);\n    const type=response.headers.get(\"content-type\")||\"\";\n\n    if(!type.includes(\"application\/json\")){\n      if(response.status===429){\n        throw new Error(\n          \"Trop de demandes. R\u00e9essayez dans quelques instants.\"\n        );\n      }\n\n      throw new Error(\n        \"R\u00e9ponse du serveur invalide (HTTP \"+response.status+\").\"\n      );\n    }\n\n    const data=await response.json();\n\n    if(!response.ok){\n      throw new Error(\n        data.message||\"HTTP error \"+response.status\n      );\n    }\n\n    return data;\n  }\n\n  async function loadGlossaries(){\n    if(glossaryPromise)return glossaryPromise;\n\n    glossaryPromise=(async()=>{\n      const data=await fetchJSON(CONFIG.glossaires,{\n        method:\"GET\",\n        credentials:\"same-origin\",\n        headers:{\n          ...(window.pdIaNonce ? {\"X-WP-Nonce\":window.pdIaNonce} : {})\n        }\n      });\n\n      const required=[\n        \"professions\",\"specialites\",\"langues\",\n        \"genre\",\"lieux\",\"ordre\",\"profil\"\n      ];\n\n      if(!data.success||!data.glossaires||\n         !required.every(key=>\n           data.glossaires[key]&&\n           Array.isArray(data.glossaires[key].options)\n         )){\n        throw new Error(\"Incomplete glossaries.\");\n      }\n\n      glossaries=data.glossaires;\n      glossaryReady=true;\n      return true;\n    })();\n\n    try{\n      return await glossaryPromise;\n    }catch(error){\n      glossaryPromise=null;\n      setStatus(\n        voiceStatus,\n        \"Unable to load search options: \"+error.message,\n        true\n      );\n      return false;\n    }\n  }\n\n  function renderSummary(){\n    summaryContainer.innerHTML=\"\";\n    let count=0;\n    function addChip(label,onRemove){\n      count++;\n      const chip=document.createElement(\"span\");\n      chip.className=\"pd-summary-chip\";\n      const text=document.createElement(\"span\");\n      text.textContent=label;\n      const remove=document.createElement(\"button\");\n      remove.type=\"button\";\n      remove.textContent=\"\u00d7\";\n      remove.setAttribute(\"aria-label\",\"Remove \"+label);\n      remove.addEventListener(\"click\",onRemove);\n      chip.appendChild(text);\n      chip.appendChild(remove);\n      summaryContainer.appendChild(chip);\n    }\n    if(!(selected.profil||[]).length){\n      const chip=document.createElement(\"span\");\n      chip.className=\"pd-summary-chip pd-summary-profile-unspecified\";\n      chip.textContent=\"Profile type: Not specified\";\n      summaryContainer.appendChild(chip);\n      count++;\n    }\n    DEFINITIONS.forEach(def=>{\n      if(def.location){\n        if(confirmedLocation&&city){\n          addChip(city,()=>clearLocation());\n        }\n        return;\n      }\n      (selected[def.key]||[]).forEach(option=>{\n        addChip(labelFor(option),()=>{\n          cancelFieldRequest(def.key);\n          selected[def.key]=selected[def.key].filter(item=>\n            String(item.value)!==String(option.value)\n          );\n          renderSelected(def.key);\n          updateDistance();\n        });\n      });\n    });\n    if(!count){\n      const empty=document.createElement(\"span\");\n      empty.className=\"pd-summary-empty\";\n      empty.textContent=\"No criteria selected.\";\n      summaryContainer.appendChild(empty);\n    }\n    reorderCriteria();\n  }\n\n  function renderSelected(key){\n    if(key===\"lieux\"||key===\"professions\")pdClearAutomaticLocationIfRemote();\n    const field=ui[key];\n    if(!field||field.def.location)return;\n\n    field.selectedArea.innerHTML=\"\";\n\n    const options=selected[key];\n    const visibleLimit=2;\n    const extras=document.createElement(\"div\");\n    extras.className=\"pd-chip-extras\";\n    extras.hidden=true;\n    extras.id=\"pd-extra-\"+key;\n\n    options.forEach((option,index)=>{\n      const chip=document.createElement(\"span\");\n      chip.className=\"pd-chip\";\n\n      const label=document.createElement(\"span\");\n      label.className=\"pd-chip-label\";\n      label.textContent=labelFor(option);\n\n      const remove=document.createElement(\"button\");\n      remove.type=\"button\";\n      remove.textContent=\"\u00d7\";\n      remove.setAttribute(\n        \"aria-label\",\"Remove \"+labelFor(option)\n      );\n\n      remove.addEventListener(\"click\",()=>{\n        cancelFieldRequest(key);\n\n        selected[key]=selected[key].filter(item=>\n          String(item.value)!==String(option.value)\n        );\n\n        renderSelected(key);\n        updateDistance();\n      });\n\n      chip.appendChild(label);\n      chip.appendChild(remove);\n      (index<visibleLimit?field.selectedArea:extras).appendChild(chip);\n    });\n    if(options.length>visibleLimit){\n      const more=document.createElement(\"button\");\n      more.type=\"button\";\n      more.className=\"pd-chip-more\";\n      more.textContent=\"+\"+(options.length-visibleLimit);\n      more.setAttribute(\"aria-expanded\",\"false\");\n      more.setAttribute(\"aria-controls\",extras.id);\n      more.setAttribute(\"aria-label\",\"Show \"+(options.length-visibleLimit)+\" more options\");\n      more.addEventListener(\"click\",event=>{\n        event.stopPropagation();\n        const show=extras.hidden;\n        extras.hidden=!show;\n        more.setAttribute(\"aria-expanded\",String(show));\n      });\n      field.selectedArea.appendChild(more);\n      field.selectedArea.appendChild(extras);\n    }\n    renderSummary();\n  }\n\n  let pdProfessionClarificationMode=false;\n  function addSelection(key,option){\n    const field=ui[key];\n    if(!field||!option||option.value===\"_\")return;\n\n    cancelFieldRequest(key);\n\n    if(field.def.multiple){\n      if(!selected[key].some(item=>\n        String(item.value)===String(option.value)\n      )){\n        selected[key].push(option);\n      }\n    }else{\n      selected[key]=[option];\n    }\n\n    if(!(key===\"professions\"&&pdProfessionClarificationMode))field.input.value=\"\";\n    field.dropdown.hidden=true;\n    setFieldMessage(key,\"\",false);\n\n    renderSelected(key);\n    updateDistance();\n    reorderCriteria();\n    \/\/ Aucune recherche automatique pendant l'\u00e9dition d'un crit\u00e8re.\n    \/\/ Seul le clic sur \u00ab Apply this criterion \u00bb valide et lance la recherche.\n    if(activeEditor===key && !(key===\"professions\"&&pdProfessionClarificationMode)){\n      if(listening&&voiceField===key)stopVoice(true);\n      closeAllEditors();\n    }\n  }\n\n  function renderDropdown(key){\n    const field=ui[key];\n    if(!field||field.def.location)return;\n\n    field.dropdown.innerHTML=\"\";\n\n    const text=field.input.value.trim();\n\n    if(!glossaryReady){\n      field.dropdown.hidden=true;\n      return;\n    }\n\n    \/\/ Le type de profil n'a que deux choix : les montrer d\u00e8s l'ouverture\n    \/\/ et les conserver visibles pendant la saisie.\n    const matches=key===\"profil\"\n      ?getOptions(\"profil\").filter(option=>\n          option.value===\"pro\"||option.value===\"emploi\"\n        )\n      :text?findMatches(key,text):[];\n\n    if(!matches.length){\n      field.dropdown.hidden=true;\n      return;\n    }\n\n    matches.forEach(option=>{\n      const button=document.createElement(\"button\");\n      button.type=\"button\";\n      button.className=\"pd-option\";\n      button.textContent=labelFor(option);\n\n      button.addEventListener(\n        \"mousedown\",event=>event.preventDefault()\n      );\n\n      button.addEventListener(\"click\",()=>{\n        addSelection(key,option);\n      });\n\n      field.dropdown.appendChild(button);\n    });\n\n    field.dropdown.hidden=false;\n  }\n\n  function showUnavailable(key){\n    const field=ui[key];\n    if(!field)return;\n\n    field.dropdown.hidden=true;\n    setFieldMessage(\n      key,\n      \"Unavailable. Try another option.\",\n      true\n    );\n  }\n\n  async function interpretField(key,spokenText){\n    const field=ui[key];\n    if(!field||field.def.location)return;\n\n    const text=String(\n      spokenText!==undefined\n        ?spokenText\n        :field.input.value\n    ).trim();\n\n    if(!text)return;\n\n    cancelFieldRequest(key);\n\n    const version=fieldVersions[key];\n\n    field.input.value=text;\n    field.dropdown.hidden=true;\n    setFieldMessage(key,\"\",false);\n\n    if(!glossaryReady){\n      const loaded=await loadGlossaries();\n      if(!loaded||version!==fieldVersions[key])return;\n    }\n\n    if(key===\"professions\"){\n      const aliases=professionAliases(text,\"filter\");\n      if(aliases.length>1){renderDropdown(key);setFieldMessage(key,\"Select a profession or describe your needs.\",false);return;}\n      if(aliases.length===1){addSelection(key,aliases[0]);return;}\n    }\n\n    const synonym=localInterpretation(key,text);\n\n    if(synonym){\n      (Array.isArray(synonym)?synonym:[synonym]).forEach(option=>addSelection(key,option));\n      return;\n    }\n\n    const exact=optionByLabel(key,text);\n\n    if(exact&&exact.value!==\"_\"){\n      addSelection(key,exact);\n      return;\n    }\n\n    if(!AI_FIELDS.has(key)){\n      const matches=findMatches(key,text);\n\n      if(matches.length===1){\n        addSelection(key,matches[0]);\n      }else if(matches.length>1){\n        renderDropdown(key);\n        setFieldMessage(\n          key,\n          \"Select the appropriate option.\",\n          false\n        );\n      }else{\n        showUnavailable(key);\n      }\n\n      return;\n    }\n\n    const controller=new AbortController();\n    fieldControllers[key]=controller;\n    setProcessing(key,true);\n\n    try{\n      \/\/ Profession : la saisie clavier et vocale suivent toutes deux le\n      \/\/ m\u00eame moteur de compr\u00e9hension des besoins que la barre principale.\n      if(key===\"professions\"){\n        const analysis=await fetchJSON(CONFIG.analyser,{\n          method:\"POST\",credentials:\"same-origin\",signal:controller.signal,\n          headers:{\"Content-Type\":\"application\/json\",\n            ...(window.pdIaNonce?{\"X-WP-Nonce\":window.pdIaNonce}:{})},\n          body:JSON.stringify({demande:text})\n        });\n        if(version!==fieldVersions[key])return;\n        const values=Array.isArray(analysis.professions)?analysis.professions:[];\n        const labels=Array.isArray(analysis.professions_labels)?analysis.professions_labels:[];\n        const recognized=[];\n        [...values.map(value=>optionByValue(key,value)||optionByLabel(key,value)),\n         ...labels.map(label=>optionByLabel(key,label))].forEach(option=>{\n          if(option&&option.value!==\"_\"&&!recognized.some(item=>item.value===option.value))recognized.push(option);\n        });\n        if(recognized.length){\n          recognized.forEach(option=>addSelection(key,option));\n          return;\n        }\n        const alternatives=findMatches(key,text);\n        if(alternatives.length===1){addSelection(key,alternatives[0]);return;}\n        if(alternatives.length>1){renderDropdown(key);setFieldMessage(key,\"Choose the matching result.\",false);return;}\n        setFieldMessage(key,\"Describe your needs to find the right professional.\",false);\n        return;\n      }\n      const data=await fetchJSON(CONFIG.interpreter,{\n        method:\"POST\",\n        credentials:\"same-origin\",\n        signal:controller.signal,\n        headers:{\n          \"Content-Type\":\"application\/json\",\n          ...(window.pdIaNonce ? {\"X-WP-Nonce\":window.pdIaNonce} : {})\n        },\n        body:JSON.stringify({\n          champ:key,\n          texte:text\n        })\n      });\n\n      if(version!==fieldVersions[key])return;\n\n      const values=Array.isArray(data.values)\n        ?data.values:[];\n\n      const matches=[];\n\n      values.forEach(value=>{\n        if(value===\"_\")return;\n\n        const option=optionByValue(key,value);\n\n        if(option&&!matches.some(item=>\n          item.value===option.value\n        )){\n          matches.push(option);\n        }\n      });\n\n      if(key===\"genre\"){\n        const other=getOptions(\"genre\").find(option=>normalize(option.value)===\"autre\"||normalize(option.label_fr)===\"autre\");\n        values.forEach(value=>{if(value!==\"_\"&&!optionByValue(\"genre\",value)&&other&&!matches.some(x=>x.value===other.value))matches.push(other);});\n      }\n      if(matches.length){\n        matches.forEach(option=>{\n          addSelection(key,option);\n        });\n      }else{\n        const direct=findMatches(key,text);\n\n        if(direct.length===1){\n          addSelection(key,direct[0]);\n        }else if(direct.length>1){\n          renderDropdown(key);\n          setFieldMessage(\n            key,\n            \"Select the appropriate option.\",\n            false\n          );\n        }else{\n          setFieldMessage(key,\"Describe your needs or choose a suggestion.\",false);\n        }\n      }\n\n    }catch(error){\n      if(version!==fieldVersions[key]||error.name===\"AbortError\")return;\n      \/\/ L'API \/interpreter peut refuser \u00ab professions \u00bb (crit\u00e8re non pris\n      \/\/ en charge). R\u00e9utiliser l'API principale d'analyse des besoins.\n      if(key===\"professions\"){\n        try{\n          const analysis=await fetchJSON(CONFIG.analyser,{\n            method:\"POST\",credentials:\"same-origin\",signal:controller.signal,\n            headers:{\"Content-Type\":\"application\/json\",\n              ...(window.pdIaNonce?{\"X-WP-Nonce\":window.pdIaNonce}:{})},\n            body:JSON.stringify({demande:text})\n          });\n          if(version!==fieldVersions[key])return;\n          const raw=Array.isArray(analysis.professions)?analysis.professions:[];\n          const labels=Array.isArray(analysis.professions_labels)?analysis.professions_labels:[];\n          const matches=[];\n          raw.forEach(value=>{\n            const opt=optionByValue(\"professions\",value)||optionByLabel(\"professions\",value);\n            if(opt&&opt.value!==\"_\"&&!matches.some(x=>x.value===opt.value))matches.push(opt);\n          });\n          labels.forEach(value=>{\n            const opt=optionByLabel(\"professions\",value);\n            if(opt&&opt.value!==\"_\"&&!matches.some(x=>x.value===opt.value))matches.push(opt);\n          });\n          if(!matches.length){\n            professionAliases(text,\"analysis\").forEach(opt=>{\n              if(!matches.some(x=>x.value===opt.value))matches.push(opt);\n            });\n          }\n          if(matches.length){\n            matches.forEach(opt=>addSelection(key,opt));\n            return;\n          }\n          setFieldMessage(key,\"Describe your needs to find the right professional.\",false);\n          return;\n        }catch(fallbackError){\n          if(fallbackError.name===\"AbortError\")return;\n          setFieldMessage(key,\"Analysis unavailable. Select one of the suggested professions.\",true);\n          return;\n        }\n      }\n      setFieldMessage(key,\"Interpr\u00e9tation indisponible : \"+error.message,true);\n    }finally{\n      if(version===fieldVersions[key]){\n        fieldControllers[key]=null;\n        setProcessing(key,false);\n        if(!(key===\"professions\"&&pdProfessionClarificationMode))field.input.value=\"\";\n        field.dropdown.hidden=true;\n      }\n    }\n  }\n\n  function scheduleFieldInterpretation(key){\n    const field=ui[key];\n    if(!field||field.def.location)return;\n\n    stopFieldTimer(key);\n\n    const text=field.input.value.trim();\n    if(!text)return;\n\n    fieldTimers[key]=setTimeout(()=>{\n      fieldTimers[key]=null;\n\n      if(listening&&voiceField===key)return;\n\n      interpretField(key);\n    },CONFIG.textDelay);\n  }\n\n  function updateDistance(){\n    const consultation=selected.lieux||[];\n\n    const onlineOnly=consultation.length>0&&\n      consultation.every(option=>{\n        const text=normalize(\n          (option.value||\"\")+\" \"+\n          (option.label_fr||\"\")+\" \"+\n          (option.label_en||\"\")\n        );\n\n        return \/\\b(visio|visioconference|videoconference|video|online|virtual)\\b\/\n          .test(text);\n      });\n\n    if(onlineOnly||pdIsRemoteRequested()){\n      distanceKm=0;\n    }else if(confirmedLocation){\n      distanceKm=manualRadius===null?50:manualRadius;\n    }else{\n      distanceKm=0;\n    }\n  }\n\n  function clearLocation(){\n    pdAmbiguousLocation=false;\n    const locationHint=document.getElementById(\"pdr-location-hint\");\n    if(locationHint)locationHint.hidden=true;\n    locationVersion++;\n\n    if(locationTimer){\n      clearTimeout(locationTimer);\n      locationTimer=null;\n    }\n\n    city=\"\";\n    locationQuery=\"\";\n    confirmedLocation=null;\n    pdPendingLocationApproval=false;\n\n    const field=ui.ville;\n\n    if(field){\n      field.input.value=\"\";\n      field.dropdown.innerHTML=\"\";\n      field.dropdown.hidden=true;\n      field.selectedArea.innerHTML=\"\";\n      setFieldMessage(\"ville\",\"\",false);\n      setProcessing(\"ville\",false);\n    }\n\n    updateDistance();\n    renderSummary();\n    reorderCriteria();\n  }\n\n  function invalidateLocation(text){\n    pdAmbiguousLocation=false;\n    const locationHint=document.getElementById(\"pdr-location-hint\");\n    if(locationHint)locationHint.hidden=true;\n    locationVersion++;\n    city=\"\";\n    confirmedLocation=null;\n    locationQuery=String(text||\"\");\n\n    const field=ui.ville;\n    if(!field)return;\n\n    field.selectedArea.innerHTML=\"\";\n    field.dropdown.hidden=true;\n\n    if(locationQuery.trim()){\n      setFieldMessage(\n        \"ville\",\"Searching for places\u2026\",false\n      );\n    }else{\n      setFieldMessage(\"ville\",\"\",false);\n    }\n\n    updateDistance();\n    renderSummary();\n  }\n\n  function renderConfirmedLocation(){\n    const field=ui.ville;\n    if(!field||!confirmedLocation)return;\n\n    field.input.value=city;\n    field.dropdown.hidden=true;\n    field.dropdown.innerHTML=\"\";\n    field.selectedArea.innerHTML=\"\";\n\n    const chip=document.createElement(\"span\");\n    chip.className=\"pd-chip\";\n\n    const label=document.createElement(\"span\");\n    label.className=\"pd-chip-label\";\n    label.textContent=city;\n\n    const remove=document.createElement(\"button\");\n    remove.type=\"button\";\n    remove.textContent=\"\u00d7\";\n    remove.setAttribute(\n      \"aria-label\",\"Remove location\"\n    );\n\n    remove.addEventListener(\"click\",clearLocation);\n\n    chip.appendChild(label);\n    chip.appendChild(remove);\n    field.selectedArea.appendChild(chip);\n\n    setFieldMessage(\"ville\",\"\",false);\n    updateDistance();\n    renderSummary();\n    reorderCriteria();\n    if(activeEditor===\"ville\"){\n      if(listening&&voiceField===\"ville\")stopVoice(true);\n      closeAllEditors();\n    }\n  }\n\n  function loadGooglePlaces(){\n    if(googlePlacesPromise)return googlePlacesPromise;\n\n    googlePlacesPromise=new Promise((resolve,reject)=>{\n      const started=Date.now();\n      let finished=false;\n\n      function ready(){\n        return window.google&&\n          window.google.maps&&\n          typeof window.google.maps.importLibrary===\"function\";\n      }\n\n      async function finish(){\n        if(finished)return;\n        finished=true;\n\n        try{\n          const places=await google.maps.importLibrary(\"places\");\n\n          if(!places.AutocompleteSuggestion){\n            throw new Error(\n              \"Google place suggestions are unavailable.\"\n            );\n          }\n\n          resolve(places);\n        }catch(error){\n          reject(error);\n        }\n      }\n\n      if(ready()){\n        finish();\n        return;\n      }\n\n      const existing=document.querySelector(\n        'script[src*=\"maps.googleapis.com\/maps\/api\/js\"]'\n      );\n\n      if(!existing){\n        if(CONFIG.googleKey===\"VOTRE_CLE_GOOGLE_MAPS\"){\n          reject(new Error(\n            \"Add your Google Maps key in CONFIG.googleKey.\"\n          ));\n          return;\n        }\n\n        const script=document.createElement(\"script\");\n\n        script.src=\n          \"https:\/\/maps.googleapis.com\/maps\/api\/js\"+\n          \"?key=\"+encodeURIComponent(CONFIG.googleKey)+\n          \"&v=weekly&loading=async&libraries=places&language=en\";\n\n        script.async=true;\n        script.defer=true;\n        script.dataset.pdGooglePlaces=\"1\";\n\n        script.onerror=()=>{\n          reject(new Error(\n            \"Unable to load Google Maps.\"\n          ));\n        };\n\n        document.head.appendChild(script);\n      }\n\n      const poll=setInterval(()=>{\n        if(ready()){\n          clearInterval(poll);\n          finish();\n        }else if(Date.now()-started>15000){\n          clearInterval(poll);\n          reject(new Error(\n            \"Google Maps loading timed out.\"\n          ));\n        }\n      },150);\n    });\n\n    googlePlacesPromise=googlePlacesPromise.catch(error=>{\n      googlePlacesPromise=null;\n      throw error;\n    });\n\n    return googlePlacesPromise;\n  }\n\n  function scheduleLocationSearch(text){\n    if(locationTimer){\n      clearTimeout(locationTimer);\n      locationTimer=null;\n    }\n\n    const query=String(text||\"\").trim();\n    if(query.length<2)return;\n\n    locationTimer=setTimeout(()=>{\n      locationTimer=null;\n      searchLocation(query);\n    },CONFIG.locationDelay);\n  }\n\n  \/\/ D\u00e9tecter un lieu oubli\u00e9 par l'IA, uniquement si Google confirme le nom exact.\n  \/\/ Limiter la d\u00e9tection \u00e0 la fin de la demande pour ne pas confondre un m\u00e9tier et une ville.\n  function pdFallbackCity(data){\n    const fromAI=String(data?.ville||\" \").trim();\n    if(fromAI)return fromAI;\n    const raw=String(requestText()||\"\").trim().replace(\/[?!.,;:]+$\/g,\"\");\n    const words=raw.split(\/\\s+\/).filter(Boolean);\n    if(words.length<2)return \"\";\n    const candidate=words[words.length-1];\n    if(candidate.length<4 || \/^(service|emploi|soins|aide|travail|maison|bureau|ligne|sang)$\/i.test(candidate))return \"\";\n    \/\/ Google Places valide obligatoirement le nom exact avant tout filtrage.\n    return candidate;\n  }\n\n  \/\/ Remplacer le nom ambigu par le lieu explicitement confirm\u00e9, sans r\u00e9analyser.\n  function pdUpdateRequestWithConfirmedLocation(original, selectedPlace){\n    const current=String(original||'').trim();\n    const place=String(selectedPlace||'').trim();\n    if(!place)return current;\n    const cityName=place.split(',')[0].trim();\n    \/\/ Le dernier terme de la demande \u00e9tait le nom de ville propos\u00e9 par Google.\n    const finalToken=current.match(\/([^\\s,;!?]+)[\\s,;!?]*$\/);\n    if(finalToken && normalize(finalToken[1])===normalize(cityName)){\n      return current.slice(0,finalToken.index)+place;\n    }\n    \/\/ Ne pas ajouter une seconde localisation si le lieu complet est d\u00e9j\u00e0 affich\u00e9.\n    if(normalize(current).includes(normalize(place)))return current;\n    return current ? current+' in '+place : place;\n  }\n\n  function pdUniqueMunicipalities(matches){\n    const known=new Set();\n    return matches.filter(item=>{\n      const label=String(item.placePrediction?.text?.toString()||\"\");\n      const parts=label.split(\",\").map(part=>normalize(part.trim())).filter(Boolean);\n      if(!parts.length)return true;\n      const city=parts[0].replace(\/\\bste\\b\/g,\"sainte\").replace(\/\\bst\\b\/g,\"saint\");\n      const country=parts.some(p=>p===\"canada\")?\"ca\":parts.some(p=>p===\"france\")?\"fr\":parts.at(-1)||\"\";\n      const province=parts.some(p=>p===\"qc\"||p===\"quebec\")?\"qc\":\n        parts.some(p=>p===\"on\"||p===\"ontario\")?\"on\":\n        parts.some(p=>p===\"nb\"||p===\"nouveau brunswick\")?\"nb\":\n        parts.some(p=>p===\"bc\"||p===\"colombie britannique\")?\"bc\":\"\";\n      \/\/ En l'absence d'une province reconnue, ne pas fusionner des r\u00e9gions distinctes.\n      const region=province||parts.slice(1,-1).join(\"\/\");\n      const key=[city,region,country].join(\"|\");\n      if(known.has(key))return false;\n      known.add(key);\n      return true;\n    });\n  }\n\n  function pdShowLocationChoices(matches){\n    matches=pdUniqueMunicipalities(matches);\n    const hint=document.getElementById(\"pdr-location-hint\");\n    const choices=document.getElementById(\"pdr-location-choices\");\n    if(!hint||!choices)return;\n    choices.replaceChildren();\n    matches.forEach(item=>{\n      const button=document.createElement(\"button\");\n      button.type=\"button\";\n      button.className=\"pd-option\";\n      button.style.cssText=\"display:inline-block;width:auto;max-width:100%;border:1px solid #a9bde5;border-radius:18px;padding:8px 12px;background:white;color:#09245b;cursor:pointer;text-align:left\";\n      button.textContent=item.placePrediction.text?.toString()||\"Lieu\";\n      button.addEventListener(\"click\",async()=>{\n        const originalRequest=textarea.value;\n        const ok=await selectLocation(item);\n        if(ok){\n          \/\/ Keep the selected city provisional until the explicit Apply click.\n          pdPendingLocationApproval=true;\n          pdPopover.querySelector(\"#pdr-chip-popover-apply\").hidden=false;\n          const floating=pdPopBody.querySelector(\".pdr-location-floating-choices\");\n          if(floating)floating.hidden=true;\n          const preview=document.createElement(\"div\");\n          preview.className=\"pdr-location-pending-preview\";\n          preview.textContent=\"Selected location: \"+city;\n          preview.style.cssText=\"padding:10px 12px;color:#09245b;font-weight:600\";\n          pdPopBody.appendChild(preview);\n          return;\n        }\n      });\n      choices.appendChild(button);\n    });\n    hint.hidden=false;\n    \/\/ Afficher les choix \u00e0 c\u00f4t\u00e9 de la barre, pas sous la carte des r\u00e9sultats.\n    requestAnimationFrame(()=>{\n      if(!pdAmbiguousLocation || !choices.children.length)return;\n      const anchor=pdChipBox?.querySelector('.pdr-more-chip')||pdChipBox;\n      if(!anchor)return;\n      if(!pdPopover.hidden)pdCloseChipPopover();\n      pdChipEditorKey='ville';\n      pdPopover.hidden=false;\n      pdPopTitle.textContent='Choose a location';\n      pdPopover.querySelector('#pdr-chip-popover-apply').hidden=false; \/\/ explicit confirmation required\n      const floating=document.createElement('div');\n      floating.className='pdr-location-floating-choices';\n      floating.style.cssText='display:flex;flex-direction:column;gap:8px;max-height:290px;overflow:auto';\n      Array.from(choices.children).forEach(button=>floating.appendChild(button));\n      pdPopBody.appendChild(floating);\n      hint.hidden=true;\n      const rootRect=document.getElementById('pd-ia-test').getBoundingClientRect();\n      const rect=anchor.getBoundingClientRect();\n      pdPopover.style.left=Math.max(8,Math.min(Math.max(8,rootRect.width-400),rect.left-rootRect.left))+'px';\n      pdPopover.style.top=(rect.bottom-rootRect.top+8)+'px';\n    });\n  }\n\n  async function searchLocation(query,autoConfirm=false){\n    const field=ui.ville;\n    if(!field)return;\n\n    const text=String(query||\"\").trim();\n    if(text.length<2)return;\n\n    \/\/ Une localisation d\u00e9j\u00e0 confirm\u00e9e par l\u2019URL fait autorit\u00e9 : pas de nouvelle demande.\n    if(autoConfirm && confirmedLocation && confirmedLocation.source===\"url\" && !pdLocationMustBeChosen){\n      pdLocationLookupPending=false;\n      pdAmbiguousLocation=false;\n      const hint=document.getElementById(\"pdr-location-hint\");\n      if(hint)hint.hidden=true;\n      return;\n    }\n    const version=++locationVersion;\n    if(autoConfirm)pdLocationLookupPending=true;\n\n    field.dropdown.innerHTML=\"\";\n    field.dropdown.hidden=true;\n    setProcessing(\"ville\",true);\n\n    try{\n      const places=await loadGooglePlaces();\n\n      if(version!==locationVersion)return;\n\n      const response=await places.AutocompleteSuggestion\n        .fetchAutocompleteSuggestions({\n          input:text,\n          language:\"en\"\n        });\n\n      if(version!==locationVersion)return;\n\n      const suggestions=(response.suggestions||[])\n        .filter(item=>item.placePrediction)\n        .slice(0,7);\n\n      field.dropdown.innerHTML=\"\";\n\n      if(!suggestions.length){\n        if(autoConfirm){\n          pdAmbiguousLocation=false;pdLocationLookupPending=false;\n          const hint=document.getElementById(\"pdr-location-hint\");\n          if(hint)hint.hidden=false;\n          return;\n        }\n        setFieldMessage(\n          \"ville\",\n          \"No locations found. Try another place name.\",\n          true\n        );\n        return;\n      }\n\n      \/\/ Confirmer la ville reconnue dans la demande sans exiger un second clic.\n      \/\/ Ne jamais confondre \u00ab \u00e0 Qu\u00e9bec \u00bb (ville) et \u00ab au Qu\u00e9bec \u00bb (province).\n      if(autoConfirm){\n        const request=normalize(requestText());\n        const wantsProvince=\/\\b(?:partout|ensemble|province|tout|toute|a travers)\\s+(?:le |la |du |au |de )?quebec\\b\/.test(request)||\n          \/\\b(?:au|dans le|dans la province de) quebec\\b\/.test(request);\n        const wantsCanada=\/\\b(?:partout au|dans tout le|ensemble du) canada\\b\/.test(request);\n        \/\/ Google utilise souvent \u00ab Saint- \u00bb l\u00e0 o\u00f9 la demande contient \u00ab St- \u00bb.\n        \/\/ Normaliser ces abr\u00e9viations sans \u00e9largir \u00e0 d'autres municipalit\u00e9s.\n        const normalizeCityName=value=>normalize(String(value||\"\"))\n          .replace(\/\\\\bste\\\\b\/g,\"sainte\")\n          .replace(\/\\\\bst\\\\b\/g,\"saint\")\n          .replace(\/\\\\bsainte(?=[a-z])\/g,\"sainte \")\n          .replace(\/\\\\bsaint(?=[a-z])\/g,\"saint \")\n          .replace(\/\\\\s+\/g,\" \").trim();\n        const requested=normalizeCityName(text.split(\",\")[0]);\n        const matches=suggestions.filter(item=>{\n          const label=normalizeCityName(item.placePrediction.text?.toString()||\"\");\n          const head=normalizeCityName((item.placePrediction.text?.toString()||\"\").split(\",\")[0]);\n          \/\/ Exiger une correspondance de nom exacte apr\u00e8s normalisation.\n          return head===requested && (label===requested||label.startsWith(requested+\" \"));\n        });\n        \/\/ Google peut retourner deux descriptions de la M\u00caME municipalit\u00e9\n        \/\/ (ex. Sainte-Ad\u00e8le, QC et Sainte-Ad\u00e8le, Les Pays-d'en-Haut, QC).\n        \/\/ Ne fusionner que les variantes partageant ville, province et pays.\n        const uniqueMatches=pdUniqueMunicipalities(matches);\n        const desiredKind=wantsProvince||wantsCanada?\"region\":\"city\";\n        \/\/ Plusieurs lieux r\u00e9ellement distincts : demander un choix.\n        \/\/ L'analyse ne confirme un lieu que si Google retourne un seul candidat exact.\n        if(uniqueMatches.length===1){\n          const ok=await selectLocation(uniqueMatches[0],desiredKind);\n          if(ok||confirmedLocation){\n            pdAmbiguousLocation=false;\n            pdLocationMustBeChosen=false;\n            pdLocationLookupPending=false;\n            try{const u=new URL(location.href);u.searchParams.delete(\"localisation_a_preciser\");history.replaceState(history.state,\"\",u.toString());}catch(e){}\n            const hint=document.getElementById(\"pdr-location-hint\");\n            if(hint)hint.hidden=true;\n            return;\n          }\n        }\n        \/\/ Plusieurs correspondances exactes : demander une pr\u00e9cision et bloquer le lancement.\n        \/\/ Une absence de r\u00e9sultat Google n'est pas automatiquement une ambigu\u00eft\u00e9.\n        pdAmbiguousLocation=uniqueMatches.length>1 || (pdLocationMustBeChosen && uniqueMatches.length>0);\n        if(pdAmbiguousLocation)pdShowLocationChoices(uniqueMatches);\n        else {\n          const locationHint=document.getElementById(\"pdr-location-hint\");\n          if(locationHint)locationHint.hidden=true;\n        }\n        if(!confirmedLocation){\n          field.dropdown.hidden=true;\n          setFieldMessage(\"ville\",pdAmbiguousLocation?\"Specify your search location.\":\"\",pdAmbiguousLocation);\n        }\n        return;\n      }\n\n      suggestions.forEach(item=>{\n        const button=document.createElement(\"button\");\n        button.type=\"button\";\n        button.className=\"pd-option\";\n\n        button.textContent=\n          item.placePrediction.text?.toString()||text;\n\n        button.addEventListener(\n          \"mousedown\",event=>event.preventDefault()\n        );\n\n        button.addEventListener(\"click\",()=>{\n          selectLocation(item);\n        });\n\n        field.dropdown.appendChild(button);\n      });\n\n      field.dropdown.hidden=false;\n\n      setFieldMessage(\n        \"ville\",\n        \"Select the matching location.\",\n        false\n      );\n\n    }catch(error){\n      if(version!==locationVersion)return;\n\n      setFieldMessage(\n        \"ville\",\n        \"Google search unavailable: \"+error.message,\n        true\n      );\n    }finally{\n      if(version===locationVersion){\n        setProcessing(\"ville\",false);\n        if(autoConfirm)pdLocationLookupPending=false;\n      }\n    }\n  }\n\n  async function selectLocation(suggestion,expectedKind=null){\n    const field=ui.ville;\n    if(!field)return;\n\n    const version=++locationVersion;\n\n    field.dropdown.hidden=true;\n    setProcessing(\"ville\",true);\n\n    try{\n      const place=suggestion.placePrediction.toPlace();\n\n      await place.fetchFields({\n        fields:[\n          \"id\",\n          \"formattedAddress\",\n          \"location\",\n          \"addressComponents\"\n        ]\n      });\n\n      if(version!==locationVersion)return;\n\n      if(!place.formattedAddress||!place.location){\n        throw new Error(\n          \"Google n'a pas confirm\u00e9 ce lieu.\"\n        );\n      }\n\n      if(expectedKind){\n        const components=place.addressComponents||[];\n        const hasType=type=>components.some(component=>(component.types||[]).includes(type));\n        const isCity=hasType(\"locality\")||hasType(\"postal_town\");\n        const isRegion=hasType(\"administrative_area_level_1\")&&!isCity;\n        if((expectedKind===\"city\"&&!isCity)||\n           (expectedKind===\"region\"&&!isRegion)){\n          \/\/ Suggestion Google de type incompatible : ne rien s\u00e9lectionner.\n          return false;\n        }\n      }\n\n      const latitude=place.location.lat();\n      const longitude=place.location.lng();\n\n      if(!Number.isFinite(latitude)||\n         !Number.isFinite(longitude)){\n        throw new Error(\n          \"Coordonn\u00e9es g\u00e9ographiques invalides.\"\n        );\n      }\n\n      confirmedLocation={\n        place_id:place.id||\"\",\n        formatted_address:place.formattedAddress,\n        latitude,\n        longitude,\n        kind:expectedKind || ((place.addressComponents||[]).some(component=>(component.types||[]).includes(\"locality\")||(component.types||[]).includes(\"postal_town\"))?\"city\":\"region\"),\n        source:\"google_places\"\n      };\n\n      city=place.formattedAddress;\n      locationQuery=city;\n\n      if(pdChipEditorKey===\"ville\"&&!pdPopover.hidden){\n        pdPendingLocationApproval=true;\n        pdPopover.querySelector(\"#pdr-chip-popover-apply\").hidden=false;\n      }\n      renderConfirmedLocation();\n      return true;\n\n    }catch(error){\n      if(version===locationVersion){\n        setFieldMessage(\n          \"ville\",\n          \"Unable to confirm this location: \"+error.message,\n          true\n        );\n      }\n    }finally{\n      if(version===locationVersion){\n        setProcessing(\"ville\",false);\n      }\n    }\n  }\n\n\n  \/\/ G\u00e9olocalisation automatique apr\u00e8s l'analyse : aucune ville pr\u00e9cis\u00e9e et aucun service \u00e0 distance.\n  function pdIsRemoteRequested(){\n    const q=normalize(String(textarea.value||\"\"));\n    \/\/ Les expressions explicites de prestation \u00e0 distance, m\u00eame sans \u00ab en ligne \u00bb.\n    const explicit=\/\\b(en ligne|a distance|en distanciel|a distanciel|teleconsultation|teleconsultations|visioconference|visioconferences|videoconference|videoconferences|visio|par video|en video|mode virtuel|mode virtuelle|service virtuel|service virtuelle|services virtuels|services virtuelles|travail virtuel|travail virtuelle|online|remote|remotely|virtually|virtual mode|virtual service|virtual services|virtual consultation|telehealth|telemedicine|video call|video consultation|video conference|videocall)\\b\/.test(q);\n    \/\/ \u00ab Adjointe virtuelle \u00bb ou \u00ab virtual assistant \u00bb d\u00e9signent eux-m\u00eames\n    \/\/ une prestation \u00e0 distance, sans qu'un lieu de consultation soit choisi.\n    const remoteOccupation=\/\\b(adjoint(?:e)?s? (?:administratif(?:ve)?s? )?virtuel(?:le)?s?|assistant(?:e)?s? virtuel(?:le)?s?|secretaire(?:s)? virtuel(?:le)?s?|virtual (?:administrative )?assistants?|virtual secretar(?:y|ies)|remote (?:administrative )?assistants?)\\b\/.test(q);\n    const chosen=(selected.lieux||[]).some(option=>{\n      const v=normalize(String(option.value||\"\")+\" \"+String(option.label_fr||\"\")+\" \"+String(option.label_en||\"\"));\n      return \/\\b(visio|videoconference|visioconference|online|remote|virtual|virtuel|virtuelle|teleconsultation|a distance|en ligne|video consultation|video conference)\\b\/.test(v);\n    });\n    \/\/ Profession s\u00e9lectionn\u00e9e : seulement les appellations intrins\u00e8quement\n    \/\/ virtuelles, pas toutes les professions pouvant aussi travailler en ligne.\n    const remoteProfession=(selected.professions||[]).some(option=>{\n      const v=normalize(String(option.value||\"\")+\" \"+String(option.label_fr||\"\")+\" \"+String(option.label_en||\"\")+\" \"+String(option.label||\"\"));\n      return \/\\b(adjoint(?:e)?s? (?:administratif(?:ve)?s? )?virtuel(?:le)?s?|assistant(?:e)?s? virtuel(?:le)?s?|virtual (?:administrative )?assistants?|remote (?:administrative )?assistants?)\\b\/.test(v);\n    });\n    return explicit||remoteOccupation||chosen||remoteProfession;\n  }\n  function pdHasExplicitPlaceInRequest(){\n    const q=normalize(String(textarea.value||\"\"));\n    return \/\\b(?:a|au|aux|dans|pres de|autour de|near|in|around)\\s+(?!(?:un|une|le|la|les|mon|ma|mes|notre|nos|domicile|distance|ligne|maison|bureau|cabinet|clinique|video|visioconference|videoconference|teleconsultation|home|office|person|store|shop|work|place)\\b)[a-z][a-z'-]*(?:\\s+[a-z'-]+){0,3}\\b\/.test(q);\n  }\n  function pdClearAutomaticLocationIfRemote(){\n    if(pdIsRemoteRequested()&&confirmedLocation&&confirmedLocation.source===\"geolocalisation\")clearLocation();\n  }\n  \/\/ Trois \u00e9tats distincts : absente, a_preciser, confirmee.\n  \/\/ La position GPS n'est demand\u00e9e que si AUCUN lieu n'est mentionn\u00e9.\n  let pdAutomaticGeoPromise=null;\n  let pdAutomaticGeoAttemptedFor=\"\";\n  function pdLocationIntent(suggestedCity=\"\"){\n    if(confirmedLocation)return \"confirmee\";\n    if(pdAmbiguousLocation||pdLocationLookupPending||String(suggestedCity||\"\").trim()||\n       String(locationQuery||\"\").trim()||pdHasExplicitPlaceInRequest())return \"a_preciser\";\n    return \"absente\";\n  }\n  function pdMaybeGeolocate(suggestedCity){\n    if(pdIsRemoteRequested()||pdLocationIntent(suggestedCity)!==\"absente\")return Promise.resolve(false);\n    const key=String(textarea.value||\"\").trim();\n    if(pdAutomaticGeoPromise)return pdAutomaticGeoPromise;\n    if(pdAutomaticGeoAttemptedFor===key)return Promise.resolve(!!confirmedLocation);\n    pdAutomaticGeoAttemptedFor=key;\n    const silentButton={disabled:false};\n    pdAutomaticGeoPromise=geolocateUser(silentButton).then(()=>{\n      if(confirmedLocation&&confirmedLocation.source===\"geolocalisation\"){\n        if(manualRadius===null)manualRadius=50;\n        updateDistance();pdSyncResultChips();\n        return true;\n      }\n      return false;\n    }).catch(()=>false).finally(()=>{pdAutomaticGeoPromise=null;});\n    return pdAutomaticGeoPromise;\n  }\n\n  async function geolocateUser(button){\n    if(pdIsRemoteRequested()||pdHasExplicitPlaceInRequest())return;\n    if(!navigator.geolocation){\n      setFieldMessage(\n        \"ville\",\n        \"Geolocation is unavailable.\",\n        true\n      );\n      return;\n    }\n\n    const field=ui.ville;\n    if(!field)return;\n\n    if(locationTimer){\n      clearTimeout(locationTimer);\n      locationTimer=null;\n    }\n\n    const version=++locationVersion;\n\n    button.disabled=true;\n    setProcessing(\"ville\",true);\n    setFieldMessage(\n      \"ville\",\n      \"Finding your location\u2026\",\n      false\n    );\n\n    try{\n      const position=await new Promise((resolve,reject)=>{\n        navigator.geolocation.getCurrentPosition(\n          resolve,\n          reject,\n          {\n            enableHighAccuracy:false,\n            timeout:12000,\n            maximumAge:60000\n          }\n        );\n      });\n\n      if(version!==locationVersion)return;\n\n      const latitude=position.coords.latitude;\n      const longitude=position.coords.longitude;\n\n      await loadGooglePlaces();\n\n      if(version!==locationVersion)return;\n\n      const {Geocoder}=await google.maps.importLibrary(\n        \"geocoding\"\n      );\n\n      const geocoder=new Geocoder();\n\n      const response=await geocoder.geocode({\n        location:{lat:latitude,lng:longitude}\n      });\n\n      if(version!==locationVersion)return;\n\n      const results=response.results||[];\n\n      const preferred=results.find(item=>\n        item.types.includes(\"locality\")\n      )||results.find(item=>\n        item.types.includes(\"administrative_area_level_3\")\n      )||results[0];\n\n      if(!preferred){\n        throw new Error(\n          \"No locality found for this position.\"\n        );\n      }\n\n      if(pdIsRemoteRequested()||pdHasExplicitPlaceInRequest())return;\n\n      confirmedLocation={\n        place_id:preferred.place_id||\"\",\n        formatted_address:preferred.formatted_address,\n        latitude,\n        longitude,\n        source:\"geolocalisation\"\n      };\n\n      city=preferred.formatted_address;\n      locationQuery=city;\n\n      renderConfirmedLocation();\n\n    }catch(error){\n      if(version!==locationVersion)return;\n\n      let message=\"Unable to determine your location.\";\n\n      if(error.code===1){\n        message=\n          \"Allow location access in your browser.\";\n      }else if(error.code===2){\n        message=\n          \"Your location is temporarily unavailable.\";\n      }else if(error.code===3){\n        message=\n          \"Location lookup timed out.\";\n      }else if(error.message){\n        message=error.message;\n      }\n\n      setFieldMessage(\"ville\",message,true);\n\n    }finally{\n      button.disabled=false;\n\n      if(version===locationVersion){\n        setProcessing(\"ville\",false);\n      }\n    }\n  }\n\n  function setSpokenLocation(text){\n    const field=ui.ville;\n    if(!field)return;\n\n    const spoken=String(text||\"\").trim();\n\n    invalidateLocation(spoken);\n    field.input.value=spoken;\n\n    if(spoken.length>=2){\n      searchLocation(spoken,false);\n    }\n  }\n\n  function closeAllEditors(){\n    DEFINITIONS.forEach(def=>{\n      const field=ui[def.key];\n      if(!field)return;\n      field.controls.hidden=true;\n      field.row.classList.remove(\"is-editor-open\");\n      field.label.setAttribute(\"aria-expanded\",\"false\");\n      field.dropdown.hidden=true;\n      field.message.hidden=true;\n      \/\/ Conserver les champs dans leur ligne pour la prochaine ouverture.\n      field.controls.querySelectorAll(\".pd-editor-close\").forEach(b=>b.remove());\n      if(field.controls.parentNode!==field.row){field.row.appendChild(field.controls);}\n      if(field.message.parentNode!==field.row){field.row.appendChild(field.message);}\n    });\n    editorDock.hidden=true;\n    editorDock.replaceChildren();\n    activeEditor=null;\n  }\n\n  function pdPositionMobileEditor(){\n    if(!window.matchMedia(\"(max-width:767px)\").matches||editorDock.hidden)return;\n    const vp=window.visualViewport;\n    const visibleHeight=vp?vp.height:window.innerHeight;\n    const offset=vp?vp.offsetTop:0;\n    const center=Math.max(110,offset+visibleHeight*0.43);\n    editorDock.style.setProperty(\"--pdr-editor-top\",center+\"px\");\n  }\n  if(window.visualViewport){\n    window.visualViewport.addEventListener(\"resize\",pdPositionMobileEditor,{passive:true});\n    window.visualViewport.addEventListener(\"scroll\",pdPositionMobileEditor,{passive:true});\n  }\n  window.addEventListener(\"resize\",pdPositionMobileEditor,{passive:true});\n  function openEditor(key){\n    const field=ui[key];\n    if(!field)return;\n    if(activeEditor===key){\n      if(listening&&voiceField===key)stopVoice(true);\n      closeAllEditors();\n      return;\n    }\n    if(listening&&voiceField!==\"demande\")stopVoice(true);\n    closeAllEditors();\n    activeEditor=key;\n    setStatus(voiceStatus,\"\",false);\n    field.row.classList.add(\"is-editor-open\");\n    field.label.setAttribute(\"aria-expanded\",\"true\");\n    field.controls.hidden=false;\n    field.input.placeholder=field.def.placeholder;\n    editorDock.hidden=false;\n    editorDock.appendChild(field.controls);\n    editorDock.appendChild(field.message);\n    pdPositionMobileEditor();\n    field.input.dispatchEvent(new Event(\"change\",{bubbles:false}));\n    if(key===\"ville\"&&!confirmedLocation&&field.input.value.trim()){\n      searchLocation(field.input.value.trim(),false);\n    }\n    \/\/ Le d\u00e9marrage automatique peut \u00eatre bloqu\u00e9 par les permissions du navigateur.\n    \/\/ Dans ce cas, le micro reste disponible pour un clic explicite.\n    if(initialSearchVoice&&recognition&&!window.matchMedia(\"(max-width:767px)\").matches){\n      if(listening){field.input.focus({preventScroll:true});}\n      else startVoice(key);\n    }else field.input.focus({preventScroll:true});\n  }\n\n  function reorderCriteria(){\n    const first=document.createElement(\"div\");\n    first.className=\"pd-criteria-row pd-criteria-row--identified\";\n    const second=document.createElement(\"div\");\n    second.className=\"pd-criteria-row pd-criteria-row--optional\";\n    DEFINITIONS.forEach(def=>{\n      const field=ui[def.key];\n      if(!field)return;\n      const populated=def.location?!!confirmedLocation:\n        !!(selected[def.key]&&selected[def.key].length);\n      (populated?first:second).appendChild(field.row);\n    });\n    fieldsContainer.replaceChildren();\n    if(first.children.length)fieldsContainer.appendChild(first);\n    \/\/ Placer le rayon dans la m\u00eame carte que la localisation, m\u00eame apr\u00e8s\n    \/\/ chaque r\u00e9organisation dynamique des crit\u00e8res.\n    const locationField=ui.ville?.row;\n    const radiusGroup=document.querySelector(\"#pd-ia-test .pdr-radius-control\");\n    \/\/ D\u00e9placer le CONTENEUR complet, pas seulement le select :\n    \/\/ le titre et la liste doivent rester ensemble dans Localisation.\n    if(locationField&&radiusGroup&&!locationField.contains(radiusGroup)){\n      locationField.appendChild(radiusGroup);\n    }\n    if(second.children.length){\n      const optionalHeading=document.createElement(\"p\");\n      optionalHeading.className=\"pd-optional-heading\";\n      optionalHeading.textContent=\"\";\n      fieldsContainer.appendChild(optionalHeading);\n      fieldsContainer.appendChild(second);\n    }\n  }\n\n  function createFields(){\n    fieldsContainer.innerHTML=\"\";\n\n    DEFINITIONS.forEach(def=>{\n      const row=document.createElement(\"div\");\n      row.className=\"pd-field\";\n\n      const heading=document.createElement(\"div\");\n      heading.className=\"pd-field-heading\";\n\n      const label=document.createElement(\"button\");\n      label.type=\"button\";\n      label.className=\"pd-field-title\";\n      label.dataset.pdKey=def.key;\n      label.setAttribute(\"aria-expanded\",\"false\");\n      const shortTitles={\n        profil:\"Profile type\", professions:\"Professions\", specialites:\"Specialties\",\n        ville:\"Location\", genre:\"Provider gender\",\n        langues:\"Language\", lieux:\"Service delivery location\",\n        ordre:\"Must the candidate belong to a regulatory body or professional association?\"\n      };\n      label.textContent=(def.key===\"ordre\" && window.matchMedia(\"(max-width:767px)\").matches)\n        ? \"Regulatory body \/ Association?\"\n        : (shortTitles[def.key]||def.title);\n      label.title=def.title;\n      label.setAttribute(\"aria-label\",\"Specify: \"+def.title);\n\n      const selectedArea=document.createElement(\"div\");\n      selectedArea.className=\"pd-selected\";\n\n      const spinner=document.createElement(\"span\");\n      spinner.className=\"pd-spinner\";\n      spinner.hidden=true;\n      spinner.setAttribute(\n        \"aria-label\",\"Searching\"\n      );\n\n      heading.appendChild(label);\n      heading.appendChild(selectedArea);\n      \/\/ Le t\u00e9moin de traitement suit le champ de recherche actif.\n\n      const controls=document.createElement(\"div\");\n      controls.className=\"pd-field-controls\";\n      controls.hidden=true;\n\n      const holder=document.createElement(\"div\");\n      holder.className=\"pd-input-holder\";\n\n      const input=document.createElement(\"input\");\n      input.type=\"text\";\n      input.className=\"pd-field-input\";\n      input.autocomplete=\"off\";\n      input.placeholder=def.placeholder;\n      input.id=\"pd-ia-field-\"+def.key;\n\n      label.setAttribute(\"aria-controls\",\"pd-ia-controls-\"+def.key);\n      controls.id=\"pd-ia-controls-\"+def.key;\n      heading.addEventListener(\"click\",event=>{\n        if(event.target.closest(\".pd-chip, .pd-spinner\"))return;\n        openEditor(def.key);\n      });\n\n      const dropdown=document.createElement(\"div\");\n      dropdown.className=\"pd-dropdown\";\n      dropdown.hidden=true;\n\n      const mic=document.createElement(\"button\");\n      mic.type=\"button\";\n      mic.className=\"pd-mic\";\n      mic.dataset.voice=def.key;\n      mic.innerHTML=MIC_SVG;\n      mic.setAttribute(\n        \"aria-label\",\"Dicter : \"+def.title\n      );\n\n      const clear=document.createElement(\"button\");\n      clear.type=\"button\";\n      clear.className=\"pd-clear-field\";\n      clear.textContent=\"\u00d7\";\n      clear.setAttribute(\n        \"aria-label\",\"Clear: \"+def.title\n      );\n\n      const message=document.createElement(\"div\");\n      message.className=\"pd-field-message\";\n      message.hidden=true;\n\n      const inlineClear=document.createElement(\"button\");\n      inlineClear.type=\"button\";\n      inlineClear.className=\"pd-inline-clear\";\n      inlineClear.textContent=\"\u00d7\";\n      inlineClear.hidden=true;\n      inlineClear.setAttribute(\"aria-label\",\"Clear criterion text\");\n      function syncInlineClear(){inlineClear.hidden=!input.value.trim();}\n      input.addEventListener(\"input\",()=>{syncInlineClear();cancelMobileEmptyVoiceTimer();});\n      input.addEventListener(\"change\",syncInlineClear);\n      inlineClear.addEventListener(\"click\",event=>{\n        event.preventDefault();event.stopPropagation();\n        input.value=\"\";\n        input.dispatchEvent(new Event(\"input\",{bubbles:true}));\n        input.focus();\n      });\n      holder.appendChild(input);\n      holder.appendChild(inlineClear);\n      holder.appendChild(spinner);\n      holder.appendChild(dropdown);\n\n      controls.appendChild(holder);\n\n      let geoButton=null;\n\n      if(def.location){\n        geoButton=document.createElement(\"button\");\n        geoButton.type=\"button\";\n        geoButton.className=\"pd-geolocate\";\n        geoButton.innerHTML=GEO_SVG;\n        geoButton.title=\"Utiliser ma position actuelle\";\n        geoButton.setAttribute(\n          \"aria-label\",\"Utiliser ma position actuelle\"\n        );\n\n        geoButton.addEventListener(\"click\",()=>{\n          geolocateUser(geoButton);\n        });\n\n        controls.appendChild(geoButton);\n      }\n\n      controls.appendChild(mic);\n      const keyboard=document.createElement(\"button\");\n      keyboard.type=\"button\";\n      keyboard.className=\"pd-keyboard\";\n      keyboard.textContent=\"\u2328\";\n      keyboard.title=\"Switch to typing\";\n      keyboard.setAttribute(\"aria-label\",\"Switch to typing for \"+def.title);\n      keyboard.addEventListener(\"click\",()=>{\n        if(listening&&voiceField===def.key)stopVoice(true);\n        input.focus({preventScroll:true});\n      });\n      controls.appendChild(keyboard);\n      controls.appendChild(clear);\n\n      row.appendChild(heading);\n      row.appendChild(controls);\n      row.appendChild(message);\n\n      fieldsContainer.appendChild(row);\n\n      ui[def.key]={\n        row,heading,label,selectedArea,spinner,controls,\n        input,dropdown,mic,clear,message,def,\n        geoButton\n      };\n\n      if(def.location){\n        input.addEventListener(\"input\",()=>{\n          invalidateLocation(input.value);\n          scheduleLocationSearch(input.value);\n        });\n\n        input.addEventListener(\"focus\",()=>{\n          if(input.value.trim()&&!confirmedLocation){\n            scheduleLocationSearch(input.value);\n          }\n        });\n\n        input.addEventListener(\"keydown\",event=>{\n          if(event.key===\"Escape\"){\n            dropdown.hidden=true;\n          }\n        });\n\n      }else{\n        input.addEventListener(\"input\",()=>{\n          cancelFieldRequest(def.key);\n          setFieldMessage(def.key,\"\",false);\n          renderDropdown(def.key);\n          scheduleFieldInterpretation(def.key);\n        });\n\n        input.addEventListener(\"focus\",()=>{\n          if(def.key===\"profil\"||input.value.trim()){\n            renderDropdown(def.key);\n          }\n        });\n\n        input.addEventListener(\"keydown\",event=>{\n          if(event.key===\"Escape\"){\n            dropdown.hidden=true;\n          }\n\n          if(event.key===\"Enter\"){\n            event.preventDefault();\n            interpretField(def.key);\n          }\n        });\n      }\n\n      input.addEventListener(\"blur\",()=>{\n        setTimeout(()=>{\n          dropdown.hidden=true;\n        },200);\n      });\n\n      mic.addEventListener(\"click\",()=>{\n        startVoice(def.key);\n      });\n\n      clear.setAttribute(\"aria-label\",\"Close criterion search\");\n      clear.addEventListener(\"click\",()=>{\n        if(listening&&voiceField===def.key)stopVoice(true);\n        closeAllEditors();\n      });\n    });\n  }\n\n  function populateFromAI(data){\n    if(!glossaryReady)return;\n\n    cancelAllFieldRequests();\n    resetSelections();\n    \/\/ Une nouvelle demande ne doit pas h\u00e9riter de la ville ni du rayon pr\u00e9c\u00e9dent.\n    clearLocation();\n    manualRadius=null;\n    distanceKm=0;\n\n    DEFINITIONS.forEach(def=>{\n      const field=ui[def.key];\n      if(!field)return;\n\n      field.input.value=\"\";\n      field.dropdown.hidden=true;\n      field.selectedArea.innerHTML=\"\";\n      setFieldMessage(def.key,\"\",false);\n\n      if(def.location)return;\n\n      \/\/ Lieu de consultation : ne jamais d\u00e9duire une modalit\u00e9 \u00e0 partir de la profession\n      \/\/ (plombier, \u00e9lectricien, psychologue, etc.) ou d'une simple ville (\u00ab \u00e0 Qu\u00e9bec \u00bb).\n      \/\/ Seule une mention explicite de la modalit\u00e9 par l'utilisateur autorise le filtre.\n      if(def.key===\"lieux\"){\n        const request=normalize(String(textarea.value||\"\"));\n        const explicitPlace=\/(?:\\b(?:a domicile|au domicile|chez moi|chez nous|chez le client|chez le patient|a la maison|a mon domicile|a votre domicile|se deplace|deplacement a domicile|vient chez moi|intervention chez moi|home visit|at home)\\b|\\b(?:au bureau|a son bureau|dans son bureau|en cabinet|au cabinet|en clinique|a la clinique|dans les locaux du professionnel|chez le professionnel|sur place|in office|in person)\\b|\\b(?:en ligne|a distance|en distanciel|par video|en video|en visioconference|en videoconference|visio|teleconsultation|zoom|teams|online|remote|virtual)\\b)\/.test(request);\n        if(!explicitPlace){selected.lieux=[];renderSelected(\"lieux\");return;}\n      }\n\n      \/\/ Le genre ne doit jamais \u00eatre inf\u00e9r\u00e9 du m\u00e9tier, du nom ou d'une r\u00e9ponse IA ambigu\u00eb.\n      \/\/ Il faut une pr\u00e9f\u00e9rence explicite dans la demande initiale.\n      if(def.key===\"genre\"){\n        const request=normalize(String(textarea.value||\"\"));\n        const explicitGender=\/(?:\\b(?:je (?:veux|voudrais|prefere|cherche|souhaite)|avec|par|un|une)\\s+(?:une?\\s+)?(?:femme|homme)\\b|\\b(?:prestataire|professionnel|intervenant|therapeute)\\s+(?:femme|homme)\\b|\\b(?:non binaire|nonbinary|autre genre|genre autre)\\b)\/.test(request);\n        if(!explicitGender){selected.genre=[];renderSelected(\"genre\");return;}\n      }\n\n      const values=Array.isArray(data[VALUE_KEYS[def.key]])\n        ?data[VALUE_KEYS[def.key]]:[];\n\n      const labels=Array.isArray(data[LABEL_KEYS[def.key]])\n        ?data[LABEL_KEYS[def.key]]:[];\n\n      const matches=[];\n\n      values.forEach(value=>{\n        if(value===\"_\")return;\n\n        const option=optionByValue(def.key,value);\n\n        if(option&&!matches.some(item=>\n          item.value===option.value\n        )){\n          matches.push(option);\n        }\n      });\n\n      if(!matches.length){\n        labels.forEach(label=>{\n          const option=optionByLabel(def.key,label);\n\n          if(option&&option.value!==\"_\"&&\n             !matches.some(item=>\n               item.value===option.value\n             )){\n            matches.push(option);\n          }\n        });\n      }\n\n      if(def.key===\"professions\"){\n        const explicit=explicitGlossaryMatches(\"professions\",String(textarea.value||\"\"));\n        if(explicit.length){\n          \/\/ Le libell\u00e9 explicite prime sur une cat\u00e9gorie trop g\u00e9n\u00e9rale.\n          matches.splice(0,matches.length,...explicit);\n        }\n        const request=String(textarea.value||\"\");\n        const aliases=professionAliases(request,\"analysis\");\n        if(aliases.length){\n          const q=normalize(request);\n          const disaster=\/\\b(sinistre|disaster|flood|flooding|fire damage|water damage|degat d eau|incendie)\\b\/.test(q);\n          const painting=\/\\b(peintre|painter|painters)\\b\/.test(q);\n          const filtered=matches.filter(option=>{\n            const label=normalize([option.label_fr,option.label_en].join(\" \"));\n            if(disaster&&\/\\b(menage|nettoyage|cleaning|cleaner)\\b\/.test(label)&&!\/\\b(sinistre|disaster)\\b\/.test(label))return false;\n            if(painting&&\/\\b(artiste|artist|portrait|dessinateur)\\b\/.test(label)&&!aliases.some(a=>a.value===option.value))return false;\n            return true;\n          });\n          aliases.forEach(option=>{\n            if(!filtered.some(item=>String(item.value)===String(option.value)))filtered.unshift(option);\n          });\n          matches.splice(0,matches.length,...filtered);\n        }\n        \/\/ Respecter le contexte commercial ou r\u00e9sidentiel de la demande.\n        matches.splice(0,matches.length,...refineProfessionMatches(matches,String(textarea.value||\"\")));\n      }\n\n      if(def.key===\"professions\"){\n        const taxMatches=pdTaxProfessionMatches(String(textarea.value||\"\"));\n        if(taxMatches!==null){\n          \/\/ Remplace int\u00e9gralement les suggestions de l'IA pour ce contexte pr\u00e9cis.\n          matches.splice(0,matches.length,...taxMatches);\n        }\n      }\n      if(def.key===\"specialites\"){\n        const taxSpecialties=pdTaxSpecialtyMatches(String(textarea.value||\"\"));\n        if(taxSpecialties!==null){\n          matches.splice(0,matches.length,...taxSpecialties);\n        }\n      }\n\n      if(def.key===\"lieux\"){\n        \/\/ La r\u00e9ponse IA ne peut pas imposer une modalit\u00e9 diff\u00e9rente de celle demand\u00e9e.\n        const explicitlyRequested=resolveConsultationSynonym(String(textarea.value||\"\"));\n        if(explicitlyRequested){\n          matches.splice(0,matches.length,explicitlyRequested);\n        }else{\n          \/\/ Mention complexe non reconnue : ne pas risquer de restreindre les r\u00e9sultats.\n          matches.length=0;\n        }\n      }\n\n      if(def.key===\"genre\"){\n        const other=getOptions(\"genre\").find(option=>\n          normalize(option.value)===\"autre\"||normalize(option.label_fr)===\"autre\"||normalize(option.label_en)===\"other\"\n        );\n        const mapped=[];\n        const add=option=>{if(option&&!mapped.some(item=>String(item.value)===String(option.value)))mapped.push(option);};\n        matches.forEach(option=>{\n          const norm=normalize(String(option.value||\"\")+\" \"+labelFor(option));\n          if(\/\\b(femme|female|woman)\\b\/.test(norm)||\/\\b(homme|male|man)\\b\/.test(norm)||\/\\b(autre|other)\\b\/.test(norm))add(option);\n          else add(other);\n        });\n        \/\/ Ne pas transformer une hallucination ou valeur inconnue de l'IA en \u00ab Autre \u00bb.\n        \/\/ \u00ab Autre \u00bb reste accessible par une demande explicite dans le filtre.\n\n        matches.splice(0,matches.length,...mapped);\n      }\n      selected[def.key]=def.multiple\n        ?matches:matches.slice(0,1);\n\n      renderSelected(def.key);\n    });\n\n    geographicScope=\n      data.portee_geographique||\"non_precisee\";\n\n    result.hidden=false;\n    \/\/ Show explicitement le bouton de lancement avec les crit\u00e8res.\n    \/\/ Ne pas d\u00e9pendre uniquement de l'observateur de mutations.\n    if(pdExternalActions)pdExternalActions.hidden=false;\n    setFiltersOpen(false);\n    closeAllEditors();\n    renderSummary();\n    const serviceHint=document.getElementById(\"pdr-service-hint\");\n    if(serviceHint)serviceHint.hidden=(selected.professions||[]).length>0;\n    const locationHint=document.getElementById(\"pdr-location-hint\");\n    if(locationHint)locationHint.hidden=true;\n    document.getElementById(\"pdr-open-filters\")?.setAttribute(\"aria-expanded\",\"false\");\n\n    const suggestedCity=pdFallbackCity(data);\n\n    if(suggestedCity && !(confirmedLocation && confirmedLocation.source===\"url\")){\n      invalidateLocation(suggestedCity);\n      if(ui.ville)ui.ville.input.value=suggestedCity;\n      searchLocation(suggestedCity,true);\n    }\n\n    pdClearAutomaticLocationIfRemote();\n    pdMaybeGeolocate(suggestedCity);\n\n    updateDistance();\n\n\n    \/\/ Sur mobile, remonter la zone de recherche apr\u00e8s l'affichage des crit\u00e8res.\n    \/\/ On ne force pas le bouton \u00e0 l'\u00e9cran : il reste accessible par d\u00e9filement.\n    if(window.matchMedia(\"(max-width:600px)\").matches){\n      requestAnimationFrame(()=>requestAnimationFrame(()=>{\n        const inputWrap=document.querySelector(\"#pd-ia-test .pd-input-wrap\");\n        if(!inputWrap||result.hidden)return;\n        const target=window.scrollY+inputWrap.getBoundingClientRect().top-12;\n        window.scrollTo({top:Math.max(0,target),behavior:\"smooth\"});\n      }));\n    }\n\n  }\n\n  \/\/ Une analyse sans cat\u00e9gorie reconnue ne doit jamais d\u00e9clencher les r\u00e9sultats.\n  \/\/ La profession d\u00e9j\u00e0 appliqu\u00e9e dans l\u2019URL fait autorit\u00e9 pendant la\n  \/\/ restauration asynchrone des glossaires. Ne jamais ouvrir le s\u00e9lecteur\n  \/\/ automatiquement pour cette seule raison.\n  function pdProfessionConfirmedInURL(){\n    const params=new URLSearchParams(window.location.search);\n    const raw=(params.get(\"profession_pro\")||\"\").trim();\n    if(!raw||!raw.split(\",\").some(v=>v.trim()&&v.trim()!==\"_\"))return false;\n    \/\/ Une nouvelle demande explicitement analys\u00e9e doit pouvoir remplacer\n    \/\/ les anciens filtres pr\u00e9sents dans l'URL.\n    const original=(params.get(\"demande\")||params.get(\"besoin\")||params.get(\"q\")||\"\").trim();\n    const current=String(textarea.value||\"\").trim();\n    if(lastSuccessfulText&&current&&current!==original&&lastSuccessfulText===current)return false;\n    return true;\n  }\n  function pdProfessionAlreadyDefined(){\n    return (selected.professions||[]).some(option=>String(option?.value||\"\").trim()&&String(option.value)!==\"_\")\n      ||pdProfessionConfirmedInURL();\n  }\n  function pdServiceIsRecognized(){\n    return (selected.professions||[]).some(option=>String(option?.value||\"\").trim()!==\"\"&&String(option.value)!==\"_\");\n  }\n  function pdRequireRecognizedService(){\n    const hint=document.getElementById(\"pdr-service-hint\");\n    const recognized=pdProfessionAlreadyDefined();\n    \/\/ L'absence de profession d\u00e9clenche le s\u00e9lecteur intelligent, pas un bandeau.\n    if(hint)hint.hidden=true;\n    if(!recognized){\n      if(pdExternalActions)pdExternalActions.hidden=true;\n      setFiltersOpen(false);\n      document.getElementById(\"pdr-open-filters\")?.setAttribute(\"aria-expanded\",\"false\");\n      pdOpenMissingProfession();\n    }\n    return recognized;\n  }\n\n  \/\/ Page de r\u00e9sultats : l'analyse d'une NOUVELLE demande doit aussi lancer\n  \/\/ le filtrage JetEngine, sans second clic sur \u00ab Appliquer \u00bb.\n  let pdAutoLaunchVersion=0;\n  async function pdLaunchAfterAnalysis(data){\n    const ticket=++pdAutoLaunchVersion;\n    const wantedCity=pdFallbackCity(data);\n    \/\/ Priorit\u00e9 au lieu ambigu : attendre Google Places, puis ouvrir les choix.\n    \/\/ Un lieu confirm\u00e9 par Google Places ne doit jamais \u00eatre redemand\u00e9.\n    if(pdPendingLocationApproval)return;\n    if(confirmedLocation){\n      pdAmbiguousLocation=false;\n      pdLocationMustBeChosen=false;\n      pdLocationLookupPending=false;\n      const locationHint=document.getElementById(\"pdr-location-hint\");\n      if(locationHint)locationHint.hidden=true;\n    }\n    if(wantedCity&&!confirmedLocation){\n      if(!pdLocationLookupPending&&!pdAmbiguousLocation){\n        pdLocationLookupPending=true;\n        searchLocation(wantedCity,true);\n      }\n      const deadline=Date.now()+6500;\n      while(ticket===pdAutoLaunchVersion&&pdLocationLookupPending&&Date.now()<deadline){\n        await new Promise(resolve=>setTimeout(resolve,120));\n      }\n      if(ticket!==pdAutoLaunchVersion)return;\n    }\n    if(!confirmedLocation&&(pdAmbiguousLocation||pdLocationMustBeChosen)){\n      \/\/ pdShowLocationChoices ouvre la bo\u00eete flottante de localisation.\n      \/\/ Si aucune suggestion n'a \u00e9t\u00e9 trouv\u00e9e, ouvrir l'\u00e9diteur de lieu.\n      if(pdPopover.hidden){\n        const anchor=pdChipBox?.querySelector('.pdr-more-chip')||pdChipBox;\n        if(anchor)pdShowChipPopover('ville',anchor);\n      }\n      return;\n    }\n    if(pdLocationLookupPending)return;\n    \/\/ Apr\u00e8s validation du lieu, proposer la profession si l'IA ne l'a pas reconnue.\n    if(!pdRequireRecognizedService())return;\n    if(pdLocationIntent(wantedCity)==='absente'&&!pdIsRemoteRequested()){\n      await pdMaybeGeolocate(wantedCity);\n      if(ticket!==pdAutoLaunchVersion)return;\n    }\n    updateDistance();\n    pdSyncResultChips();\n    resultsButton.click();\n  }\n\n  async function analyze(){\n    stopAnalysisTimer();\n\n    const demande=requestText();\n\n    if(demande.length<5||demande.length>1000){\n      setStatus(\n        voiceStatus,\n        \"Your request must contain between 5 and 1,000 characters.\",\n        true\n      );\n      return;\n    }\n\n    if(demande===lastSuccessfulText&&lastData){\n      populateFromAI(lastData);\n      setStatus(voiceStatus,\"\",false);\n      pdLaunchAfterAnalysis(lastData);\n      return;\n    }\n\n    if(analyzing)cancelAnalysis();\n\n    const version=++analysisVersion;\n    const controller=new AbortController();\n\n    analysisController=controller;\n    const heroTitle=document.querySelector(\"#pd-ia-test .pd-hero-title\");\n    if(heroTitle)heroTitle.hidden=true;\n    setAnalysisLoading(true);\n    setStatus(voiceStatus,\"\",false);\n\n    try{\n      const data=await fetchJSON(CONFIG.analyser,{\n        method:\"POST\",\n        credentials:\"same-origin\",\n        signal:controller.signal,\n        headers:{\n          \"Content-Type\":\"application\/json\",\n          ...(window.pdIaNonce ? {\"X-WP-Nonce\":window.pdIaNonce} : {})\n        },\n        body:JSON.stringify({demande})\n      });\n\n      if(version!==analysisVersion)return;\n\n      if(typeof data.besoin!==\"string\"||\n         !Array.isArray(data.professions)){\n        throw new Error(\n          \"R\u00e9ponse IA incompl\u00e8te.\"\n        );\n      }\n\n      lastSuccessfulText=demande;\n      lastData=data;\n\n      const loaded=await loadGlossaries();\n\n      if(version!==analysisVersion)return;\n\n      if(loaded){\n        populateFromAI(data);\n        setStatus(voiceStatus,\"\",false);\n        pdLaunchAfterAnalysis(data);\n      }\n\n    }catch(error){\n      if(version!==analysisVersion||\n         error.name===\"AbortError\")return;\n\n      setStatus(\n        voiceStatus,\n        \"Analyse impossible : \"+error.message,\n        true\n      );\n    }finally{\n      if(version===analysisVersion){\n        analysisController=null;\n        setAnalysisLoading(false);\n      }\n    }\n  }\n\n  function scheduleAnalyze(delay){\n    if(typeof pdDismissedProfessionFor!==\"undefined\" && requestText().trim()!==pdDismissedProfessionFor)\n      pdDismissedProfessionFor=\"\";\n    stopAnalysisTimer();\n\n    if(requestText().length<5)return;\n    if(requestText()===lastSuccessfulText)return;\n\n    analysisTimer=setTimeout(()=>{\n      analysisTimer=null;\n\n      if(listening&&voiceField===\"demande\"){\n        voiceShouldAnalyze=true;\n        stopVoice(false);\n      }else if(!listening){\n        analyze();\n      }\n    },delay);\n  }\n\n  function updateMicState(){\n    root.querySelectorAll(\".pd-mic\").forEach(button=>{\n      const field=button.id===\"pd-ia-mic\"\n        ?\"demande\":button.dataset.voice;\n\n      const active=listening&&voiceField===field;\n\n      button.classList.toggle(\"is-listening\",active);\n      button.setAttribute(\n        \"aria-pressed\",String(active)\n      );\n    });\n  }\n\n  function scheduleVoiceStop(){\n    if(voiceStopTimer){\n      clearTimeout(voiceStopTimer);\n    }\n\n    voiceStopTimer=setTimeout(()=>{\n      voiceStopTimer=null;\n\n      if(!listening)return;\n\n      if(voiceField===\"demande\"){\n        voiceShouldAnalyze=true;\n      }\n\n      stopVoice(false);\n    },CONFIG.voiceDelay);\n  }\n\n  function stopVoice(silent){\n    if(voiceStopTimer){\n      clearTimeout(voiceStopTimer);\n      voiceStopTimer=null;\n    }\n\n    if(!recognition||!listening)return;\n\n    voiceSilentStop=!!silent;\n\n    if(silent){\n      voiceShouldAnalyze=false;\n    }\n\n    try{\n      recognition.stop();\n    }catch(error){\n      listening=false;\n      voiceField=null;\n      updateMicState();\n    }\n  }\n\n  \/\/ Mobile: retain a minimum listening window even when the browser\n  \/\/ prematurely reports no-speech, and avoid repeated interim phrases.\n  let voiceStartedAt=0;\n  let voiceNoSpeechRetry=false;\n  let voiceNoSpeechTimer=null;\n  let voiceHasSpeech=false;\n\n  function voiceWords(text){\n    return String(text||\"\").trim().split(\/\\s+\/).filter(Boolean);\n  }\n  function mergeVoiceParts(left,right){\n    const a=voiceWords(left),b=voiceWords(right);\n    if(!a.length)return b.join(\" \");\n    if(!b.length)return a.join(\" \");\n    const normalize=word=>word.toLocaleLowerCase().replace(\/[^\\p{L}\\p{N}]\/gu,\"\");\n    const A=a.map(normalize),B=b.map(normalize);\n    \/\/ Mobile engines sometimes resend the whole sentence as a new result.\n    if(B.length<=A.length && B.every((w,i)=>w===A[i]))return a.join(\" \");\n    if(A.length<=B.length && A.every((w,i)=>w===B[i]))return b.join(\" \");\n    let overlap=0;\n    for(let k=Math.min(A.length,B.length);k>0;k--){\n      if(A.slice(-k).every((w,i)=>w===B[i])){overlap=k;break;}\n    }\n    return a.concat(b.slice(overlap)).join(\" \");\n  }\n  function clearVoiceNoSpeechTimer(){\n    if(voiceNoSpeechTimer){clearTimeout(voiceNoSpeechTimer);voiceNoSpeechTimer=null;}\n  }\n\n  let mobileEmptyVoiceTimer=null;\n  function cancelMobileEmptyVoiceTimer(){\n    if(mobileEmptyVoiceTimer){clearTimeout(mobileEmptyVoiceTimer);mobileEmptyVoiceTimer=null;}\n  }\n  let voiceInterim=\"\";\n  function startVoice(field){\n    cancelMobileEmptyVoiceTimer();\n    if(!recognition){\n      setStatus(\n        field===\"demande\"\n          ?voiceStatus:reviewStatus,\n        \"Voice dictation is not available in this browser.\",\n        true\n      );\n      return;\n    }\n\n    if(listening){\n      if(voiceField===field){\n        if(field===\"demande\"){\n          voiceShouldAnalyze=true;\n        }\n        stopVoice(false);\n      }else{\n        setStatus(\n          reviewStatus,\n          \"Finish the current dictation first.\",\n          true\n        );\n      }\n      return;\n    }\n\n    stopAnalysisTimer();\n\n    if(field!==\"demande\"){\n      setFieldMessage(field,\"\",false);\n    }\n    if(field!==\"demande\"&&field!==\"ville\"){\n      cancelFieldRequest(field);\n    }\n\n    voiceField=field;\n    if(field===\"ville\"&&typeof pdEnsureLocationEditor===\"function\"){\n      pdEnsureLocationEditor();\n      setTimeout(pdEnsureLocationEditor,100);\n    }\n    voiceBase=field===\"demande\"\n      ?textarea.value.trim():\"\";\n    voiceFinal=\"\";\n    voiceInterim=\"\";\n    voiceResults={};\n    voiceStartedAt=Date.now();\n    voiceNoSpeechRetry=false;\n    voiceHasSpeech=false;\n    clearVoiceNoSpeechTimer();\n    voiceShouldAnalyze=false;\n    voiceSilentStop=false;\n    voiceError=false;\n    voiceCancelled=false;\n\n    try{\n      recognition.lang=\"en-CA\";\n      recognition.start();\n    }catch(error){\n      voiceField=null;\n      setStatus(\n        reviewStatus,\n        \"Unable to start voice dictation.\",\n        true\n      );\n    }\n  }\n\n  if(SpeechRecognition){\n    recognition=new SpeechRecognition();\n    recognition.lang=\"en-CA\";\n    recognition.continuous=!window.matchMedia(\"(max-width:767px)\").matches;\n    recognition.interimResults=true;\n\n    recognition.onstart=()=>{\n      if(voiceCancelled){\n        try{recognition.abort();}catch(error){}\n        return;\n      }\n      listening=true;\n      clearVoiceNoSpeechTimer();\n      if(!voiceHasSpeech){\n        voiceNoSpeechTimer=setTimeout(()=>{\n          voiceNoSpeechTimer=null;\n          if(listening&&!voiceHasSpeech){\n            voiceNoSpeechRetry=false;\n            stopVoice(false);\n          }\n        },Math.max(0,5000-(Date.now()-voiceStartedAt)));\n      }\n      updateMicState();\n      if(voiceField===\"demande\"){\n        textarea.dataset.originalPlaceholder=textarea.placeholder;\n        if(!textarea.value.trim()&&!window.matchMedia(\"(max-width:767px)\").matches)textarea.placeholder=\"Listening...\";\n      }else if(ui[voiceField]){\n        const field=ui[voiceField];\n        field.input.dataset.originalPlaceholder=field.input.placeholder;\n        if(!field.input.value.trim()&&!window.matchMedia(\"(max-width:767px)\").matches)field.input.placeholder=\"Listening...\";\n      }\n\n      setStatus(voiceStatus,\"\",false);\n      setStatus(reviewStatus,\"\",false);\n    };\n\n    recognition.onresult=event=>{\n      if(voiceCancelled)return;\n      let interim=\"\";\n\n      for(let i=event.resultIndex;\n          i<event.results.length;i++){\n\n        const transcript=\n          event.results[i][0].transcript;\n\n        if(event.results[i].isFinal){\n          voiceResults[i]=transcript.trim();\n        }else{\n          interim+=transcript;\n        }\n      }\n\n      voiceFinal=Object.keys(voiceResults)\n        .sort((a,b)=>Number(a)-Number(b))\n        .reduce((text,key)=>mergeVoiceParts(text,voiceResults[key]),\"\")\n        .trim();\n\n      voiceInterim=interim.trim();\n      const transcript=mergeVoiceParts(voiceFinal,voiceInterim).trim();\n      if(transcript){voiceHasSpeech=true;clearVoiceNoSpeechTimer();}\n\n      if(transcript){\n        if(voiceField===\"demande\")textarea.placeholder=pdPlaceholderForViewport();\n        else if(ui[voiceField])ui[voiceField].input.placeholder=ui[voiceField].input.dataset.originalPlaceholder||ui[voiceField].def.placeholder;\n      }\n      if(voiceField===\"demande\"){\n        textarea.value=[\n          voiceBase,transcript\n        ].filter(Boolean).join(\" \").trim();\n\n        result.hidden=true;\n    if(pdExternalActions)pdExternalActions.hidden=true;\n\n        if(analyzing){\n          cancelAnalysis();\n        }\n\n      }else if(ui[voiceField]){\n        ui[voiceField].input.value=transcript;\n        ui[voiceField].input.dispatchEvent(new Event(\"change\",{bubbles:false}));\n        setFieldMessage(voiceField,\"\",false);\n      }\n\n      scheduleVoiceStop();\n    };\n\n    recognition.onerror=event=>{\n      if(voiceCancelled)return;\n      if(event.error===\"no-speech\"&&!voiceHasSpeech&&\n         (window.matchMedia(\"(max-width:767px)\").matches||Date.now()-voiceStartedAt<5000)){\n        voiceNoSpeechRetry=true;\n        return;\n      }\n      voiceError=true;\n      if(voiceField!==\"demande\"&&ui[voiceField]){\n        setFieldMessage(voiceField,\"Voice dictation failed. You can type your clarification.\",true);\n      }\n\n      const messages={\n        \"not-allowed\":\"Acc\u00e8s au microphone refus\u00e9.\",\n        \"no-speech\":\"No speech detected.\",\n        \"audio-capture\":\"No microphone available.\",\n        \"network\":\"Voice recognition service is unavailable.\"\n      };\n\n      setStatus(\n        voiceField===\"demande\"\n          ?voiceStatus:reviewStatus,\n        messages[event.error]||\n          \"Voice error: \"+event.error,\n        true\n      );\n    };\n\n    recognition.onend=()=>{\n      clearVoiceNoSpeechTimer();\n      if(!voiceCancelled&&!voiceSilentStop&&!voiceError&&\n   voiceNoSpeechRetry&&!voiceHasSpeech&&\n   Date.now()-voiceStartedAt<5000){\n  voiceNoSpeechRetry=false;\n  try{recognition.start();return;}catch(error){}\n}\n      if(voiceStopTimer){\n        clearTimeout(voiceStopTimer);\n        voiceStopTimer=null;\n      }\n\n    if(!voiceCancelled &&\n   !voiceHasSpeech &&\n   !voiceError &&\n   !voiceSilentStop &&\n   Date.now()-voiceStartedAt<5000){\n  try{\n    recognition.start();\n    return;\n  }catch(error){}\n}\n      const finishedField=voiceField;\n      textarea.placeholder=pdPlaceholderForViewport();\n      if(ui[finishedField])ui[finishedField].input.placeholder=ui[finishedField].input.dataset.originalPlaceholder||ui[finishedField].def.placeholder;\n      setStatus(voiceStatus,\"\",false);\n      const spoken=(voiceFinal||voiceInterim||\n        (finishedField!==\"demande\"&&ui[finishedField]\n          ?ui[finishedField].input.value:\"\" )).trim();\n      const shouldAnalyze=voiceShouldAnalyze;\n      const silent=voiceSilentStop||voiceCancelled;\n      const hadError=voiceError;\n\n      listening=false;\n      voiceField=null;\n      voiceShouldAnalyze=false;\n      voiceSilentStop=false;\n      voiceError=false;\n\n      updateMicState();\n\n      if(silent||hadError)return;\n\n      setStatus(reviewStatus,\"\",false);\n\n      if(finishedField===\"demande\"){\n        if(!spoken)return;\n        if(shouldAnalyze){\n          analyze();\n        }else{\n          scheduleAnalyze(CONFIG.voiceDelay);\n        }\n        return;\n      }\n\n      if(!ui[finishedField])return;\n      if(!spoken){\n        if(window.matchMedia(\"(max-width:767px)\").matches){\n          const remaining=5000;\n          mobileEmptyVoiceTimer=setTimeout(()=>{\n            mobileEmptyVoiceTimer=null;\n            if(!listening&&ui[finishedField]&&!ui[finishedField].input.value.trim()){\n              setFieldMessage(finishedField,\n                \"No speech detected. Try the microphone again or type your clarification.\",true);\n            }\n          },remaining);\n        }else{\n          setFieldMessage(finishedField,\n            \"No speech detected. Try the microphone again or type your clarification.\",true);\n        }\n        return;\n      }\n\n      if(finishedField===\"ville\"){\n        setSpokenLocation(spoken);\n        return;\n      }\n\n      ui[finishedField].input.value=spoken;\n      interpretField(finishedField,spoken);\n    };\n\n  }else{\n    root.querySelectorAll(\".pd-mic\").forEach(button=>{\n      button.disabled=true;\n      button.title=\"Voice dictation unavailable\";\n    });\n  }\n\n  textarea.addEventListener(\"input\",()=>{\n    if(!listening){\n      initialSearchVoice=false;\n      try{sessionStorage.removeItem(\"pd-results-voice-mode\");}catch(e){}\n    }\n    closeAllEditors();\n    result.hidden=true;\n    if(pdExternalActions)pdExternalActions.hidden=true;\n\n    if(analyzing){\n      cancelAnalysis();\n    }\n\n    if(!listening){\n      scheduleAnalyze(CONFIG.textDelay);\n    }\n  });\n\n  textarea.addEventListener(\"keydown\",event=>{\n    if(event.key!==\"Enter\")return;\n    if(event.shiftKey||event.isComposing)return;\n\n    event.preventDefault();\n    stopAnalysisTimer();\n\n    if(listening&&voiceField===\"demande\"){\n      voiceShouldAnalyze=true;\n      stopVoice(false);\n    }else{\n      analyze();\n    }\n  });\n\n  mainMic.addEventListener(\"click\",()=>{\n    initialSearchVoice=true;\n    try{sessionStorage.setItem(\"pd-results-voice-mode\",\"1\");}catch(e){}\n    startVoice(\"demande\");\n  });\n\n  \/\/ X : vider uniquement la demande, sans relancer ni r\u00e9initialiser les r\u00e9sultats.\n  clearButton.addEventListener(\"click\",(event)=>{\n    event.preventDefault();\n    event.stopPropagation();\n    stopAnalysisTimer();\n\n    voiceCancelled=true;\n    voiceSilentStop=true;\n    voiceShouldAnalyze=false;\n    voiceNoSpeechRetry=false;\n    clearVoiceNoSpeechTimer();\n    if(voiceStopTimer){clearTimeout(voiceStopTimer);voiceStopTimer=null;}\n    if(recognition){try{recognition.abort();}catch(error){}}\n    listening=false;\n    voiceField=null;\n    voiceFinal=\"\";\n    voiceInterim=\"\";\n    updateMicState();\n    initialSearchVoice=false;\n    try{sessionStorage.removeItem(\"pd-results-voice-mode\");}catch(e){}\n\n    cancelAnalysis();\n    textarea.value=\"\";\n    pdCriteriaUpdatedNotice=false;\n    textarea.placeholder=pdPlaceholderForViewport();\n    \/\/ Le X annule toute demande de pr\u00e9cision et les choix en attente.\n    ++pdAutoLaunchVersion;\n    pdLocationLookupPending=false;\n    pdAmbiguousLocation=false;\n    const serviceHint=document.getElementById(\"pdr-service-hint\");\n    const locationHint=document.getElementById(\"pdr-location-hint\");\n    const locationChoices=document.getElementById(\"pdr-location-choices\");\n    if(serviceHint)serviceHint.hidden=true;\n    if(locationHint)locationHint.hidden=true;\n    if(locationChoices)locationChoices.replaceChildren();\n    lastSuccessfulText=\"\";\n    lastData=null;\n    resetSelections();\n    clearLocation();\n    pdLocationMustBeChosen=false;\n    pdAutomaticGeoAttemptedFor=\"\";\n    pdInitialRequestAnalyzed=false;\n    try{\n      const url=new URL(window.location.href);\n      [\"profession_pro\",\"profil\",\"specialites\",\"langues\",\"genre\",\"lieux\",\"ordre\",\n       \"lieu_origine\",\"origine_lat\",\"origine_lng\",\"rayon_km\",\"localisation_a_preciser\",\n       \"demande\",\"besoin\",\"q\"].forEach(k=>url.searchParams.delete(k));\n      history.replaceState(history.state,\"\",url.toString());\n    }catch(e){}\n    if(pdExternalActions)pdExternalActions.hidden=true;\n    setStatus(voiceStatus,\"\",false);\n    textarea.focus({preventScroll:true});\n  });\n\n  resultsButton.addEventListener(\"click\",()=>{\n    if(!pdRequireRecognizedService())return;\n    if(pdAmbiguousLocation || pdLocationMustBeChosen){\n      const hint=document.getElementById(\"pdr-location-hint\");\n      if(hint){hint.hidden=false;hint.scrollIntoView({behavior:\"smooth\",block:\"nearest\"});}\n      return;\n    }\n    const pending=DEFINITIONS.filter(def=>{\n      if(def.location)return false;\n\n      const field=ui[def.key];\n      return field&&field.input.value.trim()!==\"\";\n    });\n\n    if(pending.length){\n      setStatus(\n        reviewStatus,\n        \"Select a suggested option or clear the unconfirmed text.\",\n        true\n      );\n\n      setFiltersOpen(true);\n      ui[pending[0].key].input.focus();\n      return;\n    }\n\n    if(locationQuery.trim()&&!confirmedLocation && !pdLocationMustBeChosen){\n      \/\/ Une localisation non confirm\u00e9e ne doit jamais bloquer la recherche.\n      \/\/ Aucun rayon ni coordonn\u00e9es ne seront transmis.\n      locationQuery=\"\";\n      city=\"\";\n      if(ui.ville){ui.ville.input.value=\"\";ui.ville.dropdown.hidden=true;}\n      setFieldMessage(\"ville\",\"\",false);\n      updateDistance();\n    }\n\n    const values={};\n\n    DEFINITIONS.forEach(def=>{\n      if(def.location)return;\n\n      const choices=selected[def.key]\n        .map(option=>option.value);\n\n      values[def.key]=choices.length\n        ?choices\n        :(DEFAULT_UNRESTRICTED.has(def.key)\n          ?[\"_\"]:[]);\n    });\n\n    const criteria={\n      values,\n      ville:confirmedLocation?city:\"\",\n      localisation:confirmedLocation?confirmedLocation:null,\n      portee_geographique:geographicScope\n    };\n\n    \/\/ Profession non identifi\u00e9e : ne pas inventer de profession.\n    \/\/ L'absence du param\u00e8tre profession_pro laisse le crit\u00e8re ouvert.\n\n    const url=new URL(\"https:\/\/prodispo.ca\/en\/results-search\/\");\n    const params=url.searchParams;\n\n    \/\/ Les param\u00e8tres vides \/ sans importance (_) sont volontairement omis.\n    \/\/ Les valeurs simples suivent exactement la convention des filtres actuels.\n    \/\/ Pour les choix multiples, la convention CSV est \u00e0 confirmer c\u00f4t\u00e9 r\u00e9sultats.\n    const put=(name,items)=>{\n      const clean=[...new Set((items||[]).map(String).filter(value=>value&&value!==\"_\"))];\n      if(clean.length)params.set(name,clean.join(\",\"));\n    };\n    const naturalRequest=String(textarea.value||\"\").trim();\n    \/\/ Remplacer la demande pr\u00e9c\u00e9dente dans la session avant toute redirection.\n    try{\n      if(naturalRequest)sessionStorage.setItem(\"prodispo_demande_originale\",naturalRequest);\n      else sessionStorage.removeItem(\"prodispo_demande_originale\");\n    }catch(e){}\n    if(naturalRequest)params.set(\"demande\",naturalRequest);\n    if(pdLocationMustBeChosen&&!confirmedLocation)params.set(\"localisation_a_preciser\",\"1\");\n    put(\"profil\",values.profil);\n    put(\"profession_pro\",values.professions);\n    put(\"specialites_pro\",values.specialites);\n    put(\"langues_pro\",values.langues);\n    put(\"sexe_pro\",values.genre);\n    put(\"lieu_consultation\",values.lieux);\n    put(\"inscription_ordre\",values.ordre);\n\n    if(confirmedLocation&&Number.isFinite(Number(confirmedLocation.latitude))&&\n       Number.isFinite(Number(confirmedLocation.longitude))){\n      params.set(\"lieu_origine\",confirmedLocation.formatted_address||city);\n      params.set(\"origine_lat\",String(confirmedLocation.latitude));\n      params.set(\"origine_lng\",String(confirmedLocation.longitude));\n\n      \/\/ Synchronisation du rayon r\u00e9ellement appliqu\u00e9 avec celui affich\u00e9.\n      \/\/ Ne pas d\u00e9pendre de kind === \"city\" : Google Places peut retourner\n      \/\/ une autre cat\u00e9gorie de lieu, m\u00eame si ses coordonn\u00e9es sont valides.\n      \/\/ Pr\u00e9server les exceptions pour les services exclusivement \u00e0 distance.\n      updateDistance();\n      const selectedLocations=(selected.lieux||[])\n        .map(option=>normalize((option.value||\"\")+\" \"+(option.label_fr||\"\")+\" \"+(option.label_en||\"\")))\n        .filter(value=>value&&value!==\"_\");\n      const exclusivelyRemote=selectedLocations.length>0&&\n        selectedLocations.every(value=>\n          \/\\b(visio|visioconference|videoconference|video|online|virtual)\\b\/.test(value)\n        );\n      if(!exclusivelyRemote&&!pdIsRemoteRequested()){\n        \/\/ updateDistance() choisit 50 km par d\u00e9faut, sauf si un rayon a \u00e9t\u00e9\n        \/\/ explicitement s\u00e9lectionn\u00e9. 0 \/ \u00ab Peu importe \u00bb reste sans rayon.\n        if(Number.isFinite(distanceKm)&&distanceKm>0){\n          params.set(\"rayon_km\",String(distanceKm));\n        }\n      }\n    }\n\n    \/\/ Le chargement n'est activ\u00e9 qu'apr\u00e8s validation des crit\u00e8res.\n    if(resultsButton.disabled)return;\n    resultsButton.disabled=true;\n    resultsButton.classList.add(\"pd-is-loading\");\n    resultsButton.setAttribute(\"aria-busy\",\"true\");\n    resultsButton.innerHTML='<span class=\"pd-launch-spinner\" aria-hidden=\"true\"><\/span><span>Searching...<\/span>';\n    console.log(\"ProDispo IA \u2014 redirection :\",url.toString(),criteria);\n    pdCloseChipPopover();\n    try{sessionStorage.setItem(\"pdr_map_loading_since\",String(Date.now()));}catch(e){}\n    pdShowMapLoader(\"Loading results and map\u2026\");\n    window.location.assign(url.toString());\n  });\n\n  window.addEventListener(\"pageshow\",()=>{\n    pdHideMapLoader();\n    resultsButton.disabled=false;\n    resultsButton.classList.remove(\"pd-is-loading\");\n    resultsButton.removeAttribute(\"aria-busy\");\n    resultsButton.textContent=\"Launch ProDispo Search\";\n  });\n\n  createFields();\n  closeAllEditors();\n  \/\/ Reprendre les crit\u00e8res d\u00e9j\u00e0 appliqu\u00e9s par la page de r\u00e9sultats.\n  \/\/ L'IA ne doit \u00eatre sollicit\u00e9e que lorsque la demande est reformul\u00e9e.\n  async function pdRestoreResultCriteria(){\n    const params=new URLSearchParams(window.location.search);\n    const hasCriteria=[\"profession_pro\",\"specialites_pro\",\"lieu_origine\",\"langues_pro\",\"sexe_pro\",\"lieu_consultation\",\"inscription_ordre\",\"profil\"].some(k=>params.has(k));\n    const loaded=await loadGlossaries();\n    if(!loaded)return;\n    const names={profil:\"profil\",professions:\"profession_pro\",specialites:\"specialites_pro\",langues:\"langues_pro\",genre:\"sexe_pro\",lieux:\"lieu_consultation\",ordre:\"inscription_ordre\"};\n    Object.entries(names).forEach(([key,name])=>{\n      const raw=params.get(name)||\"\";\n      raw.split(\",\").map(v=>v.trim()).filter(Boolean).forEach(v=>{\n        const opt=optionByValue(key,v);\n        if(opt)addSelection(key,opt);\n      });\n    });\n    const lat=Number(params.get(\"origine_lat\")),lng=Number(params.get(\"origine_lng\"));\n    const place=params.get(\"lieu_origine\")||\"\";\n    if(place&&params.has(\"origine_lat\")&&params.has(\"origine_lng\")&&Number.isFinite(lat)&&Number.isFinite(lng)){\n      city=place;\n      confirmedLocation={formatted_address:place,latitude:lat,longitude:lng,kind:\"city\",source:\"url\"};\n      locationQuery=place;\n      renderConfirmedLocation();\n    }\n    const radius=params.get(\"rayon_km\");\n    manualRadius=radius!==null&&radius!==\"\"&&Number.isFinite(Number(radius))?Number(radius):null;\n    updateDistance();\n    const radiusControl=document.getElementById(\"pdr-radius\");\n    if(radiusControl)radiusControl.value=radius||\"\";\n    \/\/ La page d\u2019accueil conserve la demande originale dans la session du navigateur.\n    \/\/ Priorit\u00e9 \u00e0 cette demande, sans ajouter ni modifier de param\u00e8tre dans l\u2019URL.\n    let savedRequest=\"\";\n    try{savedRequest=sessionStorage.getItem(\"prodispo_demande_originale\")||\"\";}catch(e){}\n    const explicitQuery=params.get(\"demande\")||params.get(\"besoin\")||params.get(\"q\")||\"\";\n    const query=explicitQuery||(hasCriteria?\"\":savedRequest);\n    pdLocationMustBeChosen=(params.get(\"localisation_a_preciser\")===\"1\" || (!!place&&!confirmedLocation)) && !(confirmedLocation&&confirmedLocation.source===\"url\");\n    textarea.value=query||((selected.professions||[]).map(labelFor).join(\", \"));\n    \/\/ Confirmation affich\u00e9e uniquement apr\u00e8s application manuelle des crit\u00e8res.\n    \/\/ Ce texte n'est pas une requ\u00eate envoy\u00e9e \u00e0 l'IA.\n    try{\n      if(sessionStorage.getItem(\"pd_en_manual_criteria_updated\")===\"1\"){\n        sessionStorage.removeItem(\"pd_en_manual_criteria_updated\");\n        pdCriteriaUpdatedNotice=true;\n        textarea.value=\"\";\n        textarea.placeholder=pdCriteriaUpdatedMessage;\n      }\n    }catch(e){}\n    \/\/ Recalculer apr\u00e8s la restauration de la demande : un service en ligne\n    \/\/ ne doit pas h\u00e9riter d'un rayon g\u00e9ographique par d\u00e9faut.\n    updateDistance();\n    result.hidden=false;\n    restoredFromURL=true;\n    setFiltersOpen(false);\n    renderSummary();\n    pdSyncResultChips();\n    if(!pdLocationMustBeChosen && !confirmedLocation && !pdAmbiguousLocation && !pdIsRemoteRequested() &&\n       !pdHasExplicitPlaceInRequest() && !params.has(\"lieu_origine\")){\n      pdMaybeGeolocate(\"\").then(found=>{\n        if(found && pdProfessionAlreadyDefined() && !pdAmbiguousLocation){\n          resultsButton.click();\n        }\n      });\n    }\n    if(pdProfessionAlreadyDefined() && pdChipEditorKey===\"professions\" && !pdPopover.hidden){\n      pdCloseChipPopover();\n    }\n    \/\/ Donner la priorit\u00e9 au choix g\u00e9ographique.\n    if(pdLocationMustBeChosen && !confirmedLocation){\n      const hinted=place||pdFallbackCity({ville:\"\"});\n      if(hinted){\n        pdLocationLookupPending=true;\n        searchLocation(hinted,true);\n      }else{\n        const hint=document.getElementById(\"pdr-location-hint\");\n        if(hint)hint.hidden=false;\n      }\n    }\n    if(!pdProfessionAlreadyDefined() && query.trim().length>=5 && !pdInitialRequestAnalyzed){\n      pdInitialRequestAnalyzed=true;\n      analyze();\n    }else if(pdPopover?.hidden!==false && !pdProfessionAlreadyDefined() && query.trim() && !pdLocationMustBeChosen){\n      pdOpenMissingProfession();\n    }\n  }\n  pdRestoreResultCriteria().catch(err=>console.warn(\"ProDispo \u2014 restoring criteria\",err));\n\n  const pdSearchBtn=document.getElementById(\"pdr-new-search\");\n  const pdOpenBtn=document.getElementById(\"pdr-open-filters\");\n  const pdCloseBtn=document.getElementById(\"pdr-close-filters\");\n  const pdRadius=document.getElementById(\"pdr-radius\");\n  const pdApply=document.getElementById(\"pdr-apply-filters\");\n  const pdChipBox=document.getElementById(\"pdr-current-chips\");\n  \/\/ Les pastilles pr\u00e9c\u00e8dent le bouton sur mobile, sans modifier l'ordre desktop.\n  function pdArrangeMobileCriteria(){\n    const row=document.querySelector(\"#pd-ia-test .pdr-criteria-row\");\n    const start=document.getElementById(\"pd-ia-start\");\n    if(!row||!start||!pdOpenBtn)return;\n    if(window.matchMedia(\"(max-width:767px)\").matches){\n      start.appendChild(row);\n      start.appendChild(pdOpenBtn);\n    }else{\n      const root=document.getElementById(\"pd-ia-test\");\n      if(row.parentElement===start)start.insertAdjacentElement(\"afterend\",row);\n      if(pdOpenBtn.parentElement!==start)start.appendChild(pdOpenBtn);\n    }\n  }\n  \/\/ Les pastilles restent sous la barre \u00e0 toutes les tailles d\u2019\u00e9cran.\n\n\n  \/\/ \u00c9dition compacte : une pastille = un seul crit\u00e8re, sans ancienne modale.\n  let pdChipEditorKey=null;\n  let pdProfessionDraftSnapshot=null;\n  let pdCriterionApplied=false;\n  let pdDraftSnapshot=null;\n  function pdTakeDraftSnapshot(){\n    return {\n      selected:Object.fromEntries(Object.keys(selected).map(k=>[k,(selected[k]||[]).slice()])),\n      city, locationQuery, confirmedLocation, distanceKm, manualRadius,\n      pdPendingLocationApproval, pdAmbiguousLocation, pdLocationMustBeChosen,\n      pdLocationLookupPending\n    };\n  }\n  function pdRestoreDraftSnapshot(snapshot){\n    if(!snapshot)return;\n    Object.keys(snapshot.selected).forEach(k=>selected[k]=snapshot.selected[k].slice());\n    city=snapshot.city; locationQuery=snapshot.locationQuery;\n    confirmedLocation=snapshot.confirmedLocation;\n    distanceKm=snapshot.distanceKm; manualRadius=snapshot.manualRadius;\n    pdPendingLocationApproval=snapshot.pdPendingLocationApproval;\n    pdAmbiguousLocation=snapshot.pdAmbiguousLocation;\n    pdLocationMustBeChosen=snapshot.pdLocationMustBeChosen;\n    pdLocationLookupPending=snapshot.pdLocationLookupPending;\n    DEFINITIONS.forEach(def=>{if(!def.location)renderSelected(def.key);});\n    renderSummary();updateDistance();\n    pdSyncResultChips();\n  }\n  const pdAllKeys=[\"profil\",\"professions\",\"specialites\",\"ville\",\"rayon\",\"genre\",\"langues\",\"lieux\",\"ordre\"];\n  const pdNames={profil:\"Profile type\",professions:\"Profession\",specialites:\"Specialties\",ville:\"Location\",rayon:\"Radius\",genre:\"Gender\",langues:\"Language\",lieux:\"Service delivery location\",ordre:\"Regulatory body \/ professional order\"};\n  const pdPopover=document.createElement(\"div\");\n  pdPopover.id=\"pdr-chip-popover\";\n  pdPopover.hidden=true;\n  pdPopover.innerHTML='<div class=\"pdr-chip-popover-head\"><strong id=\"pdr-chip-popover-title\"><\/strong><button type=\"button\" id=\"pdr-chip-popover-close\" aria-label=\"Close\">\u00d7<\/button><\/div><div id=\"pdr-chip-popover-body\"><\/div><button type=\"button\" id=\"pdr-chip-popover-apply\">Apply this criterion \u2197<\/button>';\n  document.getElementById(\"pd-ia-test\").appendChild(pdPopover);\n  const pdPopBody=pdPopover.querySelector(\"#pdr-chip-popover-body\");\n  const pdPopTitle=pdPopover.querySelector(\"#pdr-chip-popover-title\");\n  const pdRadiusHome=pdRadius?.parentElement;\n  function pdCloseChipPopover(){\n    const abandoned=!pdCriterionApplied;\n    const draft=pdDraftSnapshot;\n    const closingKey=pdChipEditorKey;\n    pdDraftSnapshot=null;\n    pdProfessionDraftSnapshot=null;\n    pdCriterionApplied=false;\n    if(ui[closingKey])cancelFieldRequest(closingKey);\n    pdProfessionClarificationMode=false;\n    pdPopover.hidden=true;\n    pdChipEditorKey=null;\n    pdPopover.querySelector(\"#pdr-chip-popover-apply\").hidden=false;\n    if(pdRadiusHome&&pdRadius&&pdRadius.parentElement!==pdRadiusHome)pdRadiusHome.appendChild(pdRadius);\n    closeAllEditors();\n    pdPopBody.querySelectorAll(\".pd-field\").forEach(el=>fieldsContainer.appendChild(el));\n    if(editorDock&&editorDock.parentElement===pdPopBody)filtersPanel.appendChild(editorDock);\n    pdPopBody.replaceChildren();\n    if(abandoned)pdRestoreDraftSnapshot(draft);\n  }\n  function pdShowChipPopover(key,chip){\n    if(pdChipEditorKey===key&&!pdPopover.hidden){pdCloseChipPopover();return;}\n    pdCloseChipPopover();\n    pdChipEditorKey=key;\n    pdDraftSnapshot=pdTakeDraftSnapshot();\n    if(key===\"professions\"){\n      pdProfessionDraftSnapshot=(selected.professions||[]).slice();\n      pdProfessionClarificationMode=true;\n    }\n    pdPopover.querySelector(\"#pdr-chip-popover-apply\").hidden=false;\n    pdPopover.querySelector(\"#pdr-chip-popover-apply\").textContent=\"Apply this criterion \u2197\";\n    pdPopTitle.textContent=pdNames[key]||\"Criterion\";\n    pdPopover.hidden=false;\n    if(key===\"rayon\"){\n      if(pdRadius)pdPopBody.appendChild(pdRadius);\n    }else if(ui[key]){\n      \/\/ R\u00e9utiliser le moteur de s\u00e9lection existant, sans recr\u00e9er les filtres.\n      if(activeEditor===key)closeAllEditors();\n      openEditor(key);\n      if(ui[key]?.row)pdPopBody.appendChild(ui[key].row);\n      if(editorDock&&!editorDock.hidden)pdPopBody.appendChild(editorDock);\n      if(key===\"ville\"){\n      pdEnsureLocationEditor();\n      \/\/ Location requires an explicit click on Apply, even when selected.\n    }\n    }\n    if(key!==\"ville\"&&key!==\"rayon\")pdEnsureCriterionEditor();\n    if(key===\"professions\"){\n      pdShowProfessionContext();\n    }\n    const rootRect=document.getElementById(\"pd-ia-test\").getBoundingClientRect();\n    const rect=chip.getBoundingClientRect();\n    const maxLeft=Math.max(8,rootRect.width-Math.min(390,rootRect.width-16)-8);\n    pdPopover.style.left=Math.min(maxLeft,Math.max(8,rect.left-rootRect.left))+\"px\";\n    pdPopover.style.top=(rect.bottom-rootRect.top+8)+\"px\";\n  }\n  \/\/ Every criterion must retain its selected values and input controls in the popup.\n  let pdGenericEditorRepairing=false;\n  function pdEnsureCriterionEditor(){\n    const key=pdChipEditorKey;\n    if(pdGenericEditorRepairing||pdPopover.hidden||!key||key===\"__more\"||key===\"rayon\"||key===\"ville\")return;\n    const field=ui[key];if(!field||!field.controls)return;\n    pdGenericEditorRepairing=true;\n    try{\n      if(field.row.parentElement!==pdPopBody)pdPopBody.insertBefore(field.row,pdPopBody.firstChild);\n      if(editorDock.parentElement!==pdPopBody)pdPopBody.appendChild(editorDock);\n      if(field.controls.parentElement!==editorDock)editorDock.appendChild(field.controls);\n      if(field.message&&field.message.parentElement!==editorDock)editorDock.appendChild(field.message);\n      field.controls.hidden=false;editorDock.hidden=false;\n      field.row.classList.add(\"is-editor-open\");\n      field.label?.setAttribute(\"aria-expanded\",\"true\");\n      activeEditor=key;\n    }finally{pdGenericEditorRepairing=false;}\n  }\n  const pdGenericEditorObserver=new MutationObserver(()=>pdEnsureCriterionEditor());\n  pdGenericEditorObserver.observe(pdPopBody,{childList:true,subtree:true,attributes:true,attributeFilter:[\"hidden\"]});\n  pdPopover.addEventListener(\"click\",()=>{\n    if(pdChipEditorKey&&pdChipEditorKey!==\"ville\")setTimeout(pdEnsureCriterionEditor,0);\n  });\n  \/\/ Localisation : conserver les contr\u00f4les dans la petite bo\u00eete pendant la dict\u00e9e.\n  \/\/ Le moteur vocal peut fermer\/reconstruire l'\u00e9diteur apr\u00e8s son ouverture.\n  let pdLocationRepairing=false;\n  function pdEnsureLocationEditor(){\n    if(pdLocationRepairing||pdPopover.hidden||pdChipEditorKey!==\"ville\")return;\n    const field=ui.ville;\n    if(!field||!field.controls)return;\n    pdLocationRepairing=true;\n    try{\n      if(field.row&&field.row.parentElement!==pdPopBody)pdPopBody.insertBefore(field.row,pdPopBody.firstChild);\n      if(editorDock.parentElement!==pdPopBody)pdPopBody.appendChild(editorDock);\n      if(field.controls.parentElement!==editorDock)editorDock.appendChild(field.controls);\n      if(field.message&&field.message.parentElement!==editorDock)editorDock.appendChild(field.message);\n      field.controls.hidden=false;\n      editorDock.hidden=false;\n      field.row.classList.add(\"is-editor-open\");\n      field.label?.setAttribute(\"aria-expanded\",\"true\");\n      activeEditor=\"ville\";\n    }finally{pdLocationRepairing=false;}\n  }\n  const pdLocationObserver=new MutationObserver(()=>{\n    if(pdChipEditorKey===\"ville\"&&!pdPopover.hidden)pdEnsureLocationEditor();\n  });\n  pdLocationObserver.observe(pdPopBody,{childList:true,subtree:true,attributes:true,attributeFilter:[\"hidden\"]});\n  pdPopover.addEventListener(\"click\",event=>{\n    if(pdChipEditorKey===\"ville\"&&event.target.closest(\"button\")){\n      setTimeout(pdEnsureLocationEditor,0);\n      setTimeout(pdEnsureLocationEditor,180);\n    }\n  });\n  \/\/ Les choix de l'IA doivent \u00eatre visibles AVANT toute confirmation.\n  \/\/ Respecter l'interface originale : la profession est d\u00e9j\u00e0 affich\u00e9e dans\n  \/\/ le champ natif et ses pastilles. Ne pas cr\u00e9er de panneau suppl\u00e9mentaire.\n  function pdShowProfessionContext(){\n    if(pdPopover.hidden||pdChipEditorKey!==\"professions\")return;\n    const duplicate=pdPopBody.querySelector(\"#pdr-profession-context\");\n    if(duplicate)duplicate.remove();\n    const apply=pdPopover.querySelector(\"#pdr-chip-popover-apply\");\n    apply.disabled=!(selected.professions||[]).length;\n    apply.textContent=\"Apply this criterion \u2197\";\n  }\n  \/\/ L'analyse est asynchrone : mettre \u00e0 jour l'aper\u00e7u sans refermer le s\u00e9lecteur.\n  const pdProfessionPreviewObserver=new MutationObserver(()=>{\n    if(pdProfessionClarificationMode&&!pdPopover.hidden&&pdChipEditorKey===\"professions\"){\n      pdShowProfessionContext();\n    }\n  });\n  if(ui.professions?.selectedArea)pdProfessionPreviewObserver.observe(ui.professions.selectedArea,{childList:true,subtree:true});\n  \/\/ Demande impr\u00e9cise : ouvrir le champ Profession comme pour la localisation.\n  \/\/ Une fermeture manuelle ne provoque pas une r\u00e9ouverture imm\u00e9diate.\n  let pdDismissedProfessionFor=\"\";\n  function pdOpenMissingProfession(){\n    \/\/ La profession inconnue doit pouvoir \u00eatre pr\u00e9cis\u00e9e m\u00eame si\n    \/\/ Google Places est encore en train de valider la ville.\n\n    \/\/ Ne pas afficher une demande de pr\u00e9cision si profession_pro est d\u00e9j\u00e0\n    \/\/ d\u00e9fini (y compris avant la fin du chargement des glossaires).\n    if(pdProfessionAlreadyDefined())return;\n    const query=requestText().trim();\n    if(!query)return;\n    if(!pdPopover.hidden&&pdChipEditorKey===\"professions\")return;\n    const chip=Array.from(pdChipBox?.querySelectorAll(\"button\")||[])\n      .find(el=>el.getAttribute(\"aria-label\")===\"Edit Profession\")\n      ||pdChipBox?.querySelector(\".pdr-more-chip\")\n      ||pdChipBox;\n    if(!chip)return;\n    pdShowChipPopover(\"professions\",chip);\n    pdProfessionClarificationMode=true;\n    pdPopover.querySelector(\"#pdr-chip-popover-apply\").textContent=\"Apply this criterion \u2197\";\n    pdShowProfessionContext();\n    \/\/ La demande principale a d\u00e9j\u00e0 \u00e9t\u00e9 analys\u00e9e. Ne pas relancer une seconde\n    \/\/ analyse lors de l'ouverture de la bo\u00eete de clarification.\n    \/\/ Annuler toute ancienne analyse du champ (y compris son indicateur visuel).\n    cancelFieldRequest(\"professions\");\n    const professionField=ui.professions;\n    if(professionField?.input){\n      professionField.input.value=\"\";\n      professionField.input.placeholder=\"Describe your needs\u2026\";\n      professionField.input.removeAttribute(\"aria-busy\");\n      professionField.input.disabled=false;\n      professionField.input.readOnly=false;\n      professionField.dropdown.hidden=true;\n      setFieldMessage(\"professions\",\"\",false);\n      setProcessing(\"professions\",false);\n      \/\/ La personne peut imm\u00e9diatement \u00e9crire ou activer le microphone.\n      requestAnimationFrame(()=>{\n        if(!pdPopover.hidden && pdChipEditorKey===\"professions\"){\n          setProcessing(\"professions\",false);\n          professionField.input.focus({preventScroll:true});\n        }\n      });\n    }\n  }\n  pdPopover.querySelector(\"#pdr-chip-popover-close\").addEventListener(\"click\",()=>{\n    if(pdChipEditorKey===\"professions\"&&!pdServiceIsRecognized())\n      pdDismissedProfessionFor=requestText().trim();\n  });\n  pdPopover.querySelector(\"#pdr-chip-popover-close\").addEventListener(\"click\",pdCloseChipPopover);\n  \/\/ Fermer les s\u00e9lecteurs avec X, \u00c9chap ou un clic ext\u00e9rieur.\n  document.addEventListener(\"pointerdown\",event=>{\n    if(pdPopover.hidden)return;\n    if(pdPopover.contains(event.target))return;\n    if(event.target.closest(\"#pdr-current-chips\"))return;\n    pdCloseChipPopover();\n  },true);\n  document.addEventListener(\"keydown\",event=>{\n    if(event.key===\"Escape\"&&!pdPopover.hidden){event.preventDefault();pdCloseChipPopover();}\n  });\n\n  pdPopover.querySelector(\"#pdr-chip-popover-apply\").addEventListener(\"click\",()=>{\n    \/\/ Une ville choisie dans les suggestions Google est D\u00c9J\u00c0 confirm\u00e9e.\n    \/\/ Ne jamais lancer une seconde clarification du m\u00eame lieu.\n    if(pdChipEditorKey===\"ville\" && confirmedLocation){\n      pdPendingLocationApproval=false;\n      \/\/ Commit location to the query and URL only after Apply.\n      textarea.value=pdUpdateRequestWithConfirmedLocation(textarea.value,city);\n      lastSuccessfulText=textarea.value.trim();\n      try{\n        const updated=new URL(window.location.href);\n        updated.searchParams.set(\"demande\",textarea.value.trim());\n        updated.searchParams.set(\"lieu_origine\",confirmedLocation.formatted_address||city);\n        updated.searchParams.set(\"origine_lat\",String(confirmedLocation.latitude));\n        updated.searchParams.set(\"origine_lng\",String(confirmedLocation.longitude));\n        updated.searchParams.delete(\"localisation_a_preciser\");\n        window.history.replaceState(window.history.state,\"\",updated.toString());\n        sessionStorage.setItem(\"prodispo_demande_originale\",textarea.value.trim());\n      }catch(error){console.warn(\"ProDispo: location confirmation\",error);}\n      pdAmbiguousLocation=false;\n      pdLocationMustBeChosen=false;\n      pdLocationLookupPending=false;\n      if(ui.ville?.input){ui.ville.input.value=\"\";ui.ville.dropdown.hidden=true;}\n      pdCriterionApplied=true;\n      pdCloseChipPopover();\n      pdSyncResultChips();\n      \/\/ Once location is applied, request profession_pro if AI did not resolve it.\n      if(!pdRequireRecognizedService())return;\n      resultsButton.click();\n      return;\n    }\n    if(pdChipEditorKey===\"ville\" && !confirmedLocation){\n      setFieldMessage(\"ville\",\"Select a location before applying this criterion.\",false);return;\n    }\n    if(pdChipEditorKey===\"professions\"&&!(selected.professions||[]).length){\n      setFieldMessage(\"professions\",\"Describe your needs to identify a profession.\",false);return;\n    }\n    \/\/ Comme en FR : une profession s\u00e9lectionn\u00e9e est d\u00e9finitive. Ne jamais\n    \/\/ laisser le texte provisoire emp\u00eacher le lancement des r\u00e9sultats.\n    if(pdChipEditorKey===\"professions\" && (selected.professions||[]).length){\n      if(ui.professions?.input){\n        ui.professions.input.value=\"\";\n        ui.professions.dropdown.hidden=true;\n      }\n      cancelFieldRequest(\"professions\");\n    }\n    pdCriterionApplied=true;\n    pdCloseChipPopover();\n    \/\/ Le lieu doit \u00eatre confirm\u00e9 avant la navigation. Si n\u00e9cessaire,\n    \/\/ relancer le parcours de clarification plut\u00f4t que bloquer silencieusement.\n    if(pdAmbiguousLocation||pdLocationMustBeChosen||pdLocationLookupPending){\n      pdLaunchAfterAnalysis(lastData||{});\n      return;\n    }\n    resultsButton.click();\n  });\n  function pdSyncResultChips(){\n    if(!pdChipBox)return;\n    pdChipBox.replaceChildren();\n    const values={};\n    pdAllKeys.forEach(key=>values[key]=(selected[key]||[]).map(labelFor).filter(Boolean).join(\", \"));\n    if(city&&confirmedLocation&&!pdPendingLocationApproval)values.ville=city;\n    if(Number.isFinite(distanceKm)&&distanceKm>0&&values.ville)values.rayon=distanceKm+\" km\";\n    const makeChip=(key,caption)=>{\n      const chip=document.createElement(\"button\");\n      chip.type=\"button\";\n      chip.className=\"pdr-current-chip pdr-interactive-chip\";\n      chip.textContent=caption+\" \u25be\";\n      chip.setAttribute(\"aria-label\",\"Edit \"+(pdNames[key]||key));\n      chip.addEventListener(\"click\",()=>pdShowChipPopover(key,chip));\n      pdChipBox.appendChild(chip);\n    };\n    pdAllKeys.forEach(key=>{\n      if(values[key])makeChip(key,(pdNames[key]||key)+\" : \"+values[key]);\n    });\n    const missing=pdAllKeys.filter(key=>!values[key]);\n    if(missing.length){\n      const more=document.createElement(\"button\");\n      more.type=\"button\";\n      more.className=\"pdr-current-chip pdr-interactive-chip pdr-more-chip\";\n      more.textContent=\"+ More criteria \u25be\";\n      more.setAttribute(\"aria-label\",\"Show additional available criteria\");\n      more.addEventListener(\"click\",()=>{\n        if(!pdPopover.hidden&&pdChipEditorKey===\"__more\"){\n          pdCloseChipPopover();return;\n        }\n        pdCloseChipPopover();\n        pdChipEditorKey=\"__more\";\n        pdPopTitle.textContent=\"More criteria\";\n        pdPopover.hidden=false;\n        const choices=document.createElement(\"div\");\n        choices.className=\"pdr-other-criteria\";\n        missing.forEach(key=>{\n          const btn=document.createElement(\"button\");\n          btn.type=\"button\";\n          btn.className=\"pdr-other-criterion\";\n          btn.textContent=pdNames[key]||key;\n          btn.addEventListener(\"click\",()=>pdShowChipPopover(key,more));\n          choices.appendChild(btn);\n        });\n        pdPopBody.appendChild(choices);\n        pdPopover.querySelector(\"#pdr-chip-popover-apply\").hidden=true;\n        const rootRect=document.getElementById(\"pd-ia-test\").getBoundingClientRect();\n        const rect=more.getBoundingClientRect();\n        pdPopover.style.left=Math.max(8,Math.min(rootRect.width-400,rect.left-rootRect.left))+\"px\";\n        pdPopover.style.top=(rect.bottom-rootRect.top+8)+\"px\";\n      });\n      pdChipBox.appendChild(more);\n    }\n    if(pdRadius&&document.activeElement!==pdRadius)pdRadius.value=distanceKm>0?String(distanceKm):\"\";\n  }\n  \/\/ Pas de validation automatique au clic, \u00e0 la suppression, \u00e0 la saisie\n  \/\/ ni \u00e0 la reconnaissance vocale dans les bo\u00eetes de crit\u00e8res.\n  \/\/ Le bouton bleu \u00ab Apply this criterion \u00bb est l'unique d\u00e9clencheur.\n  new MutationObserver(()=>{if(pdPopover.hidden)pdSyncResultChips();}).observe(summaryContainer,{childList:true,subtree:true});\n  pdOpenBtn?.addEventListener(\"click\",()=>{\n    if(result.hidden){result.hidden=false;renderSummary();}\n    const open=filtersPanel.hidden;\n    setFiltersOpen(open);\n    pdOpenBtn.setAttribute(\"aria-expanded\",String(open));\n    if(open)pdSyncResultChips();\n  });\n  pdCloseBtn?.addEventListener(\"click\",()=>{setFiltersOpen(false);pdOpenBtn?.setAttribute(\"aria-expanded\",\"false\");});\n  pdRadius?.addEventListener(\"change\",()=>{\n    manualRadius=pdRadius.value?Number(pdRadius.value):0;\n    updateDistance();pdSyncResultChips();\n  });\n  pdApply?.addEventListener(\"click\",()=>{\n    try{sessionStorage.setItem(\"pd_en_manual_criteria_updated\",\"1\");}catch(e){}\n    resultsButton.click();\n    if(reviewStatus.textContent.trim()){\n      try{sessionStorage.removeItem(\"pd_en_manual_criteria_updated\");}catch(e){}\n    }\n  });\n\n  \/\/ Un \u00e9tat vide explicite emp\u00eache JetEngine d'afficher tous les profils en\n  \/\/ l'absence de filtres. Le widget Map Listing reste intact pour les recherches suivantes.\n  if(new URLSearchParams(window.location.search).get(\"pd_empty\")===\"1\"){\n    document.body.classList.add(\"pdr-search-empty\");\n    const root=document.getElementById(\"pd-ia-test\");\n    const topContainer=(()=>{\n      let el=root;\n      while(el&&el.parentElement){\n        const siblings=Array.from(el.parentElement.children).filter(x=>x.classList?.contains(\"e-con\"));\n        if(siblings.length>=3&&siblings[0].contains(root))return siblings;\n        el=el.parentElement;\n      }\n      return null;\n    })();\n    if(topContainer){\n      const resultArea=topContainer[1];\n      const mapArea=topContainer[2];\n      \/\/ Le compteur est le premier champ dynamique de la zone des r\u00e9sultats.\n      const count=resultArea?.querySelector('.elementor-widget-jet-listing-dynamic-field .jet-listing-dynamic-field__content, .elementor-widget-jet-listing-dynamic-field, .jet-listing-dynamic-field__content');\n      if(count)count.textContent=\"0\";\n      if(mapArea){\n        mapArea.style.display=\"none\";\n        const note=document.createElement(\"div\");\n        note.className=\"pdr-blank-map-note\";\n        note.textContent=\"Describe your needs to display professionals on the map.\";\n        mapArea.insertAdjacentElement(\"afterend\",note);\n      }\n    }\n    \/\/ R\u00e9duire le risque de compteur r\u00e9siduel si le widget n'a pas le s\u00e9lecteur pr\u00e9vu.\n    document.querySelectorAll('.jet-listing-dynamic-field__content').forEach(el=>{\n      if(\/^\\s*\\d+\\s*$\/.test(el.textContent||\"\") && !el.closest('#pd-ia-test'))el.textContent=\"0\";\n    });\n    textarea.value=\"\";\n    pdCriteriaUpdatedNotice=false;\n    textarea.placeholder=pdPlaceholderForViewport();\n    lastSuccessfulText=\"\";\n    lastData=null;\n    resetSelections();\n    clearLocation();\n    result.hidden=true;\n    setFiltersOpen(false);\n    if(pdChipBox)pdChipBox.replaceChildren();\n  }\n  pdSyncResultChips();\n  loadGlossaries();\n\n  loadGooglePlaces().catch(error=>{\n    console.warn(\n      \"ProDispo \u2014 Google Places :\",\n      error.message\n    );\n  });\n\n  setTimeout(()=>{\n    if(window.innerWidth>767&&\n       document.activeElement===document.body){\n      textarea.focus({preventScroll:true});\n    }\n  },350);\n}\n\nif(document.readyState===\"loading\"){\n  document.addEventListener(\n    \"DOMContentLoaded\",init,{once:true}\n  );\n}else{\n  init();\n}\n})();\n<\/script>\n\n<style>\n\/* Rayon de recherche : contr\u00f4le compact dans la carte Localisation.\n   R\u00e8gles finales pour neutraliser les dimensions h\u00e9rit\u00e9es du moteur. *\/\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control{\n  display:flex!important;flex-direction:row!important;align-items:center!important;\n  justify-content:flex-start!important;flex-wrap:wrap!important;gap:10px!important;\n  width:100%!important;min-height:0!important;height:auto!important;max-height:none!important;\n  flex:0 0 auto!important;align-self:flex-start!important;\n  margin:10px 0 0!important;padding:10px 0 0!important;\n  border-top:1px solid #dfe6f2!important;box-sizing:border-box!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-title{\n  display:inline!important;flex:0 0 auto!important;align-self:center!important;\n  margin:0!important;padding:0!important;line-height:1.4!important;\n  font-size:12px!important;font-weight:700!important;color:#0a1a44!important;\n}\n#pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control #pdr-radius{\n  display:block!important;appearance:auto!important;-webkit-appearance:menulist!important;\n  box-sizing:border-box!important;flex:0 0 155px!important;\n  width:155px!important;min-width:0!important;max-width:155px!important;\n  height:38px!important;min-height:38px!important;max-height:38px!important;\n  margin:0!important;padding:5px 10px!important;\n  font-size:13px!important;line-height:normal!important;font-weight:400!important;\n  background:#fff!important;color:#0a1a44!important;\n  border:1px solid #d9e2f1!important;border-radius:9px!important;\n  overflow:hidden!important;vertical-align:middle!important;\n}\n@media(max-width:520px){\n  #pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control{gap:7px!important}\n  #pd-ia-test #pd-ia-fields .pd-field .pdr-radius-control #pdr-radius{\n    flex:0 1 150px!important;width:150px!important;max-width:100%!important;\n  }\n}\n\/* Uniformiser tous les intitul\u00e9s des crit\u00e8res, y compris les crit\u00e8res facultatifs. *\/\n#pd-ia-test #pd-ia-fields .pd-field-title,\n#pd-ia-test #pd-ia-fields .pd-field-title *,\n#pd-ia-test #pd-ia-fields .pd-field-label,\n#pd-ia-test #pd-ia-fields .pd-field-heading > button,\n#pd-ia-test #pd-ia-fields .pd-field-heading > label{\n  font-weight:700!important;\n  color:#0a1a44!important;\n}\n<\/style>\n<\/div>\n\n<style>\n\n\/* 13 octobre \u2014 ajustements suppl\u00e9mentaires de l'\u00e9diteur mobile *\/\n@media(max-width:767px){\n #pd-ia-test #pd-ia-fields,\n #pd-ia-test #pd-ia-fields>.pd-criteria-row,\n #pd-ia-test #pd-ia-fields .pd-field,\n #pd-ia-test #pd-ia-fields .pd-field-heading,\n #pd-ia-test #pd-ia-fields .pd-selected{min-width:0!important;max-width:100%!important;box-sizing:border-box!important}\n #pd-ia-test #pd-ia-fields .pd-field{overflow:hidden!important}\n #pd-ia-test #pd-ia-fields .pd-field-heading{display:flex!important;flex-wrap:wrap!important;align-items:flex-start!important;gap:5px!important}\n #pd-ia-test #pd-ia-fields .pd-field-title{\n   display:block!important;white-space:normal!important;overflow:visible!important;\n   overflow-wrap:anywhere!important;word-break:normal!important;line-height:1.35!important;\n   max-width:100%!important;min-width:0!important;flex:1 1 100%!important;\n }\n #pd-ia-test #pd-ia-fields .pd-selected{\n   display:flex!important;flex-wrap:wrap!important;gap:4px!important;\n   overflow:hidden!important;white-space:normal!important;\n }\n #pd-ia-test #pd-ia-fields .pd-chip{\n   max-width:100%!important;min-width:0!important;box-sizing:border-box!important;\n   display:inline-flex!important;align-items:center!important;white-space:normal!important;\n   overflow-wrap:anywhere!important;gap:4px!important;\n }\n #pd-ia-test #pd-ia-fields .pd-chip-label{\n   min-width:0!important;max-width:100%!important;flex:1 1 auto!important;\n   overflow:visible!important;text-overflow:clip!important;white-space:normal!important;\n   overflow-wrap:anywhere!important;line-height:1.3!important;\n }\n #pd-ia-test #pd-ia-fields .pd-chip button{\n   flex:0 0 25px!important;min-width:25px!important;min-height:29px!important;\n   display:inline-flex!important;align-items:center!important;justify-content:center!important;\n   padding:0!important;font-size:20px!important;\n }\n #pd-ia-test #pd-ia-editor-dock .pd-input-holder{position:relative!important}\n #pd-ia-test #pd-ia-editor-dock .pd-field-input{padding-right:39px!important;font-size:16px!important}\n #pd-ia-test #pd-ia-editor-dock .pd-inline-clear{\n   position:absolute!important;right:5px!important;top:50%!important;transform:translateY(-50%)!important;\n   display:flex!important;align-items:center!important;justify-content:center!important;\n   width:30px!important;height:30px!important;padding:0!important;border:0!important;\n   border-radius:50%!important;background:#eef2f8!important;color:#263b5b!important;\n   font-size:22px!important;z-index:20!important;cursor:pointer!important;\n }\n #pd-ia-test #pd-ia-editor-dock .pd-inline-clear[hidden]{display:none!important}\n}\n\n<\/style>\n\n<style>\n\/* Effacer la saisie dans l'\u00e9diteur de crit\u00e8res : ordinateur et mobile. *\/\n#pd-ia-test #pd-ia-editor-dock .pd-input-holder {position:relative!important}\n#pd-ia-test #pd-ia-editor-dock .pd-field-input {padding-right:44px!important}\n#pd-ia-test #pd-ia-editor-dock .pd-inline-clear {\n position:absolute!important;right:7px!important;top:50%!important;transform:translateY(-50%)!important;\n display:inline-flex!important;align-items:center!important;justify-content:center!important;\n width:31px!important;height:31px!important;min-width:31px!important;\n padding:0!important;border:0!important;border-radius:50%!important;\n background:#eef2f8!important;color:#253957!important;font-size:23px!important;\n cursor:pointer!important;z-index:20!important;line-height:1!important;\n}\n#pd-ia-test #pd-ia-editor-dock .pd-inline-clear[hidden] {display:none!important}\n<\/style>\n\n<style>\n\/* Position fixe de la barre de modification des crit\u00e8res *\/\n@media (min-width: 768px) {\n  #pd-ia-test #pd-ia-editor-dock:not([hidden]) {\n    position: fixed !important;\n    top: 43vh !important;\n    left: 50% !important;\n    right: auto !important;\n    bottom: auto !important;\n    transform: translate(-50%, -50%) !important;\n    width: min(850px, calc(100vw - 48px)) !important;\n    max-width: 850px !important;\n    margin: 0 !important;\n    z-index: 2147483000 !important;\n  }\n}\n<\/style>\n\n<style id=\"pdr-profession-preview-style\">\n#pd-ia-test #pdr-profession-context{padding:10px 12px;margin:0 0 10px;border:1px solid #dbe5f5;border-radius:12px;background:#f6f9ff;color:#10295c;font-size:13px;line-height:1.45}\n#pd-ia-test #pdr-profession-context strong{display:block;font-size:14px;margin-bottom:5px}\n#pd-ia-test #pdr-profession-context p{margin:4px 0 9px}\n#pd-ia-test .pdr-profession-confirmed{display:flex;gap:7px;flex-wrap:wrap}\n#pd-ia-test .pdr-profession-confirmed button{border:1px solid #a9bee9;background:white;color:#10295c;border-radius:9px;padding:7px 9px;cursor:pointer;font-weight:600}\n#pd-ia-test #pdr-chip-popover-apply:disabled{opacity:.45;cursor:not-allowed}\n#pd-ia-test #pdr-chip-popover .pd-field-controls.is-processing .pd-field-input{visibility:visible!important}\n<\/style>\n\n\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5970739 e-con-full pd-results-hero-text e-flex e-con e-child\" data-id=\"5970739\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-1c92192 e-con-full pd-results-title-line e-flex e-con e-child\" data-id=\"1c92192\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c4228d2 pd-results-count elementor-widget elementor-widget-jet-listing-dynamic-field\" data-id=\"c4228d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"jet-listing-dynamic-field.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"jet-listing jet-listing-dynamic-field display-inline\"><div class=\"jet-listing-dynamic-field__inline-wrap\"><div class=\"jet-listing-dynamic-field__content\" ><span class=\"jet-engine-query-count query-14 count-type-total\" data-query=\"14\">147<\/span><\/div><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-43c4a76 elementor-widget elementor-widget-html\" data-id=\"43c4a76\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<!-- PRODISPO \u2014 RESULTS TITLE EN -->\r\n<div class=\"pd-results-cta-title-row\">\r\n  <h1 class=\"pd-results-cta-title\">\r\n    <span class=\"pd-title-zero\">\r\n      No pros found for your needs\r\n    <\/span>\r\n    <span class=\"pd-title-singular\">\r\n      Pro found for your needs\r\n    <\/span>\r\n    <span class=\"pd-title-plural\">\r\n      Pros found for your needs\r\n    <\/span>\r\n  <\/h1>\r\n<\/div>\r\n\r\n<style>\r\n\/* MAIN CONTAINER *\/\r\n@media (min-width: 768px) {\r\n  .pd-results-hero-text {\r\n    width: calc(100% - 96px) !important;\r\n    max-width: 1800px !important;\r\n    margin-left: auto !important;\r\n    margin-right: auto !important;\r\n\r\n    display: grid !important;\r\n    grid-template-columns: 1fr 1fr !important;\r\n    align-items: center !important;\r\n    column-gap: 20px !important;\r\n    padding: 8px 0 !important;\r\n  }\r\n}\r\n\r\n\/* LEFT CONTAINER *\/\r\n.pd-results-hero-text .pd-results-title-line {\r\n  display: flex !important;\r\n  flex-direction: row !important;\r\n  flex-wrap: nowrap !important;\r\n  align-items: baseline !important;\r\n  justify-content: flex-start !important;\r\n  gap: 7px !important;\r\n  min-width: 0 !important;\r\n}\r\n\r\n\/* JETENGINE COUNTER *\/\r\n.pd-results-title-line .pd-results-count {\r\n  flex: 0 0 auto !important;\r\n  display: inline-block !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n\r\n  color: #0A1A44 !important;\r\n  font-size: 23px !important;\r\n  font-weight: 800 !important;\r\n  line-height: 1.2 !important;\r\n  font-variant-numeric: tabular-nums;\r\n  vertical-align: baseline !important;\r\n\r\n  position: relative !important;\r\n  top: -4px !important;\r\n}\r\n\r\n\/* Hide the zero counter; the title states no results *\/\r\nbody.pd-zero-title .pd-results-title-line .pd-results-count {\r\n  display: none !important;\r\n}\r\n\r\n\/* HTML TITLE WIDGET *\/\r\n.pd-results-title-line > .elementor-widget-html {\r\n  flex: 0 1 auto !important;\r\n  width: auto !important;\r\n  min-width: 0 !important;\r\n  margin: 0 !important;\r\n}\r\n\r\n.pd-results-cta-title-row {\r\n  display: flex;\r\n  align-items: baseline;\r\n}\r\n\r\n\/* TITLE *\/\r\n.pd-results-cta-title {\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n\r\n  color: #0A1A44 !important;\r\n  font-size: 23px !important;\r\n  font-weight: 800 !important;\r\n  line-height: 1.2 !important;\r\n  letter-spacing: -0.03em;\r\n}\r\n\r\n\/* DEFAULT: PLURAL *\/\r\n.pd-title-zero,\r\n.pd-title-singular {\r\n  display: none;\r\n}\r\n\r\n.pd-title-plural {\r\n  display: inline;\r\n}\r\n\r\n\/* ZERO RESULTS *\/\r\nbody.pd-zero-title .pd-title-zero {\r\n  display: inline;\r\n}\r\n\r\nbody.pd-zero-title .pd-title-plural,\r\nbody.pd-zero-title .pd-title-singular {\r\n  display: none;\r\n}\r\n\r\n\/* ONE RESULT *\/\r\nbody.pd-one-result .pd-title-singular {\r\n  display: inline;\r\n}\r\n\r\nbody.pd-one-result .pd-title-plural,\r\nbody.pd-one-result .pd-title-zero {\r\n  display: none;\r\n}\r\n\r\n\/* MOBILE *\/\r\n@media (max-width: 767px) {\r\n  .pd-results-hero-text {\r\n    display: flex !important;\r\n    flex-direction: column !important;\r\n    align-items: center !important;\r\n    gap: 16px !important;\r\n    width: 100% !important;\r\n    padding: 10px 16px !important;\r\n  }\r\n\r\n  .pd-results-hero-text .pd-results-title-line {\r\n    justify-content: center !important;\r\n    flex-wrap: wrap !important;\r\n    gap: 6px !important;\r\n    text-align: center;\r\n  }\r\n\r\n  .pd-results-title-line .pd-results-count,\r\n  .pd-results-title-line .pd-results-cta-title {\r\n    font-size: 20px !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  let observer = null;\r\n  let observedElement = null;\r\n\r\n  function updateResultTitle() {\r\n    const countEl = document.querySelector(\r\n      \".pd-results-count\"\r\n    );\r\n\r\n    if (!countEl) return;\r\n\r\n    const match = countEl.textContent\r\n      .trim()\r\n      .replace(\/[\\s,\\u00A0]\/g, \"\")\r\n      .match(\/\\d+\/);\r\n\r\n    if (!match) return;\r\n\r\n    const count = Number(match[0]);\r\n\r\n    if (!Number.isFinite(count)) return;\r\n\r\n    document.body.classList.toggle(\r\n      \"pd-zero-title\",\r\n      count === 0\r\n    );\r\n\r\n    document.body.classList.toggle(\r\n      \"pd-one-result\",\r\n      count === 1\r\n    );\r\n  }\r\n\r\n  function init() {\r\n    const countEl = document.querySelector(\r\n      \".pd-results-count\"\r\n    );\r\n\r\n    if (!countEl) return;\r\n\r\n    updateResultTitle();\r\n\r\n    if (observedElement === countEl) return;\r\n\r\n    if (observer) observer.disconnect();\r\n\r\n    observedElement = countEl;\r\n\r\n    observer = new MutationObserver(\r\n      updateResultTitle\r\n    );\r\n\r\n    observer.observe(countEl, {\r\n      childList: true,\r\n      characterData: true,\r\n      subtree: true\r\n    });\r\n  }\r\n\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      init\r\n    );\r\n  } else {\r\n    init();\r\n  }\r\n\r\n  document.addEventListener(\r\n    \"jet-smart-filters\/content-rendered\",\r\n    init\r\n  );\r\n\r\n  document.addEventListener(\r\n    \"jet-engine\/listing\/ajax\/after\",\r\n    init\r\n  );\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-74ca56b e-con-full pd-results-cta-block e-flex e-con e-child\" data-id=\"74ca56b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-62afd41 pd-results-main-cta elementor-widget__width-auto elementor-align-center elementor-widget elementor-widget-button\" data-id=\"62afd41\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#elementor-action%3Aaction%3Dpopup%3Aopen%26settings%3DeyJpZCI6MjczMjgsInRvZ2dsZSI6ZmFsc2V9\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">\ud83d\udce9 Check Their Availability<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4986211 elementor-widget elementor-widget-html\" data-id=\"4986211\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<!-- PRODISPO \u2014 RESULTS CTA EN -->\r\n<!-- CTA: Check Their Availability -->\r\n<!-- Secondary text removed -->\r\n\r\n<style>\r\n\/* CTA GROUP *\/\r\n.pd-results-hero-text .pd-results-cta-block {\r\n  display: flex !important;\r\n  flex-direction: row !important;\r\n  flex-wrap: nowrap !important;\r\n  align-items: center !important;\r\n  justify-content: flex-end !important;\r\n  gap: 8px !important;\r\n  flex: 0 0 auto;\r\n  min-width: 0;\r\n}\r\n\r\n\/* ELEMENTOR BUTTON WIDGET *\/\r\n.pd-results-cta-block .pd-results-main-cta {\r\n  width: auto !important;\r\n  max-width: none !important;\r\n  flex: 0 0 auto !important;\r\n  margin: 0 !important;\r\n}\r\n\r\n\/* ACTUAL ELEMENTOR BUTTON *\/\r\n.pd-results-cta-block\r\n.pd-results-main-cta .elementor-button {\r\n  display: inline-flex !important;\r\n  align-items: center !important;\r\n  justify-content: center !important;\r\n  gap: 9px;\r\n  width: auto !important;\r\n  min-height: 48px;\r\n  padding: 12px 24px !important;\r\n  border-radius: 50px !important;\r\n  background-color: #1245A4 !important;\r\n  color: #FFFFFF !important;\r\n  text-decoration: none !important;\r\n  font-size: 16px;\r\n  font-weight: 700;\r\n  line-height: 1.2;\r\n  white-space: nowrap;\r\n  box-shadow: 0 4px 14px rgba(18,69,164,.16);\r\n}\r\n\r\n.pd-results-cta-block\r\n.pd-results-main-cta .elementor-button:hover {\r\n  background-color: #0A2F7A !important;\r\n  color: #FFFFFF !important;\r\n}\r\n\r\n.pd-results-cta-block\r\n.pd-results-main-cta .elementor-button-text {\r\n  color: #FFFFFF !important;\r\n  text-decoration: none !important;\r\n}\r\n\r\n\/* HIDE OLD SECONDARY TEXT IF STILL PRESENT *\/\r\n.pd-results-cta-subtext {\r\n  display: none !important;\r\n}\r\n\r\n\/* DESKTOP *\/\r\n@media (min-width: 768px) {\r\n  .pd-results-hero-text {\r\n    position: relative !important;\r\n  }\r\n\r\n  .pd-results-hero-text > .pd-results-cta-block {\r\n    position: absolute !important;\r\n    left: calc(50% + 55px) !important;\r\n    transform: translate(-50%, -6px) !important;\r\n\r\n    display: flex !important;\r\n    flex-direction: row !important;\r\n    flex-wrap: nowrap !important;\r\n    align-items: center !important;\r\n    justify-content: center !important;\r\n    gap: 10px !important;\r\n\r\n    width: max-content !important;\r\n    max-width: none !important;\r\n    margin-left: 0 !important;\r\n  }\r\n\r\n  .pd-results-cta-block\r\n  .pd-results-main-cta .elementor-button {\r\n    transition:\r\n      background-color .2s ease,\r\n      box-shadow .2s ease,\r\n      transform .2s ease !important;\r\n  }\r\n\r\n  .pd-results-cta-block\r\n  .pd-results-main-cta .elementor-button:hover {\r\n    background-color: #082D78 !important;\r\n    box-shadow: 0 8px 24px rgba(18,69,164,.32) !important;\r\n    transform: translateY(-2px);\r\n  }\r\n\r\n  .pd-results-cta-block\r\n  .pd-results-main-cta .elementor-button:focus-visible {\r\n    outline: 3px solid #7CA9FF !important;\r\n    outline-offset: 4px;\r\n  }\r\n}\r\n\r\n\/* MOBILE *\/\r\n@media (max-width: 767px) {\r\n  .pd-results-hero-text .pd-results-cta-block {\r\n    justify-content: center !important;\r\n    gap: 10px !important;\r\n    flex-wrap: wrap !important;\r\n  }\r\n\r\n  .pd-results-cta-block\r\n  .pd-results-main-cta .elementor-button {\r\n    font-size: 14px;\r\n    min-height: 44px;\r\n    padding: 11px 17px !important;\r\n  }\r\n}\r\n\r\n\/* REDUCED MOTION *\/\r\n@media (prefers-reduced-motion: reduce) {\r\n  .pd-results-main-cta .elementor-button {\r\n    transition: none !important;\r\n    transform: none !important;\r\n  }\r\n}\r\n\r\n\/* HIDE GROUP CTA FOR 0 OR 1 RESULT *\/\r\nbody.pd-few-results .pd-results-cta-block {\r\n  display: none !important;\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  let observer = null;\r\n  let observedElement = null;\r\n\r\n  function updateCTAVisibility() {\r\n    const countEl = document.querySelector(\r\n      \".pd-results-count\"\r\n    );\r\n\r\n    if (!countEl) return;\r\n\r\n    const match = countEl.textContent\r\n      .trim()\r\n      .replace(\/\\s\/g, \"\")\r\n      .match(\/\\d+\/);\r\n\r\n    if (!match) return;\r\n\r\n    const count = Number(match[0]);\r\n\r\n    if (!Number.isFinite(count)) return;\r\n\r\n    document.body.classList.toggle(\r\n      \"pd-few-results\",\r\n      count <= 1\r\n    );\r\n  }\r\n\r\n  function init() {\r\n    const countEl = document.querySelector(\r\n      \".pd-results-count\"\r\n    );\r\n\r\n    if (!countEl) return;\r\n\r\n    updateCTAVisibility();\r\n\r\n    if (observedElement === countEl) return;\r\n\r\n    if (observer) observer.disconnect();\r\n\r\n    observedElement = countEl;\r\n\r\n    observer = new MutationObserver(\r\n      updateCTAVisibility\r\n    );\r\n\r\n    observer.observe(countEl, {\r\n      childList: true,\r\n      characterData: true,\r\n      subtree: true\r\n    });\r\n  }\r\n\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      init\r\n    );\r\n  } else {\r\n    init();\r\n  }\r\n\r\n  \/* REFRESH AFTER AJAX FILTERS *\/\r\n  document.addEventListener(\r\n    \"jet-smart-filters\/content-rendered\",\r\n    init\r\n  );\r\n\r\n  document.addEventListener(\r\n    \"jet-engine\/listing\/ajax\/after\",\r\n    init\r\n  );\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1be990f e-con-full pd-map pdp-map-legend e-flex e-con e-child\" data-id=\"1be990f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7dfe921 elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-widget-tablet__width-initial pd-map-results elementor-widget elementor-widget-jet-engine-maps-listing\" data-id=\"7dfe921\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"jet-engine-maps-listing.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"jet-map-listing jet-listing-grid--2689 google-provider\" data-init=\"{&quot;zoomControl&quot;:true,&quot;fullscreenControl&quot;:false,&quot;streetViewControl&quot;:false,&quot;mapTypeControl&quot;:false}\" data-markers=\"[{&quot;id&quot;:8578,&quot;latLang&quot;:{&quot;lat&quot;:45.5413571,&quot;lng&quot;:-73.608916},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:45531,&quot;latLang&quot;:{&quot;lat&quot;:45.474989400000005,&quot;lng&quot;:-72.6604088},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:45109,&quot;latLang&quot;:{&quot;lat&quot;:45.5531096,&quot;lng&quot;:-73.5978369},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:45083,&quot;latLang&quot;:{&quot;lat&quot;:46.8752853,&quot;lng&quot;:-71.2102217},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:44838,&quot;latLang&quot;:{&quot;lat&quot;:45.5202878,&quot;lng&quot;:-73.557703},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:44832,&quot;latLang&quot;:{&quot;lat&quot;:45.495196,&quot;lng&quot;:-73.48294659999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:44820,&quot;latLang&quot;:{&quot;lat&quot;:45.746968200000005,&quot;lng&quot;:-73.4374523},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:42787,&quot;latLang&quot;:{&quot;lat&quot;:45.261415099999994,&quot;lng&quot;:-73.6159005},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:42756,&quot;latLang&quot;:{&quot;lat&quot;:47.8312293,&quot;lng&quot;:-69.5362413},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:38754,&quot;latLang&quot;:{&quot;lat&quot;:46.048508500000004,&quot;lng&quot;:-73.4627045},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32999,&quot;latLang&quot;:{&quot;lat&quot;:45.5020916,&quot;lng&quot;:-73.5673453},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32993,&quot;latLang&quot;:{&quot;lat&quot;:47.656444900000004,&quot;lng&quot;:-69.70860019999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32986,&quot;latLang&quot;:{&quot;lat&quot;:45.6307781,&quot;lng&quot;:-72.9563713},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32983,&quot;latLang&quot;:{&quot;lat&quot;:46.0845695,&quot;lng&quot;:-73.17911819999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;a1_4\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32979,&quot;latLang&quot;:{&quot;lat&quot;:45.7024286,&quot;lng&quot;:-74.08186889999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32975,&quot;latLang&quot;:{&quot;lat&quot;:46.8444791,&quot;lng&quot;:-71.6152026},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32874,&quot;latLang&quot;:{&quot;lat&quot;:45.595326,&quot;lng&quot;:-72.42056070000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32825,&quot;latLang&quot;:{&quot;lat&quot;:45.651729,&quot;lng&quot;:-74.088334},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32810,&quot;latLang&quot;:{&quot;lat&quot;:46.8810088,&quot;lng&quot;:-71.3296957},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32805,&quot;latLang&quot;:{&quot;lat&quot;:45.3809809,&quot;lng&quot;:-73.5786072},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32647,&quot;latLang&quot;:{&quot;lat&quot;:45.6067408,&quot;lng&quot;:-73.7096938},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32639,&quot;latLang&quot;:{&quot;lat&quot;:48.468661499999996,&quot;lng&quot;:-71.6554928},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32637,&quot;latLang&quot;:{&quot;lat&quot;:46.5932366,&quot;lng&quot;:-71.513804},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32635,&quot;latLang&quot;:{&quot;lat&quot;:46.869261699999996,&quot;lng&quot;:-71.3287897},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32424,&quot;latLang&quot;:{&quot;lat&quot;:46.058133500000004,&quot;lng&quot;:-73.6902381},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32419,&quot;latLang&quot;:{&quot;lat&quot;:46.013103599999994,&quot;lng&quot;:-73.78250799999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32353,&quot;latLang&quot;:{&quot;lat&quot;:45.2946297,&quot;lng&quot;:-72.9853509},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32310,&quot;latLang&quot;:{&quot;lat&quot;:45.5019435,&quot;lng&quot;:-73.68996200000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:32303,&quot;latLang&quot;:{&quot;lat&quot;:45.5135959,&quot;lng&quot;:-73.4330087},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31982,&quot;latLang&quot;:{&quot;lat&quot;:45.504139800000004,&quot;lng&quot;:-73.566604},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31978,&quot;latLang&quot;:{&quot;lat&quot;:45.7756872,&quot;lng&quot;:-74.00468020000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31540,&quot;latLang&quot;:{&quot;lat&quot;:47.445480700000005,&quot;lng&quot;:-79.269603},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31533,&quot;latLang&quot;:{&quot;lat&quot;:45.777610100000004,&quot;lng&quot;:-73.6323873},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31531,&quot;latLang&quot;:{&quot;lat&quot;:46.797210899999996,&quot;lng&quot;:-71.250852},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31529,&quot;latLang&quot;:{&quot;lat&quot;:45.896506099999996,&quot;lng&quot;:-74.15967859999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31527,&quot;latLang&quot;:{&quot;lat&quot;:45.5399288,&quot;lng&quot;:-73.5084147},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31525,&quot;latLang&quot;:{&quot;lat&quot;:45.8068567,&quot;lng&quot;:-74.0129532},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31523,&quot;latLang&quot;:{&quot;lat&quot;:45.347016499999995,&quot;lng&quot;:-73.80519290000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31521,&quot;latLang&quot;:{&quot;lat&quot;:49.22094370000001,&quot;lng&quot;:-68.1502876},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31519,&quot;latLang&quot;:{&quot;lat&quot;:46.830699900000006,&quot;lng&quot;:-71.28278},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31517,&quot;latLang&quot;:{&quot;lat&quot;:45.829681900000004,&quot;lng&quot;:-73.7598254},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31515,&quot;latLang&quot;:{&quot;lat&quot;:46.049585300000004,&quot;lng&quot;:-74.2845743},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31513,&quot;latLang&quot;:{&quot;lat&quot;:45.8634362,&quot;lng&quot;:-74.0071543},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31511,&quot;latLang&quot;:{&quot;lat&quot;:48.392685300000004,&quot;lng&quot;:-71.0522422},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31509,&quot;latLang&quot;:{&quot;lat&quot;:48.556030799999995,&quot;lng&quot;:-71.64906140000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31507,&quot;latLang&quot;:{&quot;lat&quot;:45.8917515,&quot;lng&quot;:-74.16135569999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31505,&quot;latLang&quot;:{&quot;lat&quot;:45.539296699999994,&quot;lng&quot;:-73.50845690000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31503,&quot;latLang&quot;:{&quot;lat&quot;:45.43801,&quot;lng&quot;:-73.60442},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31501,&quot;latLang&quot;:{&quot;lat&quot;:46.7791881,&quot;lng&quot;:-71.30262710000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31499,&quot;latLang&quot;:{&quot;lat&quot;:46.7810931,&quot;lng&quot;:-71.3010293},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31497,&quot;latLang&quot;:{&quot;lat&quot;:46.881135300000004,&quot;lng&quot;:-71.2021706},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31495,&quot;latLang&quot;:{&quot;lat&quot;:48.5061594,&quot;lng&quot;:-68.46697080000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31493,&quot;latLang&quot;:{&quot;lat&quot;:45.519699700000004,&quot;lng&quot;:-73.6788278},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31491,&quot;latLang&quot;:{&quot;lat&quot;:46.866109,&quot;lng&quot;:-71.1774428},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31342,&quot;latLang&quot;:{&quot;lat&quot;:48.3426611,&quot;lng&quot;:-70.88073270000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31340,&quot;latLang&quot;:{&quot;lat&quot;:46.882923399999996,&quot;lng&quot;:-71.2040911},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31338,&quot;latLang&quot;:{&quot;lat&quot;:46.794109299999995,&quot;lng&quot;:-71.25510179999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31336,&quot;latLang&quot;:{&quot;lat&quot;:46.0418671,&quot;lng&quot;:-73.7066553},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31334,&quot;latLang&quot;:{&quot;lat&quot;:46.9799606,&quot;lng&quot;:-70.5621247},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31332,&quot;latLang&quot;:{&quot;lat&quot;:45.744659,&quot;lng&quot;:-73.6219204},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31330,&quot;latLang&quot;:{&quot;lat&quot;:45.576251899999995,&quot;lng&quot;:-73.5841349},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31328,&quot;latLang&quot;:{&quot;lat&quot;:45.532871,&quot;lng&quot;:-73.4914942},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31326,&quot;latLang&quot;:{&quot;lat&quot;:46.0912741,&quot;lng&quot;:-71.3008377},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31324,&quot;latLang&quot;:{&quot;lat&quot;:46.095369700000006,&quot;lng&quot;:-70.6411269},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31322,&quot;latLang&quot;:{&quot;lat&quot;:48.434425600000004,&quot;lng&quot;:-71.1049273},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31318,&quot;latLang&quot;:{&quot;lat&quot;:47.3598529,&quot;lng&quot;:-70.0291613},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31316,&quot;latLang&quot;:{&quot;lat&quot;:46.8800563,&quot;lng&quot;:-71.2857165},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31314,&quot;latLang&quot;:{&quot;lat&quot;:46.8545611,&quot;lng&quot;:-71.3589176},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31312,&quot;latLang&quot;:{&quot;lat&quot;:48.1213909,&quot;lng&quot;:-69.1652438},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31310,&quot;latLang&quot;:{&quot;lat&quot;:48.4652211,&quot;lng&quot;:-67.42608820000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31308,&quot;latLang&quot;:{&quot;lat&quot;:48.4693153,&quot;lng&quot;:-68.5080639},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31306,&quot;latLang&quot;:{&quot;lat&quot;:48.44473,&quot;lng&quot;:-68.5180438},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31282,&quot;latLang&quot;:{&quot;lat&quot;:48.4620297,&quot;lng&quot;:-68.507527},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31280,&quot;latLang&quot;:{&quot;lat&quot;:48.0983619,&quot;lng&quot;:-66.09756499999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31278,&quot;latLang&quot;:{&quot;lat&quot;:46.8246065,&quot;lng&quot;:-71.2705736},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31276,&quot;latLang&quot;:{&quot;lat&quot;:46.9388158,&quot;lng&quot;:-71.1951619},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31274,&quot;latLang&quot;:{&quot;lat&quot;:46.9117849,&quot;lng&quot;:-71.19828410000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31272,&quot;latLang&quot;:{&quot;lat&quot;:46.7539693,&quot;lng&quot;:-71.3071032},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31270,&quot;latLang&quot;:{&quot;lat&quot;:46.8346345,&quot;lng&quot;:-71.2171896},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31185,&quot;latLang&quot;:{&quot;lat&quot;:47.5456065,&quot;lng&quot;:-68.6486602},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31183,&quot;latLang&quot;:{&quot;lat&quot;:47.8226977,&quot;lng&quot;:-69.5292397},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31180,&quot;latLang&quot;:{&quot;lat&quot;:47.788457,&quot;lng&quot;:-69.476501},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:31178,&quot;latLang&quot;:{&quot;lat&quot;:47.551583900000004,&quot;lng&quot;:-68.6340049},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:30228,&quot;latLang&quot;:{&quot;lat&quot;:46.758154,&quot;lng&quot;:-71.2395529},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:30226,&quot;latLang&quot;:{&quot;lat&quot;:45.590509999999995,&quot;lng&quot;:-73.64631},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:30224,&quot;latLang&quot;:{&quot;lat&quot;:45.692825,&quot;lng&quot;:-73.633129},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:30222,&quot;latLang&quot;:{&quot;lat&quot;:45.5354729,&quot;lng&quot;:-73.5530164},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:28197,&quot;latLang&quot;:{&quot;lat&quot;:46.8334168,&quot;lng&quot;:-71.2392675},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:28188,&quot;latLang&quot;:{&quot;lat&quot;:45.5725226,&quot;lng&quot;:-73.6021643},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:27200,&quot;latLang&quot;:{&quot;lat&quot;:46.8409611,&quot;lng&quot;:-71.2208892},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:27156,&quot;latLang&quot;:{&quot;lat&quot;:46.7094459,&quot;lng&quot;:-71.346344},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26897,&quot;latLang&quot;:{&quot;lat&quot;:45.626160600000006,&quot;lng&quot;:-72.9469427},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26620,&quot;latLang&quot;:{&quot;lat&quot;:47.6126836,&quot;lng&quot;:-68.7939494},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26615,&quot;latLang&quot;:{&quot;lat&quot;:47.881288000000005,&quot;lng&quot;:-68.7234199},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26613,&quot;latLang&quot;:{&quot;lat&quot;:47.6688655,&quot;lng&quot;:-68.9014414},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26611,&quot;latLang&quot;:{&quot;lat&quot;:47.6760593,&quot;lng&quot;:-68.8731396},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26609,&quot;latLang&quot;:{&quot;lat&quot;:47.6796504,&quot;lng&quot;:-68.8766094},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26607,&quot;latLang&quot;:{&quot;lat&quot;:47.6362224,&quot;lng&quot;:-68.8355057},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26598,&quot;latLang&quot;:{&quot;lat&quot;:47.613411299999996,&quot;lng&quot;:-68.8002286},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26595,&quot;latLang&quot;:{&quot;lat&quot;:47.6723917,&quot;lng&quot;:-68.8691386},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26593,&quot;latLang&quot;:{&quot;lat&quot;:47.548224,&quot;lng&quot;:-68.6483181},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26591,&quot;latLang&quot;:{&quot;lat&quot;:47.683763299999995,&quot;lng&quot;:-68.88305390000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26587,&quot;latLang&quot;:{&quot;lat&quot;:47.404201199999996,&quot;lng&quot;:-61.901719899999996},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26585,&quot;latLang&quot;:{&quot;lat&quot;:46.8547858,&quot;lng&quot;:-71.2039806},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26580,&quot;latLang&quot;:{&quot;lat&quot;:45.779493900000006,&quot;lng&quot;:-73.6336643},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26424,&quot;latLang&quot;:{&quot;lat&quot;:45.440811000000004,&quot;lng&quot;:-73.301725},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26422,&quot;latLang&quot;:{&quot;lat&quot;:45.4033089,&quot;lng&quot;:-72.7340062},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26415,&quot;latLang&quot;:{&quot;lat&quot;:45.4513583,&quot;lng&quot;:-73.46188760000001},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26413,&quot;latLang&quot;:{&quot;lat&quot;:46.808499999999995,&quot;lng&quot;:-71.2785},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26110,&quot;latLang&quot;:{&quot;lat&quot;:48.5294565,&quot;lng&quot;:-71.6511411},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26106,&quot;latLang&quot;:{&quot;lat&quot;:45.573427099999996,&quot;lng&quot;:-73.217578},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26098,&quot;latLang&quot;:{&quot;lat&quot;:45.776050999999995,&quot;lng&quot;:-73.6343477},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26094,&quot;latLang&quot;:{&quot;lat&quot;:45.8814552,&quot;lng&quot;:-72.4848438},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26090,&quot;latLang&quot;:{&quot;lat&quot;:46.0924491,&quot;lng&quot;:-76.0530082},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26082,&quot;latLang&quot;:{&quot;lat&quot;:46.0429644,&quot;lng&quot;:-73.1121593},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26038,&quot;latLang&quot;:{&quot;lat&quot;:45.652129900000006,&quot;lng&quot;:-74.0925147},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26034,&quot;latLang&quot;:{&quot;lat&quot;:46.8131051,&quot;lng&quot;:-71.205152},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26030,&quot;latLang&quot;:{&quot;lat&quot;:45.3601489,&quot;lng&quot;:-73.7493432},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26026,&quot;latLang&quot;:{&quot;lat&quot;:45.851926999999996,&quot;lng&quot;:-73.7592697},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26020,&quot;latLang&quot;:{&quot;lat&quot;:45.501952,&quot;lng&quot;:-73.5699811},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:26017,&quot;latLang&quot;:{&quot;lat&quot;:45.853917700000004,&quot;lng&quot;:-73.4852498},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:22088,&quot;latLang&quot;:{&quot;lat&quot;:36.713618000000004,&quot;lng&quot;:4.0473475},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:20669,&quot;latLang&quot;:{&quot;lat&quot;:47.666671400000006,&quot;lng&quot;:-68.9788215},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;a1_4\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:13237,&quot;latLang&quot;:{&quot;lat&quot;:47.8196126,&quot;lng&quot;:-69.5335367},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:13233,&quot;latLang&quot;:{&quot;lat&quot;:47.0023153,&quot;lng&quot;:-71.1940922},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:13186,&quot;latLang&quot;:{&quot;lat&quot;:45.5911603,&quot;lng&quot;:-73.8146382},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:13145,&quot;latLang&quot;:{&quot;lat&quot;:46.8927475,&quot;lng&quot;:-71.1870988},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:13038,&quot;latLang&quot;:{&quot;lat&quot;:45.6636061,&quot;lng&quot;:-73.87735769999999},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12508,&quot;latLang&quot;:{&quot;lat&quot;:45.558462899999995,&quot;lng&quot;:-73.8957748},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12491,&quot;latLang&quot;:{&quot;lat&quot;:48.8632206,&quot;lng&quot;:2.3589571},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12486,&quot;latLang&quot;:{&quot;lat&quot;:48.0174817,&quot;lng&quot;:-69.3358154},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12449,&quot;latLang&quot;:{&quot;lat&quot;:47.3962614,&quot;lng&quot;:-68.8732531},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12445,&quot;latLang&quot;:{&quot;lat&quot;:45.638219,&quot;lng&quot;:-74.0371117},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12427,&quot;latLang&quot;:{&quot;lat&quot;:46.3199357,&quot;lng&quot;:-72.8122703},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12423,&quot;latLang&quot;:{&quot;lat&quot;:45.5496658,&quot;lng&quot;:-73.2155935},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12421,&quot;latLang&quot;:{&quot;lat&quot;:47.7665461,&quot;lng&quot;:-69.1933631},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12415,&quot;latLang&quot;:{&quot;lat&quot;:46.1870665,&quot;lng&quot;:-71.0372983},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12170,&quot;latLang&quot;:{&quot;lat&quot;:47.4412334,&quot;lng&quot;:-70.5051518},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12166,&quot;latLang&quot;:{&quot;lat&quot;:45.1107861,&quot;lng&quot;:-73.7638233},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12102,&quot;latLang&quot;:{&quot;lat&quot;:45.1076926,&quot;lng&quot;:-72.9724752},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:12100,&quot;latLang&quot;:{&quot;lat&quot;:45.2170645,&quot;lng&quot;:-73.2380749},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:11673,&quot;latLang&quot;:{&quot;lat&quot;:45.165904700000006,&quot;lng&quot;:-73.4043223},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:11671,&quot;latLang&quot;:{&quot;lat&quot;:45.606657500000004,&quot;lng&quot;:-73.7123796},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:11625,&quot;latLang&quot;:{&quot;lat&quot;:48.2343991,&quot;lng&quot;:-79.0190518},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:11618,&quot;latLang&quot;:{&quot;lat&quot;:46.8130683,&quot;lng&quot;:-71.2075723},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:11616,&quot;latLang&quot;:{&quot;lat&quot;:45.4672425,&quot;lng&quot;:-75.7349288},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1},{&quot;id&quot;:11264,&quot;latLang&quot;:{&quot;lat&quot;:45.9519514,&quot;lng&quot;:-74.1355755},&quot;label&quot;:&quot;&lt;span class=\\&quot;pdp-dot\\&quot; data-bucket=\\&quot;\\&quot;&gt;&lt;\\\/span&gt;\\n\\n\\n&quot;,&quot;custom_marker&quot;:false,&quot;geo_query_distance&quot;:-1}]\" data-general=\"{&quot;api&quot;:&quot;https:\\\/\\\/prodispo.ca\\\/en\\\/wp-json\\\/jet-engine\\\/v2\\\/get-map-marker-info\\\/&quot;,&quot;restNonce&quot;:&quot;804530e5fc&quot;,&quot;listingID&quot;:2689,&quot;source&quot;:&quot;posts&quot;,&quot;width&quot;:295,&quot;offset&quot;:28,&quot;clustererImg&quot;:&quot;https:\\\/\\\/prodispo.ca\\\/wp-content\\\/plugins\\\/jet-engine\\\/includes\\\/modules\\\/maps-listings\\\/assets\\\/lib\\\/markerclustererplus\\\/img\\\/m&quot;,&quot;marker&quot;:{&quot;type&quot;:&quot;text&quot;,&quot;html&quot;:&quot;&lt;div class=\\&quot; jet-map-marker-wrap\\&quot; style=\\&quot;cursor: pointer;\\&quot;&gt;_marker_label_&lt;\\\/div&gt;&quot;},&quot;autoCenter&quot;:true,&quot;maxZoom&quot;:10,&quot;minZoom&quot;:2,&quot;customCenter&quot;:false,&quot;customZoom&quot;:11,&quot;popupPreloader&quot;:false,&quot;querySeparator&quot;:&quot;?&quot;,&quot;markerClustering&quot;:true,&quot;customClusterImg&quot;:[],&quot;clusterMaxZoom&quot;:20,&quot;clusterRadius&quot;:50,&quot;popupOpenOn&quot;:&quot;click&quot;,&quot;centeringOnOpen&quot;:true,&quot;zoomOnOpen&quot;:8,&quot;advanced&quot;:{&quot;zoom_control&quot;:&quot;auto&quot;},&quot;user_location_enabled&quot;:true,&quot;user_location_marker&quot;:{&quot;type&quot;:&quot;icon&quot;,&quot;html&quot;:&quot;&lt;div class=\\&quot;jet-map-user-location-marker user-location  custom-color apply-fill is-svg-icon\\&quot; style=\\&quot;color:#EA2909 !important;\\&quot;&gt;&lt;svg style=\\&quot;color:#EA2909 !important;\\&quot; class=\\&quot;e-font-icon-svg e-fas-map-marker-alt\\&quot; aria-hidden=\\&quot;true\\&quot; viewBox=\\&quot;0 0 384 512\\&quot; xmlns=\\&quot;http:\\\/\\\/www.w3.org\\\/2000\\\/svg\\&quot;&gt;&lt;path d=\\&quot;M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z\\&quot;&gt;&lt;\\\/path&gt;&lt;\\\/svg&gt;&lt;\\\/div&gt;&quot;},&quot;user_location_label&quot;:&quot;&quot;,&quot;queryID&quot;:14,&quot;querySignature&quot;:&quot;b4bb30d3e5463f0d68ab73e06eceafe0208475fefd6f727596bcb15b1f54e512&quot;}\" data-listing-source=\"query\" data-query-id=\"14\" data-queried-id=\"46084|WP_Post\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-88ae505 elementor-widget elementor-widget-html\" data-id=\"88ae505\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- ProDispo \u2014 Spinner sur le marqueur cliqu\u00e9 --><div id=\"pd-marker-loader\" aria-hidden=\"true\"><div class=\"pd-marker-spinner\"><\/div><\/div><style>#pd-marker-loader{\r\n  position:fixed !important;\r\n  z-index:2147483647 !important;\r\n  width:48px;\r\n  height:48px;\r\n  margin-left:-24px;\r\n  margin-top:-58px;\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n  pointer-events:none !important;\r\n}\r\n\r\n#pd-marker-loader.pd-show{\r\n  display:flex !important;\r\n}\r\n\r\n#pd-marker-loader .pd-marker-spinner{\r\n  width:40px;\r\n  height:40px;\r\n  border:4px solid rgba(255,255,255,.95);\r\n  border-top-color:#003C99;\r\n  border-right-color:#003C99;\r\n  border-radius:50%;\r\n  background:rgba(255,255,255,.85);\r\n  box-shadow:0 6px 20px rgba(10,26,68,.28);\r\n  animation:pd-marker-spin 1.2s linear infinite;\r\n}\r\n\r\n@keyframes pd-marker-spin{\r\n  to{\r\n    transform:rotate(360deg);\r\n  }\r\n}\r\n<\/style><script>(function(){\r\n  const loader = document.getElementById('pd-marker-loader');\r\n  if(!loader) return;\r\n\r\n  let timer;\r\n\r\n  function showAt(x, y){\r\n    loader.style.left = x + 'px';\r\n    loader.style.top = y + 'px';\r\n    loader.classList.add('pd-show');\r\n    loader.setAttribute('aria-hidden','false');\r\n\r\n    clearTimeout(timer);\r\n    timer = setTimeout(hideLoader, 4250);\r\n  }\r\n\r\n  function hideLoader(){\r\n    loader.classList.remove('pd-show');\r\n    loader.setAttribute('aria-hidden','true');\r\n    clearTimeout(timer);\r\n  }\r\n\r\n  document.addEventListener('click', function(e){\r\n    const target = e.target;\r\n\r\n    if(target.closest('.gm-style-iw, .gm-style-iw-c, .gm-style-iw-d')){\r\n      return;\r\n    }\r\n\r\n    if(!target.closest('.gm-style')){\r\n      return;\r\n    }\r\n\r\n    showAt(e.clientX, e.clientY);\r\n  }, true);\r\n\r\n  window.addEventListener('pageshow', hideLoader);\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-046a16c elementor-widget-mobile__width-initial pdp-legend-item elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"046a16c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<style>\r\n.pdp-map-legend{\r\n  display:flex;\r\n  flex-direction:column;\r\n  align-items:flex-start;\r\n  gap:10px;\r\n  padding:2px 18px;\r\n  margin:0px auto 10px;\r\n  background:#ffffff;\r\n  border:1px solid #e5e7eb;\r\n  border-radius:12px;\r\n  box-shadow:0 4px 10px rgba(0,0,0,.05);\r\n  font-size:14px;\r\n  max-width:100%;\r\n}\r\n\r\n.pdp-legend-info{\r\n  display:flex;\r\n  align-items:center;\r\n  font-size:14px;\r\n  color:#64748b;\r\n  font-weight:600;\r\n  white-space:nowrap;\r\n}\r\n\r\n.pdp-legend-row{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  align-items:center;\r\n  gap:10px 16px;\r\n  justify-content:flex-start;\r\n  width:100%;\r\n}\r\n\r\n.pdp-legend-item{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:4px;\r\n  white-space:nowrap;\r\n  color:#0f172a;\r\n}\r\n\r\n.pdp-legend-dot{\r\n  width:14px;\r\n  height:14px;\r\n  border-radius:999px;\r\n  border:2px solid #38BDF8;\r\n  box-sizing:border-box;\r\n  background:#fff;\r\n  flex:0 0 14px;\r\n}\r\n\r\n\/* Colors *\/\r\n.pdp-legend-dot.gray{ background:#8E97A6; }\r\n.pdp-legend-dot.green{ background:#22C55E; }\r\n.pdp-legend-dot.blue{ background:#38BDF8; }\r\n\r\n.pdp-map-legend{\r\n  flex-direction:row;\r\n  align-items:center;\r\n  justify-content:flex-start;\r\n}\r\n\r\n.pdp-legend-info{\r\n  margin-right:12px;\r\n  white-space:nowrap;\r\n}\r\n\r\n.pdp-legend-row{\r\n  flex-wrap:nowrap;\r\n  gap:40px;\r\n}\r\n\r\n\/* ================= MOBILE ================= *\/\r\n@media (max-width:767px){\r\n\r\n  .pdp-map-legend{\r\n    flex-direction:column;\r\n    align-items:flex-start;\r\n    padding:4px 0.25px;\r\n    gap:0.25px;\r\n  }\r\n\r\n  .pdp-legend-info{\r\n    width:100%;\r\n    font-size:10px;\r\n    margin-bottom:2px;\r\n  }\r\n\r\n  .pdp-legend-row{\r\n    flex-wrap:nowrap;\r\n    overflow-x:auto;\r\n    gap:0.25px;\r\n    width:100%;\r\n    padding-bottom:1px;\r\n    -webkit-overflow-scrolling:touch;\r\n    scrollbar-width:none;\r\n  }\r\n\r\n  .pdp-legend-row::-webkit-scrollbar{\r\n    display:none;\r\n  }\r\n\r\n  .pdp-legend-item{\r\n    flex:0 0 auto;\r\n    gap:0.5px;\r\n    font-size:9.5px;\r\n    padding:4px 4px;\r\n    border-radius:6px;\r\n  }\r\n\r\n  .pdp-legend-dot{\r\n    width:10px;\r\n    height:10px;\r\n    border-width:1.5px;\r\n    flex:0 0 10px;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<div class=\"pdp-map-legend\" aria-label=\"Map legend\">\r\n\r\n  <div class=\"pdp-legend-info\">\r\n    Customer reviews on ProDispo\r\n  <\/div>\r\n\r\n  <div class=\"pdp-legend-row\">\r\n\r\n    <div class=\"pdp-legend-item\">\r\n      <span class=\"pdp-legend-dot\"><\/span>\r\n      <span>No reviews<\/span>\r\n    <\/div>\r\n\r\n    <div class=\"pdp-legend-item\">\r\n      <span class=\"pdp-legend-dot gray\"><\/span>\r\n      <span>1\u20134 reviews \u2b50<\/span>\r\n    <\/div>\r\n\r\n    <div class=\"pdp-legend-item\">\r\n      <span class=\"pdp-legend-dot green\"><\/span>\r\n      <span>5\u20139 reviews \u2b50<\/span>\r\n    <\/div>\r\n\r\n    <div class=\"pdp-legend-item\">\r\n      <span class=\"pdp-legend-dot blue\"><\/span>\r\n      <span>10+ reviews \u2b50<\/span>\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n<\/div>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c488cb elementor-widget elementor-widget-html\" data-id=\"4c488cb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\r\n\/* Base *\/\r\n.pdp-dot{\r\n  width:18px;\r\n  height:18px;\r\n  border-radius:999px;\r\n  display:inline-block;\r\n  position:relative;\r\n\r\n  \/* 0 avis (fallback) *\/\r\n  background:#ffffff;\r\n\r\n\r\n\r\n  \/* petite ombre pour d\u00e9tacher du fond *\/\r\n  box-shadow:0 6px 14px rgba(0,0,0,.18);\r\n}\r\n\r\n\/* petit \"shine\" pour effet premium *\/\r\n.pdp-dot:before{\r\n  content:\"\";\r\n  position:absolute;\r\n  top:2px; left:2px;\r\n  width:45%;\r\n  height:45%;\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.7);\r\n  filter:blur(.2px);\r\n}\r\n\r\n\/* halo au survol (desktop) *\/\r\n.jet-map-marker:hover .pdp-dot{\r\n  box-shadow:0 0 0 6px rgba(11,58,122,.18), 0 6px 14px rgba(0,0,0,.18);\r\n}\r\n\r\n\/* Mobile: plus gros + contour plus visible *\/\r\n@media (max-width: 767px){\r\n  .pdp-dot{\r\n    width:22px;\r\n    height:22px;\r\n    border-width:3px;\r\n    box-shadow:0 7px 16px rgba(0,0,0,.22);\r\n  }\r\n}\r\n<\/style>\r\n\r\n\r\n<script>\r\n(function(){\r\nconst COLORS = {\r\n  'a1_4': '#8E97A6',\r\n  'a5_9': '#22C55E',\r\n  'a10p': '#38BDF8' \/\/ \u2705 bleu ciel distinct\r\n};\r\n\r\n\r\n  function apply(){\r\n    document.querySelectorAll('.pdp-dot[data-bucket]').forEach(dot => {\r\n      const bucket = (dot.getAttribute('data-bucket') || '').trim();\r\n      if (!bucket || !COLORS[bucket]) return; \/\/ 0 avis => ne rien faire\r\n      dot.style.backgroundColor = COLORS[bucket];\r\n    });\r\n  }\r\n\r\n  \/\/ Chargement + refreshs (Google Maps charge parfois en retard)\r\n  document.addEventListener('DOMContentLoaded', () => setTimeout(apply, 600));\r\n  document.addEventListener('jet-engine\/maps\/markers-inited', () => setTimeout(apply, 200));\r\n  document.addEventListener('jet-smart-filters\/content-rendered', () => setTimeout(apply, 200));\r\n  document.addEventListener('jet-engine\/listing\/ajax\/after', () => setTimeout(apply, 200));\r\n\r\n  let tries = 0;\r\n  const t = setInterval(() => {\r\n    apply();\r\n    if (++tries >= 12) clearInterval(t);\r\n  }, 500);\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4962bb7 elementor-widget elementor-widget-html\" data-id=\"4962bb7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<!-- PRODISPO \u2014 FALLBACK MAP: 0 RESULTS -->\r\n<div id=\"pd-empty-map-fallback\" hidden>\r\n  <div class=\"pd-empty-map-message\" role=\"status\">\r\n    No professionals found within this radius.\r\n    Try increasing the distance or adjusting your search criteria.\r\n  <\/div>\r\n\r\n  <div\r\n    id=\"pd-empty-map-canvas\"\r\n    role=\"img\"\r\n    aria-label=\"Map showing the searched area with no matching professionals\"\r\n  ><\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* Main fallback container *\/\r\n#pd-empty-map-fallback {\r\n  display: none;\r\n  width: 100%;\r\n  max-width: 1560px;\r\n  margin: 0 auto 18px;\r\n  box-sizing: border-box;\r\n}\r\n\r\n#pd-empty-map-fallback.pd-visible {\r\n  display: block;\r\n}\r\n\r\n\/* Informational message *\/\r\n#pd-empty-map-fallback .pd-empty-map-message {\r\n  width: 100%;\r\n  box-sizing: border-box;\r\n  padding: 16px 20px;\r\n  margin: 0 0 16px;\r\n  border: 1px solid #D9E5FF;\r\n  border-radius: 12px;\r\n  background: #F4F7FF;\r\n  color: #1245A4;\r\n  font-size: 16px;\r\n  font-weight: 600;\r\n  line-height: 1.5;\r\n  text-align: center;\r\n}\r\n\r\n\/* Non-interactive fallback map *\/\r\n#pd-empty-map-canvas {\r\n  width: 100%;\r\n  height: 370px;\r\n  border-radius: 12px;\r\n  overflow: hidden;\r\n  background: #F1F3F4;\r\n  pointer-events: none;\r\n}\r\n\r\n\/* Hide the regular map listing only when there are zero results *\/\r\nbody.pd-zero-results\r\n.pd-map.pdp-map-legend\r\n.jet-map-listing {\r\n  display: none !important;\r\n}\r\n\r\n\/* Prevent duplicate empty-result messages *\/\r\nbody.pd-zero-results #pd-no-results {\r\n  display: none !important;\r\n}\r\n\r\n\/* Remove Elementor widget width limitations *\/\r\n.pd-map.pdp-map-legend\r\n.elementor-widget-html:has(#pd-empty-map-fallback) {\r\n  width: 100% !important;\r\n  max-width: none !important;\r\n}\r\n\r\n\/* Desktop: align fallback map with the main results layout *\/\r\n@media (min-width: 768px) {\r\n  #pd-empty-map-fallback {\r\n    width: calc(100vw - 148px) !important;\r\n    max-width: 1560px !important;\r\n    position: relative !important;\r\n    left: 50% !important;\r\n    transform: translateX(calc(-50% + 30px)) !important;\r\n    margin-left: 0 !important;\r\n    margin-right: 0 !important;\r\n  }\r\n}\r\n\r\n\/* Mobile *\/\r\n@media (max-width: 767px) {\r\n  #pd-empty-map-fallback {\r\n    width: calc(100vw - 24px) !important;\r\n    max-width: none !important;\r\n    position: relative !important;\r\n    left: 50% !important;\r\n    transform: translateX(-50%) !important;\r\n    margin-left: 0 !important;\r\n    margin-right: 0 !important;\r\n  }\r\n\r\n  #pd-empty-map-canvas {\r\n    width: 100% !important;\r\n    height: 250px !important;\r\n    border-radius: 12px !important;\r\n  }\r\n\r\n  #pd-empty-map-fallback .pd-empty-map-message {\r\n    padding: 12px !important;\r\n    margin-bottom: 12px !important;\r\n    font-size: 13px !important;\r\n    line-height: 1.45 !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  const FALLBACK_ID = \"pd-empty-map-fallback\";\r\n  const MAP_ID = \"pd-empty-map-canvas\";\r\n  const COUNT_SELECTOR = \".pd-results-count\";\r\n\r\n  let fallbackMap = null;\r\n  let lastCoordinates = \"\";\r\n  let lastCount = null;\r\n  let mapRetryTimer = null;\r\n\r\n  function getResultCount() {\r\n    const element = document.querySelector(COUNT_SELECTOR);\r\n    if (!element) return null;\r\n\r\n    const value = element.textContent\r\n      .trim()\r\n      .replace(\/\\s\/g, \"\")\r\n      .match(\/\\d+\/);\r\n\r\n    return value ? Number(value[0]) : null;\r\n  }\r\n\r\n  function getSearchLocation() {\r\n    const params = new URLSearchParams(\r\n      window.location.search\r\n    );\r\n\r\n    const lat = Number(params.get(\"origine_lat\"));\r\n    const lng = Number(params.get(\"origine_lng\"));\r\n\r\n    if (\r\n      params.has(\"origine_lat\") &&\r\n      params.has(\"origine_lng\") &&\r\n      Number.isFinite(lat) &&\r\n      Number.isFinite(lng) &&\r\n      Math.abs(lat) <= 90 &&\r\n      Math.abs(lng) <= 180\r\n    ) {\r\n      return { lat, lng };\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  function getMapZoom() {\r\n    const params = new URLSearchParams(\r\n      window.location.search\r\n    );\r\n\r\n    const radius = Number(params.get(\"rayon_km\"));\r\n\r\n    if (!Number.isFinite(radius) || radius <= 0) {\r\n      return 10;\r\n    }\r\n\r\n    if (radius <= 10) return 12;\r\n    if (radius <= 25) return 11;\r\n    if (radius <= 50) return 10;\r\n    if (radius <= 100) return 9;\r\n    if (radius <= 250) return 8;\r\n    if (radius <= 500) return 7;\r\n\r\n    return 6;\r\n  }\r\n\r\n  function createOrUpdateMap() {\r\n    const location = getSearchLocation();\r\n    const canvas = document.getElementById(MAP_ID);\r\n\r\n    if (!canvas || !location) return false;\r\n\r\n    if (\r\n      !window.google ||\r\n      !window.google.maps ||\r\n      typeof window.google.maps.Map !== \"function\"\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    const coordinates =\r\n      location.lat + \",\" + location.lng;\r\n\r\n    const zoom = getMapZoom();\r\n\r\n    if (!fallbackMap) {\r\n      fallbackMap = new google.maps.Map(canvas, {\r\n        center: location,\r\n        zoom: zoom,\r\n\r\n        \/* Fully non-interactive map *\/\r\n        zoomControl: false,\r\n        fullscreenControl: false,\r\n        streetViewControl: false,\r\n        mapTypeControl: false,\r\n        rotateControl: false,\r\n        scaleControl: false,\r\n\r\n        gestureHandling: \"none\",\r\n        draggable: false,\r\n        keyboardShortcuts: false,\r\n        disableDoubleClickZoom: true,\r\n        scrollwheel: false,\r\n\r\n        clickableIcons: false,\r\n        disableDefaultUI: true\r\n      });\r\n\r\n      lastCoordinates = coordinates;\r\n      return true;\r\n    }\r\n\r\n    if (coordinates !== lastCoordinates) {\r\n      fallbackMap.setCenter(location);\r\n      lastCoordinates = coordinates;\r\n    }\r\n\r\n    if (fallbackMap.getZoom() !== zoom) {\r\n      fallbackMap.setZoom(zoom);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  function stopMapRetry() {\r\n    if (mapRetryTimer !== null) {\r\n      clearInterval(mapRetryTimer);\r\n      mapRetryTimer = null;\r\n    }\r\n  }\r\n\r\n  function startMapRetry() {\r\n    if (createOrUpdateMap()) {\r\n      stopMapRetry();\r\n      return;\r\n    }\r\n\r\n    if (mapRetryTimer !== null) return;\r\n\r\n    let attempts = 0;\r\n\r\n    mapRetryTimer = setInterval(function () {\r\n      const fallback = document.getElementById(\r\n        FALLBACK_ID\r\n      );\r\n\r\n      if (\r\n        !fallback ||\r\n        !fallback.classList.contains(\"pd-visible\")\r\n      ) {\r\n        stopMapRetry();\r\n        return;\r\n      }\r\n\r\n      attempts++;\r\n\r\n      if (createOrUpdateMap() || attempts >= 60) {\r\n        stopMapRetry();\r\n      }\r\n    }, 500);\r\n  }\r\n\r\n  function updateFallback() {\r\n    const fallback = document.getElementById(\r\n      FALLBACK_ID\r\n    );\r\n\r\n    if (!fallback) return;\r\n\r\n    const count = getResultCount();\r\n\r\n    \/* Wait until the results counter is available *\/\r\n    if (count === null) return;\r\n\r\n    if (count !== lastCount) {\r\n      lastCount = count;\r\n    }\r\n\r\n    const hasLocation = Boolean(getSearchLocation());\r\n    const showFallback = count === 0 && hasLocation;\r\n\r\n    document.body.classList.toggle(\r\n      \"pd-zero-results\",\r\n      count === 0\r\n    );\r\n\r\n    fallback.classList.toggle(\r\n      \"pd-visible\",\r\n      showFallback\r\n    );\r\n\r\n    fallback.hidden = !showFallback;\r\n\r\n    if (showFallback) {\r\n      startMapRetry();\r\n    } else {\r\n      stopMapRetry();\r\n    }\r\n  }\r\n\r\n  function initialize() {\r\n    updateFallback();\r\n\r\n    \/* Allow time for JetEngine and Google Maps *\/\r\n    let attempts = 0;\r\n\r\n    const initialization = setInterval(function () {\r\n      updateFallback();\r\n      attempts++;\r\n\r\n      if (attempts >= 30) {\r\n        clearInterval(initialization);\r\n      }\r\n    }, 500);\r\n\r\n    \/* Watch the results counter for updates *\/\r\n    const countElement = document.querySelector(\r\n      COUNT_SELECTOR\r\n    );\r\n\r\n    if (countElement) {\r\n      const observer = new MutationObserver(\r\n        updateFallback\r\n      );\r\n\r\n      observer.observe(countElement, {\r\n        childList: true,\r\n        characterData: true,\r\n        subtree: true\r\n      });\r\n    }\r\n\r\n    \/* Refresh after AJAX filters *\/\r\n    document.addEventListener(\r\n      \"jet-smart-filters\/content-rendered\",\r\n      updateFallback\r\n    );\r\n\r\n    document.addEventListener(\r\n      \"jet-engine\/listing\/ajax\/after\",\r\n      updateFallback\r\n    );\r\n\r\n    \/* Refresh when navigating through browser history *\/\r\n    window.addEventListener(\r\n      \"popstate\",\r\n      updateFallback\r\n    );\r\n\r\n    window.addEventListener(\r\n      \"pageshow\",\r\n      updateFallback\r\n    );\r\n  }\r\n\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      initialize\r\n    );\r\n  } else {\r\n    initialize();\r\n  }\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-92913c5 elementor-widget elementor-widget-html\" data-id=\"92913c5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\r\n\/* ProDispo - Map help banner (EN) *\/\r\n\r\n#pdp-map-help {\r\n  position: absolute !important;\r\n  top: 60% !important;\r\n  left: 50% !important;\r\n  transform: translate(-50%, -50%) !important;\r\n  z-index: 100 !important;\r\n\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 8px;\r\n\r\n  width: max-content;\r\n  max-width: calc(100% - 120px);\r\n  box-sizing: border-box;\r\n\r\n  padding: 10px 16px;\r\n  border: 1px solid #dbe5f5;\r\n  border-radius: 12px;\r\n\r\n  background: rgba(255,255,255,.97);\r\n  box-shadow: 0 4px 14px rgba(0,0,0,.14);\r\n\r\n  color: #173a75;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  line-height: 1.4;\r\n  text-align: center;\r\n\r\n  pointer-events: none;\r\n  transition: opacity .2s ease;\r\n}\r\n\r\n#pdp-map-help.is-hidden {\r\n  opacity: 0;\r\n  visibility: hidden;\r\n}\r\n\r\n@media (max-width: 767px) {\r\n  #pdp-map-help {\r\n    top: 60% !important;\r\n    max-width: calc(100% - 90px);\r\n    padding: 8px 10px;\r\n    font-size: 12px;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<div id=\"pdp-map-help\" aria-live=\"polite\">\r\n  <span>\ud83d\udc46<\/span>\r\n  <span class=\"pdp-map-help-text\">\r\n    To view a profile, click a map marker.\r\n  <\/span>\r\n<\/div>\r\n\r\n<script>\r\n(function() {\r\n  const help = document.getElementById('pdp-map-help');\r\n  if (!help) return;\r\n\r\n  const text = help.querySelector('.pdp-map-help-text');\r\n\r\n  \/\/ Mobile wording\r\n  if (text && window.matchMedia('(max-width: 767px)').matches) {\r\n    text.textContent =\r\n      'To view a profile, tap a map marker.';\r\n  }\r\n\r\n  let initialized = false;\r\n\r\n  function init() {\r\n    if (initialized) return;\r\n\r\n    \/\/ Find the actual Google Maps container\r\n    const map = document.querySelector('.gm-style');\r\n\r\n    if (!map) return;\r\n\r\n    const container = map.parentElement;\r\n    if (!container) return;\r\n\r\n    initialized = true;\r\n\r\n    \/\/ Position banner inside the map container\r\n    if (getComputedStyle(container).position === 'static') {\r\n      container.style.position = 'relative';\r\n    }\r\n\r\n    container.appendChild(help);\r\n\r\n    function hide() {\r\n      help.classList.add('is-hidden');\r\n    }\r\n\r\n    \/\/ Hide on first click or touch\r\n    map.addEventListener('pointerdown', hide, {\r\n      once: true\r\n    });\r\n\r\n    map.addEventListener('touchstart', hide, {\r\n      once: true,\r\n      passive: true\r\n    });\r\n  }\r\n\r\n  \/\/ Google Maps may load after Elementor\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n\r\n  \/\/ Wait for Google Maps to appear\r\n  const observer = new MutationObserver(function() {\r\n    init();\r\n\r\n    if (initialized) {\r\n      observer.disconnect();\r\n    }\r\n  });\r\n\r\n  if (!initialized) {\r\n    observer.observe(document.body, {\r\n      childList: true,\r\n      subtree: true\r\n    });\r\n  }\r\n\r\n  \/\/ Additional check after full page load\r\n  window.addEventListener('load', init);\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-11ec22e e-flex e-con-boxed e-con e-parent\" data-id=\"11ec22e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-42f425c elementor-widget elementor-widget-html\" data-id=\"42f425c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<style>\r\n\/* Bouton anglais ProDispo *\/\r\n.pd-header-btn-en {\r\n  background-color: #0A1A44;\r\n  color: #ffffff !important;\r\n  height: 42px;\r\n  padding: 0 18px !important;\r\n  border-radius: 50px;\r\n  font-weight: 700;\r\n  font-size: 13px;\r\n  text-decoration: none !important;\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  line-height: 1 !important;\r\n  transition: all 0.3s ease;\r\n  white-space: nowrap;\r\n}\r\n\r\n.pd-header-btn-en:hover {\r\n  background-color: #00bb44;\r\n  transform: translateY(-1px);\r\n}\r\n\r\n\/* Cacher le bouton EN sur les pages FR *\/\r\nbody:not(.pd-page-en) .pd-header-btn-en {\r\n  display: none !important;\r\n}\r\n\r\n\/* Afficher le bouton EN sur les pages EN *\/\r\nbody.pd-page-en .pd-header-btn-en {\r\n  display: inline-flex !important;\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  const isEn = \/^\\\/en(?:\\\/|$)\/i.test(\r\n    window.location.pathname\r\n  );\r\n\r\n  document.documentElement.classList.toggle(\r\n    \"pd-page-en\",\r\n    isEn\r\n  );\r\n\r\n  function manageHeaderButtons() {\r\n    document.body.classList.toggle(\r\n      \"pd-page-en\",\r\n      isEn\r\n    );\r\n\r\n    \/\/ Tous les boutons, incluant le menu mobile Neve\r\n    const buttons = document.querySelectorAll(\r\n      \"a, button\"\r\n    );\r\n\r\n    buttons.forEach(function (btn) {\r\n      if (btn.classList.contains(\"pd-header-btn-en\")) {\r\n        btn.style.setProperty(\r\n          \"display\",\r\n          isEn ? \"inline-flex\" : \"none\",\r\n          \"important\"\r\n        );\r\n        return;\r\n      }\r\n\r\n      const text = (btn.textContent || \"\")\r\n        .replace(\/\\s+\/g, \" \")\r\n        .trim();\r\n\r\n      const isFrenchButton =\r\n        text === \"Afficher mes services\" ||\r\n        text === \"Ajouter mon profil\";\r\n\r\n      if (!isFrenchButton) return;\r\n\r\n      if (isEn) {\r\n        btn.style.setProperty(\r\n          \"display\",\r\n          \"none\",\r\n          \"important\"\r\n        );\r\n      } else {\r\n        btn.style.removeProperty(\"display\");\r\n      }\r\n    });\r\n  }\r\n\r\n  let scheduled = false;\r\n\r\n  function scheduleUpdate() {\r\n    if (scheduled) return;\r\n\r\n    scheduled = true;\r\n\r\n    requestAnimationFrame(function () {\r\n      scheduled = false;\r\n      manageHeaderButtons();\r\n    });\r\n  }\r\n\r\n  \/\/ Ex\u00e9cution initiale\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      manageHeaderButtons\r\n    );\r\n  } else {\r\n    manageHeaderButtons();\r\n  }\r\n\r\n  window.addEventListener(\r\n    \"load\",\r\n    manageHeaderButtons\r\n  );\r\n\r\n  \/\/ D\u00e9tecte les boutons ajout\u00e9s par Neve,\r\n  \/\/ notamment \u00e0 l'ouverture du menu mobile.\r\n  const observer = new MutationObserver(\r\n    scheduleUpdate\r\n  );\r\n\r\n  function startObserver() {\r\n    if (!document.body) return;\r\n\r\n    observer.observe(document.body, {\r\n      childList: true,\r\n      subtree: true,\r\n      characterData: true\r\n    });\r\n\r\n    manageHeaderButtons();\r\n  }\r\n\r\n  if (document.body) {\r\n    startObserver();\r\n  } else {\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      startObserver\r\n    );\r\n  }\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Searching\u2026 We are preparing your results and the ProDispo map. \u00d7 Analyzing&#8230; Edit Criteria E.g.: I need help preparing my meals. Is there a ProDispo? From &#8220;Who does this?&#8221; to &#8220;Who is available?&#8221; \u2014 One request, multiple candidates. Those who are available respond to you. Services for Individuals Find help for personal, family, and daily&hellip;&nbsp;<a href=\"https:\/\/prodispo.ca\/en\/results-search\/\" rel=\"bookmark\">Read More &raquo;<span class=\"screen-reader-text\">ProDispo &#8211; Search Results<\/span><\/a><\/p>\n","protected":false},"author":261370924,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/template-pagebuilder-full-width.php","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"footnotes":""},"class_list":["post-46084","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>ProDispo - Search Results - ProDispo \u2013 Your search engine for service businesses<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/prodispo.ca\/en\/results-search\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ProDispo - Search Results - ProDispo \u2013 Your search engine for service businesses\" \/>\n<meta property=\"og:description\" content=\"Searching\u2026 We are preparing your results and the ProDispo map. \u00d7 Analyzing&#8230; Edit Criteria E.g.: I need help preparing my meals. Is there a ProDispo? From &#8220;Who does this?&#8221; to &#8220;Who is available?&#8221; \u2014 One request, multiple candidates. Those who are available respond to you. Services for Individuals Find help for personal, family, and daily&hellip;&nbsp;Read More &raquo;ProDispo &#8211; Search Results\" \/>\n<meta property=\"og:url\" content=\"https:\/\/prodispo.ca\/en\/results-search\/\" \/>\n<meta property=\"og:site_name\" content=\"ProDispo \u2013 Your search engine for service businesses\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prodispo\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-16T16:03:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/prodispo.ca\/wp-content\/uploads\/2025\/05\/cropped-Logo-Bilingue.png\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/results-search\\\/\",\"url\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/results-search\\\/\",\"name\":\"ProDispo - Search Results - ProDispo \u2013 Your search engine for service businesses\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/#website\"},\"datePublished\":\"2026-10-12T15:57:16+00:00\",\"dateModified\":\"2026-10-16T16:03:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/results-search\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/prodispo.ca\\\/en\\\/results-search\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/results-search\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ProDispo - Search Results\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/\",\"name\":\"ProDispo \u2013 Moteur de recherche d'entreprises de services\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/#organization\"},\"alternateName\":\"ProDispo\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/#organization\",\"name\":\"ProDispo \u2013 Moteur de recherche d'entreprises de services\",\"url\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/prodispo.ca\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/cropped-Logo-Bilingue.png\",\"contentUrl\":\"https:\\\/\\\/prodispo.ca\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/cropped-Logo-Bilingue.png\",\"width\":512,\"height\":512,\"caption\":\"ProDispo \u2013 Moteur de recherche d'entreprises de services\"},\"image\":{\"@id\":\"https:\\\/\\\/prodispo.ca\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/prodispo\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ProDispo - Search Results - ProDispo \u2013 Your search engine for service businesses","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:\/\/prodispo.ca\/en\/results-search\/","og_locale":"en_US","og_type":"article","og_title":"ProDispo - Search Results - ProDispo \u2013 Your search engine for service businesses","og_description":"Searching\u2026 We are preparing your results and the ProDispo map. \u00d7 Analyzing&#8230; Edit Criteria E.g.: I need help preparing my meals. Is there a ProDispo? From &#8220;Who does this?&#8221; to &#8220;Who is available?&#8221; \u2014 One request, multiple candidates. Those who are available respond to you. Services for Individuals Find help for personal, family, and daily&hellip;&nbsp;Read More &raquo;ProDispo &#8211; Search Results","og_url":"https:\/\/prodispo.ca\/en\/results-search\/","og_site_name":"ProDispo \u2013 Your search engine for service businesses","article_publisher":"https:\/\/www.facebook.com\/prodispo","article_modified_time":"2026-10-16T16:03:07+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/prodispo.ca\/wp-content\/uploads\/2025\/05\/cropped-Logo-Bilingue.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/prodispo.ca\/en\/results-search\/","url":"https:\/\/prodispo.ca\/en\/results-search\/","name":"ProDispo - Search Results - ProDispo \u2013 Your search engine for service businesses","isPartOf":{"@id":"https:\/\/prodispo.ca\/en\/#website"},"datePublished":"2026-10-12T15:57:16+00:00","dateModified":"2026-10-16T16:03:07+00:00","breadcrumb":{"@id":"https:\/\/prodispo.ca\/en\/results-search\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/prodispo.ca\/en\/results-search\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/prodispo.ca\/en\/results-search\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/prodispo.ca\/en\/"},{"@type":"ListItem","position":2,"name":"ProDispo - Search Results"}]},{"@type":"WebSite","@id":"https:\/\/prodispo.ca\/en\/#website","url":"https:\/\/prodispo.ca\/en\/","name":"ProDispo \u2013 Moteur de recherche d'entreprises de services","description":"","publisher":{"@id":"https:\/\/prodispo.ca\/en\/#organization"},"alternateName":"ProDispo","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/prodispo.ca\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/prodispo.ca\/en\/#organization","name":"ProDispo \u2013 Moteur de recherche d'entreprises de services","url":"https:\/\/prodispo.ca\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/prodispo.ca\/en\/#\/schema\/logo\/image\/","url":"https:\/\/prodispo.ca\/wp-content\/uploads\/2025\/05\/cropped-Logo-Bilingue.png","contentUrl":"https:\/\/prodispo.ca\/wp-content\/uploads\/2025\/05\/cropped-Logo-Bilingue.png","width":512,"height":512,"caption":"ProDispo \u2013 Moteur de recherche d'entreprises de services"},"image":{"@id":"https:\/\/prodispo.ca\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/prodispo"]}]}},"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PgjULY-bZi","_links":{"self":[{"href":"https:\/\/prodispo.ca\/en\/wp-json\/wp\/v2\/pages\/46084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prodispo.ca\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/prodispo.ca\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/prodispo.ca\/en\/wp-json\/wp\/v2\/users\/261370924"}],"replies":[{"embeddable":true,"href":"https:\/\/prodispo.ca\/en\/wp-json\/wp\/v2\/comments?post=46084"}],"version-history":[{"count":100,"href":"https:\/\/prodispo.ca\/en\/wp-json\/wp\/v2\/pages\/46084\/revisions"}],"predecessor-version":[{"id":46746,"href":"https:\/\/prodispo.ca\/en\/wp-json\/wp\/v2\/pages\/46084\/revisions\/46746"}],"wp:attachment":[{"href":"https:\/\/prodispo.ca\/en\/wp-json\/wp\/v2\/media?parent=46084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}