{"id":23814263,"date":"2026-09-22T17:06:06","date_gmt":"2026-09-22T17:06:06","guid":{"rendered":"https:\/\/socialhackerslab.com\/?page_id=23814263"},"modified":"2026-09-24T08:05:50","modified_gmt":"2026-09-24T08:05:50","slug":"metropole-outils","status":"publish","type":"page","link":"https:\/\/socialhackerslab.com\/en\/metropole-outils\/","title":{"rendered":"m\u00e9tropole outils"},"content":{"rendered":"<meta charset=\"utf-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n<title>FIS \u2014 L\u2019impact social en perspective<\/title>\r\n<script src=\"https:\/\/d3js.org\/d3.v7.min.js\" type=\"text\/javascript\" data-category=\"functional\" class=\"cmplz-native\"><\/script>\r\n\r\n<style>\r\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@400;500;600;700;800&display=swap');\r\n\/* Les deux familles de la carte des associations (onglet Carte, seconde\r\n   carte). Le navigateur ne t\u00e9l\u00e9charge un fichier de police qu'au premier\r\n   texte qui l'emploie : rien ne part tant que cette carte reste ferm\u00e9e. *\/\r\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Bricolage+Grotesque:wght@500;700;800&family=Schibsted+Grotesk:wght@400;500;600;700&display=swap');\r\n\r\nhtml:has(#reu-roue-wp), body:has(#reu-roue-wp){\r\n    margin: 0 !important;\r\n    padding: 0 !important;\r\n    overflow: hidden !important;\r\n}\r\nbody:has(#reu-roue-wp) .entry-title,\r\nbody:has(#reu-roue-wp) .page-title,\r\nbody:has(#reu-roue-wp) h1.elementor-heading-title,\r\nbody:has(#reu-roue-wp) .nv-page-title,\r\nbody:has(#reu-roue-wp) .site-header,\r\nbody:has(#reu-roue-wp) .site-footer{\r\n    display: none !important;\r\n}\r\n\r\n#reu-roue-wp{\r\n    --bg-color: #f6f7f9;\r\n    --text-color: #1f3147;\r\n    --ink-strong: #0e1b2e;\r\n    --muted-text: #64748b;\r\n    --border-color: #e3e7ed;\r\n    --font-family: 'Manrope', sans-serif;\r\n    --chip-bg: rgba(255, 255, 255, 0.92);\r\n    --chip-shadow: 0 1px 2px rgba(14, 27, 46, 0.05), 0 12px 28px rgba(14, 27, 46, 0.07);\r\n\r\n    position: fixed !important;\r\n    inset: 0 !important;\r\n    width: 100vw !important;\r\n    height: 100vh !important;\r\n    z-index: 9999999 !important;\r\n    font-family: var(--font-family) !important;\r\n    background:\r\n        radial-gradient(120% 90% at 50% -10%, #ffffff 0%, #f8f9fb 45%, #eef1f6 100%) !important;\r\n    background-color: var(--bg-color) !important;\r\n    color: var(--text-color) !important;\r\n    overflow: hidden !important;\r\n    display: flex !important;\r\n    flex-direction: column !important;\r\n}\r\n#reu-roue-wp *{ box-sizing: border-box; }\r\n\r\n#reu-roue-wp #app-container{\r\n    display: flex;\r\n    flex-direction: column;\r\n    height: 100%;\r\n    width: 100%;\r\n    position: relative;\r\n}\r\n\r\n\/* ---------- bandeau logos + titre ---------- *\/\r\n\/* Vrai bandeau plein cadre, en flux normal (comme #fis-hdr sur la carte),\r\n   pas une carte flottante par-dessus le disque : les logos portent la\r\n   l\u00e9gitimit\u00e9 institutionnelle, la roue porte la donn\u00e9e juste en dessous. *\/\r\n#reu-roue-wp .brand-row{\r\n    flex-shrink: 0;\r\n    height: 60px;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 0.9rem;\r\n    padding: 0 1.1rem;\r\n    background: #fff;\r\n    border-bottom: 1px solid var(--border-color);\r\n    box-shadow: 0 2px 10px rgba(14, 27, 46, 0.06);\r\n    z-index: 30;\r\n    position: relative;\r\n}\r\n#reu-roue-wp .brand{\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 0.55rem;\r\n    flex-shrink: 0;\r\n}\r\n#reu-roue-wp .brand .shl-logo{ height: 24px; width: auto; flex-shrink: 0; display: block; }\r\n#reu-roue-wp .brand .sep{ width: 1px; height: 26px; background: var(--border-color); flex-shrink: 0; }\r\n#reu-roue-wp .brand .amp-logo{ height: 26px; width: auto; flex-shrink: 0; display: block; }\r\n#reu-roue-wp .map-title-main{\r\n    margin-left: auto;\r\n    color: var(--ink-strong);\r\n    font-size: 0.95rem;\r\n    font-weight: 850;\r\n    line-height: 1.04;\r\n    white-space: nowrap;\r\n}\r\n\r\n\/* ---------- header (onglets, fil d'Ariane, KPI) ---------- *\/\r\n\/* Reste une carte flottante en coin, sous le bandeau : c'est ce bloc-l\u00e0,\r\n   pas le bandeau, que la roue doit continuer \u00e0 \u00e9viter au redimensionnement. *\/\r\n#reu-roue-wp .header{\r\n    position: absolute;\r\n    top: calc(60px + 1.05rem);\r\n    left: 1.1rem;\r\n    width: fit-content;\r\n    max-width: calc(100vw - 2.2rem);\r\n    z-index: 20;\r\n    pointer-events: none;\r\n}\r\n#reu-roue-wp .toolbar{\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: flex-start;\r\n    gap: 0.6rem;\r\n    pointer-events: auto;\r\n}\r\n\r\n#reu-roue-wp .toggle-group{\r\n    display: inline-flex;\r\n    flex-wrap: wrap;\r\n    max-width: min(900px, calc(100vw - 2.2rem));\r\n    gap: 0.4rem;\r\n    padding: 0.35rem;\r\n    border-radius: 22px;\r\n    background: var(--chip-bg);\r\n    box-shadow: var(--chip-shadow);\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n}\r\n#reu-roue-wp .toggle-btn{\r\n    border: none;\r\n    border-radius: 999px;\r\n    padding: 0.58rem 0.82rem;\r\n    background: transparent;\r\n    color: var(--text-color);\r\n    font: inherit;\r\n    font-size: 0.8rem;\r\n    font-weight: 700;\r\n    cursor: pointer;\r\n    transition: transform 0.2s ease, background-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease;\r\n}\r\n#reu-roue-wp .toggle-btn:hover{ transform: translateY(-1px); background: rgba(255,255,255,0.68); }\r\n#reu-roue-wp .toggle-btn.active{\r\n    color: #fff;\r\n    background: #0e1b2e;\r\n    box-shadow: 0 6px 16px rgba(14, 27, 46, 0.22);\r\n}\r\n\/* L'onglet Freins change de nature de vue (radar, plus roue) : teinte distincte. *\/\r\n#reu-roue-wp .toggle-btn.is-radar.active{\r\n    background: #0e1b2e;\r\n    box-shadow: 0 6px 16px rgba(14, 27, 46, 0.22);\r\n}\r\n\/* L'onglet Fleurs est une troisi\u00e8me nature de vue (galerie) : sa propre teinte. *\/\r\n#reu-roue-wp .toggle-btn.is-flora.active{\r\n    background: #0e1b2e;\r\n    box-shadow: 0 6px 16px rgba(14, 27, 46, 0.22);\r\n}\r\n\r\n\/* ---------- fil d'Ariane ---------- *\/\r\n\/* Le \u00ab \u2039 Retour \u00bb au centre de la roue \u00e9tait le seul moyen de remonter, et il\r\n   ne disait ni o\u00f9 l'on est ni ce qu'on trouve au-dessus. Le fil donne les deux,\r\n   et chaque niveau est cliquable directement. *\/\r\n#reu-roue-wp .crumbs{\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    align-items: center;\r\n    gap: 0.1rem 0.15rem;\r\n    max-width: min(560px, calc(100vw - 2.2rem));\r\n    padding: 0.25rem 0.55rem;\r\n    border-radius: 999px;\r\n    background: var(--chip-bg);\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n    box-shadow: var(--chip-shadow);\r\n}\r\n#reu-roue-wp .crumbs[hidden]{ display: none; }\r\n#reu-roue-wp .crumb{\r\n    max-width: 15rem;\r\n    padding: 0.22rem 0.4rem;\r\n    border: none;\r\n    border-radius: 999px;\r\n    background: none;\r\n    color: var(--muted-text);\r\n    font: inherit;\r\n    font-size: 0.74rem;\r\n    font-weight: 750;\r\n    line-height: 1.25;\r\n    text-align: left;\r\n    white-space: nowrap;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    cursor: pointer;\r\n}\r\n#reu-roue-wp .crumb:hover{ background: rgba(31, 49, 71, 0.07); color: var(--ink-strong); }\r\n#reu-roue-wp .crumb.is-current{\r\n    color: var(--ink-strong);\r\n    font-weight: 850;\r\n    cursor: default;\r\n}\r\n#reu-roue-wp .crumb.is-current:hover{ background: none; }\r\n#reu-roue-wp .crumb-sep{\r\n    flex: none;\r\n    color: rgba(100, 116, 139, 0.55);\r\n    font-size: 0.74rem;\r\n    font-weight: 800;\r\n}\r\n\r\n\/* ---------- s\u00e9lecteur barres \/ radar ---------- *\/\r\n#reu-roue-wp .radar-modes{\r\n    display: inline-flex;\r\n    gap: 0.3rem;\r\n    padding: 0.28rem;\r\n    border-radius: 18px;\r\n    background: var(--chip-bg);\r\n    box-shadow: var(--chip-shadow);\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n}\r\n#reu-roue-wp .radar-modes[hidden]{ display: none; }\r\n\/* Grille ou \u00e9tages : les deux lectures des fleurs partagent un onglet.\r\n   L'en-t\u00eate est masqu\u00e9 dans les deux vues : la bascule flotte au pied\r\n   de la sc\u00e8ne, seule zone libre dans l'une comme dans l'autre. *\/\r\n#reu-roue-wp .fleurs-modes{\r\n    position: absolute;\r\n    left: 50%;\r\n    bottom: 18px;\r\n    transform: translateX(-50%);\r\n    z-index: 21;   \/* sous la fiche (.detail, 25) *\/\r\n    background: #fff;\r\n    border-radius: 999px;\r\n    box-shadow: 0 6px 18px rgba(24, 53, 64, 0.14);\r\n}\r\n#reu-roue-wp .fleurs-modes .rmode{ font-size: 12px; }\r\n\/* Aux \u00e9tages, le pied porte d\u00e9j\u00e0 la l\u00e9gende : la bascule passe sous le filtre. *\/\r\n#reu-roue-wp[data-view=\"etages\"] .fleurs-modes{ top: 96px; right: 36px; left: auto; bottom: auto; transform: none; }\r\n@media (max-width: 760px){ #reu-roue-wp[data-view=\"etages\"] .fleurs-modes{ top: 70px; right: 20px; } }\r\n@media (max-width: 520px){ #reu-roue-wp[data-view=\"etages\"] .fleurs-modes{ top: 82px; right: 16px; } }\r\n#reu-roue-wp .fg-etage{\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    align-items: baseline;\r\n    gap: 0.2rem 0.6rem;\r\n    margin: 2rem 0 0.2rem;\r\n    padding-top: 0.8rem;\r\n    border-top: 3px solid var(--pr, #8b8882);\r\n    font-size: 1.05rem;\r\n    font-weight: 900;\r\n    color: var(--pr-ink, var(--ink-strong));\r\n}\r\n#reu-roue-wp .fg-etage:first-child{ margin-top: 0; }\r\n#reu-roue-wp .fg-etage-phrase{\r\n    font-size: 0.78rem;\r\n    font-weight: 600;\r\n    color: var(--muted-text);\r\n}\r\n#reu-roue-wp .fg-body{ padding-bottom: 72px; }\r\n#reu-roue-wp .rmode{\r\n    border: none;\r\n    border-radius: 999px;\r\n    padding: 0.42rem 0.72rem;\r\n    background: transparent;\r\n    color: var(--text-color);\r\n    font: inherit;\r\n    font-size: 0.75rem;\r\n    font-weight: 700;\r\n    cursor: pointer;\r\n    transition: background-color 0.2s ease, color 0.2s ease;\r\n}\r\n#reu-roue-wp .rmode:hover{ background: rgba(255,255,255,0.7); }\r\n#reu-roue-wp .rmode.active{ background: #0e1b2e; color: #fff; }\r\n\r\n\/* ---------- barres class\u00e9es des freins ---------- *\/\r\n#reu-roue-wp .freins-bars{\r\n    position: absolute;\r\n    inset: 0;\r\n    overflow-y: auto;\r\n    padding: 0.8rem 1.4rem 1.4rem;\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    scrollbar-width: thin;\r\n}\r\n#reu-roue-wp .freins-bars[hidden]{ display: none; }\r\n@media (min-width: 1000px){\r\n    #reu-roue-wp .freins-bars{ padding-left: 22rem; padding-right: 3rem; }\r\n}\r\n#reu-roue-wp .fb-caption{\r\n    margin: 0 0 1rem;\r\n    font-size: 0.78rem;\r\n    font-weight: 650;\r\n    line-height: 1.45;\r\n    color: var(--muted-text);\r\n    max-width: 70ch;\r\n}\r\n#reu-roue-wp .fb-row{\r\n    display: grid;\r\n    grid-template-columns: 2.6rem minmax(6rem, 12rem) 1fr 4.4rem;\r\n    align-items: center;\r\n    gap: 0.7rem;\r\n    padding: 0.32rem 0;\r\n}\r\n#reu-roue-wp .fb-code{\r\n    font-size: 0.78rem;\r\n    font-weight: 900;\r\n    color: #334155;\r\n}\r\n#reu-roue-wp .fb-label{\r\n    font-size: 0.82rem;\r\n    font-weight: 700;\r\n    color: var(--text-color);\r\n    line-height: 1.25;\r\n}\r\n#reu-roue-wp .fb-track{\r\n    height: 15px;\r\n    border-radius: 4px;\r\n    background: rgba(31, 49, 71, 0.07);\r\n    overflow: hidden;\r\n}\r\n#reu-roue-wp .fb-fill{\r\n    display: block;\r\n    height: 100%;\r\n    border-radius: 4px;\r\n    background: #334155;\r\n    transition: width 0.5s cubic-bezier(0.22, 1, 0.36, 1);\r\n}\r\n#reu-roue-wp .fb-val{\r\n    font-size: 0.8rem;\r\n    font-weight: 800;\r\n    color: var(--ink-strong);\r\n    text-align: right;\r\n    white-space: nowrap;\r\n}\r\n#reu-roue-wp .fb-val span{ color: var(--muted-text); font-weight: 650; }\r\n@media (max-width: 720px){\r\n    #reu-roue-wp .freins-bars{ padding-bottom: 26vh; }\r\n    #reu-roue-wp .fb-row{ grid-template-columns: 2.3rem 1fr 3.6rem; }\r\n    #reu-roue-wp .fb-track{ grid-column: 1 \/ -1; }\r\n}\r\n\r\n\/* ---------- galerie des fleurs ---------- *\/\r\n\/* La roue ne montre qu'une empreinte \u00e0 la fois, dans la fiche ouverte. Ici les\r\n   fleurs sont c\u00f4te \u00e0 c\u00f4te : on compare les silhouettes d'un coup d'oeil,\r\n   th\u00e9matique par th\u00e9matique, et un clic ouvre la fiche correspondante.\r\n   Le panneau commence SOUS le bandeau (top pos\u00e9 en JS) au lieu de passer\r\n   dessous en d\u00e9filant : rien ne vient plus se lire \u00e0 travers les KPI. *\/\r\n#reu-roue-wp .flora-grid{\r\n    position: absolute;\r\n    inset: 0;\r\n    overflow-y: auto;\r\n    padding: 0.1rem 1.4rem 2rem;\r\n    scrollbar-width: thin;\r\n}\r\n#reu-roue-wp .flora-grid[hidden]{ display: none; }\r\n\/* Au-del\u00e0 de 1000 px la galerie se lit en DEUX COLONNES : le chapeau et la cl\u00e9\r\n   de lecture \u00e0 gauche, les rang\u00e9es de fleurs \u00e0 droite. La goutti\u00e8re de gauche\r\n   existait d\u00e9j\u00e0, pour que les cartes ne passent pas sous la l\u00e9gende des\r\n   th\u00e9matiques, mais toute sa partie haute restait vide : le texte \u00e9tait refoul\u00e9\r\n   vers la droite et vers le bas, et l'on entrait dans la page par un grand\r\n   blanc. Le chapeau vient l'occuper, et les fleurs remontent d'autant. *\/\r\n@media (min-width: 1000px){\r\n    #reu-roue-wp .flora-grid{\r\n        display: grid;\r\n        grid-template-columns: 19rem minmax(0, 1fr);\r\n        column-gap: 1.5rem;\r\n        align-content: start;\r\n        padding-left: 1.4rem;\r\n        padding-right: 2.4rem;\r\n    }\r\n    \/* La colonne reste sous les yeux pendant qu'on fait d\u00e9filer les fleurs.\r\n       Le filtre par th\u00e9matique \u00e9tait une bo\u00eete flottante, toujours visible :\r\n       le ranger dans le flux ne doit pas le faire dispara\u00eetre au premier coup\r\n       de molette. Sa hauteur est born\u00e9e par renderFlora, \u00e0 la hauteur visible\r\n       de la galerie, pour que son bas reste toujours atteignable. *\/\r\n    #reu-roue-wp .fg-intro{\r\n        grid-column: 1;\r\n        grid-row: 1;\r\n        align-self: start;\r\n        position: sticky;\r\n        top: 0;\r\n        overflow-y: auto;\r\n        scrollbar-width: thin;\r\n    }\r\n    #reu-roue-wp .fg-body{ grid-column: 2; grid-row: 1; }\r\n    \/* En colonne \u00e9troite, la cl\u00e9 se lit mieux empil\u00e9e qu'en une ligne\r\n       cass\u00e9e en quatre morceaux in\u00e9gaux. *\/\r\n    #reu-roue-wp .fg-key{ flex-direction: column; gap: 0.55rem; margin-bottom: 0; }\r\n}\r\n\/* La place gagn\u00e9e en repliant le filtre revient au texte, elle ne se garde\r\n   pas en blanc : dans une colonne de dix-neuf cadratins, un chapeau de cinq\r\n   lignes se lit d'autant mieux qu'on lui donne de l'interligne. *\/\r\n#reu-roue-wp .fg-caption{\r\n    margin: 0 0 0.85rem;\r\n    max-width: 70ch;\r\n    font-size: 0.85rem;\r\n    font-weight: 600;\r\n    line-height: 1.6;\r\n    color: var(--muted-text);\r\n}\r\n\/* Rappel des quatre couches : sans lui les silhouettes ne se d\u00e9codent pas.\r\n   Le glyphe est enferm\u00e9 dans une bo\u00eete de taille fixe et le SVG remplit\r\n   celle-ci : le th\u00e8me du site ne peut plus lui imposer sa propre taille. *\/\r\n#reu-roue-wp .fg-key{\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 0.45rem 1.1rem;\r\n    margin: 0 0 1rem;\r\n    padding: 0.6rem 0.75rem;\r\n    list-style: none;\r\n    border-radius: 12px;\r\n    background: rgba(255, 255, 255, 0.7);\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n}\r\n#reu-roue-wp .fg-key li{\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 0.5rem;\r\n    font-size: 0.8rem;\r\n    font-weight: 700;\r\n    line-height: 1.35;\r\n    color: var(--muted-text);\r\n}\r\n#reu-roue-wp .fg-glyph-box{\r\n    display: block;\r\n    flex: none;\r\n    line-height: 0;\r\n}\r\n#reu-roue-wp .fg-glyph-box > svg{\r\n    display: block;\r\n    width: 100% !important;\r\n    height: 100% !important;\r\n}\r\n#reu-roue-wp .fg-key .fg-glyph-box{ width: 26px; height: 26px; }\r\n#reu-roue-wp .fg-theme{\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 0.4rem;\r\n    margin: 0.9rem 0 0.45rem;\r\n    font-size: 0.7rem;\r\n    font-weight: 900;\r\n    letter-spacing: 0.08em;\r\n    text-transform: uppercase;\r\n    color: var(--ink-strong);\r\n}\r\n#reu-roue-wp .fg-theme:first-of-type{ margin-top: 0; }\r\n#reu-roue-wp .fg-theme-count{\r\n    font-size: 0.68rem;\r\n    font-weight: 750;\r\n    letter-spacing: 0;\r\n    text-transform: none;\r\n    color: var(--muted-text);\r\n}\r\n#reu-roue-wp .fg-cards{\r\n    display: grid;\r\n    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\r\n    grid-auto-rows: 1fr;   \/* toutes les rang\u00e9es \u00e0 la m\u00eame hauteur *\/\r\n    gap: 0.55rem;\r\n}\r\n\/* Carte en <div> et non en <button> : le contenu d'un bouton est mis en page\r\n   par le navigateur dans une bo\u00eete anonyme que les th\u00e8mes WordPress\r\n   redimensionnent, et le texte d\u00e9bordait sous la carte. *\/\r\n#reu-roue-wp .fg-card{\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    height: 100%;\r\n    gap: 0.25rem;\r\n    padding: 0.7rem 0.5rem 0.65rem;\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n    border-radius: 14px;\r\n    background: rgba(255, 255, 255, 0.82);\r\n    font-family: var(--font-family);\r\n    color: var(--text-color);\r\n    text-align: center;\r\n    overflow: hidden;\r\n    cursor: pointer;\r\n    transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;\r\n}\r\n#reu-roue-wp .fg-card:hover{\r\n    transform: translateY(-2px);\r\n    box-shadow: var(--chip-shadow);\r\n    border-color: var(--card-color);\r\n}\r\n#reu-roue-wp .fg-card:focus-visible{\r\n    outline: 2px solid var(--card-color);\r\n    outline-offset: 2px;\r\n}\r\n#reu-roue-wp .fg-card.is-selected{\r\n    border-color: var(--card-color);\r\n    box-shadow: 0 0 0 2px var(--card-color);\r\n}\r\n#reu-roue-wp .fg-card .fg-glyph-box{ width: 84px; height: 84px; margin-bottom: 0.15rem; }\r\n\/* Deux lignes maximum par libell\u00e9 : au-del\u00e0, une carte s'\u00e9tirait et toute la\r\n   rang\u00e9e avec elle. Le nom complet reste dans l'infobulle et dans la fiche. *\/\r\n#reu-roue-wp .fg-name,\r\n#reu-roue-wp .fg-proj{\r\n    display: -webkit-box;\r\n    -webkit-box-orient: vertical;\r\n    -webkit-line-clamp: 2;\r\n    line-clamp: 2;\r\n    overflow: hidden;\r\n    max-width: 100%;\r\n    overflow-wrap: anywhere;\r\n}\r\n#reu-roue-wp .fg-name{\r\n    font-size: 0.73rem;\r\n    font-weight: 800;\r\n    line-height: 1.2;\r\n    min-height: 2.4em;     \/* 2 lignes r\u00e9serv\u00e9es, remplies ou non *\/\r\n    color: var(--ink-strong);\r\n}\r\n#reu-roue-wp .fg-proj{\r\n    font-size: 0.65rem;\r\n    font-weight: 600;\r\n    line-height: 1.25;\r\n    min-height: 2.5em;     \/* idem : la carte ne d\u00e9pend plus du texte *\/\r\n    color: var(--muted-text);\r\n}\r\n#reu-roue-wp .fg-score{\r\n    margin-top: 0.15rem;\r\n    font-size: 0.63rem;\r\n    font-weight: 900;\r\n    letter-spacing: 0.05em;\r\n    color: var(--card-color);\r\n}\r\n\/* Aucune dimension renseign\u00e9e : la carte le dit en gris plut\u00f4t que d'afficher\r\n   un score color\u00e9 pour un z\u00e9ro. *\/\r\n#reu-roue-wp .fg-card.is-empty .fg-score{ color: var(--muted-text); }\r\n@media (max-width: 720px){\r\n    #reu-roue-wp .flora-grid{ padding-bottom: 26vh; }\r\n    #reu-roue-wp .fg-cards{ grid-template-columns: repeat(auto-fill, minmax(124px, 1fr)); }\r\n    #reu-roue-wp .fg-card .fg-glyph-box{ width: 68px; height: 68px; }\r\n}\r\n\r\n\/* ---------- radar des freins ---------- *\/\r\n#reu-roue-wp path.radar-area{ fill: rgba(51, 65, 85, 0.13); stroke: #334155; stroke-width: 2px; stroke-linejoin: round; }\r\n#reu-roue-wp circle.radar-pt{ fill: #334155; stroke: #fff; stroke-width: 2px; cursor: help; }\r\n#reu-roue-wp .radar-grid circle{ fill: none; stroke: rgba(31, 49, 71, 0.12); }\r\n#reu-roue-wp .radar-grid line{ stroke: rgba(31, 49, 71, 0.14); }\r\n#reu-roue-wp text.radar-axis{\r\n    font-family: var(--font-family) !important;\r\n    font-size: 12.5px;\r\n    font-weight: 750;\r\n    fill: #1f3147;\r\n}\r\n#reu-roue-wp text.radar-axis tspan.code{ fill: #334155; font-weight: 850; }\r\n#reu-roue-wp text.radar-val{\r\n    font-family: var(--font-family) !important;\r\n    font-size: 12px;\r\n    font-weight: 850;\r\n    fill: #0e1b2e;\r\n    text-anchor: middle;\r\n}\r\n#reu-roue-wp text.radar-ring{\r\n    font-family: var(--font-family) !important;\r\n    font-size: 10.5px;\r\n    font-weight: 700;\r\n    fill: #64748b;\r\n    text-anchor: middle;\r\n}\r\n\r\n\/* ---------- KPI ---------- *\/\r\n#reu-roue-wp .kpi-row{\r\n    display: flex;\r\n    gap: 0.5rem;\r\n    flex-wrap: wrap;\r\n}\r\n#reu-roue-wp .kpi{\r\n    padding: 0.5rem 0.75rem;\r\n    border-radius: 14px;\r\n    background: var(--chip-bg);\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n    box-shadow: var(--chip-shadow);\r\n    min-width: 92px;\r\n}\r\n#reu-roue-wp .kpi-value{\r\n    display: block;\r\n    color: var(--ink-strong);\r\n    font-size: 1.02rem;\r\n    font-weight: 850;\r\n    line-height: 1.1;\r\n}\r\n#reu-roue-wp .kpi-label{\r\n    display: block;\r\n    margin-top: 0.1rem;\r\n    color: var(--muted-text);\r\n    font-size: 0.64rem;\r\n    font-weight: 800;\r\n    letter-spacing: 0.06em;\r\n    text-transform: uppercase;\r\n}\r\n\r\n\/* ---------- layout ---------- *\/\r\n#reu-roue-wp .main-content{\r\n    display: flex;\r\n    flex: 1;\r\n    position: relative;\r\n    overflow: hidden;\r\n}\r\n#reu-roue-wp #chart-container{\r\n    flex: 1;\r\n    position: relative;\r\n    min-width: 0;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n}\r\n#reu-roue-wp #chart-container svg{\r\n    width: 100%;\r\n    height: 100%;\r\n    display: block;\r\n    touch-action: manipulation;\r\n}\r\n\r\n\/* ---------- l\u00e9gende ---------- *\/\r\n#reu-roue-wp .legend{\r\n    position: absolute;\r\n    left: 1.1rem;\r\n    bottom: 1.1rem;\r\n    z-index: 15;\r\n    padding: 0.65rem 0.8rem 0.7rem;\r\n    border-radius: 18px;\r\n    background: var(--chip-bg);\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n    box-shadow: var(--chip-shadow);\r\n    max-width: min(300px, calc(100vw - 2.2rem));\r\n    max-height: 46vh;\r\n    overflow-y: auto;\r\n    scrollbar-width: thin;\r\n}\r\n\/* Rang\u00e9e dans la colonne de la galerie : elle reprend sa place dans le flux,\r\n   sous la cl\u00e9 de lecture, et rend son ombre port\u00e9e, qui n'a plus lieu d'\u00eatre\r\n   puisqu'elle ne flotte plus au-dessus de rien. *\/\r\n#reu-roue-wp .legend.is-inline{\r\n    position: static;\r\n    max-width: none;\r\n    max-height: none;\r\n    margin-top: 0.7rem;\r\n    padding: 0.7rem 0.75rem 0.75rem;\r\n    box-shadow: none;\r\n    overflow: visible;\r\n}\r\n#reu-roue-wp .legend-title{\r\n    margin: 0 0 0.45rem;\r\n    font-size: 0.66rem;\r\n    font-weight: 850;\r\n    letter-spacing: 0.08em;\r\n    text-transform: uppercase;\r\n    color: var(--muted-text);\r\n}\r\n#reu-roue-wp .legend-list{\r\n    list-style: none;\r\n    margin: 0;\r\n    padding: 0;\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 0.28rem;\r\n}\r\n\/* Filtre repli\u00e9 en menu, dans la galerie seulement : neuf lignes de\r\n   th\u00e9matiques y prenaient plus de haut que les fleurs qu'elles servent \u00e0\r\n   trier. Le menu se d\u00e9plie DANS le flux et non en calque, parce que la\r\n   colonne qui le porte est collante et d\u00e9file toute seule : un calque y\r\n   serait rogn\u00e9 au premier d\u00e9bordement. *\/\r\n#reu-roue-wp .legend-trigger{ display: none; }\r\n#reu-roue-wp .legend.is-menu .legend-trigger{\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 0.6rem;\r\n    width: 100%;\r\n    padding: 0.5rem 0.6rem;\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n    border-radius: 11px;\r\n    background: rgba(255, 255, 255, 0.85);\r\n    font-family: var(--font-family);\r\n    font-size: 0.83rem;\r\n    font-weight: 750;\r\n    line-height: 1.35;\r\n    color: var(--ink-strong);\r\n    text-align: left;\r\n    cursor: pointer;\r\n}\r\n#reu-roue-wp .legend.is-menu .legend-trigger:hover{ border-color: rgba(31, 49, 71, 0.35); }\r\n#reu-roue-wp .legend-caret{\r\n    flex: none;\r\n    margin-left: auto;\r\n    color: var(--muted-text);\r\n    transition: transform 0.15s ease;\r\n}\r\n#reu-roue-wp .legend.is-open .legend-caret{ transform: rotate(180deg); }\r\n#reu-roue-wp .legend.is-menu .legend-list{ display: none; }\r\n#reu-roue-wp .legend.is-menu.is-open .legend-list{ display: flex; margin-top: 0.3rem; }\r\n\/* Menu ouvert : fond opaque. La l\u00e9gende est une pastille translucide pos\u00e9e sur\r\n   la sc\u00e8ne, ce qui passe tr\u00e8s bien pour une ligne de titre, beaucoup moins\r\n   pour dix lignes de menu sous lesquelles on lirait les noms des fleurs. *\/\r\n#reu-roue-wp .legend.is-menu.is-open{ background: #ffffff; }\r\n\/* Dans la galerie, replier le filtre a lib\u00e9r\u00e9 de la hauteur : elle revient au\r\n   texte. Sur les Freins la l\u00e9gende reste d\u00e9ploy\u00e9e dans une bo\u00eete born\u00e9e \u00e0 46 %\r\n   de l'\u00e9cran, o\u00f9 le m\u00eame surcro\u00eet d'air faisait sortir la derni\u00e8re th\u00e9matique\r\n   du cadre. C'est donc le menu, et lui seul, qui respire. *\/\r\n#reu-roue-wp .legend.is-menu .legend-title{ margin-bottom: 0.5rem; font-size: 0.7rem; }\r\n#reu-roue-wp .legend.is-menu .legend-list{ gap: 0.4rem; }\r\n#reu-roue-wp .legend.is-menu .legend-item{\r\n    gap: 0.6rem;\r\n    font-size: 0.83rem;\r\n    line-height: 1.4;\r\n    padding: 0.22rem 0.3rem;\r\n}\r\n#reu-roue-wp .legend.is-menu .legend-item.legend-all{ padding-left: calc(0.3rem + 10px + 0.6rem); }\r\n#reu-roue-wp .legend.is-menu .legend-count{ font-size: 0.76rem; }\r\n#reu-roue-wp .legend-item{\r\n    display: flex;\r\n    align-items: baseline;\r\n    gap: 0.55rem;\r\n    font-size: 0.78rem;\r\n    font-weight: 700;\r\n    line-height: 1.25;\r\n    color: var(--text-color);\r\n    cursor: pointer;\r\n    border: none;\r\n    background: none;\r\n    font-family: inherit;\r\n    padding: 0.12rem 0.2rem;\r\n    border-radius: 8px;\r\n    text-align: left;\r\n    width: 100%;\r\n}\r\n#reu-roue-wp .legend-item:hover{ background: rgba(255,255,255,0.9); }\r\n\/* \u00ab Toutes les th\u00e9matiques \u00bb n'a pas de pastille : on lui en r\u00e9serve la place,\r\n   sinon la premi\u00e8re ligne du menu part plus \u00e0 gauche que les neuf autres. *\/\r\n#reu-roue-wp .legend-item.legend-all{ padding-left: calc(0.2rem + 10px + 0.55rem); }\r\n#reu-roue-wp .legend-item.is-on{\r\n    background: rgba(31, 49, 71, 0.07);\r\n    box-shadow: inset 0 0 0 1px rgba(31, 49, 71, 0.28);\r\n}\r\n#reu-roue-wp .legend-dot{\r\n    flex: none;\r\n    width: 10px;\r\n    height: 10px;\r\n    border-radius: 999px;\r\n    background: var(--dot-color, currentColor);\r\n    box-shadow: inset 0 0 0 1px rgba(18, 40, 63, 0.16);\r\n    transform: translateY(1px);\r\n}\r\n#reu-roue-wp .legend-count{\r\n    margin-left: auto;\r\n    color: var(--muted-text);\r\n    font-size: 0.72rem;\r\n    font-weight: 700;\r\n    padding-left: 0.4rem;\r\n}\r\n\r\n\/* ---------- panneau d\u00e9tail ---------- *\/\r\n#reu-roue-wp .detail{\r\n    flex: 0 0 clamp(300px, 27vw, 420px);\r\n    align-self: stretch;\r\n    margin: 1rem 1rem 1rem 0;\r\n    padding: 1.1rem 1.15rem 1.4rem;\r\n    border-radius: 22px;\r\n    background: rgba(248, 250, 252, 0.95);\r\n    border: 1px solid var(--border-color);\r\n    box-shadow: var(--chip-shadow);\r\n    overflow-y: auto;\r\n    display: none;\r\n    scrollbar-width: thin;\r\n}\r\n#reu-roue-wp .detail.is-open{\r\n    display: block;\r\n    animation: detailIn 0.34s cubic-bezier(0.22, 1, 0.36, 1);\r\n}\r\n@keyframes detailIn{\r\n    from { opacity: 0; transform: translateX(14px); }\r\n    to { opacity: 1; transform: translateX(0); }\r\n}\r\n#reu-roue-wp .detail-close{\r\n    float: right;\r\n    border: none;\r\n    background: rgba(31, 49, 71, 0.07);\r\n    color: var(--text-color);\r\n    width: 28px;\r\n    height: 28px;\r\n    border-radius: 999px;\r\n    font-size: 1rem;\r\n    font-weight: 800;\r\n    cursor: pointer;\r\n    line-height: 1;\r\n}\r\n#reu-roue-wp .detail-close:hover{ background: rgba(31, 49, 71, 0.14); }\r\n#reu-roue-wp .detail-theme{\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 0.4rem;\r\n    font-size: 0.66rem;\r\n    font-weight: 850;\r\n    letter-spacing: 0.08em;\r\n    text-transform: uppercase;\r\n    color: var(--theme-color-text, var(--theme-color, var(--muted-text)));\r\n}\r\n#reu-roue-wp .detail-theme .legend-dot{ background: var(--theme-color); }\r\n#reu-roue-wp .detail-title{\r\n    margin: 0.4rem 0 0.1rem;\r\n    font-size: 1.12rem;\r\n    font-weight: 850;\r\n    line-height: 1.2;\r\n    color: var(--ink-strong);\r\n}\r\n#reu-roue-wp .detail-porteur{\r\n    margin: 0 0 0.85rem;\r\n    font-size: 0.86rem;\r\n    font-weight: 700;\r\n    color: var(--muted-text);\r\n}\r\n\/* Le r\u00e9sum\u00e9 \u00e9tait le seul bloc de la fiche sans intitul\u00e9 : on le titre comme\r\n   les autres, sinon il se lit comme une suite du bandeau d'empreinte. *\/\r\n#reu-roue-wp .detail-confid{\r\n    margin: 1rem 0 0.2rem;\r\n    padding-top: 0.55rem;\r\n    border-top: 1px solid rgba(226, 231, 239, 0.9);\r\n    font-size: 0.62rem;\r\n    font-weight: 500;\r\n    font-style: italic;\r\n    line-height: 1.45;\r\n    color: #64748b;\r\n}\r\n#reu-roue-wp .detail-resume-title{\r\n    margin: 0 0 0.3rem;\r\n    font-size: 0.66rem;\r\n    font-weight: 850;\r\n    letter-spacing: 0.07em;\r\n    text-transform: uppercase;\r\n    color: var(--muted-text);\r\n}\r\n#reu-roue-wp .detail-resume{\r\n    margin: 0 0 1rem;\r\n    padding: 0.75rem 0.85rem;\r\n    border-radius: 12px;\r\n    background: rgba(255, 255, 255, 0.82);\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n    border-left: 3px solid var(--theme-color-text, var(--theme-color, #1f3147));\r\n    font-size: 0.84rem;\r\n    font-weight: 500;\r\n    line-height: 1.5;\r\n    color: #334155;\r\n    white-space: pre-wrap;\r\n    overflow-wrap: anywhere;\r\n}\r\n#reu-roue-wp .detail-resume.is-nr{ color: #94a3b8; font-style: italic; }\r\n#reu-roue-wp .detail-stats{\r\n    display: grid;\r\n    grid-template-columns: repeat(2, minmax(0, 1fr));\r\n    gap: 0.45rem;\r\n    margin-bottom: 1rem;\r\n}\r\n#reu-roue-wp .detail-stat{\r\n    padding: 0.5rem 0.6rem;\r\n    border-radius: 12px;\r\n    background: rgba(255,255,255,0.8);\r\n    border: 1px solid rgba(226, 231, 239, 0.85);\r\n}\r\n#reu-roue-wp .detail-stat b{\r\n    display: block;\r\n    font-size: 0.95rem;\r\n    font-weight: 850;\r\n    color: var(--ink-strong);\r\n    line-height: 1.15;\r\n}\r\n#reu-roue-wp .detail-stat span{\r\n    display: block;\r\n    margin-top: 0.1rem;\r\n    font-size: 0.6rem;\r\n    font-weight: 800;\r\n    letter-spacing: 0.06em;\r\n    text-transform: uppercase;\r\n    color: var(--muted-text);\r\n}\r\n\/* Les trois chiffres (FIS, budget, part) tiennent en un mot : gros et gras\r\n   leur va bien. Personnes touch\u00e9es \/ Actions \/ Partenaires sont parfois des\r\n   phrases enti\u00e8res \u00e9crites par le porteur \u2014 la m\u00eame graisse compacte les\r\n   rendait tass\u00e9es et \"coup\u00e9es\" \u00e0 l'\u0153il d\u00e8s que la carte se retrouvait sur\r\n   une moiti\u00e9 de grille. Ces cases-l\u00e0 prennent toute la largeur et un texte\r\n   de paragraphe, pas un chiffre. *\/\r\n#reu-roue-wp .detail-stat--text{ grid-column: 1 \/ -1; }\r\n#reu-roue-wp .detail-stat--text b{\r\n    font-size: 0.79rem;\r\n    font-weight: 500;\r\n    line-height: 1.5;\r\n    letter-spacing: 0;\r\n    text-transform: none;\r\n    color: var(--ink-strong);\r\n}\r\n#reu-roue-wp .detail-block{ margin-bottom: 0.9rem; }\r\n#reu-roue-wp .detail-block h4{\r\n    margin: 0 0 0.25rem;\r\n    font-size: 0.66rem;\r\n    font-weight: 850;\r\n    letter-spacing: 0.07em;\r\n    text-transform: uppercase;\r\n    color: var(--muted-text);\r\n}\r\n#reu-roue-wp .detail-block p{\r\n    margin: 0;\r\n    font-size: 0.83rem;\r\n    font-weight: 500;\r\n    line-height: 1.45;\r\n    color: #334155;\r\n    white-space: pre-wrap;\r\n    overflow-wrap: anywhere;\r\n}\r\n#reu-roue-wp .detail-block.is-nr p{ color: #94a3b8; font-style: italic; }\r\n\r\n\/* ---------- tooltip ---------- *\/\r\n#reu-roue-wp .tooltip{\r\n    position: absolute;\r\n    pointer-events: none;\r\n    opacity: 0;\r\n    z-index: 40;\r\n    max-width: 300px;\r\n    padding: 0.55rem 0.75rem 0.6rem;\r\n    border-radius: 12px;\r\n    background: rgba(14, 27, 46, 0.96);\r\n    color: #fff;\r\n    font-size: 0.76rem;\r\n    font-weight: 600;\r\n    line-height: 1.35;\r\n    transition: opacity 0.14s ease;\r\n}\r\n#reu-roue-wp .tooltip strong{ display: block; font-size: 0.84rem; font-weight: 850; margin-bottom: 0.15rem; }\r\n#reu-roue-wp .tooltip em{ display: block; margin-top: 0.25rem; font-style: normal; font-size: 0.7rem; opacity: 0.78; }\r\n\r\n\/* ---------- arcs ---------- *\/\r\n#reu-roue-wp path.arc{\r\n    cursor: pointer;\r\n    stroke: #ffffff;\r\n    stroke-width: 1.4px;\r\n    vector-effect: non-scaling-stroke;\r\n    shape-rendering: geometricPrecision;\r\n}\r\n#reu-roue-wp path.arc:hover{ filter: brightness(0.96); }\r\n\/* Pendant le zoom : rendu rapide et halos coup\u00e9s. Le contour blanc du texte\r\n   (paint-order stroke) sur une centaine de libell\u00e9s repeints \u00e0 chaque frame\r\n   \u00e9tait le principal poste de saccade ; personne ne lit un texte qui bouge. *\/\r\n#reu-roue-wp g.is-moving path.arc{ shape-rendering: geometricPrecision; }\r\n#reu-roue-wp g.is-moving text.label{ stroke: none !important; }\r\n#reu-roue-wp path.arc.is-nr{ stroke-dasharray: 3 3; }\r\n#reu-roue-wp path.arc.is-selected{\r\n    stroke: #0e1b2e;\r\n    stroke-width: 2.6px;\r\n    stroke-dasharray: none;\r\n}\r\n\r\n#reu-roue-wp text.label{\r\n    pointer-events: none;\r\n    font-family: var(--font-family) !important;\r\n    font-weight: 800;\r\n    text-rendering: geometricPrecision;\r\n    paint-order: stroke fill;\r\n    stroke-width: 2.4px;\r\n    stroke-linejoin: round;\r\n}\r\n#reu-roue-wp text.center-text{\r\n    pointer-events: none;\r\n    text-anchor: middle;\r\n    fill: var(--ink-strong);\r\n    font-family: var(--font-family) !important;\r\n}\r\n#reu-roue-wp circle.center-hit{ cursor: pointer; }\r\n\r\n@media (max-width: 1000px){\r\n    #reu-roue-wp .detail{\r\n        position: absolute;\r\n        inset: auto 0.7rem 0.7rem;\r\n        margin: 0;\r\n        max-height: 58vh;\r\n        flex: none;\r\n    }\r\n    #reu-roue-wp .legend{ max-height: 30vh; }\r\n}\r\n@media (max-width: 720px){\r\n    #reu-roue-wp .tooltip{ display: none; }\r\n    #reu-roue-wp .legend{\r\n        left: 0.7rem;\r\n        right: 0.7rem;\r\n        bottom: 0.7rem;\r\n        max-width: none;\r\n        max-height: 24vh;\r\n    }\r\n    #reu-roue-wp .kpi-row .kpi:nth-child(n+4){ display: none; }\r\n}\r\n\r\n\/* Direction artistique : papier ivoire, encre marine et nuances min\u00e9rales. *\/\r\n#reu-roue-wp{\r\n    --bg-color:#f8f7f3; --text-color:#293f4d; --ink-strong:#193340;\r\n    --muted-text:#62747b; --border-color:#dfe4e1;\r\n    --chip-bg:#fff; --chip-shadow:0 4px 18px rgba(25,51,64,.035);\r\n    --ease:cubic-bezier(.22,1,.36,1);\r\n    background:radial-gradient(ellipse at 77% 42%,#fffefa 0%,#f8f7f3 64%) !important;\r\n    height:100dvh !important; -webkit-font-smoothing:antialiased;\r\n}\r\n#reu-roue-wp [hidden]{display:none !important}\r\n#reu-roue-wp button{ -webkit-tap-highlight-color:transparent; }\r\n#reu-roue-wp button:focus-visible,#reu-roue-wp [role=\"button\"]:focus-visible{outline:2px solid #2d6376;outline-offset:4px}\r\n#reu-roue-wp .brand-row{height:78px;padding:0 32px;gap:30px;background:rgba(255,255,255,.74);box-shadow:none;border-bottom:1px solid var(--border-color)}\r\n#reu-roue-wp .brand{gap:16px}\r\n#reu-roue-wp .brand .shl-logo{height:24px}\r\n#reu-roue-wp .brand .amp-logo{height:27px}\r\n#reu-roue-wp .brand .sep{height:30px}\r\n#reu-roue-wp .toggle-group{margin:auto;padding:5px;gap:3px;border-radius:12px;box-shadow:none;border:1px solid #e6e9e5;background:#f1f3ef;flex-wrap:nowrap}\r\n#reu-roue-wp .toggle-btn{border-radius:8px;padding:10px 16px;font-size:11px;white-space:nowrap;transition:background .28s,color .28s,box-shadow .28s,transform .28s}\r\n#reu-roue-wp .toggle-btn::before{display:inline-block;margin-right:8px;font-size:14px;font-weight:500;line-height:1;vertical-align:-1px}\r\n#reu-roue-wp .toggle-btn[data-ind=\"empreinte\"]::before{content:\"\u25c9\"}\r\n#reu-roue-wp .toggle-btn[data-ind=\"classement\"]::before{content:\"\u25a4\"}\r\n#reu-roue-wp .toggle-btn[data-ind=\"etages\"]::before{content:\"\u25f1\"}\r\n#reu-roue-wp .toggle-btn[data-ind=\"flux\"]::before{content:\"\u2192\"}\r\n#reu-roue-wp .toggle-btn[data-ind=\"fleurs\"]::before{content:\"\u2733\"}\r\n#reu-roue-wp .toggle-btn[data-ind=\"freins\"]::before{content:\"\u2301\"}\r\n#reu-roue-wp .toggle-btn[data-ind=\"carte\"]::before{content:\"\u2316\"}\r\n#reu-roue-wp .toggle-btn:hover{transform:translateY(-1px);background:#e6ece7}\r\n#reu-roue-wp .toggle-btn.active,#reu-roue-wp .toggle-btn.is-flora.active,#reu-roue-wp .toggle-btn.is-radar.active,#reu-roue-wp .toggle-btn.is-carte.active{background:#203e49;color:#fff;box-shadow:0 3px 8px #18354018}\r\n#reu-roue-wp .edition{flex:none;text-align:right;color:var(--muted-text);font-size:9px;line-height:1.8;letter-spacing:.02em}\r\n#reu-roue-wp .edition>span{display:block}\r\n#reu-roue-wp .edition strong{color:var(--ink-strong);font-size:11px;font-weight:700}\r\n#reu-roue-wp .edition-dot{display:inline-block;width:6px;height:6px;background:#739d88;border-radius:50%;margin-left:5px;vertical-align:1px}\r\n#reu-roue-wp .main-content{min-height:0;isolation:isolate}\r\n#reu-roue-wp .header{position:relative;top:auto;left:auto;width:300px;max-width:none;flex:0 0 300px;padding:32px 22px 18px 32px;display:flex;flex-direction:column;pointer-events:auto;z-index:20;min-height:0;overflow:auto;scrollbar-width:thin;border-right:0;background:none}\r\n#reu-roue-wp .eyebrow{font-size:9px;text-transform:uppercase;letter-spacing:.16em;font-weight:800;color:#6b8286;margin:0 0 14px}\r\n#reu-roue-wp .intro h1{font-size:32px;line-height:1.18;letter-spacing:-1.25px;font-weight:800;color:var(--ink-strong);margin:0 0 14px}\r\n#reu-roue-wp .intro h1 span{font-weight:500;color:#738b87}\r\n#reu-roue-wp .map-subtitle{margin:0 0 20px;font-size:11px;line-height:1.7;color:var(--muted-text);max-width:29ch}\r\n#reu-roue-wp .toolbar{gap:12px;width:100%;flex:none}\r\n#reu-roue-wp .kpi-row{width:100%;flex-wrap:nowrap;gap:0;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);padding:14px 0;margin-bottom:4px}\r\n#reu-roue-wp .kpi{background:none;border:none;box-shadow:none;border-radius:0;min-width:0;padding:0 18px;flex:1}\r\n#reu-roue-wp .kpi:first-child{padding-left:0;flex:1.1}\r\n#reu-roue-wp .kpi+.kpi{border-left:1px solid var(--border-color)}\r\n#reu-roue-wp .kpi-value{font-size:27px;line-height:1;letter-spacing:-1px;font-weight:600;font-variant-numeric:tabular-nums}\r\n#reu-roue-wp .kpi-label{font-size:8px;font-weight:700;letter-spacing:.09em;margin-top:7px}\r\n#reu-roue-wp .crumbs{padding:0;box-shadow:none;background:none;border:none;border-radius:0;gap:2px;width:100%}\r\n#reu-roue-wp .crumb{font-size:9px;max-width:190px;padding:4px 0;white-space:normal;line-height:1.5}\r\n#reu-roue-wp .crumb:not(.is-current){color:#5f7c80}\r\n#reu-roue-wp .crumb-sep{margin:0 3px}\r\n#reu-roue-wp .explore-list{margin-top:6px;display:flex;flex-direction:column;gap:2px;min-height:0;flex:1;overflow:auto;scrollbar-width:thin}\r\n#reu-roue-wp .explore-item{display:flex;align-items:center;gap:9px;padding:7px 8px;border:0;border-radius:8px;background:none;text-align:left;cursor:pointer;font:inherit;font-size:10px;line-height:1.4;color:var(--text-color);transition:background .25s,transform .3s var(--ease);min-height:30px;flex-shrink:0}\r\n#reu-roue-wp .explore-item:hover,#reu-roue-wp .explore-item.is-hovered{background:#eaf0ea;transform:translateX(3px)}\r\n#reu-roue-wp .explore-swatch{width:8px;height:8px;border-radius:3px;background:var(--swatch);flex:none}\r\n#reu-roue-wp .explore-name{flex:1}\r\n#reu-roue-wp .explore-count{color:#7b8d90;font-size:9px;font-variant-numeric:tabular-nums}\r\n#reu-roue-wp .explore-arrow{font-size:12px;color:#7b8d90;margin-left:2px}\r\n#reu-roue-wp .reading-note{display:flex;align-items:center;gap:10px;border-top:1px solid var(--border-color);margin-top:12px;padding-top:12px;flex-shrink:0}\r\n#reu-roue-wp .reading-note p{margin:0;font-size:9px;color:var(--muted-text);line-height:1.6}\r\n#reu-roue-wp .reading-icon{display:grid;place-items:center;border-radius:50%;width:26px;height:26px;flex:none;background:#eaf0e9;color:#638477;font-size:14px}\r\n#reu-roue-wp #chart-container{min-height:0;overflow:hidden}\r\n#reu-roue-wp #chart-container>svg{position:absolute;inset:0}\r\n#reu-roue-wp .stage-heading{position:absolute;left:30px;right:30px;top:20px;display:flex;justify-content:space-between;gap:16px;pointer-events:none;z-index:1;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;color:#7c8c8e}\r\n#reu-roue-wp .stage-index{font-size:9px;letter-spacing:.08em;font-variant-numeric:tabular-nums}\r\n#reu-roue-wp .stage-caption{position:absolute;bottom:16px;left:0;right:0;display:flex;align-items:center;justify-content:center;gap:10px;font-size:9px;color:#7a8a8c;pointer-events:none;letter-spacing:.02em}\r\n#reu-roue-wp .caption-line{height:1px;width:24px;background:#aebdb5}\r\n#reu-roue-wp .chart-loading{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--muted-text)}\r\n#reu-roue-wp .chart-loading>span{width:18px;height:18px;border:2px solid #dbe5dc;border-top-color:#678b7a;border-radius:50%;animation:fisSpin 1s linear infinite}\r\n#reu-roue-wp .app-footer{height:38px;flex:none;border-top:1px solid var(--border-color);display:flex;align-items:center;justify-content:space-between;gap:20px;padding:0 32px;background:#fafaf7;font-size:9px;color:#79888b}\r\n#reu-roue-wp .footer-signature{letter-spacing:.03em;color:#4e666b;font-weight:600}\r\n#reu-roue-wp .footer-signature i{font-style:normal;margin:0 8px;color:#b6c1ba}\r\n#reu-roue-wp #fullscreen-btn{display:flex;align-items:center;gap:7px;padding:5px 0;border:none;background:none;font:inherit;color:var(--muted-text);cursor:pointer}\r\n#reu-roue-wp path.arc{stroke:#faf9f5;stroke-width:2;transition:filter .28s,opacity .3s;outline:none}\r\n#reu-roue-wp path.arc:hover,#reu-roue-wp path.arc.is-hovered{filter:brightness(1.045) saturate(1.08)}\r\n#reu-roue-wp path.arc.is-muted{opacity:.55}\r\n#reu-roue-wp path.arc:focus-visible{stroke:#203e49;stroke-width:3}\r\n#reu-roue-wp path.arc.is-selected{stroke:#203e49;stroke-width:3}\r\n#reu-roue-wp text.label{font-weight:600;stroke-width:0;letter-spacing:-.2px}\r\n#reu-roue-wp .wheel-orbit{fill:none;stroke:#dce3dc;stroke-width:1;pointer-events:none}\r\n#reu-roue-wp .wheel-tick{stroke:#b5c5be;stroke-width:1;pointer-events:none}\r\n#reu-roue-wp .center-hit{filter:drop-shadow(0 5px 12px #203d4910);transition:fill .3s}\r\n#reu-roue-wp .center-hit:hover{fill:#f0f4ed}\r\n#reu-roue-wp .tooltip{background:#213e49f5;border:1px solid #ffffff26;box-shadow:0 12px 30px #213e4920;border-radius:12px;padding:14px 16px;font-size:11px;line-height:1.6;max-width:300px;transition:opacity .16s;backdrop-filter:blur(12px)}\r\n#reu-roue-wp .tooltip strong{font-size:13px;font-weight:700}\r\n#reu-roue-wp .tooltip em{font-size:10px}\r\n#reu-roue-wp .detail{position:absolute;right:16px;top:14px;bottom:14px;width:370px;max-width:calc(100% - 32px);margin:0;padding:24px;background:#fffffdf7;border:1px solid #dfe5df;border-radius:18px;box-shadow:0 24px 70px #1d3c4924;z-index:25;backdrop-filter:blur(20px);opacity:0;transform:translateX(30px);pointer-events:none;display:block;visibility:hidden;transition:transform .48s var(--ease),opacity .35s,visibility .48s}\r\n#reu-roue-wp .detail.is-open{visibility:visible;opacity:1;transform:translateX(0);pointer-events:auto;animation:none}\r\n#reu-roue-wp .detail-close{width:30px;height:30px;background:#edf1eb;font-weight:400}\r\n#reu-roue-wp .detail-title{font-size:24px;letter-spacing:-.7px;margin-top:16px;font-weight:700}\r\n#reu-roue-wp .detail-porteur{font-size:12px;line-height:1.6;margin-top:7px;font-weight:500}\r\n#reu-roue-wp .detail-stat{background:#f5f7f1;border-color:#e6ebe3;padding:12px}\r\n#reu-roue-wp .detail-stat b{font-size:18px;font-weight:600}\r\n#reu-roue-wp .detail-stat--text b{font-size:12px;line-height:1.6}\r\n#reu-roue-wp .detail-stat span{font-size:8px;margin-top:5px}\r\n#reu-roue-wp .detail-resume{background:#f9faf6;font-size:12px;line-height:1.75}\r\n#reu-roue-wp .radar-modes{border-radius:10px;box-shadow:none;background:#eef2eb;padding:4px}\r\n#reu-roue-wp .rmode{font-size:10px;border-radius:7px}\r\n#reu-roue-wp .rmode.active{background:#203e49}\r\n#reu-roue-wp .legend{box-shadow:none;background:#fbfcf8;border-color:#e0e7df;border-radius:12px;bottom:20px;left:20px;max-width:210px;max-height:44vh;padding:14px}\r\n#reu-roue-wp .legend-title{font-size:8px}\r\n#reu-roue-wp .legend-item{font-size:10px}\r\n#reu-roue-wp .legend-dot{width:8px;height:8px;border-radius:3px}\r\n#reu-roue-wp .legend-count{font-size:9px}\r\n#reu-roue-wp .freins-bars{padding:48px 35px 35px !important;justify-content:center;gap:8px}\r\n#reu-roue-wp .fb-row{padding:14px 0;border-bottom:1px solid #e3e8df}\r\n#reu-roue-wp .fb-track{height:8px;background:#e9eee6}\r\n#reu-roue-wp .fb-fill{background:linear-gradient(90deg,#92b3a0,#345e66);border-radius:8px;animation:fisBar .65s var(--ease);transform-origin:left}\r\n#reu-roue-wp .flora-grid{top:50px !important;bottom:14px;left:0;right:0;padding:0 26px 20px;display:block}\r\n#reu-roue-wp .fg-intro{position:static;max-height:none !important;overflow:visible;padding:0;margin-bottom:20px}\r\n#reu-roue-wp .fg-caption{font-size:11px;max-width:80ch;line-height:1.8}\r\n#reu-roue-wp .fg-key{flex-direction:row;background:#f0f4ec;border-color:#e2e7df;gap:8px 15px;padding:12px}\r\n#reu-roue-wp .fg-key li{font-size:10px}\r\n#reu-roue-wp .fg-cards{grid-template-columns:repeat(auto-fill,minmax(142px,1fr));gap:12px}\r\n#reu-roue-wp .fg-card{background:#fffffc;border:1px solid #e4e8df;border-radius:12px;padding:16px 10px;transition:transform .35s var(--ease),box-shadow .35s,border-color .25s;animation:fisReveal .55s var(--ease) both}\r\n#reu-roue-wp .fg-card:hover{transform:translateY(-4px);box-shadow:0 12px 24px #203e4910}\r\n#reu-roue-wp .fg-card .fg-glyph-box{width:94px;height:94px}\r\n#reu-roue-wp .fg-name{font-weight:700;font-size:11px}\r\n#reu-roue-wp .fg-proj{font-size:9px;line-height:1.5;min-height:2.8em}\r\n#reu-roue-wp .fg-theme{margin:24px 0 10px;font-size:9px;letter-spacing:.09em}\r\n#reu-roue-wp .fg-theme-count{font-size:9px;font-weight:500}\r\n#reu-roue-wp .legend.is-inline{margin:12px 0 0;max-width:290px}\r\n#reu-roue-wp .legend.is-menu .legend-trigger{font-size:11px;border-color:#dfe7dd;background:#fff}\r\n#reu-roue-wp .legend.is-menu .legend-item{font-size:11px}\r\n#reu-roue-wp path.radar-area{fill:#739c862d;stroke:#416f69;stroke-width:2}\r\n#reu-roue-wp circle.radar-pt{fill:#416f69}\r\n#reu-roue-wp .header .legend{position:static;max-height:none;max-width:none;overflow:visible;margin:14px 0;padding:10px;flex-shrink:0;width:100%}\r\n#reu-roue-wp .header .legend-list{gap:5px}\r\n@keyframes fisReveal{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}\r\n@keyframes fisBar{from{transform:scaleX(0)}to{transform:scaleX(1)}}\r\n@keyframes fisSpin{to{transform:rotate(360deg)}}\r\n@media(min-width:1550px){\r\n #reu-roue-wp .header{width:350px;flex-basis:350px;padding:44px 30px 24px 44px}\r\n #reu-roue-wp .intro h1{font-size:36px} #reu-roue-wp .map-subtitle{font-size:13px}\r\n #reu-roue-wp .explore-item{font-size:12px;min-height:38px}\r\n #reu-roue-wp .kpi-row{padding:20px 0} #reu-roue-wp .kpi-value{font-size:34px}\r\n}\r\n@media(max-height:760px) and (min-width:861px){\r\n #reu-roue-wp .header{padding-top:24px} #reu-roue-wp .intro h1{font-size:28px;margin-bottom:10px}\r\n #reu-roue-wp .eyebrow{margin-bottom:10px} #reu-roue-wp .map-subtitle{margin-bottom:14px}\r\n #reu-roue-wp .kpi-row{padding:10px 0} #reu-roue-wp .explore-item{padding:5px 8px;min-height:27px}\r\n #reu-roue-wp .reading-note{margin-top:8px;padding-top:8px}\r\n}\r\n@media(max-width:1100px){\r\n #reu-roue-wp .brand-row{padding:0 20px;gap:16px} #reu-roue-wp .edition>span{display:none}\r\n #reu-roue-wp .toggle-btn{padding:9px 10px} #reu-roue-wp .toggle-btn::before{margin-right:5px}\r\n #reu-roue-wp .header{width:265px;flex-basis:265px;padding-left:24px;padding-right:18px}\r\n #reu-roue-wp .intro h1{font-size:28px} #reu-roue-wp .brand .amp-logo{height:23px}\r\n}\r\n@media(max-width:860px){\r\n #reu-roue-wp .brand-row{height:108px;padding:12px 20px 55px;flex-wrap:wrap;gap:10px;justify-content:space-between}\r\n #reu-roue-wp .brand{gap:12px} #reu-roue-wp .brand .shl-logo{height:20px} #reu-roue-wp .brand .amp-logo{height:23px}\r\n #reu-roue-wp .edition{margin-left:auto} #reu-roue-wp .edition>span{display:block;font-size:8px}\r\n #reu-roue-wp .toggle-group{position:absolute;bottom:8px;left:20px;right:20px;max-width:none;justify-content:center}\r\n #reu-roue-wp .toggle-btn{flex:1;font-size:10px;padding:7px 6px}\r\n #reu-roue-wp .main-content{flex-direction:column}\r\n #reu-roue-wp .header{width:100%;flex:0 0 auto;max-height:164px;padding:18px 22px 12px;border-right:0;border-bottom:1px solid #e5e9e2;display:grid;grid-template-columns:1fr auto;gap:8px 16px;overflow:visible}\r\n #reu-roue-wp .intro{grid-column:1}.intro{min-width:0}\r\n #reu-roue-wp .eyebrow{font-size:8px;margin-bottom:7px}\r\n #reu-roue-wp .intro h1{font-size:23px;margin:0;letter-spacing:-.8px} #reu-roue-wp .intro h1 br{display:none}\r\n #reu-roue-wp .intro h1 span{display:block} #reu-roue-wp .map-subtitle{display:none}\r\n #reu-roue-wp .toolbar{grid-column:2;grid-row:1 \/ span 2;align-items:flex-end;max-width:130px;gap:6px}\r\n #reu-roue-wp .kpi-row{border:0;margin:0;padding:8px 0;gap:14px} #reu-roue-wp .kpi{padding:0;flex:none !important}\r\n #reu-roue-wp .kpi+.kpi{border:0} #reu-roue-wp .kpi-value{font-size:23px} #reu-roue-wp .kpi-label{font-size:7px;letter-spacing:.03em}\r\n #reu-roue-wp .crumbs{display:none} #reu-roue-wp .explore-list{display:none} #reu-roue-wp .reading-note{grid-column:1;border:0;margin:0;padding:0;gap:6px}\r\n #reu-roue-wp .reading-icon{display:none} #reu-roue-wp .reading-note p{font-size:8px;max-width:38ch}\r\n #reu-roue-wp .stage-heading{top:16px;left:20px;right:20px;font-size:8px} #reu-roue-wp .stage-caption{font-size:8px;bottom:12px;padding:0 15px;text-align:center}\r\n #reu-roue-wp .app-footer{padding:0 20px;height:34px;font-size:8px;gap:8px} #reu-roue-wp .footer-signature i{margin:0 3px}\r\n #reu-roue-wp #data-source{display:none}\r\n #reu-roue-wp .detail{inset:auto 10px 10px;width:auto;max-width:none;max-height:75%;padding:20px;transform:translateY(24px)}\r\n #reu-roue-wp .detail.is-open{transform:translateY(0)}\r\n #reu-roue-wp .header .legend{position:absolute;right:20px;left:auto;top:95px;width:210px;max-height:45vh;overflow:auto;margin:0;padding:6px 10px;background:#fff}\r\n #reu-roue-wp .legend.is-menu .legend-title{display:none}\r\n #reu-roue-wp .flora-grid{padding:0 18px 24px;top:44px !important} #reu-roue-wp .fg-cards{grid-template-columns:repeat(auto-fill,minmax(124px,1fr))}\r\n #reu-roue-wp .freins-bars{padding:50px 20px 24px !important;justify-content:flex-start}\r\n #reu-roue-wp .fb-row{padding:10px 0} #reu-roue-wp .fb-label{font-size:11px}\r\n}\r\n@media(max-width:390px){#reu-roue-wp .edition>span{display:none}#reu-roue-wp .toggle-btn::before{display:none}#reu-roue-wp .intro h1{font-size:21px}#reu-roue-wp .header{padding-left:16px;padding-right:16px}}\r\n@media(prefers-reduced-motion:reduce){\r\n #reu-roue-wp *,#reu-roue-wp *::before,#reu-roue-wp *::after{animation-duration:.01ms !important;animation-delay:0ms !important;transition-duration:.01ms !important;scroll-behavior:auto !important}\r\n}\r\n\r\n\r\n\/* Ajustements issus des essais sur ordinateur et t\u00e9l\u00e9phone. *\/\r\n\/* Le coeur de la roue est un <circle> qui porte role=\"button\" : la r\u00e8gle\r\n   g\u00e9n\u00e9rique de focus lui dessinait son liser\u00e9 RECTANGULAIRE autour de la bo\u00eete\r\n   englobante, soit un carr\u00e9 pos\u00e9 sur un disque, que l'on voyait appara\u00eetre au\r\n   moindre clic au centre. L'outline est coup\u00e9e pour de bon (y compris sur\r\n   :focus simple, que certains navigateurs servent au clic), et le focus clavier\r\n   est rendu dans le SVG, par un anneau concentrique qui \u00e9pouse le disque. *\/\r\n#reu-roue-wp circle.center-hit:focus{outline:none !important}\r\n#reu-roue-wp circle.center-hit:focus-visible{outline:none !important;stroke:#203e49;stroke-width:2}\r\n#reu-roue-wp circle.center-hit:focus:not(:focus-visible){stroke:#e2e7df;stroke-width:1}\r\n#reu-roue-wp .header .legend-list{gap:3px}\r\n#reu-roue-wp .legend-item{border:0;border-radius:5px}\r\n#reu-roue-wp .legend-item.is-on{background:#e9efe7}\r\n#reu-roue-wp .chart-loading{max-width:320px;text-align:center;padding:20px;line-height:1.7}\r\n@media(max-width:860px){\r\n #reu-roue-wp .header{max-height:none;grid-template-columns:minmax(0,1fr) auto;gap:10px 12px}\r\n #reu-roue-wp .toolbar{display:contents}\r\n #reu-roue-wp .intro{grid-row:1;grid-column:1}\r\n #reu-roue-wp .kpi-row{grid-column:2;grid-row:1;width:auto;align-self:center}\r\n #reu-roue-wp .reading-note{grid-column:1 \/ -1;grid-row:2}\r\n #reu-roue-wp .reading-note p{max-width:none}\r\n #reu-roue-wp .radar-modes{grid-column:1;grid-row:3;justify-self:start;white-space:nowrap;align-self:center;gap:0}\r\n #reu-roue-wp .rmode{padding:7px 8px;font-size:9px}\r\n #reu-roue-wp .header .legend{position:relative;inset:auto;grid-column:2;grid-row:3;width:166px;max-width:none;max-height:none;padding:0;border:0;overflow:visible;margin:0;background:none}\r\n #reu-roue-wp .legend.is-menu .legend-trigger{padding:8px;font-size:9px;min-height:34px;gap:5px}\r\n #reu-roue-wp .legend.is-menu.is-open .legend-list{position:absolute;right:0;top:calc(100% + 5px);width:246px;max-height:42vh;overflow:auto;background:#fffffc;padding:10px;border:1px solid #dfe7dd;border-radius:12px;box-shadow:0 15px 35px #203e4920;z-index:45}\r\n #reu-roue-wp .legend.is-menu .legend-item{font-size:11px;min-height:31px}\r\n #reu-roue-wp .fb-val{grid-column:3;grid-row:1}\r\n #reu-roue-wp .fb-track{grid-row:2}\r\n #reu-roue-wp text.radar-axis{font-size:10px}\r\n #reu-roue-wp text.radar-ring{font-size:9px}\r\n #reu-roue-wp[data-view=\"fleurs\"] .header .legend{grid-column:1 \/ -1;width:100%;max-width:230px;justify-self:start}\r\n}\r\n\r\n\/* Fiches : une lecture \u00e9ditoriale, avec rep\u00e8res et commandes persistants. *\/\r\n#reu-roue-wp .detail{width:clamp(430px,43vw,610px);padding:0;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 24px 90px #1d3c492b;transition:transform .48s var(--ease),opacity .35s,visibility .48s,width .4s var(--ease)}\r\n#reu-roue-wp .detail.is-open{display:flex}\r\n#reu-roue-wp .detail.is-expanded{width:min(780px,calc(100% - 32px))}\r\n#reu-roue-wp .detail-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px 24px 12px;background:#fffefb;flex:none}\r\n#reu-roue-wp .detail-theme{max-width:calc(100% - 85px);font-size:9px;line-height:1.5;letter-spacing:.08em;color:var(--theme-color-text);font-weight:800}\r\n#reu-roue-wp .detail-theme .legend-dot{width:9px;height:9px;flex:none;background:var(--theme-color)}\r\n#reu-roue-wp .detail-controls{display:flex;align-items:center;gap:6px;flex:none}\r\n#reu-roue-wp .detail-close,#reu-roue-wp .detail-expand{float:none;width:32px;height:32px;display:grid;place-items:center;flex:none;border:1px solid #e3e9df;background:#f5f7f1;border-radius:9px;color:#435d61;cursor:pointer;transition:background .2s,transform .2s;font-size:21px;font-weight:400;line-height:1;padding:0}\r\n#reu-roue-wp .detail-close:hover,#reu-roue-wp .detail-expand:hover{background:#e9efe5;transform:translateY(-1px)}\r\n#reu-roue-wp .detail-expand[aria-pressed=\"true\"]{background:#203e49;color:#fff}\r\n#reu-roue-wp .detail-nav{display:flex;align-items:center;gap:5px;flex:none;border-bottom:1px solid #e1e7dd;padding:0 24px;background:#fffefb}\r\n#reu-roue-wp .detail-nav button{flex:1;font:inherit;font-size:10px;font-weight:600;white-space:nowrap;color:#6b7d80;padding:12px 5px 13px;background:none;border:0;border-bottom:2px solid transparent;cursor:pointer;transition:color .2s,border-color .2s}\r\n#reu-roue-wp .detail-nav button:hover{color:#203e49}\r\n#reu-roue-wp .detail-nav button[aria-current]{color:#203e49;border-color:var(--theme-color-text);font-weight:800}\r\n#reu-roue-wp .detail-body{position:relative;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:#ccd8cc transparent;padding:28px 30px 24px;min-height:0;flex:1;outline-offset:-3px}\r\n#reu-roue-wp .detail-eyebrow{display:flex;align-items:center;gap:12px;font-size:9px;letter-spacing:.12em;text-transform:uppercase;font-weight:700;color:#6f8585;margin:0 0 12px}\r\n#reu-roue-wp .detail-eyebrow span{margin-left:auto;font-weight:500;font-size:9px;letter-spacing:.04em;color:#81908c}\r\n#reu-roue-wp .detail-title{font-size:clamp(22px,2.15vw,31px);line-height:1.18;letter-spacing:-.85px;font-weight:750;margin:0 0 12px;overflow-wrap:anywhere;text-wrap:balance}\r\n#reu-roue-wp .detail-project-name{font-size:14px;font-weight:550;line-height:1.65;margin:0 0 14px;color:#415961;overflow-wrap:anywhere;text-wrap:pretty}\r\n#reu-roue-wp .detail-territory{display:flex;align-items:flex-start;gap:8px;font-size:11px;line-height:1.65;color:#6c7f80;margin:0 0 14px}\r\n#reu-roue-wp .detail-territory svg{flex:none;margin-top:1px;color:#7e968d}\r\n\r\n\/* ---------- pastille d'identit\u00e9 du porteur ----------\r\n   Les logos ramen\u00e9s du web n'ont ni le m\u00eame format, ni le m\u00eame fond, ni la\r\n   m\u00eame densit\u00e9 : pos\u00e9s tels quels, ils feraient une t\u00eate de fiche bariol\u00e9e.\r\n   Chacun a donc \u00e9t\u00e9 recadr\u00e9 \u00e0 l'avance sur un carr\u00e9 transparent unique, avec\r\n   une marge optique constante \u2014 une marque carr\u00e9e respire, un logotype tr\u00e8s\r\n   large a le droit d'aller plus pr\u00e8s du bord, sinon il para\u00eetrait deux fois\r\n   plus petit que ses voisins. La pastille n'a donc pas \u00e0 rattraper quoi que\r\n   ce soit ici : elle pose le cadre, le fichier pose la marge.\r\n   Quand l'association n'a pas de logo public, la case n'est pas laiss\u00e9e\r\n   vide : elle porte un monogramme dans la couleur de la th\u00e9matique, au m\u00eame\r\n   gabarit, pour que la t\u00eate de fiche garde le m\u00eame aplomb d'un projet \u00e0\r\n   l'autre. *\/\r\n#reu-roue-wp .detail-ident{display:flex;align-items:flex-start;gap:14px;margin:0 0 14px}\r\n#reu-roue-wp .detail-ident-text{flex:1;min-width:0}\r\n#reu-roue-wp .detail-ident .detail-project-name{margin-bottom:0}\r\n#reu-roue-wp .detail-logo{position:relative;flex:none;display:grid;place-items:center;width:62px;height:62px;border-radius:14px;background:var(--ui-surface);border:1px solid var(--ui-line);box-shadow:0 1px 2px rgba(22,38,44,.05);overflow:hidden;animation:identIn .42s cubic-bezier(.22,1,.36,1) .2s both}\r\n#reu-roue-wp .detail-logo img{width:100%;height:100%;object-fit:contain;display:block}\r\n#reu-roue-wp .detail-logo--mono{background:var(--ui-sunk);border-color:transparent}\r\n#reu-roue-wp .detail-logo--mono::before{content:\"\";position:absolute;inset:0;background:var(--theme-color,#1f4a4d);opacity:.14}\r\n#reu-roue-wp .detail-logo--mono b{position:relative;font-size:19px;font-weight:800;letter-spacing:.01em;line-height:1;color:var(--theme-color-text,var(--ui-accent))}\r\n@keyframes identIn{from{opacity:0;transform:translateY(7px) scale(.96)}to{opacity:1;transform:none}}\r\n#reu-roue-wp .detail.is-expanded .detail-logo{width:72px;height:72px;border-radius:16px}\r\n#reu-roue-wp .detail.is-expanded .detail-logo--mono b{font-size:22px}\r\n#reu-roue-wp .detail-topics{margin:0;color:#647977;font-size:10px;line-height:1.6}\r\n#reu-roue-wp .detail-topics summary{cursor:pointer;width:fit-content;padding:4px 0;font-weight:650;list-style-position:inside}\r\n#reu-roue-wp .detail-topics summary span{display:inline-grid;place-items:center;min-width:18px;height:18px;border-radius:5px;background:#edf2e8;margin-left:5px;font-size:9px}\r\n#reu-roue-wp .detail-topics ul{margin:8px 0 0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:6px}\r\n#reu-roue-wp .detail-topics li{padding:7px 10px;background:#f3f6ef;border:1px solid #e5ebdf;border-radius:7px;max-width:100%}\r\n#reu-roue-wp .detail-section{padding-top:25px;margin-top:25px;border-top:1px solid #e2e8dd;scroll-margin-top:20px;outline:none}\r\n#reu-roue-wp .detail-section-title{display:flex;align-items:center;gap:10px;font-size:14px;font-weight:750;letter-spacing:-.2px;line-height:1.4;margin:0 0 17px;color:#203e49}\r\n#reu-roue-wp .detail-section-title>span{display:grid;place-items:center;width:25px;height:25px;border:1px solid #dfe7d9;border-radius:8px;font-size:9px;font-weight:650;letter-spacing:.02em;color:#718877;flex:none;background:#f6f8f1}\r\n#reu-roue-wp .detail-prose{font-size:12px;font-weight:450;line-height:1.8;color:#3c525a;overflow-wrap:anywhere;text-wrap:pretty;white-space:normal}\r\n#reu-roue-wp .detail-prose p{font:inherit;line-height:inherit;color:inherit;white-space:normal;margin:0 0 12px}\r\n#reu-roue-wp .detail-prose p:last-child{margin-bottom:0}\r\n#reu-roue-wp .detail-summary{border-left:2px solid var(--theme-color);padding-left:16px;font-size:13px;line-height:1.85}\r\n#reu-roue-wp .detail-empty,#reu-roue-wp .detail-prose .detail-empty{font-size:11px;color:#7a8988;font-style:italic;line-height:1.6}\r\n#reu-roue-wp .detail-stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:0 0 24px}\r\n#reu-roue-wp .detail-stat{display:flex;flex-direction:column;gap:8px;padding:14px 12px;border-radius:10px;background:#f6f8f1;border:1px solid #e5ebdf;min-width:0}\r\n#reu-roue-wp .detail-stat:first-child{background:#edf3e8;border-color:#dce6d3}\r\n#reu-roue-wp .detail-stat span{font-size:8px;line-height:1.4;letter-spacing:.07em;font-weight:700;margin:0;color:#718075}\r\n#reu-roue-wp .detail-stat b{font-size:clamp(15px,1.35vw,20px);line-height:1.15;font-weight:650;letter-spacing:-.5px;white-space:nowrap;color:#203e49;font-variant-numeric:tabular-nums}\r\n#reu-roue-wp .detail-stat.is-empty b{font-size:11px;letter-spacing:0;white-space:normal;font-weight:500;color:#7a8988}\r\n#reu-roue-wp .detail-narrative+.detail-narrative{border-top:1px solid #edf0e8;padding-top:18px;margin-top:18px}\r\n#reu-roue-wp .detail-narrative h4{font-size:10px;letter-spacing:.06em;font-weight:800;text-transform:uppercase;color:#496167;margin:0 0 9px;line-height:1.5}\r\n#reu-roue-wp .detail-prose-list{padding:0;margin:0;list-style:none;display:flex;flex-direction:column;gap:9px}\r\n#reu-roue-wp .detail-prose-list li{position:relative;padding-left:15px}\r\n#reu-roue-wp .detail-prose-list li::before{content:\"\";width:4px;height:4px;position:absolute;left:1px;top:.8em;border-radius:50%;background:var(--theme-color-text,#688879);opacity:.65}\r\n\/* ---------- les moyens en bulles, en t\u00eate de fiche ---------- *\/\r\n#reu-roue-wp .detail-bubbles{display:flex;flex-wrap:wrap;gap:8px;margin:0}\r\n#reu-roue-wp .detail-bubble{display:flex;flex-direction:column;gap:5px;min-width:0;max-width:100%;padding:11px 16px;border-radius:18px;background:#f6f8f1;border:1px solid #e5ebdf}\r\n#reu-roue-wp .detail-bubble.is-key{background:#edf3e8;border-color:#dce6d3}\r\n#reu-roue-wp .detail-bubble .db-key{font-size:8px;line-height:1.4;letter-spacing:.07em;font-weight:700;text-transform:uppercase;color:#718075}\r\n#reu-roue-wp .detail-bubble .db-val{font-size:clamp(15px,1.3vw,19px);line-height:1.15;font-weight:650;letter-spacing:-.5px;white-space:nowrap;color:#203e49;font-variant-numeric:tabular-nums}\r\n#reu-roue-wp .detail-bubble.is-long{flex-basis:100%;border-radius:14px}\r\n#reu-roue-wp .detail-bubble.is-long .db-val{font-size:12px;line-height:1.65;letter-spacing:0;font-weight:550;white-space:normal;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}\r\n#reu-roue-wp .detail-bubble.is-empty{background:#fbfbf8;border-style:dashed}\r\n#reu-roue-wp .detail-bubble.is-empty .db-val{font-size:11px;letter-spacing:0;white-space:normal;font-weight:500;color:#7a8988}\r\n#reu-roue-wp .detail-section.is-lead{padding-bottom:4px}\r\n#reu-roue-wp .detail-section-intro{font-size:11px;line-height:1.75;margin:-3px 0 16px;color:#6d8080;max-width:64ch}\r\n\/* ---------- les trois promesses, dans la fiche ---------- *\/\r\n#reu-roue-wp .pr-score{font-size:10px;letter-spacing:.04em;font-weight:700;color:#718075;margin:0 0 12px}\r\n#reu-roue-wp .detail-promesses{list-style:none;margin:0;padding:0;display:grid;gap:10px}\r\n#reu-roue-wp .pr-item{position:relative;padding:14px 16px 15px;border:1px solid #e5ebdf;border-left:3px solid var(--pc);border-radius:11px;background:#fdfdfa;transition:border-color .25s,background .25s,transform .25s var(--ease)}\r\n#reu-roue-wp .pr-item:hover{transform:translateX(2px);background:#fffefb}\r\n#reu-roue-wp .pr-item.is-none{border-left-color:#dbe1d8;background:#fafbf7}\r\n#reu-roue-wp .pr-head{display:flex;align-items:center;gap:8px;margin:0 0 5px;font-size:12px;font-weight:800;letter-spacing:-.1px;color:var(--pc-text)}\r\n#reu-roue-wp .pr-item.is-none .pr-head{color:#8c9a92}\r\n#reu-roue-wp .pr-dot{width:8px;height:8px;border-radius:50%;background:var(--pc);flex:none}\r\n#reu-roue-wp .pr-item.is-none .pr-dot{background:none;border:1.5px solid #c6d0c6}\r\n#reu-roue-wp .pr-phrase{margin:0 0 9px;font-size:10px;line-height:1.6;font-style:italic;color:#7d8d8a}\r\n#reu-roue-wp .pr-text{font-size:12px;line-height:1.8;color:#3c525a}\r\n#reu-roue-wp .pr-text p{margin:0 0 8px}\r\n#reu-roue-wp .pr-text p:last-child{margin:0}\r\n#reu-roue-wp .detail-confid{margin:28px 0 0;padding:20px 0 0;border-top:1px solid #e2e8dd;font-size:10px;line-height:1.8;font-style:normal;color:#7b8987}\r\n#reu-roue-wp .detail-confid strong{font-size:9px;letter-spacing:.06em;text-transform:uppercase;color:#5f7471}\r\n#reu-roue-wp .detail-confid p{margin:8px 0 0}\r\n#reu-roue-wp .detail-data-note{font-style:italic}\r\n#reu-roue-wp .detail.is-expanded .detail-body{padding:32px 48px}\r\n#reu-roue-wp .detail.is-expanded .detail-prose{font-size:14px;line-height:1.85}\r\n#reu-roue-wp .detail.is-expanded .detail-title{font-size:32px}\r\n@media(max-width:860px){\r\n #reu-roue-wp .detail,#reu-roue-wp .detail.is-expanded{width:auto;inset:10px;max-width:none;max-height:none;border-radius:16px}\r\n #reu-roue-wp .detail-toolbar{padding:12px 18px 9px}\r\n #reu-roue-wp .detail-expand{display:none}\r\n #reu-roue-wp .detail-nav{padding:0 14px;gap:0}\r\n #reu-roue-wp .detail-nav button{font-size:10px;padding:11px 4px}\r\n #reu-roue-wp .detail-body,#reu-roue-wp .detail.is-expanded .detail-body{padding:22px 20px}\r\n #reu-roue-wp .detail-title,#reu-roue-wp .detail.is-expanded .detail-title{font-size:25px}\r\n #reu-roue-wp .detail-project-name{font-size:12px}\r\n #reu-roue-wp .detail-ident{gap:11px}\r\n #reu-roue-wp .detail-logo,#reu-roue-wp .detail.is-expanded .detail-logo{width:52px;height:52px;border-radius:12px}\r\n #reu-roue-wp .detail-logo--mono b,#reu-roue-wp .detail.is-expanded .detail-logo--mono b{font-size:16px}\r\n #reu-roue-wp .detail-prose,#reu-roue-wp .detail-summary,#reu-roue-wp .detail.is-expanded .detail-prose{font-size:12px;line-height:1.8}\r\n #reu-roue-wp .detail-stats{gap:5px}\r\n #reu-roue-wp .detail-stat{padding:12px 8px}\r\n #reu-roue-wp .detail-stat b{font-size:15px}\r\n #reu-roue-wp .detail-stat span{font-size:7px;letter-spacing:.03em}\r\n #reu-roue-wp .detail-stat.is-empty b{font-size:10px}\r\n}\r\n\r\n\r\n\/* Le panneau occupe tout le cadre de la visualisation, sous le bandeau de\r\n   rubrique, comme la galerie des fleurs et les barres de freins. *\/\r\n#reu-roue-wp .stage-panel{position:absolute;inset:0;top:50px;overflow:hidden;padding:0.3rem 1rem 0.9rem;z-index:3}\r\n#reu-roue-wp .stage-panel[hidden]{display:none}\r\n\r\n\/* ---------- les trois \u00e9tages : une lecture en volume des promesses --------- *\/\r\n\/* Trois plans isom\u00e9triques, un par promesse du fonds, et sur chacun les\r\n   structures du corpus. Cinq partis pris, qui tiennent ensemble :\r\n\r\n   1. Une structure garde la M\u00caME case sur les trois \u00e9tages. Une fleur revient\r\n      donc au m\u00eame endroit de l'\u00e9cran d'un \u00e9tage \u00e0 l'autre : on voit sans rien\r\n      compter qui tient les trois promesses et qui n'en tient qu'une.\r\n   2. Les 48 structures ont leur case sur CHAQUE plan. Celles qui documentent\r\n      la promesse y fleurissent, les autres n'y laissent qu'une empreinte au\r\n      sol : la densit\u00e9 d'un plan reste le taux de documentation, mais le\r\n      corpus entier est l\u00e0.\r\n   3. La fleur pos\u00e9e sur une case est celle de la galerie \u00ab Fleurs des assos \u00bb,\r\n      au trait pr\u00e8s. C'est par elle que les deux classeurs se rejoignent :\r\n      l'\u00e9tage dit quelle promesse la structure raconte, la fleur dit ce qu'elle\r\n      a produit.\r\n   4. On ne regarde qu'UN \u00e9tage \u00e0 la fois, en grand, les suivants empil\u00e9s\r\n      dessous en fuite. Trois plans entiers \u00e0 l'\u00e9cran, c'\u00e9tait trois fois trop\r\n      petit pour qu'une fleur se lise.\r\n   5. Le d\u00e9filement est la cam\u00e9ra. Un cran de molette et l'on descend d'un\r\n      \u00e9tage : celui qu'on quitte grandit et passe au-dessus de la t\u00eate, celui\r\n      qu'on rejoint monte et s'ouvre. En remontant, le mouvement s'inverse. *\/\r\n#reu-roue-wp .stage-panel.etages{\r\n    display: flex;\r\n    gap: 1rem;\r\n    padding: 0.3rem 1rem 0.9rem;\r\n    overflow: hidden;\r\n}\r\n@media (min-width: 1000px){\r\n    #reu-roue-wp .stage-panel.etages{ padding-left: 1rem; padding-right: 1.2rem; }\r\n}\r\n\r\n\/* ---- la cl\u00e9 de lecture : les marques du plan, montr\u00e9es ---- *\/\r\n\/* Chaque signe est montr\u00e9 \u00e0 c\u00f4t\u00e9 de ce qu'il veut dire, au lieu d'\u00eatre d\u00e9crit :\r\n   trois lignes \u00e0 la place d'un paragraphe de huit. *\/\r\n#reu-roue-wp .et-legende{\r\n    list-style: none;\r\n    margin: 0;\r\n    padding: 0;\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 0.35rem;\r\n}\r\n#reu-roue-wp .et-legende li{\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 0.5rem;\r\n    font-size: 0.75rem;\r\n    font-weight: 650;\r\n    line-height: 1.3;\r\n    color: var(--muted-text);\r\n}\r\n#reu-roue-wp .et-legende b{ color: var(--ink-strong); font-weight: 850; }\r\n#reu-roue-wp .et-legende .lg-marque{\r\n    flex: none;\r\n    width: 26px;\r\n    height: 26px;\r\n    display: block;\r\n    line-height: 0;\r\n}\r\n\/* M\u00eame remarque que pour les glyphes de la galerie : `#chart svg` \u00e9tire tout\r\n   ce qui tra\u00eene dans le cadre, il faut le viser d'aussi pr\u00e8s. *\/\r\n#reu-roue-wp #chart .lg-marque > svg{ display: block; width: 100%; height: 100%; }\r\n\r\n\r\n\/* ---- la piste : c'est elle qui d\u00e9file, et son d\u00e9filement EST la cam\u00e9ra ---- *\/\r\n\/* Un conteneur de d\u00e9filement natif plut\u00f4t qu'une molette intercept\u00e9e : on\r\n   h\u00e9rite de l'inertie du pav\u00e9 tactile, du glissement au doigt, des fl\u00e8ches du\r\n   clavier et de la molette, sans r\u00e9\u00e9crire aucun des quatre. Les crans de\r\n   `scroll-snap` font le reste : on ne s'arr\u00eate jamais entre deux \u00e9tages. *\/\r\n#reu-roue-wp .et-piste{\r\n    position: relative;\r\n    flex: 1;\r\n    min-width: 0;\r\n    overflow-y: auto;\r\n    overflow-x: hidden;\r\n    scroll-snap-type: y mandatory;\r\n    scroll-behavior: smooth;\r\n    scrollbar-width: none;\r\n    -ms-overflow-style: none;\r\n    border-radius: 16px;\r\n    border: 1px solid rgba(231, 223, 217, 0.85);\r\n    background:\r\n        radial-gradient(120% 78% at 50% 4%, rgba(255,255,255,0.96), rgba(247,244,240,0.55));\r\n    touch-action: pan-y;\r\n}\r\n#reu-roue-wp .et-piste::-webkit-scrollbar{ width: 0; height: 0; }\r\n#reu-roue-wp .et-piste:focus-visible{ outline: 2px solid rgba(36,71,109,0.45); outline-offset: -2px; }\r\n\/* La sc\u00e8ne reste coll\u00e9e en haut pendant que les crans d\u00e9filent sous elle. Sa\r\n   hauteur et sa marge n\u00e9gative sont pos\u00e9es en JS : une marge en pourcentage\r\n   se calculerait sur la LARGEUR du conteneur, ce qui n'a aucun sens ici. *\/\r\n#reu-roue-wp .et-colle{ position: sticky; top: 0; z-index: 1; }\r\n\/* Les crans sont des bo\u00eetes vides : ils ne servent qu'\u00e0 donner au conteneur\r\n   sa hauteur de d\u00e9filement et ses points d'arr\u00eat. Transparents aux clics,\r\n   sans quoi ils avaleraient les fleurs pos\u00e9es dessous. *\/\r\n#reu-roue-wp .et-pas{ scroll-snap-align: start; pointer-events: none; }\r\n\/* Le talon rallonge la course sans \u00eatre un point d'arr\u00eat : c'est lui qui rend\r\n   le dernier \u00e9tage atteignable quand un cran est plus court que le cadre. *\/\r\n#reu-roue-wp .et-queue{ pointer-events: none; }\r\n#reu-roue-wp #chart .et-colle > svg{ display: block; width: 100%; height: 100%; }\r\n\r\n\/* L'ombre port\u00e9e de la dalle sur le vide : elle ancre l'\u00e9tage dans l'espace au\r\n   lieu de le laisser en apesanteur. R\u00e9serv\u00e9e \u00e0 l'\u00e9tage de devant : port\u00e9e par\r\n   un plan qui s'\u00e9loigne ou qui remonte, elle s'en d\u00e9tachait et flottait au\r\n   milieu du cadre comme un disque gris sans cause. *\/\r\n#reu-roue-wp .et-ombre{ fill: rgba(19, 41, 63, 0.11); }\r\n#reu-roue-wp .et-tige{\r\n    fill: none;\r\n    stroke: var(--pr);\r\n    stroke-width: 1.6;\r\n    stroke-linecap: round;\r\n    opacity: 0.6;\r\n}\r\n\/* L'empreinte creuse d'une structure qui ne documente PAS la promesse de cet\r\n   \u00e9tage : sa case existe, elle reste vide. Le corpus entier est sur chaque\r\n   plan, et le blanc devient une information au lieu d'un oubli. *\/\r\n#reu-roue-wp .et-vide{\r\n    fill: var(--tc, #24476d);\r\n    fill-opacity: 0.17;\r\n    pointer-events: all;\r\n    stroke: var(--tc, rgba(36, 71, 109, 0.4));\r\n    stroke-width: 0.9;\r\n    stroke-opacity: 0.45;\r\n    vector-effect: non-scaling-stroke;\r\n    cursor: pointer;\r\n}\r\n#reu-roue-wp .et-vide:hover{ fill-opacity: 0.42; stroke-opacity: 1; }\r\n\/* Le halo au sol porte la couleur de la th\u00e9matique. Doubl\u00e9 d'un anneau quand\r\n   la structure tient les TROIS promesses : c'est ce que disait le fil vertical\r\n   des versions pr\u00e9c\u00e9dentes, qui n'a plus de sens d\u00e8s lors qu'on ne voit qu'un\r\n   \u00e9tage \u00e0 la fois. *\/\r\n#reu-roue-wp .et-anneau{\r\n    fill: none;\r\n    stroke: var(--pr);\r\n    stroke-width: 1.4;\r\n    opacity: 0.55;\r\n    vector-effect: non-scaling-stroke;\r\n}\r\n#reu-roue-wp .et-fleur{ cursor: pointer; }\r\n\/* L'\u00e9closion. C'est le mouvement qui fait l'\u00e9tage : quand un plan arrive au\r\n   premier plan, ses fleurs s'ouvrent, rang\u00e9e par rang\u00e9e, du fond vers l'avant.\r\n   Les plans en fuite gardent leurs fleurs ferm\u00e9es, plus petites : on voit\r\n   qu'ils sont habit\u00e9s sans que leur d\u00e9tail vienne parasiter l'\u00e9tage lu. *\/\r\n#reu-roue-wp .et-fleur .et-fleur-in{\r\n    transform: scale(0.7);\r\n    opacity: 0.82;\r\n    transform-origin: 0 0;\r\n    transition: transform 0.75s cubic-bezier(0.16, 1, 0.3, 1) var(--pousse, 0ms),\r\n                opacity 0.5s ease var(--pousse, 0ms);\r\n}\r\n#reu-roue-wp .et-etage.is-active .et-fleur .et-fleur-in{ transform: scale(1); opacity: 1; }\r\n#reu-roue-wp .et-etage.is-active .et-fleur:hover .et-fleur-in{\r\n    transform: scale(1.45);\r\n    transition-delay: 0ms;\r\n    transition-duration: 0.22s;\r\n}\r\n#reu-roue-wp .et-etage.is-active .et-fleur:hover .et-halo{ opacity: 0.6; }\r\n\r\n\r\n\/* ---- rep\u00e8res de descente ---- *\/\r\n#reu-roue-wp .et-indice{\r\n    position: absolute;\r\n    left: 50%;\r\n    bottom: 0.7rem;\r\n    transform: translateX(-50%);\r\n    z-index: 2;\r\n    margin: 0;\r\n    padding: 0.32rem 0.8rem;\r\n    border-radius: 999px;\r\n    background: rgba(255, 255, 255, 0.88);\r\n    box-shadow: 0 6px 18px rgba(36, 71, 109, 0.10);\r\n    font-size: 0.7rem;\r\n    font-weight: 750;\r\n    color: var(--muted-text);\r\n    pointer-events: none;\r\n    transition: opacity 0.45s ease, transform 0.45s ease;\r\n}\r\n#reu-roue-wp .et-indice b{ color: var(--ink-strong); font-weight: 850; }\r\n#reu-roue-wp .et-indice.is-parti{ opacity: 0; transform: translate(-50%, 8px); }\r\n#reu-roue-wp .et-indice i{\r\n    display: inline-block;\r\n    font-style: normal;\r\n    animation: fis-aer-descente 1.9s ease-in-out infinite;\r\n}\r\n@keyframes fis-aer-descente{\r\n    0%, 100%{ transform: translateY(0); }\r\n    50%{ transform: translateY(3px); }\r\n}\r\n\r\n\r\n\/* Une descente d'\u00e9tage est un mouvement ample : \u00e0 qui demande moins de\r\n   mouvement, on donne la m\u00eame sc\u00e8ne, pos\u00e9e, sans \u00e9closion ni glissement. *\/\r\n@media (prefers-reduced-motion: reduce){\r\n    #reu-roue-wp .et-piste{ scroll-behavior: auto; }\r\n    #reu-roue-wp .et-fleur .et-fleur-in{\r\n        transition: none;\r\n        transform: scale(1);\r\n        opacity: 1;\r\n    }\r\n    #reu-roue-wp .et-indice i{ animation: none; }\r\n}\r\n\r\n\r\n\/* ==========================================================================\r\n   REFONTE 2025 : syst\u00e8me de design\r\n   --------------------------------------------------------------------------\r\n   Une seule grammaire pour tout l'outil, pos\u00e9e en fin de feuille pour\r\n   l'emporter sur les couches historiques.\r\n\r\n   1. Le trait est FIN. Un filet d'un pixel s\u00e9pare, une ombre ne sert qu'\u00e0\r\n      d\u00e9coller ce qui flotte r\u00e9ellement au-dessus du reste.\r\n   2. Les chiffres sont de la typographie : tabulaires, serr\u00e9s, sombres.\r\n      Leur l\u00e9gende est une micro-capitale espac\u00e9e, jamais un mot en gras.\r\n   3. La couleur ne sert qu'aux donn\u00e9es. Le ch\u00e2ssis est ivoire, encre et\r\n      filet ; les teintes restent aux th\u00e9matiques et aux promesses.\r\n   4. Les rayons suivent une \u00e9chelle (6, 10, 14, 999) et ne s'inventent pas\r\n      au cas par cas.\r\n   ========================================================================== *\/\r\n#reu-roue-wp{\r\n    --ui-ink:        #16262c;\r\n    --ui-ink-soft:   #40565d;\r\n    --ui-muted:      #77898d;\r\n    --ui-faint:      #9aa9ab;\r\n    --ui-line:       #e6eae3;\r\n    --ui-line-soft:  #eef1ec;\r\n    --ui-surface:    #ffffff;\r\n    --ui-canvas:     #fbfbf8;\r\n    --ui-sunk:       #f2f4ef;\r\n    --ui-accent:     #1f4a4d;\r\n    --ui-r-sm: 8px;\r\n    --ui-r-md: 12px;\r\n    --ui-r-lg: 16px;\r\n    --ui-shadow: 0 1px 2px rgba(22,38,44,.04), 0 18px 40px -24px rgba(22,38,44,.28);\r\n    --ui-mono: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace;\r\n}\r\n\r\n\/* Micro-capitale : l'unit\u00e9 de l\u00e9gende de toute l'interface. *\/\r\n#reu-roue-wp .eyebrow,\r\n#reu-roue-wp .kpi-label,\r\n#reu-roue-wp .stage-heading,\r\n#reu-roue-wp .legend-title,\r\n#reu-roue-wp .detail-eyebrow,\r\n#reu-roue-wp .fb-head{\r\n    font-size: 9px;\r\n    font-weight: 700;\r\n    letter-spacing: .14em;\r\n    text-transform: uppercase;\r\n    color: var(--ui-faint);\r\n}\r\n\r\n\/* ---------- bandeau et onglets ---------- *\/\r\n#reu-roue-wp .topbar{\r\n    border-bottom: 1px solid var(--ui-line);\r\n    background: rgba(255,255,255,.72);\r\n    backdrop-filter: blur(14px);\r\n}\r\n#reu-roue-wp .toggle-group{\r\n    background: var(--ui-sunk);\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n    padding: 4px;\r\n    gap: 2px;\r\n    box-shadow: none;\r\n    max-width: 100%;\r\n    overflow-x: auto;\r\n    scrollbar-width: none;\r\n}\r\n#reu-roue-wp .toggle-group::-webkit-scrollbar{ display: none; }\r\n#reu-roue-wp .toggle-btn{\r\n    flex-shrink: 0;\r\n    border-radius: 9px;\r\n    padding: 8px 13px;\r\n    font-size: 11.5px;\r\n    font-weight: 650;\r\n    letter-spacing: -.1px;\r\n    color: var(--ui-muted);\r\n    background: none;\r\n    border: 0;\r\n    transition: color .22s, background .22s, box-shadow .22s;\r\n}\r\n#reu-roue-wp .toggle-btn::before{ content: none !important; }\r\n#reu-roue-wp .toggle-btn:hover{ color: var(--ui-ink); background: rgba(255,255,255,.7); transform: none; }\r\n#reu-roue-wp .toggle-btn.active,\r\n#reu-roue-wp .toggle-btn.is-flora.active,\r\n#reu-roue-wp .toggle-btn.is-radar.active,\r\n#reu-roue-wp .toggle-btn.is-etages.active,\r\n#reu-roue-wp .toggle-btn.is-carte.active{\r\n    color: var(--ui-ink);\r\n    background: var(--ui-surface);\r\n    font-weight: 750;\r\n    box-shadow: 0 1px 2px rgba(22,38,44,.06), 0 4px 10px -6px rgba(22,38,44,.25);\r\n}\r\n#reu-roue-wp .edition strong{ letter-spacing: -.2px; }\r\n#reu-roue-wp .edition-dot{ background: #5f9c85; }\r\n\r\n\/* ---------- colonne de gauche ---------- *\/\r\n#reu-roue-wp .header{\r\n    background: none;\r\n    border-right: 0;\r\n    padding: 30px 24px 18px 30px;\r\n}\r\n#reu-roue-wp .intro h1{ letter-spacing: -1.1px; line-height: 1.06; }\r\n#reu-roue-wp .map-subtitle{\r\n    font-size: 11.5px;\r\n    line-height: 1.6;\r\n    color: var(--ui-muted);\r\n    max-width: 34ch;\r\n}\r\n\r\n\/* Les compteurs : deux nombres pos\u00e9s sur un filet, rien de plus. *\/\r\n#reu-roue-wp .kpi-row{\r\n    gap: 0;\r\n    border-top: 1px solid var(--ui-line);\r\n    border-bottom: 1px solid var(--ui-line);\r\n    padding: 16px 0;\r\n    margin: 20px 0 4px;\r\n}\r\n#reu-roue-wp .kpi{ padding: 0 18px 0 0; border: 0; }\r\n#reu-roue-wp .kpi + .kpi{ padding-left: 18px; border-left: 1px solid var(--ui-line); }\r\n#reu-roue-wp .kpi-value{\r\n    font-size: 28px;\r\n    font-weight: 600;\r\n    letter-spacing: -1.4px;\r\n    color: var(--ui-ink);\r\n    font-variant-numeric: tabular-nums;\r\n}\r\n#reu-roue-wp .kpi-label{ margin-top: 6px; }\r\n\r\n#reu-roue-wp .crumbs{ font-size: 10px; }\r\n\/* Le fil d'Ariane et la bascule de lecture flottaient trop bas sous les\r\n   compteurs : on resserre l'espace au-dessus pour les remonter. *\/\r\n#reu-roue-wp .kpi-row{ margin: 20px 0 0; }\r\n#reu-roue-wp .toolbar{ gap: 6px; }\r\n#reu-roue-wp .crumbs{ margin-top: 0; }\r\n#reu-roue-wp .radar-modes{ margin-top: -2px; }\r\n#reu-roue-wp .explore-item{ border-radius: var(--ui-r-sm); font-size: 11px; }\r\n#reu-roue-wp .explore-item:hover,\r\n#reu-roue-wp .explore-item.is-hovered{ background: var(--ui-sunk); }\r\n#reu-roue-wp .reading-note{ font-size: 10.5px; line-height: 1.6; color: var(--ui-muted); }\r\n#reu-roue-wp .reading-icon{ background: var(--ui-sunk); color: var(--ui-accent); }\r\n\r\n\/* ---------- bandeau de rubrique ---------- *\/\r\n#reu-roue-wp .stage-heading{\r\n    left: 26px; right: 26px; top: 16px;\r\n    padding-bottom: 12px;\r\n    border-bottom: 1px solid var(--ui-line-soft);\r\n    align-items: baseline;\r\n}\r\n#reu-roue-wp .stage-index{ font-family: var(--ui-mono); letter-spacing: .08em; }\r\n#reu-roue-wp .stage-caption{ font-size: 9px; color: var(--ui-faint); letter-spacing: .02em; }\r\n#reu-roue-wp .caption-line{ background: var(--ui-line); }\r\n\r\n\/* ---------- filtre th\u00e9matique ---------- *\/\r\n#reu-roue-wp .legend{\r\n    background: var(--ui-surface);\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n    box-shadow: var(--ui-shadow);\r\n    padding: 12px;\r\n}\r\n#reu-roue-wp .legend.is-menu .legend-trigger{\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: 10px;\r\n    background: var(--ui-surface);\r\n    font-size: 11.5px;\r\n    font-weight: 650;\r\n    color: var(--ui-ink);\r\n    padding: 10px 13px;\r\n}\r\n#reu-roue-wp .legend-item{\r\n    border-radius: var(--ui-r-sm);\r\n    font-size: 11px;\r\n    font-weight: 550;\r\n    color: var(--ui-ink-soft);\r\n}\r\n#reu-roue-wp .legend-item.is-on{ background: var(--ui-sunk); color: var(--ui-ink); font-weight: 700; }\r\n#reu-roue-wp .legend-count{ font-family: var(--ui-mono); font-size: 9.5px; color: var(--ui-faint); }\r\n\r\n\/* ---------- bascule barres \/ radar ---------- *\/\r\n#reu-roue-wp .radar-modes{\r\n    background: var(--ui-sunk);\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: 10px;\r\n    padding: 3px;\r\n    box-shadow: none;\r\n}\r\n#reu-roue-wp .rmode{\r\n    border-radius: 7px;\r\n    font-size: 10.5px;\r\n    font-weight: 650;\r\n    color: var(--ui-muted);\r\n    padding: 7px 13px;\r\n}\r\n#reu-roue-wp .rmode.active{\r\n    background: var(--ui-surface);\r\n    color: var(--ui-ink);\r\n    font-weight: 750;\r\n    box-shadow: 0 1px 2px rgba(22,38,44,.07);\r\n}\r\n\r\n\/* Sous 1000 px la bascule redescend dans la colonne de gauche : \u00e0 trois crans,\r\n   les trois libell\u00e9s n'y tiennent plus sur une ligne. Abr\u00e9ger \u00e9tait tentant,\r\n   mais \u00ab \u00c9gales \/ Projets \/ Euros \u00bb ne dit plus ce que mesure le p\u00e9tale, et\r\n   c'est pr\u00e9cis\u00e9ment ce que ces boutons ont \u00e0 nommer. On les laisse donc passer\r\n   \u00e0 la ligne, et on leur donne de quoi le faire proprement : deux lignes\r\n   centr\u00e9es, interligne ouvert, le cran actif toujours aussi lisible. *\/\r\n@media (max-width: 1000px){\r\n    #reu-roue-wp #roue-modes .rmode{\r\n        padding: 6px 8px; font-size: 9.5px;\r\n        line-height: 1.32; text-align: center; text-wrap: balance;\r\n    }\r\n}\r\n\r\n\/* ---------- roue au poids r\u00e9el : les graduations ----------\r\n   Les cercles sont trac\u00e9s SOUS les p\u00e9tales : chacun les recouvre jusqu'\u00e0 sa\r\n   propre longueur, et ce qui d\u00e9passe dit ce qui manque. C'est la r\u00e8gle\r\n   gradu\u00e9e de la roue, pas un ornement \u2014 d'o\u00f9 le trait pointill\u00e9, discret,\r\n   et le chiffre pos\u00e9 \u00e0 la verticale, hors des couleurs. *\/\r\n#reu-roue-wp .rose-ring{\r\n    fill: none; stroke: #aebbb4; stroke-width: 1;\r\n    stroke-dasharray: 2 4; pointer-events: none;\r\n}\r\n#reu-roue-wp .rose-grad{\r\n    font-family: var(--ui-mono); font-size: 9px; font-weight: 700;\r\n    fill: #5f736c; letter-spacing: .06em; text-anchor: middle;\r\n    pointer-events: none; paint-order: stroke;\r\n    stroke: #fffef9; stroke-width: 3.5px; stroke-linejoin: round;\r\n}\r\n\r\n\/* ---------- pied de page ---------- *\/\r\n#reu-roue-wp .app-footer{\r\n    background: var(--ui-canvas);\r\n    border-top: 1px solid var(--ui-line);\r\n    font-size: 9px;\r\n    letter-spacing: .06em;\r\n    text-transform: uppercase;\r\n    color: var(--ui-faint);\r\n}\r\n#reu-roue-wp .footer-signature{ color: var(--ui-muted); font-weight: 700; letter-spacing: .1em; }\r\n#reu-roue-wp .footer-signature i{ color: var(--ui-line); }\r\n#reu-roue-wp #fullscreen-btn{\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: 8px;\r\n    background: var(--ui-surface);\r\n    color: var(--ui-muted);\r\n    padding: 6px 11px;\r\n    font-size: 9px;\r\n    letter-spacing: .08em;\r\n}\r\n#reu-roue-wp #fullscreen-btn:hover{ color: var(--ui-ink); border-color: #d6ddd5; }\r\n\r\n\/* ==========================================================================\r\n   LES FREINS, EN BARRES : un tableau, pas une liste de jauges\r\n   --------------------------------------------------------------------------\r\n   Quatre familles, quatre lignes, et la m\u00eame grille pour toutes : le code,\r\n   l'intitul\u00e9, la barre, la valeur. Les colonnes sont align\u00e9es au pixel d'une\r\n   ligne \u00e0 l'autre, ce qui permet de comparer sans lire les nombres. La barre\r\n   porte ses graduations en fond plut\u00f4t qu'un axe s\u00e9par\u00e9 : un axe pour quatre\r\n   lignes co\u00fbtait une bande d'\u00e9cran pour quatre rep\u00e8res.\r\n   ========================================================================== *\/\r\n#reu-roue-wp .freins-bars{ padding-left: 34px; padding-right: 34px; }\r\n#reu-roue-wp .fb-caption{\r\n    font-size: 12px;\r\n    line-height: 1.7;\r\n    color: var(--ui-muted);\r\n    max-width: 78ch;\r\n    margin: 0 0 4px;\r\n}\r\n#reu-roue-wp .fb-caption strong{ color: var(--ui-ink); font-weight: 750; }\r\n#reu-roue-wp .fb-head{\r\n    display: grid;\r\n    grid-template-columns: 30px minmax(120px, 1.1fr) minmax(0, 3fr) 96px;\r\n    align-items: end;\r\n    gap: 18px;\r\n    padding: 0 0 10px;\r\n    margin-top: 26px;\r\n    border-bottom: 1px solid var(--ui-line);\r\n}\r\n#reu-roue-wp .fb-head span:last-child{ text-align: right; }\r\n#reu-roue-wp .fb-row{\r\n    display: grid;\r\n    grid-template-columns: 30px minmax(120px, 1.1fr) minmax(0, 3fr) 96px;\r\n    align-items: center;\r\n    gap: 18px;\r\n    padding: 15px 0;\r\n    border-bottom: 1px solid var(--ui-line-soft);\r\n    transition: background .2s;\r\n}\r\n#reu-roue-wp .fb-row:hover{ background: rgba(242,244,239,.6); }\r\n#reu-roue-wp .fb-code{\r\n    font-family: var(--ui-mono);\r\n    font-size: 10px;\r\n    font-weight: 500;\r\n    color: var(--ui-faint);\r\n    letter-spacing: 0;\r\n}\r\n#reu-roue-wp .fb-label{\r\n    font-size: 13px;\r\n    font-weight: 650;\r\n    letter-spacing: -.2px;\r\n    color: var(--ui-ink);\r\n}\r\n\/* La piste porte les quatre quarts de l'\u00e9chelle, en filets d'un pixel. *\/\r\n#reu-roue-wp .fb-track{\r\n    position: relative;\r\n    height: 8px;\r\n    border-radius: 999px;\r\n    background: var(--ui-sunk);\r\n    overflow: visible;\r\n}\r\n#reu-roue-wp .fb-track::after{\r\n    content: \"\";\r\n    position: absolute;\r\n    inset: -7px 0 -7px 0;\r\n    background-image: repeating-linear-gradient(to right, var(--ui-line) 0 1px, transparent 1px 25%);\r\n    opacity: .9;\r\n    pointer-events: none;\r\n}\r\n#reu-roue-wp .fb-fill{\r\n    position: relative;\r\n    z-index: 1;\r\n    height: 100%;\r\n    border-radius: 999px;\r\n    background: linear-gradient(90deg, #3d7d72, var(--ui-accent));\r\n    animation: fisBar .7s cubic-bezier(.22,1,.36,1);\r\n    transform-origin: left;\r\n}\r\n#reu-roue-wp .fb-val{\r\n    text-align: right;\r\n    font-size: 15px;\r\n    font-weight: 650;\r\n    letter-spacing: -.4px;\r\n    color: var(--ui-ink);\r\n    font-variant-numeric: tabular-nums;\r\n    white-space: nowrap;\r\n}\r\n#reu-roue-wp .fb-val span{\r\n    display: block;\r\n    margin-top: 3px;\r\n    font-size: 9.5px;\r\n    font-weight: 600;\r\n    letter-spacing: .04em;\r\n    color: var(--ui-faint);\r\n}\r\n\r\n\/* ==========================================================================\r\n   LE RADAR : filets, points, valeurs\r\n   ========================================================================== *\/\r\n#reu-roue-wp .radar-grid circle{\r\n    fill: none;\r\n    stroke: var(--ui-line);\r\n    stroke-width: 1px;\r\n    stroke-dasharray: 2 4;\r\n}\r\n#reu-roue-wp .radar-grid circle:last-of-type{ stroke-dasharray: none; }\r\n#reu-roue-wp .radar-grid line{ stroke: var(--ui-line); stroke-width: 1px; }\r\n#reu-roue-wp path.radar-area{\r\n    fill: rgba(47,110,101,.14);\r\n    stroke: var(--ui-accent);\r\n    stroke-width: 1.8px;\r\n    stroke-linejoin: round;\r\n}\r\n#reu-roue-wp circle.radar-pt{\r\n    fill: var(--ui-accent);\r\n    stroke: #fff;\r\n    stroke-width: 2px;\r\n    transition: r .2s;\r\n}\r\n#reu-roue-wp circle.radar-pt:hover{ r: 6; }\r\n#reu-roue-wp text.radar-axis{\r\n    font-size: 11px;\r\n    font-weight: 650;\r\n    letter-spacing: -.1px;\r\n    fill: var(--ui-ink-soft);\r\n}\r\n#reu-roue-wp text.radar-axis tspan.code{\r\n    font-family: var(--ui-mono);\r\n    font-size: 9.5px;\r\n    font-weight: 500;\r\n    fill: var(--ui-faint);\r\n}\r\n#reu-roue-wp text.radar-val{\r\n    font-size: 13px;\r\n    font-weight: 700;\r\n    letter-spacing: -.3px;\r\n    fill: var(--ui-ink);\r\n}\r\n#reu-roue-wp text.radar-ring{\r\n    font-family: var(--ui-mono);\r\n    font-size: 8.5px;\r\n    font-weight: 500;\r\n    fill: var(--ui-faint);\r\n}\r\n\/* Filet de balayage : il ne porte aucune donn\u00e9e, il accompagne la mont\u00e9e du\r\n   trac\u00e9 le temps de l'ouverture puis s'efface. *\/\r\n#reu-roue-wp line.radar-sweep{\r\n    stroke: var(--ui-accent);\r\n    stroke-width: 1.4px;\r\n    stroke-linecap: round;\r\n    pointer-events: none;\r\n}\r\n\r\n\/* ==========================================================================\r\n   LES TROIS \u00c9TAGES : une planche annot\u00e9e\r\n   --------------------------------------------------------------------------\r\n   Sur une planche, une annotation se pose : elle ne s'enferme pas dans une\r\n   bo\u00eete et elle ne double pas ce qui est \u00e9crit ailleurs. Les rep\u00e8res tiennent\r\n   donc les quatre angles du cadre, et le plan a tout le reste.\r\n   ========================================================================== *\/\r\n#reu-roue-wp .et-legende{\r\n    border: 0;\r\n    border-bottom: 1px solid var(--ui-line);\r\n    border-radius: 0;\r\n    background: none;\r\n    padding: 0 0 15px;\r\n    margin: 0 0 6px;\r\n    gap: 9px;\r\n}\r\n#reu-roue-wp .et-legende li{ font-size: 10.5px; color: var(--ui-muted); gap: 9px; }\r\n#reu-roue-wp .et-legende b{ color: var(--ui-ink); font-weight: 700; }\r\n\r\n\r\n\/* La sc\u00e8ne : un fond de plan, tr\u00e8s discret, qui pose la planche. *\/\r\n#reu-roue-wp .et-piste{\r\n    border-radius: var(--ui-r-lg);\r\n    border: 1px solid var(--ui-line-soft);\r\n    background:\r\n        radial-gradient(120% 90% at 50% 0%, #ffffff 0%, var(--ui-canvas) 70%),\r\n        repeating-linear-gradient(to right, rgba(22,38,44,.045) 0 1px, transparent 1px 28px),\r\n        repeating-linear-gradient(to bottom, rgba(22,38,44,.045) 0 1px, transparent 1px 28px);\r\n}\r\n#reu-roue-wp .et-ombre{ fill: rgba(22,38,44,.07); }\r\n#reu-roue-wp .et-tige{ stroke-width: 1.1; }\r\n#reu-roue-wp .et-anneau{ stroke-width: 1.2; }\r\n#reu-roue-wp .et-indice{\r\n    background: var(--ui-surface);\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: 999px;\r\n    padding: 8px 16px;\r\n    font-size: 10px;\r\n    font-weight: 600;\r\n    letter-spacing: .02em;\r\n    color: var(--ui-muted);\r\n    box-shadow: var(--ui-shadow);\r\n}\r\n#reu-roue-wp .et-indice b{ color: var(--ui-ink); font-weight: 750; }\r\n\r\n\/* ---------- la fiche ---------- *\/\r\n#reu-roue-wp .detail{\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-lg);\r\n    box-shadow: var(--ui-shadow);\r\n    background: rgba(255,255,255,.97);\r\n}\r\n#reu-roue-wp .detail-toolbar,\r\n#reu-roue-wp .detail-nav{ background: var(--ui-surface); border-color: var(--ui-line); }\r\n#reu-roue-wp .detail-nav button{ font-size: 10.5px; color: var(--ui-muted); }\r\n#reu-roue-wp .detail-close,\r\n#reu-roue-wp .detail-expand{\r\n    border: 1px solid var(--ui-line);\r\n    background: var(--ui-canvas);\r\n    border-radius: var(--ui-r-sm);\r\n    color: var(--ui-muted);\r\n}\r\n#reu-roue-wp .detail-close:hover,\r\n#reu-roue-wp .detail-expand:hover{ background: var(--ui-sunk); color: var(--ui-ink); }\r\n#reu-roue-wp .detail-section{ border-top: 1px solid var(--ui-line-soft); }\r\n#reu-roue-wp .detail-section-title>span{\r\n    font-family: var(--ui-mono);\r\n    border: 1px solid var(--ui-line);\r\n    background: var(--ui-canvas);\r\n    color: var(--ui-faint);\r\n    font-weight: 500;\r\n}\r\n#reu-roue-wp .detail-stat{\r\n    background: var(--ui-canvas);\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n}\r\n#reu-roue-wp .detail-stat:first-child{ background: var(--ui-sunk); border-color: var(--ui-line); }\r\n#reu-roue-wp .detail-stat b{ color: var(--ui-ink); }\r\n\r\n\/* ---------- la galerie des fleurs ---------- *\/\r\n#reu-roue-wp .fg-card{\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n    background: var(--ui-surface);\r\n}\r\n#reu-roue-wp .fg-card:hover{\r\n    border-color: #d6ddd5;\r\n    box-shadow: 0 1px 2px rgba(22,38,44,.05), 0 14px 26px -18px rgba(22,38,44,.4);\r\n}\r\n#reu-roue-wp .fg-key{\r\n    background: var(--ui-canvas);\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n}\r\n\r\n@media (max-width: 1000px){\r\n    #reu-roue-wp .fb-head,\r\n    #reu-roue-wp .fb-row{ grid-template-columns: 22px minmax(90px, 1fr) minmax(0, 2fr) 76px; gap: 11px; }\r\n    #reu-roue-wp .fb-label{ font-size: 12px; }\r\n    #reu-roue-wp .fb-val{ font-size: 13px; }\r\n}\r\n@media (max-width: 860px){\r\n    #reu-roue-wp .kpi-value{ font-size: 24px; }\r\n}\r\n\r\n\r\n\/* Deux anciennes r\u00e8gles de repli poussaient la piste sur une seconde ligne d\u00e8s\r\n   1300 px. La grille \u00e0 quatre colonnes tient jusqu'au t\u00e9l\u00e9phone : on la\r\n   r\u00e9tablit avec la sp\u00e9cificit\u00e9 qu'il faut, et le repli \u00e0 deux lignes est\r\n   repos\u00e9, lui, au seul endroit o\u00f9 il rend service. *\/\r\n#reu-roue-wp .freins-bars .fb-track{ grid-column: auto; grid-row: auto; }\r\n#reu-roue-wp .freins-bars .fb-val{ grid-column: auto; grid-row: auto; }\r\n@media (max-width: 620px){\r\n    #reu-roue-wp .freins-bars .fb-head{ display: none; }\r\n    #reu-roue-wp .freins-bars .fb-row{ grid-template-columns: 24px 1fr 74px; row-gap: 11px; }\r\n    #reu-roue-wp .freins-bars .fb-track{ grid-column: 1 \/ -1; grid-row: 2; }\r\n    #reu-roue-wp .freins-bars .fb-val{ grid-column: 3; grid-row: 1; }\r\n}\r\n\r\n\r\n\/* L'annotation de la planche. Pos\u00e9e en haut \u00e0 droite de la sc\u00e8ne, elle dit ce\r\n   que l'on regarde et ce que cela p\u00e8se, \u00e0 la fa\u00e7on d'un cartouche de plan. Un\r\n   filet de la couleur de la promesse la rattache \u00e0 l'\u00e9tage. *\/\r\n#reu-roue-wp .et-annot{\r\n    position: absolute;\r\n    top: 20px;\r\n    right: 42px;\r\n    z-index: 4;\r\n    max-width: 17rem;\r\n    padding-right: 14px;\r\n    border-right: 2px solid var(--pr, var(--ui-line));\r\n    text-align: right;\r\n    pointer-events: none;\r\n}\r\n#reu-roue-wp .et-annot-rang{\r\n    display: block;\r\n    font-family: var(--ui-mono);\r\n    font-size: 9px;\r\n    letter-spacing: .12em;\r\n    text-transform: uppercase;\r\n    color: var(--ui-faint);\r\n}\r\n#reu-roue-wp .et-annot-titre{\r\n    display: block;\r\n    margin: 4px 0 8px;\r\n    font-size: 22px;\r\n    font-weight: 750;\r\n    letter-spacing: -.7px;\r\n    line-height: 1;\r\n    color: var(--pr-text, var(--ui-ink));\r\n}\r\n#reu-roue-wp .et-annot-sub{\r\n    display: block;\r\n    font-size: 10.5px;\r\n    line-height: 1.55;\r\n    color: var(--ui-muted);\r\n    font-variant-numeric: tabular-nums;\r\n}\r\n#reu-roue-wp .et-annot-sub b{ color: var(--ui-ink); font-weight: 750; }\r\n#reu-roue-wp .et-annot-sub + .et-annot-sub{ margin-top: 2px; }\r\n\r\n\/* Le halo au sol situe la th\u00e9matique, il ne doit pas disputer la fleur. *\/\r\n#reu-roue-wp .et-halo{ opacity: .2; }\r\n#reu-roue-wp .et-etage.is-active .et-halo{ opacity: .26; }\r\n\r\n\r\n#reu-roue-wp .fb-note{\r\n    margin: 22px 0 0;\r\n    padding-top: 15px;\r\n    border-top: 1px solid var(--ui-line);\r\n    font-size: 10.5px;\r\n    line-height: 1.7;\r\n    color: var(--ui-muted);\r\n    max-width: 82ch;\r\n}\r\n#reu-roue-wp .fb-note b{\r\n    color: var(--ui-ink);\r\n    font-weight: 750;\r\n    letter-spacing: .06em;\r\n    text-transform: uppercase;\r\n    font-size: 9px;\r\n}\r\n#reu-roue-wp .fb-note span{ color: var(--ui-faint); }\r\n\/* ==========================================================================\r\n   PLEIN CADRE \u2014 la sc\u00e8ne d'abord, les rep\u00e8res dans les angles\r\n   --------------------------------------------------------------------------\r\n   Sur la roue et sur les \u00e9tages, la colonne de gauche cesse d'\u00eatre une colonne :\r\n   elle devient un calque transparent pos\u00e9 sur la sc\u00e8ne. Le titre tient l'angle\r\n   haut-gauche, la liste des th\u00e9matiques l'angle bas-droit, et le reste s'en va.\r\n   Les compteurs de t\u00eate, d'abord : \u00ab 48 projets \u00bb \u00e9tait d\u00e9j\u00e0 la somme des\r\n   nombres align\u00e9s dans la liste, deux lignes plus bas.\r\n   Sous 1000 px, la colonne revient : un calque n'a de sens que s'il reste de la\r\n   place autour de la sc\u00e8ne.\r\n   ========================================================================== *\/\r\n@media (min-width: 1001px){\r\n#reu-roue-wp[data-view=\"empreinte\"] .header,\r\n#reu-roue-wp[data-view=\"etages\"] .header,\r\n#reu-roue-wp[data-view=\"freins\"] .header{\r\n    position: absolute;\r\n    inset: 0;\r\n    width: auto;\r\n    max-width: none;\r\n    flex: none;\r\n    z-index: 21;\r\n    display: grid;\r\n    grid-template-columns: minmax(0, 21rem) minmax(0, 1fr) auto;\r\n    grid-template-rows: auto auto minmax(0, 1fr) auto auto auto;\r\n    padding: 26px 30px 20px 34px;\r\n    border-right: 0;\r\n    background: none;\r\n    overflow: visible;\r\n    pointer-events: none;\r\n}\r\n#reu-roue-wp[data-view=\"empreinte\"] .header > *,\r\n#reu-roue-wp[data-view=\"etages\"] .header > *,\r\n#reu-roue-wp[data-view=\"freins\"] .header > *{ pointer-events: auto; }\r\n#reu-roue-wp[data-view=\"empreinte\"] .intro,\r\n#reu-roue-wp[data-view=\"etages\"] .intro,\r\n#reu-roue-wp[data-view=\"freins\"] .intro{ grid-column: 1; grid-row: 1; }\r\n\/* Le compteur \u00ab 48 projets \/ 9 th\u00e9matiques \u00bb disait deux fois ce que la\r\n   l\u00e9gende chiffre d\u00e9j\u00e0 th\u00e9matique par th\u00e9matique, et il prenait la hauteur\r\n   qui manquait au filtre et au graphique. La roue et les \u00e9tages s'en\r\n   passaient d\u00e9j\u00e0 : les freins et les fleurs font de m\u00eame, et la place\r\n   revient au contenu. *\/\r\n#reu-roue-wp .kpi-row{ display: none; }\r\n#reu-roue-wp[data-view=\"empreinte\"] .stage-heading,\r\n#reu-roue-wp[data-view=\"etages\"] .stage-heading,\r\n#reu-roue-wp[data-view=\"freins\"] .stage-heading{ display: none; }\r\n\r\n\/* Le fil d'Ariane coiffe la liste : ensemble ils forment le seul bloc de\r\n   navigation de la vue, dans l'angle que le disque ne remplit pas. Mais la\r\n   bascule de lecture, elle, ne commande pas cette liste : collee au-dessus\r\n   d'elle, elle se lisait comme son en-tete. La barre d'outils s'efface donc\r\n   (display: contents) pour que ses deux contenus se placent chacun pour\r\n   soi : le reglage de la roue en haut de colonne, sous \u00ab Edition 2025 \u00bb,\r\n   le fil d'Ariane en bas, au ras des thematiques qu'il nomme. *\/\r\n#reu-roue-wp[data-view=\"empreinte\"] .toolbar{ display: contents; }\r\n#reu-roue-wp[data-view=\"empreinte\"] #roue-modes{\r\n    grid-column: 3; grid-row: 1;\r\n    justify-self: end;\r\n    align-self: start;\r\n}\r\n#reu-roue-wp[data-view=\"empreinte\"] .crumbs{\r\n    grid-column: 3; grid-row: 4;\r\n    justify-self: end;\r\n    width: 15.5rem;\r\n    justify-content: flex-end;\r\n    text-align: right;\r\n    margin: 0 2px 9px 0;\r\n}\r\n#reu-roue-wp[data-view=\"empreinte\"] .explore-list{\r\n    grid-column: 3; grid-row: 5;\r\n    justify-self: end;\r\n    width: 15.5rem;\r\n    flex: none;\r\n    margin: 0;\r\n    padding: 7px;\r\n    max-height: min(46vh, 392px);\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-lg);\r\n    background: rgba(255,255,255,.86);\r\n    -webkit-backdrop-filter: blur(16px);\r\n    backdrop-filter: blur(16px);\r\n    box-shadow: var(--ui-shadow);\r\n}\r\n#reu-roue-wp[data-view=\"empreinte\"] .reading-note{\r\n    grid-column: 3; grid-row: 6;\r\n    justify-self: end;\r\n    width: 15.5rem;\r\n    border: 0;\r\n    margin: 10px 0 0;\r\n    padding: 0 2px;\r\n    gap: 8px;\r\n}\r\n#reu-roue-wp[data-view=\"empreinte\"] .reading-note p{ font-size: 10px; max-width: none; }\r\n\/* Sur les \u00e9tages, la consigne de descente est d\u00e9j\u00e0 pos\u00e9e au pied de la sc\u00e8ne. *\/\r\n#reu-roue-wp[data-view=\"etages\"] .reading-note,\r\n#reu-roue-wp[data-view=\"etages\"] .toolbar{ display: none; }\r\n\/* Le filtre par th\u00e9matique se range sous le titre : l'angle bas-gauche revient\r\n   \u00e0 la cl\u00e9 de lecture de la planche. *\/\r\n#reu-roue-wp[data-view=\"etages\"] .header .legend{\r\n    grid-column: 1; grid-row: 2;\r\n    justify-self: start;\r\n    align-self: start;\r\n    position: static;\r\n    width: 15rem;\r\n    max-width: none;\r\n    max-height: min(40vh, 330px);\r\n    overflow: auto;\r\n    margin: 20px 0 0;\r\n    padding: 10px 11px 11px;\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n    background: rgba(255,255,255,.84);\r\n    -webkit-backdrop-filter: blur(16px);\r\n    backdrop-filter: blur(16px);\r\n    box-shadow: var(--ui-shadow);\r\n}\r\n\/* Le bandeau de rubrique ayant disparu, la planche r\u00e9cup\u00e8re sa bande. *\/\r\n#reu-roue-wp[data-view=\"etages\"] .stage-panel{ top: 0; }\r\n\r\n\/* Freins rencontr\u00e9s : calque transparent plein cadre, plus de place au radar *\/\r\n\/* La rang\u00e9e \u00e9lastique passe APR\u00c8S le filtre et sa note : les deux se\r\n   suivent en haut de colonne, et c'est le vide qui prend le bas. *\/\r\n#reu-roue-wp[data-view=\"freins\"] .header{\r\n    grid-template-rows: auto auto auto auto minmax(0, 1fr) auto;\r\n}\r\n#reu-roue-wp[data-view=\"freins\"] .toolbar{\r\n    grid-column: 1;\r\n    grid-row: 2;\r\n    margin: 14px 0 0;\r\n    width: auto;\r\n}\r\n#reu-roue-wp[data-view=\"freins\"] .crumbs,\r\n#reu-roue-wp[data-view=\"freins\"] .explore-list{ display: none; }\r\n\/* Le filtre pendait en bas de la colonne, \u00e0 distance du titre et du\r\n   s\u00e9lecteur auxquels il appartient : selon la hauteur de la fen\u00eatre il\r\n   se retrouvait tant\u00f4t coll\u00e9 au pied de page, tant\u00f4t seul au milieu du\r\n   vide. Il se range sous le s\u00e9lecteur de mode, en haut de colonne, et\r\n   c'est le vide qui descend en bas. *\/\r\n#reu-roue-wp[data-view=\"freins\"] .header .legend{\r\n    grid-column: 1;\r\n    grid-row: 3;\r\n    justify-self: start;\r\n    align-self: start;\r\n    position: static;\r\n    width: 16rem;\r\n    max-width: none;\r\n    max-height: min(52vh, 420px);\r\n    overflow: auto;\r\n    margin: 14px 0 0;\r\n    padding: 10px 11px 11px;\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n    background: rgba(255,255,255,.84);\r\n    -webkit-backdrop-filter: blur(16px);\r\n    backdrop-filter: blur(16px);\r\n    box-shadow: var(--ui-shadow);\r\n}\r\n#reu-roue-wp[data-view=\"freins\"] .reading-note{\r\n    grid-column: 1;\r\n    grid-row: 4;\r\n    align-self: start;\r\n    width: 16rem;\r\n    border: 0;\r\n    margin: 8px 0 0;\r\n    padding: 0 2px;\r\n}\r\n#reu-roue-wp[data-view=\"freins\"] .reading-note p{ font-size: 10px; max-width: none; }\r\n#reu-roue-wp[data-view=\"freins\"] .freins-bars{\r\n    padding: 48px 3rem 35px 22rem !important;\r\n    justify-content: center;\r\n}\r\n\r\n\/* Fleurs des assos : fond gris unifi\u00e9, filtre descendu en bas *\/\r\n#reu-roue-wp[data-view=\"fleurs\"] .header{\r\n    width: 21rem;\r\n    flex: 0 0 21rem;\r\n    padding: 26px 20px 20px 34px;\r\n    border-right: 0;\r\n    background: none;\r\n    display: flex;\r\n    flex-direction: column;\r\n}\r\n#reu-roue-wp[data-view=\"fleurs\"] .header .toolbar,\r\n#reu-roue-wp[data-view=\"fleurs\"] .header .crumbs,\r\n#reu-roue-wp[data-view=\"fleurs\"] .header .explore-list{ display: none; }\r\n\/* M\u00eame correction dans la galerie : le filtre \u00e9tait descendu en pied de\r\n   colonne, loin du chapeau qu'il commande. Il remonte juste sous lui, et\r\n   la colonne se lit d'un bloc. *\/\r\n#reu-roue-wp[data-view=\"fleurs\"] .header .legend{\r\n    margin-top: 20px;\r\n    margin-bottom: 0;\r\n    width: 100%;\r\n    max-width: 16rem;\r\n    padding: 10px 11px 11px;\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n    background: rgba(255,255,255,.84);\r\n    -webkit-backdrop-filter: blur(16px);\r\n    backdrop-filter: blur(16px);\r\n    box-shadow: var(--ui-shadow);\r\n    position: relative;\r\n}\r\n#reu-roue-wp[data-view=\"fleurs\"] .legend.is-menu.is-open .legend-list{\r\n    position: absolute;\r\n    top: calc(100% + 8px);\r\n    bottom: auto;\r\n    left: 0;\r\n    right: 0;\r\n    width: 100%;\r\n    max-height: min(44vh, 320px);\r\n    overflow-y: auto;\r\n    background: rgba(255,255,255,.96);\r\n    -webkit-backdrop-filter: blur(16px);\r\n    backdrop-filter: blur(16px);\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n    box-shadow: var(--ui-shadow);\r\n    padding: 8px;\r\n    z-index: 50;\r\n}\r\n\/* La note suit le filtre qu'elle explique, et c'est elle qui pousse le\r\n   vide vers le bas de la colonne. *\/\r\n#reu-roue-wp[data-view=\"fleurs\"] .reading-note{\r\n    border-top: 0;\r\n    padding-top: 0;\r\n    margin-top: 10px;\r\n    margin-bottom: auto;\r\n    max-width: 16rem;\r\n}\r\n#reu-roue-wp[data-view=\"fleurs\"] .reading-note p{ font-size: 10px; max-width: none; }\r\n}\r\n\r\n\/* LES TROIS \u00c9TAGES \u2014 planches claires, fleurs par th\u00e9matique. *\/\r\n#reu-roue-wp[data-view=\"etages\"]{--et-paper:#f7f6f2;--et-ink:#1e1c19;--et-muted:#8b8882;--et-line:#dedbd4}\r\n#reu-roue-wp[data-view=\"etages\"] .main-content{background:var(--et-paper)}\r\n#reu-roue-wp[data-view=\"etages\"] .toggle-group{border-radius:999px;background:#efede7}\r\n#reu-roue-wp[data-view=\"etages\"] .toggle-btn.active{border-radius:999px;background:#1e1c19;color:#fff;border-color:#1e1c19;box-shadow:none}\r\n#reu-roue-wp[data-view=\"etages\"] .header{position:absolute;inset:0;width:auto;max-width:none;max-height:none;display:block;padding:0;margin:0;border:0;background:none;pointer-events:none;overflow:visible;z-index:21}\r\n#reu-roue-wp[data-view=\"etages\"] .header > :not(.legend),\r\n#reu-roue-wp[data-view=\"etages\"] .stage-heading{display:none}\r\n#reu-roue-wp[data-view=\"etages\"] .header .legend{position:absolute;top:36px;right:36px;left:auto;bottom:auto;width:clamp(230px,24vw,370px);max-width:calc(100% - 40px);max-height:none;margin:0;padding:0;border:0;border-radius:14px;background:none;box-shadow:none;backdrop-filter:none;overflow:visible;pointer-events:auto}\r\n#reu-roue-wp[data-view=\"etages\"] .legend-title{display:none}\r\n#reu-roue-wp[data-view=\"etages\"] .legend.is-menu .legend-trigger{min-height:48px;padding:13px 18px;border:1px solid var(--et-line);color:var(--et-ink);background:#fff;font-size:13px;border-radius:14px;box-shadow:0 3px 12px #34261708}\r\n#reu-roue-wp[data-view=\"etages\"] .legend.is-menu.is-open .legend-list{position:absolute;top:calc(100% + 8px);right:0;width:100%;max-height:65vh;overflow:auto;margin:0;padding:10px;background:#fff;border:1px solid var(--et-line);border-radius:14px;box-shadow:var(--ui-shadow)}\r\n#reu-roue-wp .stage-panel.etages{display:block;top:0;padding:0;overflow:hidden}\r\n#reu-roue-wp .stage-panel.etages[hidden]{display:none}\r\n#reu-roue-wp .stage-panel.etages .et-piste{height:100%;border:0;border-radius:0;background:var(--et-paper);color:var(--et-ink);overscroll-behavior:contain}\r\n#reu-roue-wp .et-colle{isolation:isolate}\r\n#reu-roue-wp .et-colle::before,#reu-roue-wp .et-colle::after,#reu-roue-wp .et-masthead,#reu-roue-wp .et-watermark{display:none}\r\n#reu-roue-wp #chart-container .et-colle > svg{position:absolute;left:4%;top:3%;width:96%;height:97%;overflow:visible;touch-action:pan-y}\r\n\/* ---- La dalle et ses \u00eelots ----\r\n   Un dessus en d\u00e9grad\u00e9 bord\u00e9 d'un filet, deux chants couleur de pl\u00e2tre et,\r\n   \u00e0 leur pied, le liser\u00e9 de la promesse : c'est lui qui dit l'\u00e9tage, et la\r\n   pile vue de biais aligne trois liser\u00e9s l'un sous l'autre. Les chants sont\r\n   remplis en ligne, un d\u00e9grad\u00e9 par promesse (etDefs). *\/\r\n#reu-roue-wp .et-dessus{fill:url(#fis-et-dalle);stroke:#d3cdc1;stroke-width:.8;stroke-linejoin:round;vector-effect:non-scaling-stroke}\r\n#reu-roue-wp .et-chant{stroke:rgba(40,28,16,.07);stroke-width:.6;stroke-linejoin:round;vector-effect:non-scaling-stroke}\r\n#reu-roue-wp .et-lisere{fill:none;stroke:var(--pr);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke;transition:opacity .5s ease}\r\n#reu-roue-wp .et-ombre{pointer-events:none}\r\n#reu-roue-wp .et-ombre path{fill:#4a3a22;fill-opacity:.022}\r\n#reu-roue-wp .et-etage{transition:filter .6s ease}\r\n#reu-roue-wp .et-etage:not(.is-active){filter:saturate(.65)}\r\n#reu-roue-wp .et-etage:not(.is-active) .et-lisere{opacity:.75}\r\n\/* L'\u00eelot : une parcelle un ton sous la dalle, sans bord, qui ne prend pas\r\n   le pointeur (ce sont ses cases qui r\u00e9pondent). *\/\r\n#reu-roue-wp .et-ilot{fill:#7d6d4f;fill-opacity:.07;pointer-events:none}\r\n#reu-roue-wp .et-tige{stroke:#958f82;opacity:.9;stroke-width:.9}\r\n\/* Le socle d'une fleur : le dessus en d\u00e9grad\u00e9 de sa th\u00e9matique, les chants\r\n   remplis en ligne. Un filet clair d\u00e9tache le dessus de ses chants. *\/\r\n#reu-roue-wp .et-socle{stroke:rgba(255,255,255,.45);stroke-width:.7;stroke-linejoin:round;vector-effect:non-scaling-stroke;transition:filter .25s ease}\r\n#reu-roue-wp .et-socle-g,#reu-roue-wp .et-socle-d{stroke:none}\r\n#reu-roue-wp .et-etage.is-active .et-fleur:hover .et-socle,\r\n#reu-roue-wp .et-etage.is-active .et-fleur:focus-visible .et-socle{filter:brightness(1.1)}\r\n\/* La case d'une structure qui ne documente pas la promesse : blanche, \u00e0\r\n   plat, trac\u00e9e en pointill\u00e9. Elle existe, elle reste vide. *\/\r\n#reu-roue-wp .et-vide{fill:#fdfcfa;fill-opacity:1;stroke:#c3bdb1;stroke-opacity:1;stroke-width:1;stroke-dasharray:3 2.5;stroke-linejoin:round;vector-effect:non-scaling-stroke;transition:fill .25s ease,stroke .25s ease}\r\n#reu-roue-wp .et-muet:hover .et-vide{fill:#fff;stroke:#8f887b}\r\n\/* L'anneau des trois promesses, en blanc sur le socle : un reflet plut\u00f4t\r\n   qu'un trait sombre. Vingt-neuf cibles noires sur trente-six fleurs, c'\u00e9tait\r\n   lui qu'on voyait en premier, avant les fleurs. *\/\r\n#reu-roue-wp .et-anneau{fill:none;stroke:#fff;opacity:.72;stroke-width:1.2;vector-effect:non-scaling-stroke}\r\n#reu-roue-wp .et-etage:not(.is-active) .et-anneau{opacity:0}\r\n\r\n\/* ---- La l\u00e9gende des th\u00e9matiques ----\r\n   Les noms des th\u00e9matiques ne sont plus \u00e9crits sur la dalle : m\u00eame pos\u00e9s au\r\n   mieux, ils couvraient des fleurs et se lisaient mal. Ils tiennent une petite\r\n   l\u00e9gende, dans le cartouche, sous la promesse : le socle de chaque\r\n   th\u00e9matique, dessin\u00e9 comme ceux de la dalle, son nom, et combien de ses\r\n   structures documentent la promesse regard\u00e9e. Survoler une ligne isole son\r\n   \u00eelot sur la dalle ; survoler une fleur allume sa ligne. Quand la hauteur\r\n   manque, la l\u00e9gende se resserre en deux temps, et ne passe sur deux\r\n   colonnes, sans ses comptes, que dans une fen\u00eatre tr\u00e8s basse\r\n   (etSerrerThemes). *\/\r\n#reu-roue-wp .et-themes{order:6;width:100%;margin:22px 0 0;padding-top:16px;border-top:1px solid var(--et-line);pointer-events:auto}\r\n#reu-roue-wp .et-themes-titre{display:block;margin:0 0 7px;color:var(--et-muted);font-size:10px;font-weight:700;letter-spacing:.19em;text-transform:uppercase}\r\n#reu-roue-wp .et-themes ul{list-style:none;max-width:calc(16.5rem + 16px);margin:0 -8px;padding:0;display:grid;grid-template-columns:minmax(0,1fr);gap:1px}\r\n#reu-roue-wp .et-themes li{display:grid;grid-template-columns:20px minmax(0,1fr) auto;align-items:center;gap:9px;margin:0;padding:3px 8px;border-radius:8px;font-size:12.5px;line-height:1.3;color:#3d3a35;transition:background-color .2s ease,box-shadow .2s ease}\r\n#reu-roue-wp .et-themes li:hover,#reu-roue-wp .et-themes li.is-on{background:#fff;box-shadow:0 1px 3px rgba(52,38,23,.1)}\r\n#reu-roue-wp #chart-container .et-themes-socle{display:block;width:20px;height:12px;overflow:visible}\r\n#reu-roue-wp .et-themes-nom{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n#reu-roue-wp .et-themes-n{font-weight:600;color:#6f6a62;font-variant-numeric:tabular-nums}\r\n#reu-roue-wp .et-themes.is-serre{margin-top:14px;padding-top:11px}\r\n#reu-roue-wp .et-themes.is-serre li{padding-top:1px;padding-bottom:1px;font-size:12px}\r\n#reu-roue-wp .et-themes.is-tasse .et-themes-titre{display:none}\r\n#reu-roue-wp .et-themes.is-tasse li{padding-top:0;padding-bottom:0;font-size:11.5px;line-height:1.25}\r\n#reu-roue-wp .et-themes.is-deux ul{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:4px}\r\n#reu-roue-wp .et-themes.is-deux li{grid-template-columns:14px minmax(0,1fr);gap:6px;font-size:11px}\r\n#reu-roue-wp .et-themes.is-deux .et-themes-n{display:none}\r\n#reu-roue-wp #chart-container .et-themes.is-deux .et-themes-socle{width:14px;height:9px}\r\n\/* L'\u00eelot isol\u00e9 : les autres s'effacent, le sien se fonce d'un ton. *\/\r\n#reu-roue-wp .et-fleur,#reu-roue-wp .et-muet,#reu-roue-wp .et-ilot{transition:opacity .25s ease}\r\n#reu-roue-wp svg.et-isole .et-fleur:not(.is-dans),#reu-roue-wp svg.et-isole .et-muet:not(.is-dans){opacity:.16}\r\n#reu-roue-wp svg.et-isole .et-ilot:not(.is-dans){opacity:.4}\r\n#reu-roue-wp svg.et-isole .et-ilot.is-dans{fill-opacity:.16}\r\n\/* Sur une tablette ou un t\u00e9l\u00e9phone, le cartouche passe au-dessus de la dalle\r\n   et n'a plus de place sous la promesse : c'est le pied qui porte la l\u00e9gende,\r\n   en une ligne qui se replie. *\/\r\n#reu-roue-wp .et-themes-pied{display:none}\r\n@media(max-width:760px){\r\n #reu-roue-wp .et-annot .et-themes{display:none}\r\n #reu-roue-wp .et-themes-pied{display:block;grid-area:themes;min-width:0}\r\n #reu-roue-wp .et-themes-pied .et-themes{margin:0;padding:0;border:0}\r\n #reu-roue-wp .et-themes-pied .et-themes-titre{display:none}\r\n #reu-roue-wp .et-themes-pied .et-themes ul{display:flex;flex-wrap:wrap;gap:3px 12px;max-width:none;margin:0}\r\n #reu-roue-wp .et-themes-pied .et-themes li{display:flex;gap:5px;padding:0;font-size:10.5px}\r\n #reu-roue-wp #chart-container .et-themes-pied .et-themes-socle{width:15px;height:9px}\r\n}\r\n\/* Le pied de la tige : une ombre de contact, sans quoi la fleur flotte au-dessus de son socle. *\/\r\n#reu-roue-wp .et-pied{fill:rgba(52,38,23,.24);pointer-events:none}\r\n#reu-roue-wp .et-muet{cursor:pointer}\r\n\/* Sur un plan en fuite, la fleur est referm\u00e9e en bourgeon de la couleur de\r\n   l'\u00e9tage. Au premier plan, le bourgeon s'efface et la fleur s'ouvre \u00e0 sa\r\n   place, rang\u00e9e apr\u00e8s rang\u00e9e : c'est l'\u00e9closion qui fait l'\u00e9tage. *\/\r\n#reu-roue-wp .et-bourgeon{opacity:1;transition:opacity .3s ease var(--pousse,0ms);pointer-events:none}\r\n#reu-roue-wp .et-bourgeon path{fill:none;stroke:#a29c8f;stroke-width:.9}\r\n#reu-roue-wp .et-bourgeon circle{fill:var(--pr)}\r\n#reu-roue-wp .et-etage.is-active .et-bourgeon{opacity:0}\r\n#reu-roue-wp .et-fleur .et-fleur-in{transform:translateY(4px) scale(.3);opacity:0;transform-origin:0 0;transition:transform .85s cubic-bezier(.16,1,.3,1) var(--pousse,0ms),opacity .4s ease var(--pousse,0ms)}\r\n#reu-roue-wp .et-etage.is-active .et-fleur .et-fleur-in{transform:translateY(0) scale(1);opacity:1}\r\n#reu-roue-wp .et-etage.is-active .et-fleur:hover .et-fleur-in,\r\n#reu-roue-wp .et-etage.is-active .et-fleur:focus-visible .et-fleur-in{transform:translateY(-3px) scale(1.15);transition-delay:0ms;transition-duration:.25s}\r\n#reu-roue-wp .et-fleur:focus-visible,#reu-roue-wp .et-muet:focus-visible{outline:none}\r\n#reu-roue-wp .et-fleur:focus-visible .et-cible{stroke:#453c2d;stroke-width:1.5}\r\n#reu-roue-wp .et-muet:focus-visible .et-vide{stroke:#453c2d;stroke-opacity:1;stroke-width:1.5;stroke-dasharray:none}\r\n@keyframes fis-et-monte{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}\r\n#reu-roue-wp .et-etage-in{animation:fis-et-monte 1s cubic-bezier(.16,1,.3,1) both;animation-delay:calc(var(--i,0)*90ms)}\r\n#reu-roue-wp .et-annot{position:absolute;top:36px;left:36px;right:auto;width:clamp(220px,24vw,390px);max-width:32%;padding:0;border:0;text-align:left;z-index:4;pointer-events:none;display:flex;flex-direction:column;align-items:flex-start}\r\n@keyframes fis-et-annot{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:translateY(0)}}\r\n#reu-roue-wp .et-annot > *{animation:fis-et-annot .5s cubic-bezier(.16,1,.3,1) both}\r\n#reu-roue-wp .et-annot-rang{order:1;color:var(--et-muted);font-size:10px;font-weight:700;letter-spacing:.19em;text-transform:uppercase}\r\n#reu-roue-wp .et-annot-rang b{color:var(--pr-text);font-weight:800;margin:0 7px}\r\n#reu-roue-wp .et-annot-titre{order:2;display:block;margin:18px 0 18px;color:var(--et-ink);font-size:clamp(42px,4.3vw,72px);font-weight:780;line-height:1;letter-spacing:-.055em}\r\n#reu-roue-wp .et-stat{order:3;display:inline-flex;align-items:baseline;gap:8px;margin:0}\r\n#reu-roue-wp .et-stat strong{font-size:clamp(32px,3vw,48px);font-weight:700;color:var(--pr-text);letter-spacing:-1.5px}\r\n#reu-roue-wp .et-stat span{font-size:18px;color:#a29f99}\r\n#reu-roue-wp .et-stat-label{order:4;display:block;margin-top:5px;font-size:clamp(11px,1vw,15px);color:var(--et-muted)}\r\n#reu-roue-wp .et-phrase{order:5;display:block;width:100%;max-width:none;margin:24px 0 0;padding-top:20px;border-top:1px solid var(--et-line);font-size:clamp(12px,1.1vw,17px);font-weight:600;line-height:1.5;color:#54514c}\r\n#reu-roue-wp .et-meter,#reu-roue-wp .et-annot-sub{display:none}\r\n#reu-roue-wp .et-bottom{position:absolute;left:36px;right:36px;bottom:26px;z-index:5;display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:16px}\r\n#reu-roue-wp .et-indice{position:static;grid-column:1;grid-row:2;margin:0;padding:0;border:0;transform:none;background:none;box-shadow:none;color:var(--et-muted);font-size:11px;white-space:normal;opacity:1}\r\n#reu-roue-wp .et-indice b{color:#66615a;font-weight:500}\r\n#reu-roue-wp .et-indice.is-parti{opacity:.6;transform:none}\r\n#reu-roue-wp .et-cle{position:static;grid-column:1 \/ -1;grid-row:1;pointer-events:none;padding:8px 0}\r\n#reu-roue-wp .et-cle .et-legende{display:flex;flex-direction:row;justify-content:flex-start;flex-wrap:wrap;gap:12px 20px;margin:0;padding:0;border:0}\r\n#reu-roue-wp .et-cle .et-legende li{font-size:10px;gap:7px;color:#726d65}\r\n#reu-roue-wp .et-cle .et-legende b{color:inherit;font-weight:500}\r\n#reu-roue-wp #chart-container .et-cle .lg-marque{width:20px;height:18px}\r\n#reu-roue-wp .et-key-doc{width:12px;height:12px;display:block;flex:none;border-radius:50%;background:var(--et-teinte,#E07B24)}\r\n#reu-roue-wp .et-key-themes{opacity:.8}\r\n@media(max-width:1100px){\r\n #reu-roue-wp .et-bottom{left:24px;right:24px;gap:8px}\r\n #reu-roue-wp .et-cle .et-legende{gap:10px}\r\n #reu-roue-wp .et-key-themes{display:none}\r\n #reu-roue-wp .et-annot{left:28px;top:26px}\r\n #reu-roue-wp .et-phrase{margin-top:16px;padding-top:14px}\r\n}\r\n@media(max-width:760px){\r\n #reu-roue-wp[data-view=\"etages\"] .header .legend{top:20px;right:20px;width:190px}\r\n #reu-roue-wp[data-view=\"etages\"] .legend.is-menu .legend-trigger{font-size:11px;min-height:40px;padding:9px 12px}\r\n #reu-roue-wp .et-annot{top:22px;left:22px;width:calc(100% - 250px);max-width:none}\r\n #reu-roue-wp .et-annot-titre{font-size:40px;margin:12px 0}\r\n #reu-roue-wp .et-stat strong{font-size:28px}\r\n #reu-roue-wp .et-stat-label{font-size:10px}\r\n #reu-roue-wp .et-phrase{font-size:12px;max-width:30ch}\r\n #reu-roue-wp #chart-container .et-colle > svg{left:-12%;top:16%;width:124%;height:81%}\r\n #reu-roue-wp .et-bottom{left:20px;right:20px;bottom:16px;grid-template-columns:1fr auto}\r\n #reu-roue-wp .et-indice{display:none}\r\n #reu-roue-wp .et-cle .et-legende li{font-size:9px}\r\n}\r\n@media(max-width:520px){\r\n #reu-roue-wp[data-view=\"etages\"] .header .legend{right:16px;width:156px;top:18px}\r\n #reu-roue-wp .et-annot{left:16px;top:20px;width:calc(100% - 190px)}\r\n #reu-roue-wp .et-annot-rang{font-size:8px;letter-spacing:.06em}\r\n #reu-roue-wp .et-annot-titre{font-size:30px;margin:14px 0 10px}\r\n #reu-roue-wp .et-stat strong{font-size:28px}\r\n #reu-roue-wp .et-stat span{font-size:13px}\r\n #reu-roue-wp .et-stat-label{font-size:9px;line-height:1.5}\r\n #reu-roue-wp .et-phrase{font-size:11px;line-height:1.4;width:calc(100vw - 32px);max-width:none;margin-top:12px;padding-top:10px}\r\n #reu-roue-wp #chart-container .et-colle > svg{left:-17%;width:134%;top:22%;height:72%}\r\n #reu-roue-wp .et-bottom{left:12px;right:12px;bottom:12px;grid-template-columns:1fr}\r\n #reu-roue-wp .et-cle .et-legende{gap:4px 10px}\r\n #reu-roue-wp .et-cle .et-legende li{font-size:8px;gap:4px}\r\n}\r\n@media(max-height:620px) and (min-width:761px){\r\n #reu-roue-wp .et-annot{top:22px;left:28px;width:230px}\r\n #reu-roue-wp .et-annot-titre{font-size:40px;margin:12px 0}\r\n #reu-roue-wp .et-stat strong{font-size:28px}\r\n #reu-roue-wp .et-phrase{font-size:11px;margin-top:12px;padding-top:10px}\r\n #reu-roue-wp .et-bottom{bottom:12px;gap:4px}\r\n}\r\n@media(prefers-reduced-motion:reduce){\r\n #reu-roue-wp .et-etage-in,#reu-roue-wp .et-annot > *{animation:none}\r\n #reu-roue-wp .et-piste,#reu-roue-wp .et-fleur .et-fleur-in,#reu-roue-wp .et-bourgeon{transition:none;scroll-behavior:auto}\r\n}\r\n\r\n\/* Plan agrandi et pied r\u00e9serv\u00e9, ind\u00e9pendants du cadrage de la cam\u00e9ra. *\/\r\n#reu-roue-wp #chart-container .et-colle > svg{left:0;top:0;width:100%;height:calc(100% - var(--et-footer,124px));overflow:hidden}\r\n\r\n\/* ---- Le pied : la cl\u00e9 des marques, et rien d'autre ----\r\n   Ni bandeau ni navigation. Les jalons et les fl\u00e8ches redisaient ce que le\r\n   cartouche dit d\u00e9j\u00e0, la promesse regard\u00e9e et son rang sur trois, et l'on\r\n   descend d'un \u00e9tage \u00e0 la molette, au doigt ou au clavier. Reste la cl\u00e9 des\r\n   marques, pos\u00e9e \u00e0 m\u00eame la planche dans l'angle bas-gauche, \u00e0 l'aplomb du\r\n   cartouche ; celle des th\u00e9matiques est dans le cartouche. Un seul corps de\r\n   texte, une encre lisible, pas de micro-capitales. *\/\r\n#reu-roue-wp .et-bottom{left:0;right:0;bottom:0;box-sizing:border-box;min-height:0;padding:4px 36px 18px;background:none;border-top:0;grid-template-columns:minmax(0,1fr);grid-template-areas:\"marques\";align-items:center;gap:10px 14px}\r\n\/* Sous la dalle, la pile des \u00e9tages suivants s'enfonce dans le papier au lieu\r\n   d'\u00eatre coup\u00e9e net au ras de la cl\u00e9 : le bandeau qui masquait la coupe est\r\n   parti. *\/\r\n#reu-roue-wp .et-bottom::before{content:\"\";position:absolute;left:0;right:0;bottom:100%;height:56px;background:linear-gradient(to bottom,rgba(247,246,242,0),var(--et-paper));pointer-events:none}\r\n#reu-roue-wp .et-cle{display:contents}\r\n#reu-roue-wp .et-cle .et-legende{grid-area:marques;display:flex;flex-wrap:wrap;align-items:center;gap:6px 22px;margin:0;padding:0;border:0}\r\n#reu-roue-wp .et-cle .et-legende li{gap:8px;font-size:12px;font-weight:500;line-height:1.3;color:#4a453e}\r\n#reu-roue-wp .et-cle .et-legende b{font-weight:700;color:#1e1c19}\r\n#reu-roue-wp #chart-container .et-cle .lg-marque{width:24px;height:24px}\r\n\/* Le socle de la cl\u00e9 est gris : il montre l'anneau, pas une th\u00e9matique. *\/\r\n#reu-roue-wp .et-cle .et-socle{fill:#b3ac9f}\r\n#reu-roue-wp .et-cle .et-socle-d{fill:#958e81}\r\n#reu-roue-wp .et-cle .et-socle-g{fill:#7c7568}\r\n#reu-roue-wp .et-cle .et-vide{fill:#fff;stroke:#9d968a}\r\n\/* La signature du pied de page redit les trois promesses : le cartouche nomme\r\n   d\u00e9j\u00e0 celle qu'on regarde. *\/\r\n#reu-roue-wp[data-view=\"etages\"] .footer-signature{visibility:hidden}\r\n@media(max-width:1100px){\r\n #reu-roue-wp .et-bottom{padding:4px 28px 14px;gap:8px 10px}\r\n #reu-roue-wp .et-cle .et-legende{gap:6px 16px}\r\n #reu-roue-wp .et-cle .et-legende li{font-size:11.5px}\r\n}\r\n@media(max-width:760px){\r\n #reu-roue-wp #chart-container .et-colle > svg{top:150px;height:calc(100% - var(--et-footer,124px) - 150px)}\r\n #reu-roue-wp .et-phrase{margin-top:10px;padding-top:10px}\r\n #reu-roue-wp .et-bottom{padding:4px 22px 14px;grid-template-columns:minmax(0,1fr);grid-template-areas:\"themes\" \"marques\"}\r\n #reu-roue-wp .et-cle .et-legende li{font-size:11px}\r\n}\r\n@media(max-width:520px){\r\n #reu-roue-wp #chart-container .et-colle > svg{top:200px;height:calc(100% - var(--et-footer,150px) - 200px)}\r\n #reu-roue-wp .et-bottom{padding:4px 16px 12px;gap:8px;grid-template-columns:minmax(0,1fr);grid-template-areas:\"themes\" \"marques\"}\r\n #reu-roue-wp .et-cle .et-legende{gap:5px 14px}\r\n #reu-roue-wp .et-cle .et-legende li{font-size:10.5px}\r\n #reu-roue-wp #chart-container .et-cle .lg-marque{width:22px;height:22px}\r\n}\r\n\r\n\/* ==========================================================================\r\n   LA FICHE, R\u00c9VISION 2 \u2014 le cadran et ce qui va avec\r\n   --------------------------------------------------------------------------\r\n   Une part de financement se lisait jusqu'ici comme les autres bulles : un\r\n   nombre pos\u00e9 \u00e0 plat, au milieu de cinq autres nombres. Or c'est le seul\r\n   chiffre de la fiche qui soit un rapport, donc le seul qui gagne \u00e0 \u00eatre vu\r\n   plut\u00f4t que lu. Il prend un cadran \u00e0 traits, et les deux montants passent\r\n   dessous : la jauge dit la proportion, les montants disent l'\u00e9chelle.\r\n   Le reste de la fiche suit le m\u00eame ch\u00e2ssis \u2014 ivoire, encre et filet ; les\r\n   teintes restent aux th\u00e9matiques et aux promesses.\r\n   ========================================================================== *\/\r\n#reu-roue-wp .fin-card{\r\n    margin: 0 0 10px;\r\n    padding: 17px 17px 13px;\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-lg);\r\n    background: var(--ui-surface);\r\n}\r\n#reu-roue-wp .jauge{ margin: 0; }\r\n#reu-roue-wp .jg-head{ display: flex; align-items: center; gap: 10px; margin: 0 0 4px; }\r\n#reu-roue-wp .jg-titre{\r\n    font-size: 9px; font-weight: 700; letter-spacing: .14em;\r\n    text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n\/* La pastille reprend celle de l'\u00e9cran de r\u00e9f\u00e9rence, mais elle nomme la\r\n   th\u00e9matique \u2014 un fait \u2014 et non un \u00e9tat \u00ab normal \/ critique \u00bb : une part de\r\n   financement n'a pas de bonne valeur. *\/\r\n#reu-roue-wp .jg-pill{\r\n    margin-left: auto; display: inline-flex; align-items: center; gap: 6px;\r\n    max-width: 62%; padding: 4px 9px; border-radius: 999px;\r\n    background: var(--ui-sunk); font-family: var(--ui-mono);\r\n    font-size: 8.5px; letter-spacing: .1em; text-transform: uppercase;\r\n    color: var(--ui-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\r\n}\r\n#reu-roue-wp .jg-pill i{\r\n    flex: none; width: 6px; height: 6px; border-radius: 50%;\r\n    background: var(--theme-color, var(--ui-accent));\r\n}\r\n#reu-roue-wp .jg-cadran{ position: relative; width: min(228px, 70%); margin: 0 auto; }\r\n#reu-roue-wp .jg-cadran svg{\r\n    display: block; width: 100%; height: auto; overflow: visible;\r\n    animation: jgIn .52s cubic-bezier(.22,1,.36,1) both;\r\n}\r\n#reu-roue-wp .jg-cadran .jg-on{\r\n    stroke: var(--theme-color-text, var(--ui-accent));\r\n    stroke-width: 3; stroke-linecap: round;\r\n}\r\n#reu-roue-wp .jg-cadran .jg-off{ stroke: #d8ded7; stroke-width: 2.3; stroke-linecap: round; }\r\n#reu-roue-wp .jg-cadran .jg-repere{ stroke: var(--ui-muted); stroke-width: 2; stroke-linecap: round; }\r\n\/* Les libell\u00e9s ne bougent jamais pendant le mouvement : le cadran se pose\r\n   d'abord, le nombre et la note se fondent ensuite, l'un apr\u00e8s l'autre. *\/\r\n#reu-roue-wp .jg-val{\r\n    position: absolute; inset: 0; margin: 0; pointer-events: none;\r\n    display: flex; align-items: center; justify-content: center; gap: 3px;\r\n    animation: jgPose .38s ease .32s both;\r\n}\r\n#reu-roue-wp .jg-val b{\r\n    font-size: clamp(30px, 3.2vw, 38px); font-weight: 450; letter-spacing: -1.4px;\r\n    line-height: 1; color: var(--ui-ink); font-variant-numeric: tabular-nums;\r\n}\r\n#reu-roue-wp .jg-val span{\r\n    align-self: center; margin-top: 13px; font-size: 12.5px;\r\n    font-weight: 600; color: var(--ui-faint);\r\n}\r\n#reu-roue-wp .jg-val .jg-nr{ font-size: 25px; color: var(--ui-faint); letter-spacing: 0; }\r\n#reu-roue-wp .jg-note{\r\n    margin: 3px 0 0; text-align: center; font-family: var(--ui-mono);\r\n    font-size: 9px; letter-spacing: .03em; color: var(--ui-faint);\r\n    animation: jgPose .38s ease .4s both;\r\n}\r\n@keyframes jgIn{ from{ opacity:0; transform: rotate(-7deg) scale(.93); } to{ opacity:1; transform:none; } }\r\n@keyframes jgPose{ from{ opacity:0; transform: translateY(5px); } to{ opacity:1; transform:none; } }\r\n\r\n\/* ---- la barre de budget ----\r\n   La longueur enti\u00e8re est le budget total ; la part color\u00e9e, le soutien du\r\n   FIS. Le fond de piste n'est pas un d\u00e9cor : c'est le reste \u00e0 financer, donc\r\n   il se lit comme une donn\u00e9e et porte son montant sous lui. La part garde sa\r\n   proportion exacte, avec un plancher de 4 px pour qu'un soutien \u00e0 5 % reste\r\n   visible \u2014 sur une barre de 300 px, l'\u00e9cart introduit est d'un point et demi. *\/\r\n#reu-roue-wp .bud{\r\n    margin-top: 13px; padding-top: 12px; border-top: 1px solid var(--ui-line-soft);\r\n}\r\n#reu-roue-wp .bud-bar{\r\n    position: relative; height: 30px; border-radius: 9px;\r\n    overflow: hidden; background: #e4e9e3;\r\n}\r\n#reu-roue-wp .bud-fis{\r\n    position: absolute; top: 0; bottom: 0; left: 0; min-width: 4px;\r\n    background: var(--theme-color-text, var(--ui-accent));\r\n    transform-origin: left;\r\n    animation: fisBar .62s cubic-bezier(.22,1,.36,1) both;\r\n}\r\n\/* Les montants se posent une fois la barre arriv\u00e9e, jamais pendant. *\/\r\n#reu-roue-wp .bud-num{\r\n    display: flex; justify-content: space-between; gap: 12px; margin: 9px 0 0;\r\n    animation: jgPose .38s ease .38s both;\r\n}\r\n#reu-roue-wp .bud-num b{\r\n    display: block; font-size: clamp(16px, 1.5vw, 20px); font-weight: 600;\r\n    letter-spacing: -.6px; line-height: 1.15; color: var(--ui-ink);\r\n    font-variant-numeric: tabular-nums; white-space: nowrap;\r\n}\r\n#reu-roue-wp .bud-num > span:first-child b{ color: var(--theme-color-text, var(--ui-accent)); }\r\n#reu-roue-wp .bud-num > span:last-child{ text-align: right; }\r\n#reu-roue-wp .bud-num i{\r\n    display: block; margin-top: 2px; font-style: normal; font-size: 8.5px;\r\n    font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n#reu-roue-wp .bud-total{\r\n    margin: 9px 0 0; text-align: center; font-family: var(--ui-mono);\r\n    font-size: 9px; letter-spacing: .03em; color: var(--ui-faint);\r\n    animation: jgPose .38s ease .46s both;\r\n}\r\n#reu-roue-wp .fin-sommes{\r\n    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px;\r\n    margin-top: 13px; padding-top: 12px; border-top: 1px solid var(--ui-line-soft);\r\n}\r\n#reu-roue-wp .fs-item{\r\n    display: flex; flex-direction: column; gap: 4px; min-width: 0;\r\n    animation: jgPose .38s ease .46s both;\r\n}\r\n#reu-roue-wp .fs-item + .fs-item{ animation-delay: .52s; }\r\n#reu-roue-wp .fs-item span{\r\n    font-size: 8.5px; font-weight: 700; letter-spacing: .12em;\r\n    text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n#reu-roue-wp .fs-item b{\r\n    font-size: clamp(16px, 1.5vw, 20px); font-weight: 600; letter-spacing: -.6px;\r\n    line-height: 1.15; color: var(--ui-ink);\r\n    font-variant-numeric: tabular-nums; white-space: nowrap;\r\n}\r\n#reu-roue-wp .fs-item.is-key b{ color: var(--theme-color-text, var(--ui-accent)); }\r\n#reu-roue-wp .fs-item.is-empty b{\r\n    font-size: 11px; font-weight: 500; letter-spacing: 0;\r\n    color: var(--ui-faint); white-space: normal;\r\n}\r\n\r\n\/* ---- ce que le projet a d\u00e9ploy\u00e9 ---- *\/\r\n#reu-roue-wp .detail-bubbles{\r\n    display: grid; grid-template-columns: repeat(auto-fit, minmax(158px, 1fr));\r\n    gap: 8px; align-items: stretch;\r\n}\r\n#reu-roue-wp .detail-bubble,\r\n#reu-roue-wp .detail-bubble.is-long{\r\n    padding: 12px 14px; border-radius: var(--ui-r-md);\r\n    background: var(--ui-canvas); border: 1px solid var(--ui-line);\r\n    flex: initial; min-width: 0; grid-column: auto;\r\n}\r\n#reu-roue-wp .detail-bubble .db-val,\r\n#reu-roue-wp .detail-bubble.is-long .db-val{\r\n    white-space: normal; overflow-wrap: anywhere; -webkit-line-clamp: 4;\r\n}\r\n#reu-roue-wp .detail-bubble.is-key{ background: var(--ui-sunk); border-color: var(--ui-line); }\r\n#reu-roue-wp .detail-bubble.is-empty{ background: transparent; border-style: dashed; border-color: var(--ui-line); }\r\n#reu-roue-wp .detail-bubble .db-key{ font-size: 8.5px; letter-spacing: .12em; font-weight: 700; color: var(--ui-faint); }\r\n#reu-roue-wp .detail-bubble .db-val{ font-weight: 600; letter-spacing: -.3px; color: var(--ui-ink); }\r\n#reu-roue-wp .detail-bubble.is-empty .db-val{ color: var(--ui-faint); }\r\n\r\n\/* ---- l'inventaire des actions ----\r\n   Une ligne par type d'action : le nombre dans sa colonne, cal\u00e9 \u00e0 droite, le\r\n   nom \u00e0 c\u00f4t\u00e9 en toutes lettres. La carte prend toute la largeur, parce qu'un\r\n   inventaire se lit en lignes et non en tuile ; celle des partenaires qui la\r\n   suit aussi, sans quoi elle resterait seule et \u00e9troite sur sa rang\u00e9e. *\/\r\n#reu-roue-wp .detail-bubble.detail-inv{ gap: 9px; }\r\n#reu-roue-wp .detail-bubble.detail-inv,\r\n#reu-roue-wp .detail-bubble.detail-inv ~ .detail-bubble{ grid-column: 1 \/ -1; }\r\n#reu-roue-wp .inv-nc{\r\n    align-self: flex-start; margin-top: -2px; padding: 1px 8px;\r\n    font-size: 10px; line-height: 1.5; font-weight: 600; color: var(--ui-muted);\r\n    border: 1px solid var(--ui-line); border-radius: 999px;\r\n}\r\n#reu-roue-wp .inv{\r\n    list-style: none; margin: 0; padding: 0;\r\n    display: grid; grid-template-columns: max-content minmax(0, 1fr);\r\n    column-gap: 12px; row-gap: 7px;\r\n}\r\n#reu-roue-wp .inv li{\r\n    display: grid; grid-column: 1 \/ -1; margin: 0; padding: 0;\r\n    grid-template-columns: 46px minmax(0, 1fr);\r\n    grid-template-columns: subgrid; align-items: baseline;\r\n}\r\n#reu-roue-wp .inv-n{\r\n    font-size: 15px; line-height: 1.2; font-weight: 650; letter-spacing: -.3px;\r\n    text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums;\r\n    color: var(--ui-ink);\r\n}\r\n#reu-roue-wp .inv-n.is-puce{ font-size: 13px; font-weight: 400; color: var(--ui-faint); }\r\n#reu-roue-wp .inv-l{ font-size: 12.5px; line-height: 1.45; font-weight: 500; color: var(--ui-ink); }\r\n\r\n\/* ---- les titres de section ---- *\/\r\n#reu-roue-wp .detail-section-title{\r\n    gap: 11px; font-size: 13.5px; font-weight: 700;\r\n    letter-spacing: -.15px; color: var(--ui-ink); margin-bottom: 15px;\r\n}\r\n#reu-roue-wp .detail-section-title::after{\r\n    content: \"\"; flex: 1; height: 1px; background: var(--ui-line-soft);\r\n}\r\n#reu-roue-wp .detail-section-title > span{ width: 24px; height: 24px; border-radius: var(--ui-r-sm); }\r\n#reu-roue-wp .detail-section-intro{ color: var(--ui-muted); max-width: 62ch; }\r\n#reu-roue-wp .detail-summary{ max-width: 68ch; color: var(--ui-ink-soft); }\r\n\r\n\/* ---- les trois promesses ----\r\n   Le filet de couleur passait dans la bordure de la carte : il grossissait\r\n   avec elle. Pos\u00e9 en trait libre \u00e0 l'int\u00e9rieur, il garde la m\u00eame \u00e9paisseur\r\n   quelle que soit la hauteur du texte. *\/\r\n#reu-roue-wp .pr-score{\r\n    font-family: var(--ui-mono); font-size: 9px; font-weight: 500;\r\n    letter-spacing: .08em; text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n#reu-roue-wp .detail-promesses{ gap: 8px; }\r\n#reu-roue-wp .pr-item{\r\n    padding: 14px 16px; background: var(--ui-canvas);\r\n    border: 1px solid var(--ui-line); border-left-width: 1px;\r\n    border-radius: var(--ui-r-md);\r\n    transition: background .25s, box-shadow .25s;\r\n}\r\n#reu-roue-wp .pr-item::before{\r\n    content: \"\"; position: absolute; left: 0; top: 14px; bottom: 14px;\r\n    width: 2px; border-radius: 0 2px 2px 0; background: var(--pc);\r\n}\r\n#reu-roue-wp .pr-item.is-none::before{ background: var(--ui-line); }\r\n#reu-roue-wp .pr-item:hover{\r\n    transform: none; background: var(--ui-surface);\r\n    box-shadow: 0 1px 2px rgba(22,38,44,.05);\r\n}\r\n#reu-roue-wp .pr-head{ font-size: 11.5px; font-weight: 750; letter-spacing: .01em; }\r\n#reu-roue-wp .pr-phrase{ color: var(--ui-faint); }\r\n#reu-roue-wp .pr-text{ color: var(--ui-ink-soft); }\r\n\r\n\/* ---- t\u00e9l\u00e9phone ---- *\/\r\n@media (max-width: 860px){\r\n    #reu-roue-wp .fin-card{ padding: 14px 14px 12px; }\r\n    #reu-roue-wp .jg-cadran{ width: min(168px, 78%); }\r\n    #reu-roue-wp .jg-val b{ font-size: 30px; }\r\n    #reu-roue-wp .fin-sommes{ gap: 8px; }\r\n    #reu-roue-wp .fs-item b{ font-size: 16px; }\r\n    #reu-roue-wp .bud-bar{ height: 26px; border-radius: 8px; }\r\n    #reu-roue-wp .bud-num b{ font-size: 16px; }\r\n}\r\n\r\n\/* ==========================================================================\r\n   L'\u00c9CHELLE DES PERSONNES TOUCH\u00c9ES\r\n   --------------------------------------------------------------------------\r\n   Le corpus va de 10 personnes \u00e0 plus de 10 000 : une r\u00e9glette lin\u00e9aire\r\n   \u00e9craserait quarante projets contre le bord gauche. L'\u00e9chelle est donc\r\n   logarithmique, et ses paliers sont des puissances de dix \u2014 les seuls\r\n   rep\u00e8res qu'on lit sans les calculer. Un curseur, quatre nombres, rien\r\n   d'autre \u00e0 d\u00e9coder.\r\n   ========================================================================== *\/\r\n#reu-roue-wp .pers{\r\n    margin: 0 0 8px; padding: 14px 15px 12px;\r\n    background: var(--ui-canvas); border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n}\r\n#reu-roue-wp .pers-top{ display: flex; align-items: baseline; gap: 10px; margin: 0 0 14px; }\r\n#reu-roue-wp .pers-lab{\r\n    font-size: 8.5px; font-weight: 700; letter-spacing: .12em;\r\n    text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n#reu-roue-wp .pers-num{\r\n    margin-left: auto; font-size: clamp(22px, 2vw, 26px); font-weight: 600;\r\n    letter-spacing: -.9px; line-height: 1; color: var(--ui-ink);\r\n    font-variant-numeric: tabular-nums; white-space: nowrap;\r\n}\r\n\/* Le \u00ab \u2248 \u00bb dit que le chiffre vient d'une phrase, pas d'un relev\u00e9. *\/\r\n#reu-roue-wp .pers-num em{\r\n    font-style: normal; margin-right: 3px; font-size: .62em;\r\n    font-weight: 500; color: var(--ui-faint); vertical-align: .12em;\r\n}\r\n#reu-roue-wp .ech{ position: relative; height: 8px; border-radius: 5px; background: #e4e9e3; }\r\n#reu-roue-wp .ech-fill{\r\n    position: absolute; left: 0; top: 0; bottom: 0; min-width: 8px;\r\n    border-radius: 5px; background: var(--theme-color-text, var(--ui-accent));\r\n    transform-origin: left;\r\n}\r\n#reu-roue-wp .ech-cur{\r\n    position: absolute; top: 50%; width: 15px; height: 15px;\r\n    margin: -7.5px 0 0 -7.5px; border-radius: 50%;\r\n    background: var(--theme-color-text, var(--ui-accent));\r\n    border: 3px solid var(--ui-canvas);\r\n    box-shadow: 0 0 0 1px var(--theme-color-text, var(--ui-accent));\r\n}\r\n#reu-roue-wp .ech-ax{ position: relative; height: 14px; margin: 9px 0 0; }\r\n#reu-roue-wp .ech-ax span{\r\n    position: absolute; transform: translateX(-50%);\r\n    font-family: var(--ui-mono); font-size: 9px; color: var(--ui-faint); white-space: nowrap;\r\n}\r\n#reu-roue-wp .pers-brut{\r\n    margin: 11px 0 0; padding-top: 10px; border-top: 1px solid var(--ui-line-soft);\r\n    font-size: 11px; line-height: 1.6; color: var(--ui-muted); overflow-wrap: anywhere;\r\n}\r\n\r\n\/* ==========================================================================\r\n   APPARITION AU D\u00c9FILEMENT\r\n   --------------------------------------------------------------------------\r\n   Une jauge qui s'est remplie trois \u00e9crans plus bas n'a \u00e9t\u00e9 vue par personne.\r\n   Chaque pi\u00e8ce chiffr\u00e9e attend donc d'entrer dans le champ pour se remplir.\r\n   Tout est gouvern\u00e9 par la classe js-reveal, que le script ne pose que s'il\r\n   dispose d'un IntersectionObserver et que la personne n'a pas demand\u00e9 moins\r\n   de mouvement : sans elle, la fiche s'affiche enti\u00e8re et immobile.\r\n   L'ordre est toujours le m\u00eame \u2014 la forme arrive, le libell\u00e9 se pose apr\u00e8s.\r\n   ========================================================================== *\/\r\n#reu-roue-wp .detail-body.js-reveal .rev{ opacity: 0; animation: none; }\r\n#reu-roue-wp .detail-body.js-reveal .rev.is-in{ opacity: 1; }\r\n\r\n\/* le cadran *\/\r\n#reu-roue-wp .detail-body.js-reveal .jg-cadran svg.is-in{ animation: jgIn .58s cubic-bezier(.22,1,.36,1) both; }\r\n#reu-roue-wp .detail-body.js-reveal .jg-val.is-in{ animation: jgPose .4s ease .3s both; }\r\n#reu-roue-wp .detail-body.js-reveal .jg-note.is-in{ animation: jgPose .4s ease .38s both; }\r\n\r\n\/* les barres : le remplissage part de z\u00e9ro, la lumi\u00e8re le suit une fois *\/\r\n#reu-roue-wp .detail-body.js-reveal .bud-fis.is-in{ animation: fisBar .68s cubic-bezier(.22,1,.36,1) both; }\r\n#reu-roue-wp .detail-body.js-reveal .ech-fill.is-in{ animation: fisBar .68s cubic-bezier(.22,1,.36,1) both; }\r\n#reu-roue-wp .bud-fis::after,\r\n#reu-roue-wp .ech-fill::after{\r\n    content: \"\"; position: absolute; top: 0; bottom: 0; right: 0; width: 42px;\r\n    border-radius: inherit; opacity: 0;\r\n    background: linear-gradient(90deg, transparent, rgba(255,255,255,.55));\r\n}\r\n#reu-roue-wp .bud-fis{ position: absolute; overflow: hidden; }\r\n#reu-roue-wp .detail-body.js-reveal .bud-fis.is-in::after,\r\n#reu-roue-wp .detail-body.js-reveal .ech-fill.is-in::after{ animation: budSheen .68s ease-out both; }\r\n@keyframes budSheen{ 0%{opacity:0} 35%{opacity:.9} 100%{opacity:0} }\r\n\r\n#reu-roue-wp .detail-body.js-reveal .bud-num.is-in{ animation: jgPose .4s ease .32s both; }\r\n#reu-roue-wp .detail-body.js-reveal .bud-total.is-in{ animation: jgPose .4s ease .4s both; }\r\n\r\n\/* l'\u00e9chelle des personnes *\/\r\n#reu-roue-wp .detail-body.js-reveal .pers-top.is-in{ animation: jgPose .4s ease both; }\r\n#reu-roue-wp .detail-body.js-reveal .ech-cur.is-in{ animation: echCur .36s cubic-bezier(.34,1.3,.5,1) .44s both; }\r\n#reu-roue-wp .detail-body.js-reveal .ech-ax.is-in{ animation: jgPose .4s ease .52s both; }\r\n@keyframes echCur{ from{ opacity:0; transform: scale(.4); } to{ opacity:1; transform: none; } }\r\n\r\n\/* les cartes : un \u00e9chelonnement court, jamais une cascade *\/\r\n#reu-roue-wp .detail-body.js-reveal .detail-bubble.is-in,\r\n#reu-roue-wp .detail-body.js-reveal .pr-item.is-in{ animation: jgPose .42s ease both; }\r\n#reu-roue-wp .detail-body.js-reveal .detail-bubble.is-in:nth-child(2),\r\n#reu-roue-wp .detail-body.js-reveal .pr-item.is-in:nth-child(2){ animation-delay: .07s; }\r\n#reu-roue-wp .detail-body.js-reveal .detail-bubble.is-in:nth-child(3),\r\n#reu-roue-wp .detail-body.js-reveal .pr-item.is-in:nth-child(3){ animation-delay: .14s; }\r\n\r\n@media (max-width: 860px){\r\n    #reu-roue-wp .pers{ padding: 13px 13px 11px; }\r\n    #reu-roue-wp .pers-num{ font-size: 22px; }\r\n}\r\n\r\n\/* ============================================================\r\n   ENTR\u00c9E DE PAGE \u2014 voile de chargement puis pose des \u00e9l\u00e9ments\r\n   R\u00e8gle de lecture : le mouvement porte les formes (bandeau,\r\n   disque, cartes) ; les libell\u00e9s, eux, ne bougent pas pendant\r\n   le d\u00e9placement, ils se posent apr\u00e8s, en fondu \u00e9chelonn\u00e9.\r\n   Tout est pilot\u00e9 par deux classes sur #reu-roue-wp :\r\n   .is-booting (\u00e9tat cach\u00e9) puis .is-ready (la chor\u00e9graphie).\r\n   ============================================================ *\/\r\n#reu-roue-wp{ --fis-ease: cubic-bezier(.16,1,.3,1); }\r\n\r\n@keyframes fisBootRise{ from{ opacity:0; transform: translateY(15px); } to{ opacity:1; transform:none; } }\r\n@keyframes fisBootDrop{ from{ opacity:0; transform: translateY(-11px); } to{ opacity:1; transform:none; } }\r\n@keyframes fisBootSide{ from{ opacity:0; transform: translateX(-14px); } to{ opacity:1; transform:none; } }\r\n@keyframes fisBootPose{ from{ opacity:0; } to{ opacity:1; } }\r\n@keyframes fisBootDisc{\r\n    from{ opacity:0; transform: scale(.86) rotate(-6deg); }\r\n    60% { opacity:1; }\r\n    to  { opacity:1; transform: none; }\r\n}\r\n@keyframes fisBootSweep{ 0%{ background-position: -50% 0; } 100%{ background-position: 150% 0; } }\r\n@keyframes fisBootPulse{ 0%,100%{ opacity:.35; transform: scale(.82); } 50%{ opacity:1; transform: scale(1); } }\r\n\r\n\/* ---- le voile de chargement ---- *\/\r\n#reu-roue-wp .chart-loading{\r\n    position:absolute; inset:0; z-index:40;\r\n    display:flex; flex-direction:column; align-items:center; justify-content:center;\r\n    gap:18px; max-width:none; padding:0; text-align:center;\r\n    background: radial-gradient(120% 80% at 50% 45%, #ffffff 0%, #fbfcfa 55%, #f4f6f2 100%);\r\n    font-size:11px; letter-spacing:.14em; text-transform:uppercase; font-weight:700;\r\n    color:#8a9a9c;\r\n    transition: opacity .55s var(--fis-ease), visibility .55s;\r\n}\r\n#reu-roue-wp .chart-loading[hidden]{ display:none; }\r\n#reu-roue-wp .chart-loading.is-out{ opacity:0; visibility:hidden; pointer-events:none; }\r\n\/* la pastille tournante devient trois points qui respirent : moins\r\n   m\u00e9canique, et raccord avec la trame du reste de la page *\/\r\n#reu-roue-wp .chart-loading > span{\r\n    position:relative; display:block;\r\n    width:8px; height:8px; border:0; border-radius:50%;\r\n    background: linear-gradient(140deg, #92b3a0, #345e66);\r\n    animation: fisBootPulse 1.25s var(--fis-ease) .16s infinite;\r\n}\r\n#reu-roue-wp .chart-loading > span::before,\r\n#reu-roue-wp .chart-loading > span::after{\r\n    content:\"\"; position:absolute; top:0;\r\n    width:8px; height:8px; border-radius:50%;\r\n    background: linear-gradient(140deg, #92b3a0, #345e66);\r\n    animation: fisBootPulse 1.25s var(--fis-ease) infinite;\r\n}\r\n#reu-roue-wp .chart-loading > span::before{ left:-15px; animation-delay:0s; }\r\n#reu-roue-wp .chart-loading > span::after{ left:15px; animation-delay:.32s; }\r\n\/* une barre de progression ind\u00e9termin\u00e9e, fine, sous le texte *\/\r\n#reu-roue-wp .chart-loading::after{\r\n    content:\"\"; width:132px; height:2px; border-radius:2px;\r\n    background-color: rgba(52,94,102,.12);\r\n    background-image: linear-gradient(90deg, transparent, #678b7a, transparent);\r\n    background-size: 45% 100%; background-repeat:no-repeat;\r\n    animation: fisBootSweep 1.5s var(--fis-ease) infinite;\r\n}\r\n\r\n\/* ---- \u00e9tat cach\u00e9 avant la chor\u00e9graphie ---- *\/\r\n#reu-roue-wp.is-booting .brand,\r\n#reu-roue-wp.is-booting .toggle-group .toggle-btn,\r\n#reu-roue-wp.is-booting .edition,\r\n#reu-roue-wp.is-booting .intro > *,\r\n#reu-roue-wp.is-booting .toolbar,\r\n#reu-roue-wp.is-booting .explore-list > *,\r\n#reu-roue-wp.is-booting .reading-note,\r\n#reu-roue-wp.is-booting .stage-heading,\r\n#reu-roue-wp.is-booting .stage-caption,\r\n#reu-roue-wp.is-booting .legend,\r\n#reu-roue-wp.is-booting .legend-list > li,\r\n#reu-roue-wp.is-booting .app-footer,\r\n#reu-roue-wp.is-booting #chart-container > svg,\r\n#reu-roue-wp.is-booting #chart-container > svg .labels,\r\n#reu-roue-wp.is-booting #chart-container > svg .center{ opacity:0; }\r\n\r\n\/* ---- 1. le cadre institutionnel descend ---- *\/\r\n#reu-roue-wp.is-ready .brand{ animation: fisBootDrop .7s var(--fis-ease) both; }\r\n#reu-roue-wp.is-ready .toggle-group .toggle-btn{ animation: fisBootDrop .6s var(--fis-ease) both; }\r\n#reu-roue-wp.is-ready .toggle-group .toggle-btn:nth-child(1){ animation-delay:.08s; }\r\n#reu-roue-wp.is-ready .toggle-group .toggle-btn:nth-child(2){ animation-delay:.14s; }\r\n#reu-roue-wp.is-ready .toggle-group .toggle-btn:nth-child(3){ animation-delay:.20s; }\r\n#reu-roue-wp.is-ready .toggle-group .toggle-btn:nth-child(4){ animation-delay:.26s; }\r\n#reu-roue-wp.is-ready .toggle-group .toggle-btn:nth-child(5){ animation-delay:.30s; }\r\n#reu-roue-wp.is-ready .toggle-group .toggle-btn:nth-child(6){ animation-delay:.34s; }\r\n#reu-roue-wp.is-ready .edition{ animation: fisBootDrop .6s var(--fis-ease) .38s both; }\r\n\r\n\/* ---- 2. le disque s'installe (formes en mouvement) ---- *\/\r\n#reu-roue-wp.is-ready #chart-container > svg{\r\n    animation: fisBootDisc 1.05s var(--fis-ease) .12s both;\r\n    transform-origin: 50% 52%;\r\n}\r\n\/* ---- 3. les textes du disque se posent, une fois le disque immobile ---- *\/\r\n#reu-roue-wp.is-ready #chart-container > svg .labels{ animation: fisBootPose .5s ease .96s both; }\r\n#reu-roue-wp.is-ready #chart-container > svg .center{ animation: fisBootPose .5s ease 1.04s both; }\r\n\r\n\/* ---- 4. la colonne \u00e9ditoriale : titre, sous-titre, rep\u00e8res ---- *\/\r\n#reu-roue-wp.is-ready .intro > *{ animation: fisBootRise .68s var(--fis-ease) both; }\r\n#reu-roue-wp.is-ready .intro > *:nth-child(1){ animation-delay:.34s; }\r\n#reu-roue-wp.is-ready .intro > *:nth-child(2){ animation-delay:.44s; }\r\n#reu-roue-wp.is-ready .intro > *:nth-child(3){ animation-delay:.54s; }\r\n#reu-roue-wp.is-ready .toolbar{ animation: fisBootRise .68s var(--fis-ease) .64s both; }\r\n#reu-roue-wp.is-ready .explore-list > *{ animation: fisBootSide .5s var(--fis-ease) both; }\r\n#reu-roue-wp.is-ready .explore-list > *:nth-child(1){ animation-delay:.76s; }\r\n#reu-roue-wp.is-ready .explore-list > *:nth-child(2){ animation-delay:.82s; }\r\n#reu-roue-wp.is-ready .explore-list > *:nth-child(3){ animation-delay:.88s; }\r\n#reu-roue-wp.is-ready .explore-list > *:nth-child(4){ animation-delay:.94s; }\r\n#reu-roue-wp.is-ready .explore-list > *:nth-child(5){ animation-delay:1s; }\r\n#reu-roue-wp.is-ready .explore-list > *:nth-child(n+6){ animation-delay:1.06s; }\r\n#reu-roue-wp.is-ready .reading-note{ animation: fisBootRise .6s var(--fis-ease) 1.08s both; }\r\n\r\n\/* ---- 5. les rep\u00e8res du disque, puis la l\u00e9gende ---- *\/\r\n#reu-roue-wp.is-ready .stage-heading{ animation: fisBootPose .55s ease 1.02s both; }\r\n#reu-roue-wp.is-ready .stage-caption{ animation: fisBootRise .6s var(--fis-ease) 1.12s both; }\r\n#reu-roue-wp.is-ready .legend{ animation: fisBootRise .7s var(--fis-ease) 1.02s both; }\r\n#reu-roue-wp.is-ready .legend-list > li{ animation: fisBootSide .46s var(--fis-ease) both; }\r\n#reu-roue-wp.is-ready .legend-list > li:nth-child(1){ animation-delay:1.16s; }\r\n#reu-roue-wp.is-ready .legend-list > li:nth-child(2){ animation-delay:1.22s; }\r\n#reu-roue-wp.is-ready .legend-list > li:nth-child(3){ animation-delay:1.28s; }\r\n#reu-roue-wp.is-ready .legend-list > li:nth-child(4){ animation-delay:1.34s; }\r\n#reu-roue-wp.is-ready .legend-list > li:nth-child(5){ animation-delay:1.40s; }\r\n#reu-roue-wp.is-ready .legend-list > li:nth-child(6){ animation-delay:1.46s; }\r\n#reu-roue-wp.is-ready .legend-list > li:nth-child(7){ animation-delay:1.52s; }\r\n#reu-roue-wp.is-ready .legend-list > li:nth-child(8){ animation-delay:1.58s; }\r\n#reu-roue-wp.is-ready .legend-list > li:nth-child(n+9){ animation-delay:1.64s; }\r\n\r\n\/* ---- 6. le pied de page ferme la s\u00e9quence ---- *\/\r\n#reu-roue-wp.is-ready .app-footer{ animation: fisBootPose .6s ease 1.5s both; }\r\n\r\n@media (prefers-reduced-motion: reduce){\r\n    #reu-roue-wp.is-booting .brand,\r\n    #reu-roue-wp.is-booting .toggle-group .toggle-btn,\r\n    #reu-roue-wp.is-booting .edition,\r\n    #reu-roue-wp.is-booting .intro > *,\r\n    #reu-roue-wp.is-booting .toolbar,\r\n    #reu-roue-wp.is-booting .explore-list > *,\r\n    #reu-roue-wp.is-booting .reading-note,\r\n    #reu-roue-wp.is-booting .stage-heading,\r\n    #reu-roue-wp.is-booting .stage-caption,\r\n    #reu-roue-wp.is-booting .legend,\r\n    #reu-roue-wp.is-booting .legend-list > li,\r\n    #reu-roue-wp.is-booting .app-footer,\r\n    #reu-roue-wp.is-booting #chart-container > svg,\r\n    #reu-roue-wp.is-booting #chart-container > svg .labels,\r\n    #reu-roue-wp.is-booting #chart-container > svg .center{ opacity:1; }\r\n    #reu-roue-wp.is-ready *{ animation: none !important; }\r\n    #reu-roue-wp .chart-loading > span,\r\n    #reu-roue-wp .chart-loading > span::before,\r\n    #reu-roue-wp .chart-loading > span::after,\r\n    #reu-roue-wp .chart-loading::after{ animation: none !important; }\r\n}\r\n\r\n\/* ============================================================\r\n   LA FICHE SUR LES PETITS CADRES\r\n   Deux \u00e9cueils, tous deux constat\u00e9s \u00e0 l'usage :\r\n   \u2014 entre 861 et 1000 px, la fiche devait devenir un bandeau\r\n     bas, mais la largeur fixe pos\u00e9e plus haut la ramenait en\r\n     carte \u00e9troite cal\u00e9e \u00e0 gauche, coup\u00e9e en pleine lecture ;\r\n   \u2014 sur un cadre bas (une page WordPress, un portable 13\"),\r\n     elle garde une typographie et des marges pens\u00e9es pour un\r\n     grand panneau : on ne voit plus que le titre et la moiti\u00e9\r\n     d'une jauge, et il faut faire d\u00e9filer pour tout le reste.\r\n   D'o\u00f9 ce dernier bloc, qui reprend la main sur les deux.\r\n   ============================================================ *\/\r\n@media (max-width: 1000px) and (min-width: 861px){\r\n    #reu-roue-wp .detail{\r\n        top: auto; left: 12px; right: 12px; bottom: 12px;\r\n        width: auto; max-width: none;\r\n        max-height: min(58vh, 420px);\r\n        transform: translateY(26px);\r\n    }\r\n    #reu-roue-wp .detail.is-open{ transform: translateY(0); }\r\n    #reu-roue-wp .detail.is-expanded{ width: auto; max-height: min(82vh, 640px); }\r\n}\r\n\r\n\/* Cadre bas : la fiche se resserre. M\u00eames informations, m\u00eame\r\n   hi\u00e9rarchie, simplement \u00e0 l'\u00e9chelle de la place disponible. *\/\r\n@media (min-width: 1001px) and (max-height: 720px){\r\n    #reu-roue-wp .detail{ top: 12px; bottom: 12px; }\r\n    #reu-roue-wp .detail-toolbar{ padding: 11px 18px 9px; }\r\n    #reu-roue-wp .detail-nav{ padding: 0 18px; }\r\n    #reu-roue-wp .detail-nav button{ padding: 9px 4px 10px; font-size: 9.5px; }\r\n    #reu-roue-wp .detail-body,\r\n    #reu-roue-wp .detail.is-expanded .detail-body{ padding: 18px 20px 18px; }\r\n    #reu-roue-wp .detail-eyebrow{ margin: 0 0 9px; }\r\n    #reu-roue-wp .detail-logo{ width: 46px; height: 46px; border-radius: 11px; }\r\n    #reu-roue-wp .detail-title{ font-size: clamp(19px, 1.7vw, 24px); margin: 0 0 8px; letter-spacing: -.6px; }\r\n    #reu-roue-wp .detail-project-name{ font-size: 12.5px; line-height: 1.55; margin: 0 0 10px; }\r\n    #reu-roue-wp .detail-territory{ font-size: 10.5px; margin: 0 0 10px; }\r\n    #reu-roue-wp .detail-section{ padding-top: 17px; margin-top: 17px; }\r\n    #reu-roue-wp .detail-section-title{ font-size: 12.5px; }\r\n    #reu-roue-wp .fin-card{ padding: 13px 13px 10px; margin: 0 0 8px; }\r\n    #reu-roue-wp .jg-cadran{ width: min(148px, 54%); }\r\n    #reu-roue-wp .jg-val b{ font-size: clamp(24px, 2.4vw, 28px); }\r\n    #reu-roue-wp .pers{ padding: 11px 12px 10px; }\r\n    #reu-roue-wp .pers-num{ font-size: clamp(19px, 1.7vw, 22px); }\r\n    #reu-roue-wp .bud-bar{ height: 26px; }\r\n}\r\n\r\n\/* ==========================================================================\r\n   CLASSEMENT \u2014 la donn\u00e9e de la roue, mise en rangs\r\n   --------------------------------------------------------------------------\r\n   La roue dit de quoi le fonds est fait ; elle ne dit pas, au premier coup\r\n   d'oeil, qui p\u00e8se le plus : neuf secteurs \u00e0 parts \u00e9gales se comparent mal.\r\n   Cette vue range donc les th\u00e9matiques par nombre de projets et donne trois\r\n   lectures du m\u00eame nombre, pour trois distances de lecture :\r\n     \u2014 la barre, pour l'ordre de grandeur, lisible du fond d'une salle ;\r\n     \u2014 la trame de points, un point par projet, pour compter sans lire ;\r\n     \u2014 le nombre, pour qui le cherche.\r\n   Une ligne est un bouton : elle ouvre la th\u00e9matique dans la roue.\r\n   ========================================================================== *\/\r\n#reu-roue-wp[data-view=\"classement\"] .header > *{ display: none; }\r\n#reu-roue-wp[data-view=\"classement\"] .header{\r\n    position: absolute; inset: 0; width: auto; max-width: none;\r\n    padding: 0; margin: 0; border: 0; background: none;\r\n    pointer-events: none; overflow: visible;\r\n}\r\n#reu-roue-wp[data-view=\"classement\"] .stage-heading,\r\n#reu-roue-wp[data-view=\"classement\"] .stage-caption{ display: none; }\r\n#reu-roue-wp .stage-panel.rang{\r\n    top: 0; padding: 0; overflow: hidden;\r\n    display: flex; flex-direction: column;\r\n}\r\n#reu-roue-wp .stage-panel.rang[hidden]{ display: none; }\r\n\r\n#reu-roue-wp .rg-cadre{\r\n    flex: 1; min-height: 0; overflow: hidden;\r\n    padding: 8px clamp(12px, 2vw, 30px) 10px;\r\n    display: flex; flex-direction: column;\r\n}\r\n\r\n\/* ---- le chapeau : d'o\u00f9 l'on parle, et comment lire une ligne ---- *\/\r\n#reu-roue-wp .rg-tete{\r\n    display: flex; align-items: flex-end; justify-content: space-between;\r\n    gap: 28px; flex-wrap: wrap;\r\n}\r\n#reu-roue-wp .rg-eyebrow{\r\n    margin: 0 0 10px; font-size: 9px; font-weight: 800;\r\n    letter-spacing: .16em; text-transform: uppercase;\r\n    color: var(--theme-accent, #a8603f);\r\n}\r\n#reu-roue-wp .rg-titre{\r\n    margin: 0; font-size: clamp(24px, 3.1vw, 40px); font-weight: 750;\r\n    line-height: 1.08; letter-spacing: -1.1px; color: var(--ui-ink, #1f3147);\r\n    max-width: 18ch; text-wrap: balance;\r\n}\r\n#reu-roue-wp .rg-mode{\r\n    margin: 0 0 4px; max-width: 30ch; font-size: 10.5px; line-height: 1.6;\r\n    color: var(--ui-muted, #64748b);\r\n}\r\n\r\n\/* ---- la table ---- *\/\r\n#reu-roue-wp .rg-liste{\r\n    list-style: none; margin: 0; padding: 0;\r\n    display: flex; flex-direction: column; gap: 6px;\r\n}\r\n#reu-roue-wp .rg-ligne{ margin: 0; }\r\n#reu-roue-wp .rg-clic{\r\n    width: 100%; display: grid; align-items: center;\r\n    grid-template-columns: 34px minmax(104px, 1.05fr) minmax(90px, 3.2fr) 74px auto;\r\n    gap: clamp(8px, 1.4vw, 20px);\r\n    padding: clamp(8px, 1.3vh, 13px) clamp(10px, 1.2vw, 18px);\r\n    font: inherit; text-align: left; cursor: pointer;\r\n    background: var(--ui-surface, #fffefb);\r\n    border: 1px solid var(--ui-line, #e6eae3);\r\n    border-radius: 12px;\r\n    transition: border-color .25s, box-shadow .25s, transform .25s, background .25s;\r\n}\r\n#reu-roue-wp .rg-clic:hover{\r\n    transform: translateX(2px);\r\n    border-color: color-mix(in srgb, var(--teinte) 55%, transparent);\r\n    box-shadow: 0 6px 18px rgba(29, 60, 73, .09);\r\n}\r\n#reu-roue-wp .rg-clic:focus-visible{ outline: 2px solid var(--teinte); outline-offset: 2px; }\r\n\r\n#reu-roue-wp .rg-rang{\r\n    font-family: var(--ui-mono, ui-monospace, monospace);\r\n    font-size: 9.5px; font-weight: 500; letter-spacing: .06em;\r\n    color: var(--ui-faint, #9aa8a4);\r\n}\r\n#reu-roue-wp .rg-nom{\r\n    display: flex; align-items: center; gap: 9px; min-width: 0;\r\n    font-size: clamp(11px, 1.05vw, 13px); font-weight: 650;\r\n    color: var(--ui-ink, #1f3147); letter-spacing: -.1px;\r\n    \/* \u00ab Discriminations \u00bb est un seul mot : sans cette coupure il d\u00e9borde de\r\n       sa colonne sur t\u00e9l\u00e9phone et passe sous la barre. *\/\r\n    overflow-wrap: anywhere; line-height: 1.3;\r\n}\r\n#reu-roue-wp .rg-puce{\r\n    width: 9px; height: 9px; border-radius: 50%; flex: none;\r\n    background: var(--teinte);\r\n}\r\n#reu-roue-wp .rg-piste{\r\n    position: relative; height: 15px; border-radius: 8px;\r\n    background: rgba(31, 49, 71, .05);\r\n}\r\n#reu-roue-wp .rg-barre{\r\n    position: absolute; inset: 0 auto 0 0; border-radius: 8px;\r\n    background: linear-gradient(90deg,\r\n        color-mix(in srgb, var(--teinte) 82%, #ffffff),\r\n        var(--teinte));\r\n}\r\n#reu-roue-wp .rg-val{\r\n    display: flex; align-items: baseline; gap: 5px;\r\n    font-size: clamp(15px, 1.5vw, 19px); font-weight: 600;\r\n    letter-spacing: -.6px; color: var(--ui-ink, #1f3147);\r\n    font-variant-numeric: tabular-nums;\r\n}\r\n#reu-roue-wp .rg-val span{\r\n    font-size: 9px; font-weight: 500; letter-spacing: 0;\r\n    color: var(--ui-faint, #9aa8a4);\r\n}\r\n#reu-roue-wp .rg-points{ display: flex; gap: 4px; flex: none; }\r\n#reu-roue-wp .rg-pt{\r\n    width: 6px; height: 6px; border-radius: 50%;\r\n    background: rgba(31, 49, 71, .11);\r\n}\r\n#reu-roue-wp .rg-pt.is-on{ background: var(--teinte); }\r\n\r\n\/* ---- le pied : la note de lecture et les deux commandes ---- *\/\r\n#reu-roue-wp .rg-pied{\r\n    display: flex; align-items: center; justify-content: space-between;\r\n    gap: 18px; flex-wrap: wrap;\r\n    padding-top: 4px;\r\n}\r\n#reu-roue-wp .rg-note{\r\n    margin: 0; font-size: 9.5px; line-height: 1.6; color: var(--ui-faint, #9aa8a4);\r\n}\r\n#reu-roue-wp .rg-note b{ color: var(--ui-muted, #64748b); font-weight: 700; }\r\n#reu-roue-wp .rg-actions{ display: flex; gap: 8px; flex: none; }\r\n#reu-roue-wp .rg-btn{\r\n    font: inherit; font-size: 10px; font-weight: 600; cursor: pointer;\r\n    padding: 8px 14px; border-radius: 9px;\r\n    color: var(--ui-muted, #64748b);\r\n    background: var(--ui-surface, #fffefb);\r\n    border: 1px solid var(--ui-line, #e6eae3);\r\n    transition: background .22s, color .22s, border-color .22s, transform .22s;\r\n}\r\n#reu-roue-wp .rg-btn:hover{ background: var(--ui-sunk, #eef2ec); color: var(--ui-ink, #1f3147); transform: translateY(-1px); }\r\n#reu-roue-wp .rg-btn.is-fort{ background: #203e49; border-color: #203e49; color: #fff; }\r\n#reu-roue-wp .rg-btn.is-fort:hover{ background: #16303a; color: #fff; }\r\n\r\n\/* ---- la courbe : l'argent projet par projet ----\r\n   Un plan cart\u00e9sien pos\u00e9 dans la m\u00eame grammaire que le reste du site :\r\n   surface claire, filet discret, monospace pour les chiffres de service, et\r\n   les neuf teintes de la roue pour les courbes. *\/\r\n#reu-roue-wp .rg-courbe{\r\n    flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 8px;\r\n    padding: 12px clamp(12px, 1.4vw, 20px);\r\n    border: 1px solid var(--ui-line, #e6eae3);\r\n    border-radius: 14px;\r\n    background: var(--ui-surface, #fffefb);\r\n}\r\n\/* Pas de `:empty { display: none }` ici : le cadre vide serait alors de\r\n   largeur nulle, et le dessin qui attend une mesure ne l'obtiendrait jamais.\r\n   Il reste donc dans le flux, sans bordure ni fond tant qu'il est vide. *\/\r\n#reu-roue-wp .rg-courbe:empty{ padding: 0; border: 0; background: none; }\r\n#reu-roue-wp .pn-tete{\r\n    display: flex; align-items: baseline; justify-content: space-between;\r\n    gap: 20px; flex-wrap: wrap;\r\n}\r\n#reu-roue-wp .pn-titre{\r\n    margin: 0; font-size: clamp(13px, 1.3vw, 16px); font-weight: 750;\r\n    letter-spacing: -.3px; color: var(--ui-ink, #1f3147);\r\n}\r\n#reu-roue-wp .pn-mode{\r\n    margin: 0; max-width: 46ch; font-size: 9.5px; line-height: 1.6;\r\n    color: var(--ui-muted, #64748b);\r\n}\r\n#reu-roue-wp .pn-scene{ width: 100%; }\r\n#reu-roue-wp .pn-svg{ width: 100%; height: auto; display: block; }\r\n\r\n\/* ---- le plan ---- *\/\r\n#reu-roue-wp .cb-grille line{ stroke: var(--ui-line, #e6eae3); stroke-width: 1; stroke-dasharray: 2 5; }\r\n#reu-roue-wp .cb-base{ stroke: rgba(31, 49, 71, .22); stroke-width: 1; }\r\n#reu-roue-wp .cb-axe text{\r\n    font-family: var(--ui-mono, ui-monospace, monospace);\r\n    font-size: 9px; fill: var(--ui-faint, #9aa8a4);\r\n}\r\n#reu-roue-wp .cb-unite{\r\n    font-family: var(--ui-mono, ui-monospace, monospace);\r\n    font-size: 8px; letter-spacing: .12em; text-transform: uppercase;\r\n    fill: var(--ui-faint, #9aa8a4);\r\n}\r\n\r\n\/* ---- les courbes ---- *\/\r\n#reu-roue-wp .cb-item{ cursor: pointer; }\r\n#reu-roue-wp .cb-item:focus{ outline: none; }\r\n#reu-roue-wp .cb-prise{\r\n    fill: none; stroke: transparent; stroke-width: 16; stroke-linecap: round;\r\n}\r\n#reu-roue-wp .cb-trait{\r\n    fill: none; stroke: var(--teinte); stroke-width: 2.6;\r\n    stroke-linecap: round; stroke-linejoin: round;\r\n    opacity: .9;\r\n    transition: opacity .25s ease, stroke-width .25s ease;\r\n}\r\n#reu-roue-wp .cb-pt{\r\n    fill: var(--teinte); stroke: var(--ui-surface, #fffefb); stroke-width: 1.4;\r\n    transition: opacity .25s ease;\r\n}\r\n#reu-roue-wp .cb-item:hover .cb-trait,\r\n#reu-roue-wp .cb-item:focus-visible .cb-trait,\r\n#reu-roue-wp .cb-item.is-on .cb-trait{ opacity: 1; stroke-width: 3.6; }\r\n\/* Isoler : les autres courbes reculent sans dispara\u00eetre, pour que celle qu'on\r\n   regarde garde son rang au milieu des autres. *\/\r\n#reu-roue-wp .pn-scene.is-focus .cb-item:not(.is-on) .cb-trait{ opacity: .12; }\r\n#reu-roue-wp .pn-scene.is-focus .cb-item:not(.is-on) .cb-pt{ opacity: .12; }\r\n\r\n\/* ---- la l\u00e9gende ---- *\/\r\n#reu-roue-wp .pn-leg{\r\n    display: flex; flex-wrap: wrap; gap: 4px 6px;\r\n}\r\n#reu-roue-wp .cb-chip{\r\n    display: inline-flex; align-items: center; gap: 7px;\r\n    font: inherit; font-size: 10px; cursor: pointer;\r\n    padding: 4px 8px; border-radius: 999px;\r\n    color: var(--ui-ink, #1f3147);\r\n    background: var(--ui-surface, #fffefb);\r\n    border: 1px solid var(--ui-line, #e6eae3);\r\n    transition: border-color .22s, background .22s, opacity .22s, transform .22s;\r\n}\r\n#reu-roue-wp .cb-chip:hover,\r\n#reu-roue-wp .cb-chip.is-on{\r\n    border-color: color-mix(in srgb, var(--teinte) 60%, transparent);\r\n    background: color-mix(in srgb, var(--teinte) 9%, #ffffff);\r\n    transform: translateY(-1px);\r\n}\r\n#reu-roue-wp .cb-chip:focus-visible{ outline: 2px solid var(--teinte); outline-offset: 2px; }\r\n#reu-roue-wp .pn-leg.is-focus .cb-chip:not(.is-on){ opacity: .35; }\r\n#reu-roue-wp .cb-puce{\r\n    width: 9px; height: 9px; border-radius: 50%; flex: none;\r\n    background: var(--teinte);\r\n}\r\n#reu-roue-wp .cb-nom{ font-weight: 650; letter-spacing: -.1px; }\r\n#reu-roue-wp .cb-chiffre{\r\n    font-family: var(--ui-mono, ui-monospace, monospace);\r\n    font-size: 9px; color: var(--ui-faint, #9aa8a4);\r\n    font-variant-numeric: tabular-nums;\r\n}\r\n#reu-roue-wp .pn-note{\r\n    margin: 0; font-size: 9.5px; line-height: 1.6; color: var(--ui-faint, #9aa8a4);\r\n}\r\n#reu-roue-wp .pn-note b{ color: var(--ui-muted, #64748b); font-weight: 700; }\r\n@media (max-width: 700px){\r\n    #reu-roue-wp .pn-mode{ display: none; }\r\n    #reu-roue-wp .cb-chip{ font-size: 10.5px; padding: 6px 10px; }\r\n    #reu-roue-wp .cb-chiffre{ font-size: 9.5px; }\r\n}\r\n\r\n\/* ---- entr\u00e9e : les barres poussent, les textes se posent apr\u00e8s ----\r\n   Une barre qui grandit pendant qu'on essaie de lire son nombre, c'est un\r\n   nombre qu'on ne lit pas. Le mouvement d'abord, les libell\u00e9s ensuite. *\/\r\n@keyframes rgPousse{ from{ transform: scaleX(0); } to{ transform: scaleX(1); } }\r\n@keyframes rgPose{ from{ opacity: 0; transform: translateY(5px); } to{ opacity: 1; transform: none; } }\r\n@keyframes rgPoint{ from{ opacity: 0; transform: scale(.4); } to{ opacity: 1; transform: none; } }\r\n#reu-roue-wp .rg-anim .rg-clic{ animation: rgPose .5s cubic-bezier(.16,1,.3,1) both; animation-delay: calc(var(--i) * 55ms); }\r\n#reu-roue-wp .rg-anim .rg-barre{\r\n    transform-origin: left center;\r\n    animation: rgPousse .72s cubic-bezier(.16,1,.3,1) both;\r\n    animation-delay: calc(var(--i) * 55ms + 90ms);\r\n}\r\n#reu-roue-wp .rg-anim .rg-val,\r\n#reu-roue-wp .rg-anim .rg-nom{\r\n    animation: rgPose .42s ease both;\r\n    animation-delay: calc(var(--i) * 55ms + 620ms);\r\n}\r\n#reu-roue-wp .rg-anim .rg-pt{\r\n    animation: rgPoint .3s cubic-bezier(.34,1.3,.5,1) both;\r\n    animation-delay: calc(var(--i) * 55ms + 680ms + var(--j) * 22ms);\r\n}\r\n#reu-roue-wp .rg-anim .rg-pied{ animation: rgPose .5s ease 1.1s both; }\r\n\r\n@media (max-width: 1000px){\r\n    #reu-roue-wp .rg-clic{ grid-template-columns: 26px minmax(86px, 1.1fr) minmax(70px, 2.4fr) 62px; }\r\n    #reu-roue-wp .rg-points{ display: none; }\r\n    #reu-roue-wp .rg-mode{ display: none; }\r\n}\r\n@media (max-width: 700px){\r\n    #reu-roue-wp .rg-clic{ grid-template-columns: 20px minmax(96px, 1.35fr) minmax(40px, 1.15fr) 50px; gap: 7px; padding: 9px 10px; }\r\n    #reu-roue-wp .rg-nom{ font-size: 11px; gap: 7px; }\r\n    #reu-roue-wp .rg-titre{ font-size: 21px; max-width: none; }\r\n    #reu-roue-wp .rg-cadre{ padding: 14px 14px 14px; gap: 12px; }\r\n}\r\n@media (prefers-reduced-motion: reduce){\r\n    #reu-roue-wp .rg-anim .rg-clic,\r\n    #reu-roue-wp .rg-anim .rg-barre,\r\n    #reu-roue-wp .rg-anim .rg-val,\r\n    #reu-roue-wp .rg-anim .rg-nom,\r\n    #reu-roue-wp .rg-anim .rg-pt,\r\n    #reu-roue-wp .rg-anim .rg-pied{ animation: none; }\r\n}\r\n\r\n\/* ==========================================================================\r\n   FLUX : ce que chaque th\u00e9matique verse aux trois \u00e9tages\r\n   --------------------------------------------------------------------------\r\n   La roue dit de quoi le fonds est fait, le classement dit qui p\u00e8se le plus,\r\n   les \u00e9tages disent ce que le fonds promet. Aucune des trois ne montre le\r\n   croisement : quelle th\u00e9matique nourrit quelle promesse. C'est le seul objet\r\n   de cette vue, et ce croisement n'a qu'une forme naturelle, le ruban. Neuf\r\n   piliers \u00e0 gauche (les th\u00e9matiques), trois \u00e0 droite (les promesses), et\r\n   entre eux des rubans dont l'\u00e9paisseur est un nombre de projets.\r\n   Trois partis pris :\r\n     1. L'ordre des th\u00e9matiques reste celui de la roue et de la l\u00e9gende, pas\r\n        celui des poids : on passe d'une vue \u00e0 l'autre sans r\u00e9apprendre.\r\n     2. Un projet qui documente les trois promesses passe dans TROIS rubans.\r\n        Les 48 projets tracent donc 111 passages, et le pied de page le dit,\r\n        sinon la somme des rubans contredirait le compteur du fonds.\r\n     3. Survoler isole, la l\u00e9gende ne filtre pas : r\u00e9duire le flux \u00e0 une seule\r\n        th\u00e9matique lui retirerait sa raison d'\u00eatre. Le filtre reste donc\r\n        rang\u00e9, comme sur le classement.\r\n   ========================================================================== *\/\r\n#reu-roue-wp[data-view=\"flux\"] .header > *{ display: none; }\r\n#reu-roue-wp[data-view=\"flux\"] .header{\r\n    position: absolute; inset: 0; width: auto; max-width: none;\r\n    padding: 0; margin: 0; border: 0; background: none;\r\n    pointer-events: none; overflow: visible;\r\n}\r\n#reu-roue-wp[data-view=\"flux\"] .stage-heading,\r\n#reu-roue-wp[data-view=\"flux\"] .stage-caption{ display: none; }\r\n#reu-roue-wp .stage-panel.flux{\r\n    top: 0; padding: 0; overflow: hidden;\r\n    display: flex; flex-direction: column;\r\n}\r\n#reu-roue-wp .stage-panel.flux[hidden]{ display: none; }\r\n#reu-roue-wp[data-view=\"carte\"] .header > *{ display: none; }\r\n#reu-roue-wp[data-view=\"carte\"] .header{\r\n    position: absolute; inset: 0; width: auto; max-width: none;\r\n    padding: 0; margin: 0; border: 0; background: none;\r\n    pointer-events: none; overflow: visible;\r\n}\r\n#reu-roue-wp[data-view=\"carte\"] .stage-heading,\r\n#reu-roue-wp[data-view=\"carte\"] .stage-caption{ display: none; }\r\n#reu-roue-wp .stage-panel.carte{\r\n    position: absolute; inset: 0; top: 0; padding: 0; overflow: hidden;\r\n    display: flex; flex-direction: column; z-index: 10;\r\n    background: #fbfaf8; border-radius: 18px;\r\n    border: 1px solid rgba(226, 231, 239, 0.9);\r\n}\r\n#reu-roue-wp .stage-panel.carte[hidden]{ display: none; }\r\n\/* Deux diagrammes l'un sous l'autre : le panneau d\u00e9file, et chaque cadre\r\n   occupe une hauteur d'\u00e9cran, assez pour que ses rubans gardent l'\u00e9paisseur\r\n   qui les rend comparables. Au-dessous d'une certaine hauteur, un Sankey ne\r\n   se lit plus : on pr\u00e9f\u00e8re faire d\u00e9filer que d'\u00e9craser. *\/\r\n#reu-roue-wp .fx-defile{\r\n    flex: 1; min-height: 0; overflow-y: auto; scrollbar-width: thin;\r\n    scroll-snap-type: y proximity;\r\n    display: flex; flex-direction: column;\r\n}\r\n#reu-roue-wp .fx-cadre{\r\n    flex: none; scroll-snap-align: start;\r\n    min-height: min(92%, 640px);\r\n    padding: clamp(16px, 2.6vh, 30px) clamp(16px, 2.6vw, 42px) 13px;\r\n    display: flex; flex-direction: column; gap: clamp(9px, 1.5vh, 17px);\r\n}\r\n#reu-roue-wp .fx-cadre + .fx-cadre{ border-top: 1px solid var(--ui-line, #e6eae3); }\r\n\r\n\/* ---- le chapeau : d'o\u00f9 l'on parle, et comment lire un ruban ---- *\/\r\n#reu-roue-wp .fx-tete{\r\n    display: flex; flex-direction: column; align-items: flex-start;\r\n    gap: 8px; flex: none;\r\n}\r\n#reu-roue-wp .fx-eyebrow{\r\n    margin: 0 0 9px; font-size: 9px; font-weight: 800;\r\n    letter-spacing: .16em; text-transform: uppercase;\r\n    color: var(--theme-accent, #a8603f);\r\n}\r\n#reu-roue-wp .fx-titre{\r\n    margin: 0; font-size: clamp(22px, 2.7vw, 36px); font-weight: 750;\r\n    line-height: 1.08; letter-spacing: -1px; color: var(--ui-ink, #1f3147);\r\n    max-width: 20ch; text-wrap: balance;\r\n}\r\n#reu-roue-wp .fx-mode{\r\n    margin: 0; max-width: 90ch;\r\n    font-size: 11px; line-height: 1.45; color: var(--ui-muted, #64748b);\r\n}\r\n\r\n\/* ---- le constat : la phrase \u00e0 retenir, au-dessus du diagramme ---- *\/\r\n#reu-roue-wp .fx-constat{\r\n    margin: 10px 0 0; max-width: 62ch;\r\n    font-size: clamp(14px, 1.25vw, 17px); line-height: 1.4; font-weight: 500;\r\n    color: var(--ui-ink, #1f3147); text-wrap: pretty;\r\n    opacity: 0; transition: opacity .4s ease;\r\n}\r\n#reu-roue-wp .fx-constat.is-pose{ opacity: 1; }\r\n#reu-roue-wp .fx-constat b{ font-weight: 750; }\r\n\r\n\/* ---- version fusionn\u00e9e : la bascule entre les trois croisements ---- *\/\r\n#reu-roue-wp .fx-bascule{\r\n    display: inline-flex; gap: 3px; padding: 3px; border-radius: 11px;\r\n    background: var(--ui-sunk, #eef2ec);\r\n}\r\n#reu-roue-wp .fx-bascule-btn{\r\n    font: inherit; font-size: 11.5px; font-weight: 650; cursor: pointer;\r\n    padding: 8px 16px; border-radius: 8px; border: 0;\r\n    color: var(--ui-muted, #64748b); background: transparent;\r\n    transition: background .22s, color .22s, box-shadow .22s;\r\n}\r\n#reu-roue-wp .fx-bascule-btn:hover{ color: var(--ui-ink, #1f3147); }\r\n#reu-roue-wp .fx-bascule-btn.is-on{\r\n    background: var(--ui-surface, #fffefb); color: var(--ui-ink, #1f3147);\r\n    box-shadow: 0 1px 3px rgba(31,49,71,.12);\r\n}\r\n\r\n\/* ---- la sc\u00e8ne : le diagramme occupe toute la hauteur qui reste ---- *\/\r\n#reu-roue-wp .fx-scene{ flex: 1; min-height: 320px; position: relative; }\r\n#reu-roue-wp .fx-svg{ width: 100%; height: 100%; display: block; }\r\n\r\n\/* Un ruban est une surface, pas un trait : il se lit \u00e0 plat, en transparence,\r\n   et le filet ivoire qui le borde s\u00e9pare deux rubans voisins de m\u00eame teinte\r\n   sans ajouter d'encre. *\/\r\n#reu-roue-wp .fx-ruban{\r\n    fill-opacity: .44; stroke: #fffefb; stroke-width: .5;\r\n    cursor: pointer; transition: fill-opacity .22s var(--ease, ease);\r\n}\r\n#reu-roue-wp .fx-svg.is-focus .fx-ruban{ fill-opacity: .085; }\r\n#reu-roue-wp .fx-svg.is-focus .fx-ruban.is-on{ fill-opacity: .84; }\r\n#reu-roue-wp .fx-noeud,\r\n#reu-roue-wp .fx-etage{ cursor: pointer; transition: opacity .22s; }\r\n#reu-roue-wp .fx-etage.is-inerte{ cursor: default; }\r\n#reu-roue-wp .fx-svg.is-focus .fx-noeud:not(.is-on),\r\n#reu-roue-wp .fx-svg.is-focus .fx-etage:not(.is-on){ opacity: .26; }\r\n\/* La cible du pointeur d\u00e9borde le pilier et couvre son libell\u00e9 : viser un\r\n   trait de neuf pixels de large n'est pas une interaction. *\/\r\n#reu-roue-wp .fx-hit{ fill: transparent; }\r\n#reu-roue-wp .fx-noeud:focus-visible,\r\n#reu-roue-wp .fx-etage:focus-visible{ outline: 2px solid #2d6376; outline-offset: 3px; }\r\n\r\n\/* Le libell\u00e9 fait partie de son noeud : il s'\u00e9teint avec lui quand un autre\r\n   flux est isol\u00e9, et un clic sur le nom vaut un clic sur le pilier. *\/\r\n#reu-roue-wp .fx-libelle{ -webkit-user-select: none; user-select: none; }\r\n#reu-roue-wp .fx-nom{ font-size: 11.5px; font-weight: 650; letter-spacing: -.1px; }\r\n#reu-roue-wp .fx-compte{\r\n    font-size: 8.5px; font-weight: 600; letter-spacing: .02em;\r\n    fill: var(--ui-faint, #9aa9ab); font-variant-numeric: tabular-nums;\r\n}\r\n#reu-roue-wp .fx-et-nom{ font-size: clamp(14px, 1.45vw, 19px); font-weight: 750; letter-spacing: -.5px; }\r\n#reu-roue-wp .fx-et-val{\r\n    font-size: 10.5px; font-weight: 650; fill: var(--ui-muted, #77898d);\r\n    font-variant-numeric: tabular-nums;\r\n}\r\n#reu-roue-wp .fx-et-phrase{ font-size: 8.5px; font-weight: 500; fill: var(--ui-faint, #9aa9ab); }\r\n\r\n\/* ---- le pied : la note de lecture et les deux sorties ---- *\/\r\n#reu-roue-wp .fx-pied{\r\n    display: flex; align-items: center; justify-content: space-between;\r\n    gap: 18px; flex-wrap: wrap; flex: none; padding-top: 2px;\r\n}\r\n#reu-roue-wp .fx-note{\r\n    margin: 0; max-width: 78ch; font-size: 9.5px; line-height: 1.65;\r\n    color: var(--ui-faint, #9aa9ab);\r\n}\r\n#reu-roue-wp .fx-note b{ color: var(--ui-muted, #64748b); font-weight: 700; }\r\n#reu-roue-wp .fx-actions{ display: flex; gap: 8px; flex: none; }\r\n#reu-roue-wp .fx-btn{\r\n    font: inherit; font-size: 10px; font-weight: 600; cursor: pointer;\r\n    padding: 8px 14px; border-radius: 9px;\r\n    color: var(--ui-muted, #64748b);\r\n    background: var(--ui-surface, #fffefb);\r\n    border: 1px solid var(--ui-line, #e6eae3);\r\n    transition: background .22s, color .22s, border-color .22s, transform .22s;\r\n}\r\n#reu-roue-wp .fx-btn:hover{ background: var(--ui-sunk, #eef2ec); color: var(--ui-ink, #1f3147); transform: translateY(-1px); }\r\n#reu-roue-wp .fx-btn.is-fort{ background: #203e49; border-color: #203e49; color: #fff; }\r\n#reu-roue-wp .fx-btn.is-fort:hover{ background: #16303a; color: #fff; }\r\n\r\n\/* ---- entr\u00e9e : le flux se dessine muet, les libell\u00e9s se posent apr\u00e8s ----\r\n   Les piliers poussent, les rubans se d\u00e9roulent de gauche \u00e0 droite, et ce\r\n   n'est qu'une fois la g\u00e9om\u00e9trie immobile que les noms s'allument, un par un.\r\n   Un libell\u00e9 qui voyage avec sa barre ne se lit pas pendant toute la dur\u00e9e du\r\n   mouvement : autant ne pas l'afficher. La chor\u00e9graphie des rubans est tenue\r\n   par renderFlux ; il ne reste ici que le chapeau et le pied.\r\n   Chaque cadre attend d'entrer dans le champ : \u00ab is-arme \u00bb l'\u00e9teint,\r\n   \u00ab is-in \u00bb le lance, d\u00e9cal\u00e9 de --dec quand deux cadres entrent ensemble. *\/\r\n@keyframes fxPose{ from{ opacity: 0; transform: translateY(6px); } to{ opacity: 1; transform: none; } }\r\n#reu-roue-wp .fx-cadre.is-arme .fx-tete,\r\n#reu-roue-wp .fx-cadre.is-arme .fx-pied{ opacity: 0; }\r\n#reu-roue-wp .fx-cadre.is-in .fx-tete{ animation: fxPose .5s cubic-bezier(.16,1,.3,1) var(--dec, 0ms) both; }\r\n#reu-roue-wp .fx-cadre.is-in .fx-pied{ animation: fxPose .5s ease calc(var(--dec, 0ms) + 1.5s) both; }\r\n\r\n@media (max-width: 1000px){\r\n    #reu-roue-wp .fx-note{ max-width: none; }\r\n}\r\n@media (max-width: 700px){\r\n    #reu-roue-wp .fx-titre{ font-size: 21px; max-width: none; }\r\n    #reu-roue-wp .fx-cadre{ padding: 14px 13px 12px; gap: 9px; min-height: 0; }\r\n    #reu-roue-wp .fx-scene{ min-height: 300px; }\r\n    #reu-roue-wp .fx-actions{ display: none; }\r\n}\r\n@media (prefers-reduced-motion: reduce){\r\n    #reu-roue-wp .fx-cadre.is-arme .fx-tete,\r\n    #reu-roue-wp .fx-cadre.is-arme .fx-pied{ opacity: 1; animation: none; }\r\n    #reu-roue-wp .fx-ruban{ transition: none; }\r\n}\r\n@media(max-width:1200px){#reu-roue-wp .toggle-btn{padding-left:10px;padding-right:10px}}\r\n@media(max-width:760px){\r\n #reu-roue-wp .toggle-group{overflow-x:auto;justify-content:flex-start;scrollbar-width:thin}\r\n #reu-roue-wp .toggle-btn{flex:0 0 auto;white-space:nowrap;padding:9px 12px;font-size:11px}\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================================\r\n   LA CARTE TERRITORIALE, INT\u00c9GR\u00c9E\r\n   --------------------------------------------------------------------------\r\n   Tout ce qui suit est scop\u00e9 sur #amp-map, le conteneur de la carte, pos\u00e9\r\n   dans le panneau de l'onglet \u00ab Carte \u00bb. Plac\u00e9 en fin de feuille, il\r\n   l'emporte sur les r\u00e8gles de la roue qui portent les m\u00eames noms de classe\r\n   (.detail-*, .fl-*, .pr-*) \u2014 les deux fiches sont identiques, mais c'est\r\n   la carte qui d\u00e9cide chez elle.\r\n   ========================================================================== *\/\r\n\/* \u2500\u2500 LE SYST\u00c8ME \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n#amp-map {\r\n  --ui-ink:        #16262c;\r\n  --ui-ink-soft:   #40565d;\r\n  --ui-muted:      #77898d;\r\n  --ui-faint:      #9aa9ab;\r\n  --ui-line:       #e6eae3;\r\n  --ui-line-soft:  #eef1ec;\r\n  --ui-surface:    #ffffff;\r\n  --ui-canvas:     #fbfbf8;\r\n  --ui-sunk:       #f2f4ef;\r\n  --ui-accent:     #1f4a4d;\r\n  --ui-r-sm: 8px;\r\n  --ui-r-md: 12px;\r\n  --ui-r-lg: 16px;\r\n  --ui-shadow: 0 1px 2px rgba(22,38,44,.04), 0 18px 40px -24px rgba(22,38,44,.28);\r\n  --ui-mono: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace;\r\n  --ease: cubic-bezier(.22,1,.36,1);\r\n  --fis-ease: cubic-bezier(.16,1,.3,1);\r\n  --font: 'Manrope', system-ui, -apple-system, sans-serif;\r\n\r\n  font-family: var(--font) !important;\r\n  color: var(--ui-ink);\r\n  background: var(--ui-canvas);\r\n  position: absolute !important;\r\n  inset: 0 !important;\r\n  width: 100% !important;\r\n  height: 100% !important;\r\n  max-width: none !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: none !important;\r\n  border-radius: 0 !important;\r\n  box-sizing: border-box;\r\n  isolation: isolate;\r\n  display: flex;\r\n  flex-direction: row;\r\n  overflow: hidden;\r\n}\r\n#amp-map * { box-sizing: border-box; }\r\n\r\n\/* Micro-capitale : l'unit\u00e9 de l\u00e9gende de toute l'interface. *\/\r\n#amp-map .amp-eyebrow,\r\n#amp-map .amp-kpi-lab,\r\n#amp-map .amp-rail-title,\r\n#amp-map .amp-legend-title,\r\n#amp-map .amp-stage-head,\r\n#amp-map .detail-eyebrow,\r\n#amp-map .amp-panel-eyebrow,\r\n#amp-map .amp-section-title {\r\n  font-size: 9px;\r\n  font-weight: 700;\r\n  letter-spacing: .14em;\r\n  text-transform: uppercase;\r\n  color: var(--ui-faint);\r\n}\r\n\r\n\/* \u2500\u2500 RAIL GAUCHE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n#amp-map .amp-side {\r\n  flex: 0 0 300px;\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 16px;\r\n  min-height: 0;\r\n  overflow-y: auto;\r\n  padding: 26px 22px 18px 28px;\r\n  scrollbar-width: thin;\r\n  scrollbar-color: var(--ui-line) transparent;\r\n}\r\n#amp-map .amp-side::-webkit-scrollbar { width: 4px; }\r\n#amp-map .amp-side::-webkit-scrollbar-thumb { background: var(--ui-line); border-radius: 4px; }\r\n\r\n#amp-map .amp-head { display: flex; flex-direction: column; gap: 9px; }\r\n#amp-map .amp-title {\r\n  font-size: 30px;\r\n  font-weight: 800;\r\n  line-height: 1.08;\r\n  letter-spacing: -1.1px;\r\n  color: var(--ui-ink);\r\n  margin: 0;\r\n}\r\n#amp-map .amp-title span { font-weight: 500; color: #738b87; }\r\n#amp-map .amp-sub {\r\n  font-size: 11.5px;\r\n  line-height: 1.6;\r\n  font-weight: 500;\r\n  color: var(--ui-muted);\r\n  margin: 0;\r\n  max-width: 34ch;\r\n}\r\n\r\n\/* Les compteurs : des nombres pos\u00e9s sur un filet, rien de plus. *\/\r\n#amp-map .amp-kpis {\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr;\r\n  border-top: 1px solid var(--ui-line);\r\n  border-bottom: 1px solid var(--ui-line);\r\n  padding: 15px 0;\r\n}\r\n#amp-map .amp-kpi { padding: 0 16px 0 0; min-width: 0; }\r\n#amp-map .amp-kpi + .amp-kpi { padding: 0 0 0 16px; border-left: 1px solid var(--ui-line); }\r\n#amp-map .amp-kpi.is-row { grid-column: 1 \/ -1; padding: 13px 0 0; margin-top: 13px; border-top: 1px solid var(--ui-line-soft); border-left: 0; }\r\n#amp-map .amp-kpi-val {\r\n  font-size: 27px;\r\n  font-weight: 600;\r\n  line-height: 1;\r\n  letter-spacing: -1.3px;\r\n  color: var(--ui-ink);\r\n  font-variant-numeric: tabular-nums;\r\n  white-space: nowrap;\r\n}\r\n#amp-map .amp-kpi-val.is-small { font-size: 17px; letter-spacing: -.6px; }\r\n#amp-map .amp-kpi-lab { display: block; margin-top: 7px; }\r\n#amp-map .amp-kpi-split { display: flex; gap: 18px; }\r\n#amp-map .amp-kpi-split > div { min-width: 0; }\r\n\r\n\/* Les vues : une liste, pas des pilules. M\u00eame objet que \u00ab Explorer la roue \u00bb. *\/\r\n#amp-map .amp-rail-title { display: block; margin-bottom: 8px; }\r\n#amp-map .amp-ctrl {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 2px;\r\n}\r\n#amp-map .amp-chip {\r\n  position: relative;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 10px;\r\n  width: 100%;\r\n  font-family: var(--font);\r\n  font-size: 11.5px;\r\n  font-weight: 600;\r\n  letter-spacing: -.1px;\r\n  text-align: left;\r\n  color: var(--ui-ink-soft);\r\n  background: none;\r\n  border: 0;\r\n  border-radius: var(--ui-r-sm);\r\n  padding: 9px 11px;\r\n  min-height: 34px;\r\n  cursor: pointer;\r\n  transition: background .2s, color .2s;\r\n}\r\n#amp-map .amp-chip::before {\r\n  content: \"\";\r\n  position: absolute;\r\n  left: 0; top: 50%;\r\n  width: 2px; height: 0;\r\n  border-radius: 0 2px 2px 0;\r\n  background: var(--ui-accent);\r\n  transform: translateY(-50%);\r\n  transition: height .24s var(--ease);\r\n}\r\n#amp-map .amp-chip:hover { background: var(--ui-sunk); color: var(--ui-ink); }\r\n#amp-map .amp-chip.amp-on {\r\n  background: var(--ui-sunk);\r\n  color: var(--ui-ink);\r\n  font-weight: 750;\r\n}\r\n#amp-map .amp-chip.amp-on::before { height: 17px; }\r\n#amp-map .amp-chip-count {\r\n  flex: none;\r\n  font-family: var(--ui-mono);\r\n  font-size: 9.5px;\r\n  font-weight: 500;\r\n  letter-spacing: .02em;\r\n  color: var(--ui-faint);\r\n  white-space: nowrap;\r\n}\r\n#amp-map .amp-chip.amp-on .amp-chip-count { color: var(--ui-muted); }\r\n#amp-map .amp-reset {\r\n  justify-content: flex-start;\r\n  gap: 7px;\r\n  margin-top: 4px;\r\n  font-size: 10.5px;\r\n  font-weight: 600;\r\n  color: var(--ui-muted);\r\n}\r\n#amp-map .amp-reset::before { content: none; }\r\n\r\n\/* L\u00e9gende cartographique *\/\r\n#amp-map .amp-legend {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 7px;\r\n  padding-top: 15px;\r\n  border-top: 1px solid var(--ui-line);\r\n}\r\n#amp-map .amp-legend-title { margin-bottom: 2px; }\r\n#amp-map .amp-legend span.amp-leg {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 9px;\r\n  font-size: 10.5px;\r\n  font-weight: 600;\r\n  line-height: 1.4;\r\n  color: var(--ui-ink-soft);\r\n}\r\n#amp-map .amp-legend i {\r\n  width: 10px;\r\n  height: 10px;\r\n  border-radius: 3px;\r\n  display: inline-block;\r\n  flex: 0 0 auto;\r\n}\r\n#amp-map .amp-legend i.amp-dot { border-radius: 50%; }\r\n#amp-map .amp-legend small {\r\n  font-weight: 500;\r\n  color: var(--ui-faint);\r\n  font-size: 9.5px;\r\n}\r\n#amp-map .amp-legend-note {\r\n  margin-top: 6px;\r\n  padding-top: 11px;\r\n  border-top: 1px solid var(--ui-line-soft);\r\n  font-size: 9.5px;\r\n  line-height: 1.6;\r\n  font-weight: 500;\r\n  color: var(--ui-faint);\r\n}\r\n\r\n\/* \u2500\u2500 STAGE CARTOGRAPHIQUE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n#amp-map .amp-stage {\r\n  position: relative;\r\n  flex: 1 1 auto;\r\n  min-width: 0;\r\n  min-height: 0;\r\n  background: var(--ui-surface);\r\n  border-left: 1px solid var(--ui-line);\r\n  overflow: hidden;\r\n}\r\n#amp-map #amp-svg {\r\n  display: block;\r\n  width: 100%;\r\n  height: 100%;\r\n  cursor: grab;\r\n}\r\n#amp-map #amp-svg:active { cursor: grabbing; }\r\n\r\n\/* Bandeau de rubrique, comme sur la roue *\/\r\n#amp-map .amp-stage-head {\r\n  position: absolute;\r\n  left: 26px; right: 26px; top: 16px;\r\n  display: flex;\r\n  align-items: baseline;\r\n  justify-content: space-between;\r\n  gap: 16px;\r\n  padding-bottom: 12px;\r\n  border-bottom: 1px solid var(--ui-line-soft);\r\n  pointer-events: none;\r\n  z-index: 4;\r\n}\r\n#amp-map .amp-stage-index {\r\n  font-family: var(--ui-mono);\r\n  font-size: 9px;\r\n  font-weight: 500;\r\n  letter-spacing: .08em;\r\n  color: var(--ui-faint);\r\n  text-transform: none;\r\n}\r\n#amp-map .amp-stage-caption {\r\n  position: absolute;\r\n  left: 26px; bottom: 16px;\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 9px;\r\n  font-size: 9px;\r\n  font-weight: 600;\r\n  letter-spacing: .02em;\r\n  color: var(--ui-faint);\r\n  pointer-events: none;\r\n  z-index: 4;\r\n}\r\n#amp-map .amp-caption-line {\r\n  display: inline-block;\r\n  width: 22px; height: 1px;\r\n  background: var(--ui-line);\r\n}\r\n\r\n\/* Trac\u00e9s des communes et arrondissements *\/\r\n#amp-map .amp-commune {\r\n  vector-effect: non-scaling-stroke;\r\n  cursor: pointer;\r\n  transition: fill .2s, stroke .18s, stroke-width .18s;\r\n}\r\n#amp-map .amp-commune.is-selected { stroke-width: 2.4px !important; }\r\n\r\n#amp-map .amp-marseille-boundary {\r\n  fill: none;\r\n  stroke: var(--ui-muted);\r\n  stroke-width: 1px;\r\n  stroke-dasharray: 3 3;\r\n  pointer-events: none;\r\n  opacity: .45;\r\n  vector-effect: non-scaling-stroke;\r\n}\r\n\r\n\/* \u00c9tiquettes *\/\r\n#amp-map text.amp-label {\r\n  font-family: var(--font) !important;\r\n  font-size: 9.5px;\r\n  font-weight: 700;\r\n  letter-spacing: -.1px;\r\n  text-anchor: middle;\r\n  dominant-baseline: central;\r\n  pointer-events: none;\r\n  paint-order: stroke;\r\n  stroke: rgba(255,255,255,.94);\r\n  stroke-width: 2.6px;\r\n  stroke-linejoin: round;\r\n  fill: var(--ui-ink);\r\n}\r\n#amp-map text.amp-label.amp-label-light {\r\n  font-weight: 600;\r\n  fill: var(--ui-faint);\r\n}\r\n\r\n\/* Pastilles de comptage : la seule tache pleine de la carte. *\/\r\n#amp-map .amp-bubble circle {\r\n  stroke: #fff;\r\n  stroke-width: 1.6px;\r\n  cursor: pointer;\r\n  transition: filter .18s;\r\n}\r\n#amp-map .amp-bubble:hover circle { filter: brightness(1.12); }\r\n#amp-map .amp-bubble text {\r\n  font-family: var(--font) !important;\r\n  font-size: 10px;\r\n  font-weight: 700;\r\n  font-variant-numeric: tabular-nums;\r\n  fill: #fff;\r\n  text-anchor: middle;\r\n  pointer-events: none;\r\n  dominant-baseline: central;\r\n}\r\n\r\n\/* Infobulle *\/\r\n#amp-map .amp-tip {\r\n  position: absolute;\r\n  z-index: 30;\r\n  max-width: 264px;\r\n  padding: 12px 14px;\r\n  border-radius: var(--ui-r-md);\r\n  background: var(--ui-surface);\r\n  border: 1px solid var(--ui-line);\r\n  box-shadow: var(--ui-shadow);\r\n  font-size: 11px;\r\n  pointer-events: none;\r\n  opacity: 0;\r\n  transform: translateY(5px);\r\n  transition: opacity .16s ease, transform .16s ease;\r\n}\r\n#amp-map .amp-tip.amp-show { opacity: 1; transform: translateY(0); }\r\n#amp-map .amp-tip b {\r\n  display: block;\r\n  color: var(--ui-ink);\r\n  font-weight: 750;\r\n  font-size: 13px;\r\n  letter-spacing: -.3px;\r\n  line-height: 1.25;\r\n}\r\n#amp-map .amp-tip .amp-tip-meta {\r\n  margin-top: 5px;\r\n  font-family: var(--ui-mono);\r\n  font-size: 9px;\r\n  letter-spacing: .04em;\r\n  color: var(--ui-muted);\r\n}\r\n#amp-map .amp-tip ul {\r\n  margin: 9px 0 0;\r\n  padding: 9px 0 0;\r\n  border-top: 1px solid var(--ui-line-soft);\r\n  list-style: none;\r\n  color: var(--ui-ink-soft);\r\n  font-weight: 550;\r\n  line-height: 1.6;\r\n}\r\n#amp-map .amp-tip li { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n#amp-map .amp-tip li.is-more { color: var(--ui-faint); font-weight: 500; }\r\n#amp-map .amp-tip .amp-tip-cta {\r\n  display: block;\r\n  margin-top: 9px;\r\n  font-size: 8.5px;\r\n  font-weight: 700;\r\n  letter-spacing: .12em;\r\n  text-transform: uppercase;\r\n  color: var(--ui-accent);\r\n}\r\n\r\n\/* \u2500\u2500 LE VOILE DE CHARGEMENT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n\/* Trois points qui respirent et un filet ind\u00e9termin\u00e9 : la m\u00eame attente que\r\n   sur la roue, pour que le passage de l'une \u00e0 l'autre ne se voie pas. *\/\r\n#amp-map .amp-loader {\r\n  position: absolute;\r\n  inset: 0;\r\n  z-index: 50;\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 18px;\r\n  text-align: center;\r\n  background: radial-gradient(120% 80% at 50% 45%, #ffffff 0%, #fbfcfa 55%, #f4f6f2 100%);\r\n  font-size: 11px;\r\n  letter-spacing: .14em;\r\n  text-transform: uppercase;\r\n  font-weight: 700;\r\n  color: #8a9a9c;\r\n  transition: opacity .55s var(--fis-ease), visibility .55s;\r\n}\r\n#amp-map .amp-loader.is-out { opacity: 0; visibility: hidden; pointer-events: none; }\r\n#amp-map .amp-loader.is-error { letter-spacing: .02em; text-transform: none; font-weight: 600; line-height: 1.7; padding: 0 12%; }\r\n#amp-map .amp-loader-dots {\r\n  position: relative;\r\n  display: block;\r\n  width: 8px; height: 8px;\r\n  border-radius: 50%;\r\n  background: linear-gradient(140deg, #92b3a0, #345e66);\r\n  animation: ampPulse 1.25s var(--fis-ease) .16s infinite;\r\n}\r\n#amp-map .amp-loader-dots::before,\r\n#amp-map .amp-loader-dots::after {\r\n  content: \"\";\r\n  position: absolute; top: 0;\r\n  width: 8px; height: 8px;\r\n  border-radius: 50%;\r\n  background: linear-gradient(140deg, #92b3a0, #345e66);\r\n  animation: ampPulse 1.25s var(--fis-ease) infinite;\r\n}\r\n#amp-map .amp-loader-dots::before { left: -15px; animation-delay: 0s; }\r\n#amp-map .amp-loader-dots::after { left: 15px; animation-delay: .32s; }\r\n#amp-map .amp-loader-bar {\r\n  width: 132px; height: 2px;\r\n  border-radius: 2px;\r\n  background-color: rgba(52,94,102,.12);\r\n  background-image: linear-gradient(90deg, transparent, #678b7a, transparent);\r\n  background-size: 45% 100%;\r\n  background-repeat: no-repeat;\r\n  animation: ampSweep 1.5s var(--fis-ease) infinite;\r\n}\r\n#amp-map .amp-loader.is-error .amp-loader-dots,\r\n#amp-map .amp-loader.is-error .amp-loader-bar { display: none; }\r\n@keyframes ampPulse { 0%,100%{ opacity:.35; transform: scale(.82); } 50%{ opacity:1; transform: scale(1); } }\r\n@keyframes ampSweep { 0%{ background-position: -50% 0; } 100%{ background-position: 150% 0; } }\r\n\r\n\/* \u2500\u2500 L'ENTR\u00c9E DE PAGE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n\/* Les formes arrivent, les libell\u00e9s se posent ensuite : le texte ne voyage\r\n   jamais pendant le mouvement. *\/\r\n@keyframes ampRise { from{ opacity:0; transform: translateY(14px); } to{ opacity:1; transform:none; } }\r\n@keyframes ampDrop { from{ opacity:0; transform: translateY(-10px); } to{ opacity:1; transform:none; } }\r\n@keyframes ampSide { from{ opacity:0; transform: translateX(-12px); } to{ opacity:1; transform:none; } }\r\n@keyframes ampPose { from{ opacity:0; } to{ opacity:1; } }\r\n\r\n#amp-map.is-booting .amp-head > *,\r\n#amp-map.is-booting .amp-kpis,\r\n#amp-map.is-booting .amp-ctrl-wrap,\r\n#amp-map.is-booting .amp-legend,\r\n#amp-map.is-booting .amp-stage-head,\r\n#amp-map.is-booting .amp-stage-caption { opacity: 0; }\r\n\r\n#amp-map.is-ready .amp-head > * { animation: ampRise .68s var(--fis-ease) both; }\r\n#amp-map.is-ready .amp-head > *:nth-child(1){ animation-delay:.10s; }\r\n#amp-map.is-ready .amp-head > *:nth-child(2){ animation-delay:.18s; }\r\n#amp-map.is-ready .amp-head > *:nth-child(3){ animation-delay:.26s; }\r\n#amp-map.is-ready .amp-kpis { animation: ampRise .68s var(--fis-ease) .34s both; }\r\n#amp-map.is-ready .amp-ctrl-wrap { animation: ampRise .68s var(--fis-ease) .46s both; }\r\n#amp-map.is-ready .amp-chip { animation: ampSide .5s var(--fis-ease) both; }\r\n#amp-map.is-ready .amp-chip:nth-child(1){ animation-delay:.58s; }\r\n#amp-map.is-ready .amp-chip:nth-child(2){ animation-delay:.64s; }\r\n#amp-map.is-ready .amp-chip:nth-child(3){ animation-delay:.70s; }\r\n#amp-map.is-ready .amp-chip:nth-child(4){ animation-delay:.76s; }\r\n#amp-map.is-ready .amp-legend { animation: ampRise .7s var(--fis-ease) .82s both; }\r\n#amp-map.is-ready .amp-legend .amp-leg { animation: ampSide .46s var(--fis-ease) both; }\r\n#amp-map.is-ready .amp-legend .amp-leg:nth-child(2){ animation-delay:.90s; }\r\n#amp-map.is-ready .amp-legend .amp-leg:nth-child(3){ animation-delay:.96s; }\r\n#amp-map.is-ready .amp-legend .amp-leg:nth-child(4){ animation-delay:1.02s; }\r\n#amp-map.is-ready .amp-legend .amp-leg:nth-child(5){ animation-delay:1.08s; }\r\n#amp-map.is-ready .amp-legend .amp-leg:nth-child(6){ animation-delay:1.14s; }\r\n#amp-map.is-ready .amp-legend .amp-leg:nth-child(n+7){ animation-delay:1.20s; }\r\n\/* Le bandeau et la note du bas ferment la s\u00e9quence, une fois la carte pos\u00e9e. *\/\r\n#amp-map.is-ready .amp-stage-head { animation: ampPose .55s ease .92s both; }\r\n#amp-map.is-ready .amp-stage-caption { animation: ampRise .6s var(--fis-ease) 1.02s both; }\r\n\r\n\/* \u2500\u2500 PANNEAU LAT\u00c9RAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n#amp-map .amp-panel {\r\n  position: absolute;\r\n  top: 12px;\r\n  right: 12px;\r\n  bottom: 12px;\r\n  width: clamp(380px, 38vw, 520px);\r\n  max-width: calc(100% - 24px);\r\n  background: var(--ui-surface);\r\n  border: 1px solid var(--ui-line);\r\n  border-radius: var(--ui-r-lg);\r\n  box-shadow: 0 24px 90px rgba(29,60,73,.17);\r\n  display: flex;\r\n  flex-direction: column;\r\n  transform: translateX(calc(100% + 18px));\r\n  transition: transform .42s var(--ease), width .4s var(--ease);\r\n  z-index: 20;\r\n  overflow: hidden;\r\n}\r\n#amp-map .amp-panel.amp-open { transform: translateX(0); }\r\n#amp-map .amp-panel.is-expanded { width: min(760px, calc(100% - 24px)); }\r\n#amp-map .amp-panel-bar {\r\n  height: 3px;\r\n  flex: 0 0 3px;\r\n  background: var(--pc, var(--ui-accent));\r\n}\r\n\r\n\/* T\u00eate \u00ab territoire \u00bb *\/\r\n#amp-map .amp-panel-hd {\r\n  padding: 16px 22px 14px;\r\n  border-bottom: 1px solid var(--ui-line);\r\n  flex: 0 0 auto;\r\n}\r\n#amp-map .amp-panel-tools {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 12px;\r\n  margin-bottom: 12px;\r\n}\r\n#amp-map .amp-panel-eyebrow {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 7px;\r\n  min-width: 0;\r\n  color: var(--pc, var(--ui-accent));\r\n}\r\n#amp-map .amp-panel-eyebrow i {\r\n  flex: none;\r\n  width: 8px; height: 8px;\r\n  border-radius: 2px;\r\n  background: var(--pc, var(--ui-accent));\r\n}\r\n#amp-map .amp-panel-eyebrow span {\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n#amp-map .amp-icon-btn {\r\n  flex: none;\r\n  width: 30px; height: 30px;\r\n  display: grid;\r\n  place-items: center;\r\n  border: 1px solid var(--ui-line);\r\n  background: var(--ui-sunk);\r\n  border-radius: 9px;\r\n  color: var(--ui-ink-soft);\r\n  cursor: pointer;\r\n  font-size: 19px;\r\n  line-height: 1;\r\n  padding: 0;\r\n  transition: background .2s, transform .2s, color .2s;\r\n}\r\n#amp-map .amp-icon-btn:hover { background: var(--ui-line-soft); color: var(--ui-ink); transform: translateY(-1px); }\r\n#amp-map .amp-icon-btn[aria-pressed=\"true\"] { background: var(--ui-accent); border-color: var(--ui-accent); color: #fff; }\r\n#amp-map .amp-panel-controls { display: flex; align-items: center; gap: 6px; flex: none; }\r\n\/* Le retour porte son mot : dans une carte on descend d'un territoire vers un\r\n   projet, le chemin inverse ne doit pas se deviner. *\/\r\n#amp-map .amp-icon-btn.is-back {\r\n  width: auto;\r\n  gap: 6px;\r\n  padding: 0 11px 0 8px;\r\n  display: inline-flex;\r\n  align-items: center;\r\n}\r\n#amp-map .amp-icon-btn.is-back span {\r\n  font-family: var(--font);\r\n  font-size: 10px;\r\n  font-weight: 700;\r\n  letter-spacing: .1em;\r\n  text-transform: uppercase;\r\n}\r\n#amp-map .amp-panel-title {\r\n  font-size: 22px;\r\n  font-weight: 750;\r\n  color: var(--ui-ink);\r\n  line-height: 1.14;\r\n  letter-spacing: -.7px;\r\n  margin: 0;\r\n  overflow-wrap: anywhere;\r\n}\r\n#amp-map .amp-panel-loc {\r\n  font-size: 11px;\r\n  color: var(--ui-muted);\r\n  font-weight: 550;\r\n  line-height: 1.5;\r\n  margin-top: 7px;\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 7px;\r\n}\r\n#amp-map .amp-panel-loc svg { flex: none; margin-top: 1px; color: var(--ui-faint); }\r\n#amp-map .amp-panel-count {\r\n  font-family: var(--ui-mono);\r\n  font-size: 9px;\r\n  letter-spacing: .08em;\r\n  text-transform: uppercase;\r\n  color: var(--ui-faint);\r\n  margin-top: 9px;\r\n}\r\n\r\n#amp-map .amp-panel-list {\r\n  flex: 1;\r\n  overflow-y: auto;\r\n  overscroll-behavior: contain;\r\n  padding: 16px 22px 20px;\r\n  scrollbar-width: thin;\r\n  scrollbar-color: #ccd8cc transparent;\r\n  min-height: 0;\r\n  outline-offset: -3px;\r\n}\r\n#amp-map .amp-panel-list::-webkit-scrollbar { width: 4px; }\r\n#amp-map .amp-panel-list::-webkit-scrollbar-thumb { background: var(--ui-line); border-radius: 4px; }\r\n\r\n#amp-map .amp-section-title { display: block; margin: 0 0 10px; }\r\n#amp-map .amp-section-title + .amp-section-title { margin-top: 20px; }\r\n\r\n\/* Quartiers prioritaires *\/\r\n#amp-map .amp-qpv-tags {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 6px;\r\n  margin-bottom: 20px;\r\n}\r\n#amp-map .amp-qpv-tag {\r\n  font-size: 10px;\r\n  font-weight: 600;\r\n  color: var(--ui-ink-soft);\r\n  background: var(--ui-canvas);\r\n  border: 1px solid var(--ui-line);\r\n  padding: 6px 9px;\r\n  border-radius: 7px;\r\n}\r\n\r\n\/* Cartes de projet (niveau 1) *\/\r\n#amp-map .amp-pitem {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 7px;\r\n  width: 100%;\r\n  background: var(--ui-surface);\r\n  border: 1px solid var(--ui-line);\r\n  border-radius: var(--ui-r-md);\r\n  padding: 13px 14px;\r\n  margin-bottom: 8px;\r\n  font-family: var(--font);\r\n  text-align: left;\r\n  cursor: pointer;\r\n  transition: border-color .2s, background .2s, box-shadow .2s, transform .2s var(--ease);\r\n}\r\n#amp-map .amp-pitem:hover {\r\n  background: var(--ui-canvas);\r\n  border-color: #dbe2d9;\r\n  transform: translateX(2px);\r\n  box-shadow: 0 1px 2px rgba(22,38,44,.05);\r\n}\r\n#amp-map .amp-pitem-top {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 10px;\r\n}\r\n#amp-map .amp-pitem-theme {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  min-width: 0;\r\n  font-size: 8.5px;\r\n  font-weight: 700;\r\n  letter-spacing: .12em;\r\n  text-transform: uppercase;\r\n  color: var(--pjc, var(--ui-muted));\r\n}\r\n#amp-map .amp-pitem-theme span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n#amp-map .amp-pitem-theme-dot {\r\n  flex: none;\r\n  width: 7px; height: 7px;\r\n  border-radius: 50%;\r\n  background: var(--pjc, var(--ui-accent));\r\n}\r\n#amp-map .amp-pitem-amount {\r\n  flex: none;\r\n  font-family: var(--ui-mono);\r\n  font-size: 10px;\r\n  font-weight: 500;\r\n  color: var(--ui-ink);\r\n  font-variant-numeric: tabular-nums;\r\n}\r\n#amp-map .amp-pitem-name {\r\n  font-weight: 750;\r\n  font-size: 13px;\r\n  letter-spacing: -.3px;\r\n  color: var(--ui-ink);\r\n  line-height: 1.25;\r\n  overflow-wrap: anywhere;\r\n}\r\n#amp-map .amp-pitem-sub {\r\n  font-size: 11px;\r\n  font-weight: 500;\r\n  color: var(--ui-muted);\r\n  line-height: 1.5;\r\n  overflow-wrap: anywhere;\r\n}\r\n#amp-map .amp-pitem-foot {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 10px;\r\n  border-top: 1px solid var(--ui-line-soft);\r\n  padding-top: 9px;\r\n  margin-top: 1px;\r\n}\r\n#amp-map .amp-pitem-marks { display: inline-flex; align-items: center; gap: 7px; min-width: 0; }\r\n#amp-map .amp-pitem-mark {\r\n  font-family: var(--ui-mono);\r\n  font-size: 9px;\r\n  letter-spacing: .04em;\r\n  color: var(--ui-faint);\r\n  white-space: nowrap;\r\n}\r\n#amp-map .amp-pitem-arrow {\r\n  flex: none;\r\n  font-size: 9px;\r\n  font-weight: 700;\r\n  letter-spacing: .12em;\r\n  text-transform: uppercase;\r\n  color: var(--ui-faint);\r\n  transition: transform .18s var(--ease), color .18s;\r\n}\r\n#amp-map .amp-pitem:hover .amp-pitem-arrow { color: var(--ui-accent); transform: translateX(2px); }\r\n#amp-map .amp-empty {\r\n  font-size: 11px;\r\n  font-style: italic;\r\n  color: var(--ui-muted);\r\n  line-height: 1.7;\r\n  margin: 4px 0 0;\r\n}\r\n\r\n\/* \u2500\u2500 LA FICHE PROJET (niveau 2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n\/* M\u00eame fiche que sur la roue d'impact : m\u00eames rubriques, m\u00eame ordre, m\u00eames\r\n   instruments. Une personne qui passe de la roue \u00e0 la carte ne r\u00e9apprend\r\n   rien. *\/\r\n#amp-map .amp-panel-fiche {\r\n  display: none;\r\n  flex: 1;\r\n  min-height: 0;\r\n  flex-direction: column;\r\n}\r\n#amp-map .amp-panel.is-fiche .amp-panel-hd,\r\n#amp-map .amp-panel.is-fiche .amp-panel-list { display: none; }\r\n#amp-map .amp-panel.is-fiche .amp-panel-fiche { display: flex; }\r\n\r\n#amp-map .detail-toolbar {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 16px;\r\n  padding: 14px 22px 11px;\r\n  flex: none;\r\n}\r\n#amp-map .detail-theme {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  max-width: calc(100% - 96px);\r\n  font-size: 9px;\r\n  font-weight: 700;\r\n  letter-spacing: .12em;\r\n  text-transform: uppercase;\r\n  line-height: 1.5;\r\n  color: var(--theme-color-text, var(--ui-accent));\r\n}\r\n#amp-map .detail-theme .legend-dot {\r\n  flex: none;\r\n  width: 8px; height: 8px;\r\n  border-radius: 50%;\r\n  background: var(--theme-color, var(--ui-accent));\r\n}\r\n#amp-map .detail-theme span.lbl { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n\r\n#amp-map .detail-nav {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 5px;\r\n  flex: none;\r\n  border-bottom: 1px solid var(--ui-line);\r\n  padding: 0 22px;\r\n}\r\n#amp-map .detail-nav button {\r\n  flex: 1;\r\n  font: inherit;\r\n  font-family: var(--font);\r\n  font-size: 9.5px;\r\n  font-weight: 650;\r\n  white-space: nowrap;\r\n  color: var(--ui-muted);\r\n  padding: 11px 4px 12px;\r\n  background: none;\r\n  border: 0;\r\n  border-bottom: 2px solid transparent;\r\n  cursor: pointer;\r\n  transition: color .2s, border-color .2s;\r\n}\r\n#amp-map .detail-nav button:hover { color: var(--ui-ink); }\r\n#amp-map .detail-nav button[aria-current] {\r\n  color: var(--ui-ink);\r\n  border-color: var(--theme-color-text, var(--ui-accent));\r\n  font-weight: 800;\r\n}\r\n\r\n#amp-map .detail-body {\r\n  position: relative;\r\n  overflow-y: auto;\r\n  overscroll-behavior: contain;\r\n  scrollbar-width: thin;\r\n  scrollbar-color: #ccd8cc transparent;\r\n  padding: 24px 24px 22px;\r\n  min-height: 0;\r\n  flex: 1;\r\n  outline-offset: -3px;\r\n}\r\n#amp-map .detail-body::-webkit-scrollbar { width: 4px; }\r\n#amp-map .detail-body::-webkit-scrollbar-thumb { background: var(--ui-line); border-radius: 4px; }\r\n#amp-map .amp-panel.is-expanded .detail-body { padding: 30px 40px 26px; }\r\n\r\n#amp-map .detail-eyebrow {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin: 0 0 12px;\r\n}\r\n#amp-map .detail-eyebrow span {\r\n  margin-left: auto;\r\n  font-family: var(--ui-mono);\r\n  font-weight: 500;\r\n  font-size: 9px;\r\n  letter-spacing: .06em;\r\n  text-transform: none;\r\n  color: var(--ui-faint);\r\n}\r\n#amp-map .detail-ident { display: flex; align-items: flex-start; gap: 14px; margin: 0 0 14px; }\r\n#amp-map .detail-ident-text { flex: 1; min-width: 0; }\r\n#amp-map .detail-logo {\r\n  position: relative;\r\n  flex: none;\r\n  display: grid;\r\n  place-items: center;\r\n  width: 58px; height: 58px;\r\n  border-radius: 14px;\r\n  background: var(--ui-surface);\r\n  border: 1px solid var(--ui-line);\r\n  box-shadow: 0 1px 2px rgba(22,38,44,.05);\r\n  overflow: hidden;\r\n  animation: identIn .42s var(--ease) .2s both;\r\n}\r\n#amp-map .detail-logo img { width: 100%; height: 100%; object-fit: contain; display: block; }\r\n#amp-map .detail-logo--mono { background: var(--ui-sunk); border-color: transparent; }\r\n#amp-map .detail-logo--mono::before {\r\n  content: \"\";\r\n  position: absolute; inset: 0;\r\n  background: var(--theme-color, #1f4a4d);\r\n  opacity: .14;\r\n}\r\n#amp-map .detail-logo--mono b {\r\n  position: relative;\r\n  font-size: 18px; font-weight: 800; letter-spacing: .01em; line-height: 1;\r\n  color: var(--theme-color-text, var(--ui-accent));\r\n}\r\n@keyframes identIn { from{ opacity:0; transform: translateY(6px) scale(.96); } to{ opacity:1; transform:none; } }\r\n#amp-map .amp-panel.is-expanded .detail-logo { width: 68px; height: 68px; border-radius: 16px; }\r\n#amp-map .amp-panel.is-expanded .detail-logo--mono b { font-size: 21px; }\r\n\r\n#amp-map .detail-title {\r\n  font-size: clamp(21px, 2vw, 27px);\r\n  line-height: 1.16;\r\n  letter-spacing: -.8px;\r\n  font-weight: 750;\r\n  margin: 0 0 9px;\r\n  color: var(--ui-ink);\r\n  overflow-wrap: anywhere;\r\n  text-wrap: balance;\r\n}\r\n#amp-map .detail-project-name {\r\n  font-size: 13px;\r\n  font-weight: 550;\r\n  line-height: 1.6;\r\n  margin: 0;\r\n  color: var(--ui-ink-soft);\r\n  overflow-wrap: anywhere;\r\n  text-wrap: pretty;\r\n}\r\n#amp-map .detail-territory {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 8px;\r\n  font-size: 11px;\r\n  line-height: 1.6;\r\n  color: var(--ui-muted);\r\n  margin: 0 0 4px;\r\n}\r\n#amp-map .detail-territory svg { flex: none; margin-top: 1px; color: var(--ui-faint); }\r\n\r\n#amp-map .detail-section {\r\n  padding-top: 24px;\r\n  margin-top: 24px;\r\n  border-top: 1px solid var(--ui-line);\r\n  scroll-margin-top: 20px;\r\n  outline: none;\r\n}\r\n#amp-map .detail-section.is-lead { padding-bottom: 4px; }\r\n#amp-map .detail-section-title {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 11px;\r\n  font-size: 13.5px;\r\n  font-weight: 700;\r\n  letter-spacing: -.15px;\r\n  line-height: 1.4;\r\n  margin: 0 0 15px;\r\n  color: var(--ui-ink);\r\n}\r\n#amp-map .detail-section-title > span {\r\n  display: grid;\r\n  place-items: center;\r\n  flex: none;\r\n  width: 24px; height: 24px;\r\n  border: 1px solid var(--ui-line);\r\n  border-radius: var(--ui-r-sm);\r\n  background: var(--ui-canvas);\r\n  font-family: var(--ui-mono);\r\n  font-size: 9px;\r\n  font-weight: 500;\r\n  color: var(--ui-muted);\r\n}\r\n#amp-map .detail-section-title::after {\r\n  content: \"\";\r\n  flex: 1;\r\n  height: 1px;\r\n  background: var(--ui-line-soft);\r\n}\r\n#amp-map .detail-section-intro {\r\n  font-size: 11px;\r\n  line-height: 1.75;\r\n  margin: -3px 0 16px;\r\n  color: var(--ui-muted);\r\n  max-width: 62ch;\r\n}\r\n#amp-map .detail-prose {\r\n  font-size: 12px;\r\n  font-weight: 450;\r\n  line-height: 1.8;\r\n  color: var(--ui-ink-soft);\r\n  overflow-wrap: anywhere;\r\n  text-wrap: pretty;\r\n}\r\n#amp-map .detail-prose p { font: inherit; line-height: inherit; color: inherit; margin: 0 0 12px; }\r\n#amp-map .detail-prose p:last-child { margin-bottom: 0; }\r\n#amp-map .amp-panel.is-expanded .detail-prose { font-size: 13px; line-height: 1.85; }\r\n#amp-map .detail-summary {\r\n  border-left: 2px solid var(--theme-color, var(--ui-accent));\r\n  padding-left: 16px;\r\n  font-size: 12.5px;\r\n  line-height: 1.85;\r\n  max-width: 68ch;\r\n}\r\n#amp-map .detail-empty {\r\n  font-size: 11px;\r\n  color: var(--ui-faint);\r\n  font-style: italic;\r\n  line-height: 1.6;\r\n  margin: 0;\r\n}\r\n#amp-map .detail-prose-list {\r\n  padding: 0; margin: 0; list-style: none;\r\n  display: flex; flex-direction: column; gap: 9px;\r\n}\r\n#amp-map .detail-prose-list li { position: relative; padding-left: 15px; }\r\n#amp-map .detail-prose-list li::before {\r\n  content: \"\";\r\n  position: absolute; left: 1px; top: .8em;\r\n  width: 4px; height: 4px;\r\n  border-radius: 50%;\r\n  background: var(--theme-color-text, var(--ui-accent));\r\n  opacity: .65;\r\n}\r\n\r\n\/* ---- le cadran de la part du FIS ---- *\/\r\n#amp-map .fin-card {\r\n  margin: 0 0 10px;\r\n  padding: 17px 17px 13px;\r\n  border: 1px solid var(--ui-line);\r\n  border-radius: var(--ui-r-lg);\r\n  background: var(--ui-surface);\r\n}\r\n#amp-map .jauge { margin: 0; }\r\n#amp-map .jg-head { display: flex; align-items: center; gap: 10px; margin: 0 0 4px; }\r\n#amp-map .jg-titre {\r\n  font-size: 9px; font-weight: 700; letter-spacing: .14em;\r\n  text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n#amp-map .jg-pill {\r\n  margin-left: auto;\r\n  display: inline-flex; align-items: center; gap: 6px;\r\n  max-width: 62%; padding: 4px 9px; border-radius: 999px;\r\n  background: var(--ui-sunk); font-family: var(--ui-mono);\r\n  font-size: 8.5px; letter-spacing: .1em; text-transform: uppercase;\r\n  color: var(--ui-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\r\n}\r\n#amp-map .jg-pill i {\r\n  flex: none; width: 6px; height: 6px; border-radius: 50%;\r\n  background: var(--theme-color, var(--ui-accent));\r\n}\r\n#amp-map .jg-cadran { position: relative; width: min(220px, 70%); margin: 0 auto; }\r\n#amp-map .jg-cadran svg { display: block; width: 100%; height: auto; overflow: visible; }\r\n#amp-map .jg-cadran .jg-on {\r\n  stroke: var(--theme-color-text, var(--ui-accent));\r\n  stroke-width: 3; stroke-linecap: round;\r\n}\r\n#amp-map .jg-cadran .jg-off { stroke: #d8ded7; stroke-width: 2.3; stroke-linecap: round; }\r\n#amp-map .jg-cadran .jg-repere { stroke: var(--ui-muted); stroke-width: 2; stroke-linecap: round; }\r\n#amp-map .jg-val {\r\n  position: absolute; inset: 0; margin: 0; pointer-events: none;\r\n  display: flex; align-items: center; justify-content: center; gap: 3px;\r\n}\r\n#amp-map .jg-val b {\r\n  font-size: clamp(29px, 3vw, 36px); font-weight: 450; letter-spacing: -1.4px;\r\n  line-height: 1; color: var(--ui-ink); font-variant-numeric: tabular-nums;\r\n}\r\n#amp-map .jg-val span {\r\n  align-self: center; margin-top: 13px; font-size: 12.5px;\r\n  font-weight: 600; color: var(--ui-faint);\r\n}\r\n#amp-map .jg-val .jg-nr { font-size: 24px; color: var(--ui-faint); letter-spacing: 0; }\r\n#amp-map .jg-note {\r\n  margin: 3px 0 0; text-align: center; font-family: var(--ui-mono);\r\n  font-size: 9px; letter-spacing: .03em; color: var(--ui-faint);\r\n}\r\n@keyframes jgIn { from{ opacity:0; transform: rotate(-7deg) scale(.93); } to{ opacity:1; transform:none; } }\r\n@keyframes jgPose { from{ opacity:0; transform: translateY(5px); } to{ opacity:1; transform:none; } }\r\n@keyframes fisBar { from{ transform: scaleX(0); } to{ transform: scaleX(1); } }\r\n\r\n\/* ---- la barre de budget ---- *\/\r\n#amp-map .bud { margin-top: 13px; padding-top: 12px; border-top: 1px solid var(--ui-line-soft); }\r\n#amp-map .bud-bar {\r\n  position: relative; height: 28px; border-radius: 9px;\r\n  overflow: hidden; background: #e4e9e3;\r\n}\r\n#amp-map .bud-fis {\r\n  position: absolute; top: 0; bottom: 0; left: 0; min-width: 4px;\r\n  overflow: hidden;\r\n  background: var(--theme-color-text, var(--ui-accent));\r\n  transform-origin: left;\r\n}\r\n#amp-map .bud-num { display: flex; justify-content: space-between; gap: 12px; margin: 9px 0 0; }\r\n#amp-map .bud-num b {\r\n  display: block; font-size: clamp(16px, 1.5vw, 19px); font-weight: 600;\r\n  letter-spacing: -.6px; line-height: 1.15; color: var(--ui-ink);\r\n  font-variant-numeric: tabular-nums; white-space: nowrap;\r\n}\r\n#amp-map .bud-num > span:first-child b { color: var(--theme-color-text, var(--ui-accent)); }\r\n#amp-map .bud-num > span:last-child { text-align: right; }\r\n#amp-map .bud-num i {\r\n  display: block; margin-top: 2px; font-style: normal; font-size: 8.5px;\r\n  font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n#amp-map .bud-total {\r\n  margin: 9px 0 0; text-align: center; font-family: var(--ui-mono);\r\n  font-size: 9px; letter-spacing: .03em; color: var(--ui-faint);\r\n}\r\n#amp-map .fin-sommes {\r\n  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px;\r\n  margin-top: 13px; padding-top: 12px; border-top: 1px solid var(--ui-line-soft);\r\n}\r\n#amp-map .fs-item { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\r\n#amp-map .fs-item span {\r\n  font-size: 8.5px; font-weight: 700; letter-spacing: .12em;\r\n  text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n#amp-map .fs-item b {\r\n  font-size: clamp(16px, 1.5vw, 19px); font-weight: 600; letter-spacing: -.6px;\r\n  line-height: 1.15; color: var(--ui-ink);\r\n  font-variant-numeric: tabular-nums; white-space: nowrap;\r\n}\r\n#amp-map .fs-item.is-key b { color: var(--theme-color-text, var(--ui-accent)); }\r\n#amp-map .fs-item.is-empty b {\r\n  font-size: 11px; font-weight: 500; letter-spacing: 0;\r\n  color: var(--ui-faint); white-space: normal;\r\n}\r\n\r\n\/* ---- l'\u00e9chelle des personnes touch\u00e9es ---- *\/\r\n#amp-map .pers {\r\n  margin: 0 0 8px; padding: 14px 15px 12px;\r\n  background: var(--ui-canvas); border: 1px solid var(--ui-line);\r\n  border-radius: var(--ui-r-md);\r\n}\r\n#amp-map .pers-top { display: flex; align-items: baseline; gap: 10px; margin: 0 0 14px; }\r\n#amp-map .pers-lab {\r\n  font-size: 8.5px; font-weight: 700; letter-spacing: .12em;\r\n  text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n#amp-map .pers-num {\r\n  margin-left: auto; font-size: clamp(21px, 2vw, 25px); font-weight: 600;\r\n  letter-spacing: -.9px; line-height: 1; color: var(--ui-ink);\r\n  font-variant-numeric: tabular-nums; white-space: nowrap;\r\n}\r\n#amp-map .pers-num em {\r\n  font-style: normal; margin-right: 3px; font-size: .62em;\r\n  font-weight: 500; color: var(--ui-faint); vertical-align: .12em;\r\n}\r\n#amp-map .ech { position: relative; height: 8px; border-radius: 5px; background: #e4e9e3; }\r\n#amp-map .ech-fill {\r\n  position: absolute; left: 0; top: 0; bottom: 0; min-width: 8px;\r\n  overflow: hidden;\r\n  border-radius: 5px; background: var(--theme-color-text, var(--ui-accent));\r\n  transform-origin: left;\r\n}\r\n#amp-map .ech-cur {\r\n  position: absolute; top: 50%; width: 15px; height: 15px;\r\n  margin: -7.5px 0 0 -7.5px; border-radius: 50%;\r\n  background: var(--theme-color-text, var(--ui-accent));\r\n  border: 3px solid var(--ui-canvas);\r\n  box-shadow: 0 0 0 1px var(--theme-color-text, var(--ui-accent));\r\n}\r\n#amp-map .ech-ax { position: relative; height: 14px; margin: 9px 0 0; }\r\n#amp-map .ech-ax span {\r\n  position: absolute; transform: translateX(-50%);\r\n  font-family: var(--ui-mono); font-size: 9px; color: var(--ui-faint); white-space: nowrap;\r\n}\r\n#amp-map .pers-brut {\r\n  margin: 11px 0 0; padding-top: 10px; border-top: 1px solid var(--ui-line-soft);\r\n  font-size: 11px; line-height: 1.6; color: var(--ui-muted); overflow-wrap: anywhere;\r\n}\r\n\r\n\/* ---- ce que le projet a d\u00e9ploy\u00e9 ---- *\/\r\n#amp-map .detail-bubbles {\r\n  display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\r\n  gap: 8px; align-items: stretch; margin: 0;\r\n}\r\n#amp-map .detail-bubble {\r\n  display: flex; flex-direction: column; gap: 5px; min-width: 0;\r\n  padding: 12px 14px; border-radius: var(--ui-r-md);\r\n  background: var(--ui-canvas); border: 1px solid var(--ui-line);\r\n}\r\n#amp-map .detail-bubble.is-key { background: var(--ui-sunk); }\r\n#amp-map .detail-bubble.is-empty { background: transparent; border-style: dashed; }\r\n#amp-map .detail-bubble .db-key {\r\n  font-size: 8.5px; letter-spacing: .12em; font-weight: 700;\r\n  text-transform: uppercase; color: var(--ui-faint); line-height: 1.4;\r\n}\r\n#amp-map .detail-bubble .db-val {\r\n  font-size: clamp(14px, 1.3vw, 18px); line-height: 1.2; font-weight: 600;\r\n  letter-spacing: -.3px; color: var(--ui-ink); font-variant-numeric: tabular-nums;\r\n  white-space: normal; overflow-wrap: anywhere;\r\n}\r\n#amp-map .detail-bubble.is-long .db-val {\r\n  font-size: 12px; line-height: 1.6; letter-spacing: 0; font-weight: 550;\r\n}\r\n#amp-map .detail-bubble.is-empty .db-val {\r\n  font-size: 11px; letter-spacing: 0; font-weight: 500; color: var(--ui-faint);\r\n}\r\n\/* L'inventaire des actions, comme sur la roue : le nombre dans sa colonne,\r\n   le nom en toutes lettres, sur toute la largeur de la fiche, et la carte\r\n   des partenaires qui le suit aussi. *\/\r\n#amp-map .detail-bubble.detail-inv { gap: 9px; }\r\n#amp-map .detail-bubble.detail-inv,\r\n#amp-map .detail-bubble.detail-inv ~ .detail-bubble { grid-column: 1 \/ -1; }\r\n#amp-map .inv-nc {\r\n  align-self: flex-start; margin-top: -2px; padding: 1px 8px;\r\n  font-size: 10px; line-height: 1.5; font-weight: 600; color: var(--ui-muted);\r\n  border: 1px solid var(--ui-line); border-radius: 999px;\r\n}\r\n#amp-map .inv {\r\n  list-style: none; margin: 0; padding: 0;\r\n  display: grid; grid-template-columns: max-content minmax(0, 1fr);\r\n  column-gap: 12px; row-gap: 7px;\r\n}\r\n#amp-map .inv li {\r\n  display: grid; grid-column: 1 \/ -1; margin: 0; padding: 0;\r\n  grid-template-columns: 46px minmax(0, 1fr);\r\n  grid-template-columns: subgrid; align-items: baseline;\r\n}\r\n#amp-map .inv-n {\r\n  font-size: 15px; line-height: 1.2; font-weight: 650; letter-spacing: -.3px;\r\n  text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums;\r\n  color: var(--ui-ink);\r\n}\r\n#amp-map .inv-n.is-puce { font-size: 13px; font-weight: 400; color: var(--ui-faint); }\r\n#amp-map .inv-l { font-size: 12.5px; line-height: 1.45; font-weight: 500; color: var(--ui-ink); }\r\n\r\n\/* ---- les trois promesses ---- *\/\r\n#amp-map .pr-score {\r\n  font-family: var(--ui-mono); font-size: 9px; font-weight: 500;\r\n  letter-spacing: .08em; text-transform: uppercase; color: var(--ui-faint);\r\n  margin: 0 0 12px;\r\n}\r\n#amp-map .detail-promesses { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }\r\n#amp-map .pr-item {\r\n  position: relative;\r\n  padding: 14px 16px 15px;\r\n  background: var(--ui-canvas);\r\n  border: 1px solid var(--ui-line);\r\n  border-radius: var(--ui-r-md);\r\n  transition: background .25s, box-shadow .25s;\r\n}\r\n#amp-map .pr-item::before {\r\n  content: \"\";\r\n  position: absolute; left: 0; top: 14px; bottom: 14px;\r\n  width: 2px; border-radius: 0 2px 2px 0; background: var(--pc);\r\n}\r\n#amp-map .pr-item.is-none::before { background: var(--ui-line); }\r\n#amp-map .pr-item:hover { background: var(--ui-surface); box-shadow: 0 1px 2px rgba(22,38,44,.05); }\r\n#amp-map .pr-head {\r\n  display: flex; align-items: center; gap: 8px; margin: 0 0 5px;\r\n  font-size: 11.5px; font-weight: 750; letter-spacing: .01em; color: var(--pc-text);\r\n}\r\n#amp-map .pr-item.is-none .pr-head { color: var(--ui-muted); }\r\n#amp-map .pr-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--pc); }\r\n#amp-map .pr-item.is-none .pr-dot { background: none; border: 1.5px solid var(--ui-line); }\r\n#amp-map .pr-phrase {\r\n  margin: 0 0 9px; font-size: 10px; line-height: 1.6;\r\n  font-style: italic; color: var(--ui-faint);\r\n}\r\n#amp-map .pr-text { font-size: 12px; line-height: 1.8; color: var(--ui-ink-soft); }\r\n#amp-map .pr-text p { margin: 0 0 8px; }\r\n#amp-map .pr-text p:last-child { margin: 0; }\r\n\r\n\/* ---- indicateurs propres au porteur ---- *\/\r\n#amp-map .detail-indics {\r\n  margin-top: 10px;\r\n  padding: 14px 15px;\r\n  background: var(--ui-canvas);\r\n  border: 1px solid var(--ui-line);\r\n  border-radius: var(--ui-r-md);\r\n}\r\n#amp-map .detail-indics h4 {\r\n  margin: 0 0 8px;\r\n  font-size: 8.5px; font-weight: 700; letter-spacing: .12em;\r\n  text-transform: uppercase; color: var(--ui-faint);\r\n}\r\n\r\n\/* ---- pied de fiche ---- *\/\r\n#amp-map .detail-confid {\r\n  margin: 26px 0 0; padding: 20px 0 0;\r\n  border-top: 1px solid var(--ui-line);\r\n  font-size: 10px; line-height: 1.8; color: var(--ui-faint);\r\n}\r\n#amp-map .detail-confid strong {\r\n  font-size: 9px; letter-spacing: .12em; text-transform: uppercase; color: var(--ui-muted);\r\n}\r\n#amp-map .detail-confid p { margin: 8px 0 0; }\r\n#amp-map .detail-data-note { font-style: italic; }\r\n\r\n\/* \u2500\u2500 APPARITION AU D\u00c9FILEMENT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n\/* Une jauge qui s'est remplie trois \u00e9crans plus bas n'a \u00e9t\u00e9 vue par personne :\r\n   chaque pi\u00e8ce chiffr\u00e9e attend d'entrer dans le champ. La forme arrive, le\r\n   libell\u00e9 se pose apr\u00e8s. *\/\r\n#amp-map .detail-body.js-reveal .rev { opacity: 0; animation: none; }\r\n#amp-map .detail-body.js-reveal .rev.is-in { opacity: 1; }\r\n#amp-map .detail-body.js-reveal .jg-cadran svg.is-in { animation: jgIn .58s var(--ease) both; }\r\n#amp-map .detail-body.js-reveal .jg-val.is-in { animation: jgPose .4s ease .3s both; }\r\n#amp-map .detail-body.js-reveal .jg-note.is-in { animation: jgPose .4s ease .38s both; }\r\n#amp-map .detail-body.js-reveal .bud-fis.is-in { animation: fisBar .68s var(--ease) both; }\r\n#amp-map .detail-body.js-reveal .ech-fill.is-in { animation: fisBar .68s var(--ease) both; }\r\n#amp-map .bud-fis::after,\r\n#amp-map .ech-fill::after {\r\n  content: \"\"; position: absolute; top: 0; bottom: 0; right: 0; width: 42px;\r\n  border-radius: inherit; opacity: 0;\r\n  background: linear-gradient(90deg, transparent, rgba(255,255,255,.55));\r\n}\r\n#amp-map .detail-body.js-reveal .bud-fis.is-in::after,\r\n#amp-map .detail-body.js-reveal .ech-fill.is-in::after { animation: budSheen .68s ease-out both; }\r\n@keyframes budSheen { 0%{opacity:0} 35%{opacity:.9} 100%{opacity:0} }\r\n#amp-map .detail-body.js-reveal .bud-num.is-in { animation: jgPose .4s ease .32s both; }\r\n#amp-map .detail-body.js-reveal .bud-total.is-in { animation: jgPose .4s ease .4s both; }\r\n#amp-map .detail-body.js-reveal .fs-item.is-in { animation: jgPose .4s ease both; }\r\n#amp-map .detail-body.js-reveal .fs-item.is-in + .fs-item.is-in { animation-delay: .07s; }\r\n#amp-map .detail-body.js-reveal .pers-top.is-in { animation: jgPose .4s ease both; }\r\n#amp-map .detail-body.js-reveal .ech-cur.is-in { animation: echCur .36s cubic-bezier(.34,1.3,.5,1) .44s both; }\r\n#amp-map .detail-body.js-reveal .ech-ax.is-in { animation: jgPose .4s ease .52s both; }\r\n@keyframes echCur { from{ opacity:0; transform: scale(.4); } to{ opacity:1; transform: none; } }\r\n#amp-map .detail-body.js-reveal .detail-bubble.is-in,\r\n#amp-map .detail-body.js-reveal .pr-item.is-in { animation: jgPose .42s ease both; }\r\n#amp-map .detail-body.js-reveal .detail-bubble.is-in:nth-child(2),\r\n#amp-map .detail-body.js-reveal .pr-item.is-in:nth-child(2) { animation-delay: .07s; }\r\n#amp-map .detail-body.js-reveal .detail-bubble.is-in:nth-child(3),\r\n#amp-map .detail-body.js-reveal .pr-item.is-in:nth-child(3) { animation-delay: .14s; }\r\n\r\n\/* \u2500\u2500 RESPONSIVE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n@media (max-width: 1100px) {\r\n  #amp-map .amp-side { flex-basis: 264px; padding: 22px 16px 16px 20px; }\r\n  #amp-map .amp-title { font-size: 25px; }\r\n  #amp-map .amp-kpi-val { font-size: 23px; }\r\n}\r\n@media (max-width: 960px) {\r\n  #amp-map { flex-direction: column; }\r\n  #amp-map .amp-side {\r\n    flex: 0 0 auto;\r\n    overflow: visible;\r\n    display: grid;\r\n    grid-template-columns: minmax(0, 1fr) auto;\r\n    align-items: end;\r\n    gap: 12px 18px;\r\n    padding: 16px 18px 14px;\r\n    border-bottom: 1px solid var(--ui-line);\r\n  }\r\n  #amp-map .amp-head { grid-column: 1; grid-row: 2; gap: 4px; }\r\n  #amp-map .amp-title { font-size: 21px; letter-spacing: -.7px; }\r\n  #amp-map .amp-title br { display: none; }\r\n  #amp-map .amp-title span { display: block; }\r\n  #amp-map .amp-sub { display: none; }\r\n  #amp-map .amp-kpis {\r\n    grid-column: 2; grid-row: 2;\r\n    border: 0; padding: 0; gap: 16px;\r\n    grid-template-columns: auto auto;\r\n  }\r\n  #amp-map .amp-kpi { padding: 0; }\r\n  #amp-map .amp-kpi + .amp-kpi { padding-left: 16px; }\r\n  #amp-map .amp-kpi.is-row { display: none; }\r\n  #amp-map .amp-kpi-val { font-size: 20px; }\r\n  #amp-map .amp-ctrl-wrap { grid-column: 1 \/ -1; grid-row: 3; }\r\n  #amp-map .amp-rail-title { display: none; }\r\n  #amp-map .amp-ctrl { flex-direction: row; flex-wrap: wrap; gap: 4px; }\r\n  #amp-map .amp-chip { width: auto; min-height: 30px; padding: 7px 10px; }\r\n  #amp-map .amp-chip::before { content: none; }\r\n  #amp-map .amp-chip.amp-on { box-shadow: inset 0 0 0 1px var(--ui-line); }\r\n  #amp-map .amp-legend { display: none; }\r\n  #amp-map .amp-stage { border-left: 0; }\r\n  #amp-map .amp-stage-head { left: 18px; right: 18px; top: 12px; }\r\n  #amp-map .amp-stage-caption { display: none; }\r\n  #amp-map .amp-panel,\r\n  #amp-map .amp-panel.is-expanded {\r\n    width: auto; max-width: none;\r\n    top: auto; left: 8px; right: 8px; bottom: 0;\r\n    height: 78vh;\r\n    border-radius: var(--ui-r-lg) var(--ui-r-lg) 0 0;\r\n    transform: translateY(calc(100% + 12px));\r\n  }\r\n  #amp-map .amp-panel.amp-open { transform: translateY(0); }\r\n  #amp-map .detail-body,\r\n  #amp-map .amp-panel.is-expanded .detail-body { padding: 20px 18px; }\r\n  #amp-map .amp-panel-expand { display: none; }\r\n  #amp-map .detail-title { font-size: 22px; }\r\n  #amp-map .jg-cadran { width: min(168px, 72%); }\r\n  #amp-map .jg-val b { font-size: 29px; }\r\n  #amp-map .bud-bar { height: 26px; }\r\n  #amp-map .bud-num b, #amp-map .fs-item b { font-size: 16px; }\r\n  #amp-map .pers-num { font-size: 21px; }\r\n}\r\n@media (max-width: 600px) {\r\n  #amp-map .amp-side { display: flex; flex-direction: column; align-items: stretch; gap: 10px; }\r\n  #amp-map .amp-kpis { display: flex; gap: 18px; }\r\n  #amp-map .amp-panel-title { font-size: 19px; }\r\n}\r\n\/* Cadre bas : la fiche se resserre, m\u00eames informations, m\u00eame hi\u00e9rarchie. *\/\r\n@media (min-width: 961px) and (max-height: 720px) {\r\n  #amp-map .detail-body { padding: 18px 20px; }\r\n  #amp-map .detail-logo { width: 46px; height: 46px; border-radius: 11px; }\r\n  #amp-map .detail-title { font-size: clamp(19px, 1.7vw, 23px); margin: 0 0 7px; letter-spacing: -.6px; }\r\n  #amp-map .detail-project-name { font-size: 12px; line-height: 1.55; }\r\n  #amp-map .detail-section { padding-top: 17px; margin-top: 17px; }\r\n  #amp-map .fin-card { padding: 13px 13px 10px; margin: 0 0 8px; }\r\n  #amp-map .jg-cadran { width: min(148px, 54%); }\r\n  #amp-map .jg-val b { font-size: clamp(24px, 2.4vw, 28px); }\r\n  #amp-map .pers { padding: 11px 12px 10px; }\r\n  #amp-map .bud-bar { height: 26px; }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n    #amp-map.is-booting .amp-head > *,\r\n  #amp-map.is-booting .amp-kpis,\r\n  #amp-map.is-booting .amp-ctrl-wrap,\r\n  #amp-map.is-booting .amp-legend,\r\n  #amp-map.is-booting .amp-stage-head,\r\n  #amp-map.is-booting .amp-stage-caption { opacity: 1; }\r\n  #amp-map.is-ready * { animation: none !important; }\r\n  #amp-map .amp-loader-dots,\r\n  #amp-map .amp-loader-dots::before,\r\n  #amp-map .amp-loader-dots::after,\r\n  #amp-map .amp-loader-bar { animation: none !important; }\r\n  #amp-map .detail-logo { animation: none !important; }\r\n}\r\n\r\n\/* \u2500\u2500 LE PLEIN \u00c9CRAN \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n\/* La carte est la seule vue o\u00f9 l'on cherche vraiment de la place : elle\r\n   garde donc son bouton, mais il ouvre le plein \u00e9cran du navigateur au lieu\r\n   d'ouvrir une seconde page. *\/\r\n#amp-map .amp-full-btn {\r\n  pointer-events: auto;\r\n  flex: none;\r\n  margin-left: 12px;\r\n  width: 26px; height: 26px;\r\n  display: grid; place-items: center;\r\n  padding: 0;\r\n  border: 1px solid var(--ui-line);\r\n  border-radius: var(--ui-r-sm);\r\n  background: var(--ui-surface);\r\n  color: var(--ui-muted);\r\n  font-size: 12px; line-height: 1;\r\n  cursor: pointer;\r\n  transition: color .2s, background .2s, box-shadow .2s;\r\n}\r\n#amp-map .amp-full-btn:hover {\r\n  color: var(--ui-ink);\r\n  box-shadow: 0 1px 2px rgba(22,38,44,.06), 0 4px 10px -6px rgba(22,38,44,.25);\r\n}\r\n#amp-map .amp-full-btn[aria-pressed=\"true\"] {\r\n  background: var(--ui-accent); border-color: var(--ui-accent); color: #fff;\r\n}\r\n@media (max-width: 960px) { #amp-map .amp-full-btn { display: none; } }\r\n\r\n\/* ---- reprise sur une r\u00e8gle de la roue ----\r\n   \u00ab #reu-roue-wp #chart-container svg \u00bb \u00e9tire tout SVG pos\u00e9 dans le cadre de\r\n   visualisation : c'est ce qui fait tenir le disque. La carte vit maintenant\r\n   dans ce m\u00eame cadre, et ses SVG \u00e0 elle ont chacun leur gabarit : un rep\u00e8re\r\n   de 11 px, un cadran qui suit sa colonne. On les lui rend ici, au m\u00eame\r\n   niveau de sp\u00e9cificit\u00e9 que la r\u00e8gle d'origine. L'embl\u00e8me et les vignettes\r\n   des impacts et des freins reprennent les leurs dans la R\u00c9VISION 3. *\/\r\n#reu-roue-wp #chart-container #amp-map svg{\r\n  width: auto; height: auto; display: inline-block;\r\n}\r\n#reu-roue-wp #chart-container #amp-map #amp-svg{\r\n  width: 100%; height: 100%; display: block;\r\n}\r\n#reu-roue-wp #chart-container #amp-map .jg-cadran svg{\r\n  width: 100%; height: auto; display: block; overflow: visible;\r\n}\r\n\r\n\r\n#reu-roue-wp[data-view=\"classement\"] .rg-cadre{display:grid;grid-template-columns:minmax(0,1.8fr) minmax(280px,.8fr);grid-template-rows:repeat(2,minmax(0,1fr));gap:12px}\r\n#reu-roue-wp[data-view=\"classement\"] .rg-courbe{grid-column:1;grid-row:1 \/ span 2;min-width:0;min-height:0}\r\n#reu-roue-wp[data-view=\"classement\"] #rg-nombres,#reu-roue-wp[data-view=\"classement\"] #rg-tranches{grid-column:2;min-height:0;display:flex;flex-direction:column}\r\n#reu-roue-wp[data-view=\"classement\"] #rg-nombres{grid-row:1}\r\n#reu-roue-wp[data-view=\"classement\"] #rg-tranches{grid-row:2}\r\n#reu-roue-wp[data-view=\"classement\"] #rg-nombres .rg-mini-rows{flex:1;grid-auto-rows:1fr;align-items:center}\r\n#reu-roue-wp[data-view=\"classement\"] #rg-tranches .rg-mini-rows{flex:1;align-content:space-evenly}\r\n#reu-roue-wp .rg-mini{min-height:0;overflow:hidden;padding:11px;border:1px solid var(--ui-line,#e6eae3);border-radius:14px;background:var(--ui-surface,#fffefb)}\r\n#reu-roue-wp .rg-mini h3{margin:0 0 3px;font-size:15px;color:var(--ui-ink,#1f3147)}\r\n#reu-roue-wp .rg-mini-intro{margin:0 0 7px;font-size:10px;line-height:1.4;color:var(--ui-muted,#64748b)}\r\n#reu-roue-wp .rg-mini-rows{display:grid;gap:5px}\r\n#reu-roue-wp .rg-mini-row{display:grid;grid-template-columns:minmax(92px,1fr) minmax(40px,1.1fr) 20px;align-items:center;gap:8px;width:100%;min-width:0;padding:0;border:0;background:none;color:var(--ui-ink,#1f3147);text-align:left;font:inherit;font-size:10px}\r\n#reu-roue-wp button.rg-mini-row{cursor:pointer}\r\n#reu-roue-wp button.rg-mini-row:hover .rg-mini-name{text-decoration:underline}\r\n#reu-roue-wp .rg-mini-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n#reu-roue-wp .rg-mini-track{height:8px;border-radius:99px;background:#edf0ee;overflow:hidden}\r\n#reu-roue-wp .rg-mini-track span{display:block;height:100%;border-radius:99px}\r\n#reu-roue-wp .rg-mini-row strong{text-align:right;font-size:11px}\r\n#reu-roue-wp .rg-mini-takeaway{margin:8px 0 0;padding-top:10px;border-top:1px solid var(--ui-line,#e6eae3);font-size:11px;line-height:1.4;color:var(--ui-muted,#64748b)}\r\n#reu-roue-wp .rg-mini-takeaway strong{font-size:20px;color:var(--ui-ink,#1f3147)}\r\n\/* ---- entr\u00e9e des deux encadr\u00e9s : la grammaire du classement ----\r\n   Les barres poussent en silence, rang\u00e9e apr\u00e8s rang\u00e9e ; les noms et les\r\n   nombres se posent une fois la derni\u00e8re immobile, puis la phrase-cl\u00e9.\r\n   \u00ab is-arme \u00bb \u00e9teint l'encadr\u00e9 en attendant qu'il entre dans le champ,\r\n   \u00ab is-in \u00bb lance l'entr\u00e9e. --fin (fin des barres) et --n sont pos\u00e9s par\r\n   le script, qui conna\u00eet le nombre de rang\u00e9es. *\/\r\n#reu-roue-wp #rg-nombres{--dec:150ms}\r\n#reu-roue-wp #rg-tranches{--dec:330ms}\r\n#reu-roue-wp .rg-mini.is-arme .rg-mini-track span{transform:scaleX(0);transform-origin:left center}\r\n#reu-roue-wp .rg-mini.is-arme .rg-mini-name,\r\n#reu-roue-wp .rg-mini.is-arme .rg-mini-row strong,\r\n#reu-roue-wp .rg-mini.is-arme .rg-mini-takeaway{opacity:0}\r\n#reu-roue-wp .rg-mini.is-in .rg-mini-track span{\r\n    animation: rgPousse .7s cubic-bezier(.16,1,.3,1) both;\r\n    animation-delay: calc(var(--dec) + var(--i) * 55ms);\r\n}\r\n#reu-roue-wp .rg-mini.is-in .rg-mini-name,\r\n#reu-roue-wp .rg-mini.is-in .rg-mini-row strong{\r\n    animation: rgPose .38s ease both;\r\n    animation-delay: calc(var(--dec) + var(--fin) + var(--i) * 45ms);\r\n}\r\n#reu-roue-wp .rg-mini.is-in .rg-mini-takeaway{\r\n    animation: rgPose .45s ease both;\r\n    animation-delay: calc(var(--dec) + var(--fin) + var(--n) * 45ms + 120ms);\r\n}\r\n@media (prefers-reduced-motion: reduce){\r\n    #reu-roue-wp .rg-mini.is-arme .rg-mini-track span,\r\n    #reu-roue-wp .rg-mini.is-arme .rg-mini-name,\r\n    #reu-roue-wp .rg-mini.is-arme .rg-mini-row strong,\r\n    #reu-roue-wp .rg-mini.is-arme .rg-mini-takeaway{transform:none;opacity:1;animation:none}\r\n}\r\n@media(max-width:850px){#reu-roue-wp[data-view=\"classement\"] .rg-cadre{display:flex;flex-direction:column;overflow-y:auto}#reu-roue-wp[data-view=\"classement\"] .rg-courbe{flex:none;min-height:420px}#reu-roue-wp[data-view=\"classement\"] #rg-nombres,#reu-roue-wp[data-view=\"classement\"] #rg-tranches{flex:none}}\r\n\r\n\/* Deux lectures compl\u00e9mentaires dans le m\u00eame onglet. *\/\r\n#reu-roue-wp .territoire-modes{position:absolute;z-index:12;top:12px;left:50%;transform:translateX(-50%);display:flex;gap:4px;padding:4px;border:1px solid #dce2df;border-radius:999px;background:#fff;box-shadow:0 4px 18px #243c3214;white-space:nowrap}\r\n#reu-roue-wp .territoire-modes[hidden]{display:none}\r\n#reu-roue-wp .territoire-modes button{border:0;border-radius:999px;background:transparent;color:#495b5b;padding:9px 15px;font-size:13px;font-weight:700;font-family:inherit;cursor:pointer}\r\n#reu-roue-wp .territoire-modes button[aria-pressed=\"true\"]{background:#1d373a;color:#fff}\r\n#reu-roue-wp[data-view=\"flux\"] .stage-panel.flux,#reu-roue-wp[data-view=\"classement\"] .stage-panel.rang{top:58px}\r\n#reu-roue-wp[data-view=\"classement\"] .rg-liste{display:none}\r\n@media(max-width:600px){#reu-roue-wp .territoire-modes{max-width:calc(100% - 20px)}#reu-roue-wp .territoire-modes button{font-size:11px;padding:8px 10px}}\r\n\r\n\/* ==========================================================================\r\n   LA FICHE, R\u00c9VISION 3 : IMPACTS ET FREINS EN CARTES\r\n   --------------------------------------------------------------------------\r\n   Les deux rubriques parlent la m\u00eame langue. En t\u00eate, un encart teint\u00e9 pose\r\n   l'embl\u00e8me sur un disque blanc (la fleur pour les impacts, la cage en encre\r\n   ardoise pour les freins) et \u00e9crit le compte en toutes lettres ; une barre\r\n   \u00e0 quatre segments le redit d'un coup d'oeil, chaque segment \u00e0 la couleur\r\n   de sa couche. Dessous, une carte par rubrique : vignette dans une case\r\n   teint\u00e9e, intitul\u00e9, \u00ab Lire \u00bb ou \u00ab Non renseign\u00e9 \u00bb, chevron rond.\r\n   Tout est scop\u00e9 sur #reu-roue-wp : la fiche de la roue et celle de la carte,\r\n   qui vit dans le m\u00eame conteneur, prennent les m\u00eames r\u00e8gles. Les classes\r\n   imp-* n'existent nulle part ailleurs, rien n'est \u00e0 disputer aux couches\r\n   pr\u00e9c\u00e9dentes, sauf la r\u00e8gle de la carte qui remet tout SVG \u00e0 sa taille\r\n   propre : les deux gabarits de SVG la reprennent \u00e0 son niveau.\r\n   ========================================================================== *\/\r\n#reu-roue-wp .imp{ --imp-fond: var(--ui-sunk); --imp-vide: #dce1d9; }\r\n#reu-roue-wp .imp.is-freins{ --imp-fond: #eef0f3; --imp-vide: #d7dbe2; }\r\n#reu-roue-wp .imp p{ padding: 0; }\r\n\r\n\/* ---- l'encart ---- *\/\r\n#reu-roue-wp .imp-hero{\r\n    display: flex; align-items: center; gap: 20px;\r\n    padding: 18px 20px 18px 18px;\r\n    border-radius: var(--ui-r-lg);\r\n    background: var(--imp-fond);\r\n}\r\n#reu-roue-wp .imp-disc{\r\n    flex: none; display: grid; place-items: center;\r\n    width: 112px; height: 112px; border-radius: 50%;\r\n    background: var(--ui-surface);\r\n    box-shadow: 0 1px 2px rgba(22,38,44,.06), 0 12px 26px -16px rgba(22,38,44,.34);\r\n}\r\n#reu-roue-wp .imp-glyph,\r\n#reu-roue-wp #chart-container #amp-map .imp-glyph{\r\n    display: block; width: 88px; height: 88px; overflow: visible;\r\n}\r\n#reu-roue-wp .imp-hero-txt{ flex: 1; min-width: 0; }\r\n#reu-roue-wp .imp-eyebrow{\r\n    margin: 0 0 6px; font-size: 9px; font-weight: 700; line-height: 1.4;\r\n    letter-spacing: .14em; text-transform: uppercase; color: var(--ui-muted);\r\n}\r\n#reu-roue-wp .imp-count{\r\n    margin: 0; font-size: 19px; font-weight: 750; line-height: 1.2;\r\n    letter-spacing: -.55px; color: var(--ui-ink); text-wrap: balance;\r\n}\r\n#reu-roue-wp .imp-segs{\r\n    display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 5px;\r\n    margin: 12px 0 11px;\r\n}\r\n#reu-roue-wp .imp-seg{\r\n    display: block; height: 4px; border-radius: 999px;\r\n    background: var(--c, var(--imp-vide));\r\n    transform-origin: left center;\r\n}\r\n#reu-roue-wp .imp-seg.is-off{ background: var(--imp-vide); }\r\n#reu-roue-wp .imp-hint{\r\n    margin: 0; font-size: 11.5px; font-weight: 500; line-height: 1.6;\r\n    color: var(--ui-ink-soft); text-wrap: pretty;\r\n}\r\n\r\n\/* ---- les cartes ---- *\/\r\n#reu-roue-wp .imp-list{\r\n    list-style: none; margin: 10px 0 0; padding: 0;\r\n    display: grid; gap: 7px;\r\n}\r\n#reu-roue-wp .imp-row{\r\n    margin: 0; padding: 0;\r\n    background: var(--ui-surface);\r\n    border: 1px solid var(--ui-line);\r\n    border-radius: var(--ui-r-md);\r\n    transition: border-color .2s, box-shadow .25s;\r\n}\r\n#reu-roue-wp .imp-row.is-off{ background: var(--ui-canvas); border-color: var(--ui-line-soft); }\r\n#reu-roue-wp .imp-row:has(> button.imp-head:hover){ border-color: #d8ded5; }\r\n#reu-roue-wp .imp-row.is-open{\r\n    border-color: #dde2da;\r\n    box-shadow: 0 1px 2px rgba(22,38,44,.05), 0 14px 30px -20px rgba(22,38,44,.42);\r\n}\r\n#reu-roue-wp .imp-head{\r\n    display: flex; align-items: center; gap: 12px;\r\n    width: 100%; min-height: 52px; margin: 0;\r\n    padding: 9px 12px 9px 9px;\r\n    border: 0; border-radius: inherit; background: none; box-shadow: none;\r\n    font: inherit; color: inherit; text-align: left;\r\n    text-transform: none; letter-spacing: normal;\r\n    -webkit-appearance: none; appearance: none;\r\n}\r\n#reu-roue-wp button.imp-head{ cursor: pointer; }\r\n#reu-roue-wp .imp-head:focus-visible{ outline: 2px solid var(--ui-accent); outline-offset: 2px; }\r\n#reu-roue-wp .imp-tile{\r\n    flex: none; display: grid; place-items: center;\r\n    width: 34px; height: 34px; border-radius: 10px;\r\n    background: var(--tint, var(--ui-sunk));\r\n    color: var(--c, var(--ui-ink-soft));\r\n}\r\n#reu-roue-wp .imp-ico,\r\n#reu-roue-wp #chart-container #amp-map .imp-ico{\r\n    display: block; width: 20px; height: 20px; overflow: visible;\r\n}\r\n\/* Une rubrique vide garde sa place et sa forme, mais en creux. *\/\r\n#reu-roue-wp .imp-row.is-off .imp-tile{\r\n    background: transparent; border: 1px dashed #d3d9d1; color: var(--ui-faint);\r\n}\r\n#reu-roue-wp .imp-row.is-off .imp-ico{ filter: grayscale(1); opacity: .45; }\r\n#reu-roue-wp .imp-label{\r\n    flex: 1; min-width: 0;\r\n    font-size: 12.5px; font-weight: 700; line-height: 1.35; letter-spacing: -.1px;\r\n    color: var(--ui-ink); overflow-wrap: anywhere;\r\n}\r\n#reu-roue-wp .imp-row.is-off .imp-label{ color: var(--ui-muted); }\r\n#reu-roue-wp .imp-row.is-plus .imp-label{ color: var(--ui-ink-soft); }\r\n#reu-roue-wp .imp-state{\r\n    flex: none; display: inline-flex; align-items: center;\r\n    height: 22px; padding: 0 10px; border-radius: 999px;\r\n    background: var(--pill, var(--ui-sunk));\r\n    font-size: 10px; font-weight: 700; line-height: 1; letter-spacing: .02em;\r\n    color: var(--ui-ink); white-space: nowrap;\r\n}\r\n#reu-roue-wp .imp-state.is-none,\r\n#reu-roue-wp .imp-state.is-mention{\r\n    height: auto; padding: 0 6px 0 0; background: none;\r\n    font-size: 10.5px; font-weight: 500; letter-spacing: 0; color: var(--ui-muted);\r\n}\r\n#reu-roue-wp .imp-state.is-none{ font-style: italic; }\r\n#reu-roue-wp .imp-chev{\r\n    flex: none; display: grid; place-items: center;\r\n    width: 26px; height: 26px; border-radius: 50%;\r\n    background: var(--ui-sunk);\r\n    transition: background .2s;\r\n}\r\n#reu-roue-wp .imp-chev::before{\r\n    content: \"\"; width: 0; height: 0;\r\n    border-left: 4px solid transparent; border-right: 4px solid transparent;\r\n    border-top: 5px solid var(--ui-ink-soft);\r\n    transition: transform .25s var(--ease);\r\n}\r\n#reu-roue-wp button.imp-head:hover .imp-chev{ background: #e6eae3; }\r\n#reu-roue-wp .imp-row.is-open .imp-chev::before{ transform: rotate(180deg); }\r\n\r\n\/* ---- le volet ----\r\n   La carte se d\u00e9plie muette : le texte attend qu'elle soit ouverte pour se\r\n   poser en fondu, et s'efface avant qu'elle ne se referme. Repli\u00e9, le volet\r\n   est invisible, donc hors de l'arbre d'accessibilit\u00e9 et du parcours au\r\n   clavier. Il s'aligne sur l'intitul\u00e9, pas sur la vignette. *\/\r\n#reu-roue-wp .imp-body{\r\n    display: grid; grid-template-rows: 0fr; visibility: hidden;\r\n    transition: grid-template-rows .3s var(--ease) .12s, visibility 0s linear .42s;\r\n}\r\n#reu-roue-wp .imp-row.is-open .imp-body{\r\n    grid-template-rows: 1fr; visibility: visible;\r\n    transition: grid-template-rows .32s var(--ease), visibility 0s;\r\n}\r\n#reu-roue-wp .imp-body-in{ min-height: 0; overflow: hidden; }\r\n#reu-roue-wp .imp-texte{\r\n    padding: 0 16px 15px 55px;\r\n    opacity: 0; transition: opacity .12s ease;\r\n}\r\n#reu-roue-wp .imp-row.is-open .imp-texte{ opacity: 1; transition: opacity .38s ease .3s; }\r\n#reu-roue-wp .imp-src{\r\n    margin: 9px 0 0; font-size: 10px; font-weight: 500; line-height: 1.5;\r\n    color: var(--ui-muted);\r\n}\r\n\r\n\/* ---- le survol allume une couche ---- *\/\r\n#reu-roue-wp .imp-couche,\r\n#reu-roue-wp .imp-seg{ transition: opacity .25s ease; }\r\n#reu-roue-wp .imp.is-lit .imp-couche:not(.is-lit){ opacity: .12; }\r\n#reu-roue-wp .imp.is-lit .imp-seg:not(.is-lit){ opacity: .35; }\r\n\r\n\/* ---- entr\u00e9e au d\u00e9filement ----\r\n   M\u00eame r\u00e8gle que le reste de la fiche : la fleur s'ouvre, les segments se\r\n   remplissent l'un apr\u00e8s l'autre, et les libell\u00e9s ne se posent qu'ensuite,\r\n   en fondu, sans bouger. Les cartes arrivent en fondu, \u00e0 pas courts. *\/\r\n#reu-roue-wp .detail-body.js-reveal .imp-hero.rev.is-in{ animation: impFondu .3s ease both; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-hero.is-in .imp-glyph{ animation: jgIn .52s var(--ease) .06s both; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-hero.is-in .imp-seg{ animation: fisBar .42s var(--ease) .12s both; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-hero.is-in .imp-seg:nth-child(2){ animation-delay: .17s; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-hero.is-in .imp-seg:nth-child(3){ animation-delay: .22s; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-hero.is-in .imp-seg:nth-child(4){ animation-delay: .27s; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-hero.is-in .imp-eyebrow{ animation: impFondu .38s ease .5s both; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-hero.is-in .imp-count{ animation: impFondu .38s ease .56s both; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-hero.is-in .imp-hint{ animation: impFondu .38s ease .62s both; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-row.rev.is-in{ animation: impFondu .4s ease both; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-row.rev.is-in:nth-child(2){ animation-delay: .05s; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-row.rev.is-in:nth-child(3){ animation-delay: .1s; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-row.rev.is-in:nth-child(4){ animation-delay: .15s; }\r\n#reu-roue-wp .detail-body.js-reveal .imp-row.rev.is-in:nth-child(5){ animation-delay: .2s; }\r\n@keyframes impFondu{ from{ opacity: 0; } to{ opacity: 1; } }\r\n\r\n@media (prefers-reduced-motion: reduce){\r\n    #reu-roue-wp .imp-body,\r\n    #reu-roue-wp .imp-row.is-open .imp-body,\r\n    #reu-roue-wp .imp-texte,\r\n    #reu-roue-wp .imp-row.is-open .imp-texte,\r\n    #reu-roue-wp .imp-chev::before,\r\n    #reu-roue-wp .imp-couche,\r\n    #reu-roue-wp .imp-seg{ transition: none; }\r\n}\r\n\r\n\/* ---- cadre bas : l'encart se resserre ---- *\/\r\n@media (min-width: 961px) and (max-height: 720px){\r\n    #reu-roue-wp .imp-hero{ gap: 16px; padding: 14px 16px 14px 14px; }\r\n    #reu-roue-wp .imp-disc{ width: 94px; height: 94px; }\r\n    #reu-roue-wp .imp-glyph,\r\n    #reu-roue-wp #chart-container #amp-map .imp-glyph{ width: 74px; height: 74px; }\r\n    #reu-roue-wp .imp-count{ font-size: 17px; }\r\n    #reu-roue-wp .imp-head{ min-height: 48px; }\r\n}\r\n\r\n\/* ---- t\u00e9l\u00e9phone ---- *\/\r\n@media (max-width: 860px){\r\n    #reu-roue-wp .imp-hero{ gap: 14px; padding: 14px 14px 14px 12px; }\r\n    #reu-roue-wp .imp-disc{ width: 88px; height: 88px; }\r\n    #reu-roue-wp .imp-glyph,\r\n    #reu-roue-wp #chart-container #amp-map .imp-glyph{ width: 70px; height: 70px; }\r\n    #reu-roue-wp .imp-count{ font-size: 16.5px; letter-spacing: -.4px; }\r\n    #reu-roue-wp .imp-segs{ margin: 10px 0 9px; }\r\n    #reu-roue-wp .imp-hint{ font-size: 11px; }\r\n    #reu-roue-wp .imp-head{ gap: 10px; min-height: 48px; padding: 8px 10px 8px 8px; }\r\n    #reu-roue-wp .imp-tile{ width: 30px; height: 30px; border-radius: 9px; }\r\n    #reu-roue-wp .imp-ico,\r\n    #reu-roue-wp #chart-container #amp-map .imp-ico{ width: 18px; height: 18px; }\r\n    #reu-roue-wp .imp-label{ font-size: 12px; }\r\n    #reu-roue-wp .imp-texte{ padding: 0 14px 14px 48px; }\r\n}\r\n@media (max-width: 420px){\r\n    #reu-roue-wp .imp-texte{ padding-left: 14px; }\r\n}\r\n\r\n\/* ==========================================================================\r\n   LA CARTE EN RELIEF : SECONDE CARTE DE L'ONGLET \u00ab CARTE \u00bb\r\n   --------------------------------------------------------------------------\r\n   L'onglet porte deux cartes des m\u00eames projets du fonds, comme \u00ab Lieux &\r\n   financements \u00bb porte deux diagrammes : la carte territoriale, \u00e0 explorer,\r\n   puis la carte en relief, qui les raconte en cinq \u00e9tapes. La bascule reprend\r\n   la pastille de \u00ab Lieux & financements \u00bb, dans la m\u00eame bande en t\u00eate de sc\u00e8ne.\r\n\r\n   La carte en relief suit la maquette \u00ab Carte associations - Pr\u00e9sentation \u00bb,\r\n   dessin\u00e9e pour un \u00e9cran de 1920 \u00d7 1080. Tout s'y mesure dans l'unit\u00e9 de la\r\n   maquette : --u vaut un de ses pixels, et le script le recalcule \u00e0 chaque\r\n   changement de taille du cadre. Les textes gardent un plancher de lecture\r\n   (11,5 px au moins) ; le reste suit l'\u00e9chelle.\r\n   ========================================================================== *\/\r\n#reu-roue-wp[data-view=\"carte\"] .stage-panel.carte{ top: 58px; }\r\n\/* Le plein \u00e9cran emporte le cadre entier, bascule comprise ; sans fond \u00e0\r\n   lui, il s'afficherait sur le noir du navigateur. *\/\r\n#reu-roue-wp #chart-container:fullscreen{\r\n    background: radial-gradient(120% 90% at 50% -10%, #ffffff 0%, #f8f9fb 45%, #eef1f6 100%);\r\n}\r\n\/* La carte du fonds se retire sans quitter la mise en page : elle garde ses\r\n   mesures, et sa projection reste juste quand on y revient. *\/\r\n#reu-roue-wp #carte .carte-cachee{ visibility: hidden; pointer-events: none; }\r\n\r\n#amp-relief{\r\n    --u: .6px;\r\n    --aa-ink: #1A1714;\r\n    --aa-ink-82: rgba(26, 23, 20, .82);\r\n    --aa-ink-76: rgba(26, 23, 20, .76);\r\n    --aa-ink-66: rgba(26, 23, 20, .66);\r\n    --aa-ink-62: rgba(26, 23, 20, .62);\r\n    --aa-line: rgba(26, 23, 20, .1);\r\n    --aa-accent: #4F5D99;\r\n    --aa-titre: 'Bricolage Grotesque', 'Manrope', system-ui, sans-serif;\r\n    --aa-texte: 'Schibsted Grotesk', 'Manrope', system-ui, sans-serif;\r\n    --aa-ease: cubic-bezier(.16, 1, .3, 1);\r\n    position: absolute;\r\n    inset: 0;\r\n    overflow: hidden;\r\n    isolation: isolate;\r\n    background: #fff;\r\n    color: var(--aa-ink);\r\n    font-family: var(--aa-texte) !important;\r\n    -webkit-font-smoothing: antialiased;\r\n}\r\n#amp-relief[hidden]{ display: none; }\r\n#amp-relief *{ box-sizing: border-box; }\r\n#amp-relief p,\r\n#amp-relief h2,\r\n#amp-relief ul,\r\n#amp-relief li{ margin: 0; padding: 0; }\r\n#amp-relief ul{ list-style: none; }\r\n#amp-relief button{ font-family: inherit; margin: 0; }\r\n\/* \u00ab #chart-container svg \u00bb \u00e9tire tout SVG du cadre (voir la carte du fonds,\r\n   plus haut) : on rend aux n\u00f4tres leur gabarit. *\/\r\n#reu-roue-wp #chart-container #amp-relief svg{ width: auto; height: auto; display: block; }\r\n#reu-roue-wp #chart-container #amp-relief .aa-svg{\r\n    position: absolute; left: 0; top: 0; z-index: 0;\r\n    width: 100%; height: 100%;\r\n    touch-action: manipulation;\r\n}\r\n\r\n\/* \u2500\u2500 La colonne de r\u00e9cit, sur un voile blanc qui efface la carte \u2500\u2500 *\/\r\n#amp-relief .aa-voile{\r\n    position: absolute; left: 0; top: 0; bottom: 0; z-index: 1;\r\n    width: calc(920 * var(--u));\r\n    background: linear-gradient(90deg, #fff 0%, #fff 60%, rgba(255, 255, 255, 0) 100%);\r\n    pointer-events: none;\r\n}\r\n#amp-relief .aa-col{\r\n    position: absolute; left: 0; top: 0; bottom: 0; z-index: 2;\r\n    width: calc(700 * var(--u));\r\n    display: flex; flex-direction: column;\r\n    padding: calc(72 * var(--u)) 0 calc(64 * var(--u)) calc(88 * var(--u));\r\n}\r\n#amp-relief .aa-marque{\r\n    font: 600 max(11.5px, calc(16 * var(--u)))\/1.35 var(--aa-texte);\r\n    letter-spacing: .14em; text-transform: uppercase;\r\n    color: var(--aa-ink-66);\r\n}\r\n#amp-relief .aa-etape{\r\n    flex: 1; min-height: 0;\r\n    display: flex; flex-direction: column;\r\n    justify-content: center;\r\n    justify-content: safe center;\r\n    max-width: calc(580 * var(--u));\r\n    padding: calc(24 * var(--u)) 0;\r\n    overflow-y: auto; scrollbar-width: thin;\r\n}\r\n#amp-relief .aa-kick{\r\n    display: flex; align-items: center; gap: calc(16 * var(--u));\r\n    font: 600 max(12px, calc(22 * var(--u)))\/1 var(--aa-texte);\r\n    letter-spacing: .14em; text-transform: uppercase;\r\n    color: var(--aa-ink-66);\r\n}\r\n#amp-relief .aa-kick b{ font-weight: 600; color: var(--aa-ink); font-variant-numeric: tabular-nums; }\r\n#amp-relief .aa-kick i{ flex: none; width: calc(32 * var(--u)); height: 1px; background: rgba(26, 23, 20, .3); }\r\n#amp-relief .aa-big{\r\n    margin-top: calc(28 * var(--u));\r\n    font: 800 calc(180 * var(--u))\/.82 var(--aa-titre);\r\n    letter-spacing: -.05em;\r\n    font-variant-numeric: tabular-nums;\r\n}\r\n#amp-relief .aa-unit{\r\n    margin-top: calc(18 * var(--u));\r\n    font: 600 max(13px, calc(30 * var(--u)))\/1.2 var(--aa-texte);\r\n    color: var(--aa-accent);\r\n    text-wrap: pretty;\r\n}\r\n#amp-relief .aa-titre{\r\n    margin-top: calc(40 * var(--u));\r\n    font: 700 max(17px, calc(52 * var(--u)))\/1.06 var(--aa-titre);\r\n    letter-spacing: -.03em;\r\n    color: var(--aa-ink);\r\n    text-transform: none;\r\n    text-wrap: pretty;\r\n}\r\n#amp-relief .aa-corps{\r\n    margin-top: calc(24 * var(--u));\r\n    font: 400 max(13px, calc(28 * var(--u)))\/1.45 var(--aa-texte);\r\n    color: var(--aa-ink-76);\r\n    text-wrap: pretty;\r\n}\r\n#amp-relief .aa-corps[hidden],\r\n#amp-relief .aa-liste[hidden]{ display: none; }\r\n\/* Tant que les donn\u00e9es n'ont pas r\u00e9pondu, le r\u00e9cit n'a rien \u00e0 dire. *\/\r\n#amp-relief.is-attente .aa-etape{ visibility: hidden; }\r\n\r\n\/* La liste des conseils de territoire (cinqui\u00e8me \u00e9tape) *\/\r\n#amp-relief .aa-liste{ display: flex; flex-direction: column; margin-top: calc(28 * var(--u)); }\r\n#amp-relief .aa-ligne{\r\n    display: grid;\r\n    grid-template-columns: max(10px, calc(16 * var(--u))) minmax(0, 1fr) auto;\r\n    align-items: baseline;\r\n    column-gap: calc(14 * var(--u));\r\n    row-gap: max(4px, calc(7 * var(--u)));\r\n    padding: max(4px, calc(8 * var(--u))) 0;\r\n    border-top: 1px solid var(--aa-line);\r\n    cursor: default;\r\n    transition: opacity .25s;\r\n}\r\n#amp-relief .aa-ligne.is-terne{ opacity: .4; }\r\n#amp-relief .aa-ligne > i{\r\n    align-self: center;\r\n    width: max(10px, calc(16 * var(--u))); height: max(10px, calc(16 * var(--u)));\r\n    border-radius: calc(4 * var(--u));\r\n}\r\n#amp-relief .aa-ligne-nom{ min-width: 0; font: 600 max(12.5px, calc(25 * var(--u)))\/1.15 var(--aa-texte); }\r\n#amp-relief .aa-ligne-nom small{ font-size: inherit; font-weight: 400; color: var(--aa-ink-62); }\r\n#amp-relief .aa-ligne b{\r\n    font: 800 max(14px, calc(28 * var(--u)))\/1 var(--aa-titre);\r\n    font-variant-numeric: tabular-nums;\r\n}\r\n#amp-relief .aa-ligne-barre{\r\n    grid-column: 2 \/ 4;\r\n    height: max(3px, calc(6 * var(--u)));\r\n    border-radius: 3px;\r\n    background: rgba(26, 23, 20, .07);\r\n    overflow: hidden;\r\n}\r\n#amp-relief .aa-ligne-barre i{ display: block; height: 100%; border-radius: 3px; }\r\n\r\n\/* La navigation : pr\u00e9c\u00e9dent, suivant, les \u00e9tapes, rejouer *\/\r\n#amp-relief .aa-nav{ flex: none; display: flex; align-items: center; gap: calc(20 * var(--u)); }\r\n#amp-relief .aa-fleche{\r\n    flex: none;\r\n    width: max(36px, calc(64 * var(--u))); height: max(36px, calc(64 * var(--u)));\r\n    display: grid; place-items: center;\r\n    padding: 0; border-radius: 50%;\r\n    font: 500 max(16px, calc(28 * var(--u)))\/1 var(--aa-texte);\r\n    cursor: pointer;\r\n    transition: background-color .2s;\r\n}\r\n#amp-relief .aa-prec{ border: 1.5px solid rgba(26, 23, 20, .22); background: #fff; color: var(--aa-ink); }\r\n#amp-relief .aa-prec:hover{ background: #F1EEE7; }\r\n#amp-relief .aa-suiv{ border: 0; background: var(--aa-ink); color: #fff; font-weight: 600; }\r\n#amp-relief .aa-suiv:hover{ background: #3A342D; }\r\n#amp-relief .aa-points{ display: flex; gap: max(4px, calc(8 * var(--u))); margin-left: calc(8 * var(--u)); }\r\n#amp-relief .aa-point{\r\n    display: flex; align-items: center;\r\n    height: max(28px, calc(44 * var(--u)));\r\n    padding: 0; border: 0; background: none;\r\n    cursor: pointer;\r\n}\r\n#amp-relief .aa-point i{\r\n    display: block;\r\n    width: max(20px, calc(44 * var(--u))); height: max(3px, calc(6 * var(--u)));\r\n    border-radius: 3px;\r\n    background: rgba(26, 23, 20, .14);\r\n    transition: background-color .3s;\r\n}\r\n#amp-relief .aa-point.is-fait i{ background: var(--aa-ink); }\r\n#amp-relief .aa-rejouer{\r\n    margin-left: auto; margin-right: calc(48 * var(--u));\r\n    padding: 0; border: 0; background: transparent;\r\n    font: 500 max(12px, calc(22 * var(--u)))\/1 var(--aa-texte);\r\n    color: var(--aa-ink-66);\r\n    white-space: nowrap;\r\n    cursor: pointer;\r\n}\r\n#amp-relief .aa-rejouer:hover{ color: var(--aa-ink); }\r\n\/* La visite guid\u00e9e pousse Rejouer \u00e0 droite : elle prend la marge flottante. *\/\r\n#amp-relief .aa-visite{ margin-right: calc(28 * var(--u)); }\r\n#amp-relief .aa-visite + .aa-rejouer{ margin-left: 0; }\r\n#amp-relief .aa-visite.is-on{ color: var(--aa-ink); font-weight: 650; }\r\n\r\n\/* \u2500\u2500 La source, en haut \u00e0 droite \u2500\u2500 *\/\r\n#amp-relief .aa-source{\r\n    position: absolute; right: calc(64 * var(--u)); top: calc(72 * var(--u)); z-index: 2;\r\n    text-align: right;\r\n    font: 500 max(12px, calc(20 * var(--u)))\/1.5 var(--aa-texte);\r\n    color: var(--aa-ink-62);\r\n    pointer-events: none;\r\n}\r\n\r\n\/* \u2500\u2500 La l\u00e9gende : la hauteur du pic, la teinte du conseil de territoire \u2500\u2500 *\/\r\n#amp-relief .aa-legende{\r\n    position: absolute; right: calc(64 * var(--u)); bottom: calc(56 * var(--u)); z-index: 2;\r\n    display: flex; align-items: stretch; gap: calc(26 * var(--u));\r\n    padding: calc(22 * var(--u)) calc(26 * var(--u));\r\n    border-radius: max(12px, calc(18 * var(--u)));\r\n    background: #fff;\r\n    border: 1px solid var(--aa-line);\r\n    box-shadow: 0 10px 30px rgba(26, 23, 20, .07);\r\n}\r\n#amp-relief .aa-leg-pic{ display: flex; align-items: flex-end; gap: calc(16 * var(--u)); }\r\n#amp-relief .aa-leg-glyphe{\r\n    position: relative; flex: none;\r\n    width: calc(78 * var(--u)); height: calc(140 * var(--u));\r\n}\r\n#reu-roue-wp #chart-container #amp-relief .aa-leg-glyphe svg{ width: 100%; height: 100%; }\r\n\/* Les graduations en texte HTML : l'\u00e9chelle du pic suit celle de la carte,\r\n   les chiffres gardent leur plancher de lecture. *\/\r\n#amp-relief .aa-leg-glyphe span{\r\n    position: absolute; left: 74%;\r\n    transform: translateY(-50%);\r\n    font: 600 max(11.5px, calc(18 * var(--u)))\/1 var(--aa-texte);\r\n    color: rgba(26, 23, 20, .75);\r\n}\r\n#amp-relief .aa-leg-titre{\r\n    font: 600 max(11.5px, calc(16 * var(--u)))\/1 var(--aa-texte);\r\n    letter-spacing: .14em; text-transform: uppercase;\r\n    color: var(--aa-ink-62);\r\n}\r\n#amp-relief .aa-leg-texte{\r\n    margin-top: calc(8 * var(--u));\r\n    font: 500 max(12px, calc(22 * var(--u)))\/1.3 var(--aa-texte);\r\n}\r\n#amp-relief .aa-leg-sep{ flex: none; width: 1px; background: var(--aa-line); }\r\n#amp-relief .aa-leg-ct{ display: flex; flex-direction: column; gap: calc(10 * var(--u)); }\r\n#amp-relief .aa-leg-grille{\r\n    display: grid; grid-template-columns: auto auto;\r\n    column-gap: calc(22 * var(--u)); row-gap: max(5px, calc(9 * var(--u)));\r\n    font: 500 max(12px, calc(19 * var(--u)))\/1.2 var(--aa-texte);\r\n    color: var(--aa-ink-82);\r\n}\r\n#amp-relief .aa-leg-grille span,\r\n#amp-relief .aa-leg-vide{ display: flex; align-items: center; gap: calc(10 * var(--u)); }\r\n#amp-relief .aa-leg-ct i{\r\n    flex: none;\r\n    width: max(9px, calc(14 * var(--u))); height: max(9px, calc(14 * var(--u)));\r\n    border-radius: calc(4 * var(--u));\r\n}\r\n#amp-relief .aa-leg-vide{\r\n    margin-top: calc(4 * var(--u));\r\n    font: 500 max(11.5px, calc(18 * var(--u)))\/1.2 var(--aa-texte);\r\n    color: var(--aa-ink-66);\r\n}\r\n#amp-relief .aa-leg-vide i{ background: #EEEBE4; box-shadow: inset 0 0 0 1px rgba(26, 23, 20, .12); }\r\n\r\n\/* \u2500\u2500 L'infobulle \u2500\u2500 *\/\r\n#amp-relief .aa-tip{\r\n    position: absolute; left: 0; top: 0; z-index: 6;\r\n    min-width: max(200px, calc(300 * var(--u)));\r\n    padding: max(12px, calc(20 * var(--u))) max(14px, calc(22 * var(--u)));\r\n    background: #fff; color: var(--aa-ink);\r\n    border: 1px solid var(--aa-line);\r\n    border-radius: max(12px, calc(16 * var(--u)));\r\n    box-shadow: 0 18px 50px rgba(26, 23, 20, .16);\r\n    pointer-events: none;\r\n    opacity: 0;\r\n    transition: opacity .15s;\r\n}\r\n#amp-relief .aa-tip.is-on{ opacity: 1; }\r\n#amp-relief .aa-tip-ct{\r\n    display: flex; align-items: center; gap: calc(10 * var(--u));\r\n    font: 500 max(12px, calc(18 * var(--u)))\/1 var(--aa-texte);\r\n    color: var(--aa-ink-66);\r\n}\r\n#amp-relief .aa-tip-ct i{ flex: none; width: max(9px, calc(12 * var(--u))); height: max(9px, calc(12 * var(--u))); border-radius: 3px; }\r\n#amp-relief .aa-tip-nom{\r\n    margin-top: max(6px, calc(10 * var(--u)));\r\n    font: 700 max(16px, calc(26 * var(--u)))\/1.15 var(--aa-titre);\r\n    letter-spacing: -.02em;\r\n}\r\n#amp-relief .aa-tip-sous{\r\n    margin-top: 4px;\r\n    font: 500 max(12px, calc(18 * var(--u)))\/1.3 var(--aa-texte);\r\n    color: var(--aa-ink-62);\r\n}\r\n#amp-relief .aa-tip-val{\r\n    display: flex; align-items: baseline; gap: calc(10 * var(--u));\r\n    margin-top: max(8px, calc(14 * var(--u)));\r\n    padding-top: max(8px, calc(14 * var(--u)));\r\n    border-top: 1px solid var(--aa-line);\r\n}\r\n#amp-relief .aa-tip-val b{ font: 800 max(22px, calc(40 * var(--u)))\/1 var(--aa-titre); }\r\n#amp-relief .aa-tip-val span{ font: 500 max(12px, calc(20 * var(--u)))\/1.25 var(--aa-texte); color: rgba(26, 23, 20, .75); }\r\n\r\n\/* \u2500\u2500 L'attente, puis l'\u00e9chec \u00e9ventuel du chargement \u2500\u2500 *\/\r\n#amp-relief .aa-attente{\r\n    position: absolute; left: calc(760 * var(--u)); right: 0; top: 0; bottom: 0; z-index: 3;\r\n    display: flex; align-items: center; justify-content: center;\r\n    padding: 0 24px;\r\n    text-align: center;\r\n    font: 500 max(13px, calc(26 * var(--u)))\/1.4 var(--aa-texte);\r\n    color: rgba(26, 23, 20, .6);\r\n    pointer-events: none;\r\n}\r\n#amp-relief .aa-attente.is-echec{ color: rgba(26, 23, 20, .7); }\r\n#amp-relief .aa-attente[hidden]{ display: none; }\r\n\r\n\/* \u2500\u2500 Les libell\u00e9s de la carte : pos\u00e9s une fois la carte immobile \u2500\u2500 *\/\r\n#amp-relief .aa-lib-n{ font-family: var(--aa-titre); font-weight: 800; }\r\n#amp-relief .aa-lib-m,\r\n#amp-relief .aa-lib-unite{ font-family: var(--aa-texte); font-weight: 600; }\r\n#amp-relief .aa-lib-unite{ font-weight: 500; }\r\n\r\n\/* \u2500\u2500 Le r\u00e9cit d'une \u00e9tape arrive en fondu, une ligne apr\u00e8s l'autre \u2500\u2500 *\/\r\n@keyframes aaMonte{\r\n    from{ opacity: 0; transform: translateY(10px); }\r\n    to{ opacity: 1; transform: none; }\r\n}\r\n#amp-relief .aa-etape.is-entree > *{ animation: aaMonte .55s var(--aa-ease) both; }\r\n#amp-relief .aa-etape.is-entree > :nth-child(2){ animation-delay: .05s; }\r\n#amp-relief .aa-etape.is-entree > :nth-child(3){ animation-delay: .1s; }\r\n#amp-relief .aa-etape.is-entree > :nth-child(4){ animation-delay: .15s; }\r\n#amp-relief .aa-etape.is-entree > :nth-child(n+5){ animation-delay: .2s; }\r\n#amp-relief .aa-etape.is-entree .aa-ligne{\r\n    animation: aaMonte .5s var(--aa-ease) both;\r\n    animation-delay: calc(.24s + var(--i, 0) * 45ms);\r\n}\r\n@media (prefers-reduced-motion: reduce){\r\n    #amp-relief .aa-etape.is-entree > *,\r\n    #amp-relief .aa-etape.is-entree .aa-ligne{ animation: none; }\r\n}\r\n\r\n\/* \u2500\u2500 Cadre \u00e9troit ou vertical : la carte en haut, le r\u00e9cit dessous \u2500\u2500\r\n   La colonne passe sous la carte ; la l\u00e9gende et la source, qu'aucune place\r\n   ne loge plus, c\u00e8dent la leur (l'infobulle et la liste des conseils de\r\n   territoire disent les teintes). --aa-haut, pos\u00e9 par le script, est la\r\n   hauteur r\u00e9serv\u00e9e \u00e0 la carte. *\/\r\n#amp-relief.is-etroit .aa-voile,\r\n#amp-relief.is-etroit .aa-marque,\r\n#amp-relief.is-etroit .aa-source,\r\n#amp-relief.is-etroit .aa-legende{ display: none; }\r\n#amp-relief.is-etroit .aa-col{\r\n    top: var(--aa-haut, 46%); right: 0; width: auto;\r\n    padding: 12px 16px;\r\n    background: #fff;\r\n    border-top: 1px solid var(--aa-line);\r\n}\r\n#amp-relief.is-etroit .aa-etape{ max-width: none; padding: 0 0 10px; justify-content: flex-start; }\r\n#amp-relief.is-etroit .aa-nav{ padding-top: 10px; border-top: 1px solid var(--aa-line); }\r\n#amp-relief.is-etroit .aa-rejouer{ margin-right: 0; }\r\n#amp-relief.is-etroit .aa-attente{ left: 0; bottom: auto; height: var(--aa-haut, 46%); }\r\n\/* Aucun cadre de focus ni surlignage au clic, partout dans le module. *\/\r\n#reu-roue-wp *, #reu-roue-wp *:focus, #reu-roue-wp *:focus-visible, #amp-relief *, #amp-relief *:focus-visible{ outline: none !important; -webkit-tap-highlight-color: transparent; }\r\n#reu-roue-wp svg *:focus{ box-shadow: none !important; }\r\n\/* ============ TRANSITION ENTRE ONGLETS ============ *\/\r\n@keyframes ongletEntree{\r\n    from{ opacity: 0; transform: translateY(12px); }\r\n    to{ opacity: 1; transform: none; }\r\n}\r\n#reu-roue-wp .main-content.is-entree{ animation: ongletEntree .55s cubic-bezier(.16,1,.3,1) both; }\r\n\r\n\/* ============ MODE PR\u00c9SENTATION ============ *\/\r\n#reu-roue-wp #present-btn{\r\n    display: flex; align-items: center; gap: 7px; padding: 5px 0;\r\n    border: none; background: none; font: inherit; color: var(--muted-text); cursor: pointer;\r\n}\r\n#reu-roue-wp #present-btn:hover{ color: var(--ui-ink, #1f3147); }\r\n\/* Pendant la pr\u00e9sentation, les commandes s'effacent sans que la mise en\r\n   page bouge : la vue garde sa place, seul le bandeau parle. *\/\r\n#reu-roue-wp.is-presente #indicator-tabs,\r\n#reu-roue-wp.is-presente #roue-modes,\r\n#reu-roue-wp.is-presente #freins-modes,\r\n#reu-roue-wp.is-presente #fleurs-modes,\r\n#reu-roue-wp.is-presente #territoire-modes,\r\n#reu-roue-wp.is-presente #carte-modes,\r\n#reu-roue-wp.is-presente .reading-note,\r\n#reu-roue-wp.is-presente .app-footer{ visibility: hidden; pointer-events: none; }\r\n\/* Le site laisse le bas de l'\u00e9cran au bandeau : la vue se redessine au-dessus,\r\n   rien n'est cach\u00e9 dessous. Dans le flux, la bascule, le constat et la note\r\n   disparaissent (le bandeau les dit), le diagramme prend toute la hauteur. *\/\r\n#reu-roue-wp.is-presente{ height: calc(100dvh - var(--pres-h, 150px)) !important; min-height: 0 !important; }\r\n#reu-roue-wp.is-presente .fx-bascule,\r\n#reu-roue-wp.is-presente .fx-constat,\r\n#reu-roue-wp.is-presente .fx-pied{ display: none; }\r\n#reu-roue-wp.is-presente .fx-cadre{ min-height: 100%; height: 100%; }\r\n\r\n#reu-roue-wp .pres-bandeau{\r\n    position: fixed; left: 50%; bottom: 14px; z-index: 9999;\r\n    transform: translate(-50%, 10px);\r\n    width: min(880px, calc(100vw - 32px));\r\n    padding: 18px 26px 16px; border-radius: 18px;\r\n    background: rgba(24, 45, 54, .94); color: #fff;\r\n    box-shadow: 0 18px 50px rgba(15, 30, 38, .28);\r\n    backdrop-filter: blur(8px);\r\n    opacity: 0; pointer-events: none;\r\n    transition: opacity .45s ease, transform .55s cubic-bezier(.16,1,.3,1);\r\n}\r\n#reu-roue-wp .pres-bandeau.is-pose{ opacity: 1; transform: translate(-50%, 0); }\r\n\/* Sur la carte en relief, qui a sa propre colonne de texte, le bandeau ne\r\n   garde que sa piste et son rep\u00e8re. *\/\r\n#reu-roue-wp .pres-bandeau.is-muet .pres-dit{ display: none; }\r\n#reu-roue-wp .pres-piste{ display: flex; gap: 4px; margin-bottom: 14px; }\r\n#reu-roue-wp .pres-piste i{\r\n    flex: 1; height: 3px; border-radius: 2px; background: rgba(255,255,255,.18);\r\n    transition: background .4s ease;\r\n}\r\n#reu-roue-wp .pres-piste i.is-fait{ background: rgba(255,255,255,.85); }\r\n#reu-roue-wp .pres-nom{\r\n    margin: 0 0 6px; font-size: 11.5px; font-weight: 700;\r\n    letter-spacing: .14em; text-transform: uppercase; color: rgba(255,255,255,.6);\r\n}\r\n#reu-roue-wp .pres-dit{\r\n    margin: 0; font-size: clamp(18px, 1.9vw, 27px); line-height: 1.3;\r\n    font-weight: 500; letter-spacing: -.3px; text-wrap: balance;\r\n}\r\n#reu-roue-wp .pres-dit b{ font-weight: 750; }\r\n#reu-roue-wp .pres-aide{ margin: 12px 0 0; font-size: 11.5px; color: rgba(255,255,255,.45); }\r\n@media (prefers-reduced-motion: reduce){\r\n    #reu-roue-wp .pres-bandeau{ transition: none; }\r\n}\r\n<\/style>\r\n\r\n<div id=\"reu-roue-wp\" class=\"is-booting\">\r\n<div id=\"app-container\">\r\n  <div class=\"brand-row\">\r\n      <div class=\"brand\">\r\n        <img decoding=\"async\" class=\"shl-logo\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAC0CAYAAABMvP\/AAAAKMWlDQ1BJQ0MgUHJvZmlsZQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee\/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5\/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc\/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX\/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs\/8WRR5bRmyIjvYODk4MG0tbb4o1H9d\/JuS93aWXoR\/7hlEH\/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu\/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H\/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA\/nNi9GZmJ37z4L+fVe4TP7IFiR\/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye\/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi\/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd\/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q\/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos\/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G\/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K\/wb7X\/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8\/jzGueNueq5clzrXaVuDLdEt71uUnddd457g\/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq\/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R\/kP82\/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl\/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1\/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi\/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk\/MmNzr3SJ5ynjBvYLnZ8k3LJ\/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt\/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO\/Ner\/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z\/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x\/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG\/wbNDZ8+d8z53p9+w\/ed71\/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI\/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X\/9H686CH5YcWEzkTzI9tHxyZ9Jy8\/Xvh4\/EnWk5mnxT8r\/1z7zOTZd794\/DIwFTs1\/lz0\/NOvm1+ov9j\/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+6TMXDkAAOsHSURBVHja7L13oF1Xdef\/WXufcuvr76l3uUhyt3HHsukQCCEZmSQkuMBAkhlCGAYMk5mRXuaXSUgmIYRJMnFIgEmZxAohjQ6xhbHBvUrusnrX6++Wc87e6\/fHue\/pycjGNrL0bN8FR379nrvP3nvttdZ3fb\/Qtra1rW1ta1vbTrhJewja1raTvgb1A8vf0Bkm4eKU9Jg\/lABlQlLjD9244xt7p36vPXxta9vL10x7CNrWtpNna1lrAXyDN4vIg6ryIGp+6ApUHjRiHnSZ\/zjA+tbvta1tbXv5WtAegra17eSba4WzCv5YB2MFr2AUbUe9bWtb2wG3rW1tO15mhMyjdcCpqj1Gotp51AqStEerbW2jXQNuW9vadnxs3cKLiwNS6a4\/x88UKWHiZOKzT359rD1ibWtb29rWtra1rW1ta9uLsDaQo21tmx0m68Hckn9srgSZeU19fVN7nNrWtnYKum0vbrwV2MD66XHfwpZjP4N1sHHm56tXKwy2Plmf\/2dwEECn\/j9l6zdsOMbf3NC6YMOGDXrUD4jQbmlpW9va1ra2vWxNQdaz3tzEOrue9cF61gbrWGdhvZk+7szWI4+qoCrr1683Ux+j2j6gta1tbWtbOwKebc5W5WquNqtZLVvYohvZ6I6mVuCHcv0Z66NtbCs9gC09RqVcI7DDwXi1UZTgcEFlsiAmNcUgC22lGWgY2I7YRnFoCjYUU6r6OIptuWijYgUtB2FQiGMbhCaMyz4sFH1gIqQcNE1H0LCFQClJKjZrqHejifHjJsqaWVob8w0\/7s3kpJ+oT3b7pDFvzz2NwcFB\/5zO+eiIWWfvPFXgGRmA9dM5g5NoG475tcENG354LE\/8+L6KxvxZxv2Fj3l7TrZt1jhgWfssxACbGFBmOqeXscPdyNVmMwdkkE1u2sXKkTW2nvf1dGAXZKRLHLq0jl9aC\/y8WsicyZDeyVA7awHVhtVC0xA3jVpv1GRGceLx4vGtjLDiZ6SHFRDUGkQEjEWCAMEgQYgJImwQYqMitlAiKBWJKx2EHRXiuEhYKWVRVyWNquXUVOKalMIaoRnXwA8resj7bD9Zul\/U78HrbhuafWo56J2M\/NWbzq4dY\/HJUe2o7cX5KuHrag9De3za1o6AT5CtZ72BWwxc6QeZESEK\/IpeM7cbc0aMPReys1N0dT1k0Xjk++pxyGhsGI1gIlDq4khwZKR4n4HPQDNEHahHVBVVZNqpqR5ZzDM+OPLhEQeoiqq2vj31ceu5ikWsFRtGRMUSUblCsauLcl8vlblzKM4foDCnHzvQBZUCLhTnhXFcNkyW7iXNdqqVp1R5QgPzVKDRTtfdPPhX55wz+awR8kvgjNfzgdJBhk2RWAEqdMgTi7eHO9gx\/TOZnydjY2s4vXlBl\/Wd3QCE0FjRGUaXxd30UTTe6Emh2LBFcL2tjy0MHSBIm2pWVMeTc\/SwL3pvglCjzLmI6ODnrzjlUAsucNLsI6wrNsFOjflc5nBf56PRjs6jxzwwK7R04IxK1S3oMwQGIF1YtbK21BnMl8qz\/X1jjffGPq\/36L0T47x5YbQmERm9rfSThaHDhBMjaheU6vU12SEdCBKfplJ03oeJHUke3HGAwRmBwk3rgHXH+Nsb2bhunV8vV4djYDsoTb+Hnb3D4R49gunIupbK2MgqXTL02moUFuYoRgDSpVVrXlvu8gso404W7UsRZwZUfSJYC3t3EWWpD5YVJybOyg772HsThlpJM1dIJw4\/+fv\/4\/DApgGdwqew7rnHp30oPzEOWAA9ZeD1yzWO3uF9pjC1GYsajHhxB7fu+vbfvNyc7gY2OZnh\/f5z6Zq51MwlMfraEHOJoquywHaOFw0Hisr+gnIo8kwYT4pz6lM1WYLxKcanYnwmoMhRYy6oPONLz2vU5VkfhzwzblcFVfXeo96hzqHeq1EIrKVYiKl0ddI5d0A6li2S0sqlhCsWI\/P68ZUizmX4eqNJkg4JutPB4xIGD6v4h4KIR31\/dc8Xly1rHNMh\/3iLUAD9DB+K9zJxi8EsdnhHoBJ1i7mj2ggfoykRkj8kN4FmHuPDyGgQgYK1aG+HMdVCKFbkxC8uIcPTTYmVDOBQxGXo4lWEF53i7GnBaFrQUSweQQOlaVQ\/t9gP\/e\/Bq67KThaOQUA\/wbX\/EBBcnOFSNWqibpHHO5LoB6YukQqKIH4S0lTxYWg0iEEEEeiqCF2l0ITGPPsUtj80W58rgauaPe9R93jKxKxhLioCaQKLVmIuP9fHa6KJtMSwRpLiwQo+Cu0\/v\/vMpZ+8SuR5j\/knuPbLAcEbM1zijdq42\/BIRzO6SxoSk48PbhKfJeBDo9gMEIygXVUxHcUwDKyR57Wuj++cTHEMUGUl\/WSiSJbAaecRXn5qZpeb8awkI2plek7GhfjGPz5z0R\/i2w6T2cWEtc7ARqehPTcw4R\/4Z+RkRQK8qz8N\/M1sT9LkYCkYZNABfhD4BO8\/1ePeEiBvDWpcFBF012NhR9mxs+TZW3B+3Hqfqce4xNi0IdY1KWhqUT\/9dlWktbjk+AzAs7IR6rH\/voiYIEAIpha5AHhVJrxn7NAQe\/YeILj7AS1ZQ2e5RPf8Ae04ZRnFs06T4PTlsc4bmKeFaJ5Nswv9xKSS+SFN5Snq4\/e\/93sP3WWEB1xgt\/7lhauHjnK8P6YzHmJMQBYHBPMhhcgS9Cj4Mp4yU7E\/SR3E422Ko3lk5z44Bvv9SZl5Qi6i0IVSxZNZg4yNw9oBuOI1ltpET2TCnun1Yixps7Fsb7UqJy+xqVPzdH5IOM\/jweZjbijgKeZjLoI2MtAUbIYjPXKro+Mw7HmWDVsREfV+i6rfLYjVZ3+PQv5XCmLkEkHs843vApQG96NWYKIG\/a+FSp+pPVnrEAk6pt6qCQIOjoys\/fRHf\/sdH5j\/hrEsCCDL4Pc+DosXgMtaEbtV75yQgSnxmL72D7aa1NwHmRcwdHsg0oyCBrSO2llDVL0PJa30pOb86bV7aBhGhhjySjq1GFXBnxiSswxoojTwZEaQWh3OKNAwYcDjjW4R2z39AIxh3\/5Dr\/uZM3\/m0d6Doy7LMpjTC5\/5LxAEMzIaVr0TQbM08OmWG6+64FDbvZ4oKkqlmfk08z51TC8S9SJqBIZmcwbgJtaZq9nop0BU63n\/woZx7xRvfsbiLu0giuuRsrOS8XQ5dXsLaM0YwXsTuMQESc2ErgGa5Y5AWqfflsNl9qCc811uhvMWwIhgwxCiCBVkQmHMOXY+tVPiR5+m8ys309vdqV3LF1E6e5Xac04Vli4U7enqNaq9Um9e6JvN9yrsNk43X3vbQ3fI7ebOMJLN885ftX9QxP+4zlihmZF5h\/eq3liXR2rPiJFa702QmVTKBrDBSXFm0nr5qRdWayD0EBkQB6lD7fShSY3xIvn+OBuWRpKRqcdnHm+tA2+Ozt7kvjFPeslMiL9w1Ob8TP9oTGCd1998etfXnldmbPHin+8O\/KHtglSmH\/KP2NQawN1TX+gswp0Pwu33Tj8NPdIXqJm1rzkzDP8hMha8ImIgLkCpCI0EjIAqNghxNsU5\/+FPZZ\/\/6PSD9cCTz34\/n+KDp4yRPjY9WbsQ6Ra+nsFBgRBBNYXG3hPyZEPyTfnw1BvoKMI\/fRP+4Wutw9dRe4R6G7zzoiB4Z2CD1vhYCGMoROBaK9ErQWRJG34sC6KfB76iqiLtVPSJ4IJWEQhaudSpU6oXMP4lIPtYz3qzhi2ymdVHPdzBF\/RXtghsdFe3HO8NvO9Kg16X4N9R8VE34jlYdvpAR5JsK6mMWSuqIkHWNHFzElxdVVPNF7OZcrjmZdg6le9pLcdsACsChZisVOCAwv56Q8J7t1C960HpKxXpWziX8jmnqzn\/DPWnLhXt7iwYWBE00xWuXn+Hit+fpObh7bdt\/t61t265PSry8I\/jjAURaY2tIEZeqCs9cuiQk30IQqei8dYhTeRIBCQiisjsqE1pK58sRvJz2gurXj17liZvb\/PZ805oRhNDzhenBk2f13PUmVOk5SDI\/A+leRUVFYNo\/ianDkzYIL+C1u9o7mhUFZemBn3+s6lK0Y2TylE5gKnefZk5N06sr\/J5qJDfg\/PHHJ\/8dKWYHPKZH2\/FQGBbB9uWAzaKWItCIN63VfZeoWIMrYh10B0f53Nz8Fv87boE9x8Ee1lAQDPM2N3heLwDdsWhNJAocEohred1RtfIj7wiiIRHBVZeHa+QfmZQRZwSAliDlouMCAw5z9Ztu+l4fJv0ffnb0r9wDpVzVysXnoU7fRm+q0Os17kmyea6RuMNamRfs2Yeevq2zbdde+uDt9uAB\/\/8krP2Tzve41MvbtvLZwkbVYfAR5cveONPi2Kf+zilquIKQPH5OF9ppaBLwCl5WgFqdbj8fHjTZfnHrdK0qqqxgdTHxu\/m5h\/87+SJnRMZKoJX6g1oTEI9OyqE0NSLqxbv+3jhff8taphzM7LMGzWFpfmR\/g4gmrqT5BDqavpZ\/0hnfxpPO18ikDpMKEfevPoTlpXJgF5gCeQp6HoT3vUGOPt0qDdhqjKtqmKsTB48\/JX0G5v+b3P\/qMvwEmii1Gt5et61Qi4HKiIYSayL7m5Vvtpr+sQ4YFHNn6ufsZi0FQUfT6+kV7PRfYzr5wfIr4KernhfRCSpwn398IghT0GKgGtCehh8gmmd5Kd8C4I7N\/vUsh5XPlPEYNL0G+eN9Hx2pC+Lvt4rOpJAVwoFgKyOS\/Yz3dFrgzz1MiORpdaVBPkTEelUVeUVgjDX6XDCT08WjSNGijFDXtm65yBdT39L5vzLzfQtnEvxNWeil56j6anLVLqqxqbZ3DB1c7M0eYNasy9L9b733vrQzTYwt1YkfOSzImPHGbzVttnOBqeKGHuBEbngeUdrPntBczYE5tGChCYpLJ4Hb74chsfATjtgbBjhRXet+u\/v\/9sPizSn\/8jPfuc5X+MGrn1zieJljVYmo2AgNK0M0lQN2IagAakVtoWTR99gmm++R4OwzAlb0wVgPpAiSJrB6pXwxstgbGJ6fFBFbIBEwSN\/\/Dsfuinf84B9wOv+oT2TZ4sDFu8jExYCf3ROBZGALMu6jleX3ce4fr7F\/yeDfLiDcuDxUIKdPfBgGQ4aiFRAM8jGwU2AGIwtkeJIZ5TXFDgsjoPh4WZgoiCJG1u+NfKPX2Ev0CrFjL7Am1yx4A2\/B9LJK5fpa3phBq3FqFHIUCHikCrxngP03fQ15v3Td6Rn5WIJLjuP9NJzNVk8T00hNEEjnSfq52Xev0kzt20c9\/1rvvfgN8Igun30otN2bBRx045Y2h1yr2RTzbzqCykkiH2hc3UaFiaSO+HRCRifPMoB+zAlS5Lo3q\/s717HuoMH1q6WgU1blJtuOmaXTfeN95g\/\/cD52SflurE6iUtInYJVnwPu\/HQUIjmoyqcghghjn7mj6Uley2nrEpE88h07enymHLDPkuK63\/m7Ih\/dmBxgtQysa40Px+xCYuM62m1IJ8YB5zVYCXSn88k\/qjqvqmZqfuU1YfP08WiVWs8H+hLSjwjmQof\/9hDjzaBT5cEB0XsNGAeRa0365iHQJkaNiDFm3Lqh3kZ0ereLz\/eoqiKBgpaRfaYQqAQ2MOU1p634pZ\/02X7rkzF\/FIgkm\/7n2Se0NUWU0quIdvOHnLGLQvYUIvZ4pePxbczd\/ARzb\/qalM9dLe71F5OdfbpSKWGbSWCcX6nGrHSZe2eWJA9Wbtv8rWs3PfTtUq88+MciE+2l+cpPRZ\/QHkuR3LGY1jXlYIzBBFaZ3+02stFxiwoiytXybPgTlQ9eoDdwrRWwrZ+ycsyUl0xfs9EbyYwL8+zjI0HoefNqt\/GjGx2osHHWQBVe7Q44J6d4fNd37gLe9Xz37Be3188b+i0GP3bUd0afX5j623zgJ5rw+w4vDm8KgchwP9xVhExz1KMgb\/Ju9E34JsaGR9qZpzWjoh95mx53NBHGq8wZiyphyxlPFGMeKxXYlmb0b7qThd+9m47lC0VfdzF+7WvUzetHag2skY7ABpdnWXopwnsnh\/Tm62954F8kst\/780vPGGov0ba1rW1tB\/wjD1PrnuNE++NTUbaYqGTdMV5nIz8kJGQ3sjFZx7rOFVT+oC5ybaoOR0bUIWzuV+4OoOmUSCz4JpocVnUND+bHcJ9i2xzZrTOLVyyKE2F3pcwu4Lzte5j7p39L+qVviHntBfj3vANfLKgkCcYYI9auwMiKLEuvMGn2y8C\/jS3skXjXSHultq1tbWs74Gffd08I3\/PRogccM0UUDDKYfJT3rI4p\/FVMeG5Nm86ImqBf5M4u2KIQZhAbi2YTkAwBXhDb1kc+3lExEPgcwNUZR7hSARkZhx88gHnvT+Vtu610lrrMGwkEmCTT\/e1RbFvb2tZ2wLxcaCTXBoMMZp\/gujdY7N9ZTM8EjSwKJEjnCTeXYFcGBWkx+STDkI3OoEz4kW7FK+JfZIrAvhq5t6fYoOYBRVUS1Rx1+ebLoavaQqVONWOouMyJd+67u7767W2wNmg2d9mIskx3dhoDVhCdqe6oeauUE696hH+p1ctqj0WtdDIOJNM1GK\/gXN57eVTfrKBZaob\/elOwlrW6iQlZS0WvPGqSb4Arn+VFbrnFP6eq1Qszp2gG6nIy02d5L8euKwYyg9BBfsTvnJAxV20T37et7YA5Sj\/o+NkH+EA4yI3pDVz78wH2Cwphg8TFsQST8+HmEA5nUBTJN+DkEGSTLwgLIhIYI8a8SNTn0bvYqygSDsh7DgMRSDOkrxt+4kqII+jpnCI6ULFWMtXtvauW\/s0Xrzp3EuCPDzLxSd7nDDafOJMJZiTFISQtIgFFoT5OEFtjo4KZIrfwKE2SI9j8Fg9GxIlt\/xDy1zRTDXulGLo78q8EMxGnFqKg9vnPfLTOtJpYfk3b4FUvlHHmxVp3iULQwAQgFGxO4GVazzPn7IrAJD80fg0SFH\/UmAc8g5HnBI35NNFMFJKaNj9E29oOWF+ayPfG9BNc856A8K8cTjO8jwtixxbAdwyMOyiI4FFoHgRXfwGbgHqRwHiffRPkVlFCkefXOa8qooIDfa8xdqWqU15FEEJtbYT7gP15QydUSvCNWyFzR++ZxpKMT7ih+7asW7HgjW9LgNMQWx8f7lEJ8I26cPnZNC9aQXcj4XSR1gRWfDZJbc++mw\/f\/9h3fa0mqurKWdh3eqPzPxjEaKv50VRgq4eJ6X5ND9nES\/beDTAJPNbi3pY4gtvvh6ExaCYzp4IgQm3\/obWnrXjnYDZR08TASuD0VhaBJIP\/+WtwzulQa+TZAN96EVXv8d\/4\/BXn3PHj0G7KtAqT\/EGNxpKEzKuKqELT5U3900\/NJ7myV4uzQUU08CY6q9bx4QBT9qgSIrYKuxUOtjacKfEM1B33pNDUYasJPD5FwRpHmMeeZuHoOIE1+UG4jeJ98ftt3uliuOX5\/fwt3MKmkyQu0nbAz6jPwt4WnHg4G2Rjcnyc76bsY1zznoDor5xk3qkSFcTUFsC\/GZjwEE873wPgGi\/oBK6IN2KMQf\/pyT3f\/uMXc5\/L573pNYJZqXne0b7aUtBPTEUiYQAHhuDPNh7z500QLA+Lpf9sTUgE9AP1zjESPKZDhA+\/EV25lJ5Gk34xRyJnz4HKykW\/+fvVcJpB4dv86pxNTPyyxRjfol8JemCfgzEhj6k1fckc8BS150TLAeM1j\/pvvx9uubPFMXz0z9s4vjSIC5cGQdgS1YO41aspVqBShY4uCFqMTqogBpcmNOv1SeAOjoOD+W0+\/3lmtuE9+Xw3FOHnuP46iymnOCgKhT5IfH4Im95w6jV4ibT4zFEOOO9VDx59mvkjY0hfN5q2fcGPYy1K2bY20svFAbeAUVmT7e+JiX4LoE7p88CvT33vx3O+174tIvhLh\/NOVYJYJF0ANxsYU4iFI2nnF+h8Z5pXU1nL2qA1bs\/rng8yYPo54HeKRryKNS+jo3LSFro6jh2\/KOq9c5l3dAFVwBlr7URTuOw8mDsP2TeEMybfvlWRMCJNGncO\/\/2WzWtZGxRXnmXrTz7o\/onDvQVCjLRkGQXsUZS7ckIoAM3ME5cqlApQLj5LxsR75zPvNXdPKbmwQCKC+BQmxmF0BOpTDrilLqSaYKR2vO75JtbZzaw+4sXXTkUzR8c2U\/nxCSakQkXPYWmljjMWJcPl4iQKmZ68OaeqBFF4pL+1bS9yI19vGESv\/+4Dry92dF9WHx32Is+xmSoaxAXxzcbQn60963+3B\/AkR8CCdoQE8wAapL38mPKBg2zMbuDaMwOCv1UUj8cEIjIfvmfgkM8BVx6TU1JmtR+r9iSifhOb3FrWsolNz\/PQsN7ARr+cNyqvdlS0yBEn5NwxlqsKIiIQKDlwq0Uzm9dOr7wwpzwwBrF59ItY8T5LEPPNjdf9xH74CdY\/ucEPsslfwi9meRr4CBGCOa5y2C+y7uL9sZPE+ddy8YMZd3cUYYLMVNqSaRUHUK96\/AqrVz+z22DT82Oru5I1WYPaNHl\/ixj2pACg9Cg94TYx049ra6+80mwalEx4+O1xtfPXXJpgbPAc5TdPUChRbzb3o\/pHLXasWS1L+4p2wB6pp2TjLWc88eIjagys1vVc05Ugf2+QaoJziNhoHtwVwo48+4UXA+kopOPHAfiRi\/zewiYnL5Cs5Eht7dXldKcBUEJe81X94d1YQawVsbkcnCcn058LOBFoNmH5Qrj4TEhTiIJ8a1dFwhDv\/UNdC\/u+CaII\/EYLflum6GqkP8IBy4kHPXifp6PlWPxQhqlxONr5tiT\/jDn6UhXEoM4HqLcn+4y1htjd33bAr\/CMljiXpvgs\/REyGg6fpaiQtkftJDrgqRRzwuRfFyj8M4DD1Gd+74XYGtbJ1Qy6T3DtjUXiU2vSyFAJon7YVoLNrVYjLyYHW6UjP17kC9b7DMV8ZMWCN\/7cCrDLX8ApTlBV9afke6qYV0PKOQM6gTW5ACwyWYfXnAH\/fl0LQCRH9OCCQOqj49\/e\/83v\/Y8Dd983kRFIV5oSIepNFHUdnvelIO2c7z7wN16tN1E\/PAg8DRKJkNYby5K9T\/2\/5QveMO3VBNX\/q08XOrLQTt+WzVVoxmYS5r+EG\/NM5ZnTpsZhogbveTtcdXEuFG+PjAPGSHNo9C8f3\/iVzzae2OsgnT7AZGFI5PNjbC7e7vOLfDU5oBDorh9XzELz1i39BNf9eUhwbkLqNBATL4bHDdzWIvL3ItA4BG5mJ4HySR4yHWnYazEomuui1KFGLpBwpC3IvSRueUoNqdKaexhBJ5rI6y4mGOjFz5x7bXtBNnDwYEubRTen9clv+CRxTlL7nFU7xYiyuz16syAC\/jQb60CdHzP1fDUb3ce55n0FCutqNDJRCUwVJrrgzmxqTxPwDpLDx2ldK8aYhYIs1BexKfgjQlGvitXvydVWelogLFEPb3ktrFqRE77n9ThFRJz6ZrVQ\/NI\/\/tK7vjv1+zuAe1sff4Lrm8FwigzvyIntF0FTYYQWQMmaHpNpj5EjrdYCqCiHouSHbuyHG7LlJY3CQqALyATEeZjTB6uXw8gzlWcsGLP3yx+++q6pCHgH8G8z\/+D1\/3ai4sezIsJzlTzDHbU6psxUFkEEjAVvpx3wVG5xOEqfkXKf8XsnaMxta8x1KuPQVcVFIUzWX43t+MfFNl59tQOVP79CPg98frZ0wbQd8AuRIptuzpcX\/DDWs95sYNB\/lGsXBZjfS0g9iNUAbD\/cqzAp+aasIjnDlc+OW9Cp6lXzNLS88Bkn8mpyvgVgAGiK4JsJLFkA566CodFW5JZHnyYMSNPsCR2bvB3WG9Zi2ISHLbKe1Qp7C01SUTGoxFAUtNBi2GpdXlU18zlvxBFqDgDCYzz8k0EIkbUuEfI0eq2ZK9A8wwH7NIve8umvxF\/\/8B3pkTF4BhHHhmfLNKHHUYWmlpD6jMx5sKKQ+pbG6NT60iy\/Wq5VjyChZ82YT79u5nIcQduOwz6ocvXGjc97U129bp22kNNtO8kOWOXH8EFr2CIC\/uPo70ZEnXUaDsREfbAjgKddjnhWMTng6gUSbTy\/YLbN9\/yjov2UFvMVkBpBmglcdi50dsDo+AynM6WbKt8tVPRJdIMCbgqsMQi6nmvy+ElbeCN\/pLh8hOlIW4ebHz7j6GxUnpEWzGoabtWqg+eKNLr4sgHfwg7I4DPfwuDgiSLiMIIYEJVngMJ++B3N3jE\/Sg3pOSw1Rlp61DJdlhBpR2wtG9+x40jDer4+XXtUjk+HxMtiX1\/P2uBqNrqPce1rY6J316XpQayUIO2AB\/yRvQz1rbpvO9V0MoAvhjz9DOR0i6UiXH5+DqaSGcdoG0jm3X7U\/MuNF1xQQ+TZIrhXziY4jWJu24lNvWme\/vetGrrqNNBNjfhSVZqt+ednzEP94SzDBn1mzfwVUVfSo\/rznjln\/UXFYtvhvoq5oHWQTdk61lkL\/xPEi5KJSBj1IluAw2gLHGIgGQbfbAerJwl81UUOwEqNQcYmkCsvhDUr0fEaGgQ5JllzDQZJdbebRH\/6lntPKZQCF2SuGRLWS3ftmPzsh9\/WnMDZEBNyjDQ3L6OUvE4532YCaXZMJ+y9V0WD2uEgAlJOHmOT6EyyGHk2AfnZey7SZ3zsCy36T+fyIdUjgHQm3Jzs2xNr33PTI4\/p0jQNXdW7ZFRsIajHtnH4xgsuSI+Uwa6Nh\/iQwjiAE8R5IXJmKi0\/89X9kT5zMbNurU6VE6y2CGKCIO\/bfsaBQvHd2+haeM3N943UDm6ubbya5HglJl7t9eOXhQP+JO+bA+kcwS7w6FdTkn0u4MrJclrOIorGGdaIYRdCqp4MBVtoIS31JUW6tu2HAUdWhCeBCCWulokXzIEHHyNW8N0dGGsR79EgUsEuT0P5H8YH+2o12ZOaYGvJuEcbZyx47D2PP77X\/\/pfB\/z9tmHBLkRlOvVcOmolm1Yr7OxzvBVg4VSSPHOwfBF0ViFJZzhXVYyVzLvDanm61JspJyms2sAGyaXB+BuPv1hRIRVcAnNjqGqOorQIamJyfPPsmoOWHPh3L1D2StVaws1Pohu\/jg0DCpXS1NiLi0tIufMss7D4vyYL6ZNpk92TjB8uYA\/PTfSuYZvc0aqqtKwcVGlWFf5Xk\/QfGwHnRei7mhOmty9K9fJQZFKE3RiGbAmDbUXbyaw4Nk6Nz0FgGCirolGIbN0Ja05BvceXixg5Uix0KpeMhMFFxjW\/u\/Cccn22URG3HfBLfljTfo\/5NYNchWivlqSoXRrsL3ieVk9NYpzPcL6OaDbj19rP+kT2+071W05kGWWvGFWkWkbveBBzeAQtFWFeH1IpQ7Ussmg+mTWdk8XCktTbNBH2NtDGmBNXn1cKz\/2L758WfX3Ppw1mZaZOJcDQAfcoPDWzrcXVZ+W6nqLhnAR6ESRNYeEcOPs01PmjaaBVMRB7J4t8VpkDbOME947n5DaD7hNc+x9Dwl9PcR7EBmUY0bwFKZkiNvFJfsCdhZFd2LqqCr3WUJ7fT1xvwJ0Pka1ege+sYjoqBN7jOytar5azCeddQ7Whap7YhXuwGbBLRhs7vv7WSxozx2cIm5ap\/8eA4MMeJ3GmxaBTZH\/o+L51kmKBAO+bGD81Ptmsm5+V1mVFcmrOezbD1W9DvMfOyLr4fA\/dHnl5aOMVF+x7Ee9DAP0I64oxlX+xmO6MrNUd\/sLMIj\/9m\/zF9vWsNy19+LYDPhH7+2\/xFw9\/jGv+2SJrRW3VNTwlJyyRAntFGMGDWESTnNfXZ68m0PFJ3\/Aq5IArAxSCgHJfN9U4ouw8FCL8gjm4Ky\/EzB9AKkVNrfUNY2vj3u1PhC3eht87IP6WzbjtlJnk8cc9V6xrvv4zG95lGsEZVsNiJqkGncJET65qNQkUENQ3IDl4wpmtXsjhZAuQqnJqGJBteQr5o79Bfuln0c4q4lwL1aJqjVREuZ4s3bvupoc\/s\/HqM9ITGTVsZGPrdbKvZ8j\/NBjr8OoqIp0lKDsYAiIBdQlkY7MGRjKzYOtah55MckWsRq1Bh\/eUzjoNs3Au2t9NOtAL1mDTTIqZKxmltyCmEqqaU0y4M4vrj9\/4tovTZ\/RHu4\/wvk6BBzL83xp4t8RGtKpKwcgpFNimMIbHuFq+F82yFPQURqOrxS\/uswwZ6IVffCcahzlgcgbayqtvAA92Nxu7WwqTL2qRdYBNkNdXKZFrmb3wPzNGs9KOgDmh4g1mgqeKIdFPh5j\/luDm52xA6GGrcqdRxnyLIWhK9wx5NXBdzCoHUyMnvy+qUg4DytUypqeTpL8HvegsdNkibClGi0W8c\/jMq6Rai13wtMn8lmqquxbUjTkvNAsqNTcaLF58KPrLb5p9X33fV7p\/+Z9eV3hq\/CtBZua4mmppHLmyBLcr7EQJJECDjpYzYFbWf3vIa+JGyB3uLXfCay+Aqy5EJlK0pYesGBL1oxYZWr35oD8JYZMH5Lf5qydv4No7Q+QqB+gQEnbkqfRdU4AdWwEznmMtZoETtq2od8pCVTq8J8ocqSZkaUZy72aCfQfxyxbiz1tDMqdPpRBpBmnDkNUhClSKdU26quO2jOoYefuMCKLr+ZXKBPW5iuwEnwjWeO91ctgRNy1RpzJNLxJ0gIlyFj6dXfilYmu8rCpiDFmliOw9iFqDeD1CDiOQKQ3BhxToBEZfbJvbEHPTCuOfH2Oy0+e6YPLC9xoZBtjABh08Qa0AJxSpPxvv7RO8b4WBXzbIeSnZHFNkpZsr4fYIdmT5KXdMPVk2mk92CWjbiXfCUxPJqhInKXEUUurrRpYvws7rx\/Z2EXd3UlQQCTGmqBpGmVRLTYmDSVeIJiUOhn0sjyWB367IPrzbydpz7lhV\/vf\/N67J65tkjhAbL4LHLHxfIUJy8EvzQCsVLbPOAfe3HHBZodsI5t9fjVx4JllXFRBMlmFasUlDdbMV\/dcAf5tkct+CK8\/aNyiSnchD7yCDegPXvi8g+KzDRWoROxcZK8GtmjOJGSQ\/9KSjs2Kcbav3fKrNy\/R2UervZrlXCtaQ9vXABWtg+VJsGJCVIs2MUTGSZUjNodsnjNw0krmvLdTm3u6qfQb4al1Up2OFoKsFXWDhch\/LW5sVVx4uZlKPA0bFsl0dDU0Q73KWMJ8wG1tfOoEyea9+z2nLcG95LbpmJX6gF9NMMJozNji04VWeMOgd1ui\/Nib123\/15nMm27veK98BzwTr8TGuPc\/Afwtt8FNZ4LAR1HtgawQPq+J9lqNr3WTe\/9u2E\/qQ\/EwQlhFir3SPT1IuxATlItmCORQXDBB2dWBLRTSOSZcvxvR1k0YBrlQamRTZ0bC6NxB21DEPBEYeKl664OFzwo\/8bpTZ6zOc1wgTLRKeFuWOKaEGyDWefX1WdtZNsTJ1A50iVIoFbLVM9tbX4s46DZnXTyB5VayONsfgEVX5esXrP0dave+LVy1rnNiWv\/XSYPsai\/kTg7k0lUylV4zrhi2ap9QNko93MvSS0Uq+2BR0q7UIrKUfmIMQN5sUFs0jfP+7MQvmoD7DlYpIYAisBee9U55swO2ZlQcCJ1utuF2FVHaPDT16aPnVGyuO0rIAs8og5wxHelkccXZWzMr12Mn+GOoSMuQd45qh6vJxcZMnRHHrhY7V1LGgDJzRaNJtDEQh7mfehPt3b8YiWGmlqcOQNMvAu9tCGHwyO\/PmTVe98EPhOtbZdfxYAiH+lQbiCmZ37+96GWRQr+GagoVLQcicewxYYboIhiLHuBo6MUyYiNRN5pJtL0PBDXmuvtFn6dubLe\/QtRzvQqBXBO88EljKay8kmNOLSxLcgrnIqUsJezpwih815uBQpbIfpSGB3d1Uf8c+9U+JZbg\/dTseT\/2Byz5zT3rWv97W7bE3OvzpglxCqjox7qS3U1imwtZcQAjCzlywfpal+6Y0fU8DqiJkWYY\/bzX682\/HBgFB2Gr9UFUJApEsOzyJ\/tkj2viXs+Z3Hfj6qcubJyOh8Sm+8NANXDsZEIioeD0MpTJUI3AKFkVtGWyzlXmSWUF0Mv25V3Aph8gpS6tiKO47xLzPfJ7KmlMwS+YTLF9ItnwRLggwcWwCkVML3q1I4M3e+F0N5au+ZL5aiVb6T+lNhxG5\/xNcN+bRi7rT4LI4szgVklLApPFsVWHUBAQerG8grjErgaAGWNY6EJZVCbo70GIB5vSh9SZ29wFk8TzwnkQ125ckO8bg0Sp8t1\/N7meKUvL8MQZuYzteeVk4YAF0C1vMJ7ju7QLvBRYidNhI+oYqmd0ae4bU4QloqsdrhqjLU9BGwacvqxSum8EUPSUYpDCtIKSgmjfLqwgYYzAiYsj7BVr\/nHCnbFqTqNo6VY97pSRCsOYUoovOwq1YTKaKxhGyeB7iPb6ZNa3I\/gq6IxXdHqv\/brfxtxwc3TP6JEW39aqrMoDzWRcllJaC\/gzIaRoolJG04NiPcIgQj0d8LX\/eYmeVA56qS8YtAvRYFW0m8OR21BikryvvCVbFC9JwLgWePEXCe79zxdk795yEez6ChL7u5wKCsxNSB1jbBSMFeMLlBwpFwDcgG5+VxCLaEoywQCBCTZUwSRgbSvE\/uB97z2aqS+cTvely0iXzacYR2tdNScQqzKt5Ha4ZWxpVPW2OWHP9bbc1Aj7Q8CRzDXKHaPZbQ2RLmkbfFHi6I2\/MKR5pGKiLsF9s3g4prVUyi6JgDywBukRopinS04Uf\/BB0VQkKMVJvoJlTsVbE++EA+dT3g+I\/MexGeNupTdr2infA+kneN0fQRRnMs\/CGAlF3I0oZ6U9plA1D3rJHIwJAfB2TDs1AP8\/+7LrOILWPWidRAQqZIxLBteqpYbWCDWz+k2GIiyJJnKderzPhMiZ95lymot6LqIrxHjPj\/etLvDlK631MAqPWcKhcolot0z9ZZ\/Kr36WwdD7llYsxpy6F3ftpisWXinE5tKdXRVY4o3s80pmmMu+i6qIH1lp5cOH69SODGzZoj\/yq7GMiEMyI4jpwItJENQskiA25BrQQSISKbx26dFY9+15aNWBjkJ5OOO089PLz8L2d2GYyPV9V0QTdLSI314Pmvlz8fFBPdCpnIxvdetYbYGOTHVjM551441KkOAaXV\/I68BC5aLMGHeDGZ1Wkp63DT2UKmZ9l9AYBPYUYKZfQrip2zUr0vDU4EdTrFP+En\/A6MaH+3mHDv3nNnqzjnxoLK4\/dedFZE3C5Are3rv\/3n+SaD5XqwTvCmqfLiJgO5VCPcocavK2gtoL4Zl4rnz4YyqyIgJ8GVpBjKHzmkFoDrZZgdGKaUlC9YqA0T\/XUj46N6++97ZxmS7O73d\/5SnXAUz1eirvCEPwPwa3w4BrVpq\/1Ou4NnBx0RkAoaBOyWl5veZmgn6eWX0GETlV604wCUCkXCeb0It2dyPKF+DNPRcTA\/H7VMCRBRxq1xtNutL6n8+kD5eoD25YV9o\/NFSeFyWycRmOSPWnDHc4SGfFeRB2CR3yGaD4yL8WqSYHGVCTsPH5kDD88yoTzlLzHPPoUfvVK3Pa92N4u5PwziLsqxlsbNa2NsiRZmYqWvJVYVA7U1e9LLn+3rIfhHQwHJj9+\/GRIGDaD1JuqGCkqI6oMASGK+nrO\/T3LnK8DRltjJM7RW2+AMciu\/ciyhbjuToKW47IIJaE\/Uy70iXz\/miuv3ffFwcHGybr3IYZsGf1PFhs79Y4JbNgNjwEHgAKK2kIeBb9wfZKX1OIWICtqRb+lcgk3f4DxOX0UykXs0gX4JfPRgR5ssYiUiijimmk24b3fHao92Os0Kqq6qMkoHVl40R1PVD+rOo41iirrdX1Q9Xv\/X903H0qwP+cdb0udLCiNw0UlkT1W2KHCmCSoiVpRcDorIuGEnMfLqSJRCHsPwpe+Ab\/y80d42lu5OGttOc2yyw6X5bR1N910eGNbVOHVUQNWZKFAr0G8Ex9KRUwSWCYI8K1mNPVp3ms3yzbeZxMFF\/JWnQIQOk8xCij2dlEMA\/zcPuqvORO55Bw0CgnKJTKERpY59W4sCezNY+XSvyYD5u7vlxZs+5nv7Fxz6n1Dl4dN\/7pSWRdPFoPTypWecF7oOCx5ej7zDZK0RpLVSdXrVLqamXpUP2Yqq7PV1lBQpSxCR7VCUUDn9uH7e9DlizDz+pFSAe3t0lq5lI5MTI41g3DPaBw\/PqHsRthZDnikZt3OoJ7VVwamueXqjbKRv5r8OO\/dZzFzHV4lFWEUOqqGmsxUay7nCGj1s+oQ5lqHkxXkrUg6PIbcsxkWz8vp\/1SPTAwj4rxKIjyocfDAxguXnpRUXysF7T\/Oe88OiAZSUq9gpAppEQ76KQIUyTMO2cSsW3PplATm1CZXjCnX6tjtuykWIorDowSPP41ZMIeorwdT7cAGYWBLxaotF08BlmoUX6JB9Mh4yBM0sl31iG3v\/cMv+553fapp793pa9t3LhgWXW0LcumkbZ6ahVpsGC81HzKswn7vcQqKBRPnEbDKrCiLdJLXf5tAweeEMFou4g4OwUAvQd6bTqpKI3MjHtlbzLTSvfyy2Ud91nbAx9cGGdQ8Mdv8Qkr0jjLFqxJSsrqnpwwrRLlHQVCshHnNV5Pj4E5eOmrGQmugrSqFKKJXcnL4qFjALFmAWzIPUypCFGG278Ytmq+TJhgfd+5QzcpQLDxWr7vbxPjHLxD2\/+Dq8ya+BHcAd6xj3R8snogLT7nwjM7J5pvKsZ4313OKDWVpWoj1cBQmQ7bSMYEGhzQj9QlGU9RnpDNO4y90\/OyMKKMDCIyhHIWULzwTlizAd1ZwpyzBLJyLNYJ4TzPNkiY83fDcF1jzzWLN3\/yDObqXLVscLa1REL2vlQlZz\/qgzo6LFZ10U2zKPTASQNPnr+3F5Kh315hVZAdBa5PrA+YqmEIMnVXcGy8l+8WfxDRTJM3AOVSVuteah3+NjP2r5vaHD77l8I7oopvVDV514lqQANnIRvcR1hUNwXsd3oMIVglL8CRKnbyumqMSWil0nX2tXzE5wjdWhUPD2CBAOqsU6k1KYrBphgyP4xfOIVicrz91iaSakXV1JT4KkkbgK0nAXIeqJKnrXjLwWLTk0KPV7+3osvj5tVCWdqmcVpXAN0MfpOUAscq4y8g8iKZ51JtNzoogYars1QF0i9CTZvhlC9CrLsYvXwjW5s53+gApjRQeTeDbNSs\/+MoFC9rO99XShrSedVGD8mkGeyno2zXQK+lTUytIPBpi9yLsVkiycXCTeD8jvTOLWLCi1kbQDcQi2Hl9FJcsIDplKUYE5vaRLRxAEGx\/D5m1Ps3c2KTqU03RpxqqT8ZBdLuX5v3\/1hzZTw5QkvXr18uWwS2ykY1uZm3nV3n\/Gou7LITSeFXnxIFcmJV0xYiYzlHRwIgrjdnMDGuDmk9b2q55Gxc+e17jpq33NQXA6gQq\/T10lAvYvh4KC+agc\/vITl2KdHdCHBKJ0FSaE0aeTFXvwcjt3cKD8wvJlk9dcMHos3OA+9M9nGeQ3yXEZB2e0apKEhruVxhRT+CTVhp6clYtrAgIRYico9LTiVm9kt4Vi6muWkHWUc6Ljh0VwjAC9U0H27zhCadywBp2F4V\/ufHSM+6WE1Rz0xaM779w\/RWC+VKA6W2SelMUkyyAHwDbWwcvhbz3ehb2uU5FFnHroIi19CyaS3XxPIJSkUqaIcsX5pzcfd3oQC8mCEhFUi\/SSMNwqO6yrZmRh8aN3vwIPFoPzEjtsrP2keV7zCe4bnkXWh7HvLkZcn0ccdpkrCYrC6MhbDcZ+11CiiKulusme3fSuzMqrb2oF+gwQrB0Ifac08nefDnu1GWY8UkkzRDvaDqtJd7fFxv5+xC91WAOVmvZ4cqbzq4PPotaVNteGQ54qgXJf5RfKEeEFyicm8E5PtQ3Fqtm\/kg506HIy4iEDKEccs28L1Fdnho7yWjYKWRz0Eo\/djhPwTnKPZ0EpywlXjiA7+4kG+jD9nVhFs9HVXUCc2BI\/KOpmKes8Y9Gwh2Rl4e+8tqzhp\/rGa5nvdwC5mL2loUJIxSjp8Jmf1ayFy3K5LI45U1ZpB1aolwrejlgnWxFqAPqmzhN8hO7tCRivP+R7y9uvbcBoBoGxNbCmpVw3hr8quVoRznnDe6soKpa8xyuqbmzJtw6Vs+emlvj6QWTPHUofHRs9eZ1+WK+8hbDlVf6qQW+jnV2OZX3WMyveaNnYdUEXchQFzyosB\/N+Wp9E9LhWYc2nfqvqLLSORZ4JQoDtL8HvfBM\/NuvwvT1YLxDrEWMoZFlNLz\/Ykn4jc+\/9qytJxJ\/AdBk5\/8LsVcnpBlWgnAubG2xjwVT6ed0dNayj80s\/cRArBCjRNZQjWO6+7opnXkKWq3glszHn7YM21HFknM0Nb02MzgknjtLqp97c5\/59uarN0bN+qH5zWLUFWw5OD8k7Eisnl8P3IoULnKR9jUDdLykMhqHjBphFFrc9Cmk4+CSWdOzH6gSBgHx\/AF6+7ro7OmiUCmSLVuIX74YWyxi40jF2mZTGPVG9hvlUYE7IuO\/3zBd92+8dHG97UJfoSjoVioaQ2RAfsPAZUWwYsEUPDsClS0irVSY5mhD9UwrIJ1kq7ZOm4XWx+WuKqVCjPb34M5dhV++COb1USwWaBrJxlUmGiK71XA33nxnf8jdBw6P7Rv9ictHeW7gg85I3ftNMPoxrq8KzF2aGo1H5cCYNWkW+r2Z99VmqriCFbGWbvU4hCZgnMdrgrhsRrJMnsmH8kPo5zqwQxVxjui0ZRRWLKJcKhAeHoF6Ey0VCBsZRqyKM3GhmayKmllXp42Gw0r58Fiv3UFx1cN3zX\/4gOCzDuk9WLzt0d3AhKKygWurDWSbw++13pzrRUkysKnSFQgHWkxYIiavtbn6rOq3nBqnyCsdCkVrSEbHoa8b\/47XYef0Is0EJ4J3DucVVf9E5OWfP3\/lmVtP5N48yKB+lF8ohQT9DvGAyW8+L\/wdleDXrLWVm1kbWUxlaJwRJr3iS0WCOX34wNJ4aiflxfPQng70wGG897g4QryqigQq0inGnloX+cl\/GPax\/48X1\/q\/dt+q0r7RBX5e5xvC4fQcWzVMFhKGQ8\/e0LNHVeouJfANTJIQTAlWzJJYZ6o0shLoF0GzDL97PxqFhIWYwDmiR7bixyfh9BXowjlu2MnT+8Q\/kgh7vciBCv7AAnSoOzrwEpZG1lk48BIP2KZZ4SiC4xGpbmCDtmTM+BFSZyrPrfAigH6M6+cb5FSD63FoAH7MW2sPhg3fjDHEIRKEiMp04gxcDggRc9In+5QKzsRUK1Ehxi9fxOTCOQSnLYN5A0gcodbSUFFUMivUQ3TCOYb6rdRWqaSnnTqn9uEXPknkd\/mLceCRD\/CBsAe7x1Kr2cTeV7Jm2aFIu6MmZ85POSeKVcvq1VnCzAbBTimJkzTvQtAMnyUzEGQ\/LCRfIwcZWRECBb\/lKSr3bCEWoBBjli\/CnLaMYMVibKloNAiqYalQ1bm9y3wYuoYxB2tGt6SGznF0W8GzN8McHt\/nmjnru3AD1y4CfQ1gFD1MSJez2CGbg0giAHW4ow5fJ3+zC1ulB9tqQ+rrqmI6q6SAXzIfs3IJFpDMkeWVQpfA+CHvvof3X1geBbecYEYZbXUg1G7g+i9HhFfVcV4kT4YsBB5tAXcM+rIQO9HW\/AxVsYBLM7KDQxQKMYG1mKFR5Mkd6EQdv3oFMrcP41QKVmxSiAtNZY5HT0uxT46csejhHZed+p2us5ZvP+01\/+1zSX33XJ3Q93fVzBt6S6awMDRdtdCx30ZslYDUCCmCaoscZpZkZjw5Mr8qQnfmMKcsQX\/553BrTsELmDTDOgeZI0tSV7H+8DIj3x6O+NdvmjX7+JcNjsGXWoloo4N2BPy8I9UWMbY+D4DV8+IUNvjeAHO5Q1YInGqq9tJmt9PRSM0IhpoKB1yCc5MYzVpo0iwnYphFVG8ZkImQNhPiezbT+chTlHbuJbj0PKiUSOb0EfZ0ikRRoWTtvBCJJgVVZdEBp4sO7mnc8YHdjz1xIxx6odm3lnpLCgzj+M7v8ZHb9\/qh8+aMSDxelpsPWXm9NuwZsfVaDXRVWCh09mjiRkRITMiQeEapizGCRAEkDZEkOcoJm6mWD5mWLWNi5WLoqlIQiIsFWDwX31HGxiFarSCBVfCINT4WJDNajYQFnV4nMfbJKHVjK9edlU0d1D7FFx76JNddaLBDGdl+HB3l1NhK6jkQO0oakInBQR4Bo61atp50JO4weX28T6EiQqZKtmYl5pd\/DtNZhdFxaCZYETVgA9WhAZEvjNYa3242C27t+pvtpsGrspOwTW9OyR6xYk53iarWkEIMczzsnCKWsOVZT\/mqMza5SISwmVB0jiCOSKOAoNHEdlaRriqK4FJHZg0+jl3Dy3hN9KBFRgQXWCPN0uTY0PI\/usWHd++IHXKFxVwIWswyNVpVJmNhvwloAiJBPh+zsdbedPLJOKRVFjsIZKqMhpa5jz5N9Kk\/g7euRS85m7SniyDNECNYMXGkeqH3FBY2Kf8qm2\/qhl0vtQzC8gVv\/F9G7GKv2UvR1uCNiPHqf33r7m8\/AesNJ1Ha8MdywOvnfaBER9hV4\/ml\/UIJNHx03v5n03KcInL6FF94CHjo41z75pDgl\/ykmwxrpnRWqchwj\/JwpEQakJmOPG7wDchmExhEvUF8GehTzWujXSXK5RKxtejDj+M6qki1bANjhO4OGiL1UWVsEh8XIU2sjLswGp9rTbL+5punn9MtwMDBg7px3Tr\/XA3xMzINAvBRPl2\/gV\/cOYl0BZOm0W389yaKts+G\/pRQvU3FuFJcst44Ro0SqdIRGFQznPN47\/EyVdfUKfFf6qrTfQldgOzej9m7H2sMLFtEeP+j2OWLkP4ebDPF9XSKKRZJrOBUqxaZX1cdNUISiB4araZDbNgAIJ\/kuj6HngN8MMC+xoihHqQ61K1sjYQnfTBNg4mrzar088wswWaBcGSMzv2HmDe3j\/Ceh8miiLSzgvT3EhkxNmeC6A+V\/9xXKV8TGb635sr+v9w0yL4TFQkPMqjrWS9r2LLpXsrbIg1XeTLnJ7DFCswNYJtCiEdNALYwKwUwngkW7GlJ74VpSmluH5VTlxEWY1xfN37hXKiWsHGIiSPq1tabyqGG0e0NI49Peu4up8m9WaO21X7qO+P9m\/aaCLt3En3QoX+nwkUeWRVYKiVVmY9SRBgC6j4hQ0BCZgtD29STmgAKCg1rCJsp8u3bMQeH0Ddfjp\/Xj20BxkQIHLKiKXpGM9NNe9es2weDL+lmK8o6Y8PFoi9N6l7EYtLGHwJPwBZ52UXA69euDQY3bcqa5exdBZU\/M05di\/XtWdeCIOJI6rps12qeZn8rQtNjpaBv4AOdhvR6Rd5pMWudeqSgPNGfsdNatis48rSnHgXznx1mJTAlsWYAmINSCQLCYhl98xW4i89BO6uYOIKOAk6g7txkhjzhCtEtOxfO\/detBe5AZAJg0\/ELBPgUf7kD2NHKRd3OknV\/c8OWnvkdpCsOVKRzwrNwomDOTNG+wGTScJXejHpnM21UnSkVRFQir0aMGgJjBR9Za6LAYEwr3ZqqMuo99WKRqFxV6etXLVeVnr7MlApKV1fdReFow7l6ZhktiD6VeH2oaPxdK5L08Rsvu6D2r637bdA1UWJyqyP92RrN010onwgCea2dUD29IHJqDFvxPK0JiYnypeqTVqShs2KzS4H9QGQtxVKR7I4H0O\/eTbB0AeHVb4H5A3iXg3+sSIcNgkuSLM1Sj\/Mmu+e6797rFr\/23MODJwYJrYMMcgPXrjGYexOyKwQpk6lOqoqo0NuK7C0WlbCV5J2dFraeQRPo8Z6uOCKOY4KeTkwxJl04BwZ6YP5ATkjhvVrIcH6cjO2dTm4thHrrsm8+NjSZpT2dD+49vxYl1b2BXRFl6RtsUVbXgrQ\/sSZIQs+wKnt9jovIpipjNgCX\/UhQ44k+mHQAi1viIH5knGzVCuSKCzB9XdgsAzOlz4VR9YdU5c5AK0\/89dXLTkCkowe9SweUzKPHOQIWvOCNWJO87FPQ3vtAjCkCXn5EqiDvMxVJfSbPNTE2sN6kPFnyRNd2UTlrmHElRuw8GA4MD7u8thagaDqURz6zBtCtXsQa57N\/a5LdsU1MMOScnleKSNcsx8\/vJtUU5nRqPFGzu\/76n96nSdYVqgbi3PI5IxPZonu3jLx+\/6FV\/OmXC+68NZbJBmKObL5qUK9mm9P0gdDEe\/\/istMnni81nIJsYP30QA1uGUw+BduAbUy0jsUA538gpLJE2fQOYeGmgI4xS2WlWbK\/YuZnNrC9aveeZQuTp4d9tj\/uCSMC9S6vxNv8HNZ0DpoOvKprNpGoy2WAGUoTLUmjUTIuQ9Iw8GORt7UeG032HHzoqD7DT\/PpOvBU69Otv55cW9aEVYVx0yfWq5krYkuGYS2yz5TyOZGNQTo2qyKw6lQ\/KpCWS5ieCF+M8RM1eHoX0tuNVMukznmniU9hLBVsKqavXHfhiVdC2nmqwLsDgnJiMjUdSGqUXa3IzgLqannlepYKn8iMlOuIKs0oYqJaQsbGkR17qb7mDIK5\/YRZhh0exRSLSOpFVYoFZxYUNFCJpaMkXLD37WcfCNRP8p7Lt+46Z8WmL4ey8dfk2r2VyeBTZYzH4qM+zHjkOeAVn8uDoD7J0c\/MPjGGWuskHovQU4qp9nUhxqBhSDOOCOqNFohQCISKVdaaYLLj\/Zvuv7MYN+7+7MUXj72E62ZOYMOCqrxEEbBB00b0snfAM+BOz2+U9Lk79vNvDvr\/xM+lMfY3RxhbIfB+I3ZJ1nTSl4m5MoQ9wB40b3GRMIcWzAKQg+aRPgp7m4aHC96FiRV\/2+goC7\/8TRb89ZfpIqXZNaD1Db9iR\/ceatpGKgV8rEjsnLug95Kzzw0rpackc5txfsyLGhWREFHNUaequF4rBjE1\/4F77mncmAdaz2dTUlro8iPZHphyylvYIjex0Zt7bkynkpLsyv+2kveAbgfYCzwMU58eDztITnM4syVmkm0DEcxVzGUg5zjoSK2PxgPHSNmxzzhUYxoogkd9lhOziGmhdE8+GC+boQm82Ai2VIQ4wl12HnLaMsyieXlZ3Tu8iEmVegP93oTw2ZHG\/rvuedMbT6Tgrm5hi9nIxi99nOtqBm7EM99PIJ1lw6Ux3KJwGI6kn9UzW8UYkhmKYs0soz48Rj9K5d7NhPdvoThvAOmoIL1dmNOWoQN9BKViIAO9ndpZ7Jzwbu4hNBhRbwSGFjy0c+7yT\/3LxZ8sXV9iTN\/lhTk+sEyalEkMe8QybiBrjYlRM8XIPqvS9L6VFTjUAqjVmikrvnkbxZvvxMcR\/k2X0Xzn64hFMCiizKmL\/mQGF5Ss6aVZeBoYa+Ekj\/vpy6hscC7t92QvxcCpwYgNaHUYbPQvxz5gAfQTi3++Oy50LmpkdTXq5UcmhER9tGjRo4ObBp8XsOQGrvvvFvPfIgmDhk0o9MDuTuUHLTL4CEVcHdKRXAlplkxyEYsVS9hCixZVmRPHlPq6cmas1SuJ3nwZumgAZw3OWDSwqkZSh4z6wN5Do\/HV2sj4d0vl5Om\/fglPmy98TsxYb+s3vLgB37BBjyG5qMeiRVxO9SyLO7spcomEcn2pbIKRUqZDkch4ADu8Z8gnhL6RRxyzCHE6xTx05lQdUhXiCN52BVx5ESyeBy1BBgGaSm0U\/XsTBJ8565JV9w+eeN7dFl7gF\/oLxG91+P9PYKGC+ioy3A+bDa2itOTjnBycdWQcOoOtTVpRRkGEsjH0Az3FGC1EuFOWwtuvQlYtxxiLw2uSOfVeM5+5Q77Jt2qJ+dudneHjjjSbf\/+e7JSb7ynEj+xfnu2sddRss7dgOKdQ5I01I0vqKpGEGTXr2eYSRnwzR+fj8wPhLBKsKLTm5ApVylFEunAAv2oFesapSG8XsnjetJBLhroJ2Dok5q\/SIPvL11109vbBNif0K5eIQ0H+kA9FQwzFTcK3WuxPO+ve4Dso0CXxRIB9SmCfF2quDtk43re0N2dFe4R6zRVJ8xOnQlmEquRApWpHhY5Vy5H+HpstmivulKXInL48TSlCE00y2Jda++2C6j9WTPGOOcnOoVtaf2\/g4EFdvXmzDg5uUHjlKZN8gA+EvWSnefS1gnYAZwiyuB7p2QdKWWfTopMlkfE4YBSoq8\/ToVPcxNOp0dmx0c0D5olQbCT4Vcvhl38WP28AjGBbtTaABB1S+LsY+0efe+2azZwEHujVrNYJdi4K0ZsMcoZHi1pF7By4T+BJzYk4VDNIhnLym1nWC2xbdxROsZE5T9UIlUqJILCkA334pQuIFs8j6uuGcokkDDULosTFcaLKeIJ5AhM\/YIvh9mY52xMqw\/XED614bIcZ2NdoyOfuiuJ9B850of2FuuWsusm6XQHTqFh2RMp+FRJjUPUtgOBkjs6fJU44Jedw7wfmGEOnNZi1r0Gvfgtu8QJkbBzjPAIqYsSrHlDhH42Rv0uT9N4vXnXO6Eu396wN1r7E73\/TLOkDluNRM+KFIS39i9kYVlB5b4h5Pfi3BRW6XYfq\/gLydBBwUGHEJ5hsIuennWbCmh3SX\/HUf1VZmKQExZhSRwW7aiXZRWdi+npwKxZhW8LsNZFahj5Rh69a5FuLam7L\/3nT2QdfBTJgAvAR1hViKj9rkE8o2uVDrfsemTfaJdHDJuOwGkIvuLRGmo7malhTwKtZ0Ac+89l3AHNaYhVRR4XSqhWYKy\/En3EKvlxC0nTafTVhOMVvir18x5DdW42Thz97YrMf0\/YR3tdTQP86xL45k0xtJ8Z0wUMh3K+tCNjX8wPPLENCRy3nGyoUA4P09xCVS3T1dVPu7cTHMX7FImTFYgIjmGZKE0kbpeKkWtuQxO9qSnhPw+v2eNdwGm8bala3HwpsbcIlriHh43vOrE9OvjFz6ZymurjTBPjIcyB0jBKQqdLUjIQMcJDWmaLVni1SjeVWVkBFKKYZC7yn1Fkh7aySvu5ieMMlFMolUBhW5yaVkRDZUUa\/UvTZ\/\/3Clec90Y5fX6ER8Gf4ULyH8feAvEbgtWJkeRib4oGOlB2SMhwIQzYgsQ6Px6pH1Lecb3NWcK5ODW6xlerpbtE1FhfNQ05bhhZj3Mol6KrlGFWIY1JjfFMYn\/T6UBP50qTh5oks2\/7AVeeOvJon6X\/l+nP3xfxMV8Tbq46zfKQyWnUciGG\/y9iFJ4P8+bvmrEmJzuxDLQBLRehdMIewr5ssjkgvPx9z7iqCKMB4JYMshZqDbTj+oj\/Wv\/3MxWfmlEAv8eHrQ3woLlJfafAdCvMRvT424duGw7pPRU2zYjnUYdjcuo3cASeQHJ41LTYzx31aCEUgtJbQWuKuKh2dHQRGsJ0VzMpcLMTHMVopo3hvnDqX+olas3nYORmNyx3bCnHng7VacPfh+cnOoQOHOzoe37No+f1PX9Wx5eDqYE99dSGiq9ihZm+pwV71jEiBmio1k4BpjU2znj9dTj7opwisEaEjyyDN0DNOJV33FujuQFRzkqD+HlJrNIHtO9C\/fszLQ5H4Q72Ox3oY2rfpqpPRn06biIMTokXak3omv27wdwH7JJBVSdV1lQM5f2Wp0HcYNFbEuyZjPmHc1Vqbrswqhh4lF6qfIAcZ9XhPeHiEaPtuSpecS9TXTXx4BO3qwAcBkmUSKMVulSUq+tZMdEADefKM7z18SHy2vyrm8T95dk7oV8qBUP8r71uV4a5T5EzQ+SYMzuqPM56OJ3WXsZKFMQdDR6pKIC2gyxThPX5Wnm47APWe0Z17qYxPEvzEWsIVC8mShMQIgQgGCSRvI00SI30HUn3jNbc+9OA1rvr4F1\/ifp8eHnQpC4eUSIFfFSNXpVGmYcEY26Xsj4UnM8BnCL6lQFWblXSUMuNCQdIMm6SUOsqENo+Is94uzEAvtqtKaAwi4Lt6xCcqNFMbdogljpwrxUWNqJZHJhYV94zMOevepyrV+3YX3LaR4ULTJY2C626UvOwrZjSJaBrDkHpSPDbzeTZuqjw2C2go+4BFInRkjmygF796JXr26XDJOZg0BRFUIUtTrXvdq4b\/84bM\/NFtV50xATkAtm2vcAfcSlPvAfb8Z66xQaKjHJBLQiQoFdGgmqAFYSgqMxKUc4SIprkTziZm1Yl8aiNoADszR2VohAV7D8J9j2D6e7BL5mOXzCfr7CA7fbkEi+ZFYam4SIwsmkyTS0dV7qur3tlhgu92+2TrNJL8lZmOVoBRSltLjH9dkH0KK5IwTaXCqT2FYqQB0aQgNgsZzsbJXA2vWZ6GnoUHMDsFwGodxPriiKBcRB7ZSrprH+6y8whWLMaUizhUa0YmahBl+FOMl+0dcTi+ur4te+nX3KaMHN++dz3v+w8N5++0dflPcdPMMV7C0zqU3hgeMBEjKN62pp+rz1pRHNe6jAhWFTc2icsc1OowOk7iHHLwMEZBvKL1VJKoSDZ\/Pn6gt9kMimNp4hujAZ1hT2lh1lU6oA0\/Vtw6sttMHFijdT+nEAbe1NWKhBwoe+qqWBQ3vfJ1VtR9p1qy9pCz1o1YQ8\/4JMXxCcyZp6Djk2SlAibNkMwRGJGqSNXDFTsDdddueuj2xOgjf\/PtL42+9FSUbQc8K+wTXHO+IfidmPB1HoUopdGrPFIKeEyhqZ5IFeNqkI3PGgKGZ1sAoQiZtYxVQvpUsQeHcB1leNNl2HNXY9TjjSHJErUCIRKWhVpT9H4nZueQs\/E1t9wSf\/Gqqxqv5En5WT7bBP6tdXFD7bp3SU3e3SPypv6IWLqVg1Xl6ajKTu2gNg10mWiVHzyzpf5faEUdcwRCD8ztx731CvyCfsJ5A8SdVQTNBajUNxrCpkNO\/75m5QebrzhjGyLuRKohbWBQP0o2ECK9Hg7hWeAaii\/BeNzqPACwcUtiL2llHmbfeouAokAPQhhHFIoFotOXE563hqy7A10wQFgpI9ZgMk+WeKdqJ4I43pPUmk8UIrszMDqWwVCo7PRWni5t3tVT2PTU\/7QNPdcbJjVUlR5la2B4QmzuzNUjbvJIm9Yss32tw2C93mTOrffQedt96Bkr0TdeRnLBGQRdHYTO4a2t1p17SwLLrJWeimaT6+GhQdr2SnXAkrcffaDD4n4R9MMWs7JGMzEBdv8A5vEistMLIUIR0Gx8hvOd3RbR0ih1jrEwpLBwbv75\/Y+gUUjW1YErFbHdVfFhhHfOm0zmlbxekQVuTmJ1s2j3Yz93893jWZxMbrzkksYrMRpez\/qgg7HwB+xKNrLRG8ztKelTqZpRSfVt0ZgsLKhyahmKxvC0CRiniDe2hTZNZg3zUABkAqNeKVaK2AUD2FOXokvm4cWgWc6SJMagyEQHOtpjJYu9s6\/72h3lfaqTG0+QE84zT+tNytDTMRP3K\/x8gJXUZ2pSkT6FvZL311rIAW9iZuWZV1qR3rhXxtMMLcYEWUbH9j0UDg4RhQFSrRAtW4ApFihkShAUrfb0dGlsKzKvf3GpUKr5QA7WRLcoUg29FGsfft3meppeV\/ybBy6TRvI6mvKmwqTpOKvgdU7oZa8x7JeQCQkQE7YK0ums2Z96yNWQOgAJLLrmFPR1F8GyhQTFmDAMQRUvQt37g4dFb5tUvl9K\/e0w+tRgO\/p95TrgVte1ZvgeCz+lUPF4gqqN\/BzHvgCGXe7IEnWEyUFwjVbq0cz6wW60rnERhr0nnqxRoURpaJTSlqeo9HQSLpyLB3wcgw0KkQlWhQELnZhDTuzeVP1wFMUPlCT+O0QeeQXmoGUD2\/r2E\/Yup\/Irvy7ve4uz3vlYgrSQdR8q+OoWcagoaEDmExL1qCoYyan\/fDqr1Hh2as5F3N9MmbvnAOUvfhkd6MG95izSBQMEfd2EqoTQo553pcIZTTVfmixV\/56NG0+0JKH\/JNddLMj5in8qw\/VFoalOFjPdLUZAqAA1dS3go581RBO2dUWtS+KIIAwod1YJSsUWC4NgO6t0W0tYqZA4wRdKqksXIeVC5oxMNGI7qdVS2vRMBl43jxv95y3YB4qaposfahz60ud+Zfjjf\/krqaj8jE1MR3bIa9AhMq\/XcBhhEpCgE3wB0pFZFRxMkHPoWFXmhCHLFs5F4wi\/\/zDZacswnRWiZoKKEKkW5olZjWgxCGV3eax+V9tlvoId8JQYw+\/xuaeBN6xjnV1G8fygFnxJ9poF50eec6pIEsPdGJ4OuwmDFHWNWUnE\/2ygHAUaztOYqDE6NgHbdlMMHmBepcTc3i6iUgH\/mjMxV7xGmNsfGqEHpcc7fyrG4Jw7L3OUr7n1gS8R2W02tZOLvvW3k4MbNujLPRrO58AX9wH7buCar4raA+r16koSn+K7MzSG5QaGULYrSDqKycZbtTY\/6+rAvrXIlih0qRJN1hEF09dFVK+jXR0t+UcQsCqYcdUnveHuRcX6gRuvvPqERL9THfQ3cP0Vir7X484EqYhVmSgLTwaeQzgahHgE8a2+axPm2YZZ4GSmar7JDCR0RZUoSUmdp2gNlVOWIgvnIKqkJoAoJIwC0f4uTLkoAWAN9Unvdo6LPjlg5bYrAr5z2yVr9g+T11DX8\/ZSk94lYHYq6sRg1OfOLRCIFJq41jS0s4oJK22NT7cIkqTUv30bhX\/7PnbVCmxnBTevb7qAExlTVWOrDZd1OM+94+VF3wV2tt3mK7wGvJ71ZgtbZAV9HQHp4sw5zKRIc1JVasL44laVz8QgRQg6oLE3b0Ga5RqlR5E\/iQFrIYqoAU8mKc2d+5irSvGpndiHnkB\/+o24nk51lRKmWiZQxVi7OPP6K02RM7LEf7lb9DuDg4NPMfjKqs58ii9+BfjKJ\/z1lzvvTne7lK4AM38h3BfkPJg27ETDLkiHcgDeLHr+ZkZUJgJFa5BGE9\/Xjf7s2\/G9XdhmM2dqEcHnfvBgl+GeoFy568Zzl42eUPg58Al8IJiaYBeFJpibdWe4ohKYUFJgCMG4yRx34VNmA+Xns9LkNhNsQ4nHJulRTyyGYrGAzu8n66zizz4N5vUTZA7vPQ2XucQz7JTbC8JXd4jcExIcuL2xrz4FfvxT+WDwQW6sfYj33F4mXisw5pUuHHQ1hbFiXmZKpkBY02l6nTXjouRUlGMGusslCnEElRJs3YmeeSpqLaKKekV95k1e7TvHBObUdTfpno1Xy6tGr\/dVC8K6iZv8f+P9cz36GzHRwgZNNZ0i9MFTHp6WvM9PfROSQy0NWHn5PQHNUZIGECMciEKvAgsyR\/mRp+AbRdybL0fm9UOxgGYZkjm1QiFWvTxU6UsF+77bH\/67sV1bJjZefXV6ApBoAuuFY+o7rwcGWb9+\/TO+vuGYnw9O0VLOiNw\/xvXViGAgIQsMek1M+Ia6aaYN8Zaq8XtCuE8l30xEcknKrH6yz1NyrF7UBOhtOeFxYyiWCsjpy5Gde9GeDrJKCdtMIM1xsx41qM7zI8MXXPetO7cacZNP3vro6KbBbS9pc\/PatbeYqzcN6FKG7jL0\/IKICZuaZjqO7QhFoggarTVHUEJxMxjH5CTj5vWHsg4eCETIRBhBcQqFrg6kq4oUC8QrF1Mcr+Ebu2mKIY0LagpxVsBoGDBHrF58OtJfoDFSbXY+PHHjjVvu+eAHsw9C+iGu6y\/BWxV9vSLdgUdVlAMW9iLTmiZHseW\/6FP6j9g8dGbLuU4f7eVZeqOnGBI8UPfKHu+pZjV0517UK37xfLKLz6bQSMAaFDGJ+rIqSwpZdmbU\/NpdeSZ7ncBGPd6hV4ur\/pVOODS7iTimouBBBn3OyONvAVnjAxXpRQrd8IMMHp96A64GzUOzKvX4ok+orb7WWIQO74miiK5Fc+m\/6iLsWaeRRRFZdxVjLYExGGtp1GtjKdxpRHfj5Y6CyFduvHzNzpdbOlpVRUT0Bn5xscEuUVgO8r+iOOxLihnjcYbrCHkYYbc6As1yqr9sPC9BnCQcgEdxOC9TE7AlRWdm1CYD8ufZYS3V89fQ3duF6e8mWTgXt3AuZl4\/MZKLRxnZ24QdGPN4OY6\/9tYzF\/\/L1SIn5ITxO6XfmTtae+IMyN4D+pPG0NPoyXQ8ymSPsTwNTKA5ylcbLSd84qeZPtPFyJGjQAmhLEIogjdCGMfYQkylGFMxAnP6ML1dmFOWYrq7yOLQN+cPZHRWHZBl6CFnzT17rPl+XIgefP3qxfcPGjmkqvLfuf7fK+ZcRS8EzjGhmL19TfYWhVEbcgAhU4\/4JAcEutqR0sjzWwNHPKpvtTBJ6+MZ4yytUosYgxgz7XIVxeFR1KMoKiqoMTkkjA6RaXrUjsAiQQC9XbjXnIl0lDGrVyKrV+CaqdaNJKlycDgwd0yG4T+tXrHsm3\/eIftfPe7xVeyAZ7ZFfJJfPMUQ\/ZFBrkpMJqZLjHbBFgObyQEuZHXIRo8Qcrw8LVPVnSDeg3gBL0K38yzOMqpRSDmO0Z+4An7mTWCNTtcO82yG9+huVflnwd\/pbba9M8gO9nztaxPHCb0ogJ4+\/\/W9mQ27RNJjLsXOBpz6htdwyusvZ\/TUxYxefiajQOHbDxE3GxQ6CzSAJNTESFg3teLkF69a1njmrPyE\/odeQ+PTCJcqXk1ZjAx4HhDYQuvwrw6ah08K\/7MAKkrB2c4SUa9HcepQA2rzmuBUDbgHZQBPSZU4c7BsIXrhGWhfDzK\/H3o6pwOYpvNpLfH73Zh\/LNw5eYfsntxey2SaR6lAKxI9LoceL2oCH9YnSx0H955WqDXPLkzUVprUD1C0wWilyX4bMlwtMd7iNpYsgaSBNsZVm01Hmp1wTnLrs2j6eTsHXkklV58KnSN0GUGaUghDiisXI\/MHKAaWUrmICQPEK\/6U5TB3DuBchneKZqnqZOr8dqk3vju5dcc3d91879PywDa9PO19Z9WF74w0vNyowYUZh7pT3VWwstd6JlUIVLCatroy0mNG58+GE5iyyBqMtiQfCxEaBKCa6xW3pD4V8KpeM9fQZjLuk2RSnUe91xDpKPqwPyDABIKxQqqOETK8QOQ9gXeUM8fSBQPEpy7DLZ6Hv+AM6OshqNWh0cTlvHINnDvgG81b63sO\/PPQvQ9vHr7\/6YaODIsUjR7\/A3goiUwM7djxveFZq3P5anPAgwzqDVz3ayHB7wSYoCEJtgeGuuG7wCgQIhhXh3R41takftQaFDHGq9uZ2cbZIrbel0yY0IYKsItF7FoI7NrJul0\/yH\/jI7\/HTiDu6FHYxllDPQowvLg7KHUUgsmzF2s5WJTFByZdT3G3u2XGiw0cPKgb163zPIsK0bOmKVkbbGJTtnzBG\/8\/K+FHnaaZaN6RctSkUqVQjFkSR8ztqGDOOR2\/5hT8pedgRJBaE\/UehYYXDovwlKr+s0mzr\/zF68\/f\/sO8xOuK+TgAC2EdsBH4PgunvsqJxoYsZBGwk9WHl3b3NgqftsjZGd5IyFI7x4RPFJUnPRiEBkozHUOy8Tw8DkIoFfLoJssgc+D8DFHL1v9AxFjBBnRKzt8LMN66zHFVbRKMgsflfckCxAG6ZC7MmQOlEqYYI1EAqYOxcXRkTJlMvCbO5wXDE+iA1UXTeQafC4FmgBNBG3W02UCGhhDnMK41vjOxUCK5MlVgj9RnFVX1XhHNTybqdeo5oGFAYDOcU1BjsCoiU91ulqMe2wuizOwGFrSQ20EYEK5cTHzeGrRSwvV1o3P7MZ0VAmNIVd0QbBtx\/qFQ9L7eJNmUPPbYA\/f83Vebdu8BvfDwQHWgUVgSQGj6guhAp79wbtP+ZD3Ri1MkcIHD2QY7XIPdPsNlWU6FG7RgeMbk3QRTxQVjwORj5LLUqXMZnuOeJlbBBRIGmSYbtu7+9qem9pq2A54FbSkC+gmuu8hiPulE30pVQ9Odo6Ef8bAVoakJko616PFeng5Y1W17ave3l53wtO9zSAIe0wHPf+MfRmHpQ5lP8lTYMfWgPM4rvepZmaTEhRhz7mqCn3o95rw12DBAWyk0vJJMTJA1m3c4azamyvZQddxqujVae+62G0VSZjWQQvhN\/v27m\/CLzvorKFH1sepIh8qjVtiPMuEaLeRwkqfLXTYjbyrPCZlPUT0DWNr68qPk5Zfo+O6CmrsxRPOckuA1Pxz4mQeEqVqJaV2cFJEBnTlAIkexzqnk4Cc1gqpOp6vVK5K1FIm8R3O1H6Q1D43NU7JiWkKGRp6BsnZT6d2p\/AuiOXRdVH94JTxHSURaWQxDfrAqiVB2jr5CTLj2NXD26WhvF9miuYSFGC3EeFWfGhlOguAHjULxW7XF\/bf9VMij\/zEwE7ijZ8Lv80uva+LXOHRugn9LEMrZh8tNuzfypJWYIWvYhydFUXX4+hA6OcL0iUJaQr+tFLiIxQQWEwQYG+TP\/rg+TyU0Ec1s4je37v7Of321OOCAl0FbSt4buvieJjv+yah5g45p6MbQqA9Z2g17VambmCCemxNzpIdnlfbm8+2+UaS6bP7rr7diEkXlhRB8nAoUsPTiyIpFTf\/gv0BvB66RUHDgbCvVZUNXs7q9rMG2YPPkQXkBzm0TA5rfrL\/NZc1eJUu9HnuXMS2A92GE0biAc57yt77LqgMHKb\/jKowRap1VKETEyxZh49iIEfHoqRa\/VJE9TWsmu\/7dp6OPdX5gtdRcSZx3Ms9LowB3kPMmWoB0HNzYSXt4JRdU7xwf\/khVCysTTdAMpIzsUtie5ZuswbSYoxq507D2BaC75Idc3EuAdph+jem\/ayWPEGe++lGJQT1pSUJ5jq8HU5f3SCFGAktsLaZcxPd0ocUYH0cEInjUJ84nWZqOu\/H6vmx0dI9O1kZc6lOaSc7mgYoXzWJvO+amhSWhZ6n1pgeAUGWi4KiZgIbKkdq0urwr41nas6ZU0iLy4DO0Bp3Xz5AIfvMT+G27MfMGkNOXgTEkRlyiNNPM1RsTtYLfd3Bpbe9e\/f2h8TOXLn1rZicTpnJRkQ+iLzf3nDKQRG\/p1srZiU1JOzOaseeAwk6f4VMl9DUCn1D0SmmgG3PpanyxgFc9SqXLe5\/5NBv19cbBZHRiX3NodF86WUvxrfPacZl86jOvoXjumrnXtCPgWVADvoFrLwkJ\/iEimFOnCUXQTvheEbYFEKlg1OW1F9+YNUQML8aMCV7UQ+wDekQopxnVBXOIr\/tpdNlC3MK5aGAxzmG84pKEiVptm6rcFljuUuSeUOxWlxaGvnjl0uZLCtx6EVWdT\/KzczyFTxcp\/JyKTuv7bRO4S\/O+RjTNQXg+OUnRmJKS4fBepsIeBes5Oj8vvODEsZDXNReTa7dCiyS9FUG18TBHp3Mz8imyuNXrGhhDeM4qggvPROf14+f0QiHGdndgg4CG880RwyNpGN0Wlwvf71rSt+lzod1FdrTj\/C0++M4UvdGjA4IgBWWs23NLIeOwBSVANENcLQdg4Vs0nc8OvfDPeH7TzlvkSHmimU4HE9PRurWIDTDThyP5oZ08JSPLW0NA1YiKMSoELZSgAKkIAwiLVOnpqBB0VPCrV+AvPx9\/\/mpCnU6N+MzIZD2w36kM9P3J55f3fzOdrLcn3ashBT1l\/4XrLwC+qdDly0rYh2QxfM\/DToRQMzQdebmmoGcuQ\/diNh\/X2toDIFboKxfpmDdAsa+b+NzTMatWIIUYXyojRowY8YimXtnvkHtF9Dbrsu9GY37zje84v\/4jKC5N3obA89RznvnJOrhp3bF\/cGP+z+p165QNGxj8jd\/wqPIR1hVjKl80mHd5nJoOMVGf8ogR7kGOEEOkh\/KWJDkZC+nYQsR6HAk99Pg0t7wiN7GgdSCZqpNXvCfMHNZ7yksXEF\/xGrSvi6xcQk9bBuWia6S+lhn2NeBpVb+nC+6rTja\/9oV3\/H6LfeyArG1FYx+ldE5I8DYnvsOgF5u5sqpR0eoONVHT5IC7A+kkWTJEhuYsYdNpaHlxG7DIkQOlzGw2Us1z68+VghCRY5z2dIYwQxW4CLDWkjaasGAA+dj7obcL4nAqze+ttabusif3Jdl\/efqRR77R+X9vrd9zz7A\/3s9xHbAxb23ybQc8S+7vI6wrFCi9GczFCr8qSBFUh7qQgwOwzcMQEEiO0KSx76QgYmcTy5YHbOboFWEgsMx1DlavxK9ZiT\/rdDhlSU4OYXLQReaVVP1TCL8zp+b\/+vfefM7kyc9+rA3qLLvKIm8SzGVO3CkmMr2jlUT2Fxx7CxETYqhplrduqMvFGFzjVfGM23b0uJSArlbrXlAqECyaT+W8VcSnLydxjiyOkDgmLMRIZ0XHw+jAiPptGA56lV3jIrdmPr71vEdH9934wQvSH52Zuf71oB+zgV6mRcqUVSZKhkdNDgus+xTx9Xw++nRWPTWd4YCXes9AmmHGJnDX\/BT+F9+JWEPg8\/vNjMEjqM\/uLIj5zflp+ZuDMzsW2sYrsgacQyeEAh0divuoETnfq4qW1AXz0J2Bmidcnu4LVdHmfsQ30JdXYH\/cxd+nGZjCgEmUVJUJa4n3HKDYWcFddBZZHJIZg3FOjXMYlEClJxUu2V8OkmtufeDRuJE+Mi8Yn+SWK\/2GDa2C9InrKxbY5B2LHjCEn+yl45IJqdGIU7q6Q\/YHIU9n+VMuoMhU5kNe2bFh2\/E++7hMAGOqOBFsklI+cIhlt9zJnNvuxXR1YE9fDj+xFu3tRmp1qaj2ldFuVBBhr1G\/N7Jjt\/Tt+ReHqsyY6wLoet7Xk+BfB6z06E8R6Fm2aIv7SjU\/FjjZH4QcFKj5FKt+xiycfcHcEmA+YLxCqYg5ZQna3YEA9pGtyFmngstwiB\/ybvdB5a5A9dZ5RrfPPzjZFmN4Naagb+DaMy3m10MbvltKghQdk9WMRw08AtRcE+uaBK6WawO\/Sh3xM1NNEWCMwaJ0dXYwcP5qeooF0uWLcKtWYIsxGoRY9ZoZk6hQF2GPeu4x+K9kDf71r05CRDyFfv8Qb4m7WHhdir8Ko2ulV+ZEZdghym4L+zDU3GReftCpSmDbVb2qNzNVcJ6i9yxRpd8YbFcHctWF+LetRTsreR1VZDodm6o+6tDPmcx\/oz\/ueerTly6uHztNus4uo\/IzxsoVBP4iG9kL6FEOB7ALZRjHQXVk2RgyC7Mx2op8e0XozRydnRV4zzvgqovwnRWk3kSaOZZCVTUVnk5UvoVm\/9JRdjffeMEFtfZMe3U5YFnPeoFbDKzqadD4SYssyyIutlV5XdahelCRocBQx7M9q5G58VYNRl8WMoUnApyCKh7ozhxLvKdfFbNgDv4XfhJ\/1UVIGCCNJmQOEwQ4VbxzD0pd\/zQ7mHxPgvhAbWHHaDz+iIE59Fd7\/K5di5KXiBdWAP0Y118QIpc6MgeyLhB7aa2QBbvKqVCMGIuEraIogqrLuaDdxMsNAd+2lyIlLUIHUGk5nMpAL8HS+WSvu4RsyTyks0ooOZ1pE5qT8LjC3UX1X+3oku\/8yVlnDXMMUCjkso0f5f3LYvTPPH6tgg2riPbCvaHwFIJTzVPP2eisE4rx5BSpy4DTVJHMQWcF\/Xdvwf\/EFVid2UllSJ1LVfj9rsz99meuOnfk1UKSQbsNKfchgzk\/qIdNB4DPfdxc+8FCEv1ccjhzdhi7pAO6uj3fDUCDMhKUczR0NvGyUEl6qTejKfSkBUaikDERYlU6D4+w8n\/\/NYW7HiZZvYLsjJXYBXM0HB5tOW45K1H5HTsQ7fZG73fp6D9sK817MkmyrJkOjS28mH1A\/aWK3oFxkNgS\/E4oAUlngukWojDgIRUOqVD0zRb6PW3h17QNUWo7YEJVeiAvr1TKmPn96Pw5yP5DUCliOqvTQKdEtXYY2Rup363CruBwtX5sOdG9Vctk6aP8ggvIfgljlqvVeoJWXQH2BbBXBdtKhaNZPienUM2zKOKaQ966aI3BiUd6u5ELz8Iak\/d+5\/esiEgq3OeEv\/\/MVeeOPCM937ZXgQM+CpgDkHi2ePwyEZx6tFFG4ggkg6YokRjUtyIise2nPOO4GrQAlA2gBoxlGcu\/833mf20TZulC0mveKVxyLuI9UmtoWCmUJQhOzdLklApyaqiy8WAY\/Ot9E4U9Gxcvbr4UC7IlSym\/y188BvzuDVz3fjRb6UeUMBGzakHAkCojKGJiNAqhsf\/ZnK9qnmV8jtdTw8tBULptz8vBJOTtSAsAbyw6NIpfPB\/e8w7M+CSFcjEn4lBVsYHYLN18yOuGh2u1zbz1ovFnm8+f4sbR9awf\/58M+k9w7aUx0bJa1vBRYIgr+Xo6gFKcag1yE+Cas25q+RZoLQaaIphmklPbLl8Aw+NgzTOdxN3lQvJAe3bxkqhTvWxskE3ZGgb0t\/jCrQnZbxQ0soo6DkLo4CLJTxSqHoIy2NKrPgX9bI7YtNo26iI8WC5yV28XQweHCH\/7zzC\/\/Wfo3oP4ef3iRdQ3GmpEJLb2nDJ6w1Jkw9pS7U2\/cvPDlenNSlVeijrw7\/ILZYFoqr9WFZoo6TOo6Z8t6hUxYk0YPNclErSd7yuwrpYCmYCvN3O+6HIB4gh1M7gURSgII2+3nY\/ytovHXsDcnMi8U1HRKQHdKdENOWo+zk5Mgn\/mcdUdg+2sdfsB4oYLBXmVw2raETDA1Wz061hniyz5zTo7fjIiOqeZJD49LKZ\/AM7M4B6BIuCjbmg020\/5OTmAwXrPsIe7woAFUcjK2+6heM9mkndcib77bUJ3BzI2ifpMbRB0qMi7vOPChviN7\/v+g5\/\/84vPfAgRPd7RsICuxzpeHAuUihhR75\/wuO9KzkGgx6CtzkTkNBFzuapv569fhn3zekw2piNZDZ2ilExz3m2ZivBUwXhQ7IFyrfiBP717gnvu4bGbb57+e5uuvNI9y5w28gzWlzb8r22veAc8NccHGUxu4Nr3OvydFhP5Ya\/NssgZJdjvYI8okYlysfZkqJ1h\/BEDGrSk0HaocqhS5hTvWfC3X8V\/\/36y634a1l4ISSI0EsUarA0WOJd92CMXX\/+9h\/4suPnuf75R5NA0tTont06k4IzYQNGbt+751gef62dXzH\/Tu8WYy1Wdb9cseJkxx4V25plJWizNRj2R+iN8xlEEXR2gkFlz5OtBBGOjzUBPP3jjByVtj2jbTpYDlpdLi+NGNrqbWGev5gsPfZzrfqVE9BcNkkz3EehiuNTC1xVq6gnCDtQ3IZtsO+Hn8QAiIPGeB4EDXR2cvv8wxf\/xx6Tfuxfe\/+\/Quf0iYxOopmqMETH2Ypdlp6c2vOz67z34J39+2Zn3yEsQDb\/o92V+dGr8hfBut232aLSoauZ99t9BDyneCKKiYrzgmsrbHjbBT3nvvBQLhrsfht\/8P\/gkZZEIHSI459BKGda9+Twnmz\/3\/lsfbEy1v4lYnPoGxn3hLy47574prer20LftpXLA+jJLRbv1rA0G+fznP8G1q0oUP1bL6qnbJ2F5AbwW+BY5l7qJelGf5eTobSf8XGo4TmdQ++3NHMNRyOo4Yt53bid76HH8L70bfcOlaK2ONBOjmRNjTZdXrtfUn3n9d+79w5\/81Of+6Z9FxgG7lrVyJdNySrBhw7PewJYjMol6PATOVD3idcXyBW\/4aVECL+aodLZRb1sqdpe1hNDbjvhlln7OJsp\/sn30n0ae+Z1l819f3SHmp5x3XqLQ8OR2ZPMTZCL0k7NmuSwT7e7Avvuti8OOzvfi\/DRiWaylNjKMenMbcF97rNv2kjlgBfnVlW+JTsYNjKV1qW0fSDey0b0IUFbLCf\/\/7P15nF1HeeePv5+qc87db+\/dam2WZNmyJe82eAG8sARCQkggAhIWgyHO\/LIwk4UAyXxH7vkmk8z8JpOZrBMnhGGSIYk9k0wSCCYYsNkNGBu8b7IWa2u1er\/bOVX1fP84t6WWvMlYktum66Wr5ar79jl1qurZPs\/n8z9+7cO8d2WZ4jubzbbrjEs0sgJe4eFLaA6KKAx2kbJ++ZzlKbmMxZo4OnZxBOB7wEzfIGc2Ugr\/4WNw92PwM1sJ\/X2od4gxmn9A9LIQ\/O+ue\/ubN\/\/Rr73\/T34hMbtvz27ndg7LKcE115yq+7GqHjHm1Qb7ap6KGFcWBM5D3ke87J29+A6wWmvwqpmr5vds3GN7enpCfCCO1jyxJr2T6Uq8sNtVoZAgxcIRHm2RXOygVsU7F\/zsrF9ovxFUMVZQnbFGl0Eky+PkGuCfWXPNZmmHOzRHoZwy6yTgKqacRCtnfoG9fDw3pk+tAbnQBH+0Ab5B7+dtehVXRdtpXLsReipS+tH5mVZoWzHrhyD18HWUyERIceiZ2lWOi8\/iObbfvigCXxErQf3u4Dvb9BgRVNsFat3j2xgTc1E1Ye4vP2lc2aQ7Tlv9vvZjT1ytzYaKMaKqaqwd9pn71S\/tG3\/12sFX313LnL+4kJTiLENXj6rc8PPoYH8Ohlkk7hqEVPHfDXHhM+suO2vX2AlK96mqKlk4DiW+ZeP7IpPvFJGEoP+8e1WS0VovU60cfLB\/1ZSvwfB5waHGWOYa8KNXwzveiM41KBqT96WpqikUJBSSL4VIfl2MTAcRMYpGmUowsQ+58BTL6eflcdIMcCzZXu+jn9eF2t2p2kWiwYAI\/hsAN3C7H3saJqwxxsKTJe3GuHlRj6eBN\/2GfuBvSsRvyyZ9cILZ0g9W4Q4FTBEKI9A5+BwjYRGR56Zzpy+y9idBVA0tIcix7QoAfQgP4fiWh\/PWb7Av\/+t\/znyz7XXjOsLl5ylzDUREXOZUROL62lWXVtesvHR+74EHJh5\/4nurwPvd+41+4Q7lp38EMoeaI8epQBHsGZHLHt13595xThzBhywDq166hliMOUOOAWEFBEugqoqKCCFATxVOXwtTs+hiEFacoM3mLHW592Nnnzu3PKXL45Qb4D\/Z9ZUp4BNLwq19iqi3w84P\/QYfeLvDTVOXKF6hsseJfh6IRDAhQzsHTFDvPik7osG0qF0SHLQFkeQ9rymKYLp1nuMyo0EkMhrcl0LgN4JiRUJ4eqNrjBG8WC4QsX+g6vUFEah9rm6QBgRZayX+62f6ykr3NelgT18\/5\/cF2u0W5vS1Vn\/qR2C+uaBMqgghIE4ie8ifsfrPbiyZz+MU\/usX4b\/+ykuKp\/y5ZVJOmWcmPwgp9Ry5\/lTpKhG\/GIqfeWi0oNUGYxayI2gcUOfi5kMztYuv\/9N2a7RPSvumDn9b9aFP6u23HxGH\/xT7DGyVgMpTMY\/LQj5FTP5zzNEcL6qqaAhLQeryqGtXhRDylyx6TwLqvez+7MMWtlq4QWCrPleZwaPGTVtzWdKbn\/y1m+9Dx8Yk\/KCBsOQqrnpBooSru5HvU5nEMcZ0G9tESf67J7ugl9o7WrMdNFbWDQpXB\/i6go9iIjOK6RwE9ewvtI\/shtDtNlhYwapHRKyPq5dUCCIHtu\/93FeO9542rXlt2+eJhBdNX6mi6kLqj5dp6OsezjWYNUFN+7dvRHbsgZ99O8w3yYvuYgFr4viV7qvf+5\/Xffbbv9O59\/5PPDH5aHPTyjfJ6JlzT3re9199td4E4aWa7hMxImLtqTFMC3Xtl3wQbJ5unSYc4UGnkEBfPf9Pe8QA2zjBi3Y+dvUFB+XHX\/msbUh3djNuFd6fxhgEQwh5\/UKBVASTZYR2G9LG4e6LhcSdiSKJS2X7XPzyjAy\/WFUpgNFjekjluVW9THd+cjCiQqkIPbUuo8iRPmmxEVJKWt947YWt79fkP8nOvu3m5dD3xSTGsLCPPsJ7P2yJ\/kMgGF\/TdmmFyn7gSwFmjaXoUzQ9KOIzc3hfyuIlujgVqcfhRao3Jrbeu38wZfv2RiOylYp72lNt4f9N6l4ZQnSrqgsvxShEFmmKniOwRgzp9CzyjjfCv3pHHmkcPhQIYqzxwe2TwNjqAfPxsXPOSY+D0L0rA3dtsYN5wGLXOVygJKawOne8HiSn01M0r+0vUR1oRb2V2IaQ\/R+FPzEq1ks4KV6+VWOCqBf0R8Uk\/yZo5uUHLAW\/0Nfek3vQOdhqxSCsWpH\/XeQo2fp0vjnR2HPgfu10ZYCeZV0qGvrT5KKiRgOOoEVBthShYQ0zjRbmFRfBT7wO5mcPx+CqqiaKpTM7d9eez375d6buf3SSKMqv51me5eVTA2OVUHhFShbEiIlH4AkD9x52MgSymVx7+DgMu3b3TXXx\/KxbDQO9Tzk\/nenZ3c29Bx5RtwATP35L7Mh5py8EnBWYmYdfeh+8+RqYaYKVw6UDopiQZZ\/ZO1\/8o1veeGbnB4F3OnqxKOttZav5Hf7Hf\/wI1z1gMX9WmouHnQusXSG8JYGvqbI7TrBxGe1M5jysR6lyBlqkXhAjiiw4lMliS\/B0tlK1\/eijtxw3GnLjaa+Z\/EHoGbbAvQqxBlb01Un\/5p8RY3IjPDu\/sJGNBh+sjUY9\/teemJLJm1T\/7m1C+EFCo3fPtFYQMyFKFGH8yaEYFBtEnCXMyQ+wZo12MzX56SHQSWF6Nk+xLqaJFMG1Ogkh9Cs4UZXcGjztBwsiITUhUfX4PElG0NzWJsFjYoP2VMD4RdA+UWOtYE1aGOydiGIzqYgIRp\/+WeYGuOhtp6QWQ9CFMyte\/GxFnixjcpyKSJqD2aDZBrswP0f3W7tGu6jKgOYllOfsqB\/JaBtkAWKk3d+OqC7n7D2i9TM2nsEtyxEwS1KMYYzb3Ud43wYr9ue8+sQnSmF13mNyC8pBBIuBzgHwbUzOkRj6s8LmlVn1talmuCR4WxXrAuxQyAQSlOCa3aUpi2rA1mjw3wX5MxWNRMwz1ICDERWH0TMF+8GXOrWhLJqtlwG9xpDNzCE\/99PwjjfmB96RjGsQY0zw4V4j+kt\/9qrzbn0WD\/clEwEvjibkFIGtFV1aQMCni8yOqATpiTi3pBt19QKXAWpNLjBw7ZvhF98NU7MQHU5Bq40TUcI\/vOf8DT91hchxA\/\/+Hdd9OiZ5Y4fUq8FG6+BeA18ToeAcmjpIDz45BW0ttlA8+gaeJWrN1BE4fJYomqeg7VF29\/hS0NLlyF7djUpTY5DZedj28\/DDV+aO8xExBhVjxRST3\/2T89d9SLMfhJLGcgTMM4kxbGWr\/R0+vh3lV6Hrxm1\/9u\/dhfBWrv+FlPDblqjazlIvgyobrZhvehgXoWDbSDqZM2fluAejGhBjzheJ\/vC4jwVVgrqXPLHDApe0B74LXKpKXK8SbrwJWTEIV17S3dA2j4S9V2PtOcH5j1z31bv3\/4XIvd9PminvGZIXIWBIVXOuk1OpRMkLSfaf\/yPkPMxPFR0Zg02S57RXPIGQJ16PYIW6GZljgFgcplcJ2hUc8IufB2oCQb18q6tNcvz3pyZ0aS8Pc6p31cbiyKJxDFERjqlCKRDUhbD4djP\/pNTvwjDWmjhOcurp3AQf1nrQ7yOMkkWvw1k\/Y3MKHhfylx6eHxFraB+cql95463F2993TQpbBW7W5x48Lfw+Btu2ATd0X8ec8TfcoD9IcocvSgPRRUcbuI3DDEss\/Ovq\/G9d9ofbu\/99O7cHIPwi79xcpvC7BeI3ZInDDHsXyth7g8h9CA4lyWbAzeURxBERHn\/8k6o\/UK0vC171EHCxEXzmc9DLf\/kIrB7JBTGMWRzzqKr+RQX3639w5UUHn8YIPykCznAhKVnzxGiTL3cOHV0y0LBMhb9EnLIYuAiIjEEbTXj5efCv3wPN1mIEstoolqzTvmfy7oc+uP2mT+3StheR7GkfYskRTUcm++H9I9vqoXhtm9QDNl4J+5I8KxJ165qSzlBwc\/kaUYVyCWrlY1LQXdXA1DXdfGs8OBeOL62qWgx2NMKUtbvmJMr3QOfwp8sifeqjo\/Me4HwgWJM7qD\/5BnjbG2C2sRgApSaKJWs2b9n9uS9\/+MDnvjKvGj\/j\/Bzv6ABrgXOBNkWYmYGP\/P\/gNZdA5+hKW5EC3unsjVdvOrSsA7wsxrCAjg6LWlQ5QrX0pH8c9U6ewv5f9wM\/\/OvmuvdKKmPRE8W1aW+HC\/vxa2K1d3l4Iu7D2hJxNk3IgQ0iSPQS92ue96E7DjwelNOTiHRuHvm9\/wH\/8VfzQ\/dwAk0xxhgPW5sa3XP9t7\/9Jzfm59JxpryVmljqUZVpBLuQk\/ONrhFeZjlbCmWJA4BVRaMIDk3DF++ANDsS5XXpHrNms3\/iOw\/8mG+5qdw4Pn2Kvoka44J\/pDy3qS9kpDgR8j7\/Wbe4siskmrFCJP95aQZrRuCiLXktuHsNCmqMlc7M3BMH77z3H7PJ6RaYbkX36e7PSICwql18Zzkkp3u8YkRsD0wI7FlwAgB886iyiC5yVvd1I3CiCHbuhS98A1qLHNXu\/HSmZtZMfPvet\/lgOgT\/vPlizOEsQvcajcOI5mLqkYVGOJyiF0RT4yVE+u2t3PwvNz+HIGR5vIQN8PNJYS\/0Fo+Fsf\/xy\/zUp6D4UZk2P898VOgd6IRX12EHwXzPFJgqjJC4eYybybmkl5kKn9UIPwYM+kCtVsF99yHkrz8NH\/hJmO4KfYuIhqA2inq889f7ZuFORL56vKlohzJoEkaSIgdRFsgkabVYPh9YMlqzjy4YmCSGXXvhjz95NLq2yxBpIrsqqVR\/KTJ2MV7gaUcCbK+1yJjjsEZ0AOvz9ddND1MQw1lILkXY7sB5Z8EvvCuvAXejzKBKlCQE4b4\/OmvVh0WOv\/\/0vbz\/opjk9A5pUMEWB+B7BnYdPlQFOhm49Kj7NkCbHL9AUCgW4K774et3HZuCFhRskmyJy+UtkcRH59ifh4Nku\/NYBKyxiCRQqUFvH0hydBtSFNGanPj43GeqX8g32AuvdLZsgF\/URjhn1MrVlP56AviVX+fav8yc3mAPxG+WWdgw4PzKcpCHVMwDUY22LZG4WcTNL05LL4+nSUU\/BFziPFKvwP\/+LFx2Ppy57ggJgoiod2rEbA5B3\/\/+r+164GMik8djhKVrhJ065CjR8+WxlEayuOAQx9BfeOrnpGgILmg4\/kM9AhMTmcPp364Aph4jStg5XOfsGuHJaZieP6oP2McxLssK77r\/sZGrrrrq4PymTVK98aGnvZZhhs0442EeVyhgyAioyW3p0cnhp4egCzl48PD8FAt5ivwp50c1BOdVT2yGIiUveGd4RFNozML01DFpcFSsFVWdra1du7zJlg0wJ1RNSUFuZqt5G5+4G\/jxj\/DeN9qW+X\/sE8llpXrggn7H+oLnvmDZHveT2gqJmwHXWmB0X15BTxEFT3RTbCuNIW21MR\/\/O\/jtXzraw9cFcKj+qLqZfwH+5qnns2Bys\/4kdqDlCX8RtKod0dnyz0gVKs+ZwUmfgRFKn4xAE8kjbGuOIZqwGA2arB91t99+u+NLt\/Ns+JObuTlcxnpvFq1C8xxPg+c2P0RygkE\/i\/98MqprEU88iMriiOPkRL8KcgPbBMY4WcihMcZ0qXnrET\/ojO7c7A+npRn7Z+AzH+X9P2Vm+aCfl5dVetDLe5WNUTAPmkT2JMME20LcDITOIizm8licZtsODIdAXC0T7rwP\/eK34HWX5x52ZPMoWFVtEg+FzL3rZ\/\/6rm\/8qVywc6tiuflmuPlmbrrppiBGmh\/mff7wttEjAhE\/qDX35cGzpsCzY2kWyYHEh1+ha6RFQDClmdRu26Zm35vutDdefLF7pkyMovIR3luRJ6GzFwNTlvawXWf5CJG+5H1NxjxlGXxu1y7Ztm2b2bfyTfbG6595fr7\/s3hMT2bucxkFzYuiz9gDfIj3\/UgE\/z4ivlAjRYY907Xg7\/PIdjGiioibJ3LTXf5UWU6EHnMIbgQGjWBaHewZ65D\/\/4cIqtgjYBzFeQlZaKgmn88K5l5NwvaWMTsVne\/bPzs3\/G8+eXG0r\/37NtgeZ1yQmpiZEbgz5ECfGFB1ucCGuuUlvTwoAcPAOsAbQeeaxO94I1z3VpicwUcWCgk2N0Btj\/7NlHBjs+1mVmmYN9Hc+Ceuuaa9OJf8p1wf74RBxYeUzryV+LdiY\/91S9LgRaSw2sgBC18nkCEYTLcPuLnkSlaOnAVrI1AWIWk0iX7lOuR1V+APzaBJBIUkp+8VwYVwVybyybnA14qwuxgmDi6anxNCrPf+Va\/7v7HYTZm6cKKVyQRcLFGUBv+5j+393Ae3stV+P\/K3yxEwJx+kBfArvKuSYO8D9+bUZG+zRl7v58KWkiusvKQSON0GHlXHjImZjHoIvoEEh1lQgHiBMn1Lydmy5ICsJ4KyohBT3zeO2fYH1M\/egN28Ee2pEVTF9dZJapWKieyPWefelMJ2DfotG\/S7fk3fP8p8615R8w+B8HYxJsEoJQ+rDDQQWigmeNRE4L0uW+DlEXUds0lVepOE5MdfQ7h4C+HABKFUJFJFVFEEr9rK0MGChMvaVr882WjtuyTCHaMKJz9rJEPZ9yHee0ZE9CZUJ4L39xSiaIurePZppi2JGVFhXANeM9QUQTqQq7zKUqicGKDenaNxYL0RkiQh\/NlNZNt3E950DXESYVTxoM0QshRGI9VzUx++\/ni\/TG56+GB2oq9LlAcUGigqJ1zARoMYjIhuB9jMZl2OgF9E48O891xB3hEhF3YKoT+tsi6rydChGN0bRBxOXGhL0zVJQxs9bIb15AoIPod1qvrClD8MOdqyF+hvtakP9lM8fxOycS1h9Qr8xVtyx0VzBJYX9S141Ij5P8n56\/5nz2v+U7F4x84PGSdvd2TGFjDpiPKoUfK+bUFCBn4OQ0owitcQzIIXrUccAn0RLHs5XgapI2zm+kKnXmTh1zE3oU\/NeHXSh+9GeMNAP9BbLmIuOx89cx3ZpeejvTWSoKCKA20he3zB3hT1DfzvZF3\/XZ8QeVJ09xu85UooblLMJm+S9SaWwUO1tDBRcJeGEjSAFhYlYl49Td\/uimEEwOO1c5QQloYcBm6eh6DC97u+RoEzgYIIrlKC112BXng2VCvI2pV5jdwHAqqzIo9NRtH\/LlbLn+7dtPLh8t698zeuXNla7gleNsAnO7TsggKOIKd\/mesHI9Jfd8a8NkrMueVY8HVleyXlMUVnQtBG8CKhLTakGHWg4QSfjxqMiYwP7msW+eWg8owSiSGItQbnlf9orb0qhFMvELFQbzJG0Cgicg7prUOtCpElCJiuoQmqKkGzqJPOrphvzvUQ9hbWnbainPScnq4dUV01JHaojhjDIVUycJn3h\/zc7INzUxN\/O\/AXX49W7ze\/n5oudV8RGIKvKjRZ6NFUSCdPacr6qJ9invqgDShBVf0Ch6QPOTjnKdpSBcQYY6w1J\/Qe5KmOBXl6p04QMhRPOBzeLTBDxccaF2M4lWIh5e7aE4Bq+Qj6eWgA05UoTQBcaA9Pz070z85Nh1anFWLr3bVvIbryEqJKCQ\/46eZgZ65Tt+PzbbNv+qv2wV23JuPje3f6\/TM7p9o6ThmyJpCnwCNioqxjTKK+E+yaixrFbSuIznEmKBaJE2WvTbk\/BLyGvOdIMwjZKZmf4sLzCQHWrID+3ny9ddLDmoqCEDLXzlrtQybNsmrBzq75uXe956brfvR7h0tIJ2hsZavdzPhJ3Yz3M6xLJfW8nIJ+DqCAbWwz+9hna0TtlOy3e4L8j0bbvacdpJp19MIVLr5oqEy0V0QmI0\/qlf0ImQ+HCfHkxCkTat4iz4FH9n7ujuP9ptNHX7tvQZDxVM+lp4tjDgqdlCCCHpyE\/RP5F2QOdR6jgUgRK5L0WDsYomiQQmG9bTzCzCvOgwtXi2xaj\/bUMarUXdAgopkR1Nj51RvXzA+ff\/Wewr\/+86\/J\/sbl3gWlIiIWzgxwr3TxsaFzDOc3p46WURUa7Sf9bAWqIgzHsdSjKO\/47C1DTw0tJHnKVI5w2HtVZlotZltpI5wgjWFVvDe0VNSJdisqQKRHinJ6DKmhA7dO6R0OUnPd\/7UC86I8sBD4ikCWQat5yuoyAZhecGJU4eBUbmxU0Z17iYA+IBGhbmyxtGblanP5JauLZ6zDrxwmvOIipFzCpCkAh0qzzG2IHwu1wm1m7apPfBq+yrP0DVvgT7n+8km4KIWVjuApqJns9RyILTtthaCK0SyPlrPpUzY\/cwvr0hh4fA\/y6K78OYmgzkOWde2wKWLtqh4xDBRjeubnK1vB3HyC8WZLzTAuR8BLfFzP9fEoo\/4Qe04zkfupWsFs8kFfLhVd5eqmut8GORAcU6rMq8O5+Zwf+nmflRpEIhOCu8MYPqxqDM\/AL6wYY0S9Bn5TTPTKF1oiUYCi5p2a4gPWe3RkANPbg5QKmMgiQQnOBS0VNVTKnX4jnRF8vRSKVoYHobeXpJIwUSvTTqIgqllQmqStTicx95fvvqs99M+P\/XCYFFAV0wuuCN\/QBapAyVmK3Nwp2QLVhchbFSkk6IY1T9p8CsTeZ\/Wp2R3rp2b3ixF47eXCay9XXbUCCf4YII24ppe7d8zrp3dlfiIKzqDx9+dcuUyIYu0Zn66u\/erDZyWT8ytcudAIxqQ+hp1VONDN6ZcWCgu+LVFo+7iZVi95cOpd\/S1\/XkZQEUR6lF0mN8BdQmOYHofpiS5D68n1AbU750URfK2So+6LBSgW8vlfPOcanJ1tHChlbk+9UmoPJEnw61fhhwcI552JrFlpiqmzzLR6df\/sKJ1sfxif+1rpvr1f6zy4e+cDM4+HichBsUibiIjiorjGsbKZrloxpz9U8JxmjYzaMuu1ZuJxUSY178dthg4d18hLKadga2r3ORYW1qUxBAGcz9lReuuwekW3bAVe1afeZ9aYqbN\/8Z1joxec97f\/bX3f9LIVWDbAL6g+8eJ\/bWWr3UDlF0TM+7G63hS1HPWI7CnB\/SDTqqSa5Qe\/b50A7uIXRw34cCNjN93XB5SjCFtIiOsViisGsZvWE40MoisGc1FwY3EDvb5jo0ahM98a2Ht\/KH\/umwPmW81EdnRIcTxUhx3GMCOCRfL0XXYIQwBjyGQR3b3m7np0tDz0KYt+B4ALRHJno1KG3\/hXcPHmXAJOFjEHi3gfRX89feGGX\/17K+Oc4kf2UbYOFSlenSLnBuQtNjFbsp7AeAnmIuEAsA+PunwNa0ixmjNK5fMtR0XJ8VGqHSc\/BS2LSEDWqjIgUK6WkTPXo9f+BGHlMFhzmFDKq6oaczBE9uZypfbn\/\/2sFXeHY2rVAvwaP3ZhhO2DZGCO5KfLBfvmdlGkVbS4gmcyUR7F09QA6nJnKaSggYAn4I92vLtqRgsXLKf4KDbdfTgAVFVJjKFy3ib07NNx61YS1oxiVg6TqJKhoSEy0RBzbyeObuubbXyh5CfuPIEoaJaJOJbHc0YedwVY+KC+sxYT9xh0ADiICXcpsjbLrJltB4wVhgpKS6ChCZH6vPboO4tkR+X7E5x7bnpzL5g6zgIJfdp1BHqcyzVNWxHR8AB2eACJLD5z4D2mUsJmjmJ7zg8+9GBPfdf+YmeqSOik6FDg3ijiewqJdtuQshnws4oFVVFQifXJ3om+APctwAzQVKUaR\/iJKfj4\/0HWrURNl8pB8nkxcRzRbG3u\/ewdowTGt23bZhhjQUrmqHHDDTfkJE833HDCnulvj40dBG7+ENd1LHwgOIEpdLVH5vpgr4AjIkpqaCgg2QxBUwUhwcqzkk1w8tm3CkBZoWEt1Z4q5VoFX0hwX\/424cKzsRvWID4QQFtC6kQ0Vs52M3Pr3vqTP3nPzTd3U6EiEHJ6rv9o5S4Utv7kTXbkH27JNGgoz+tZ5Tk\/zCD9pVhpAuNYOhLTodk1wJ6uKosshj\/rCxj6LJDlDAA1EaIQsGecRnjlxejoIJrESGQhzfAh4BTfQXe6EO6OguwsJjrdXygsB27LETBLSp1pjn39BTKxifQfKOiGetArO8rlrYqcWS5QSm2ozRjPHhOkGTJp+w6pZqIoogHV8JIk9dDuoVgBiqokSUxPvYopFiiIkJxxGu7Vl+WH4uoVmEpJPbg5MYfKzYnxFXffO1y8c+cKuXMKJh2uP6\/l7gLaCKJZDqgK6ZKl5lwPnAFkRohaHfjAVnjPm9GZOchcN5OhqBgyDX8Tmei3RMLe1Z0ts2PXiDuVl7yNrTGUTQf5cIHCDW2TespYMwxTBm5dqJ4HB246z+YsoXW7YOZrxrCumDBUq0IxQTatR9\/1Y+hQfy7OgKLOh9BJIcghH+SP1fj\/3Ymi2YJxbZv2pM2D6+Zufpv4fI9fW2zDOwRZr9CrRrZENc45WNGRAwWnPhKZV8tUSJkPab4uQ5YrImlYkpFXqRsBj\/T3UNm8kWR0CHf6WrLTVmJrFWwcYVU1FZluwPYgenek5gvlyH5t3WVn7Rp7DtzZy+PFGwELXTTy0hpj4Rh+6YmuPvFBUh4CPvNvuW5Tvak\/qcgbCqXklWuKwsaSsrcU2BEb9oaU+dDO01auQxTai8LUl4YxjrsG2HTRv2XnMFFEZdUIZqgft2YEpmfRFUMksSUD70OY85Edz1LTCMXCI2FP2o72unWSoASVohV6u32MOTd3lKu5LLGDTsmBOAe6QLThoPSWS8ihKfj7W\/EbVqNrR4m7gG3JEUuXzqv\/2aLyd7OFr3+D41SKOnGXvLn783ZNBXxGUCvzgtTA1KDgoSWATUAreUllCa3VhStph8D9803M9BzlOK\/MVj\/5KUZHh2CgF18tI711IyNDxJEM4sMvqIneVtAwE4Idj+zcdwaH771p69e+tqPvsxNycOwWU6Zxi8UnhugyL1pMO7q57qBasDJfVw7EMC8RxhhUo26tvMVSI8gJ3T05AowgRJMzmMd2o3GE6euhMDqEhICIIMZICL7URLYfFLk1FnPv6rafGFvmHfqBMcAnmaLsxO79bWwTuM2McbubobOvRPyAwPR8y39sPISzp8ryyuB1sNf5nkFrKqLlUpMGbWPsOAU66nELxb\/gj4hmv8ij4M5C3n7tKKXRYRINuFIBu2YlZsUgZqgPOhmSuSDGRP2+PSyV9i65+3EXPTBnSIXMqMw3cmPQ6XaeBhMjptCNNDosVWGCOnmrlTaamPseJZx+GlosHJWZVdBMKWRQKPisNBP1Rad+Dd9mYF1VYTZg5wTTq6LqfI75LUreznX4\/JWoq3u7tBzGDCgZQ1Totrk9+DjF79xPRxUZHcKuXUn0iovQizaTxZGkvfUBY+MB74J2hMdnYbu3YV0mBfqY03hT5cz4odbrAubMNNaNaYkNnUrgYMEzYdE2Rpre0VaHqs8zBLqYEHNpcMSUu07xMLBahFhycHjYuBZ++kcxq1cgjSYExWvQpspMFvinWvD\/6TPXXHDv88ywLhvtF4sBXqALO33Va643Uni719SL8sKK3IsEEWOC+oN9K6befeedd2aLQFnajYYXuiD4A\/7XLPB3C9++se99Q+m8\/e+vm89O26jmzI7hJ7H2db5SplFKdKJo2S8ijwGpcVjfwWRt5EUs\/uDISQpM9++TO\/aSPf4EkTEU909Q8x45awNu\/wTtkQFsrZIUVRIxlOrj25OCtMtyVqkY9je9ZkF2JmJ2CzTEICHFZLOobx\/p6T0FZAbPNf1eJ++7NCIwOoyeuR5ttpDxQ+hgX3dpCalqNofumFfZgbWTGxqdUx3S6xi3uw+z\/o0G+ahAP0aJqsJUWblH4FCXixvfyaO74DnhxEUnIMqrACu7ZY9CJ6N85jqSV12Mq5RwgDlzPaavjoRAR0lbqlPO+elUubup7lNzwXw3RKZZD3au+bW9jepDMxMGe09GaryYc1qWi2upfW3BmdNWRAy4hKQZI\/s8HERwImTYnCaVLhI8hCXjEHZUORRZkrNPp3jaKsyrL4V6FaZnIUkw6ghesdC0hrKx5pp3fum7I17C\/nrwk1MHLh5fSM+fIKa+ZQO8lMb4QlO2mM3W2FdrsM8J9XvybLAhBD85MzNkjteR2ArcBqWh\/a7US9BDmKmdiY4SmfmZuPNpjAwHy8tEFVWnG0BCCMwGpYHSMVHXzIdTyijECUJc9nQXWhSUnlqFwobVJJGFwX6y0SE0c+jsPFEUEaJIMx9C2gzT452LH8p+6JK9tSvnmvUduxm48\/5LL907c\/YlDa+NzMkcETuiGo\/bEqpZPjehc0rIDI531IE13TnwzhFGBtArLkDO20ScucOnlFPVFO4JIfzubc32rdzxmXnGxsKpRPZ\/hHcPWOIqhB0e\/aSTsEEj3jofu0oEutKL1I3hCZS5hd52m0BwS+asNV0DEwMHgSiKGCwXCf092H0HMcMD+HPOoFCr4sQQRIJPosyo8SWvM9VIJvpMXGqKjGRGd\/Rcfv70X33ugnQb1\/omNrFIMqvJ9lZDdVbSUl38vqrl1YWIpFgWpJhQjiy7FFICSJrH42lzScxPgxwU6EUYzBwr7nmYyr0PU\/vcV4lfeRF6+lrCymHSVSPEtaqUhZVY+9ZWlr22gdyaEn3GOvOV8aHbDh4vucZtwNUAXB3GGFuuG7+oUtBBgxpFl4wzpSDHr\/x+Mzf7m\/O\/zndfdGvF3\/3l9KcG+6ms9oS3tAqYeiwXbyhYma84PZgYUYloSkwWQ0wGPgPXXpKgjmeKRqboioAL+CyjZ3ySEBkKgPRUCSuHsQNVSGJsJxWCio1tabA8tbk6vf9M2T3TLOycK8SZDh2qwiM4ac0pLS\/MSNRdGwKaLhkHRRdxEnsgU8X096JvvAou2oKmGaFbZ0MEVVwizA9HNv5g31Dp98fGZk81dqlAreNI6wE\/bLBr0lgvjJGKONGsozJbgFkJNBfm2yTkYriOpVbyiLrp1igySKWMtDvYJw5gmy1MtYzOt7BDA9i+uoiJaBvJWoYEkXNiDcamfjp5fHz\/muv+at2v8+56CzMUoS\/zRq7p0fbmOAqlrGjMZDnwkA3JQWPFo6h4jE+7e7T7WiIVpIU+7ko3I1O0hoEooqoKSUwaQIf6sUP9JLUKTjRMqWaZC3MWHsiQz8+F1r\/882tevvu4nM+VU\/9yQAobNhLSg5IkHf+132Mfv59rsf9gEm+8aAzw7V1VIhPpH\/rg\/sGjGuXt4i\/s5lZBVNNHH70le65ploXWpUUUlxPAxDZ+7tFip\/WlTkd\/Ulryw5VOtLpcQ3sqYmo2Yo8q09oFHC2hetJzORAN5AxYnRTZc4DegR5iMbhVI9hCgvTXMXHeAuGskahUKmRaSqd6ex4ujH\/33sJ3HrnUH+yM1NKMs2ygWYKHI2E2eIJvYzQcbv1giQACPPBEFyzWD5zW7tD7V\/+If2wXes2lhNPXYNIMSTMiIQ7KqwKyec41vvAzX\/7en3uJ71jzub9pjJ2iSHiMP57\/KNeu7ja5taIMKNA2iSl0Sp7ICl4lT0+q62YbTi2r2PGyYKXkZBwVhSQECiMDJBecTdRTI5SLhN4aWixgigUxqnEBYgTfCX63i83DA2lnf98DBxoyPjks2FdkVlZPl9RMlnS+UwqddtGFDIrVEPX2qiEOHZrq6ThPUztkIV0A1YGeOhpOjqMk1AKsCKVKmc6qYcLmjcjKYQp9PYTT1+JrZSRzaBYoWOMy1QNq5ME6NPqlfNoZX\/luee\/snh23vPGNnWfZA2tFzDpC8MaIhdAPcN9JppxcNsAn0Ct\/ZNfnt5PLy\/LSoLeEBVDZAt\/0GGPzW9n6xfVU+41nnZ23a2nDQMdj+pWWEWa1RMcUiEwB\/PySa\/94NmO0EA\/MiNCMI6Yzx+qpWWqP7sSkGb6\/F7e+HxNZrCLW+9ip1DUpnWFPGy6ETYN7ol27yqGpq8o1ql5g2CiZJEyaAllooVm2KDsgS6IdZqH2vU+EuWaLdbPzrLj5Fuynb0e3vh5\/5SVofy+RKlYw1tihzLu3tUVGhfR3Z1\/\/+s8xNnbKoLS\/zSce3Ma2h1vsecRoeIBUx4pTUiy2jNaqyFAF7hXLuC0RSYSGNGcUWyKOj3Ydn\/kuEGum3aHQSanfeR\/ViWmi0SEKa0fRDWsIq0Yw+bwnVdWViZJExmB9qEqtksz99Ms+\/+h\/fvfdtxi5Aw\/\/ev7a3pY1\/fVG9Oo1vrih7PVsEvdyE+nK+UrEodgyF8eMG8u0BFR8npVpz4N3L\/hadN2X7fZll2bm0YNTZN99CHPBWSQXn0O07yBZISYM9qNnrjd4Dc7I7IwQnOrmQqB\/pcodtd7eXcex8SuJiVDUJiaiKZIsm9wXHwrawNYlaGmefwplEd+0bAaboY965A887ouoeRvC2bZFYWWCDFqVXQgHCXixIPERgMeLxAjbbk20jzzcEGtIA9hDM3Dr15BXXEgYHSLEMSSxppENjRCn7vRzH8l++2V\/v2b0U9WBz9\/\/vujxuSt7Z7z29iIrq\/CwDTxqEnxhpEsxOd+NzF7YjbXAABYBVYFBaxk2Bq1VcH11mG\/CzDzRQC8uV+YJeO87yHgQHoiCPvh7r7yidSpR\/B\/hp3vb7PpFQV8Nsikz1G1ddW9FZWcsTImQAolv40NnSWUdWISGXOhzLXUpMEIIdNIUOzGFTM0gkzPo40+ga0bQdWvQYgGvlFswkIp0Cp5NpVZ4aAAeoQviryFvPG9G3xWhWwTWmpphvCfwcKIcNAlzgAsZNutgQqcLDAwveMkoWsRN3QesFMkpRS1UX3YO4VUX49evoTM6hBYSyp0UFWHeyIHJoF\/xot8rw2P7jb3\/3krnidtnZqa44hp3HOnC32v7dCjT4K2kVtEv0K0Fw+3L1neZiGPpjV\/hXZWY+BzgA8A7SsTVtJbR7PfsSgwPq2EGMOoQN4e4JkJgqaegZVFdrkeV0Sii1N+DPX8Teun5hDWjUCkiCmIEFaOZMZm0JnbU\/++XZ0uf27teJhmIW4FGkrG94nk8hlZkyYzBhA6ygIb27RfcKCxoFCUKcWSISiVKhZiB4QHiepXS6hHMqy5GN52OmW2SuUzFStCckfdgrPotjHwmCtn9znPfJ665cPpUUax+iOtWxoQVAbkkE313XDabXMn1dQoSzcbCnkg4EFLamhFC2iWcWBp92HG3xmmBkuaOT2+pSLG\/Bz3nDPzKYVg1glk5gsSRtisl74zJHNoIygNTIp8b9+EhKZp7t\/zJbZOnfeKbFYt4Q9Rqxv5HCsqvNcVHKhrFPXZNq0fMdyUwp4YIQ8s38W5mEWDyhU\/PL9bLKokhqZZIRLCDvZTPP5vhlcMYY3BxhK5dgQwNkhghVQ6mEg6hJo1EdxZE\/qHctv\/3j163+dDySb1MRclLkVGrxePrAvQb2JFa\/btmMb2kVWRkWqQ\/C8hKlB5NaWqGV08mQqZypDquSwv9r4soAuPuwZiWikyXi8yVi1R27aNsLKFcwneqZIN9RKJqrAk+uNbozntOK5n5gjldcJ02lODBKtynFsnr8djORB75LhiAJdCKtGD+nYDxAeYazM4pjek5hgsx5bsfJLrtDvzGdYRLzsdccYHE+fRYL6xOVUebyukFtX9Tj8xucnEfORkPdxuYMQgf4brLI8yVjnBOQM6WhDO0Tv2RKGU+UaYjYR5oB9\/tdfVHxG2XwJqTReWOCAiFiOZpq3BrR0nEUC0kFOMIjSxuvo3r7cUG0QSIBROgFGvYsFa1XU\/d3YOf+IWJufW\/XNdme9AeaF7QNnJlKdJ7I+TS1Jj6ZBw46JQigdTkc6Pqu8QwvsvB+sIj8v2i9iOnAZltoCgDBycZenwPUbGQOyZnrsNUSsQjgwRUgzCgYmptYW8qZryCbo\/7msedkbmKq6Krj3pnGQW9bIAXHzyq5ggABX2hRab3sc+O0rO7zWwDTBYHWRO36bWZVsttK81KxqESjBuhLQlugQTBtxZts5D3Zi4RNPACHaMsMsRJqYDrrR3WBA5JhP\/WPfhSBXPRZuzoALic3v\/RM695tLdvezRS+\/aANg6K2etq52U+Oc3Ct1E6QGYSsoV5WCJ9wLIo+rD5Ac8ahdXWEFlLOlhHt2yES88nWrMCsUfSpx0N7YbIHdPKx2akeMubX3nGoZPZVzkGYRvXD3bopA69T2GPF3qkyMVt67QnQkpRTGwNsz5Fg0fUd0FY7RcqmabK0d0ICrTJiUKKClHqqT6yk8KjuzDrVmH662TtFNNoYVcMCgM1a\/CxBmKBUqpaaiOFTiS7p0Lo+d799w8NHmzO8fd3zp31X7+2fqgTZa3gR7Ikno3rYVWlgBwwoBJRQnG+qfPaVllQP8nR4ZqjsI54hvIUk6WnYC0WgBqwWpVypYS5eAuydiV+3SpssYA9cx1moAdaHZxqyESm5pBvpBI+HRO+eCibfOzvXnmNew5AWnf7Me8sjxePAZanWJvP8N5RbymqcpQY+FOs8aXGZTrFVOhn0BooBuSQoD02knEKoTGVuHpSi0YQVDRIHByxKpmbo+PbXSWaxfucJcdM1O6CQKIDhyh6z0B\/L3Fk0UKCHerHnnsGtlREW03ROJFCIangdcXc0IadzSuHvjnavH1tqbXnXDnQ6uv1QV4TweMF5aG4B2dLXUKOdEmkoI\/VQk67QKzgA4ONFqWBXvS8s+DcTXk7kvdI12AXEEmgOijSE9lGcirW6TQdV6bQgKysMNSJOaccDIkz0k4cQZT54HNeTNP1Fg6nXeSF6McXK1H0TGnXGKWCMCJC6dAc2szQTWfC+WdjayUCirbahHpVfbWSGpHdSbn4aW11vpS2hRWTfmTjn95RKX79iXITW2zRDJLRyHyazWV0fCkuBOvESyCLIjKDIJGIUTAWwSCy0ECpeAIBzX\/vOsii+cs8lVrKCWbAmyHXAZ4zQqXTYfC7D1Gbb1IaGUAHevFzDZwRTLFAAjZW7S0LZ3mlYTDNKF4xd7vqvhc6UGG5BrwkjPHCPvu+Dqetqrb05Xu2JMaYpLeX1uT4no9fedHBvM9oaS2w3+Q9qyYl+vmoyE8ULWskotIpKbvLsJOMQ8GT4rrRcHtJESMsjgIFKKlSLCRUrKXHGqhVKEURdvNG9LLzwFr8iiEiATGGtFhy83HpPntw374N\/\/TZSwr3zvfI\/iyy7ZakJeWrEew5\/FM8pBPg0yVz\/3aRFKMF+rxnhfOU4hhfTNAfegX82KsxfXVwnjQXfPYBDgWVv65G\/NHHrjjn0VN1vR\/h\/RsD4aIINjUjvbAYmVeldT8wW\/EyaSxNEcaDY0YdhNYLIDigXiSyIfjbMPy+BBOLPJliqgSs6DpAPa0Ww\/Mt6OmBD7zF6Nvf4PZ8\/psXTX7t7t+AoGKM+KC4Ttryjea+aLqRWudD4oIrZvSUZ5vlpK9eS1auLUaR4s9dw9xQH84HmlFEFsVeXdbMXDYeN+d3po3OTjc7M2HHJ\/bOPL5vujnrN1owPVm8STCbB4Os6BffE0dBUgMd42gB+0VICQQj+Xy6E9\/XHi0SR+kLgUqtQl+piJ5zBuFVF+PWrUYGeonTPHWeqZKGMGGVrxfQj5k0u200GujsAJoHv5Xd\/La3LffzvtQi4K1stWuI+uZ5eOZG7swkb\/fn\/X2v7blx6tZWN6AQIPzo6PXllft+uSwUqp5ZN9NXndv9bw+k666o1o2jElnfqXbimaGrtzTHQLnhBmFsLNS\/fl9PEPk61pZFDMYkvwz83rbbbrNjp5YA\/0nOhqL8Gu+vRmjRor1zyIeqat7Tbjk7h0bSY9hXgO8IZCRIZHLD62eWJEnHQguSARqS1237QiD01olWDGA2byTatJ5QLOCNIEmEKSTE6kl0Ju3ddeeq5J59p9k9zfLszJyda6tMlDz7rdDo+ksa0q5B8EvK+bDkwLMiUDaG0TUrKK5egTttFbpyiLDlDKJaGdOVyHNC6qApcJe3evPHrjj30VOFP4DbTBtdadArPbyq6GSlJDqoCIcCHCAwYyNSEYKGboQXndJsw0JPOUI7oJOSZ\/fD4j5XyHtdq0DVOaK3vB7\/b95Ne9NppPfsMn5q0nUOHprL5hqEEIJL01an1R7XLGu5jmvaLJ1fGYIbUPGR6+wyPbE3PYR4WHqjUm2g6DHV6U5vBL2uv5zMxcXOLIUn5mL\/RMsUdnVkfn9qihOlhtktlenpvomD06UQJXXHvqJGD2RiNzRNtKkW9KwkoZzFCQnKEDAjgVnbpfoUOeEGOFtEDztpDIPe0wqB6t5xkn\/6InrpBZiz1tOoVYiiCImMWmP7Fbl8SnS2XUzW7GRuvEdlT3315geAyWc8y2+6yW4eGpLbXuSG8mpg7Oqr\/YkOzpaiAZbVrE4ipl89yPmX\/Qbnrvt8f\/idR0fswH2t1jsvHPjJxHdaa+b2p3\/0+Kg88K3swE+sHf69i1Zyyfqe6c0Hqpn95CNnFB5rZ+H1G9VcFBO30ij8xZjI3y+UZmRsbKGK1A7OJcE59IU1useE+6K\/yrWVgB1V9HKBoTT2U5owklUCczXhkBVKPhDU56QIbi43wkuIC\/mpDLEBojTL02279hI\/9DiF2XmCKtpXh5XDmDjGWoMLIWTeOtMzvF\/tzP7Cnva50YwbSRLRXmMkMcoTvsOEX0BA+yXVEgN5\/8oCCeFICKw6cIgwNYd86x7May5HXnYuot11KSJlJUlFVWC6Eth\/hP0lL6s8qfZygg6EMcbCf+MX4\/3MT4DtKKFhjKhLwt6spMMmjiNBUJRYA7Hv4EIbH9wpXXOC2KAeI+YNVuwb8qZWezgHsgD2qwN1EXpsQu8d9xL\/+xtJLj6HbLCXcP5ZjLzzzfCOH6ET1LeNPNEqFr6e9NdvuXSo+i+\/FJnpR4I+yY+76Zu\/VNrJxIpZGmszeFPAbuhIdnaw\/vRSXc5KitHZh6xgBWYEWuJQMtqlhLZ6JrSNEvC5lrcKiFGQDofLD0e1DZwEERbTdQb7gSGgt9khxDGm0YKNp6HVMmZiiqhcAhvIxGrHyIHZoLceELmt7dkfRKZXFMIurdr5Z\/t5L5UI+fYflAj4Jraat\/F7rQ9xbSGi8Esd0uarZ+xf3tUTrsri2o8baVbmbIO47D5fbdviobj9jpV2x+kVXkeSrDwrZO3G6vsrD3Re4d4eG1ZHqsHB1Lu\/fPdBNTz8wc98ZgboNDttU4wKvXG5YuJKhc70TJElREDyn\/nE\/l\/iPbaEfTygj+Hl3NgZUa+knUCtYJgRwzwBVXJFIOjyIOuS5YXuB\/qMIEGJ+ntwr7iI2QvOojDYhwz2IYWEEFnStieIdZkmMxJX99alXeVMk1TKsbIjk6QJab\/QNoX83qPebg\/wTFcbWJZMBFwARoFhgXazTandwVz1cvSVFxMAr0osub5QJvi2slvgCRU2vO9L35n7uMjBbuFT5SRlnDazWSfZIUo4YIi\/YGCuqfqAaekWYxkaqDpc5KkhNI1h0hYRMWAW0s++CwAMpwiBFVTVh2P7fxeyLdMKplKiag0TfVWIBSuewpohovlZ5qeDeGOMWmtEdXXZz1zld4zPfSWE5Kc\/8+1mYvRgmJzeXh2fnDl4+33p5pvv52uM9ybYsjHFlR6Z9JFeFkeFFa7i0lZRI4nR2MABgmpwOO80qEOCFyRgVEUCRIexWN1rl1NXGNRuBBy6wYirFElGBtEfegXhknMIKwYhyzBp1p3QkAns6jX6nR7Vr\/ztF\/\/+UcbGwkPPllHZts2MjY2FD9x+z4fiWvXcrDkXUMyLVM4txNWayRpz\/+3PX3XenVtvusmeKMdiyRngmw9fmNklCCJSMl7+7r0tk0qPT+5wNnTiHi0NF39juN12nZBFTRU9xD9qtW+PaLr+Ded9vX7V7Lm1ovQkKs6LEXk71r7KB31wqrr6ofd\/+b6vFhP5QrPjXu2a84kkkfHBPQRww9VX+7ElMhe\/x\/\/cs43rp1I6BYKcEZyOxk1TGrAiNoGWUeYxtE2US58d5p9duhHwOHBQc6NUTDN4eAfl3ftYNdBLVKtAmhFOPw152QUkhSgph9aauptaU7z0dNzZdcLnH2OWae6bUZ5wgQjB+kaOgPbtJXf\/C+jvgyJM+cDgikF6V43QM9SHbt+NttroxrW4SpkoBEC0KDLk0B\/zynCCia7\/9rc\/f+Mll2TXfeWBWlLtLc0fOEB1ZAQzdaj5x9ecM\/98e39XQ9Jk+xaLHQZ7fsfo68Qy2ipmq30s1WYJ9keeOaCFoR0CXgNCyAUZ1L0QmQcBscc2MS9Y5LbAgUaLeRHKjSeoPP4E8cwcrUd3kpRLRD1VdKAP+noiW69VpViqith3t2P7ytlE95aM7LIjQ4\/4kYH7+177iu+M\/8tv+p6Z5sqAeY0E1vhYR0Ok613i4qnEmWlBUmOZ1UBQLxoCKoa8PO3zaDYEVJYGIc48EBshabYx802iex5G4giZXkkYGUCsRRQiNA4im7zKm2KJ9lz3unfs+4sbbpjnWbIv92\/Z0kW+hrdVh4Yvac8kiLW8GIc6T7G3l0Pz8\/8M3Dk+NCQv2Qj4Zm72ioogt3+Ya\/801vhnM7wfnCNJaqoXSGS+ojGOsppiiMqtA2SayW52SRIeZzCyYu8erQzf8kP4n76cUCggqknk\/LoY1vmgbwghvHq+E3pnNfvUUHl05r+fu6p5lPOZp\/xeqIZaAXQb26IWj67o0BlRRAXuxbO24\/y5nSzYNBXKRUsvlgljyRAEA76xpNSAnoqa0Xal+UyzRfmBx5AkZmqgl2hkkJ5ykULpAJ2HH8GUisRrV9GprFXvZrQ47mV6pZe72w3Sh\/dSnJyFkKILjExL0PlwwCxd8FkIyIEJookp5Nv3YtasgKtehvb3IvUqEgKREHdU66lI5qDXBlOrzRULOR7G\/ZZIel2hZNoiWTE14b8C\/3bbFzUau0a+nxKK3sRW+21KGwT7RoFLBc6LIurtGvVG2bInVp00RloY8B0ybWNCilkA+h02vLKkQC1loFeEOlApFZFigpmeg6F+6KliB\/tQhNBuq4uMT5PCrBr7WCPoPTPCnozQLEB71EizMt\/O\/mTmT2Z\/met3Gjr\/AlGSiK7YWeDhkUje3evjUlXVZEjBJ8rj3nFAPZE6nJg8xPVLJxMbd7My5RColUqgAX3ocThrA6a3nme\/NT+FMwQHLjXmex31d\/7dK7fMPTe0utzdOHig0pmfDyIvzghYA8FnHQPhIMDw1VfrS9YA52AQ0Q\/znitjkhUeH0CNb4nONJD9FcWo4kFUjWpUE8kmyUjYiTBHoJSNa8\/nbpG6P4ieuYa0XKZz9npNkkSTtCOKnuORGxLidzSah7727i\/f\/dl6kjwwvvPe6ZtFXuidotu4tjjPziss8Y8q8jaEwahoC7O1wN4S7IiUORGcenxoYX07Z8NagjXQxQvNdtGX5QXJuN46hcE+CiMDxOUiZqAP21eHconYBzAWjYImflpk\/ID4HbNUJmCjV+6mW6NTlwNW1C\/JyLfUdTpqxtA3UKNWTIgqZXTLRvTcMwmrRrB99ZysQ4Q0aDZv2JmpfjfFfLoUpV+1w7UsR+f5kjG2opAYY2OEwvPba9cW78JeLoT1QMOLulAwq2arLp0peXwSUbBWQnDY4Aia5Uo\/vs0xLX5Lat4VCKp04phmqUCUOQobTyOcdyZ242mYnirYGAoJiAQDaWxM04vO90KjpOzqBH0sLdud28vmiU+dc3oK8F+4sSuecm2xmdonTkulJyLcEaDm4ELpkaHJXqPFuCyDEtEGpkOKZDNdSkrX7VCQF7QkUgNWA1UEXy4SrrkMOX8TbDwNUy6i3hOcJ3QybfswkXr5hySWf6oauPaLd6zIolKnWko7N158cevpouCFFO2fv+rc63mpjO69nkgbseQM8P3cLwLhI5j3Vym9eYpZh0gUrYGDBbg75IeaiIF0WsimQCyK0kYZBxIxsjc0qX\/jOwyPT9Az1E9137hkZ58u6dpRbBQThbCSzA3h3dkazOtnO+6B8orNX3n3bfd8JWnLgXp9tvXEE0+kN2\/dGp7uQXDC63B9hYNMmQ5ZXCaZM5hvpsZNZkbeRaKbgg1aNCLrpcATwEHtYNXnjYQ+7YqjL83usoUJaylkkSUuFSgUCxSN0AiBso0oGIMaQ1wpIatGcHGCaWVStB5bEHSNJdl5kIEnZikjHEwiYlfBakCzqSWlEqXkAKwOEDRXgjJG8MZQ8Z6k0cJMTKG9ddJyMUd9G0MsYhJVcbC\/jJ9ru6SnMzubAh3EBA0BEbyGEOvzyNBsY5vpsL0CZqdgdwfc4MGyOfBAJdzR7+XCoYZ9eamjozVx8erI0UqUx03MDIa2LUAkORFHlnWR50sn47DAAR05R9wR4p4aycQk+sVv4nfuRc4+HbtmFBNFpNWy+FJRUlSaEKkYCeJDZOPG2WpmBm\/+WzfWFU4R0I9y7Vme+DKD26DIa5slOdfUqB4oZDQiw7gxMh0cqbZz1qnQ6ZaHWBIZGtfVSe4ARWOwaUb83QcpVUqUxw+B82RRhPTWsQMDEpeKJbHxhS3VoQyZzmzxEaPyvdqcvXcb7Bp7tjW43DP8oktBh\/xwGP83M8wNx8Svz8hCNi9mNIIrBL4DGFXUFsAnoA7NUyVkdFGn8y1mZ5vs2zNOKQTqxtA7OsTAeWdizz4DP9Sv0luLGegbTSI7SvAv8+p+PMAjnZI8doj6lyvrzv4HRHY\/paO90B5wglLVpzNY79Duq1CxTVxhX1XKncSNig+rrOr2fjWjSebrJetpi2FAIjJg2kSojcAbSFtLVit4AQFdFig4R2gptreGjSPKQSnMzUMxwSYxBouxET6y2oiTEAZ6fKFa0XJrZ+T7E1s9VOL8eTjQsexznhkTY0yyKPW+dDSBLVAXWO8cAxNTkDnC6BBsWoeesY5CEkPm0CQGETLVZhC5a0bNrVOh\/ZAmnQPnb6\/P558nQVWDKgt\/Po8b3ZFYCvUWWWLw2f6iMfNF2NTJ6sUOa6LEFFCsiTOdi0T2mIgGSiaSt72RHiaYWGqj1T0HSoBxPu8Qr1YonLWB0hmnEVaN4IoJIY6xIlI1knSUSAydoAErdqCUZb3Tj+3LBsfgJrbaG+kz\/4bGoCLnZvi1KtKLEGVWtYnT+YCkImAUCSZv0VqAhi1kapbISLqZqJ4QiFodSnFEad84brqIq1Wxa1YQDfaS9JZpR1HcDFqbRD3ITivhgU6U3LtuvrDvORDEvFQ0B\/QlT8Sxla32Zm72H+a9b4qJ\/9qJK6EYKUO2Ar5gjgi8K9olXmgfdSuHWTu66bEgMKDQmzn62h0qlRLm0vPgsguQS89T7atjQkA1Z4nLWu2g8+ndZs7\/Hc7c1uwNBygUiBPJCH72k1eeP3Ui+\/O2stWSp4WSMoUVEcmaWRuqTvVMa83rsqLf0LJhfUhCIRTgQKzMiGEWQ0pAyUACZK28eX+JjrAoNWusIU4SkqE+ekpFCllGXCpSHBnEXLAFrZWhVMIM9OGNeBGf9mTjWj+wtyz7Zyl8Zx9+R4ftqnyvldLMMkxIIZvt0iPKkhGGr3X1V2tB6V0xSOWCs9ALz4bTVmH66kipiHEOnzp80HlBtovVO7z6L3ljHywa7Ygr7c9sU8qFvlpwrWCikmlN7Z\/+y9ddeigvMn5\/kYaC\/CrvGpouFOopYd1oyk9ERreKNUOdxKE9sKcIjyBMLHyHthDfwi5kXZAll4pecH5iVRLv6UUYqZWpDfYRRofpbNlIOOcMCqtXEKviVbUBcx2RQ6B3lqulP\/7kZWd\/kc7RhvP\/5f1XB8xPprjrCzaOdcAzVfbsiGG7CtMaiHwTfAt5YcBpzzoKQE83Dd3vHL5URF\/\/StzrXoGpV4nKRTSKcFlGS3XSC1+cE\/uXX2vJV+Zee\/bkclT7Eo6AN7NZAQwynOtpaxAE6YEsJt8P0oXz+Aa41pP65XQxWyxgNGeyn4ojdsQRtpBgDs2Q3P4tivc8LIWhfgbiiEJ\/j8blCqbUI4ysvFD6Kud4438ujsO0CcGL920T5KFrb7nr01IIdzY02TfX2pWtHR4Ooxf\/kx+TMf1+vKS1FNYKtifG9nWQ0UMxF6bFcCkmXFxIQrlT9DRsxqSJOCjCnIILDqMeQwauWwNVXZI0lAvPJF60+WvtlEKrTSlNiVYM4VePoMMD2OEBbMgw8\/N0ignzLpv3QbP65HShdHCyKAdTZU9HGrs9s23P3khxISBYkARMoQvIWhriAAukB2VVmgJ+YhJ31wNED+2guHYFnLEOv2Iwz+isGsX01SsOzkxVerxEm5peH0xEvjESpV\/+qysueJQcSP5k7pbvc\/wa11Utbmiw44ZK2NGdRd3fLnJrQ7LLmiVd246xdR+zDk+\/yeiowwdHwwfmMGBt\/uNDWDL84yxiXusVYdhaKj5QtBbqVWSoj0JPDR0ZwKoepoV0hul5H76YEP5u9D\/+\/aGP+K2XY5MerwxFxgxO93Rad8WzZetMr83Y28Inth0NRSaJUqtECFUT4ZM6LiTQnlpo5VkSc6Pdvbeh+6eokp27CXnt5WhfHdtXR3prhHYHSTNS1ckZzG2q\/lOrrHnwneXYpv\/w1ercTTc1b966Nbx0tfSEU5VKW2oGWG7gBj3I\/VWF1yp5kk2j3K4cCNCRPJWpCwjM42xW165BViBrtdH7H6UdAnM+X0d7VSmUSzJQLlIYHqB\/\/RoKZ5+ZFM9av5JaaaWvVRCJ8CF7GcXoR1T08YLl0diu3tuYlvse\/\/xbv3n9t9\/0wI2XXJJt27btiMjDDTfoM4gBcwM3SMajbaAnQ4NIODcYuTzy5lxnQxEjOmcsU8bIjCiZgqgjClk30gvHqACxJPt\/K11yhJpCT2QoDg0jo0O4jWuRi7cQ1arYyBL66rSLBZf6MNdGHjjQ23v7lr\/8l9Urb3vwEn18ao3OabVc8eyveO4ygek2BLGIb4JbiH7NkkNChwVkbuoozjeo9tXxxSI+yzC1CmZ0iDiOyAyaKp0GOq3woBf5p+8F\/equV50zjapsA+GGG+CGG56PgIh8iOuqhsgEXCjRemS2Xt834xozQaNmqWVLdbWvko7YRuSROJCVhdR6pgmQlHFU8syTUYhtXv5otZbEGrTkZBMlYECVeq1CsVzK22te\/0r05edBuYjNHGQOVPFB09jp7prK3VEc79Erz7GNUmFGdk42\/OMzq8sHZl5RTZML6r5yuq1YDvS2mJEO4xrCdOiEpstMEtq54RdFgn9SILAUzMoc8N1uVqbPGKqZo7JnnEJvDd07Ttg\/ge+rE5XLFITKCOFSJ6yeCekb8O2HCr3F20j4BiItlsdLLwW9jW3RGGP+I7z3j4oU\/1WLtieSKF4D+yK4VfNISkWgcygXX\/9+GGNEnqRLEoKiIWCcp9hJKSeRDvX1EK8Y1Oiic4g3rSfZslFKIYiPYjQLZM0UETturN6fJnw3U+as0izE5gGD++rHr7zo4PE8gZ8rXbui0pSaYPvmY96C1UuTKFwWClr0CUwUAtNGGUeZDhlmoe83dJYs8vmpjPAAUKyUKa5ZQf2sDZgz1+FLBdzalUhPjYL3eO99W8xBaU49PvrNr5ai7+xr+281rd3vNkhJBu4eaeuMQYwWmEeYDy43vKF9hJt4iUT9BaC3e+ANAoVqmbB+NZy3CbniQkxPDawhFAo47wOZy1L08bkg\/5ARPrU29ttlvtO2g0l76uLtnZvl+RMAKCq\/zgeGW7RNTEGacRgwcGkWh1XqQz0Wc5qJuMQV\/WlThUyzOJKpKGJGhQkJUDSIppjmLLRbRxayMUuqUFfqGmKJIwq1KtEZp9G7fhXFWoW4t46tlclGhjBRhFobIms7as1U27Aba7aHxH7TFuzdPedsvOtGkZkP875XWuQtWF6vCZtsLbKdquGJyLFTHYdChvNtgm8SQobVxZhIWVLZqGjBKe6kjKQZfSuHMVs2ouedhb\/gLHSon1gEYwzBGJo+m3Mafbtmy\/9nVbbqUy+fZyKZeXHFwAsH8RBwG3BwfNGbB8eZ\/co+7WyKss03bXHHKOTJyYqGZQkyYdm3cbP\/KO97W4HC37bpeAVr10CnBP8ccpBFJAbNZiE9tLgf\/wQgzXPoRDCCBkV9IPGeovdUykUGRoeIhgfVrFqh8elrKJ53ton6amgUIQGCcxC0qWl4IGv4L1vCAcFPCWFnO2VncM2Gm5rPWl96uHHp\/\/omRaL+Wcr1uWqoRSHrLaXtLXPWvtNGcl7beNKCoVWNeCIS9oqiohgNuePhlh73MU8D+lhQzRgAVoaADQEZ6s\/l+DafTlSt4FaN4AsxLo7UGOuNa40Xdzy0t+9z3zstumeu38w5myWeXQI7A0wgeQ9wOrFkEeC2e\/8L6b+h4X5MT524XiG8\/DwKfXVMFJHVa2CNunrNxXF8MIj5ykTE7R1kqqJusiQ8Xm2x569ef0HjxLT6PVrtoFaxtVZshhDzGlHWeMJ5rsArXS2Y+dhxKFJSMRxSwYcOOZVTLnzhvcO5LDe8RvJo0ocl9QhKQJ8q1aAUKiXi3hrxYD\/JUB+mXMKfvQHtrSNrRzGFAp0Q2nOwc55wt8LDNY3uXBP0jqFrzhkf6\/J8XM\/1cS\/tMzsl88qkwFlRJK8hYn0rMtWp2DErjgOaMeU7ZJprJ+dOoS65fVkSoShQrlZgeADWr0Zfdg56+hok5BypmmaERjv4qdm27jo06Q7MHwipdhB9URngmBJCQkAYpF8L1f5g6kkwQVUjIdpYng+r4nFXD3PWGI2U1BK2G2Nv+YtXbNn5A1EDfhs3+61stb\/Nx2\/6Na49o0jhN1My7yexpRVwtcCtXfo+sWWwjRNKPbhQDzJe80+0QrAx85Iw7z37d+yFPeMid90vyWAf5X+8FRtFmpRLFFetpLhuNVFcKBfK9YvtUN\/FUi9hTeKQaLZc0kP4eLZYLDTNGze1Jtb5FebB8dP9wXbcbLR9o616KBQL4zY1rZCqCYh43+3Ly884tQZ81m07ckseYCgLQgRAJSiDlSLJmeuxRvA9NbKXn4tZMwpJTKzgNHQaYqZSeNz45M54qu8JbQzHlUw3liem3xo7qa7qd1opqxySiN0mYaq4EuObXUGK1pJCQRugDxgUSFyg1GxTWLca199DiCPCymFMElOKLB3Et8vJxLzKg1Z5oC36yE4rj5vMNXrr0exPfP78E5L228GOZAWVXkh7LLLRq4y04lBKrB+WhELHht0dCaOiJFGImDcBSyATgzOaOztps3uDXcGAJeoDZsCkCMHAsHNE1Qp+w2pk41pkwxqsgrcGF0UkwWuCSF0QkEOzotvjkE40oP3HOTmOmWZHvUT2w0J0drmlo9rSgWAYmqi6wqGSoykGlyS0TYI3JVSzbq96s5udWTpdCinQUc3b5KZm85ayAxPI1+\/qgrc138JBEe8tIVQkaMVYs0aM8GJBYsnhvWi6ZQmhZgqUpYCqouechb7jzdi1JTCBoEqmgYb3BxORm+pZ5wvHfNRLW4xhM5t1G++sZ5iRXEFTRRpCmIdGL4jr4k5MBHEvdA6cFEOki36zCwCnJD5SS953kOk9IWfOCgGN7kGsQLGgUbVCHMdIpUxULEWyZlW\/qZb6pVygnMRYdXQ6geaKMu60fvxsk86uQzDbRrIEmevg263cyKrLmWmexMS39I1v0o18E6BiJEevN5qk526C8zcRnbYKUSUYg7dWgSwJ7GtHfEND+uiZd9x5VfWePZeHvdmoqEQ6rEwUVe5RoQE4VYyb69Z+l86RsIDCHejWvpOgFCslZMtG3HmbCFvOQK3BVspIvYJznqbIoSyE72YavumMvfUKmfnuV6945RzALuB7J+jaPsEn2tu4drxFHAKd+1RsX6pmvaA9kdIJwp4Cpj6d+MRrqoJKVQ1GlWnvMEahUs1rvmnnyDp8Sqn5F5bxyXRf3hgCQuHx3bBzTy5Gby063I8VwfTWsGIk5FWDvkglzFgejzXevaq1qwXoPvZFA7BFkVHQs7zhR2qVSnmqp02jaGkbywEVpnwGbp4odJDgOKZlccnt0QjyrEajtaheLU\/Ok3bxBuq9osf9qJ+jd3ZyJkmBKsoGYEBAwhz+wrOQH301um4l0gsa2uBURASHHOwY\/m+qeuOZX\/yHxxbpzsuJBEFGS7ANyYwx5n+dazdYol\/MxKmoiPaC9MD9DloCBQQNWZ6CPgWgm6cCVEgSd8+c3Bs8bCRTJ\/7gFE4D5HVl5c67QUS1+7V5Z7\/BGCMUEsQaDAouk2PUbo4xtrLkU86Lr990ay41VUr1CsnoMLpxLbJyGC0VMd5jRAittmqp5DrGTmaqD7nMPbR7Zd\/D4x96x7evue7P31k0U2+n44fCJLKuNxYpwz0o0yIQVcAFcI0lQ0e58JQmgViEJATKxQJxsUColME5wprV2KCYNCPk6dISUKiK7reFsHffVDVsVbUng51tjE+0t7Ftb4ddL6tnelp\/FmYaxqx3CVt8nxk4VO4wR9BMrKQIHZ+RaoZFwAe0k+XoXlm6jqDrZl76FArWUK2WKfXX8WtG0eEB3IbVmNFhrHOo96hCW7WVYe6r23DL3VecdztAtu2L0Va2JjdyY\/orvOvuMja0oOXU75hqz55jvVw6VNd+U1KKNmbARExKjXktdmlSuziNEJZuc6uSlxKe6VmqHjmE5LkiQF6QNtujrqCB8DBwrgg1FeSJQ3DfdsJ5m7Eq+dlhc3RsJJQHgvQWrKZjY2MBIzmjzgk+W5YsF\/QH+eADZea\/nmh0eUoW6IgYhbWy0Iehee1X7AtHQ9hNvS3EpoeXjzGIMYdLknK09Tx6sSmgHnXdM\/ZZAWUvnhY8B7QXAHMiFGYa4A9gLtyMloswPEColbHeayRGDMTqfdEYc6A6n9532zkbv\/5L9Z\/9qaG5+INtDB6QxDNXVL6hMCeQIBg0ZxxaQrCGBWGACJhVxUSWzqEpyvc+Qq1SwsYRxBHtnhqmVKSgSkGkjuo5Hcyk67A6KduH+r5671e3qT7+HEgPeC6sc5sp72zBZzLM5RY2tSKaDaetSjvqp0B5BsH4jJqCxzCnHVzwOC+IkZzOMWhe\/11idnhBicoIlL0ntDvMDPVj16\/OmbBqVXyrTRYUYwSjoCIzHn2wk\/nknbd991Xl7ePtwnfumahE1R\/\/t+7978kkjLRt6A1ltTP10Lo7TrO2sTUVwfkU4+axagnqUEJu1OJCt2SULv1Ne+IR26o5C8mzrQ4V1JxQQM8x+3EAWAdUQ8AXC7BhNYwM5ueH84djW5+3Du5D9bP24R17tnFVRLgduAq+eBs5hIuj1ILHrhbP95GVP5lbRrZxlc2ljLvjqvzSu7eS38jtx4ImSvYWWv5DrH9rmeLftGh7EGt6oDOk4TOaJxutdCPgzkReYzlOL1yOtAguD04u4UYJGFIw3jNgDNXIQqkA\/b1kb3kd8YbVyGA\/EkfMO+8Owq4IviPoZ3F8ecWrz9u5ov9nCzKVftxiT3OEGgO6MRoWecDD9gAGoRFSss5+5HAftCwJ1Ld006ACiA8kAj31KqNJTDLYh++r4152HnLxZuJSCUVDqnTaudj8dEnMlxOf\/dH6Ky\/49skwwAvjF\/nFQoXp0yBaGyGDO4r6DkpySTHSIokrdSItNyxMa8pc8Myh5FIMLnezvFtSPcALB1ul+yqEQM1ayqetJBroxfTW4ZwzMKUCVMpQqxAG+7Rjo1YIur9t+O78fONxG5nd62\/73mztb7932vye+XMT9atjo1u0KuU9dceciWhgmQ6ehrpck9o3UM3nQ0SOTunKD9Kxo96YyHrvvhRF8t7Mhdjap+Ys9d7YODJZ5nhjZOwfBnX+ZBjisMBFoIrGEaxdmV\/pfPOoE0MEhtOstbHRHM9cyCRzwhUXwL9+Dxh7VB0\/iARH+Eps4v+y5oqz73+u+\/RkRsA6xu3uKAv71H99qsCJ\/8Ltf\/vv+Jl31Sn+aErmFWzVWnOxGvN1AYugYvI6MMd\/6Kp6dInSNb5URn\/34BtEGYkiTF8N19eDu\/IS9NWX5QxF5WIOdvAhNL3f3TTyf\/YH\/+kdxej+5qFkih8+I+3WnNrAWz7Me3\/aIG\/XQ7LBt7DnFmFFTXk0VtomISuO5qk+33nBgVgLbR7Rgji8CCtWDFIrFghD\/dBXI6wYJBroI1k7iq+U1XmvCs5Dq6XcN4ne1o\/7l5W2+MDYSb6Zfvoz2L+jRU+zQ3bNaW2xrq2HKLDWl41M15T9KDO2RMcqIbh8jnWBYMJ044alE\/na7kEyDySlImm5RLGQEAb7sGefDgO9+NUrsJFBje2Wf1wIYnwxiLTq1QeZa+wq3LnnYtPJfqgeOFe8KZZ6IjtRCcwh7FFHpkInpHjfQIJDjMUoyIKtEfmB7nIVaDy863OPH89Xrxt9\/RMn03leWBOZSL7THtyer99j2ucMsF+kFGx02hlGMEMD6Bnr0ck5wqrhHA\/ULTL5EAjOldT7x5747Nf3ApNdNT19QQzwTWy1W7kp\/DrXDRrM+wNq1KiEFZDU4HMO9gORMXkrTedg9zLCUVFqaqT9+eYBhl2JDKeilv6mvWVFsfQtE3zkggRMBLYA2fSz1xkUEdGgyFuNmLNVQ1hyjA0vgaZy0zVAZSALyt5STPmScymevQE5bSWdoIQ4Is48kQgeaaTodxPC9pdFsVwlIW6WYvkfItzANtNm+2qI\/iQheiMImckggu\/W4N7Y0EHyKFM1NwpLgAVLyMnuF2BhDVWYmWNuehY5NEXx8gupXXwOplYhTR3pXENsqSAFI0kSqBkjoajSQcOalmT+3bd+8+G\/hEOc8J77qyIYLnbYvlIpv9nizjGYNe0knJOVqEyVQvlgAeYiwyyKC45Mc1Uk8e38RoNbcuvQdw\/aqJuF6ahSaLawu\/dhpmaRfQdh80ZM5iCOkME+TGQlKRVLaqQ3KLXYh8FOqfjEo2+68I4NA4\/eV\/vy40EPzp0zL+7KzLGyV6VWsYVRjEumwXQkIjVKGnK2sPQlRYH8fJzRhZraVRHc\/jRe2lUWbndiQnyyjuTFFIUi5CWToEgSHwWryivBQsEIfXn6XLJDkyr\/cCtaLaErB6Hd6aL\/wSG0YToWv9sWRpvPVYAiOhltRCB8lPcNBfSGIoWCBk\/cEFwdqrYrCi0WjW0XOOO7\/smRUUTYU0l5nEYeUZiY+axz88QjX\/yL53N9p6983elizNmqXpc3yMlTAWqr0lctY40h2nMAu3KIsP0J4oOT6OoV2IFerDGYEEAoHhCbTKDa34Lk6nXZr9nrXh373a8Voosjsa\/ziQtzdae7y2pnizFPBPDBUVRHCFnuhGn4\/khZTqIzsqAX6NodqoUEESG643tQiPEbT8NGlmR0GLNyGEXIRH2m2jODrnAiEz0O1hRLJyVlM8+aQkxhBeiAEh6bi2W4bTg9FLTTKVCT2LieKEQeR1ClGTKMprTVd0+x7p+qS7b1pAPQSZlTRUcGGD5rA3G9ghvqJ9TKhLUru2hphUAwghHVkR5hXQh89aaff9Md\/IIsAAz+6Yr2dX94AWHrKmRrFvtiMTIDcaUYT9etPGKFaTVk6hF1qKb5HLl0SToqJ\/kJ2BA8iF6xYdVr7xLFwGufbqGIymuDoL0hx\/PYk0GIswmoiuCyDFkzCv\/6WrQQQ5ohRnJra0Qy56fjiamPDX3z3v\/buGf3bDiwW7j8HPjxa2C6gV+ImAXaqjqt0cHPvuqc\/d8PK110InV8xxgLH+G6H4uxH3W4iw0mzuKUZh2+U4GDvkuioUoI83nfprqjol\/tJi4cgUAIEWI0gFGhEiSZeN5EG9hlM8lJ5TYtAGWE2vQcEllCo4mrVeCHryROM8QHvPe0VH0qcqAs3NpfjP7yU5ecdQjQX+FdFUN0DpgNoFucCUgdmetV00CY9rnLZkJK8M0jSjNilljjf95+1dMlPGgglCslwsoRwsggOjJAqJSgXMKpqlftpHAwwL4e2D8L29vYiSiO\/cmAv\/8uf9UAHv0o70siuLiWMVQ1MitiTTMK0XjByxxKCyETT9tEOeBqATZrotzp8dmSjPYWwB5ehIIx9DbamHsexhcT9MAhpHM2tlxC+ntyLKWIeIgbMB9ge28xOnQV+Lfwi4X9zF3p0BUJerFBXuULbEmTUNifBGZqhv02YioEHAHVgFkohWh4UQEnT3j8i6mJmAuebXnIAkebhpPGyf4IsArYiOAqZWT\/OOHl50O9gkmznIUJIaAFt2n9VY3XXPrI6nPXf2xMxPHxL8LHf3PpMmEt6GV+iPdeVCBZl5LOKRqKKy27BuB\/O+jxUAWca0D7ADgHUfFI7l3FpgZ3\/mz91SvS0vWeMIBBzIjSiYzcE8xDsxLtEhFLZ1JxM90a8HEVfwXBg5wnIiOqqss5ohM7asDK7p9lY9DT16IXnIXtraMvOwfKJVQVsQaPZDMqDzQMN5WNflYyP9FL2m4OVSb7zvl9HcD3K9SU8O8kljdIicF2MWDqIo8rPCpKw3dy4+tml6QMY2VBeEKVYqlIOOM0zJaNyMoRis7l8zA0gCYJoVpzmkSzLRvtaloeK1getxoeM9Y+1J\/waGI6+2+85JLsxDnMP1dt0xhUtGKRFdORudjHOtyIfG+rEC4ZLNjz5mNHaoOkNqbtlD2hRUM91nZTz2lryTk9i4U\/ertGuAwMxxHVgT5CX510wxr06pcTbVhNlGakxjCXdzPMgHyjid74QI9+8bz3\/Z\/Oljt3DFvY4jClQKg2Y366WZKNWTEbFiNlCrEcSgKTwZOGjFnVnHRDs24+MywnxY47RSKcrLKgLmKjO0OEnsyhkzPwrh9D3\/cTqCrdvhVEhGANmXO3RcH\/1vxtj35pM\/c5briBp27p+7452ZeuAfp\/uf7nBfuHbTqOskR2SJkqWG5BUCQ\/eNOpfLE\/h9tQ9SjLalqcJPRzGXgZYI1BR4dyyce3vg5ptXNqTxEoF1WMkZbXf9mB\/ua48YcqmchatROjvenksYbmI7z3QUu0yeOC1MSUh+FrAvcieT+4pl00fLbkOHc7wAhwAeAqpbzm+PpXYS48G2l1UOegUkaG+pFyUeeCfPHeoH+nicxEQWersdm3Yt7vjH7o\/EMnuh94G9uiWe6PHUn87REp7rNJnxhb3xu3e9530P7XfjVbUpOGYMUU+pXHUL6OUIhAiwWYn4DW\/JLhgF4c7fQAlwLBGLTRQl5zGbzuCrTZhsE+WDmMRFaNsTKt+ti9wqeyELavsPLttTONe\/\/XGy+b3cZV0SwXxQ4XOnTCl1a26lMmHp2sZfHPb7d\/VDPx5Z0oDWrUFPoD9xv4lkIhODSxkM52nZRlP38p7MWkuyasSB7xnrUBfuK1sG4VOjyA+JBHatZK04c9B+G3hnz4pzdffd6+t52EXvyTUgPexjazhfvlZo7t7z2+8QZWRLfwB9ksHV+mREqAphB1QAtZCEFyd0osSJyDbp6TFy5mOfI9OQefB9Z3gS8pYO95GH7oFWi1DCKINYjmmAen2jDW\/OP43K5vPloqeQ4d1O++7SihAaOg\/5l3lQ8hJRYYDzNIDWS6yK+ViKUqQLGQhi4AptnGHJqGnip6yTkwPZ8rCYWQg0KMkXLw37v\/ii1\/xg03OLgBxk5e+9EYY90+IlocYJZFUof9vO9QQpK7qhYKA2BMNwuuAlmEhqeWIV5Km0sEJMtgxSC8+jJkajZfSJnLaWfjiEqWPbi2nPzWLRedefCRRd\/a7eI4UrzdyyG6YLgS750WBINRBOxAhF1oxjCFLj\/B3OGi2vJYOnsyEiGkKQz1wQ9fBROTSI5F6YKiDUnw+3us+dz\/uvL8J\/6XnjzO6+gkbOrndWBcyja5BYLBHNXRmTuRiy2tLlrcywv8hTa+WTfSWwWk1iBzDfTql8NPvA7mmxxmklFFo0ic858ul6O\/ffRVb+w8fWM+ug3rgcDidsonPXFdwlkB9bGJrXj3H9PEfDIqlxKyzDM5AzPTuYlOUxutHu34sd\/\/cPGJg+\/+wI7dr5R\/9Q7L1u3w6u8RBBERRRWxVoKGv7bFzu\/lmQKV50OF9xQCmQL3Sxv3MwapZLHXQBArudPjgUittFsd\/9p91Y+VQu\/FKVnAiklWwk5yubu4WwHETYNrnrJU9QIFaBO4A3JxiGoZbv06fOd+8AERwYtQFvSCgNh6ef2qW\/7IaM5VJ7nixFMuKrmKbfZ2CIEd0eFZMzkZjy6+Ch+WJDhtORLuPljpiofMzeelUGuPMdSilTSVp6aefGlzQS8PXnyp55gcZagLPXbVMrz\/J\/PFvUjpQqJI2t49EoL+4Y2XnDXxXHrmXqTuiRoMNuh9\/\/PxW3I659+8HZ4Cz\/EBNm0vDa8bcGoHTN8AjKyAwuyRw0EDYiNm9+\/93q6v1s2JP5vksDfzX+Bh6HpWAI+yKBDMxzo+MBmRkJKqOigYmJHFkEqT1+d5YVqRDvdtWQsHDsH23Xkmphv21wXIAqxZUetS+TzbOtSrIdzOWID36jP7fstBwdLfmvLs9JuInkwjvGyAl8cJiX7PIwdfpcYgs\/M5a8zpa2Gma0BUVYyR1PumV\/4wGz\/vay994wugxqknM\/Lj71\/7+j5m5mN+6T2BN7\/2SAraOUMhzrjla1c27nn4Ln\/HXV\/UmUkxB\/bB7BG9azWiYoyIyFdqo2e450sE\/0zjI7z37THRqgwfNEIK63KL\/FWgpCpOJHxjYnZD2YEjCBaiDA7K4oZC0wUjyQtS71u7cMimKWzZCOdtgk4KRgjkfPIAGpkDpXmW2XmWBy9E18jyWB7ft\/FNuwfdaiCNLDI9B9dcCm9+dW48FqV2HOBU\/7oUmb\/65NvEoyo\/AFxAxqnHGvsWY6K3iERQLEO9B4IBaw4z5vq3\/hCdn\/rh3\/74ltW\/zm\/dCr\/1QqToVCQ36h8tUzq\/TQpdzdhYjkBUrQj39B7Cu1lE8pvQLDe+0eLA8BRTgy5gEYrA5txpgVYHLjw7dwqnjmQUggbRpAAu3du5667lfPHyWDbAy+PFFfn2A2cDzhqk0YINa+CD74Y0W3zuBqLYdFz2BU\/4Tx+74rzJH4zo98jI1AUXNBjN0GYTZmfy+pPNmx80t3zWpGn5lz74u6V6fTbbt3KljJ555pPn6Oqrw8nkhu6O6SZtl+F8ABs8pN30su8W6OOATUIkKnLY1i5mHHohlbu06xwervd1UpiehZn5w06PqhLFKZqlET3V5U29PJYN8PJ4cRjfBam38wExQkgzpFKCj14P9Qo02932FA0Sxabp3PdA\/t3fXnnBwz9oxnchEs4DSHnKjKygKsZKiOLQeOdV7vcuucS9wNqTVnJ4uUge8B52qBZkMnNjq4toFJaWcpccW++zNje+i7IOWINozu67PJbHS8EAP+lkfS4JqH3sE0ACuoxiOBUghKdultZnS\/HFwIVAUYTM+ZxS8iPXw+lr0Nl5JMrbayROTCvNdno1\/8\/fXH3OV9m61SLHJdorALM0pUB1ac\/Xs8zZU8tYLnodzv4qYp6fY\/JU\/KrPZSPdwA1ysqS0lxJx0PJYHi9VA\/y8LOef8WcZQEzkzCLd5ydXkpb34nM5tY7KV5pcVB1\/rI5yTgckxgiL9IwXH6GBHOByMdArQhYCkQIf\/Vfwyotheg6KRVQDGlua3u9Iy\/GHbn752f8IwM05V\/jxHtw\/xubsX9ilsmgtmFP09PXJumlPa0664Kij5ksWvQxgpHsXNoI4hiheHI2JWEtIO\/YE9BLxPNoIdaENw5yQOZfnD8E6TDe9HKcuj2UD\/IzjQ1xXKyPxQvNBfTPcD3x98RfN7n7a7x90Pfbxwng2vadT6w2GtJvo8kCqx+7B5Q15vOniZOEAtSYHpRQLUKt0qfK6VUhEJIrEp2lbXdYKLqgEfVKP5flAHWgjGO\/RD747B15NTEFkwKniNem0WzOu0\/nt4d\/\/py\/+Uu39\/ayGz87CbH1hHcwCM0953SF4Mcbqv2t\/r\/CyybqN8DjC4UKjPwXrIDrW6FTKh1VQjo1+vXPz6l2mXo91aQjdl1fJSf+9y9uzfHaEeU9RUKNI8\/u93q1staup9xx+ow711fBZ4Inj3H\/V4KUZdULzCR8HPBkB7V6i02MpDZ593pUwp0omzyujJgG0KEhleUcvj2UDzNOLMVjCJwLJFQVSr5GY0AEnCwpH3eZ8EghPzSM7Z6dlwMXh1uH9lVgtikaHOxpax9pfXZJctEtptIE1wJndHl2ZnIUtG9FfvQ6plvOoTgRjrWRimG01\/7m1fdd\/2HPr1x5r3LcDmo3DwuYNYB1w9tAw91fKlBtN\/JbT4NffCzffRrRmQN3uQxJOG8mG3\/+Xryk8NvVnIW3\/hmLGpC9I5kSlAHEKBgNJBJ2nyUaLETTo3sK8fGakMSj5gW8QkHYOAIsXmwANJywuXgCYbQJWiOC8R4oFGPsFGOyHLFtQAVKxVrz30+2p6Q8+8If\/83Nu35RpiVWajaOMcBsgTvBZCtLlUdZOV\/0aomJJXVvFlRrNv7jksuy5eBYLe+90iqdDuJ1FhFXegemKFuW0ndkRMYWnGJkYiXxRPzOyvz\/CoKgFkO6lHplzeRb1KQ1GIuPUX4fzX868scZkzxk4lnhrXYQzUfQuY6P\/7EPmZBm7sjyWDfDTjg1VSiOdrhZJwUKxu2PsggGOCjlZwzMYT4enQYogeXAQQMIRebcjNbllA\/xMYwtwBhC6zC\/6hlfCh38mN765AkhuIESnqFb+\/F3rhv7920Tmn+7z7gf++eAxb8h\/5sl9pG9v1hiqZ1KqiwpiIbXddSBdAywBTPKshnPedAi4bkJUUZ8bgmixMTgJjliBXDwky1PMsGoYhocWG2DEWoIGv\/JHLt9187vfeOCpPmcn8K3Fb4x9C8ZOCtCrWKa04kgHMsRRd64ELIJqBDbh2ViaWibFd\/ffwpzbbiZFnwOrqwl++2PjXzjwvA+V1a\/bs7ybT\/RQz0mSIlzqTFi6EMCFcJRghqqiIRC8l85sy8JWy9U3CGzVp888HfvGVrhpa86\/vHURF\/NW2Ay6uIPhhBngG7hBxxgD5C9mmd\/k8E5VJHPQMTlwxy\/UIn0HwlMT5xtVE4QwmCbnDrn+qzNcEMRIGdIEduqiOCWkENrL9WCemp2qr3tgPiqSpzwHenNCgk\/flhvfLol+psE3ZuYem\/nmPdNfe3zvu09f\/UORwZORiwlc5mEotjhjYMcuuPYn4RfeiZmdR6NYxRgVNJoRDS7131m1uvLtbMvv7Jhz7T\/xuEwQwefBtnPgDQRMLkfp06d7fgKoKNGmVvWdMaYeUMUitgr7gKnFKtKueWylm+fLGTsOpCh+Yf7+8YtQrRzOGuSgKUNwrjT9wPafPn3tD51HQPKVzmEiqRFywJozFjM9D\/\/mPfDm18Bs43ANWHIYtIC\/e9Urzvvqc2kzWth7GTLeoPUHCxYyBEgcpA6cyecqBJ\/vP33miuvprcpbSxqt9ATF5HM+Jfm824Uv861nEsAQRVFj37dx5esuC0Iki+sZx41XE2OUVFWvVAKCmuX9foLWuMT2hE+lKuFk2XVOjERovICZjKK8DIeCsd3LD9g4weLd2VedP\/3XvMJz+zN\/5pN0Dm6++biXaHQCvW8F+B0+\/vss5oPb\/v193gf4mXcL8ZVN2gHERCWYLcDu0D1mxeRqI35ZbeTpDMg0MHG43cLCzBz81\/+5UO5dfOJaE0WXRMXSJVGx1E3BRiTAucBowSCZI55roz\/9VvjAO5BCGfoL+efEMdPTU6Te\/zml6Nb+M87IxrK\/uBf4ucM\/ZGLhYp77fbyT97\/eYusOpxRFigPwJc0\/Lloon\/p216GXE+IlG2APsFu7mRbn4S\/+7thUd7cjRypRqfSzJoq77xyumhwGrf1\/7V1rbBzXdf7OvTOzs8t9kBRFRVJkSZZsWbRUubGD2oJdKhLcOG0A97VK6wQO0DgtChQGUrQojAIliaJA+oqBFv1Rp2ijoohhs0CCBG2RNk3EFrWatIKatFYiC7ZsvSxRosjl7s7z3nv6Y2bJpUhKVESKS2kOsNSSFIfLs\/fOedzzfZ8LQAkBEjZQKALdPcmtwJqFxJCU8CYn\/vL948f\/M\/3RJcGQWnvvT3DkEoAXZ75Rw2JH7De15\/Ere204m0LEhiWk2wucpOQs2WpRjgZXErH5BfcfEbOBJOs3IG5DhJtmjxg4eX+zlteyxEkONcffJoJaptFbAjEzU4kIg51a\/Y63EkjLAq5NAUe\/CwThzBpmZgjLQux5vcd\/788\/fv99H31fsBFaz0cnyDTEFQA80dr2kx7wi4dS0pf6DOmLkMzGcsnEakLH+RNHPrI9WJEWdBVVOYCB2R05CBwFMJY8TWzs6KI\/vw3brCN4V00g6u+GI0LomEFkAzIwhIhnh2MyWcGb37uc679YLi4Yo5jBbLTRRnMMoI+BAUEoC0I0VQNXysBvPQ\/8zAHAD0BTk4aIZAjIBvOJEPRHhUs\/HB09fFh\/NYXDDGNo7n03XQuzdhSLZZcNNKiIIj+MfjeAlhawKkNYc6zUtWh8Z2O0NjFf34UwaRUcAFAkQBwDXnMOEccMBZUUBEbjdt7yoUV8Prv\/Fvc5AOzCLjqFU+zB2DloRK0hLJ6lhb4Vkg3DsWa+fcx3WvlmwXdZQqUgwEy+feFfPrbcF9+1YXCbspwzbRuT0EHDqN9P9irgOsAPzwAvfWFBeI0Q4gGZc7+YAODlTJ680A6QaVUNSjHmdg7IdyXzLW2kL7aTQxBPviHLQRXARTAvv47bKEbn9h\/GFny6qB3AAQMcYRs73ogQveki9zADiBGxK2Hu0xDnDUgRYCOdKgWDs7bU0qA0xiy4kAigGJA2Egq\/rZYEhRGiIAQe3wf82i8B2zeDpqaZhADbjjUdx80meNSz8fK3ntj7\/VbPEESchMkRtdhaWOKe4QP4tApBc2BItFowpBuLq0tapHijOQ9a5MUz0+0fZvPIDXy+FPcfxVEiED+B7cvkc5KUQYA7Mj\/fVxnstnY2mr7vUz6fv60kqVZbLyqVK6Z+TpaxFoaeGIAlgVzXoi0C1kabVpXHi3MiaCSsa4lug064x70m4HmzCTbBmFgJAk3ncq7pWCasVM6QPo+\/PlZF9UMPovxzDPy6vGINupGUB8oxxh2jTrMW56y88KkftqpDmjDl88uS5Fu9pbXu2BsB7JQCJW0Q16ZhPrAe9MnngGeeAhnDNDUN5FzyjUZDxd9pAH8Ra\/GVsZ\/c00gCb9J5zDybWWadn5s\/WBurjx7Hsh7YPtB\/qNHJf7S6HtfvB\/OPUDjB9UvHsWZQ7LSEClikTRrbBtw84KqZIyY2DOk4CJtxMQgD0elUlJxCKyIArwF47SX12cFoQn3WTOLZLSW3uLmicNVV5h1Z4PdkXtR0SNAN2NoHsUmne7Os+WaBl5EMa+2QAusNw0w3EBbywC98FPSJj4HW9zLVm4CUFOVymNbxmSbR3zUiHHnj0N6326vezLOZZbYG9DHZgJl7j296+l93LNMkNIOIwGwSxGLHtS04DZJ7AVhCgD0f2PcQ8Pyzc4Mwg4VlUex5py79+\/Hfv\/Jf37vIbAT04vc31QrsrAFWQBwBTS+BGkZIz4AlR2xIazNVuiwnWmMSHYuna1XCr6Mqqhg1hC+OgTD2u+aF7Y1adBg1+mRPwd67vyywp0vhvOPqt9nFuIpFqJsktQeL45lRniw6zGZsrcDbTYStgrBBG8jpJiLXAQ4+Dqo+w\/TQ\/UxeQGgGFDkO6nF8qcn4yrRw\/ubY\/l3\/jUQgvsXCn7k3s8zWFAstOYLk4PLHyM6dgiYA65BC6bQBukvAT+wD6s0ZRIhhhmXb0Kyn9r34iW+PEF1cyrVPtn\/ypWPAl0buCjEGPpyeKVdRlWDgD\/BXZ0D4wyEe\/NPY237I98Rzlo1ndpes\/l1FYNwlnLEdfc6UMaV8MsoT0gSw0qoYoHsqGFPbQFCcHlT2ksAWAP1xDOmHiIoFqIOPM\/3sIYiHH2ChtTDNgDwwGmzONmL9T74xr0317f2Pk3soyqrezDJb+2ZY6ZW55XTuOeCMwgkhQTY0vKRaFbPDUmzbUHFsvfX1N8pA9TIGBwhjJ28BBwyg+jrmA5SqGKiuEA54pa013DWEIQE+KkYwpoCxbwD4xm\/Gv9qnr+mfEtfw85W8OfhE0e55rMvC+46Nd50uvqBjPa08MsonaSKywAlv76IqLms\/4LaCrkpBpnkibCZgY6zRHXgAM+KNfaw+\/iiLp\/fD2rlVMBHiIKJ6HEWeEG82QP\/osfja8a7gBB57LJ4TeLPgm9ndUw7eo2u5cwkzVvL+SO1ETkLMPlpwQCEgLGFy5bwGRjWO3rjYGF3oC6N0d8oRpq1pA4CqqAoA+AJeuQrCl8H48ov+ZzaEvjloX1M\/3e\/iqU1dcqspFK2rThHncjEu6ACTytOhDhkmJMmGJIjEDJP+2mKZvj7g6pT1ShAhT0DFMPpjhZ4w4hwbmO4yxx\/aDXryUbI+\/GOEDX0UxzGmpuu6CbznSfEdX+Kfa5Yee+vxR87MGdJdtSErNpwAcA3aiBTnsNqAF+htpHIS1GG7nxaYlE78Kjvo1abLiU2isETz\/N56toDfO8\/nC2BNKJnWF8wslsM\/i69J7tw1ea+exS0yVEVETMyC7lAVv5Y5VblVFTNAo1wVb2KARzByGcCr0Hj1c83P5WWz9ogjwif78vzU+jwe2ePmtoS5kpxwgMsc4qrxUVMeAh2y5tgQJ7BHAVCib7PwHByvlq5p2+82lOj6MSUaszYDJWO4EsXojWOUleacY4P6e8k8tIP0h\/cA+3YTPvgBeGD4Da\/pXb121gdONC3r36Ys69iZzYXTuO8+vzMC74wHijk4IkYsCARHEOwUDz5DxEF2mzYtX6dgxKuSULUTpWoAhtO2FwtIywFsG5EUMxmFULEWIL9D9leXA1saGImWz6nN50SJz8lKO448F66lTUf4nGd8DgjLgbje52wgAM+uTd\/iy+V5\/nFE+5okQHSefzJVuISJj+P2NREhFiIheOJU+csoz9G2QRaAlyrB1grGTKM4LEYBvIyXfQDHYHAMTfzxp5qf6toMe2fRDfb1FLBvm4s9gVXY0ZT5jU2LCg0yssYx6iaCZ0L4JoYyCgoGhplT9vk2fGQL8jonpaUlKsguqjnL13OX0mxWTQwmZkhjkDcGeaVR0holY6gkJPL5HMkNfeBtm6F376Bw9w7E2zYjLOU5FLLmh+Gl4NrkaY\/5e4EQJ6YLzv9d9PJn8VTCzDILSU2D7u0FXgFUb9EFA4yky5H+3m0R471f9hEWAaPec7HllKbnJpm51s4EbhQMGxQgZJ4T+hkWQnJ3uWI7Vt6m1aFLs5HQeZ4EwIKAUpmkkg37auDHYaQbeRloYhBgeoHvbmP++1ce\/bperUZMi1XLAC8G8PsUjLom0X3c0GcaYKuGVBxJCIAVDGs4LESJpZWyPJAp5sp2PteVo9U7C2QAP2hJb5ZKJITj21eCBgfKTBdEoAUbZlAJ5q0dRK92+eX6UtrRLblGgvjtANEGBaUmBRWPM16Y1sjV0CqnRbomNXIsRLHdPyW3bLtOMUcZhd+dDsBvpTovqJQh3FJkX\/HqiJSp5zmMLaEAFnnQ2e2E0bygyyt9RHG3LwCqoioGME7AATNCI\/PSziFUnZLbtQElbNE5a6tv0\/11wfc3obc0WW9usOoPWXVHMFYMhoJBzAaKDTRraDAMJ4+WqhzP6LO3Ybh5lhimHdtNc\/8DiBPwFBmGBCCZYRuGAyBHBFcIuJaEm3PgFLsgeypAfy\/Upn5Emzcg3NSn4o39XlQpTivXGQ8UXwiC4Ezo+acDw6fr0rw7kStdxJO76\/N5IO6WMzHRmv0HzkbrenwUXHHn13qAhIIyQMJbPWNXJgzOTjC6DaOikyzb5Bl8eRr79\/tr2ucg4G1VyTsodUerp5Qyz+cNz+DUeUYeQL+jE22vLqAcNLH7ur2wov4RwLW44k6g3COyRvSqrgnPZ\/zgnEEeQFkbuIaBLsCbCvCRH59aje7mXZ8EDWGIgKPJbhg6YEZGRsyNWNue2\/tSd6C8vph5neGgP2K1PjTUp6HWxVJ2axNXNEddvpRlwdpio8oGbCV0\/VwyYCcRTSQhBAk2TBIsbSIBAmRSRgtJEBYJyJyjJADLdgwcaUTe1VahYGSxoFEseKqnHMTruhX1dnthX6UedVdqutQ1FRWciZhxJTR8KazXxn0\/uFy76l3B9MQkXni20TrDa\/\/bMDRMGB7mFQi6BIC3bzr0oEXuTo0oFce7MTxRwiFN4bl3zn\/zf9t7yVVUZfukYRWvm2EM07zaZH7VyGsYLbaqNoQh8TBOUtv8JgPDPNfvI62P95zP7zH\/ZJYF4JUNyidxkgYwThg8gIQv94BJB76WeJVUpEVrAmDhNAT+4X\/yEHW7r86WxcrhiiW0YSsHlS8pYcMGWBNFLuVhw5W2RdRdNgoAlcsc9nTpsJIzynWhc7Yyvag3k46mhocAk9MBTp8L8eqfhXjllfhmsjIYXrGAi7n0w4PWGMbUjg8+\/Xlb5n9H6eimUycMhpQO4tj723cufvPTrWssA+s8ra3deDdM5PLawvrd8Y4PUxaGszUBZMLWLf7cWWePjbUz56Y37yGqptnu+OA4AQdmSO370c8DGOVhTlhDRfLGtVj5Q+BHEgH60aagmZNDpeE0C58Ntq0FxRgZuZPnib42sTasbiqizoCCIYuIvQxisvbJlrLUPvNPZlkAXiY+\/hEencNoP7bAcMZCMZHnPx0evr2t1wqq7ZdNKyeaDTbJv3cw2GJBoD\/bthDSEMmb4y5YChJQTHa27DLLLLOsBZ1ZZrdzBtx\/cIPj5PpjxFjaxLANg\/Da6fPfutApZ6GZZZZZZplllllmmWWW2V1k\/w8Yp4OGEbUtZwAAAABJRU5ErkJggg==\" alt=\"Social Hackers Lab\">\r\n        <div class=\"sep\"><\/div>\r\n        <img decoding=\"async\" class=\"amp-logo\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0UAAACGCAYAAAASEyEyAAAACXBIWXMAAC4jAAAuIwF4pT92AAAgAElEQVR4nO2dXWwkWZbXw721DbPDKKOxKEB2YvdIaB\/ywW6vQMBLZe0DCPkhvQ9IvDlLWglphVRZ0j7svmy7eOGNcr2wCCGcJSEhEFKnBUZCg6jMFQMSu+POXJTDfDBbNumaD8+ayWSWmaa7qxId18nqcDpufNyvuDfi\/5NSM122I25G3I\/zv+fcc1bm83lgm5PT1e0gCMLl2+7uXPWtNwYAAAAApSKsN5rL32c6GcPGqCBhvUH25vbyN0d\/AMsYE0Unp6vUCZvcEZssgrYy\/vl5EARnQRAM+dPf3bk6s\/X2VroX0bYvBNy9hD8Z0PiKtnfeXp\/aaq9uVroX15PHvL0+NH2vsN5ImpSG08m4Y7oNLsIL+iZ\/4ib0M\/687XfTydj5PidanGKYTidj4\/3PJGG9sXh\/aZxNJ2Ol+S3HvQolqxES1huxG2eufZ28fTTOUHcA5f5XJNz3m5E1O4udMeD5k\/pjv+jvn2NetI13fYP7w17EfsvaHxb2W6\/otVShPzi5bjrcv5cZahVF7AFq8+SUVQBl5ZwnsN7uzlVP87UXQkBn20dBEHSpvfP2ujeTCj8Hes578\/a68V2UsN5I6oCD6WTsohGhHTYCVfsfjZEeL\/Lax4gO2Ch8nvFSD6aTcdfF75EGv08aP7UMv\/54OhkfKN6P\/v5DLY03yHQyXsn4ffopG1EukHt+SpnvimYQMQqd3kFnI6vNH13r9WFRBnHOebEIRhEB6dzaYqA\/HHNfKGT9UegPTtpMHvTvBffvqF7h5HR1M9IZN7Q17TZ07X36nJyuztj4O9zduVJSxSvdC2p3x4CIo+s9oc9K94IWm+68ve60gRcRRFkMOaAIT+QdjWOHrvGQPmG9MWNRfujxLvBRWG8EvgmjnIIIAFe4xx+aP84j84czHmj2AizmTJ3ji9brI\/q+Yb1x6Nr3doAt\/ji1tnB\/OGDbUCct+iz6AvpDdXhH9puenK42T05XaWC84B1Kk4JomRoPgo9PTlf71Ja8F1jpXnRWuhdnPBHqFkTL0EJzRPdjEeYcK92LTRhydiAxxDv7ZwbHTo0F0ouw3ujy4uEjJIycHDNxQBCBkrDBc9NZWG8UHsIcmTOHPK+ZGl+1yPdW8t6WmOjacsCbe1bh\/nDI9qduQRSl5tI4AObJLYrIM0RChF1hJjtjVkhwPM8qjla6F00WQ08sC7mA70fiaEjtsHxvIXyGqgdDzjxs4C\/EkK3nvb9YwIr87gp4IYwgiEAJob78JKw3hty\/rcOhN0PLc+a1MRzWG2dFfW9PoHcytHlWLqw39ngNfWjxERU+DoAdMosiSpxwcrq6UOYuxnpHxdGtXXEy\/Fe6Fz0Wc7bF0DLkmXq+0r04ZEFSNIcWvGWVhne2euyZLMpo\/tDjSd1pYQRBBEoOrQ99NkitwRs5Ra7ZdN+P4SVIhJ7RcxvzM3uHPipwnl2MA2+iF0A+Momik9PVIpS5LCSOhienq28nMT4rM+Q4UZeg59lfZHsrAgojdMTjV1rYYHal\/xVi3GjCSWEEQQQqAvXvjywZv7SJ1HUoecgTbg8QY2x+5v7Qd8QGrfF3RX8oIYmiiL1D3YKVuQzXrk7yGq38i2\/\/Bu30OOAdErHFwsh6OB2fI0LctEEiBrNM\/5txRqhnlKFs6fOMf3YucV1rxo0BnBJGEESgghyZDJfiMyp9Bzfr9skwL+IMjUdon58j\/cG1CKV9CKPyIcw+xyFoPZ\/Dqv7Ji79z7yt\/8ujeT9\/9nSB4Z92BFgmpcTjdA8sZ6row5swhaTAfR9JqZ8rsw4tGk2sz7OW4n5fZ3VxpNwQRqDA96v+6s49FDGBX7Y57vG766Gm3BWXwG+qol+NBf9jntQjhdCUh1lPE9YaGngui4Os\/\/nZwJ\/h58N6nvx0En\/8XB1qVypGt7HQcNud6HRBv4WxvWQ3mGXuB3ptOxntk7OcxNihVKNWOoIl5OhnTIvIghwfJ6K6vQQr1GEEQgYpTY3GgGx\/Ot7bgIUikxu9RBz5szO\/zWSdQAm6JopPT1TaHm3m72C8EUZT3Pv9dn4SR0V0oTu6AsDmzZM3m9zQIgk0q3qmrDgKLKhJlj1hwpdHzNGV3IcIIggiAa+7pHH+cVMGX8637SL6QiHLfYKHhy8btQ0\/P6YIlbogiFkRHPj+kf32xd0sQLbgWRp\/9syKalZeu4eQLBzDozMGLe9ruFomV+9PJuGOqKNx0MqZFZZurkSdhatfXBlaFEQQRADfQsrnG48qVpApZeYL0zIlI9w0WGD4k9oricz1AwLwVRWUQRH\/0078SfPT9HyT+znuvBj54jMjg6plI183JFXybbLwh4+I+Yu9Q3\/T34jC8JidmSELrrq9lrAgjCCIAbrGhaez1PH20CKMTsyHjPeFzRD4+V583FwFzLYr4DJH3MZG\/\/Z0\/e32GKA1PQuk2DA0whM2ZJW0ckSBqmvIOxcFnjtqcrS6JQ48zKxkVRhBEAAhRCiNjz7qJ7LAjnvMGCpk609hCGF0iMnOyqUgWG\/3hHsLo\/OYOZ5nzfrH\/rW\/93eDdV9\/M\/PskjH7yzl9yPStdi84XzdvrWnbR2POEmkSG4IQFSTHQFDLXtimIltjjBCoiA6TGBo6vwtlIVrqSC6IBfzfXkM1cJXsGIW3DIA7l7Fo5kGlfFrY19GsSBpsymeh4E0aXqDhnj1MvyQvP8\/QeG+w6xvQBJV4oaF6fGeyHOvpGrtp8HH6mK5Jl0R+6SZnwDPSHQ489n65xbtn7dnZHY0coDAqbe\/l\/sguiBV\/59B8EP\/1TT4Ng5Usuf73Dle5Ff95e1zHhYkfLLGli4kBHmlJZaNFmb8rzhEu0PfcmahVGFfAQUep35943nbWT+buw3phL3s\/pDIwm28dGoWrWtz3JaJOOhrFFwqCTdcyzYKJPh708qp6JIjeThob7xh5\/L+m+Qf0rR6i4jmd4zmttrv7AHsuOhj55HVLqYakLFzmzvT4lFm\/1hd\/5npy35zrU7lPnowY3NIoZ5NI3BO9wJe1SjzjxQaHwApB0vkjXGYEi0RJKh5A5UAVoTphOxttcI02W3Ia5Ji\/RgM9nShmgOZLRpFHKDUcq9cDvVuX5ZOobvIaqRrJQH96W6Q8cZn6gqT\/gmIKneC+K\/uMPd4OVT78n\/ffvzb8ZBJ+rrAVW6KgmXeA03ybitsEb0hZFlxbNtAm7DDHRSsIIgghUkLbCOQuZrFtNxfH1jLwkqmFrFPbHojAtGU0StRJsJsXCz7eZsbxDHFkz9Kk+v2dc50+5P2gQghue1v+rPN6Lou4P31W+xlc+PwmC11da2mOImgajGl4isyQJiXMbmeaywpN+kgHQ8jjhQhQpYQRBBKoIG5OyO9wy4VUq6awHnDxGJx1FQ7i0B+y5b8iGg2VdS1Te57HO\/hARgirJGGBzeYjXoojOEql4iRZch9F99k91NcsU0qKIvUy5DjyC7LDbP8kL52KMZtoCV5ZdrlzCCIIIVBybB8RlRdHMhMHJhvCegkekLJtJImT7RqoXkedd2UgW0\/1BFmSh8xCvRdE\/+l9f1Xat6zC619\/Rdj0D1Fa6F7IDH25cs6Q9X+cy0bDnKmnxL1OfySSMIIhA1WFDUGp3XCJcSFZAHMpkussCX1dlE6u0a61CtEMWsaPy3EwWQB8qhFXWUNzXP7wWRT\/62Q+1Xu\/dT39X6\/UMILvzgB0LsyRNfOemFnANJC1yZZvME4URBBEAb7E1X8nMMTMLnneV68MIlkNWFJ1byPKmkjQBG9Ke4a0oogQLf3r+E63X\/HLwx64XdW1JJlzAwDRL0kJYWAruDCS1rYyLe6wwgiAC4AYySROIvLv1MuOtZ7oeEF9f1jtQ2rWWw8RNIbveGI\/C4E1N2TphEMme4a0o6l39GSPXfefVvzdyXY3kmnRXuhdp512AOklC1WVRlOQpKqtAuCGMIIgA+AI+EyO1XliqwWYrFFk2VMykcCgaWQM\/S\/IKWRvFVi0gY+epgFt4K4p+\/ImZzaLa\/Nz1s0V5d6LgJTJPUuYlV0PnUnEsHlr28HMc18IIggiAW1gJtVZIV2wri6fJ8zO+IpvsKdFYU\/FAWSyGLnsfeIo8w1tR9O6rH5i7+KvfM3dtdfIOMuxUFIuzoijDwVmXMinRovRU4\/WONAuikeb2AWAV9hLJnqdRLXaZhZnp0LkFDp8DLQQWsUnFyZNIe5ayNopsSFtuFJJMYMPNM7wURXSeyCRfefXfgmD+86K\/poi8ExM8RaAUTCfjjmKBxWV0CqKmxJkKAJyABZHKJoGNHXvbocgqNWpKA3vUVcIWXQ4hB+AGtkURKftHQRB8sLtztRL9BEHwfhAED6gIV9pF\/uBPzJwnWnBdt+jVx8v\/TOE7j6nt8\/Y6tfcD\/m+dYT2ZWOle5PEWwVMESgMX6NMpjFS5FkS2drAB0AmJIT5jN5QswLog7066D2FFlfYWkRgK6w06s\/Ox4gaSM4XLAUjjjqUnRGKovbtzJZxk+Gc0ALsnp6ubnAZxP+53p5+vGG3sNVS3KPgbi\/+iHaPmvL3+tv3z9jotIsOV7kWvgHMJecKakGQBlAoSRmG9EYjmB4uUQRC1Fc535GY6GcNzLUFYb5gwLENFIRQlb\/vKXOTUJvfCemPucPtmFs\/9gPKxbWjuE9ExLYrIi9LZ3bnKlSGEBVL75HS1y27bG4Lj4pP\/F5iWRRRC99Nf\/PXFf7ajgigKiaOV7kWHzyjYIpP3J6dHCQBvcEAYlcVDtIGNEy+QPc9hgwHO4AABzhUuB15Rszz3hSbD50gQNfMKoii7O1d9FgA3DnG+ev25znbGch1C9\/qCfjSYt9cTleq8vd61HEaXNSQOu3GgtBQYSoeQOQC+wFZaZOAf6BvAK0yJooUgUnab7u5cTfkQs\/WzO8HrbwU5wgLgIgbAMgUIIwgiAL7gfDoZyxi+iGIoPwOFrG0AFIKp8LkDHYJoAQmjk9NVqp\/wXNc1MzG\/jgjIOqj7DoY4wFNUPFbPbFQRi6F0EEQA3KQt+TywNpWfg6o\/AOAfJkTRYHfnSrbWgRAKpTs5XaU6IA91X1vI6x9bu5UhsBtXPEUnA6gEFoQRBBEAN3kKTwAQcIy+AXzERPicyd0BqzsP711noHOSrJ4HpOMGlcFgKB0EEQA3GcETAATMFDyIABSKblE04uQIRuDzRS7VKCmKeyvdi8TwA\/75XqmfAgBLGBBGEEQA3GSGMQESQN8A3qJbFNlIv2g1xePml\/75bsZftT0JpIUodizXTgLACTQKIwgiAG6ia0wgtLucPEBdIuAzus8U2YghtRqnOn\/98y9l\/FXbE8H+Svc6ZXhn3l5\/u0Cxh4gE0YeW2wOAM2g4YwRBBMBNqAj7nqYxgQ27cjHjvoFzRMBrdIsi48KAQujmp22q4Gy6fmteiiheRwbf3kr3os\/PfpvPG2HBAZVHQRhBEAHwBWTwHkwnY+0JlEApILHcRgFfUAa0iiI+82OceRC8MphOXIp5e\/2MPTe2IQHU4g9wj1EBoZV5cLlSvjISwgiCCIA3zDhM+xDjAcRwzmIZBVpBaXBKWGTlX+3826\/bM+b+8N8EwT\/M+suDshuZIDcdl0MKwnpj7kAzjJJDGEEQAfBmHJCh28VYADEMuG9ADIHSoVUUnZyuhpa8Ra4e0nSxgCsAlSeDMIIgAlVlxOHXtH71EQYFIsy4byw+6B+g1Oj2FG2bToRAwsvhMzN9JDgAwE0ShFGVBdHj6WSMejPuc3+phRTWtqWx1R1b\/T+sNxLLSYBcDKaTcda6hQD4hvX+rTslt43GOzsBzNvrfd5ZAQA4SEy6bniIgPNQCG70w+vgSFO7SVz1LYoVpOMGADiJblFko1io1YKkEsVordZRAgDkIyKMIIiAl3CfbfJhdx3YFkY+gGcBQMXQLYq2Tk5XjXlyTk5XNxXqjtgCaUsBcBwSRtPJeBuCCPgK9909jdEJtoSR7JkU2x4mneGJAAAP0C2KCJPx6bZj3wd5\/2DeXh9qDGsAAAAAYplOxkP2GOkURkY39hQO6ls7SwyPmVVkN6asJbUK6w2EfFYEE6Lo3snpakf3RdkDZdtLJDt5w1sEAADAOAaE0X5YbziZbjmsN2ydKZa9D84U54T7rxQWxYrsfXJvrINiMSGKiCcnp6vaOiuHzRVxVkdqsM7b612Nsd4AAACAEA+FkayxaOtMsex9pA38iiNrL9kSybL9AeHZnmFKFBF9HcIoIoiKSMOtkl5cu7cMAAAAiMMzYSQbhdHW3I5bcOgcRJFdZPuDcTsrrDfIBm1J\/jn6g2eYFEU1FkbSnZZD5oYFHXic7e5cSXfoeXu9B9cpAAAAW3gkjGQ3HGthvWFaGHUUNmGN1mksMbLPbcNCSKVKf0N\/8AyToijgiYVC6fp5stKRd+jkdJUm4ucFFmrVEa7XRowxAAAAWxgSRrrPyaoYi4emEiHwdVW8DzCC5VCxt4yFebKXSLYg\/4xrigGPMC2KFlCWkOcnp6tD8hzFhdWxEGqfnK7S4HjhQOpt5c48b6+fFZAxDwAAQIVhYaTTo\/JQp4eGM9DJZmmtGTSEVUL1R0jxLwf3V9lzRRsGwzxVxBoEkYfYEkULKAzuSRAEH5+crs6jHxZCRwqxmzqZ6UrsMG+vHy5V0AcAAACMMp2MaQ17oPEeR5pD11QM2ZZuQ5ivp5LmGVln1VCxufZ1h1Vyf1A5uuFkBkeQjG1R5Au93Z0rnTs+HdQuAgAAYJPpZNx1WBipGo3X551UQ+no79kAVolO0baRWmFUReWRjjBP7g99xf5wzpsSwDMgiuLRqvDn7fUpx3hDGAEAALCGq8KIQ81UoyjIcB3KHrYP6409TuakGq5\/iNA5NTik8ljxMhTmqdIf2pwJT7UwLLxEnnKn6g8ghtHuzpX2WFASRivdiybHmRaRTQ8AAJZphvWGtXOP08kYZywLgIRRWG8EHKKuAxJGC8GlwoEGQbJBZ5bDemPE3oY+G9ix8OH5Jkdw6FiLZwid08ahhiMUW9wfBixOekmClfvDHveHDQ1fpMj+sGlzPqfnmzTWNGD9+0AU3cZYZ4YwAgA4xj0Nu6J5gCgqCEPC6EwlwxYZVGG98ZR2+DW0Z2vx3cJ645x3\/KfsCaLkThRmt6nJ8I0CL5EmqC+F9cYzTYm2FnPbUUx\/WHiStg1kOD4osD9sKGTLk6GvUGMqC9a\/D8LnbnK+u3Nl1O0ZCaVTdRMDAAAAmTEQStcL6w3VIu0HBkpXbLBB3GKjqsX\/rVsQncNLpB0b\/WEhmHQLIspAiP7gMRBFNzFeLTtgYTRvr5O79pGN++WEJqNH8\/Y60kkCAEDJ0CyMrou0qwgj3lW3svYaoA0vkV44HMtXj7Kv\/RgwEEVfMDBxligJTtf9gUMJGCgGd5vbBQAAoISwMNJVKmIhjDZlL8CZup569qQfozinGdjb4ls0zSOutwQ8BqLoDbOiFP68vT6ct9e3eedOt8s4KxQC8GDeXm9ywVkAAAAlZjoZtzULI2lRFLxpj0+lKwZIGmKctkf94RnC5soBRNEbDnZ3rgoVA\/P2epcXlccKlZ3zshBDm3x\/AAAAFUGzMNKBD6UrRpytDBiEwxKbBW4WZ2XE4wiUAGSfexM254TC5yQMtPt0sNK9aPPEq5qeMg5yS3fn7XXXi4uFsvUGNHBmONUkAAAUDhl0nJVOR8YvJcgQ5jnf1QytJIiaOEdkh6X+oDspgg5GkUx2oARUXRTNXN3xYc9Nd6V7EXIbm5w+UmahGHEaShJBfRZfPnBdb6Cgdj5G+mAAQBWAMMoEBFEB0DkdTuTRc6w\/kIe1g\/5QLu5wcauOoyrcNM3dnSunOzQLmG60QjLXOgpZJIkgETRFFjkAAABpOCqMDl1oD58ZQYhUQXA9qybbQSaiZ\/LyGGfKyskdOktzcrrqsnvSFA92d668zBQSETquh78BAADwBNeEER22D+uNPoujIuyTGafdxlpbMNwf9sJ6o8NRHEX0h3PuD9hsLinXiRZYHFRpF+SB6SKtAAAAgG+wR2TgSrM5ffhmAQkh6H6bEERuwVnetgvoo5QyfhuCqNy8PVO0u3PVOzldpbTQRyX\/zhBES1y21pq86GzyZEOheZ27xy+Rcx8AAKrHnktneiJeoy57Ce4ZvB2JoQMk2nEXfjdNDqlDfwDauJFogcTCyelqUKCr2jSVF0SXrbWQkzYsPqJFL7TcNAAAAA7garID3qVvcqHYDke46LBVzjkc\/RDGrz9E+sM294c9jf3h+iw3+kO1uJV9joXRsIRnjCoriFgItVkEuXBIEVSXM87slxcfFibZsAod4RgI6XiDTN+yievte0tEGHUy\/om1McqGKrWrw21cfLJ6DGacjIjGTY8ynBluchplnheNw+\/v+ghIWG9Es\/VWrT\/YJmv\/8+b7rMzn89ifnJyubjqYAlGGGWeZq1wo2GVrbY8nChkhdP\/u8UsYWgAAALwhrDdSM7MijXJ1YK\/iZsIXRn8AbxGKouCNMAo5XvOhp4+MDuLtuZ52WzeXrbU2v7cNhUtDFAEAAAAAgEqQWLyVxUTn5HR1kRJTxci2CXmHDnZ3rg6r1I01iSEAAAAAAAAqxTtZvixlpmN39FMPHs4xtbVKgojC5C5ba2ecORCCCAAAAAAAgBwkhs\/FwWeNDhypMh1lwN6hyoR8XbbWNjlDiol0lAifAwAAAAAAlSCTpyjK7s7V2e7OFYVpvV9AMbU4SAzd3925alZMEHU4W4rJ\/PwAAAAAAACUntyeomXYc9Tmj83QLQrlOySRZvGehcPptXsWxBA8RQAAAAAAoBIoi6IoJ6er+i6Wwu7O1Yqte7nCZWutyYLIRv0oiCIAAAAAAFAJcofPgWLgzHLPS1ZQFwAAAAAAgMJJTMldJTgsbZs\/IX\/15tIjOItU8KXzPGd3j18aLwp72VrrOpjYAgAAAAAAgFJQWVHEmdv2WPhsZzwPdescz2Vrjf5nFAQBhZr17x6\/7GluJwQRAAAAAAAABqmUKIoIIQpF29J46S3+PGSRRLWSuqoCCYIIAAAAAAAA81RCFHGCAkph3bJ0S7pP67K1ds51hA7vHr+c5rkABBEAAAAAAAB2KHWiBRJDl621PicosCWIolBI3od09uiytXbA55ZSgSACAAAAAADAHqUURRQmFxFDLhQ3rUXEUSfpFy9ba4cQRAAAAAAAANijdKKIPDJBELxwRAwtQ+LoyWVrbXjZWtte\/iGn3X5YeCsBAAAAAACoEKURRSQySGywR8Z1KCnDxyzg3rY\/CIIjD9oOAAAAAABAqShFogX2sBx6WNj0Q04C0eaU3gAAAAAAAADLeC+K+AyOzyFn9zjcDwAAAAAAAFAAXosiZGkDAAAAAAAAqOLtmSIIIgAAAAAAAIAO7vS++20609LUcbEXf\/z3rbyUX\/nafwh+8NkPcguid98JgtVf+NxMowAAAAAAAABecocFkZaMbd\/54c+MP4O\/+Qf\/NfjkWz8KPpFwcn35nXmw+gtGmgUAAAAAAADwFK\/C5371v38j+PK3XjrQEgAAAAAAAEBZ8CbRwgff\/6OgNkKSNgvMOD34Wem\/KQAAAAAAqDyBL6Jo7f\/+JPjq4OPgtQNtKSkkhHpU6+nu8cuhq18xrDc2gyDYjPzTdDoZF97esN6gwrth5J+stCusN+ie20v\/PJxOxlPT9xa0p7D3E9Yby+citT+H5XtMJ2OttcUE71Ma3e2LtFPLGdQgoY0xY0qVs+lknLjRE9N\/E9souAbVnOtQWLrpcWj6Xrr7I+PS\/KSC9NymuR2p\/VqVuH4gM7ek9Cfj\/SJpTon7PprfU5Clz+h61nlIeC9a+lbMc9d1XSPzk\/Oi6JdefRb81edfD16\/mjvQmtIx46K3JIYKWajS4IV\/j8++3SrOG9Yb9D8DFnVdlYk1rDf6XDcqymA6GacZgYfLfxfWGw+mk3FXti0Z2hqyR29r6Uf3CywE3F4+n2j6OfA94jJRKj8HXhQ73P82Yn5O\/3O+2FDQMNHTBP9c8Rpv4fYdc9tUn8XCAF\/ub6qsCP7+1phS5HEQBAcpl7jVfxlRG+Oe0RH\/Z5\/EoylDz9K9tPZHxqn5SYWw3phF1p0838lUOw50CSTe+Gjzuiua+0aR75\/lvmFCf8oyPqWJrJdxBf4HgmRjWt9Twn2i3BpzYb3xbDoZtzW2I\/WejNQ74We9sNti5\/BIn+1NJ+Oe5narcN\/5M0V\/7Zt\/GATTTxxoSel4Srsgd49fHrgoiMJ6Yy+sN8544W8JJrMFNPCe0A5EWG8Ym1hzcsSGi3YSBJGLGHsOgVgQqV5zk6\/7ggtD3zIKImzw77ygv2Eh5RI0dp6T4Od+k\/dZbEfGoQ\/9rRCWRErAz0rqmachuJfRjQcQS43nHhpfhwU+okU7Xqi2g8d7n43N\/ZS5b4tFw\/V90\/o6C6dngh93TIyVCO0EG8IVm0HEPq9HzsP21xnbY0mbWos++xGtLzqjD1RxWhR9dfojnCPSDyn0+3ePX3Yc9g7RBPBRyoQcBw20D8N6Y+iIcapdEHgmiBYYEUaGBBHtbg0lr0t\/M+RruMY93jTIHG7A7+xjiXFYReL695aB8I5AcK9W1V9AwTzkdcekYZ8F6XZExruMh\/ZhxvlFJEBq7Ik2hejaA9PhaZpwWhjxRuKQRXLSBnYcGw5sLLzFaVG09Z9\/34FWlIoRe4ecnARoIueBpWrobrFxasIgycuRrl0QTwXRAq3CyJAgarMYzzupR6nx7pfJcAdZqG29LAYTj50j6TsBUD22OCSoaHJ7Dnk+VR3vNfaOCue+IrxF3B7Rxo7rXqIoTgojXiuGGuwSJzYWnBVFlG0OYXNaoYmo6ap3iOlpNPgXE7QNj1HaRNVTFWgZBdEzx3e9tAgjg4JIpwgwGjaowEZaf+W+5oJxB4Bv3HMkhLsV1huZPC+8Q69rPq3x3Je03tn2Fonu54uXKIpTwojfs+isloS\/2ocAAA8vSURBVAyFbyw4mWiBkiu8\/3vDAKkVtPHs7vFLFw20t\/DEnMVtP4j8\/7Tfr\/EAyypIujGHgFMPkFIiAT54KjKqa5HD0LkzFuUQRE6\/Y4YWzEA2+YIhQZTVK3Ie6Q\/bGRYC+q5DDRn4ziVS5CeNjRb3RZFB0EkJmZvxzmARDCTvmeX5xY1\/oPf9u7gpN8rZrjBlLiaPx6FE4ou8fXszZZwe0HyZ1A4O9X2Y4V55577rDcm4e5O3iJIHCOZx2WcXiyEvUd7+skDXnLnPa2ih6z3bJd2MgmjRt9PGTsAbC9QHZAWy0vzkpCj6le\/9j2D+ORJwa2JkOFZXGQ4vS5qYzzmzzi1Dmif1g4SBtkU7d9PJOHUCVMmSZlgYpXnQfBFEC6SEkQlBxKS143FchiUWU52UNnU1nCvpZum\/S20LOYObqG3tBAGQ1JceTSfjwmK\/M2SCVLn2GeqzZWJo8j0UQCevx4AjEETzco3HUK5xIvNMee3sCQzTGmcAi53fIkZtEqK5r8nrrmjzpcbXFp2vPBDMTQtvkS5vmwkvUe7+YgAXhFFaNtIBZz694fnhftfhj0hQPWRBLyNulOYn58LnyEv0577xPx1oSSmYeRAyF6RMgLSjtC0yoGnATSfj7YQ45cBCZptFW6iNDxJ+ZSGM8hx276bs+jsvegXkCi8zJYi4DaKJncT4ByRI4lLO0oTNi9J9HmtxbBURRkc7rdw20biINVa4b4p2Vh8UKYgAcAWeD5o8\/8ZhJdkKG+fNhPknqR1JRmna3NdnwzNpvWuJztPaOFtUorNEIgoLpeNNgaR05Y+pf8Sl2+a16YA9naLxE+TdVNCFc6Lol380Ceav4CXSxJ7rgoiNMJHRf+0ByeJKZwPwqeDHtZTd71ttkj0DpFMYZRACIxtFIg2SSRgZ9BAFCYvjjJ9t6k5VBsOkSNHaEbSrJuiDon45MF1vyhV4\/EP8gUR43hWNbWtJfniOEvXXpHaI2j7jjcgsc1\/aepc0v4varOtsUZnOEokoShilRRNkicyZpmws3Csii7DW8Lm\/9dd\/XfkatYd\/O\/hMS2sqz1NXs8wtIRpc53knRopBTRBZmcIZIgcHA9kzQDpC6SogiBYknrsxKYhSvCJ7eQohUvv5gPWTmB9vcXy99dAs6h+c0TFuTMTtxooWoUqctYkeHKbdas\/CUoFlyLjmQpTLHhddB8+z0hfs3MfObxx2LmrjXp51hde7bUEI\/L5ojec5cyCYm5TOFlXASxSFhNFU4QyODKJ58ThPNAGvT00OW47rj23b78spT9Gf\/\/1\/GXz2uTPpFUbseXgc+Rwn7Aa7xMyjgS+K\/TyQnBBF33srzSW\/lEkld6hbFBWPUQkF0aOUcSN6DqK48wWjBO9gFkR9T2onkReDc8GPXaxdBCLEZFLypmgiKBQfN6ZEc59sBtMD0RyfUpLCVCY60XVHnnqJnqaEmj20FabN3huR4Mz9ztiOEQkp62cX3Qqf+9q\/c6AR13Gu7989frnNBU4PIh8KRwvZ2BUZPy7gbGHWGETnOaTSMvKEJ5o80gTOcmrJmsoOuYwwKqmHaJgSXhb3HNopMcsjvqbKcxD1BxVDWDS5F1lMWMe9XSiGbJrDmN3KfZeqrQO34I02F4obi8anaM4VzX2y6+404W+F44fXa1HWPSkjP8VL5GtYbFqoWWCxDERSiLVsNIRozbVea9IpUfSz718VeXvqbB9Q6uq7xy8TX+zd45fdu8cvN9mD5Brn1D4H23WLBM\/NSNHoFwmZtMObogw+0uQRRmUOmePwuKRdpOhzSKsZpOs5iAwJlTA3UbhlIYWEOUwm1kAQ7JiKxs5eEfHdADiO8NyKrWbzOipqR675KO5gfA5kNxBFbd+QNPJF1zv3+Vxk5AxO0oa8DWEkWstUNpDPBN+rZruYqzOi6C\/+p38cvCoucu6Ys7TlOj9CHqSUzFNF4NNOiGhwqRq7or8vxDDNKIw+LvsZoqwCMUUQzfLGvOdFMbzCmZTOLIhERoBox1E0B9a4CDGEEQBvxlcnoZSElTpekULLIs+IaC4zceZJau5L8RblLUVQ6rNEvO7tpdicrhYOT2Q6GdO525WYj1Wbx506RaNvFHXnYwqLk\/1jSmZw2Vpraq7qK8tMMfTHFTYVq4I7F+6SIflCEloEEU+UqkZtX0U0ZExCIWKREc6o8HCkIn2UpkSbmimp3GM3T\/jgq6iwIoW6vuCfZ3kHZ1wzQpuBqPBulPotuIHK\/Hyr5s2CAuentkSIZJLxHchsTko805DbkTRn+mIP0Hd\/HvPv196iHB4eG14imf5CnOloAyeoSLM5lYqke47S\/OSMKPrZ2feLuO1INm41CnmYLltrHUmDVyc9j84SJbGRcp7ES1gQpOX3X0anh6idYihnRcm4lBSImVNka8C1vndP03tbkGYgpCW4yJUNMKw3hMWXJVB5NxBFelCZn\/sJgrqo+Ul3dstnkhs3uucd2XZYh7P4iTLRHWQRdxa9RLL9ZaBLpEIYJaI0PzkRPlf7398tIuscGVltXSKCz\/GoZMLSgUo8MLAA5+9PKjQbpSxpt2+RIZQuik1BVAUSPeNsSD3S+Bw2FqnXEX4HSs7MkWLauUtaOIDq2aJSniUSwethUgKjwNdQuiJxQhT90vBrRdz2MO8ZogwcFJyVDjuhHsC1T7L0E6NnZ4omozCCINLLg4xFGQ9ziPesUPjdUDbNPQCOM3NkE8v4uUsTqJwtSkooU8K6RG+BMNKPG4kWvvtN23c8N5GQgL1ORQ3AQUlC50oPH9DNksa1Zzvzim1ShBEEkT7oWf5anh1TFu+6M2zWqtCvQeUYOTJXudIOWWS9RSKvWCm9RFEgjPTihCj67MXE9i0PTQkIDqMrwlsEL5EH8MT0JGNLtzhNdRWFEQSRHmbs8dmUSbfL4Z4fcIZOXWx4XC8EgCi01j+eTsbbBc9VrrRDCRlvEZ+tEZ1FK62XKAqEkT6cSLTw2c8\/tX1L0zsH3QIOa3txoDIj54rvKC3zViFkqL8Tx0IY6QjL6GoQz0bE91LyhaIFkap3RPfYH0See5iQBnjBU05LryXjGr+HRZ2i7Yyp7UM+uyTyiFJR1AOJg+Cy7wabRvpQmZ+T3ndR81PWbIpRFuNL5xwVbQeNsVbC7854Y8FEO4rmULB+izLR2T5LJNNfAtM2GpIvvEVpfnJDFNlNsnBsIcwMokiNM96hloLTMToliiQF0QItwsj1iTAijLSmcZZoh9LuYlhv6B77\/WibKGFBSl9qmjjbwALmLEdCl05KQeJO3sPgqu8GaEFpfhZR4PzUdSRd+412hPVGP2Edq7H3t3Q7\/+TR5oyVcRsqNzLRFeQlcqW\/3CKHMDorcYkCpfnpTtE7aPWzwV+4c+f137Nxr3ffBAsaz9B29\/jl2WVrTTSoTYEwI0fJIIhmbMh2EgxInR4jZ6loXYVcsHjcTvAYOdNXyGhjoRvXr52rJwaAQ+yxfbYlaNI+7\/rLCKOZgbqKOjNLHgjWzGVvkcj4nVV1LckojHq8PjhjN5JQE9jM79lcx+7s\/eVf7hcpjC5\/81ebwS8GVkQRY6sT9A3UPxCCJAtuklUQ8eSUZEAGVRFGIJ3pZNzhs2Y+9BVR3SORsQdA5eFCyk1DwmgY52GhLG4yZw8ZbZscvPFzIDCSafOwm+IlqvSZxQzCqLZYHyQuL7KhpbOKcmh2rBPB9vrlRvY5ixhIwy2iTOFsQIKcgugaXtySUiFXIvkCSMeXvsJhd6Mi2wCAj7BB2EwZP\/scppoHkX2SWMNMBM8xor+V3XQXeYG22JgXeomqLoqCL86CJonlGr+bvGJG1HdaCnXoRO0UJd0whguiyOaCbXNhxsHeCiMjiBZAGIGsoK8AUG4MCSORfbIvWUeskxCqJbURzeFvoky+3SQvESIp3sBev6RagLUc2XAX1xwmvJfcYpTXJtHZUut2tAuiyGYhPwwUYBwVQbQAxi7Iiut9hXcPESoHgCQGhFEvIX1zrjpiXDhVlFzmWFGgCOsWCf4dXqIlMhZJz4soxLIlkfa7m3T2SXO7U6lc+BwAJtEhiBawsZu0CG5hAQCB+8JI1EcRUgdARnQKI76WyODc4LkiNRSK17uk+ymtTyneotj7wUt0GwPCKOm9HnGB+kRoLQrrjV5C6vlBEYkgIIoA0IROQRTBRDw5KCGuCSNe9LoJix5CjAHIgWaPUSfBW0RzBR3WP4ibL0gw8T2OEnb5B5rSPmdNrwwvUQI6hRGfE32a8CtPKKV8XCIHXhfaHFaZVIurkPILTtQpAsB3DAki0xmIQMlISYEdpGWl436sqx+l1QqTiT+XNbK6BaXoPQzrDZmda6rVlauGk8Vns61wr07JCo1aR9eawNfpJKxbNQ6L+zCsN0aR4wfCTGERZrrmkZRMdFFseYmsjWndLBVJV+UgpUA3zf\/PuebU2dK\/p\/FUQVArzU8QRQAowgdT0wy8tqwxAGEE8qAojDYtFT5+yruNeZFtW1FeKZtnqWw9m5rCvXAGUgM51oTEQpZsJDczlA\/J24\/bkuNbhKhu0QKbXiKvz0fqEkbcB\/dS6iEFLJry1OwcKYpHpfkJ4XMAqHOYMik8UKj9cE2OsAkUxARZQ+lsJrmJMioqNAKAspBxTRAlQHhLhrkiL8rrXUwb084W4SxRDnSF0vFGbzMhDDMvo6KLekMUAWCWB7rCdjIuggAs+otuY0cHIw4jhQEDgCK61gSeKx4rNocM4\/sGw1RFniCcJZLAgDBStUueubA2QBQBYA5tgmgBhBHIg2PC6BiCCAC9RNYEpd16DrO7L1kwk+aYTU2JFUR0Bd8RXiJJDAgjGWFNHsBfo7XKhfcIUQSAGbQLogUQRiAPGVK7m+aYd5D3YLwAoB+Nwqg\/nYybLI6epVzvnDOQvW\/DoOXrx3mEkH1VAY3CaMrC+n0WR2lrzjHbSZu6wy1VKDzRwt3jlwdljC+\/e\/ySdkxWHGiKywx58l1GdXLtCg4Ppx38jGtLFjpLB4inpjMsRQ7aLp8LKTKzk+i5m2yTyj2X35suZPu0aDzoOLCcta+InqcUCjvHut9N6jNkY1AW3e1N6i+2no2oP6pQtfnJWjtozeGkP6n1hTJcq79oI9crWr7msKANjsOlZzfVnNAhita50IE1QAgnX6B7R+cVqXvy+7i26zmd+\/K6o8s+0j8\/BcHw\/wM91dL3BAWJhAAAAABJRU5ErkJggg==\" alt=\"M\u00e9tropole Aix-Marseille-Provence\">\r\n      <\/div>\r\n      <div class=\"toggle-group\" id=\"indicator-tabs\" role=\"tablist\" aria-label=\"Indicateur d'impact\">\r\n        <button class=\"toggle-btn active\" data-ind=\"empreinte\" type=\"button\" role=\"tab\" aria-selected=\"true\">Roue d'impact<\/button>\r\n        <button class=\"toggle-btn is-flora\" data-ind=\"fleurs\" type=\"button\" role=\"tab\" tabindex=\"-1\" aria-selected=\"false\">Fleurs des assos<\/button>\r\n        <button class=\"toggle-btn is-carte\" data-ind=\"carte\" type=\"button\" role=\"tab\" tabindex=\"-1\" aria-selected=\"false\">Carte<\/button>\r\n        <button class=\"toggle-btn is-flux\" data-ind=\"flux\" type=\"button\" role=\"tab\" tabindex=\"-1\" aria-selected=\"false\">Lieux &amp; financements<\/button>\r\n        <button class=\"toggle-btn is-freins\" data-ind=\"freins\" type=\"button\" role=\"tab\" tabindex=\"-1\" aria-selected=\"false\">Freins<\/button>\r\n      <\/div>\r\n      <div class=\"edition\"><span>Fonds d\u2019innovation sociale<\/span><strong>\u00c9dition 2025 <span class=\"edition-dot\"><\/span><\/strong><\/div>\r\n  <\/div>\r\n\r\n  <main class=\"main-content\">\r\n  <header class=\"header\">\r\n    <div class=\"intro\">\r\n      <p class=\"eyebrow\">Aix-Marseille-Provence<\/p>\r\n      <h1>L\u2019impact social,<br><span>en perspective.<\/span><\/h1>\r\n      <p class=\"map-subtitle\">Explorez les projets soutenus par le fonds d\u2019innovation sociale.<\/p>\r\n    <\/div>\r\n    <div class=\"toolbar\">\r\n      <div class=\"kpi-row\" id=\"kpi-row\" aria-live=\"polite\"><\/div>\r\n      <nav class=\"crumbs\" id=\"crumbs\" aria-label=\"Niveau affich\u00e9\"><\/nav>\r\n      <div class=\"radar-modes\" id=\"freins-modes\" hidden>\r\n        <button class=\"rmode\" data-fmode=\"bars\" type=\"button\">Barres class\u00e9es<\/button>\r\n        <button class=\"rmode active\" data-fmode=\"radar\" type=\"button\">Radar<\/button>\r\n      <\/div>\r\n      <div class=\"radar-modes\" id=\"roue-modes\" hidden role=\"group\" aria-label=\"Lecture de la roue\">\r\n        <button class=\"rmode active\" data-rmode=\"egal\" type=\"button\" aria-pressed=\"true\">Parts \u00e9gales<\/button>\r\n        <button class=\"rmode\" data-rmode=\"rose\" type=\"button\" aria-pressed=\"false\">Nb de projets<\/button>\r\n        <button class=\"rmode\" data-rmode=\"fis\" type=\"button\" aria-pressed=\"false\">Montant FIS<\/button>\r\n      <\/div>\r\n    <\/div>\r\n    <nav class=\"explore-list\" id=\"explore-list\" aria-label=\"Explorer la roue\"><\/nav>\r\n    <div class=\"reading-note\"><span class=\"reading-icon\" aria-hidden=\"true\">\u2197<\/span><p id=\"reading-note\">Choisissez une th\u00e9matique pour explorer ses projets.<\/p><\/div>\r\n  <\/header>\r\n\r\n    <div id=\"chart-container\" role=\"region\" aria-label=\"Visualisation interactive du fonds d\u2019innovation sociale\">\r\n      <div class=\"stage-heading\"><span id=\"stage-label\">Vue d\u2019ensemble<\/span><span class=\"stage-index\" id=\"stage-index\">01 \/ 03<\/span><\/div>\r\n      <div class=\"chart-loading\" id=\"chart-loading\" role=\"status\"><span><\/span>Pr\u00e9paration de la visualisation\u2026<\/div>\r\n      <div class=\"stage-caption\" id=\"stage-caption\"><span class=\"caption-line\"><\/span>Secteurs \u00e0 parts \u00e9gales \u00b7 La couleur identifie la th\u00e9matique<\/div>\r\n      <aside class=\"legend\" id=\"legend\" aria-label=\"Th\u00e9matiques\">\r\n        <p class=\"legend-title\">Th\u00e9matiques<\/p>\r\n        <button class=\"legend-trigger\" id=\"legend-trigger\" type=\"button\" aria-expanded=\"false\" aria-controls=\"legend-list\"><\/button>\r\n        <ul class=\"legend-list\" id=\"legend-list\"><\/ul>\r\n      <\/aside>\r\n      <div class=\"freins-bars\" id=\"freins-bars\" hidden aria-label=\"Freins par fr\u00e9quence\"><\/div>\r\n      <div class=\"flora-grid\" id=\"flora-grid\" hidden aria-label=\"Impact du FIS pour toutes les associations\"><\/div>\r\n      <div class=\"territoire-modes\" id=\"territoire-modes\" hidden role=\"group\" aria-label=\"Choisir une visualisation\">\r\n        <button type=\"button\" data-territoire=\"flux\" aria-pressed=\"true\">Qui agit o\u00f9 ?<\/button>\r\n        <button type=\"button\" data-territoire=\"classement\" aria-pressed=\"false\">Classement &amp; financements<\/button>\r\n      <\/div>\r\n      <div class=\"territoire-modes carte-modes\" id=\"carte-modes\" hidden role=\"group\" aria-label=\"Choisir une carte\">\r\n        <button type=\"button\" data-carte=\"fis\" aria-pressed=\"true\">Carte territoriale<\/button>\r\n        <button type=\"button\" data-carte=\"relief\" aria-pressed=\"false\">Carte en relief<\/button>\r\n      <\/div>\r\n      <div class=\"stage-panel rang\" id=\"classement\" hidden aria-label=\"Classement et financements par th\u00e9matique\"><\/div>\r\n      <div class=\"stage-panel etages\" id=\"etages\" hidden aria-label=\"Les trois promesses du fonds, en \u00e9tages\"><\/div>\r\n      <div class=\"radar-modes fleurs-modes\" id=\"fleurs-modes\" hidden role=\"group\" aria-label=\"Lecture des fleurs\">\r\n        <button class=\"rmode active\" data-fleurs=\"etages\" type=\"button\" aria-pressed=\"true\">3 \u00e9tages<\/button>\r\n        <button class=\"rmode\" data-fleurs=\"fleurs\" type=\"button\" aria-pressed=\"false\">Grille<\/button>\r\n      <\/div>\r\n      <div class=\"stage-panel flux\" id=\"flux\" hidden aria-label=\"Ce que chaque th\u00e9matique verse aux trois \u00e9tages\"><\/div>\r\n      <div class=\"stage-panel carte\" id=\"carte\" hidden aria-label=\"Carte territoriale des projets\">\r\n      <!-- La carte territoriale est dans la page, pas dans une iframe :\r\n           plus aucune adresse \u00e0 raccorder une fois sur WordPress. -->\r\n<div id=\"amp-map\" class=\"is-booting\">\r\n  <!-- Rail gauche : titre, compteurs, vues et l\u00e9gende -->\r\n  <aside class=\"amp-side\">\r\n\r\n    <header class=\"amp-head\">\r\n      <p class=\"amp-eyebrow\">Aix-Marseille-Provence<\/p>\r\n      <h1 class=\"amp-title\">Le fonds,<br><span>territoire par territoire.<\/span><\/h1>\r\n    <\/header>\r\n\r\n    <div class=\"amp-kpis\" id=\"amp-stat\" aria-live=\"polite\"><\/div>\r\n\r\n    <div class=\"amp-ctrl-wrap\">\r\n      <nav class=\"amp-ctrl\" id=\"amp-ctrl\" aria-label=\"Vues de la carte\">\r\n        <button class=\"amp-chip amp-on\" data-view=\"all\" type=\"button\" aria-pressed=\"true\">\r\n          <span>Toute la m&eacute;tropole<\/span>\r\n          <span class=\"amp-chip-count\" id=\"chip-count-all\"><\/span>\r\n        <\/button>\r\n        <button class=\"amp-chip\" data-view=\"marseille\" type=\"button\" aria-pressed=\"false\">\r\n          <span>Focus Marseille<\/span>\r\n          <span class=\"amp-chip-count\" id=\"chip-count-mrs\">16 arr.<\/span>\r\n        <\/button>\r\n        <button class=\"amp-chip\" data-view=\"multi\" type=\"button\" aria-pressed=\"false\">\r\n          <span>Projets multisites<\/span>\r\n          <span class=\"amp-chip-count\" id=\"chip-count-multi\"><\/span>\r\n        <\/button>\r\n        <button class=\"amp-chip amp-reset\" data-view=\"reset\" type=\"button\">&#8635; Revenir &agrave; la vue d&rsquo;ensemble<\/button>\r\n      <\/nav>\r\n    <\/div>\r\n\r\n    <div class=\"amp-legend\" id=\"amp-legend\"><\/div>\r\n  <\/aside>\r\n\r\n  <!-- Stage cartographique principal -->\r\n  <div class=\"amp-stage\" id=\"amp-stage\">\r\n    <div class=\"amp-stage-head\">\r\n      <span id=\"amp-stage-label\">Carte territoriale<\/span>\r\n      <span class=\"amp-stage-index\" id=\"amp-stage-index\"><\/span>\r\n      <button class=\"amp-full-btn\" id=\"amp-full-btn\" type=\"button\"\r\n        aria-pressed=\"false\" title=\"Afficher la carte en plein &eacute;cran\">&#10530;<\/button>\r\n    <\/div>\r\n\r\n    <svg id=\"amp-svg\"><\/svg>\r\n\r\n    <p class=\"amp-stage-caption\">\r\n      <span class=\"amp-caption-line\" aria-hidden=\"true\"><\/span>\r\n      <span id=\"amp-caption-text\">La teinte dit le secteur Politique de la Ville &middot; la pastille, le nombre de projets<\/span>\r\n    <\/p>\r\n\r\n    <div class=\"amp-tip\" id=\"amp-tip\" role=\"status\"><\/div>\r\n\r\n    <!-- Panneau lat&eacute;ral : liste du territoire, puis fiche projet -->\r\n    <aside class=\"amp-panel\" id=\"amp-panel\" aria-hidden=\"true\">\r\n      <div class=\"amp-panel-bar\" id=\"amp-panel-bar\"><\/div>\r\n      <div class=\"amp-panel-hd\" id=\"amp-panel-hd\"><\/div>\r\n      <div class=\"amp-panel-list\" id=\"amp-panel-list\"><\/div>\r\n      <div class=\"amp-panel-fiche\" id=\"amp-panel-fiche\"><\/div>\r\n    <\/aside>\r\n\r\n    <div class=\"amp-loader\" id=\"amp-loader\" role=\"status\">\r\n      <span class=\"amp-loader-dots\" aria-hidden=\"true\"><\/span>\r\n      <span id=\"amp-loader-text\">Pr&eacute;paration de la carte&hellip;<\/span>\r\n      <span class=\"amp-loader-bar\" aria-hidden=\"true\"><\/span>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n<!-- La carte en relief : les m\u00eames projets, racont\u00e9s en cinq \u00e9tapes. Elle\r\n     reste ferm\u00e9e tant qu\u2019on ne la demande pas (voir la section 21 du script). -->\r\n<div id=\"amp-relief\" class=\"is-attente\" hidden aria-label=\"Carte en relief des projets du fonds\">\r\n  <svg class=\"aa-svg\" id=\"aa-svg\" aria-hidden=\"true\" focusable=\"false\"><\/svg>\r\n  <div class=\"aa-voile\" aria-hidden=\"true\"><\/div>\r\n  <div class=\"aa-col\">\r\n    <p class=\"aa-marque\">Fonds d\u2019innovation sociale<br>Aix-Marseille-Provence<\/p>\r\n    <div class=\"aa-etape\" id=\"aa-etape\" aria-live=\"polite\">\r\n      <p class=\"aa-kick\"><b id=\"aa-num\">01 \/ 05<\/b><i aria-hidden=\"true\"><\/i><span id=\"aa-kick\"><\/span><\/p>\r\n      <p class=\"aa-big\" id=\"aa-big\"><\/p>\r\n      <p class=\"aa-unit\" id=\"aa-unit\"><\/p>\r\n      <h2 class=\"aa-titre\" id=\"aa-titre\"><\/h2>\r\n      <p class=\"aa-corps\" id=\"aa-corps\"><\/p>\r\n      <ul class=\"aa-liste\" id=\"aa-liste\" hidden><\/ul>\r\n    <\/div>\r\n    <div class=\"aa-nav\">\r\n      <button class=\"aa-fleche aa-prec\" id=\"aa-prec\" type=\"button\" aria-label=\"\u00c9tape pr\u00e9c\u00e9dente\">&larr;<\/button>\r\n      <button class=\"aa-fleche aa-suiv\" id=\"aa-suiv\" type=\"button\" aria-label=\"\u00c9tape suivante\">&rarr;<\/button>\r\n      <div class=\"aa-points\" id=\"aa-points\" role=\"group\" aria-label=\"\u00c9tapes\"><\/div>\r\n      <button class=\"aa-rejouer aa-visite\" id=\"aa-visite\" type=\"button\" aria-pressed=\"false\">&#9654; Visite guid\u00e9e<\/button>\r\n      <button class=\"aa-rejouer\" id=\"aa-rejouer\" type=\"button\">&#8634; Rejouer<\/button>\r\n    <\/div>\r\n  <\/div>\r\n  <p class=\"aa-source\">Projets soutenus par le Fonds d\u2019innovation sociale<br>Grille FIS 2025 \u00b7 contours officiels<\/p>\r\n  <div class=\"aa-legende\" id=\"aa-legende\">\r\n    <div class=\"aa-leg-pic\">\r\n      <!-- Le pic gradu\u00e9 se dessine au chargement, \u00e0 l'\u00e9chelle des donn\u00e9es. -->\r\n      <div class=\"aa-leg-glyphe\" id=\"aa-leg-glyphe\" aria-hidden=\"true\"><\/div>\r\n      <div>\r\n        <p class=\"aa-leg-titre\">Hauteur du pic<\/p>\r\n        <p class=\"aa-leg-texte\">Nombre<br>de projets<br>soutenus<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"aa-leg-sep\" aria-hidden=\"true\"><\/div>\r\n    <div class=\"aa-leg-ct\">\r\n      <p class=\"aa-leg-titre\">Conseil de territoire<\/p>\r\n      <div class=\"aa-leg-grille\" id=\"aa-leg-grille\"><\/div>\r\n      <p class=\"aa-leg-vide\"><i aria-hidden=\"true\"><\/i>Commune sans projet<\/p>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"aa-tip\" id=\"aa-tip\" role=\"status\"><\/div>\r\n  <p class=\"aa-attente\" id=\"aa-attente\" role=\"status\" hidden>Chargement des contours communaux\u2026<\/p>\r\n<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"tooltip\" id=\"tooltip\" role=\"status\"><\/div>\r\n    <\/div>\r\n    <aside class=\"detail\" id=\"detail\" aria-label=\"Fiche projet\" aria-hidden=\"true\" inert><\/aside>\r\n  <\/main>\r\n  <footer class=\"app-footer\"><span class=\"footer-signature\">Am\u00e9liorer <i>\u00b7<\/i> \u00c9manciper <i>\u00b7<\/i> R\u00e9v\u00e9ler<\/span><span id=\"data-source\">FIS \u00b7 Corpus 2025<\/span><button id=\"present-btn\" type=\"button\" aria-label=\"Lancer le mode pr\u00e9sentation\"><svg width=\"14\" height=\"14\" viewbox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\"><path d=\"M7 5.5v9l7.5-4.5z\" fill=\"currentColor\"\/><\/svg><span>Pr\u00e9senter<\/span><\/button><button id=\"fullscreen-btn\" type=\"button\" aria-label=\"Passer en plein \u00e9cran\"><svg width=\"14\" height=\"14\" viewbox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\"><path d=\"M7 3H3v4m10-4h4v4M3 13v4h4m10-4v4h-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span>Plein \u00e9cran<\/span><\/button><\/footer>\r\n<\/div>\r\n<\/div>\r\n\r\n<script type=\"text\/javascript\" data-category=\"functional\" class=\"cmplz-native\">\r\n(function () {\r\n    if (window.__reuRoueLoaded) return;\r\n    window.__reuRoueLoaded = true;\r\n\r\n    \/\/ ============ SOURCE DE DONN\u00c9ES ============\r\n    \/\/ La roue lit directement la Google Sheet partag\u00e9e (onglet \u00ab Grille\r\n    \/\/ compl\u00e8te \u00bb) via l'export CSV gviz, qui renvoie les en-t\u00eates CORS\r\n    \/\/ n\u00e9cessaires \u00e0 un fetch navigateur. Les donn\u00e9es fig\u00e9es ci-dessous ne\r\n    \/\/ servent que de secours si la feuille est injoignable (hors-ligne,\r\n    \/\/ partage retir\u00e9, quota) : la roue s'affiche alors quand m\u00eame.\r\n    var SHEET_ID = \"1sF0RyAW_F-64s0rf6-9jONx629QQGQvr721f9ecL7-0\";\r\n    var SHEET_TAB = \"Grille compl\u00e8te\";\r\n    var SHEET_CSV_URL = \"https:\/\/docs.google.com\/spreadsheets\/d\/\" + SHEET_ID\r\n        + \"\/gviz\/tq?tqx=out:csv&sheet=\" + encodeURIComponent(SHEET_TAB);\r\n\r\n    var EMBEDDED = [\r\n{\r\n\"theme\": \"CULTURE\",\r\n\"porteur\": \"In Medias Res\",\r\n\"projet\": \"La R\u00e9gie du Cin\u00e9ma\",\r\n\"resume\": \"Projet culturel visant \u00e0 rendre la pratique audiovisuelle plus accessible et \u00e0 valoriser les talents locaux, \u00e0 destination des acteurs sociaux et des habitants des quartiers prioritaires de Marseille.\",\r\n\"territoire\": \"QPV Marseille\",\r\n\"fis\": \"36\u202f000,00 \u20ac\",\r\n\"budget\": \"96\u202f515,00 \u20ac\",\r\n\"partFis\": \"37,3%\",\r\n\"personnes\": \"10 644\",\r\n\"actions\": \"71+ \u00e9v\u00e9nements \/ ~70 sessions\",\r\n\"inventaire\": \"71+ \u00e9v\u00e9nements ; \u2248 70 s\u00e9ances d'accompagnement audiovisuel\",\r\n\"invPartenaires\": \"30+ partenaires\",\r\n\"nbPartenaires\": \"30+\",\r\n\"competences\": \"~70 sessions d'accompagnement audiovisuel (CERFA). 18 ateliers p\u00e9dagogiques document\u00e9s (RA) : 6 ateliers en salles de cin\u00e9ma, 6 ateliers r\u00e9alisation de films, 2 en m\u00e9diath\u00e8ques, 3 montage vid\u00e9o, 1 photo. Ateliers coll\u00e8ges Renoir et Rostand (10 \u00e9l\u00e8ves chacun, court-m\u00e9trages professionnels). Atelier Grans : 8 jeunes 12-17 ans (capsule vid\u00e9o p\u00e9dagogique Capsul'\u00d4'Rama). Ateliers Place des Farandoleurs (jeunes). Formations techniques : initiation incrustation fond vert, stop-motion, rotoscopie.\",\r\n\"lienSocial\": \"RA p.2 : \u00ab renforcer les liens au sein de la communaut\u00e9 et du quartier \u00bb. Projections Malpacin\u00e9 (Farandoleurs) + Busserine + plein air : cr\u00e9ation d'espaces de rencontre interg\u00e9n\u00e9rationnels en QPV. Festival Tous Courts (Aix-en-Provence) : lien entre acteurs culturels m\u00e9tropolitains. R\u00e9sidence D\u00e9nominateur Commun : dialogue interculturel franco-br\u00e9silien. Soutien \u00e0 des collectifs \u00e9mergents (Soul of Marseille, Rodrig Family) : visibilisation de talents QPV.\",\r\n\"comportement\": \"CERFA p.2 : \u00ab environ 10 644 personnes ont pu profiter de la R\u00e9gie du Cin\u00e9ma \u00bb. RA p.2 : les ateliers \u00ab ont constitu\u00e9 des moments d'\u00e9change et de cr\u00e9ativit\u00e9, offrant \u00e0 chacun l'opportunit\u00e9 de s'initier ou de se perfectionner dans l'art du cin\u00e9ma \u00bb. Atelier coll\u00e8ges : les \u00e9l\u00e8ves \u00ab ont imagin\u00e9, tourn\u00e9 et mont\u00e9 leur film dans des conditions professionnelles \u00bb (RA p.12). Capsul'\u00d4'Rama : \u00ab une approche cr\u00e9ative et analytique \u00bb chez les jeunes (RA p.14). Changement comportemental document\u00e9 qualitativement \u2014 non mesur\u00e9 quantitativement.\",\r\n\"sorties\": \"Ateliers coll\u00e8ges (20 \u00e9l\u00e8ves) : acquisition de comp\u00e9tences techniques cin\u00e9matographiques professionnelles (sc\u00e9narisation, tournage, montage). Ateliers Farandoleurs : premi\u00e8re exp\u00e9rience cin\u00e9matographique pour des jeunes QPV. R\u00e9sidence documentaire D\u00e9nominateur Commun : sorties positives cr\u00e9ation attendues (sortie 2025). Acc\u00e8s \u00e0 la culture cin\u00e9matographique pour des publics QPV \u00e9loign\u00e9s. NR : pas de taux de sortie vers l'emploi ou la formation document\u00e9 dans le RA ou le CERFA.\",\r\n\"indicateurs\": \"71+ \u00e9v\u00e9nements (RA). ~10 644 b\u00e9n\u00e9ficiaires d\u00e9clar\u00e9s (CERFA). 14 projections plein air (> 7 000 spectateurs). 18 ateliers p\u00e9dagogiques. 10 r\u00e9alisations vid\u00e9o. 3 r\u00e9sidences artistiques. 30+ partenaires. B\u00e9n\u00e9volat valoris\u00e9 : 6 864 \u20ac (CERFA). FIS r\u00e9alis\u00e9 \u00e0 51% du pr\u00e9vu : 36 000 \u20ac vs 70 000 \u20ac. Budget total r\u00e9alis\u00e9 : 52 637 \u20ac (67% du pr\u00e9vu).\",\r\n\"freins\": \"Freins financiers : FIS r\u00e9alis\u00e9 \u00e0 51% du pr\u00e9vu (36 000 \u20ac vs 70 000 \u20ac pr\u00e9vu). Budget total r\u00e9alis\u00e9 \u00e0 67% (52 637 \u20ac vs 78 000 \u20ac). \\nFreins humains (\u00e9quipes et publics) : recours massif aux intermittents et free-lances (20+ intermittents)  Structure fragilis\u00e9e en cas de r\u00e9duction des financements. \\nFreins logistiques et mat\u00e9riels : charge indirecte fonctionnement 6 500 \u20ac (non pr\u00e9vue initialement).\",\r\n\"ameliorer\": \"Favorise l'acc\u00e8s \u00e0 du mat\u00e9riel audiovisuel professionnel \u00e0 co\u00fbts r\u00e9duits pour personnes en QPV. Des ateliers p\u00e9dagogiques (montage, tournage, photo) pour l'expression de la cr\u00e9ativit\u00e9 et \u00e9changes\",\r\n\"emanciper\": \"Les sessions d'accompagnement audiovisuel et les ateliers ont permis l'acquisition de comp\u00e9tences techniques transf\u00e9rables (incrustation fond vert, stop-motion, montage) chez des coll\u00e9giens et jeunes QPV, certains r\u00e9alisant des films dans des conditions professionnelles\",\r\n\"reveler\": \"Visibilisation de talents QPV via le soutien \u00e0 des collectifs \u00e9mergents (Soul of Marseille, Rodrig Family) et la r\u00e9sidence D\u00e9nominateur Commun (dialogue franco-br\u00e9silien). Rayonnement via le Festival Tous Courts et le r\u00e9seau Sud Tiers Lieux \/ F\u00e9d\u00e9ration des Cin\u00e9-clubs (30+ partenaires). \\nB\u00e9n\u00e9volat valoris\u00e9 : 6 864 \u20ac\"\r\n},\r\n{\r\n\"theme\": \"CULTURE\",\r\n\"porteur\": \"Les Petits D\u00e9brouillards\",\r\n\"projet\": \"Culture et sciences dans les centres sociaux\",\r\n\"resume\": \"Projet culturel et \u00e9ducatif visant \u00e0 renforcer la place de la culture et des sciences dans le projet social des centres sociaux, \u00e0 destination des \u00e9quipes de ces structures et des enfants qu'elles accueillent.\",\r\n\"territoire\": \"Marseille 1er,10,13,14,15 et 16 Marignagne, Martigues et Miramas\",\r\n\"fis\": \"15\u202f000,00 \u20ac\",\r\n\"budget\": \"17\u202f876,00 \u20ac\",\r\n\"partFis\": \"84,0%\",\r\n\"personnes\": \"118\",\r\n\"actions\": \"6 animations + 1 journ\u00e9e de formation, 7 \u00e9v\u00e9nements au total\",\r\n\"inventaire\": \"6 animations culture et sciences ; 1 journ\u00e9e de formation pour les \u00e9quipes\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR\",\r\n\"competences\": \"curiosit\u00e9, cr\u00e9ativit\u00e9, entraide et ouverture culturelle ; les participantes \u00e0 la formation ont renforc\u00e9 leur capacit\u00e9 \u00e0 pr\u00e9parer des interventions culturelles\",\r\n\"lienSocial\": \"participation active, l\u2019expression personnelle, la r\u00e9flexion collective et l\u2019inclusion de publics diff\u00e9rents\",\r\n\"comportement\": \"NR\",\r\n\"sorties\": \"positives\\tFort enthousiasme, adh\u00e9sion aux activit\u00e9s, enrichissement des exp\u00e9riences par les sorties culturelles, satisfaction des participantes \u00e0 la formation\",\r\n\"indicateurs\": \"\",\r\n\"freins\": \"Freins financiers : l\u00e9gers d\u00e9passements de postes de d\u00e9penses \u2014 prestataires de d\u00e9placement pour les groupes et cachets d'artistes plus \u00e9lev\u00e9s que pr\u00e9vu (aucun \u00e9cart jug\u00e9 \\\"significatif\\\" par la structure elle-m\u00eame).\\n\\nFreins humains (\u00e9quipes et publics) : sur le projet \\\"\u00c9galit\u00e9 femme\/homme & musique\\\" \u00e0 Miramas, le public jeune (4-10 ans) a rendu la th\u00e9matique plus complexe \u00e0 traiter ; des limites p\u00e9dagogiques li\u00e9es \u00e0 l'\u00e2ge et au niveau de compr\u00e9hension des enfants ont \u00e9t\u00e9 not\u00e9es sur plusieurs ateliers, n\u00e9cessitant des ajustements en cours de route.\",\r\n\"ameliorer\": \"Ateliers culture et sciences dans 6 centres sociaux, fort enthousiasme et enrichissement des participants par les sorties culturelles\",\r\n\"emanciper\": \"Renforcement de la capacit\u00e9 des r\u00e9f\u00e9rents familles, jeunes \u00e0 pr\u00e9parer et animer eux-m\u00eames des interventions culturelles. D\u00e9veloppement de la curiosit\u00e9, de la cr\u00e9ativit\u00e9 et de l'ouverture culturelle.\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"EMPLOI\/INSERTION\",\r\n\"porteur\": \"PAIS\",\r\n\"projet\": \"Par emploi (Plateforme mode de garde)\",\r\n\"resume\": \"Projet d'insertion professionnelle visant \u00e0 lever les freins li\u00e9s \u00e0 la garde d'enfants dans le retour \u00e0 l'emploi, \u00e0 destination des familles des quartiers prioritaires de Salon-de-Provence.\",\r\n\"territoire\": \"QPV Salon-de-Pce\",\r\n\"fis\": \"28\u202f000,00 \u20ac\",\r\n\"budget\": \"35\u202f081,00 \u20ac\",\r\n\"partFis\": \"79,8%\",\r\n\"personnes\": \"10\",\r\n\"actions\": \"7 diagnostics\",\r\n\"inventaire\": \"7 entretiens de diagnostic, aupr\u00e8s de 6 personnes\",\r\n\"invPartenaires\": \"7 partenaires\",\r\n\"nbPartenaires\": \"7\",\r\n\"competences\": \"1 personne en accompagnement socio-professionnel actif (accompagnement d\u00e9marr\u00e9). Formation implicite des 3 RH affect\u00e9es : structuration organisationnelle, cr\u00e9ation de supports p\u00e9dagogiques (fiche de prescription, film, affiche, flyer, outil de suivi). Mode de garde financ\u00e9 par le dispositif pour 1 b\u00e9n\u00e9ficiaire en entr\u00e9e formation juillet 2025.\",\r\n\"lienSocial\": \"NR \u2014 Pas de donn\u00e9es qualitatives document\u00e9es sur l'impact lien social en ann\u00e9e 1 (phase de diagnostic territorial). Les ateliers collectifs pr\u00e9vus n'ont pas encore produit d'impact mesurable au moment du bilan.\",\r\n\"comportement\": \"Changement de repr\u00e9sentation document\u00e9 qualitativement : prise de conscience que parentalit\u00e9 et employabilit\u00e9 sont conciliables ('il est non seulement possible de concilier parentalit\u00e9 et employabilit\u00e9 mais surtout n\u00e9cessaire'). 1 personne ayant lev\u00e9 son frein mode de garde et entr\u00e9e en formation juillet 2025 = changement comportemental concret document\u00e9.\",\r\n\"sorties\": \"1 personne int\u00e9gr\u00e9e en accompagnement. 1 solution de mode de garde mobilis\u00e9e et financ\u00e9e par le dispositif. 1 entr\u00e9e en formation juillet 2025. (Source : CERFA bilan qualitatif \u2014 donn\u00e9es quantitatives tr\u00e8s limit\u00e9es \u2014 phase 1 = diagnostic territorial).\",\r\n\"indicateurs\": \"Nb prescriptions re\u00e7ues : ~10 (objectif 50). Nb entretiens diagnostic : 7 avec 6 personnes. Nb int\u00e9grations : 1. Nb solutions mode de garde mobilis\u00e9es : 1. Taux QPV prescriptions : 90%. Taux femmes : 80%.\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics) : structuration difficile \u00e0 3 ETP sur petits \u00e9quivalents temps plein. \\nFreins humains (\u00e9quipes et publics) : peu de prescriptions re\u00e7ues malgr\u00e9 bonne r\u00e9ception du dispositif par les partenaires. \\nFreins institutionnels et partenariaux : financement rendu tardivement en 2024, d\u00e9marrage effectif retard\u00e9. \\nFreins logistiques et mat\u00e9riels : absence d'une charg\u00e9e de projet d\u00e9di\u00e9e jusqu'en juin 2025.\",\r\n\"ameliorer\": \"Lev\u00e9e d'un frein de garde d'enfant. Parentalit\u00e9 et employabilit\u00e9 d\u00e9sormais conciliables.\",\r\n\"emanciper\": \"Accompagnement socio-professionnel. Structuration des 3 RH affect\u00e9es (supports p\u00e9dagogiques, outil de suivi) capacit\u00e9 organisationnelle \u00e9mergente\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"EMPLOI\/INSERTION\",\r\n\"porteur\": \"Apprentis d Auteuil\",\r\n\"projet\": \"Impact Jeunes PIC [Emploi]\",\r\n\"resume\": \"Projet d'insertion professionnelle visant \u00e0 remobiliser vers l'emploi les jeunes \u00e9loign\u00e9s des dispositifs classiques, \u00e0 destination des 13-30 ans des quartiers prioritaires de Marseille et d'Arles.\",\r\n\"territoire\": \"QPV Mlle+Arles\",\r\n\"fis\": \"120\u202f000,00 \u20ac\",\r\n\"budget\": \"852\u202f565,00 \u20ac\",\r\n\"partFis\": \"14,1%\",\r\n\"personnes\": \"190 jeunes sensibilis\u00e9s dont 67 suivis\",\r\n\"actions\": \"75 actions PIC+\u00e9v\u00e9nements CEJ\",\r\n\"inventaire\": \"75 actions co-construites avec des associations locales ; \u00e9v\u00e9nements pour les jeunes en contrat d'engagement jeune\",\r\n\"invPartenaires\": \"20 partenaires\",\r\n\"nbPartenaires\": \"20\",\r\n\"competences\": \"1 760 jeunes en accompagnement individualis\u00e9 (mont\u00e9e en comp\u00e9tences, remobilisation, plan d'action). 80 bourses individuelles attribu\u00e9es (permis de conduire, ordinateur, financement \u00e9tudes\/formation). 75 actions co-construites avec partenaires associatifs locaux. Formation aux outils d'orientation (Parcour\u00e9o, depuis juillet 2024). BAFA : plus de 60 jeunes form\u00e9s (co-construction avec L\u00e9o Lagrange et CEMEA). (Source : CRF qualitatif pages 4-5)\",\r\n\"lienSocial\": \"Maillage fort avec ~200 partenaires. Co-construction de permanences sant\u00e9 (MDA + Collectif Solide). 'Petits d\u00e9jeuners du Trebon' (r\u00e9unions acteurs sociaux). \u00c9v\u00e9nements lien social (f\u00eates quartier, Maximus Cup). Verbatims : 'ph\u00e9nom\u00e8ne de contagion positive'. Partenariats entreprises (Tour Luma : 5 entretiens, 3 contrats propos\u00e9s). R\u00e9seaux sociaux comme vecteurs de lien (350 abonn\u00e9s Snap).\",\r\n\"comportement\": \"Frise Impact Jeunes (progression mesur\u00e9e individuellement) : \u00e0 l'entr\u00e9e 11 d\u00e9motiv\u00e9s + 29 en remobilisation + 17 avec projet d\u00e9fini \u2192 \u00e0 la sortie 9 d\u00e9motiv\u00e9s + 12 en remobilisation + 6 avec projet + 17 en parcours + 23 en emploi. Progression nette vers l'emploi : +22 jeunes. 22 nouveaux dipl\u00f4mes obtenus sur les 67 jeunes CEJ JR accompagn\u00e9s. R\u00e9duction des freins p\u00e9riph\u00e9riques document\u00e9e (administratif, logement, sant\u00e9, mobilit\u00e9) entre entr\u00e9e et sortie. (Source : bilan AALI CEJ JR pages 10, 24-25)\",\r\n\"sorties\": \"33% de sorties positives sur les 1 760 accompagnements PIC (CDI ou CDD > 6 mois ou cr\u00e9ation entreprise). Dont 15% CDI et 14% CDD > 6 mois. 40% sorties dynamiques (formation, reprise \u00e9tudes, contrats courts). Sur 67 jeunes CEJ JR : 25% emploi durable (>6 mois), 21% en formation, 12% emploi court. 22 nouveaux dipl\u00f4mes obtenus. 80 bourses individuelles. (Source : CRF qualitatif pages 3-4 + bilan AALI p.24-25)\",\r\n\"indicateurs\": \"Nb jeunes accompagn\u00e9s PIC : 1 760 (objectif 1 630 \u2014 d\u00e9pass\u00e9). Taux sorties positives : 33% (CDI\/CDD>6 mois\/cr\u00e9ation). Taux sorties dynamiques : 40%. Nouveaux dipl\u00f4mes : 22 (sur 67 CEJ JR). Bourses : 80. Actions co-construites : 75. Partenaires : ~200. Frise entr\u00e9e\/sortie : 1 \u2192 23 en emploi. (Source : CRF qualitatif + bilan AALI)\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics) : jeunes 'en rupture' tr\u00e8s \u00e9loign\u00e9s, d\u00e9crochage scolaire, sant\u00e9 mentale, addictions, sans-domicile, sous main de justice. Mobilisation longue et incertaine. \\nFreins humains (\u00e9quipes et publics) : coordinatrice et boosteur en phase de cl\u00f4ture (travail finalisation bilan jusqu'\u00e0 juin 2025). \\nFreins institutionnels et partenariaux : CD13 r\u00e9alis\u00e9 \u00e0 57% du pr\u00e9vu (40 000 \u20ac sur 70 000 \u20ac). Dotation amortissements (68) major\u00e9e par provisions RH (+5k\u20ac pr\u00e9vu \u2192 84 742 \u20ac r\u00e9alis\u00e9) = contentieux RH. M\u00e9c\u00e9nat r\u00e9alis\u00e9 \u00e0 41% du pr\u00e9vu (86 082 \u20ac sur 209 689 \u20ac).\",\r\n\"ameliorer\": \"R\u00e9duction document\u00e9e des freins p\u00e9riph\u00e9riques (administratif, logement, sant\u00e9, mobilit\u00e9) entre entr\u00e9e et sortie de parcours. Des bourses individuelles (permis, ordinateur, financement \u00e9tudes).\",\r\n\"emanciper\": \"Progression nette vers l'emploi, des sorties positives, nouveaux dipl\u00f4mes, et nombreux jeunes form\u00e9s au BAFA, autonomie professionnelle acquise.\",\r\n\"reveler\": \"Maillage partenarial, permanences sant\u00e9 co-construites, partenariats entreprises et \u00ab ph\u00e9nom\u00e8ne de contagion positive \u00bb document\u00e9 effet d'entra\u00eenement territorial.\"\r\n},\r\n{\r\n\"theme\": \"EMPLOI\/INSERTION\",\r\n\"porteur\": \"La Cloche\",\r\n\"projet\": \"Mon Taf Solidaire\",\r\n\"resume\": \"Projet d'insertion professionnelle visant \u00e0 favoriser un retour progressif \u00e0 l'emploi en s'appuyant sur les commerces de proximit\u00e9, \u00e0 destination de personnes en grande pr\u00e9carit\u00e9 \u00e0 Marseille.\",\r\n\"territoire\": \"Marseille\",\r\n\"fis\": \"15\u202f000,00 \u20ac\",\r\n\"budget\": \"107\u202f000,00 \u20ac\",\r\n\"partFis\": \"14,0%\",\r\n\"personnes\": \"23\",\r\n\"actions\": \"3 bin\u00f4mes\/3 ap\u00e9 rues\/7 bilans\",\r\n\"inventaire\": \"3 bin\u00f4mes avec des commer\u00e7ants du quartier ; 3 ap\u00e9ros de rue ; 7 bilans\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"\",\r\n\"competences\": \"100% des tafeurs ont repris une activit\u00e9 professionnelle \u00e0 l'issue de MTS en 2024. 2 embauch\u00e9s directement par leur commer\u00e7ant (Jo \u2013 Marmite Joyeuse, Rachid \u2013 Asabiya 15h\/semaine). Michel : formateur animateur au senior lab. Charge de travail \u00e9volutive et progressive. 4 femmes et 10 hommes \u00e9quipes commer\u00e7ants form\u00e9s 'Comment accueillir dans son commerce'. 6 b\u00e9n\u00e9voles candidats pour la librairie internationale au 31\/12\/2024. (Source : bilan 2024)\",\r\n\"lienSocial\": \"Commer\u00e7ants transform\u00e9s : 'Maintenant on a vraiment du mal \u00e0 faire notre mise en place sans que Rachid soit l\u00e0' (Paul, Asabiya). Lien de confiance fort entre tafeurs et commer\u00e7ants \u2014 '\u00e7a l\u00e8ve des barri\u00e8res et des pr\u00e9jug\u00e9s.' \u00c9v\u00e9nements de proximit\u00e9 (ap\u00e9'rue, r\u00e9veillon solidaire) cr\u00e9ent du lien dans les quartiers. Anciens tafeurs recruteurs pour les nouveaux.\",\r\n\"comportement\": \"Changement de comportement document\u00e9 qualitativement : Rachid \u2014 'Avant, le matin \u00e9tait toujours compliqu\u00e9 car je bossais souvent le soir. Aujourd'hui \u00e7a a chang\u00e9. Je me l\u00e8ve tr\u00e8s bien le matin, j'ai repris un rythme normal.' Jo \u2014 stabilit\u00e9 et logement retrouv\u00e9s. R\u00e9appropriation d'un rythme de vie professionnel. Restauration de la confiance en soi et dans le monde du travail : '\u00e7a fait toujours du bien de travailler.' (Source : bilan 2024)\",\r\n\"sorties\": \"100% des tafeurs 2024 ont repris une activit\u00e9 professionnelle. 2 embauch\u00e9s directement par leur commer\u00e7ant (emploi durable CDI\/CDD formalis\u00e9). 1 devenu formateur d'animateur (Michel). Jo : retrouv\u00e9 stabilit\u00e9 + logement + reprise suivi sant\u00e9 laiss\u00e9 de c\u00f4t\u00e9 20 ans. 6 b\u00e9n\u00e9voles candidats \u00e0 la librairie internationale (pipeline insertion). (Source : bilan 2024 r\u00e9sultats tafeurs)\",\r\n\"indicateurs\": \"Heures d'insertion r\u00e9alis\u00e9es : 253h (objectif 1 500h \u2014 17% de l'objectif). Nb bin\u00f4mes actifs : 3 (objectif 5). Nb tafeurs en emploi \u00e0 l'issue : 3\/3 = 100%. Nb commer\u00e7ants sensibilis\u00e9s : 14 personnes form\u00e9es. Nb \u00e9v\u00e9nements proximit\u00e9 : 3 ap\u00e9'rues + 1 r\u00e9veillon. Nb candidatures librairie : 6 au 31\/12\/2024.\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics) : fin du contrat de la charg\u00e9e de projet initiale (sept 2024)  prise de poste nouvelle coordinatrice \u00e0 50% sur MTS. \\nFreins institutionnels et partenariaux : beaucoup de temps consacr\u00e9 \u00e0 la lev\u00e9e de fonds au d\u00e9triment de l'op\u00e9rationnel. Manque de communication sur le dispositif.\\n Freins logistiques et mat\u00e9riels : sous-effectif pour organisation \u00e9v\u00e9nements proximit\u00e9. Objectifs chiffr\u00e9s 2024 non atteints : 5 bin\u00f4mes pr\u00e9vus \u2192 3 r\u00e9alis\u00e9s.\",\r\n\"ameliorer\": \"Restauration concr\u00e8te d'un rythme de vie et d'une stabilit\u00e9 (logement, sant\u00e9) pour les tafeurs. Confiance en soi restaur\u00e9e par le lien avec les commer\u00e7ants\",\r\n\"emanciper\": \"100% des tafeurs 2024 ont repris une activit\u00e9 professionnelle, 2 embauches directes, 1 devenu formateur. \\nAutonomie professionnelle effective, \u00e0 effectif restreint (3\/3).\",\r\n\"reveler\": \"Lien de confiance tafeur\/commer\u00e7ant qui \u00ab l\u00e8ve des barri\u00e8res et des pr\u00e9jug\u00e9s \u00bb, anciens tafeurs devenus recruteurs des nouveaux, 6 candidatures b\u00e9n\u00e9voles pour la librairie internationale dynamique d'entra\u00eenement et de reconnaissance mutuelle.\"\r\n},\r\n{\r\n\"theme\": \"EMPLOI\/INSERTION\",\r\n\"porteur\": \"Les Chemins du Faire\",\r\n\"projet\": \"Festival Vocations 2024\",\r\n\"resume\": \"\u00c9v\u00e9nement d\u00e9di\u00e9 \u00e0 l'insertion professionnelle, visant \u00e0 faire d\u00e9couvrir et valoriser les m\u00e9tiers manuels et techniques, \u00e0 destination des jeunes du territoire m\u00e9tropolitain.\",\r\n\"territoire\": \"MUCEM Marseille\",\r\n\"fis\": \"20\u202f000,00 \u20ac\",\r\n\"budget\": \"317\u202f000,00 \u20ac\",\r\n\"partFis\": \"6,3%\",\r\n\"personnes\": \"2061\",\r\n\"actions\": \"50+ (23 rencontres+25 ateliers+Fairiades)\",\r\n\"inventaire\": \"23 rencontres (conf\u00e9rences, tables rondes, masterclasses) ; 25 ateliers de m\u00e9tiers manuels ; 1 concours entre \u00e9tablissements scolaires\",\r\n\"invPartenaires\": \"142 intervenants ; Mission locale, \u00c9cole de la deuxi\u00e8me chance, France Travail et Mucem\",\r\n\"nbPartenaires\": \"142 intervenants+ML+E2C+FT+MUCEM\",\r\n\"competences\": \"23 rencontres th\u00e9matiques autour de 'Construire' (conf\u00e9rences, tables rondes, masterclasses). 25 ateliers manuels (6 Forum MUCEM, 14 Cour de la Commande, 5 autres). 142 intervenants pr\u00e9sents (rencontres + ateliers). Sessions de recrutement par simulation (France Travail). D\u00e9tection de potentiels. Publication d'Actes aux Presses des Mines (mars 2025). Rallye mythologique (CIO, Mission locale, E2C). Concours Fairiades.\",\r\n\"lienSocial\": \"M\u00e9lange de publics 'qui se c\u00f4toient peu d'ordinaire' (ing\u00e9nieurs, artisans, scolaires, demandeurs d'emploi, grand public). Cr\u00e9ation de liens inter-sectoriels document\u00e9e (patronni\u00e8re + r\u00e9alisateur documentaire \u2192 projet film). Effet de 'contagion' entre intervenants. \u00c9v\u00e9nement de coh\u00e9sion sociale autour des m\u00e9tiers manuels dans un lieu \u00e0 fort rayonnement.\",\r\n\"comportement\": \"D\u00e9clic vocationnel document\u00e9 qualitativement : 'Des \u00e9l\u00e8ves venus avec leur professeur sont revenus le samedi avec leurs parents (pour les ateliers manuels).' Professeurs et r\u00e9f\u00e9rents Mission locale et E2C souhaitent 'participer \u00e0 l'\u00e9laboration du programme' de la prochaine \u00e9dition. Intervenants choisissent d'assister aux autres rencontres \u2192 \u00e9changes professionnels inter-secteurs spontan\u00e9s. (Source : CERFA bilan qualitatif section 'Analyse')\",\r\n\"sorties\": \"3 laur\u00e9ats Concours Fairiades (dotations 3 000 \u20ac). D\u00e9tection de potentiels par France Travail. Sessions recrutement par simulation. Mise en relation ing\u00e9nieurs\/entreprises. Passerelles \u00e9tablissements scolaires \u2192 AFPA \u2192 formations. Orientation vers la Mission locale pour les jeunes. NR : pas de suivi des trajectoires post-festival.\",\r\n\"indicateurs\": \"Nb participants (comptage MUCEM) : 1 561 + ~500 ateliers Cour Commande = ~2 061 personnes. Nb rencontres : 23. Nb ateliers : 25. Nb intervenants : 142. Nb \u00e9tablissements scolaires : 15 (Festival) + 20 (Fairiades). Nb laur\u00e9ats Fairiades : 3. Publication Actes : 1 (Presses des Mines mars 2025). (Source : CERFA bilan qualitatif)\",\r\n\"freins\": \"Freins institutionnels et partenariaux : faible implication des f\u00e9d\u00e9rations professionnelles et Chambre des M\u00e9tiers dans le relais information. France Travail : seule l'agence Belle de Mai a communiqu\u00e9 en interne. \\nFreins logistiques et mat\u00e9riels : couverture presse cons\u00e9quente mais tardive grand public peu inform\u00e9 avant le festival. \\nFreins humains (\u00e9quipes et publics) : avances sur frais membres association 'trop importantes (75%)' non renouvelables r\u00e9guli\u00e8rement. Structure enti\u00e8rement b\u00e9n\u00e9vole. (Source : CERFA donn\u00e9es chiffr\u00e9es annexe)\",\r\n\"ameliorer\": \"D\u00e9clic vocationnel v\u00e9cu par des \u00e9l\u00e8ves (retour un samedi avec leurs parents pour les ateliers manuels). Mixit\u00e9 de publics rarement r\u00e9unis (ing\u00e9nieurs, artisans, scolaires, demandeurs d'emploi).\",\r\n\"emanciper\": \"Sessions de recrutement par simulation, d\u00e9tection de potentiels, passerelles \u00e9tablissements scolaires \u2192 AFPA \u2192 formations. 3 laur\u00e9ats du Concours Fairiades (3 000 \u20ac)\",\r\n\"reveler\": \"142 intervenants, publication d'Actes aux Presses des Mines, liens inter-sectoriels spontan\u00e9s (patronni\u00e8re + r\u00e9alisateur documentaire \u2192 projet film), effet de \u00ab contagion \u00bb entre intervenants fort effet de levier et de rayonnement.\"\r\n},\r\n{\r\n\"theme\": \"EMPLOI\/INSERTION\",\r\n\"porteur\": \"LES JARDINS DE L'ESPERANCE\",\r\n\"projet\": \"Ramassage des plantes invasives : protection des \u00e9cosyst\u00e8mes du littoral, de la biodiversit\u00e9 et insertion\",\r\n\"resume\": \"Projet d'insertion par l'activit\u00e9 \u00e9conomique articul\u00e9 \u00e0 la pr\u00e9servation des milieux naturels du littoral, \u00e0 destination de jeunes de moins de 30 ans \u00e0 La Ciotat.\",\r\n\"territoire\": \"La Ciotat\",\r\n\"fis\": \"20\u202f000,00 \u20ac\",\r\n\"budget\": \"132\u202f537,00 \u20ac\",\r\n\"partFis\": \"15,1%\",\r\n\"personnes\": \"NR\",\r\n\"actions\": \"Chantiers participatifs site Sainte-Fr\u00e9touse (\u00ab Agir pour le patrimoine \u00bb) : restauration murs en pierre s\u00e8che, arrachage des plantes invasives, r\u00e9colte d'olives + press\u00e9e d'huile\",\r\n\"inventaire\": \"chantiers participatifs sur le site de Sainte-Fr\u00e9touse ; restauration de murs en pierre s\u00e8che ; arrachage de plantes invasives, r\u00e9colte et pressage d'olives\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR\",\r\n\"competences\": \"3 livrets d'information produits (taille douce des oliviers, murs en pierre s\u00e8che, plantes invasives) dans le cadre du Parc national des Calanques\",\r\n\"lienSocial\": \"Retours participants positifs (d\u00e9claratif) : convivialit\u00e9, rencontre de nouvelles personnes, apprentissage pratique autour du patrimoine et de la biodiversit\u00e9\",\r\n\"comportement\": \"NR\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"Rapport d'activit\u00e9 association 2024 (p.16). ATTENTION : le p\u00f4le Insertion de la m\u00eame association (chantier \u00ab Paysages et Jardins \u00bb, 6 femmes+40 hommes, \u00e2ge moyen 42 ans) ne correspond pas explicitement \u00e0 la cohorte \u00ab jeunes -30 ans \u00bb vis\u00e9e par cette action FIS \u2014 donn\u00e9e non rattach\u00e9e par prudence.\",\r\n\"freins\": \"Freins financiers : plusieurs cofinancements publics n'ont pas \u00e9t\u00e9 obtenus au niveau esp\u00e9r\u00e9 \u2014 R\u00e9gion r\u00e9alis\u00e9e \u00e0 50% (8 500 \u20ac sur 17 000 \u20ac pr\u00e9vus), Intercommunalit\u00e9\/EPCI \u00e0 35% (7 000 \u20ac sur 20 000 \u20ac), D\u00e9partement \u00e0 73% (39 920 \u20ac sur 54 920 \u20ac), et aides priv\u00e9es \u00e0 seulement 44% (15 000 \u20ac sur 34 000 \u20ac). Un d\u00e9ficit de tr\u00e9sorerie de 887 \u20ac a \u00e9t\u00e9 constat\u00e9 en fin d'exercice, bien que l'association qualifie cet \u00e9cart de non significatif.\\n\\nFreins logistiques\/op\u00e9rationnels : le poste \\\"Formation des salari\u00e9s\\\" a explos\u00e9 \u00e0 128% du pr\u00e9visionnel (97 014 \u20ac r\u00e9alis\u00e9s contre 75 941 \u20ac pr\u00e9vus), li\u00e9 \u00e0 la formation des salari\u00e9s en insertion, g\u00e9n\u00e9rant un surco\u00fbt impr\u00e9vu sur les services ext\u00e9rieurs (124% au global).\",\r\n\"ameliorer\": \"Retours participants positifs (convivialit\u00e9, apprentissage pratique) autour du patrimoine et de la biodiversit\u00e9 du Parc national des Calanques.\",\r\n\"emanciper\": \"3 livrets d'information produits (taille douce des oliviers, murs en pierre s\u00e8che, plantes invasives) capitalisation de savoir-faire transf\u00e9rable. Une mont\u00e9e en comp\u00e9tence des participants.\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"EMPLOI\/INSERTION\",\r\n\"porteur\": \"La Caravelle\",\r\n\"projet\": \"Plateforme achats solidaires\",\r\n\"resume\": \"Projet d'insertion et de solidarit\u00e9 visant \u00e0 am\u00e9liorer le pouvoir d'achat des m\u00e9nages en difficult\u00e9, \u00e0 destination des habitants de Marseille.\",\r\n\"territoire\": \"Marseille\",\r\n\"fis\": \"30\u202f000,00 \u20ac\",\r\n\"budget\": \"60\u202f000,00 \u20ac\",\r\n\"partFis\": \"\",\r\n\"personnes\": \"NR\",\r\n\"actions\": \"3 campagnes achats+r\u00e9unions\",\r\n\"inventaire\": \"3 campagnes d'achats group\u00e9s ; r\u00e9unions avec les associations partenaires\",\r\n\"invPartenaires\": \"20 associations ; 13 fournisseurs\",\r\n\"nbPartenaires\": \"20 asso+13 fournisseurs\",\r\n\"competences\": \"Formation implicite de la charg\u00e9e de projet (Mme Khelifi) aux fonctions de marketing, commercial et communication. Comp\u00e9tences de n\u00e9gociation fournisseurs acquises. Processus de contractualisation et campagnes d'achats formalis\u00e9s.\",\r\n\"lienSocial\": \"Construction d'un r\u00e9seau de solidarit\u00e9 entre structures d'h\u00e9bergement social (Groupement de Coop\u00e9ration). Mise en commun de ressources et de pratiques. Renforcement de la coop\u00e9ration inter-associative dans le secteur de l'h\u00e9bergement.\",\r\n\"comportement\": \"R\u00e9duction des co\u00fbts d'approvisionnement pour les associations partenaires (achats group\u00e9s \u00e0 tarifs pr\u00e9f\u00e9rentiels). Professionnalisation des pratiques d'achat des associations d'h\u00e9bergement. Cr\u00e9ation d'un nouveau process partenarial entre structures du secteur social marseillais.\",\r\n\"sorties\": \"Acc\u00e8s \u00e0 des produits de premi\u00e8re n\u00e9cessit\u00e9 (couches, draps, lait) \u00e0 des prix r\u00e9duits pour les personnes h\u00e9berg\u00e9es. R\u00e9duction indirecte de la pr\u00e9carit\u00e9 mat\u00e9rielle des publics h\u00e9berg\u00e9s. NR : pas de mesure directe de l'impact sur les b\u00e9n\u00e9ficiaires finaux dans le CERFA.\",\r\n\"indicateurs\": \"3 campagnes lanc\u00e9es. 20 partenaires associatifs mobilis\u00e9s. 13 partenaires fournisseurs. Bilan \u00e0 50% d'avancement. FIS r\u00e9alis\u00e9 \u00e0 100% (30 000 \u20ac). Economies r\u00e9alis\u00e9es par les associations : NR (non quantifi\u00e9 dans le CERFA).\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics) : d\u00e9mission de la charg\u00e9e de projet Mme Khelifi (ao\u00fbt 2025) suite \u00e0 surcharge logistique  cumul impossible des fonctions marketing + commercial + magasinier dans un seul poste. \\nFreins logistiques et mat\u00e9riels : locaux La Caravelle inadapt\u00e9s aux volumes (milliers de couches et draps = probl\u00e8me de stockage et reconditionnement). \\nFreins institutionnels et partenariaux : charges fixes non refacturables \u00e0 ce stade  fragilit\u00e9 du mod\u00e8le \u00e9conomique.\\n Freins institutionnels et partenariaux (arr\u00eat\/transition du projet) : projet en pause (pas de recrutement pr\u00e9vu \u00e0 court terme).\",\r\n\"ameliorer\": \"Acc\u00e8s \u00e0 des produits de premi\u00e8re n\u00e9cessit\u00e9 (couches, draps, lait) \u00e0 prix r\u00e9duits pour les personnes h\u00e9berg\u00e9es. R\u00e9duction indirecte de la pr\u00e9carit\u00e9 mat\u00e9rielle.\",\r\n\"emanciper\": \"Professionnalisation des pratiques d'achat et mont\u00e9e en comp\u00e9tences marketing\/n\u00e9gociation. Formalisation d'un processus de contractualisation reproductible.\",\r\n\"reveler\": \"Construction d'un r\u00e9seau de solidarit\u00e9 inter-structures (Groupement de Coop\u00e9ration), mutualisation de ressources effet de levier pour le secteur de l'h\u00e9bergement social marseillais.\"\r\n},\r\n{\r\n\"theme\": \"EMPLOI\/INSERTION\",\r\n\"porteur\": \"AMS Environnement\",\r\n\"projet\": \"Seconde Pousse\",\r\n\"resume\": \"Projet d'insertion par l'activit\u00e9 \u00e9conomique articul\u00e9 \u00e0 la r\u00e9silience alimentaire du territoire, \u00e0 destination de personnes en parcours d'insertion et de familles en pr\u00e9carit\u00e9 alimentaire.\",\r\n\"territoire\": \"La Roque d\u2019Anth\u00e9ron\",\r\n\"fis\": \"20\u202f000,00 \u20ac\",\r\n\"budget\": \"397\u202f556,00 \u20ac\",\r\n\"partFis\": \"5,6%\",\r\n\"personnes\": \"Personnes en insertion impliqu\u00e9es : 32 personnes\",\r\n\"actions\": \"8 ateliers cuisine, 856 arbres, 1 168 paniers solidaires\",\r\n\"inventaire\": \"8 ateliers de cuisine ; 856 arbres plant\u00e9s ; 1 168 paniers solidaires distribu\u00e9s\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"\",\r\n\"competences\": \"\",\r\n\"lienSocial\": \"\",\r\n\"comportement\": \"\",\r\n\"sorties\": \"\",\r\n\"indicateurs\": \"\",\r\n\"freins\": \"Freins financiers : la subvention \u00c9tat \\\"Travail et Solidarit\u00e9\\\" a \u00e9t\u00e9 r\u00e9alis\u00e9e \u00e0 seulement 4% du pr\u00e9vu (8 284 \u20ac sur 194 690 \u20ac pr\u00e9vus) \u2014 un \u00e9cart consid\u00e9rable. Les aides priv\u00e9es ont \u00e9galement fortement chut\u00e9, r\u00e9alis\u00e9es \u00e0 14% (1 294 \u20ac sur 9 250 \u20ac pr\u00e9vus), et le total des produits n'atteint que 90% du pr\u00e9visionnel (356 847 \u20ac sur 397 556 \u20ac), cr\u00e9ant un d\u00e9s\u00e9quilibre puisque les charges, elles, ont \u00e9t\u00e9 ex\u00e9cut\u00e9es \u00e0 100% (399 240 \u20ac). L'association mentionne explicitement une \\\"baisse des commandes publiques\\\" comme facteur explicatif.\\n\\nFreins institutionnels\/administratifs : des changements de m\u00e9thodes comptables ont compliqu\u00e9 le suivi budg\u00e9taire \u2014 int\u00e9gration de nouveaux transferts de charges (s\u00e9curit\u00e9 sociale, formations, cotisations OPCO) et disparition du compte \\\"79 - Transfert de charges\\\", n\u00e9cessitant une r\u00e9affectation vers un autre poste comptable.\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"PARTICIPATION\",\r\n\"porteur\": \"Les Muses Urbaines\",\r\n\"projet\": \"Bus Ensemble(s)\",\r\n\"resume\": \"Projet de participation citoyenne visant \u00e0 cr\u00e9er des espaces de rencontre et d'implication au plus pr\u00e8s des quartiers, \u00e0 destination des habitants des quartiers prioritaires de Marseille.\",\r\n\"territoire\": \"QPV Marseille\",\r\n\"fis\": \"60\u202f000,00 \u20ac\",\r\n\"budget\": \"133\u202f859,00 \u20ac\",\r\n\"partFis\": \"44,8%\",\r\n\"personnes\": \"Environ 350 personnes touch\u00e9es : ~230 habitants adultes (sond\u00e9s + portraits) ; ~65 jeunes ; ~55 acteurs locaux\/associatifs. Restitutions : ~50 personnes (Castellane) + >70 personnes (Paternelle). Questionnaire soumis \u00e0 440+ personnes (M\u00e9canique de la cit\u00e9, financ\u00e9 contrat de ville)\",\r\n\"actions\": \"2 restitutions+2 balades+2 Q\u00c9+9 classes\",\r\n\"inventaire\": \"2 restitutions publiques ; 2 balades urbaines ; 2 enqu\u00eates par questionnaire ; 9 classes en atelier\",\r\n\"invPartenaires\": \"13 partenaires\",\r\n\"nbPartenaires\": \"13\",\r\n\"competences\": \"Ateliers dessin et conception 3D enfants (Castellane). Ateliers num\u00e9riques (mod\u00e9lisation cit\u00e9 id\u00e9ale). Sensibilisation num\u00e9rique. Formation stagiaire M2 AMU (am\u00e9nagement\/urbanisme, 6 mois). Stagiaire M2 g\u00e9ographie TELEMME (nov. 2024 +). Atelier participatif place des Marseillaises (26\/03\/2025). Captations sonores.\",\r\n\"lienSocial\": \"Central : \u00ab tisser les liens d'entraide de pair \u00e0 pair \u00bb (Journ\u00e9e des liens). Sentiment d'appartenance au quartier renforc\u00e9. Cr\u00e9ation d'un groupe WhatsApp Belsunce (extension num\u00e9rique du collectif). Forum associatif Air Bel : mise en r\u00e9seau associations + habitants. Entraide interg\u00e9n\u00e9rationnelle (s\u00e9niors, enfants, jeunes).\",\r\n\"comportement\": \"Prise de conscience de l'histoire et de l'\u00e9volution de leur cadre de vie par les habitants. Appropriation de nouveaux outils num\u00e9riques (ateliers 3D, mod\u00e9lisation). \u00c9l\u00e8ves : \u00ab prendre conscience de l'\u00e9volution de leur cadre de vie \u00bb (rapport). Habitants : r\u00e9flexions sur droits bailleurs \/ cadre de vie (Ch\u00e2teau Saint Loup).\",\r\n\"sorties\": \"Projet emploi : 97 jeunes orient\u00e9s vers dispositifs (2023\u20132024). Acc\u00e8s aux droits des locataires facilit\u00e9 (ateliers d\u00e9cret 1987, Ch\u00e2teau Saint Loup). Pas d'indicateurs chiffr\u00e9s de sorties positives emploi\/formation sur l'action Bus Ensemble(s) sp\u00e9cifiquement.\",\r\n\"indicateurs\": \"Questionnaire Veolia (habitudes tri). Questionnaire M\u00e9canique de la cit\u00e9 (440 r\u00e9pondants, implication habitants). Balade num\u00e9rique g\u00e9olocalis\u00e9e. Interface IA (en cours). 15 portraits habitants. Captations sonores.\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics)Renouvellement total de l'\u00e9quipe (4 d\u00e9parts sept.\u2013d\u00e9c. 2024). Actions report\u00e9es sur 2025. \\nFreins institutionnels et partenariauxVersement tardif des financements (ville de Marseille : 15 000\u20ac sur 40 000\u20ac demand\u00e9s  38% de r\u00e9alisation). \\nFreins logistiques et mat\u00e9rielsRecrutement apprenti 3D termin\u00e9, d\u00e9veloppement app. g\u00e9olocalisation report\u00e9 2025.\",\r\n\"ameliorer\": \"Acc\u00e8s aux droits des locataires facilit\u00e9 (ateliers d\u00e9cret 1987, Ch\u00e2teau Saint Loup). Des jeunes orient\u00e9s vers des dispositifs emploi (2023-2024).\",\r\n\"emanciper\": \"Formation de 2 stagiaires M2 (am\u00e9nagement\/urbanisme, g\u00e9ographie). Appropriation par les habitants de nouveaux outils num\u00e9riques (3D, mod\u00e9lisation) et de leur cadre de vie et de leurs droits.\",\r\n\"reveler\": \"\u00ab Tisser les liens d'entraide de pair \u00e0 pair \u00bb, cr\u00e9ation d'un groupe WhatsApp Belsunce, Forum associatif Air Bel mettant en r\u00e9seau associations et habitants dynamique de mise en visibilit\u00e9 du quartier.\"\r\n},\r\n{\r\n\"theme\": \"PARTICIPATION\",\r\n\"porteur\": \"CEPEP\",\r\n\"projet\": \"Maison de l'\u00e9ducation populaire et de la participation\",\r\n\"resume\": \"Projet de participation citoyenne visant \u00e0 installer dans la dur\u00e9e un espace d'implication et de pouvoir d'agir, \u00e0 destination des habitants du quartier de Belsunce \u00e0 Marseille.\",\r\n\"territoire\": \"QPV AMP\",\r\n\"fis\": \"37\u202f000,00 \u20ac\",\r\n\"budget\": \"52\u202f900,00 \u20ac\",\r\n\"partFis\": \"69,9%\",\r\n\"personnes\": \"300\",\r\n\"actions\": \"3 parcours + 12 journ\u00e9es de formation gratuites + 7 projets\",\r\n\"inventaire\": \"12 journ\u00e9es de formation gratuites ; 3 parcours de formation ; 7 projets d'habitants accompagn\u00e9s\",\r\n\"invPartenaires\": \"18 collectifs accompagn\u00e9s, sur 2 territoires\",\r\n\"nbPartenaires\": \"18 Collectifs accompagn\u00e9s sur deux territoires\",\r\n\"competences\": \"Mont\u00e9e en comp\u00e9tence expression \u00e0 l'oral \/ 80% des participants d\u00e9clarent une am\u00e9lioration de la confiance en soi\",\r\n\"lienSocial\": \"Rapport \u00e0 l'autre, int\u00e9gration des habitants dans la conception des projets\",\r\n\"comportement\": \"R\u00e9appropriation des trajectoires\",\r\n\"sorties\": \"6 personnes engag\u00e9es dans un collectif \u00e0 l'issue du parcours\",\r\n\"indicateurs\": \"NR\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics) \/ Freins institutionnels et partenariaux\",\r\n\"ameliorer\": \"R\u00e9appropriation des trajectoires personnelles. 80% des participants d\u00e9clarent une am\u00e9lioration de la confiance en soi.\",\r\n\"emanciper\": \"Mont\u00e9e en comp\u00e9tence \u00e0 l'expression orale. Favoriser l'engagement citoyen.\",\r\n\"reveler\": \"Int\u00e9gration des habitants dans la conception m\u00eame des projets, une valorisation des savoirs faire habitant\"\r\n},\r\n{\r\n\"theme\": \"PARTICIPATION\",\r\n\"porteur\": \"Ligue Ens. 13\",\r\n\"projet\": \"Microprojets FIS\",\r\n\"resume\": \"Dispositif de soutien \u00e0 l'initiative citoyenne visant \u00e0 accompagner l'\u00e9mergence de projets locaux, \u00e0 destination des habitants et des petites associations des quartiers prioritaires de la m\u00e9tropole.\",\r\n\"territoire\": \"QPV AMP\",\r\n\"fis\": \"150\u202f000,00 \u20ac\",\r\n\"budget\": \"200\u202f015,00 \u20ac\",\r\n\"partFis\": \"75,0%\",\r\n\"personnes\": \"300\",\r\n\"actions\": \"2 commissions+2 journ\u00e9es+20+ rdv\",\r\n\"inventaire\": \"2 commissions qui ont financ\u00e9 12 microprojets ; 2 journ\u00e9es de rencontre entre collectifs ; 20+ rendez-vous d'accompagnement\",\r\n\"invPartenaires\": \"co-organisation avec FLD ; ManuFabriK et des bailleurs sociaux\",\r\n\"nbPartenaires\": \"FLD (co-org.)+ManuFabriK+bailleurs\",\r\n\"competences\": \"12 microprojets soutenus (10 \u00e0 3 000 \u20ac + 2 \u00e0 5 000 \u20ac). Accompagnement des porteurs par le service vie asso de la Ligue. Sensibilisation au droit des locataires. Acc\u00e8s au financement pour collectifs sans compte bancaire (soutien \u00e0 l'ouverture de structures).\",\r\n\"lienSocial\": \"Central : \u00ab tisser les liens d'entraide de pair \u00e0 pair \u00bb. Journ\u00e9es de liens = espace de rencontre inter-collectifs. Soutien \u00e0 l'auto-organisation de voisinage. Reconnexion de collectifs invisibles au tissu institutionnel local. \u00ab Chaque jour un travail de coh\u00e9sion sociale dont personne ne mesure l'importance \u00bb.\",\r\n\"comportement\": \"Collectifs qui \u00ab s'interrogent sur leur propre rapport aux moyens financiers \u00bb (rapport). Prise de conscience de la valeur de l'engagement b\u00e9n\u00e9vole. Passage progressif de l'informel vers la formalisation associative. Autonomisation des porteurs : \u00ab un r\u00e9v\u00e9lateur de leur \u00e9nergie \u00bb.\",\r\n\"sorties\": \"NR \u2014 Pas d'indicateurs de sorties positives (emploi, droits, formation) document\u00e9s sp\u00e9cifiquement pour ce dispositif.\",\r\n\"indicateurs\": \"Nb de microprojets soutenus \/ sessions de commission. Profil des porteurs (femmes, jeunes, diversit\u00e9). Nb de collectifs mis en r\u00e9seau (Journ\u00e9e des liens). \u00c9volution du nombre de porteurs candidats d'une session \u00e0 l'autre (augmentation constat\u00e9e).\",\r\n\"freins\": \"Freins institutionnels et partenariaux- Fonds re\u00e7us au milieu du second semestre (commission tardive). \\nFreins logistiques et mat\u00e9riels-Pas d'outils de suivi formalis\u00e9s en amont (investissement en ing\u00e9nierie en d\u00e9but d'action). Freins humains (\u00e9quipes et publics)- Collectifs porteurs sans compte bancaire ni structure juridique formelle.\",\r\n\"ameliorer\": \"Acc\u00e8s au financement facilit\u00e9 pour des collectifs sans compte bancaire. Sensibilisation au droit des locataires.\",\r\n\"emanciper\": \"Passage progressif de l'informel vers la formalisation associative, prise de conscience du rapport aux moyens financiers, autonomisation des porteurs.\",\r\n\"reveler\": \"Journ\u00e9es de liens reconnecte des collectifs invisibles au tissu institutionnel \u00ab chaque jour un travail de coh\u00e9sion sociale dont personne ne mesure l'importance \u00bb.\"\r\n},\r\n{\r\n\"theme\": \"PARTICIPATION\",\r\n\"porteur\": \"EnVies EnJeux 13\",\r\n\"projet\": \"Budget participatif quartier Corsy\",\r\n\"resume\": \"Projet de participation citoyenne visant \u00e0 associer les habitants aux d\u00e9cisions concernant leur quartier par un budget participatif, \u00e0 destination des habitants des quartiers prioritaires concern\u00e9s.\",\r\n\"territoire\": \"QPV Le Charrel, Aix-en-Provence\",\r\n\"fis\": \"15\u202f000,00 \u20ac\",\r\n\"budget\": \"19\u202f136,00 \u20ac\",\r\n\"partFis\": \"78,4%\",\r\n\"personnes\": \"500 habitant\u00b7e\u00b7s d\u00e8s 6 ans (400 femmes, 100 hommes)\",\r\n\"actions\": \"3 ateliers diagnostic partag\u00e9 + 3 ateliers solutions + 4 temps de vote (dont 1 journ\u00e9e le 22\/03) + 6 r\u00e9unions de coordination\",\r\n\"inventaire\": \"6 ateliers avec les habitants (diagnostic, puis solutions) ; 4 temps de vote ; 6 r\u00e9unions de coordination\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR (partenaires associatifs mentionn\u00e9s mais non list\u00e9s dans le CERFA)\",\r\n\"competences\": \"NR\",\r\n\"lienSocial\": \"Diagnostic territorial partag\u00e9 et budget participatif coconstruits avec l'\u00e9quipe projet et les habitant\u00b7e\u00b7s\",\r\n\"comportement\": \"NR\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"500 habitants mobilis\u00e9s \/ 4 temps de vote\",\r\n\"freins\": \"NR\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"\",\r\n\"reveler\": \"Valorisation du v\u00e9cu des habitant\u00b7e\u00b7s par la coconstruction du projet\"\r\n},\r\n{\r\n\"theme\": \"PARTICIPATION\",\r\n\"porteur\": \"EnVies EnJeux 13\",\r\n\"projet\": \"Budget participatif QPV Le Charrel\",\r\n\"resume\": \"Projet de participation citoyenne visant \u00e0 associer les habitants aux d\u00e9cisions concernant leur quartier par un budget participatif, \u00e0 destination des habitants des quartiers prioritaires concern\u00e9s.\",\r\n\"territoire\": \"Quartier Corsy, Aubagne\",\r\n\"fis\": \"15\u202f000,00 \u20ac\",\r\n\"budget\": \"15\u202f000,00 \u20ac\",\r\n\"partFis\": \"100,0%\",\r\n\"personnes\": \"290 habitant\u00b7e\u00b7s d\u00e8s 10 ans\",\r\n\"actions\": \"17h30 d'aller-vers + 5 ateliers habitants + 2 ateliers solutions + 1 journ\u00e9e de vote (26\/04)\",\r\n\"inventaire\": \"17,5 heures d'aller-vers dans le quartier ; 7 ateliers avec les habitants ; 1 journ\u00e9e de vote\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR\",\r\n\"competences\": \"NR\",\r\n\"lienSocial\": \"Mobilisation citoyenne du quartier Corsy, vote participatif dans l'espace public et au centre social Camus\",\r\n\"comportement\": \"NR\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"290 habitants mobilis\u00e9s \/ 1 journ\u00e9e de vote\",\r\n\"freins\": \"NR\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"Mobilisation citoyenne et vote participatif dans l'espace public exercice concret du pouvoir de choisir.\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"PARTICIPATION\",\r\n\"porteur\": \"Ellipsis Effect\",\r\n\"projet\": \"T-shirt+Collectif Belsunce (Tiers-lieu Twali)\",\r\n\"resume\": \"Projet de participation citoyenne et de lien social autour d'un tiers-lieu de quartier, visant \u00e0 renforcer les coop\u00e9rations locales, \u00e0 destination des habitants et des collectifs de Belsunce \u00e0 Marseille.\",\r\n\"territoire\": \"Belsunce Mlle\",\r\n\"fis\": \"10\u202f000,00 \u20ac\",\r\n\"budget\": \"34\u202f050,00 \u20ac\",\r\n\"partFis\": \"29,4%\",\r\n\"personnes\": \"1000\",\r\n\"actions\": \"~18 (7 \u00e9v\u00e9nements+3 r\u00e9unions+3+2)\",\r\n\"inventaire\": \"7 \u00e9v\u00e9nements ; 3 r\u00e9unions du collectif de Belsunce ; 2 balades urbaines\",\r\n\"invPartenaires\": \"5 structures : Twali, IMVT, Ma3na, Hors Normes, Marsiens\",\r\n\"nbPartenaires\": \"Twali, IMVT, Ma3na, Hors Normes, Marsiens\",\r\n\"competences\": \"Ateliers d'\u00e9criture Hors Normes (1 s\u00e9ance\/mois sept.\u2013d\u00e9c. 2024). Balades urbaines d\u00e9couverte jardins\/\u00eelots de fra\u00eecheur (2). Atelier participatif place des Marseillaises (26\/03\/2025). Na3na3 podcast en live (20\/09\/2024). Collectif Belsunce (3 r\u00e9unions : 12\/11\/2024, 13\/03\/2025, 24\/06\/2025).\",\r\n\"lienSocial\": \"Central : \u00ab augmenter le nombre d'espaces et de temps d\u00e9di\u00e9s \u00e0 des communaut\u00e9s encore tr\u00e8s peu repr\u00e9sent\u00e9es \u00e0 Marseille \u00bb. Sentiment d'appartenance (Collectif Belsunce). Mise en r\u00e9seau associations inter-quartiers (25\/04\/2025). Accueil inconditionnel de populations migrantes et marginalis\u00e9es.\",\r\n\"comportement\": \"Investissement croissant des habitants dans la vie du quartier (groupe WhatsApp Belsunce \u00ab augmente chaque jour \u00bb). Discussions informelles confirment le besoin de ce type d'espaces pour les communaut\u00e9s marginalis\u00e9es. Co-appropriation de l'espace public (balades, atelier place des Marseillaises).\",\r\n\"sorties\": \"NR \u2014 Pas d'indicateurs de sorties positives formalis\u00e9s.\",\r\n\"indicateurs\": \"Nb membres groupe WhatsApp Belsunce (croissance continue). Nb participants\/\u00e9v\u00e9nement. Ad\u00e9quation des communaut\u00e9s mobilis\u00e9es avec les th\u00e9matiques. Pertinence de la co-construction (retours informels des publics).\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics)Budget r\u00e9duit de plus de moiti\u00e9 par rapport au pr\u00e9visionnel (26k\u20ac \u2192 14k\u20ac) ; invitations intervenants r\u00e9duites de 2\/3. \\nFreins institutionnels et partenariauxCo-financement ville non obtenu (15k\u20ac sur 40k\u20ac). \\nFreins logistiques et mat\u00e9rielsCharges locatives graci\u00e9es par Twali (\u00e9conomie sans cash). \\nFreins financiersFonds propres tr\u00e8s limit\u00e9s (aides priv\u00e9es = 1 000 \u20ac).\",\r\n\"ameliorer\": \"Co-appropriation de l'espace public (balades urbaines, atelier place des Marseillaises) par des communaut\u00e9s peu repr\u00e9sent\u00e9es \u00e0 Marseille.\",\r\n\"emanciper\": \"Ateliers d'\u00e9criture et podcast offrant un espace d'expression.\",\r\n\"reveler\": \"Augmentation des espaces et temps d\u00e9di\u00e9s \u00e0 des communaut\u00e9s peu visibles \u00e0 Marseille (Collectif Belsunce), mise en r\u00e9seau associations inter-quartiers, accueil de populations marginalis\u00e9es.\"\r\n},\r\n{\r\n\"theme\": \"PARTICIPATION\",\r\n\"porteur\": \"Le Mouvement Associatif R\u00e9gion Sud Provence-Alpes-C\u00f4te d\u2019Azur\",\r\n\"projet\": \"\u00ab La journ\u00e9e de l\u2019engagement \u00bb\",\r\n\"resume\": \"\u00c9v\u00e9nement d'\u00e9ducation \u00e0 la citoyennet\u00e9 visant \u00e0 encourager l'engagement associatif, \u00e0 destination des jeunes des quartiers prioritaires.\",\r\n\"territoire\": \"\",\r\n\"fis\": \"35\u202f000,00 \u20ac\",\r\n\"budget\": \"55\u202f000,00 \u20ac\",\r\n\"partFis\": \"63,6%\",\r\n\"personnes\": \"\",\r\n\"actions\": \"\",\r\n\"inventaire\": \"NR\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"\",\r\n\"competences\": \"\",\r\n\"lienSocial\": \"\",\r\n\"comportement\": \"\",\r\n\"sorties\": \"\",\r\n\"indicateurs\": \"\",\r\n\"freins\": \"\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"PARTICIPATION\",\r\n\"porteur\": \"Les D\u00e9termin\u00e9s\",\r\n\"projet\": \"Asso'DTR\",\r\n\"resume\": \"Programme d'accompagnement visant \u00e0 renforcer les capacit\u00e9s de d\u00e9veloppement des petites structures associatives, \u00e0 destination des porteurs de projet de l'ESS \u00e0 Marseille.\",\r\n\"territoire\": \"Marseille\",\r\n\"fis\": \"35\u202f000,00 \u20ac\",\r\n\"budget\": \"51\u202f144,00 \u20ac\",\r\n\"partFis\": \"68,4%\",\r\n\"personnes\": \"12 associations locales b\u00e9n\u00e9ficiaires directes, repr\u00e9sentant 12 \u00e0 15 personnes b\u00e9n\u00e9ficiaires directes (dirigeant\u00b7es et membres de bureaux associatifs impliqu\u00e9s dans la gouvernance et le pilotage des projets)\",\r\n\"actions\": \"Programme structur\u00e9 de novembre \u00e0 f\u00e9vrier (masterclass collectives + accompagnement individualis\u00e9). Sessions principales : 27 novembre (World Trade Center, Marseille), 11 d\u00e9cembre et 8 janvier (Centre d'Affaires Le 40, Marseille)\",\r\n\"inventaire\": \"3 sessions collectives de masterclass ; 12 associations accompagn\u00e9es individuellement ; mentorat et mise en r\u00e9seau entre pairs\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR \u2014 les 12 associations sont les b\u00e9n\u00e9ficiaires directes du dispositif, pas des partenaires au sens strict ; aucun partenaire externe chiffr\u00e9 dans le CERFA\",\r\n\"competences\": \"Formation collective (masterclass) et accompagnement individualis\u00e9 sur la structuration du projet associatif, le cadre juridique, le mod\u00e8le \u00e9conomique, les financements publics\/priv\u00e9s, la communication et la valorisation de l'impact ; dispositif de mentorat et de mise en r\u00e9seau entre pairs\",\r\n\"lienSocial\": \"100 % des associations ont identifi\u00e9 des pistes de mutualisation ou de coop\u00e9ration, avec d'autres associations du programme ou d'autres acteurs du territoire\",\r\n\"comportement\": \"40 % des participants pr\u00e9voient d'appliquer les enseignements sous 30 jours, 60 % sous 6 mois. 100 % se d\u00e9clarent satisfaits ou tr\u00e8s satisfaits du programme, 100 % indiquent recommander le dispositif. 90 % se disent int\u00e9ress\u00e9s par un format d'accompagnement plus long\",\r\n\"sorties\": \"NR \u2014 pas de mesure de sorties positives au sens emploi\/formation ; dispositif d'accompagnement associatif\",\r\n\"indicateurs\": \"Source : CERFA compte-rendu financier de subvention (association loi 1901, formulaire n\u00b015059*02). 12 associations engag\u00e9es sur l'ensemble du parcours avec participation r\u00e9guli\u00e8re aux temps de formation et d'accompagnement. Budget r\u00e9alis\u00e9 conforme au pr\u00e9visionnel (51 144 \u20ac, 100 %). Subvention FIS 35 000 \u20ac = 68,43 % du total des produits. Sign\u00e9 le 14 janvier 2026 \u00e0 Paris (Moussa Camara).\",\r\n\"freins\": \"NR \u2014 aucun \u00e9cart significatif entre budget pr\u00e9visionnel et ex\u00e9cut\u00e9 ; aucune difficult\u00e9 particuli\u00e8re rencontr\u00e9e dans l'ex\u00e9cution financi\u00e8re de l'action (source CERFA)\",\r\n\"ameliorer\": \"100% des associations satisfaites. Impact ressenti positif sur le quotidien associatif.\",\r\n\"emanciper\": \"Formation collective et accompagnement individualis\u00e9 (structuration juridique, mod\u00e8le \u00e9conomique, financements). Autonomisation du pilotage associatif.\",\r\n\"reveler\": \"100% des associations ont identifi\u00e9 des pistes de mutualisation ou de coop\u00e9ration via le mentorat et la mise en r\u00e9seau entre pairs effet d'entra\u00eenement inter-associatif.\"\r\n},\r\n{\r\n\"theme\": \"SANT\u00c9\",\r\n\"porteur\": \"Salon Action Sant\u00e9\",\r\n\"projet\": \"Cuisine et Sant\u00e9\",\r\n\"resume\": \"Projet de pr\u00e9vention sant\u00e9 et d'alimentation visant \u00e0 promouvoir de meilleures pratiques alimentaires au plus pr\u00e8s des habitants, \u00e0 destination des familles des quartiers prioritaires de Salon-de-Provence et de Berre.\",\r\n\"territoire\": \"Bressons, Monaque, Canourgues, Vieux Moulin (Salon-de-Provence)\",\r\n\"fis\": \"10\u202f000,00 \u20ac\",\r\n\"budget\": \"26\u202f000,00 \u20ac\",\r\n\"partFis\": \"38,5%\",\r\n\"personnes\": \"200 dont 126 enfants\",\r\n\"actions\": \"21 ateliers (9 ateliers collecitfs dont 5 avec la cuisine mobile)\",\r\n\"inventaire\": \"21 ateliers cuisine et sant\u00e9, dont 9 collectifs et 5 avec la cuisine mobile\",\r\n\"invPartenaires\": \"5 partenaires\",\r\n\"nbPartenaires\": \"5\",\r\n\"competences\": \"Mont\u00e9e en comp\u00e9tences culinaires et nutritionnelles des participants. Ateliers pratiques de cuisine (recettes \u00e9quilibr\u00e9es \u00e0 petit budget). Formation implicite des parents \u00e0 travers les actions enfants-parents.\",\r\n\"lienSocial\": \"Cr\u00e9ation de liens sociaux autour de la cuisine (repas partag\u00e9s document\u00e9s : 24\/10 La Monaque 'Cuisine et repas partage'). Mixit\u00e9 interg\u00e9n\u00e9rationnelle (enfants, adultes, s\u00e9niors). Ancrage dans la f\u00eate de quartier (11\/09 La Monaque f\u00eate du Vieux Moulin).\",\r\n\"comportement\": \"Les objectifs de la premi\u00e8re phase de l'action sont largement d\u00e9pass\u00e9s (mention explicite CERFA). Changement de comportements alimentaires et nutritionnels vis\u00e9 via la pratique culinaire collective. Apprentissage par le faire ensemble (ateliers participatifs).\",\r\n\"sorties\": \"Acc\u00e8s \u00e0 une alimentation \u00e9quilibr\u00e9e pour des familles \u00e0 faibles revenus en QPV. Sorties positives indirectes : am\u00e9lioration des pratiques alimentaires parentales b\u00e9n\u00e9ficiant aux enfants. Objectif de r\u00e9daction d'un cahier des charges en ann\u00e9e 2 = capitalisation pour essaimage.\",\r\n\"indicateurs\": \"500 personnes touch\u00e9es via ateliers collectifs. 22 ateliers r\u00e9alis\u00e9s dont 9 avec cuisine mobile. 13 enfants en accompagnement individuel. Objectifs phase 1 largement d\u00e9pass\u00e9s (mention CERFA). FIS M\u00e9tropole : 10 000 \u20ac r\u00e9alis\u00e9s sur 20 000 \u20ac pr\u00e9vus (50%).\",\r\n\"freins\": \"Freins institutionnels et partenariaux : FIS M\u00e9tropole r\u00e9alis\u00e9 \u00e0 50% (10 000 \u20ac sur 20 000 \u20ac pr\u00e9vus)  versement partiel. CD13 r\u00e9alis\u00e9 \u00e0 38% (1 500 \u20ac sur 4 000 \u20ac pr\u00e9vus).\\n Freins logistiques et mat\u00e9riels : recours \u00e0 la cuisine mobile Mosa\u00efk = d\u00e9pendance \u00e0 un outil itin\u00e9rant externe. \\nTr\u00e8s peu d'\u00e9carts budg\u00e9taires signal\u00e9s par la structure (mention explicite dans le CERFA).\",\r\n\"ameliorer\": \"Acc\u00e8s \u00e0 une alimentation \u00e9quilibr\u00e9e pour des familles \u00e0 faibles revenus en QPV. Objectifs de la premi\u00e8re phase largement d\u00e9pass\u00e9s\",\r\n\"emanciper\": \"Mont\u00e9e en comp\u00e9tences culinaires et nutritionnelles, formation implicite des parents \u00e0 travers des actions enfants-parents.\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"SANT\u00c9\",\r\n\"porteur\": \"Coeur de Cagoles\",\r\n\"projet\": \"Pr\u00e9carit\u00e9 menstruelle\",\r\n\"resume\": \"Projet de sant\u00e9 et de pr\u00e9vention visant \u00e0 informer sur la sant\u00e9 menstruelle et \u00e0 lever les tabous associ\u00e9s, \u00e0 destination des femmes des quartiers prioritaires de Marseille.\",\r\n\"territoire\": \"Marseille multi\",\r\n\"fis\": \"10\u202f000,00 \u20ac\",\r\n\"budget\": \"73\u202f831,00 \u20ac\",\r\n\"partFis\": \"13,5%\",\r\n\"personnes\": \"Environ 675 (\",\r\n\"actions\": \"26 actions (8 ateliers \u00ab R\u00e8gles du JE \u00bb, 10 stands de sensibilisation, 8 ateliers couture)\",\r\n\"inventaire\": \"8 ateliers-jeux sur la sant\u00e9 menstruelle ; 10 stands de sensibilisation ; 8 ateliers de couture de serviettes lavables\",\r\n\"invPartenaires\": \"27 partenaires\",\r\n\"nbPartenaires\": \"27\",\r\n\"competences\": \"Ateliers 'R\u00e8gles du JE' : formation \u00e0 la sant\u00e9 menstruelle, d\u00e9construction des tabous, information sur les protections internes (CUP, disque). Ateliers couture : apprentissage de la fabrication de serviettes menstruelles lavables (comp\u00e9tences textiles + autonomie). Livret p\u00e9dagogique 'R\u00e8gles\/Sang%\/Cr\u00e9atives' produit et diffus\u00e9.\",\r\n\"lienSocial\": \"\u00c9changes interg\u00e9n\u00e9rationnels document\u00e9s comme 'particuli\u00e8rement enrichissants' (m\u00e8res + filles, jeunes + personnes \u00e2g\u00e9es). Partage de savoir-faire (couture). Espaces de solidarit\u00e9 et de sororit\u00e9 cr\u00e9\u00e9s. Dynamique participative forte not\u00e9e dans les retours.\",\r\n\"comportement\": \"Vif int\u00e9r\u00eat des participantes document\u00e9. Nombreuses participantes sans connaissance des protections internes (CUP, disque menstruel) \u2192 acquisition de connaissances r\u00e9elle. D\u00e9construction de mythes (interdiction bain\/douche pendant les r\u00e8gles, etc.) document\u00e9e qualitativement. Retours unanimement positifs : satisfaction et envie de renouveler. Cadre bienveillant permettant les premiers partages de v\u00e9cu personnel (t\u00e9moignages).\",\r\n\"sorties\": \"Acc\u00e8s gratuit aux kits de fabrication (150 kits fabriqu\u00e9s au 8 mars) = r\u00e9duction de la pr\u00e9carit\u00e9 menstruelle directe. Autonomisation par la fabrication de serviettes lavables (\u00e9conomie ~3 800 \u20ac sur une vie). Orientation vers Planning Familial, CIDFF, ressources en ligne (parlonsregles.fr, endomind.org).\",\r\n\"indicateurs\": \"Nuage de mots collectif (indicateur qualitatif d'entr\u00e9e \u2014 50+ mots collect\u00e9s). 150 kits fabriqu\u00e9s le 8 mars seul. 27 partenaires mobilis\u00e9s. ~29 actions document\u00e9es. Nb moyen de participants par type d'action : 8\/atelier 'R\u00e8gles du JE', 30-70\/stand, 7\/atelier couture, 250 lyc\u00e9ens Aubagne.\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics) : espaces publics parfois inadapt\u00e9s (environnement masculin, ouvert) pour aborder les r\u00e8gles. Annulations li\u00e9es \u00e0 la sant\u00e9 des b\u00e9n\u00e9ficiaires. Emplois du temps contraints pour certains publics. Freins humains (\u00e9quipes et publics) : structure 100% b\u00e9n\u00e9vole = risque d'\u00e9puisement, d\u00e9pendance au b\u00e9n\u00e9volat. Freins financiers : FIS NR = mod\u00e8le \u00e9conomique non visible dans les documents transmis.\",\r\n\"ameliorer\": \"Acc\u00e8s gratuit \u00e0 des kits de fabrication r\u00e9duisant directement la pr\u00e9carit\u00e9 menstruelle.\",\r\n\"emanciper\": \"Formation \u00e0 la sant\u00e9 menstruelle et \u00e0 la couture (autonomie de fabrication), d\u00e9construction de tabous et mythes, orientation vers Planning Familial \/ CIDFF.\",\r\n\"reveler\": \"\u00c9changes interg\u00e9n\u00e9rationnels et espaces de sororit\u00e9 cr\u00e9\u00e9s, partage de savoir-faire dynamique de solidarit\u00e9 valoris\u00e9e dans les retours.\"\r\n},\r\n{\r\n\"theme\": \"SANT\u00c9\",\r\n\"porteur\": \"INCITTA\",\r\n\"projet\": \"Souffrance psychoscociale et violences dans les QPV\",\r\n\"resume\": \"Projet de sant\u00e9 mentale visant \u00e0 outiller les acteurs de proximit\u00e9 face aux situations de souffrance psychosociale et de violence, \u00e0 destination des professionnels de la politique de la ville et du tissu associatif de la m\u00e9tropole.\",\r\n\"territoire\": \"QPV de la M\u00e9tropole Aix-Marseille-Provence (dont Miramas et Ch\u00e2teau Saint-Loup \u00e0 Marseille)\",\r\n\"fis\": \"39\u202f000,00 \u20ac\",\r\n\"budget\": \"39\u202f732,00 \u20ac\",\r\n\"partFis\": \"98,2%\",\r\n\"personnes\": \"100 \u00e0 120\",\r\n\"actions\": \"10 sessions de formation de deux jours, plus 2 volets de recherche-action sur 2 territoires\",\r\n\"inventaire\": \"10 sessions de formation de 2 jours ; 12 jours de recherche-action sur 2 territoires ; 2 synth\u00e8ses territoriales\",\r\n\"invPartenaires\": \"7 types de partenaires\",\r\n\"nbPartenaires\": \"7 types de partenaires\",\r\n\"competences\": \"Pour les agents et partenaires : renforcement des comp\u00e9tences en analyse qualitative et prise en compte de la parole habitante ; pour les habitants : capacit\u00e9 accrue d\u2019expression, de compr\u00e9hension du projet urbain et de participation ; pour l\u2019\u00e9quipe projet : approfondissement des m\u00e9thodes de recherche\u2011action\",\r\n\"lienSocial\": \"Cr\u00e9ation et animation d\u2019espaces de discussion entre habitants et institutions autour du projet ; renforcement des \u00e9changes entre habitants, associations, bailleurs et M\u00e9tropole.\",\r\n\"comportement\": \"\u00c9volution des pratiques professionnelles : meilleure \u00e9coute et orientation des habitants, meilleure compr\u00e9hension des liens entre pr\u00e9carit\u00e9, sant\u00e9 mentale et violences, d\u00e9veloppement d'outils collectifs d'intervention.\",\r\n\"sorties\": \"Exp\u00e9rimentation de d\u00e9marches de recherche-action sur deux territoires, production de synth\u00e8ses territoriales, transfert de comp\u00e9tences et renforcement des capacit\u00e9s d'action des \u00e9quipes locales.\",\r\n\"indicateurs\": \"10 sessions de formation (20 jours), 12 jours de recherche-action sur 2 territoires, 2 synth\u00e8ses territoriales r\u00e9alis\u00e9es, accompagnement m\u00e9thodologique par un sociologue sp\u00e9cialis\u00e9.\",\r\n\"freins\": \"Freins financiers : la subvention de la M\u00e9tropole Aix-Marseille-Provence n'a \u00e9t\u00e9 vers\u00e9e qu'\u00e0 hauteur de 30 000 \u20ac sur 50 000 \u20ac pr\u00e9vus, soit 60% du montant attendu. Le poste \\\"Achats d'\u00e9tudes et de prestations\\\" a \u00e9t\u00e9 fortement r\u00e9duit (5 630 \u20ac r\u00e9alis\u00e9s contre 46 500 \u20ac pr\u00e9vus), l'association ayant \\\"\u00e9prouv\u00e9 la difficult\u00e9 d'orienter la majorit\u00e9 du budget de l'action vers des prestations externes\\\".\\n\\nFreins humains (\u00e9quipes et publics) : face \u00e0 cette contrainte budg\u00e9taire, l'association a d\u00fb r\u00e9orienter son mod\u00e8le en mobilisant fortement son \u00e9quipe salari\u00e9e et b\u00e9n\u00e9vole en interne plut\u00f4t que de recourir \u00e0 des prestataires externes, avec une implication b\u00e9n\u00e9vole \u00e9quivalente \u00e0 2 ETP sur l'ann\u00e9e. Cette r\u00e9organisation reposait sur la connaissance fine du lieu et de son histoire par l'\u00e9quipe interne, jug\u00e9e indispensable mais non budg\u00e9t\u00e9e initialement de cette fa\u00e7on.\\n\\nFreins logistiques : la \\\"dur\u00e9e limit\u00e9e allou\u00e9e \u00e0 cette action\\\" a contraint l'association \u00e0 r\u00e9ajuster son calendrier et son organisation op\u00e9rationnelle pour concr\u00e9tiser les premi\u00e8res exp\u00e9rimentations (Cabanon d'\u00e9t\u00e9, Delta Festival, etc.), g\u00e9n\u00e9rant des d\u00e9penses suppl\u00e9mentaires non anticip\u00e9es.\",\r\n\"ameliorer\": \"Meilleure \u00e9coute et orientation des habitants par les professionnels. Meilleure compr\u00e9hension des liens entre pr\u00e9carit\u00e9, sant\u00e9 mentale et violences.\",\r\n\"emanciper\": \"Renforcement de la capacit\u00e9 d'expression et de participation des habitants, transfert de comp\u00e9tences et de m\u00e9thodes de recherche-action aux \u00e9quipes locales sur deux territoires.\",\r\n\"reveler\": \"Cr\u00e9ation d'espaces de discussion habitants\/institutions, valoriser la l\u00e9gitimit\u00e9 des habitants face aux institutions\"\r\n},\r\n{\r\n\"theme\": \"PR\u00c9C. ALIM.\",\r\n\"porteur\": \"Lieux Publics\",\r\n\"projet\": \"Communaut\u00e9 de la Spatule (Restauration de proximit\u00e9, cit\u00e9 des arts de la rue)\",\r\n\"resume\": \"Projet d'alimentation solidaire visant \u00e0 faciliter l'acc\u00e8s \u00e0 des produits de qualit\u00e9 et \u00e0 cr\u00e9er des temps de repas partag\u00e9s, \u00e0 destination des habitants du quartier des Aygalades \u00e0 Marseille.\",\r\n\"territoire\": \"Aygalades Mlle\",\r\n\"fis\": \"30\u202f000,00 \u20ac\",\r\n\"budget\": \"107\u202f000,00 \u20ac\",\r\n\"partFis\": \"28,0%\",\r\n\"personnes\": \"885\",\r\n\"actions\": \"15+ (ateliers, banquets, \u00e9v\u00e9nements)\",\r\n\"inventaire\": \"15+ ateliers de cuisine, banquets et \u00e9v\u00e9nements\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR (non list\u00e9s nominativement)\",\r\n\"competences\": \"Formation implicite de 6 cuisini\u00e8res mobilis\u00e9es sur la phase 2. Ateliers de cuisine collectifs (pratique du faire ensemble). Cr\u00e9ation d'une association d\u00e9di\u00e9e 'La Spatule des Aygalades' inscrite au registre du commerce.\",\r\n\"lienSocial\": \"Rencontres entre cuisiniers professionnels et artistes ('ponts entre des mondes qui se c\u00f4toient peu d'ordinaire'). Repas de quartier comme espace de mixit\u00e9 sociale. Projet contribuant au 'rayonnement dans le p\u00e9rim\u00e8tre proche' de la Cit\u00e9. ESS : refus de la concurrence avec d'autres cantines.\",\r\n\"comportement\": \"Prise de confiance en soi document\u00e9e qualitativement ('redonner confiance et estime de soi \u00e0 des habitants.es qui en avaient besoin' \u2014 CERFA bilan qualitatif). Inscription de 'La Spatule des Aygalades' au registre du commerce = appropriation institutionnelle par les habitants. Mixit\u00e9 sociale g\u00e9n\u00e9r\u00e9e entre cuisiniers professionnels, artistes et habitants.\",\r\n\"sorties\": \"Acc\u00e8s \u00e0 une alimentation partag\u00e9e pour des personnes pr\u00e9caris\u00e9es (350 repas distribu\u00e9s mars 2025). D\u00e9senclavement de la Cit\u00e9 des arts de la rue vers son voisinage imm\u00e9diat (quartiers Aygalades). \u00c9conomie solidaire locale : cr\u00e9ation d'une nouvelle association citoyenne de cuisine participative.\",\r\n\"indicateurs\": \"Nb repas solidaires distribu\u00e9s : 350 (mars 2025). Nb enfants nourris : 45 (avril). Nb habitants touch\u00e9s repas de quartier : 200 (avril) + 250 (juin) + 600 (dec cumul estim\u00e9 CAR). Cr\u00e9ation d'une association d\u00e9di\u00e9e.\",\r\n\"freins\": \"Freins financiers : FIS r\u00e9alis\u00e9 \u00e0 54,5% du pr\u00e9vu (30 000 \u20ac r\u00e9alis\u00e9s \/ 55 000 \u20ac pr\u00e9vus)  \u00e9cart significatif. Recettes de ventes de produits non r\u00e9alis\u00e9es (18 000 \u20ac pr\u00e9vus \/ 0 r\u00e9alis\u00e9). \\nFreins humains (\u00e9quipes et publics) : projet concentr\u00e9 sur 6 cuisini\u00e8res en phase 2 = risque de concentration du portage b\u00e9n\u00e9vole. \\nFreins logistiques et mat\u00e9riels : locaux CAR mutualis\u00e9s, pas d'espace d\u00e9di\u00e9 cuisine p\u00e9renne.\",\r\n\"ameliorer\": \"Des repas distribu\u00e9s pour des personnes pr\u00e9caris\u00e9es. Confiance et estime de soi restaur\u00e9es chez des habitants.\",\r\n\"emanciper\": \"Cr\u00e9ation d'une association d\u00e9di\u00e9e inscrite au registre du commerce appropriation institutionnelle par les habitants. Formation de cuisini\u00e8res.\",\r\n\"reveler\": \"Ponts cr\u00e9\u00e9s entre cuisiniers professionnels et artistes, rayonnement de la Cit\u00e9 des arts de la rue vers son voisinage (Aygalades) d\u00e9senclavement et mixit\u00e9 sociale.\"\r\n},\r\n{\r\n\"theme\": \"PR\u00c9C. ALIM.\",\r\n\"porteur\": \"Les Petites Cantines Marseille\",\r\n\"projet\": \"Cantine \u00e9ph\u00e9m\u00e8re\",\r\n\"resume\": \"Projet d'alimentation solidaire et de lien social visant \u00e0 proposer un lieu de repas partag\u00e9 ouvert et inscrit dans la dur\u00e9e, \u00e0 destination des habitants des quartiers concern\u00e9s \u00e0 Marseille.\",\r\n\"territoire\": \"Marseille (QPV Belle de Mai, R\u00e9form\u00e9s, Noailles + Castellane, Cours Julien, Bd Chave, CAL Martegales, Le Talus\/12e)\",\r\n\"fis\": \"19\u202f000,00 \u20ac\",\r\n\"budget\": \"19\u202f000,00 \u20ac\",\r\n\"partFis\": \"100,0%\",\r\n\"personnes\": \"Plus de 1 200 convives accueillis (dont une vingtaine de b\u00e9n\u00e9voles par \u00e9v\u00e9nement) ; de 40 \u00e0 120 convives par \u00e9v\u00e9nement ; 64 % de femmes \/ 36 % d'hommes ; plus de 60 % des convives habitent le quartier d'intervention\",\r\n\"actions\": \"20 cantines \u00e9ph\u00e9m\u00e8res organis\u00e9es en 2024-2025 (9 en 2024, 11 en 2025), soit 300 % de l'objectif initial de 6 par an. R\u00e9partition : 75 % des actions en QPV (15\/20), 5 % en poche de pr\u00e9carit\u00e9 (1\/20), 20 % en centre-ville non cat\u00e9goris\u00e9 (4\/20)\",\r\n\"inventaire\": \"20 cantines \u00e9ph\u00e9m\u00e8res, dont 15 en quartier prioritaire\",\r\n\"invPartenaires\": \"7 r\u00e9seaux d'entraide pour inviter les convives ; 17 lieux et associations pour l'organisation ; 12 producteurs et commerces pour l'approvisionnement\",\r\n\"nbPartenaires\": \"Liste nominative fournie, pas de total chiffr\u00e9 unique. Mobilisation de communaut\u00e9s : Entourage, La Cloche, Kipawa, Singa, Citizen Campus, Benenova, Secours Catholique. Coordination\/logistique : Le Couvent Levat, Le Plan de A \u00e0 Z, Le Plan 123, La Marmite Joyeuse, La Casa Consolat, La Baleine, le CMA Dugommier, Alternatiba, La Base Marseille, Un Pr\u00e9texte, La Cit\u00e9 de l'Agriculture, UNICEF, Festival Alimenterre, le CAL Martegales, Le Talus, La Briqueterie, Chez Chaleur. Approvisionnement : mara\u00eechers des R\u00e9form\u00e9s et du Cours Julien, La Cantina, N\u00e9o Pousse, Terre de Mars, \u00c9picerie Racine, Pain Pan, Bar \u00e0 Pain, Biocoop, Le Supercafoutch, r\u00e9seau Eco Table, C\u00e9line Laurens Berg\u00e8re, Micotopia\",\r\n\"competences\": \"3 porteuses de projet, 3 membres actifs au conseil d'administration, 50 b\u00e9n\u00e9voles actifs sur l'ann\u00e9e, entre 20 et 30 cuisiniers par cantine \u00e9ph\u00e9m\u00e8re, 1 prestation freelance en d\u00e9cembre 2025 pour coordonner l'organisation des \u00e9v\u00e9nements\",\r\n\"lienSocial\": \"Fonctionnement participatif revendiqu\u00e9 comme c\u0153ur du projet : pr\u00e9paration des repas, m\u00e9nage et vaisselle partag\u00e9s entre convives ; accessibilit\u00e9 inconditionnelle (prix libre) ; rencontre entre voisins et personnes de parcours de vie diff\u00e9rents\",\r\n\"comportement\": \"NR \u2014 non mesur\u00e9 dans le CERFA\",\r\n\"sorties\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"indicateurs\": \"Source : CERFA compte-rendu financier de subvention (association loi 1901, formulaire n\u00b015059*02). Prix moyen de participation au repas : 11 \u20ac (fourchette 1 \u20ac \u00e0 30 \u20ac, prix libre). Total des charges r\u00e9alis\u00e9es 23 224 \u20ac ; total des produits r\u00e9alis\u00e9s 31 212 \u20ac (dont subvention FIS 19 000 \u20ac, vente\/prestations 10 456 \u20ac, dons\/cotisations 1 756 \u20ac) \u2014 \u00e9cart charges\/produits non expliqu\u00e9 dans le document. Subvention 19 000 \u20ac = 60 % du total des produits (mention explicite du porteur). Sign\u00e9 le 30\/12\/2025 \u00e0 Marseille (Julia Sassano).\",\r\n\"freins\": \"NR \u2014 aucun frein mentionn\u00e9 explicitement dans le CERFA\",\r\n\"ameliorer\": \"Accessibilit\u00e9 inconditionnelle (prix libre). Rencontre entre voisins et personnes de parcours de vie diff\u00e9rents.\",\r\n\"emanciper\": \"\",\r\n\"reveler\": \"Valoriser le savoir faire des 50 b\u00e9n\u00e9voles actifs, 20 \u00e0 30 cuisiniers par cantine \u00e9ph\u00e9m\u00e8re mobilisation collective.\"\r\n},\r\n{\r\n\"theme\": \"PR\u00c9C. ALIM.\",\r\n\"porteur\": \"La Part Du Peuple\/ l'Apr\u00e8s M\",\r\n\"projet\": \"La Fastronomie Mieux manger pour tous : pour une d\u00e9marche d'innovation sociale et \u00e9cologique\",\r\n\"resume\": \"Projet d'alimentation solidaire visant \u00e0 concevoir une offre de restauration de qualit\u00e9 et choisie, \u00e0 destination des habitants des quartiers prioritaires de Marseille.\",\r\n\"territoire\": \"QPV Marseille 1er, 3\u00e8me, 13\u00e8me, 14eme, 15eme\",\r\n\"fis\": \"30\u202f000,00 \u20ac\",\r\n\"budget\": \"60\u202f000,00 \u20ac\",\r\n\"partFis\": \"50,0%\",\r\n\"personnes\": \"3000 clients\",\r\n\"actions\": \"NR\",\r\n\"inventaire\": \"NR\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR\",\r\n\"competences\": \"NR\",\r\n\"lienSocial\": \"NR\",\r\n\"comportement\": \"NR\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"Rapport d'activit\u00e9 2024 de l'association disponible. Le projet \u00ab Fastronomie mieux manger pour tous \u00bb (l'action FIS, \u00e9tude de pr\u00e9figuration) y est list\u00e9 dans les projets en cours avec une progression de 0% fin 2024. Reste de l'activit\u00e9 d\u00e9crite (distribution alimentaire, chantier d'insertion...) concerne l'association globale, non rattach\u00e9 \u00e0 l'action FIS par prudence.\",\r\n\"freins\": \"NR\",\r\n\"ameliorer\": \"Acc\u00e8s \u00e0 une offre de restauration accessible et conviviale (3 000 clients), avec une ambition de d\u00e9mocratiser une gastronomie de qualit\u00e9 sur l'espace public marseillais.\",\r\n\"emanciper\": \"Structuration progressive vers un mod\u00e8le \u00e9conomique p\u00e9renne : cr\u00e9ation de l'association d\u00e9di\u00e9e \u00ab Fastronomie - L'Apr\u00e8s M \u00bb, professionnalisation de l'\u00e9quipe (5 salari\u00e9s, 10 b\u00e9n\u00e9voles) et autonomisation administrative et juridique du projet.\",\r\n\"reveler\": \"Valorisation de la cr\u00e9ativit\u00e9 culinaire et de l'histoire des territoires marseillais, via la participation \u00e0 des appels \u00e0 projets embl\u00e9matiques (MUCEM, Delta Festival, Les Cabanons d'\u00e9t\u00e9) r\u00e9v\u00e9lant le potentiel gastronomique du territoire.\"\r\n},\r\n{\r\n\"theme\": \"CADRE DE VIE\",\r\n\"porteur\": \"ACAM Bels. Manufacture\",\r\n\"projet\": \"Chantier insertion \u00e9co-circ. (MQE-B, Maison de Quartier de l'Environnement de Belsunce)\",\r\n\"resume\": \"Projet d'am\u00e9lioration du cadre de vie centr\u00e9 sur la r\u00e9duction et la valorisation des d\u00e9chets, \u00e0 destination des habitants et des acteurs \u00e9conomiques du quartier de Belsunce \u00e0 Marseille.\",\r\n\"territoire\": \"Belsunce QPV\",\r\n\"fis\": \"20\u202f000,00 \u20ac\",\r\n\"budget\": \"342\u202f610,00 \u20ac\",\r\n\"partFis\": \"5,8%\",\r\n\"personnes\": \"50\",\r\n\"actions\": \"Ateliers \u00e9co-fab+scolaires+veille\",\r\n\"inventaire\": \"64,8 tonnes de d\u00e9chets collect\u00e9es chez les professionnels ; ateliers d'\u00e9co-fabrication ; ateliers avec des scolaires\",\r\n\"invPartenaires\": \"10+ partenaires, dont l'\u00c9tat, France Travail et Veolia\",\r\n\"nbPartenaires\": \"10+ (DDETS, FT, Veolia, France Active\u2026)\",\r\n\"competences\": \"8 salari\u00e9s en insertion (accompagnement individuel CIP, mont\u00e9e en comp\u00e9tences m\u00e9tiers artisanaux\/recyclage\/r\u00e9emploi). Ateliers d'\u00e9co-fabrication d\u00e9marr\u00e9s en 2024.\",\r\n\"lienSocial\": \"RA p.8 : \u00ab Coh\u00e9sion sociale : contribution \u00e0 la lutte contre les in\u00e9galit\u00e9s sociales et la discrimination spatiale ; renforcement du lien social ; encouragement \u00e0 la participation citoyenne. \u00bb D\u00e9claratif.\",\r\n\"comportement\": \"RA p.8 : \u00ab Changement de mentalit\u00e9s : changement de regard sur les d\u00e9chets ; transformation des perceptions des territoires en difficult\u00e9 \u00bb. Qualificatif, non mesur\u00e9 quantitativement.\",\r\n\"sorties\": \"8 salari\u00e9s en insertion \u2014 sorties vers l'emploi non chiffr\u00e9es dans le RA. Processus de retour vers l'emploi document\u00e9 (profilage comp\u00e9tences, CIP). Passage salari\u00e9s \u2192 encadrants mentionn\u00e9.\",\r\n\"indicateurs\": \"Tonneaux collect\u00e9s 2024 : 64,8t chez professionnels + 2,34t apports volontaires + 1t particuliers. 50 commer\u00e7ants adh\u00e9rents (vs 30 pr\u00e9vus). Exploitation \u00e0 5% capacit\u00e9 de production actuelle.\",\r\n\"freins\": \"Freins logistiques et mat\u00e9riels \u2014 CRITIQUE : 100m\u00b2 + 30m\u00b2, besoin minimum 300m\u00b2. \u00ab L'inadaptation de notre lieu d'exploitation central constitue un frein \u00e0 la stabilisation. \u00bb (p.103). Exploitation \u00e0 5% de capacit\u00e9.\\nFreins financiers : 98% des ressources issues de subventions publiques. Dette envers MAC'NB (~10 000\u20ac). Budget annuel 243 000\u20ac dont ~50% b\u00e9n\u00e9volat non-salari\u00e9.\\nFreins humains (\u00e9quipes et publics) : \u00e9quipe dirigeante b\u00e9n\u00e9vole (3,25 ETP), \u00e9puisement, polyvalence forc\u00e9e, retards dans prospection.\",\r\n\"ameliorer\": \"Changement de regard sur les d\u00e9chets et transformation des perceptions des territoires en difficult\u00e9.\\nTonneaux collect\u00e9s 2024 : 64,8t chez professionnels + 2,34t apports volontaires + 1t particuliers. 50 commer\u00e7ants adh\u00e9rents (vs 30 pr\u00e9vus).\",\r\n\"emanciper\": \"Accompagnement individualis\u00e9 de salari\u00e9s en insertion, mont\u00e9e en comp\u00e9tences dans les m\u00e9tiers du recyclage et du r\u00e9emploi. Passage progressif du statut de salari\u00e9 \u00e0 celui d'encadrant.\",\r\n\"reveler\": \"Contribution revendiqu\u00e9e \u00e0 la lutte contre les in\u00e9galit\u00e9s et la discrimination spatiale, encouragement \u00e0 la participation citoyenne\"\r\n},\r\n{\r\n\"theme\": \"CADRE DE VIE\",\r\n\"porteur\": \"Compagnons B\u00e2tisseurs Provence\",\r\n\"projet\": \"Atelier de Quartier\",\r\n\"resume\": \"Projet d'am\u00e9lioration du cadre de vie visant \u00e0 rep\u00e9rer les situations de mal-logement et \u00e0 orienter vers les interlocuteurs comp\u00e9tents, \u00e0 destination des habitants de la Butte Saint-Mauront \u00e0 Marseille.\",\r\n\"territoire\": \"la Butte St Mauront dans le 3\u00e8me arrondissement\",\r\n\"fis\": \"20\u202f000,00 \u20ac\",\r\n\"budget\": \"166\u202f636,00 \u20ac\",\r\n\"partFis\": \"12,0%\",\r\n\"personnes\": \"Environ 100 personnes lors des porteurs de parole ; 15 d\u00e9pannages p\u00e9dagogiques ; pr\u00e8s de 400 participants en demande de conseils\/accompagnement logement (publics en situation de pr\u00e9carit\u00e9 et\/ou de mal-logement)\",\r\n\"actions\": \"5 porteurs de parole r\u00e9alis\u00e9s sur la Butte St Mauront (2023-2024) ; 15 d\u00e9pannages p\u00e9dagogiques ; une quarantaine d'ateliers (Belle de Mai et St Mauront)\",\r\n\"inventaire\": \"5 d\u00e9bats de rue sur le logement ; 15 d\u00e9pannages \u00e0 domicile, faits avec les habitants ; \u2248 40 ateliers de quartier\",\r\n\"invPartenaires\": \"8 financeurs, dont la M\u00e9tropole et la Ville de Marseille\",\r\n\"nbPartenaires\": \"NR \u2014 pas de total chiffr\u00e9. Financeurs identifi\u00e9s : M\u00e9tropole AMP (CDV), FONJEP, PRHDD, EPCI, Fonds innovation, ville de Marseille, 13 Habitat, aides priv\u00e9es\",\r\n\"competences\": \"Formation d'acteurs institutionnels et associatifs \u00e0 la m\u00e9thode d'\u00e9ducation populaire des \u00ab porteurs de parole \u00bb (d\u00e9marche de Community Organising)\",\r\n\"lienSocial\": \"Dynamique habitante et autonomie de certains groupes d'habitants ; liens et interactions tiss\u00e9s avec d'autres associations du quartier\",\r\n\"comportement\": \"Les objectifs de l'action sont d\u00e9clar\u00e9s largement atteints par le porteur, qui souligne sa pertinence au regard de la lutte contre le mal-logement, de la dynamique habitante et de l'autonomisation de groupes d'habitants (empowerment)\",\r\n\"sorties\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"indicateurs\": \"Source : CERFA compte-rendu financier de subvention (association loi 1901, formulaire n\u00b015059*02). Compte-rendu financier qualifi\u00e9 de provisoire par le porteur (susceptible d'\u00eatre modifi\u00e9 apr\u00e8s arr\u00eat\u00e9 des comptes 2024, certification du commissaire aux comptes et validation en assembl\u00e9e g\u00e9n\u00e9rale de juin 2025). Total des charges r\u00e9alis\u00e9es 170 507 \u20ac (pr\u00e9vu 166 635 \u20ac, 102 %) ; total des produits r\u00e9alis\u00e9s 190 819 \u20ac (pr\u00e9vu 166 636 \u20ac, 115 %). Subvention FIS 20 000 \u20ac (ligne \u00ab Fonds innovation \u00bb) = 10,48 % du total des produits. Sign\u00e9 le 5 mai 2025 \u00e0 Marseille (Estelle Ventoura).\",\r\n\"freins\": \"Freins financiers : compte-rendu provisoire, \u00e0 confirmer apr\u00e8s certification CAC et AG de juin 2025. R\u00e9organisation comptable : l'action \u00ab Atelier de Quartier \u00bb a \u00e9t\u00e9 isol\u00e9e en 2024 de l'action centre-ville, entra\u00eenant la disparition des financements DITAS et CAF dans ce bilan (CD DITAS : 10 000 \u20ac pr\u00e9vu, 0 \u20ac r\u00e9alis\u00e9)\",\r\n\"ameliorer\": \"Objectifs d\u00e9clar\u00e9s largement atteints au regard de la lutte contre le mal-logement.\",\r\n\"emanciper\": \"Formation d'acteurs institutionnels et associatifs \u00e0 la m\u00e9thode des \u00ab porteurs de parole \u00bb. Autonomisation de groupes d'habitants, dynamique d'empowerment enclench\u00e9e.\",\r\n\"reveler\": \"Dynamique habitante et liens tiss\u00e9s avec d'autres associations du quartier.\"\r\n},\r\n{\r\n\"theme\": \"CADRE DE VIE\",\r\n\"porteur\": \"e-graine et Terravox\",\r\n\"projet\": \"Diagnostic 360 d\u00e9chets\",\r\n\"resume\": \"Projet d'am\u00e9lioration du cadre de vie centr\u00e9 sur la pr\u00e9vention des d\u00e9chets et les usages associ\u00e9s, \u00e0 destination des habitants des quartiers de Frais Vallon et de La Rose \u00e0 Marseille.\",\r\n\"territoire\": \"Frais Vallon et la Rose, Marseille (Val Plan 13Habitat, HMP, Vilogia)\",\r\n\"fis\": \"60\u202f000,00 \u20ac\",\r\n\"budget\": \"96\u202f650,00 \u20ac\",\r\n\"partFis\": \"62,1%\",\r\n\"personnes\": \"~3000 pers. Val Plan (745 logements) + ~5000 pers. Frais Vallon (1400 logements), diagnostics d'enqu\u00eate\",\r\n\"actions\": \"78 actions+14 diagnostics+6 audits, dont 20 entretiens approfondis et 317 entretiens porte-\u00e0-porte\",\r\n\"inventaire\": \"78 actions de pr\u00e9vention des d\u00e9chets ; 14 diagnostics et 6 audits ; 337 entretiens, dont 317 en porte-\u00e0-porte\",\r\n\"invPartenaires\": \"collectivit\u00e9s et bailleurs sociaux\",\r\n\"nbPartenaires\": \"Collectivit\u00e9s+bailleurs (nb NR)\",\r\n\"competences\": \"Formation gardiens (Grand Paris Sud). Formation 6 jeunes (chantier jeune Bobigny \u2014 r\u00e9habilitation \u00e9co-local). Formations relais locaux (taux engagement 80%).\",\r\n\"lienSocial\": \"Objectif d\u00e9clar\u00e9 : \u00ab transformer les d\u00e9chets en ressource au service d'un cadre de vie am\u00e9lior\u00e9 et de territoires plus durables et solidaires. \u00bb Indicateur qualitatif non mesur\u00e9 sur la coh\u00e9sion.\",\r\n\"comportement\": \"68% des personnes touch\u00e9es s'engagent \u00e0 adopter de nouveaux \u00e9co-gestes (taux d'engagement d\u00e9fini : % d\u00e9clarant pr\u00eats \u00e0 appliquer ou ayant pos\u00e9 des actes engageants). Changement de comportement mesur\u00e9 \u00e0 la fin de chaque action.\",\r\n\"sorties\": \"Chantier jeune Bobigny : 6 jeunes form\u00e9s. Bilan : Acquisition de connaissances 3,6\/4 ; Changement comportement individuel 5\/5 ; Satisfaction 4,4\/5. Sorties post-formation non document\u00e9es.\",\r\n\"indicateurs\": \"Taux d'engagement par type d'action : formation relais locaux 80%, visites \u00e0 domicile 77%, porte-\u00e0-porte 68%. Mod\u00e9lisation \u00e9conomique : pour 1000t DMA, \u00e9conomie nette 64K\u20ac \u00e0 7 ans. R\u00e9duction CO2 : 356t\/7ans pour 1000t DMA.\",\r\n\"freins\": \"NR\",\r\n\"ameliorer\": \"Engagement \u00e0 adopter de nouveaux \u00e9co-gestes, changement de comportement mesur\u00e9 \u00e0 l'issue de chaque action.\",\r\n\"emanciper\": \"Formation de gardiens et de jeunes dans le cadre d'un chantier de r\u00e9habilitation \u00e9co-local. Acquisition de connaissances et changement comportemental individuel constat\u00e9s.\",\r\n\"reveler\": \"Objectif d\u00e9clar\u00e9 de transformer les d\u00e9chets en ressource au service d'un cadre de vie durable et solidaire. Valorisation de la capacit\u00e9 des habitants \u00e0 conduire le changement de comportement\"\r\n},\r\n{\r\n\"theme\": \"NUM\u00c9RIQUE\",\r\n\"porteur\": \"AVENIR SOLIDARITE\",\r\n\"projet\": \"D\u00e9ploiement de 2 outils de num\u00e9riques + Avenir Connect et WantAid\",\r\n\"resume\": \"Projet d'inclusion num\u00e9rique visant \u00e0 faciliter l'orientation vers l'offre de solidarit\u00e9 de proximit\u00e9, \u00e0 destination des habitants et des acteurs associatifs de la m\u00e9tropole.\",\r\n\"territoire\": \"M\u00e9tropole Aix-Marseille-Provence (d\u00e9ploiement Marseille puis Aix, Fuveau et zones limitrophes)\",\r\n\"fis\": \"30\u202f000,00 \u20ac\",\r\n\"budget\": \"56\u202f656,00 \u20ac\",\r\n\"partFis\": \"53,0%\",\r\n\"personnes\": \"400 t\u00e9l\u00e9chargements grand public (WantAid) ; 120 associations utilisatrices couvrant plus de 20 cat\u00e9gories de besoins ; une centaine de signalements de personnes en difficult\u00e9 orient\u00e9s et pris en charge ; une vingtaine de jeunes de QPV r\u00e9compens\u00e9s pour leur engagement \u00e0 la Pr\u00e9fecture\",\r\n\"actions\": \"Lancement officiel \u00e0 la Pr\u00e9fecture de Marseille (mars 2024, plus de 20 associations partenaires pr\u00e9sentes) ; d\u00e9ploiement mars-novembre 2024 sur Marseille puis zone limitrophe (Aix, Fuveau\u2026) ; participation \u00e0 des salons\/\u00e9v\u00e9nements : salon \u00e9tudiant de Marseille (10\/10\/2024), Viva Cit\u00e9 (sept. 2024), Delta Festival (sept. 2024), AMU Festival de l'engagement (oct. 2024), Cha\u00eene de la solidarit\u00e9 avec SOS Amiti\u00e9 (nov. 2024)\",\r\n\"inventaire\": \"1 lancement officiel \u00e0 la pr\u00e9fecture ; 5 salons et festivals ; d\u00e9ploiement de mars \u00e0 novembre 2024, de Marseille \u00e0 Aix et Fuveau\",\r\n\"invPartenaires\": \"120 associations utilisatrices\",\r\n\"nbPartenaires\": \"120 associations utilisatrices (exemples cit\u00e9s : Marhaban, Apis, Aix M\u00e9diation, Famille en Action, Sport dans la Ville, Banque Alimentaire)\",\r\n\"competences\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"lienSocial\": \"R\u00f4le de cr\u00e9ateur de lien de terrain revendiqu\u00e9 : connexions favoris\u00e9es entre structures aidantes pour soutenir les synergies (mise en r\u00e9seau des structures aidantes)\",\r\n\"comportement\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"sorties\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"indicateurs\": \"Source : CERFA compte-rendu financier de subvention (association loi 1901, formulaire n\u00b015059*02). Outil d\u00e9ploy\u00e9 et utilis\u00e9 avec succ\u00e8s jusqu'aux probl\u00e9matiques techniques de novembre 2024 (limitation de performance, difficult\u00e9s de maintenance), ayant motiv\u00e9 une refonte technologique de l'application. Budget r\u00e9alis\u00e9 56 656 \u20ac (personnel 46 656 \u20ac, services ext\u00e9rieurs 10 000 \u20ac ; produits : dotations\/tarification 26 656 \u20ac + M\u00e9tropole AMP 30 000 \u20ac). Sign\u00e9 le 22 juillet 2025 \u00e0 Marseille (Joseph Arakel).\",\r\n\"freins\": \"Freins logistiques et mat\u00e9riels : bugs techniques de l'application en novembre 2024 (limitation de performance, difficult\u00e9s de maintenance) ayant n\u00e9cessit\u00e9 de reconstruire l'application sur des bases technologiques plus solides\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"\",\r\n\"reveler\": \"R\u00f4le de cr\u00e9ateur de lien de terrain revendiqu\u00e9 connexions favoris\u00e9es entre structures aidantes pour soutenir des synergies (mise en r\u00e9seau des structures aidantes).\"\r\n},\r\n{\r\n\"theme\": \"NUM\u00c9RIQUE\",\r\n\"porteur\": \"Anonymal\",\r\n\"projet\": \"M\u00e9diation num.+WebTV (M\u00e9tropole vue du ciel)\",\r\n\"resume\": \"Projet de m\u00e9diation num\u00e9rique et d'\u00e9ducation aux m\u00e9dias visant \u00e0 faire d\u00e9couvrir des usages et des m\u00e9tiers du num\u00e9rique, \u00e0 destination des jeunes des quartiers prioritaires d'Aix-en-Provence et de Gardanne.\",\r\n\"territoire\": \"Jas Bouffan QPV Aix\",\r\n\"fis\": \"10\u202f000,00 \u20ac\",\r\n\"budget\": \"51\u202f990,00 \u20ac\",\r\n\"partFis\": \"19,2%\",\r\n\"personnes\": \"19 jeunes\",\r\n\"actions\": \"NR (webTV hebdo+ateliers continus)\",\r\n\"inventaire\": \"webTV hebdomadaire ; ateliers num\u00e9riques en continu\",\r\n\"invPartenaires\": \"40+ partenaires\",\r\n\"nbPartenaires\": \"~40+\",\r\n\"competences\": \"Ateliers m\u00e9diation num\u00e9rique : d\u00e9couverte PC, d\u00e9marches administratives en ligne, usages num\u00e9riques quotidiens (grand d\u00e9butants \/ illettrisme num\u00e9rique).\\nFormations audiovisuel participatif pour structures sociales.\\nCursus Grande \u00c9cole du Num\u00e9rique \u2014 formation aux m\u00e9tiers du num\u00e9rique.\\nAccompagnement de services civiques (4 JRI web TV + 2 m\u00e9diation num\u00e9rique + 1 projet).\\nNb de participants form\u00e9s : NR pr\u00e9cis\u00e9ment dans le rapport.\",\r\n\"lienSocial\": \"WebTV : \u00abvaloriser les initiatives locales, rendre compte de la richesse des propositions socio-culturelles, encourager la participation des habitants \u00e0 la vie de la Cit\u00e9\u00bb \u2014 formulation centrale de la mission.\\nMaison Num\u00e9rique : lieu de rencontre interg\u00e9n\u00e9rationnelle (seniors, jeunes, habitants) autour du num\u00e9rique.\\nProjets urbains : favoriser l'adh\u00e9sion des habitants aux projets de r\u00e9habilitation.\",\r\n\"comportement\": \"WebTV citoyenne : valorisation de la parole habitante, \u00abpermettre aux habitants de trouver leur place\u00bb dans les projets de r\u00e9habilitation urbaine \u2014 d\u00e9claration d'intention, pas de mesure de changement comportemental.\\nAteliers Tic-Tac (seniors) : usage num\u00e9rique autonome des d\u00e9marches administratives \u2014 d\u00e9claration d'intention.\\n\u2192 Aucun indicateur mesur\u00e9 de changement comportemental disponible dans ce rapport.\",\r\n\"sorties\": \"Grande \u00c9cole du Num\u00e9rique : formation aux m\u00e9tiers du num\u00e9rique \u2014 sorties vers l'emploi vis\u00e9es mais taux NR.\\nAteliers EPN\/d\u00e9marches administratives : acc\u00e8s aux droits facilit\u00e9 (CAF, P\u00f4le Emploi) \u2014 non chiffr\u00e9.\\n\u2192 Pas de sortie positive quantifi\u00e9e dans le rapport.\",\r\n\"indicateurs\": \"Audience webTV en croissance depuis 2009.\\nLabellisations multiples (Fabrique de Territoire, Grande \u00c9cole du Num\u00e9rique, Qualiopi, Aidants Connect, Ordi 3.0, PIX).\\nAdh\u00e9sion \u00e0 la F\u00e9d\u00e9ration nationale de l'audiovisuel participatif.\\nNb exact de b\u00e9n\u00e9ficiaires\/an : NR dans ce rapport.\",\r\n\"freins\": \"Freins institutionnels et partenariaux : \u00abLa f\u00e9d\u00e9ration d\u00e9fend depuis plusieurs ann\u00e9es la reconnaissance d'un statut de m\u00e9dia participatif de proximit\u00e9 et pour son financement par un fonds de soutien\u00bb \u2014 d\u00e9pendance \u00e0 des financements publics fragiles, non p\u00e9rennis\u00e9s.\\nFreins logistiques et mat\u00e9riels: donn\u00e9es chiffr\u00e9es sur les b\u00e9n\u00e9ficiaires insuffisamment document\u00e9es dans le rapport (absence d'outil de comptage syst\u00e9matique).\",\r\n\"ameliorer\": \"Acc\u00e8s aux droits facilit\u00e9 (CAF, P\u00f4le Emploi) par les ateliers d\u00e9marches administratives\",\r\n\"emanciper\": \"Ateliers de m\u00e9diation num\u00e9rique (grands d\u00e9butants, illettrisme num\u00e9rique), cursus Grande \u00c9cole du Num\u00e9rique, usage num\u00e9rique autonome des d\u00e9marches administratives vis\u00e9 pour les seniors. Sorties vers l'emploi\",\r\n\"reveler\": \"WebTV valorisant les initiatives locales et la richesse des propositions socio-culturelles, favorisant l'adh\u00e9sion des habitants aux projets de r\u00e9habilitation urbaine. Maison Num\u00e9rique comme lieu de rencontre interg\u00e9n\u00e9rationnelle.\"\r\n},\r\n{\r\n\"theme\": \"NUM\u00c9RIQUE\",\r\n\"porteur\": \"Ligue FAIL 13\",\r\n\"projet\": \"M\u00e9dialab Itin\u00e9rant\",\r\n\"resume\": \"Projet de m\u00e9diation num\u00e9rique itin\u00e9rant visant \u00e0 faire d\u00e9couvrir la cr\u00e9ation num\u00e9rique dans les territoires les moins couverts, \u00e0 destination des habitants des quartiers prioritaires et des zones rurales des Bouches-du-Rh\u00f4ne.\",\r\n\"territoire\": \"BdR QPV+rural\",\r\n\"fis\": \"50\u202f000,00 \u20ac\",\r\n\"budget\": \"95\u202f500,00 \u20ac\",\r\n\"partFis\": \"52,4%\",\r\n\"personnes\": \"119 jeunes de 11 \u00e0 18 ans (participants uniques) + 21 adultes touch\u00e9s (dont 10 form\u00e9s lors de 8 s\u00e9ances de co-animation) + 8 communes touch\u00e9es\",\r\n\"actions\": \"78 ateliers anim\u00e9s (10 th\u00e9matiques : EMI, jeux vid\u00e9o, r\u00e9seaux sociaux, robotique, IA, photo\/vid\u00e9o, cybers\u00e9curit\u00e9, culture num\u00e9rique, codage, esprit critique) ; 8 s\u00e9ances de co-animation ; 9 ateliers men\u00e9s en autonomie par les structures d'accueil gr\u00e2ce aux 4 kits p\u00e9dagogiques distribu\u00e9s\",\r\n\"inventaire\": \"78 ateliers num\u00e9riques sur 10 th\u00e8mes ; 8 s\u00e9ances de co-animation, qui ont form\u00e9 10 personnes ; 9 ateliers men\u00e9s en autonomie par les structures d'accueil\",\r\n\"invPartenaires\": \"8 structures d'accueil (m\u00e9diath\u00e8ques, espaces jeunes, maison pour tous)\",\r\n\"nbPartenaires\": \"NR (chiffre total non donn\u00e9). Structures d'accueil nomm\u00e9es : MPT L'Envol\u00e9e (Port-Saint-Louis-du-Rh\u00f4ne, nov-d\u00e9c 2024), m\u00e9diath\u00e8que de la Roque d'Anth\u00e9ron (oct-d\u00e9c 2024), Espace Jeunes d'Ensu\u00e8s-la-Redonne (oct-d\u00e9c 2024), m\u00e9diath\u00e8que de Rognes (oct 2024-jan 2025), Espace Jeunes de Roquevaire (mars-avr 2025), Espace Jeunes de Saint-Martin-de-Crau (mai 2025), m\u00e9diath\u00e8que de Tarascon (juin 2025), m\u00e9diath\u00e8que de Venelles (juillet 2025)\",\r\n\"competences\": \"10 personnes form\u00e9es lors de 8 s\u00e9ances de co-animation avec un m\u00e9diateur de la Ligue de l'Enseignement ; remise de 4 kits p\u00e9dagogiques ayant permis aux structures de mener 9 ateliers en autonomie\",\r\n\"lienSocial\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"comportement\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"sorties\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"indicateurs\": \"Source : CERFA compte-rendu financier de subvention (association loi 1901, formulaire n\u00b015059*02). FIS r\u00e9alis\u00e9 50 000 \u20ac = 52,63 % du total des produits r\u00e9alis\u00e9s (95 000 \u20ac, pr\u00e9vu 98 500 \u20ac, soit 96 %). Sign\u00e9 le 22\/10\/2025 \u00e0 Marseille (Karim Touche).\",\r\n\"freins\": \"NR \u2014 rubrique freins non renseign\u00e9e dans le CERFA\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"Formation de relais par co-animation avec un m\u00e9diateur, remise de kits p\u00e9dagogiques. Ateliers men\u00e9s en autonomie par les structures form\u00e9es.\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"NUM\u00c9RIQUE\",\r\n\"porteur\": \"Arborescence-Icom\",\r\n\"projet\": \"EPN+R\u00e9hab-Lab\",\r\n\"resume\": \"Projet de m\u00e9diation num\u00e9rique appliqu\u00e9 au champ de la sant\u00e9, visant \u00e0 rendre les usagers acteurs de leurs propres aides techniques, \u00e0 destination des publics des structures de soin et m\u00e9dico-sociales des 15e et 16e arrondissements de Marseille.\",\r\n\"territoire\": \"QPV 15e-16e Mlle\",\r\n\"fis\": \"20\u202f000,00 \u20ac\",\r\n\"budget\": \"40\u202f000,00 \u20ac\",\r\n\"partFis\": \"50,0%\",\r\n\"personnes\": \"40\",\r\n\"actions\": \"4 r\u00e9unions, 12 ateliers\",\r\n\"inventaire\": \"12 ateliers num\u00e9riques et d'impression 3D ; 4 r\u00e9unions de travail\",\r\n\"invPartenaires\": \"\u2248 6 partenaires principaux\",\r\n\"nbPartenaires\": \"~6 principaux\",\r\n\"competences\": \"Ateliers autonomie num\u00e9rique (d\u00e9marches administratives, cr\u00e9ation mail, smartphone\/PC) \u2192 mont\u00e9e en autonomie document\u00e9e qualitativement.\\nEssentiels : acculturation num\u00e9rique des r\u00e9sidents QPV pour faciliter la recherche d'emploi \u2014 r\u00e9sultats non chiffr\u00e9s.\\nCartable Net + Juniors connect\u00e9s : usages num\u00e9riques p\u00e9dagogiques chez les coll\u00e9giens et 12-17 ans.\\nR\u00e9hab-Lab : initiation \u00e0 l'impression 3D + co-conception d'aides techniques.\\nNb de personnes form\u00e9es : NR pr\u00e9cis\u00e9ment.\",\r\n\"lienSocial\": \"Arbopostale Aygalades : \u00abtiers-lieu num\u00e9rique inclusif\u00bb r\u00e9implantant un service public (La Poste) dans un quartier enclav\u00e9 \u2014 impact direct sur l'acc\u00e8s aux services.\\nK-Bu\/Cabucelle : lieu convivial de partage et d'\u00e9change dans un quartier nord \u2014 lien social.\\n\u00abLa strat\u00e9gie mise en place pour valoriser la m\u00e9diation num\u00e9rique, tout en r\u00e9implantant un service public de proximit\u00e9 dans les quartiers prioritaires, s'av\u00e8re efficace.\u00bb (rapport interne).\",\r\n\"comportement\": \"R\u00e9hab-Lab : \u00ables patients deviennent acteurs du d\u00e9veloppement de leurs propres aides techniques via l'impression 3D\u00bb \u2014 changement de posture document\u00e9 (de patient passif \u00e0 co-concepteur).\\nEPN\/cyberespace : \u00abde plus en plus en difficult\u00e9s pour l'apprentissage des outils num\u00e9riques \u2014 illectronisme\u00bb \u2192 objectif d'autonomisation num\u00e9rique, d\u00e9claratif.\\nPoste Relais : \u00abhausse significative de la fr\u00e9quentation\u00bb suite au nouveau service remise colis \u2192 indicateur d'adoption d'un service.\\n\u2192 Changement comportemental document\u00e9 qualitativement pour le R\u00e9hab-Lab.\",\r\n\"sorties\": \"Essentiels (QPV emploi) : acculturation num\u00e9rique pour faciliter la recherche d'emploi \u2014 sorties vers l'emploi vis\u00e9es mais non chiffr\u00e9es.\\nGuichet asso : orientation vers les carrefours de l'entrepreneuriat \u2014 r\u00e9sultats NR.\\n\u2192 Pas de sortie positive quantifi\u00e9e.\",\r\n\"indicateurs\": \"Bilan 120 033 \u20ac (progression vs 116 937 \u20ac en 2023).\\nProduits d'exploitation 154 171 \u20ac (+19% vs 129 744 \u20ac en 2023).\\nR\u00e9hab-Lab : projet phare 2024, soutenu par le Fond d'innovation M\u00e9tropole AMP.\\nParticipation \u00e0 NEC24 \u00e0 Marseille \u2014 visibilit\u00e9 nationale.\\nDonn\u00e9es b\u00e9n\u00e9ficiaires individuels : NR.\",\r\n\"freins\": \"Freins institutionnels et partenariaux (arr\u00eat\/transition du projet) : FUSION\/ABSORPTION par Icom'Provence act\u00e9e en 2024, gestion transf\u00e9r\u00e9e \u00e0 partir du 27\/11\/2024 \u2014 derni\u00e8re ann\u00e9e d'existence autonome d'Arborescence. La reconduction du projet FIS en l'\u00e9tat n'est pas applicable.\\nFreins financiers : d\u00e9ficit 2024 de -1 896 \u20ac d\u00fb \u00e0 la \u00abr\u00e9duction des aides \u00e9tatiques pour les conseillers num\u00e9riques et \u00e0 la fin des subventions pour le poste de concierge num\u00e9rique\u00bb. Cause directe du d\u00e9ficit apr\u00e8s 5 ans de b\u00e9n\u00e9fices.\\nFreins humains (\u00e9quipes et publics): d\u00e9part progressif des salari\u00e9s dans le cadre de la transition vers Icom'Provence.\",\r\n\"ameliorer\": \"R\u00e9implantation d'un service public de proximit\u00e9 (La Poste) dans un quartier enclav\u00e9, hausse significative de fr\u00e9quentation du service remise colis.\",\r\n\"emanciper\": \"Ateliers d'autonomie num\u00e9rique pour les d\u00e9marches du quotidien. R\u00e9hab-Lab : les patients deviennent acteurs de leurs propres aides techniques, passage du statut de passif \u00e0 co-concepteur.\",\r\n\"reveler\": \"Participation \u00e0 NEC24 \u00e0 Marseille : visibilit\u00e9 nationale.\"\r\n},\r\n{\r\n\"theme\": \"NUM\u00c9RIQUE\",\r\n\"porteur\": \"Urban Prod\",\r\n\"projet\": \"CVI p\u00e9nitentiaire+Hub Sud (Formation des m\u00e9diateurs num\u00e9riques)\",\r\n\"resume\": \"Projet d'inclusion num\u00e9rique visant \u00e0 produire et diffuser des ressources de formation et de vulgarisation, \u00e0 destination des professionnels de l'accompagnement et des agents des collectivit\u00e9s de la m\u00e9tropole.\",\r\n\"territoire\": \"Marseille+PACA\",\r\n\"fis\": \"14\u202f000,00 \u20ac\",\r\n\"budget\": \"61\u202f050,00 \u20ac\",\r\n\"partFis\": \"22,9%\",\r\n\"personnes\": \"200\",\r\n\"actions\": \"144j CVI+HHNS Festival+107 FNE\",\r\n\"inventaire\": \"144 jours de formation vid\u00e9o en d\u00e9tention ; 107 interventions aupr\u00e8s de 3 189 jeunes ; 1 festival hip-hop\",\r\n\"invPartenaires\": \"20+ partenaires\",\r\n\"nbPartenaires\": \"~20+\",\r\n\"competences\": \"CVI : formation des auxiliaires vid\u00e9o en d\u00e9tention \u00e0 l'audiovisuel \u2014 comp\u00e9tences cr\u00e9atrices objectivables (fictions prim\u00e9es au festival \u00abHors Champs\u00bb).\\nHHNS Acad\u00e9mie : 12 jeunes form\u00e9s aux m\u00e9tiers de la musique (4h\/semaine).\\nCertification Pix : agr\u00e9ment centre \u2014 nb de certifi\u00e9s NR.\\nQualiopi obtenu oct. 2024 : gage de qualit\u00e9 des formations.\\nFormation tuteurs\/professionnels : 11 formations (150 participants, p\u00f4le num\u00e9rique).\\nCyberharc\u00e8lement PRMSE : formation de tous les m\u00e9diateurs sociaux PACA (nb NR).\",\r\n\"lienSocial\": \"CVI en d\u00e9tention : \u00aboutil d'\u00e9mancipation et de formation\u00bb pour les d\u00e9tenus \u2014 acc\u00e8s \u00e0 la culture et aux comp\u00e9tences en milieu ferm\u00e9.\\nHHNS Festival : \u00abvolont\u00e9 de reconnaissance (voire de r\u00e9paration) des acteurs des cultures hip-hop \u00e0 Marseille, longtemps ignor\u00e9s\u00bb \u2014 r\u00e9paration symbolique et sociale.\\nTemps Libres : groupe 'Who We Are' programm\u00e9 en espace public \u2014 visibilisation de jeunes talents marseillais.\",\r\n\"comportement\": \"CVI en d\u00e9tention : \u00ables fictions r\u00e9alis\u00e9es en d\u00e9tention par Urban ont remport\u00e9 3 des 4 prix du festival Hors Champs\u00bb \u2014 indicateur objectivable d'acquisition de comp\u00e9tences cr\u00e9atrices par des d\u00e9tenus. Changement de posture document\u00e9.\\nTemps Libres (Who We Are) : groupe de jeunes programm\u00e9 lors de HHNS \u2014 progression artistique document\u00e9e.\\nHHNS Acad\u00e9mie : \u00abapprendre et transmettre\u00bb en milieu p\u00e9nitentiaire via CVI \u2014 d\u00e9claration d'intention sur le changement comportemental.\",\r\n\"sorties\": \"CVI : auxiliaires vid\u00e9o en d\u00e9tention acqui\u00e8rent une comp\u00e9tence professionnelle audiovisuelle \u2014 reconversions post-incarc\u00e9ration vis\u00e9es mais non chiffr\u00e9es.\\nHub du Sud FNE : \u00ab3 189 jeunes inform\u00e9s\u00bb sur les dispositifs num\u00e9riques \u2014 orientation vers des services\/droits num\u00e9riques.\\nMinist\u00e8re de la Culture \/ incubateur m\u00e9dias : s\u00e9lection pour 2025 \u2014 sorties positives cr\u00e9ateurs de m\u00e9dias attendues.\\n\u2192 Pas de sortie positive quantifi\u00e9e directement dans ce rapport.\",\r\n\"indicateurs\": \"3 prix sur 4 remport\u00e9s au Festival Hors Champs (fictions r\u00e9alis\u00e9es par d\u00e9tenus).\\n3 000+ d\u00e9tenus touch\u00e9s par les CVI.\\n3 189 jeunes inform\u00e9s (Hub du Sud FNE, 107 interventions).\\n12 jeunes HHNS Acad\u00e9mie \/ 7 missions r\u00e9alis\u00e9es (Coop\u00e9rative Jeunesse Services).\\nQualiopi oct. 2024 \u2014 certification qualit\u00e9 formation.\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics) : d\u00e9part de Sarah Rietsch (charg\u00e9e de formation, avril 2024) \u2192 \u00abmettant un frein \u00e0 l'activit\u00e9 de d\u00e9veloppement\u00bb de la formation. Frein temporaire mais impact sur la mont\u00e9e en puissance post-Qualiopi.\\nFreins institutionnels et partenariaux : \u00abComment continuer ses missions d'int\u00e9r\u00eats g\u00e9n\u00e9raux sans financement \u00e9tatique ? [...] les feuilles de route FNE si longuement travaill\u00e9es ont \u00e9t\u00e9 si vite abandonn\u00e9es par l'Etat\u00bb \u2014 remise en question du financement Hub du Sud pour 2025. Frein structurel annonc\u00e9.\\nFreins institutionnels et partenariaux: Tour de France R\u00e9publicain (Ligue) d\u00e9plac\u00e9 en raison des JO \u2014 impact indirect sur le partenariat journalisme jeune.\",\r\n\"ameliorer\": \"Formation de m\u00e9diateurs sociaux \u00e0 la lutte contre le cyberharc\u00e8lement \u00e0 l'\u00e9chelle r\u00e9gionale. Information des jeunes sur les dispositifs num\u00e9riques\",\r\n\"emanciper\": \"CVI en d\u00e9tention qualifi\u00e9 d'\u00ab outil d'\u00e9mancipation \u00bb, fictions de d\u00e9tenus prim\u00e9es en festival. Formation musicale des jeunes, reconversions post-incarc\u00e9ration vis\u00e9es.\",\r\n\"reveler\": \"HHNS Festival port\u00e9 par une \u00ab volont\u00e9 de reconnaissance des acteurs des cultures hip-hop \u00e0 Marseille, longtemps ignor\u00e9s \u00bb. Groupe Who We Are programm\u00e9 en espace public visibilisation de jeunes talents marseillais.\\n3 prix sur 4 remport\u00e9s au Festival Hors Champs (fictions r\u00e9alis\u00e9es par d\u00e9tenus).\"\r\n},\r\n{\r\n\"theme\": \"NUM\u00c9RIQUE\",\r\n\"porteur\": \"CENTRE DE CULTURE OUVRIERE \u2013 Centre social Sainte-Marthe\",\r\n\"projet\": \"la r\u00e9volution num\u00e9rique et la transformation sociale en cours\",\r\n\"resume\": \"Projet d'inclusion num\u00e9rique visant \u00e0 accompagner l'acquisition de comp\u00e9tences num\u00e9riques et l'acc\u00e8s aux d\u00e9marches en ligne, \u00e0 destination des habitants des quartiers nord de Marseille.\",\r\n\"territoire\": \"MARSEILLE quartiers nords\",\r\n\"fis\": \"40\u202f000,00 \u20ac\",\r\n\"budget\": \"87\u202f200,00 \u20ac\",\r\n\"partFis\": \"45,9%\",\r\n\"personnes\": \"plus de 100 personnes touch\u00e9s\",\r\n\"actions\": \"NR\",\r\n\"inventaire\": \"NR\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR\",\r\n\"competences\": \"NR\",\r\n\"lienSocial\": \"NR\",\r\n\"comportement\": \"NR\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"Comptes annuels 2024 certifi\u00e9s sans r\u00e9serve par commissaire aux comptes (Cabinet Daniel Mandragola & Associ\u00e9s). Aucune donn\u00e9e d'indicateur de r\u00e9alisation\/impact propre \u00e0 l'action FIS dans ce document (opinion d'audit uniquement, tableau chiffr\u00e9 non extractible du PDF transmis).\",\r\n\"freins\": \"NR\",\r\n\"ameliorer\": \"Acc\u00e8s facilit\u00e9 aux d\u00e9marches administratives en ligne pour 50 \u00e0 100 personnes en fracture num\u00e9rique, via des permanences hebdomadaires et la remise d'ordinateurs reconditionn\u00e9s \u00e0 10 b\u00e9n\u00e9ficiaires.\",\r\n\"emanciper\": \"Autonomie num\u00e9rique renforc\u00e9e gr\u00e2ce \u00e0 des formations r\u00e9guli\u00e8res touchant 25 participants, avec acquisition de comp\u00e9tences pratiques et suivi post-formation.\",\r\n\"reveler\": \"Espace gaming et FabLab r\u00e9v\u00e9lant la cr\u00e9ativit\u00e9 des jeunes et enfants du quartier (30 jeunes, 50 enfants), avec une formation \u00e0 la cr\u00e9ation vid\u00e9o d\u00e9bouchant sur une future cha\u00eene YouTube valorisant leurs productions.\"\r\n},\r\n{\r\n\"theme\": \"NUM\u00c9RIQUE\",\r\n\"porteur\": \"HUB DU SUD\",\r\n\"projet\": \"Reconditionnement informatique\",\r\n\"resume\": \"Projet d'inclusion num\u00e9rique combinant animation du r\u00e9seau r\u00e9gional de m\u00e9diation num\u00e9rique et r\u00e9emploi de mat\u00e9riel informatique, visant \u00e0 r\u00e9duire la fracture num\u00e9rique, \u00e0 destination des professionnels du secteur et des publics \u00e9loign\u00e9s du num\u00e9rique.\",\r\n\"territoire\": \"M\u00e9tropole\",\r\n\"fis\": \"15\u202f000,00 \u20ac\",\r\n\"budget\": \"30\u202f580,00 \u20ac\",\r\n\"partFis\": \"49,1%\",\r\n\"personnes\": \"environ 80 personnes\",\r\n\"actions\": \"NR\",\r\n\"inventaire\": \"NR\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR\",\r\n\"competences\": \"NR\",\r\n\"lienSocial\": \"NR\",\r\n\"comportement\": \"NR\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"Comptes annuels 2024 disponibles (attestation de pr\u00e9sentation DUO CONSEILS \u2014 pas un audit). Document strictement financier et global \u00e0 l'association : aucune donn\u00e9e d'activit\u00e9 propre \u00e0 l'action FIS \u00ab Reconditionnement informatique \u00bb identifi\u00e9e.\",\r\n\"freins\": \"NR\",\r\n\"ameliorer\": \"\u00c9tude territoriale sur 5 bassins de population des Bouches-du-Rh\u00f4ne objectivant les freins d'acc\u00e8s au num\u00e9rique, avec une ambition de redistribuer du mat\u00e9riel informatique reconditionn\u00e9 aux personnes en situation de fracture num\u00e9rique.\",\r\n\"emanciper\": \"Perspective de formation et d'insertion professionnelle pour des personnes \u00e9loign\u00e9es de l'emploi (personnes en situation de handicap, seniors, habitants de quartiers populaires) via les m\u00e9tiers du reconditionnement informatique.\",\r\n\"reveler\": \"Mutualisation des connaissances et mise en r\u00e9seau d'environ 80 acteurs professionnels (centres sociaux, m\u00e9diation num\u00e9rique, collectivit\u00e9s, organismes de formation, structures d'insertion) \u00e0 l'\u00e9chelle du d\u00e9partement.\"\r\n},\r\n{\r\n\"theme\": \"NUM\u00c9RIQUE\",\r\n\"porteur\": \"MISSION LOCALE OUEST PROVENCE\",\r\n\"projet\": \"Gaming House de l'insertion \u00e0 Miramas\",\r\n\"resume\": \"Projet d'insertion s'appuyant sur le jeu vid\u00e9o et le sport comme leviers de remobilisation, \u00e0 destination des jeunes de 16 \u00e0 25 ans de Miramas.\",\r\n\"territoire\": \"Miramas\",\r\n\"fis\": \"15\u202f000,00 \u20ac\",\r\n\"budget\": \"61\u202f000,00 \u20ac\",\r\n\"partFis\": \"24,6%\",\r\n\"personnes\": \"NR \u2014 projet en cours de formalisation, chiffres actuellement encore des objectifs, pas de b\u00e9n\u00e9ficiaires r\u00e9els comptabilis\u00e9s au moment du bilan\",\r\n\"actions\": \"6 r\u00e9unions de travail avec Famille et Provence\/13 Habitat\/Erilia ; 2 r\u00e9unions avec la Mission Locale d'Aix-en-Provence (projet similaire quartier Encagnane) ; 1 r\u00e9union avec le Service Politique de la Ville AMP (Karin Scaeffer) ; 1 r\u00e9union de pr\u00e9sentation aux acteurs locaux (ADDAP13, Politique de la Ville AMP, associations de quartiers) ; 4 r\u00e9unions avec le prestataire The Family ; 2 d\u00e9placements \u00e0 Paris (Fonds pour l'innovation sociale des ESH, subvention 60 000\u20ac sur 3 ans) ; 2 visites bailleur\/architecte du futur local\",\r\n\"inventaire\": \"14 r\u00e9unions de pr\u00e9paration avec les partenaires ; 2 d\u00e9placements \u00e0 Paris pour un financement ; 2 visites du futur local\",\r\n\"invPartenaires\": \"10 partenaires, dont 3 bailleurs sociaux et la Fondation Orange\",\r\n\"nbPartenaires\": \"10 entit\u00e9s nomm\u00e9es dans le bilan (pas de total chiffr\u00e9 officiel) : Famille et Provence, Erilia, Office Public 13 Habitat, Fondation Orange, F\u00e9d\u00e9ration des ESH, Mission Locale d'Aix-en-Provence, Service Politique de la Ville AMP, ADDAP13, associations de quartiers, prestataire The Family\",\r\n\"competences\": \"NR \u2014 action non encore op\u00e9rationnelle, pas d'accompagnement individuel d\u00e9marr\u00e9\",\r\n\"lienSocial\": \"NR\",\r\n\"comportement\": \"Les objectifs n'ont pas pu \u00eatre atteints : l'action n'a pas encore d\u00e9marr\u00e9 dans sa pratique. Ouverture pr\u00e9vue au d\u00e9but du second semestre 2026.\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"Source : CERFA compte-rendu financier de subvention (association loi 1901, formulaire n\u00b015059*02). Financement commune de Miramas : 2 500 \u20ac pr\u00e9vu \/ 2 500 \u20ac r\u00e9alis\u00e9 (100 %). CD13 : 16 000 \u20ac pr\u00e9vu \/ 0 \u20ac r\u00e9alis\u00e9 (0 %). FDS innovation : 22 000 \u20ac pr\u00e9vu \/ 15 000 \u20ac r\u00e9alis\u00e9 (68 %). Famille et Provence : 37 000 \u20ac pr\u00e9vu \/ 20 500 \u20ac r\u00e9alis\u00e9 (compl\u00e9t\u00e9 par ailleurs \u00e0 37 000 \u20ac, 180 %). Total charges r\u00e9alis\u00e9es 56 787 \u20ac (pr\u00e9vu 61 000 \u20ac, 93 %). Subvention FIS 15 000 \u20ac = 26,41 % du total des produits r\u00e9alis\u00e9s. Sign\u00e9 le 03\/02\/2026 \u00e0 Istres (Martial Alvarez).\",\r\n\"freins\": \"Freins institutionnels et partenariaux : retard de mise en \u0153uvre op\u00e9rationnelle (changement d'usage administratif du local, deux visites bailleur\/architecte en 2024\/25), report d'une partie des d\u00e9penses. Freins financiers : CD13 non vers\u00e9 (0 \u20ac sur 16 000 \u20ac pr\u00e9vus). Ouverture report\u00e9e au second semestre 2026. ATTENTION : le libell\u00e9 de cette ligne (\u00ab Gaming House \u00e0 Miramas \u00bb) et son r\u00e9sum\u00e9 (qui mentionne Port-Saint-Louis) sont incoh\u00e9rents dans le tableau d'origine \u2014 le rattachement ci-dessus suit le financement communal (Miramas) identifi\u00e9 dans le CERFA.\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"NUM\u00c9RIQUE\",\r\n\"porteur\": \"MISSION LOCALE OUEST PROVENCE\",\r\n\"projet\": \"Cr\u00e9ation d'une \u00ab gaming house\\\" \u00e0 Port Saint Louis du Rh\u00f4ne\",\r\n\"resume\": \"Projet d'insertion s'appuyant sur le jeu vid\u00e9o et le sport comme leviers de remobilisation, \u00e0 destination des jeunes de 16 \u00e0 25 ans de Port-Saint-Louis-du-Rh\u00f4ne.\",\r\n\"territoire\": \"Port-Saint-Louis-du-Rh\u00f4ne\",\r\n\"fis\": \"15\u202f000,00 \u20ac\",\r\n\"budget\": \"59\u202f200,00 \u20ac\",\r\n\"partFis\": \"25,3%\",\r\n\"personnes\": \"NR \u2014 projet en cours de formalisation, chiffres actuellement encore des objectifs, pas de b\u00e9n\u00e9ficiaires r\u00e9els comptabilis\u00e9s au moment du bilan\",\r\n\"actions\": \"6 r\u00e9unions de travail avec Famille et Provence\/13 Habitat\/Erilia ; 2 r\u00e9unions avec la Mission Locale d'Aix-en-Provence (projet similaire quartier Encagnane) ; 1 r\u00e9union avec le Service Politique de la Ville AMP (Karin Scaeffer) ; 1 r\u00e9union de pr\u00e9sentation aux acteurs locaux (Maison Pour Tous, ADDAP13, Politique de la Ville AMP, associations de quartiers) ; 4 r\u00e9unions avec le prestataire The Family ; 2 d\u00e9placements \u00e0 Paris (Fonds pour l'innovation sociale des ESH, subvention 60 000\u20ac sur 3 ans) ; 2 visites bailleur\/architecte du futur local (ancien logement \u00e0 changer d'usage administratif)\",\r\n\"inventaire\": \"14 r\u00e9unions de pr\u00e9paration avec les partenaires ; 2 d\u00e9placements \u00e0 Paris pour un financement ; 2 visites du futur local\",\r\n\"invPartenaires\": \"11 partenaires, dont 3 bailleurs sociaux et la Fondation Orange\",\r\n\"nbPartenaires\": \"10 entit\u00e9s nomm\u00e9es dans le bilan (pas de total chiffr\u00e9 officiel) : Famille et Provence, Erilia, Office Public 13 Habitat, Fondation Orange, F\u00e9d\u00e9ration des ESH, Mission Locale d'Aix-en-Provence, Service Politique de la Ville AMP, ADDAP13, Maison Pour Tous, associations de quartiers, prestataire The Family\",\r\n\"competences\": \"NR \u2014 action non encore op\u00e9rationnelle, pas d'accompagnement individuel d\u00e9marr\u00e9\",\r\n\"lienSocial\": \"NR\",\r\n\"comportement\": \"Les objectifs n'ont pas pu \u00eatre atteints : l'action n'a pas encore d\u00e9marr\u00e9 dans sa pratique. Ouverture pr\u00e9vue au d\u00e9but du second semestre 2026.\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"Source : CERFA compte-rendu financier de subvention (association loi 1901, formulaire n\u00b015059*02). Financement commune de Port-Saint-Louis : 10 000 \u20ac r\u00e9alis\u00e9 (non chiffr\u00e9 au pr\u00e9visionnel). CD13 : 16 000 \u20ac pr\u00e9vu \/ 0 \u20ac r\u00e9alis\u00e9 (0 %). PDV + FDS innovation : 38 200 \u20ac pr\u00e9vu \/ 15 000 \u20ac r\u00e9alis\u00e9 (39 %). 13 Habitat : 5 000 \u20ac pr\u00e9vu \/ 7 000 \u20ac r\u00e9alis\u00e9 (140 %). Aides priv\u00e9es : 15 600 \u20ac r\u00e9alis\u00e9. Total charges r\u00e9alis\u00e9es 56 787 \u20ac (pr\u00e9vu 59 200 \u20ac, 96 %). Subvention FIS 15 000 \u20ac = 26,41 % du total des produits r\u00e9alis\u00e9s. Sign\u00e9 le 03\/02\/2026 \u00e0 Istres (Martial Alvarez).\",\r\n\"freins\": \"Freins institutionnels et partenariaux : retard de mise en \u0153uvre op\u00e9rationnelle (changement d'usage administratif du local, deux visites bailleur\/architecte en 2024\/25), report d'une partie des d\u00e9penses. Freins financiers : CD13 non vers\u00e9 (0 \u20ac sur 16 000 \u20ac pr\u00e9vus). Ouverture report\u00e9e au second semestre 2026. ATTENTION : le libell\u00e9 de cette ligne (\u00ab Port-Saint-Louis \u00bb) et son r\u00e9sum\u00e9 (qui mentionne Miramas) sont incoh\u00e9rents dans le tableau d'origine \u2014 le rattachement ci-dessus suit le financement communal (Port-Saint-Louis) identifi\u00e9 dans le CERFA.\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"DISCRIMINATIONS\",\r\n\"porteur\": \"ACT\",\r\n\"projet\": \"Education, formation et lutte contre les discriminations\",\r\n\"resume\": \"Projet de lutte contre les discriminations visant \u00e0 former et \u00e0 cr\u00e9er des espaces de r\u00e9flexion partag\u00e9e, \u00e0 destination des acteurs de l'\u00e9ducation populaire et des habitants des quartiers prioritaires de Marseille, Port-de-Bouc et Martigues.\",\r\n\"territoire\": \"QPV Mlle+PACA\",\r\n\"fis\": \"25\u202f000,00 \u20ac\",\r\n\"budget\": \"25\u202f000,00 \u20ac\",\r\n\"partFis\": \"100,0%\",\r\n\"personnes\": \"38\",\r\n\"actions\": \"12 ateliers+9 \u00e9duc.+6 d\u00e9bats+5 ateliers\",\r\n\"inventaire\": \"17 ateliers (associations, scolaires, professionnels) ; 9 temps de formation ; 6 rencontres-d\u00e9bats\",\r\n\"invPartenaires\": \"la M\u00e9tropole, l'\u00c9tat, le CNRS, des universit\u00e9s et des r\u00e9seaux\",\r\n\"nbPartenaires\": \"M\u00e9tropole, DREETS, CNRS, Univ., r\u00e9seaux\",\r\n\"competences\": \"Projet 1 : 4 demi-journ\u00e9es de formation ; 6 ateliers inter-associatifs mensuels \u2192 mont\u00e9e en comp\u00e9tences de 8 professionnelles de diff\u00e9rents secteurs.\\nProjet 2 : 1 cycle de formation de 3 jours (acteurs \u00e9ducation populaire) ; 4 ateliers d'\u00e9criture.\\nProjet 4 : 3 cycles de formation enseignants (lyc\u00e9es PACA) ; 6 ateliers aupr\u00e8s du public scolaire.\\nProjet 5 (R\u00e9seau Soci\u00e9t\u00e9s Migrantes) : 2 formations transculturelles (6-12 participants\/session) ; 5 ateliers professionnels sur le ph\u00e9nom\u00e8ne migratoire.\",\r\n\"lienSocial\": \"\u00abFabriquer un nous collectif\u00bb \u2014 formulation r\u00e9currente dans les documents.\\nInauguration avenue de la Marche pour l'\u00c9galit\u00e9 \u2014 ancrage m\u00e9moriel collectif.\\n\u00abRestaurer des archives r\u00e9gionales\u00bb \u2014 construction d'une m\u00e9moire commune des quartiers populaires.\\nR\u00e9seau Soci\u00e9t\u00e9s Migrantes : r\u00e9duction de l'isolement des professionnels accompagnant des migrants primo-arrivants.\",\r\n\"comportement\": \"Projet 2 (Innovation) : \u00ables habitants et les professionnels ont largement conscience des ruptures d'\u00e9galit\u00e9 auxquelles ils sont confront\u00e9s dans leur quotidien mais n'identifient pas les leviers de transformation\u00bb \u2192 les ateliers visent \u00e0 identifier ces leviers. D\u00e9claration d'intention, pas de mesure de changement comportemental publi\u00e9e.\\nProjet 4 (Centre ressources) : idem \u2014 les ateliers permettent aux lyc\u00e9ens de comprendre les m\u00e9canismes d'exclusion mais sans indicateur de changement comportemental mesur\u00e9.\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"29\/38 b\u00e9n\u00e9ficiaires directs issus de QPV (76 %) \u2014 projet M\u00e9moire\/P\u00e9dagogie.\\n+5 000 ressources documentaires en acc\u00e8s libre.\\n10 entretiens film\u00e9s produits en 2024.\\nPublications annuelles (collection Silence, podcasts, lettres d'info mensuelles).\\nSuivi \u00e0 6 mois post-formation transculturelle (R\u00e9seau Soci\u00e9t\u00e9s Migrantes).\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics) : le texte \u00e9voque \u00e0 plusieurs reprises la difficult\u00e9 des professionnels du champ \u00e9ducatif et social \u00e0 faire face \u00e0 des \\\"formes de domination multiples et imbriqu\u00e9es\\\" pour lesquelles ils sont \\\"peu form\u00e9\u00b7es initialement\\\", ainsi qu'un besoin r\u00e9current \\\"d'accompagnement dans le temps long\\\" et un \\\"manque d'espaces d'\u00e9changes et de r\u00e9flexions\\\" chez les publics accompagn\u00e9s.\\n\\nFreins institutionnels\/structurels : l'association souligne que \\\"malgr\u00e9 les dispositifs de lutte contre les discriminations qui se multiplient depuis les ann\u00e9es 70, les discriminations perdurent\\\", sugg\u00e9rant un constat de frein syst\u00e9mique r\u00e9current auquel se heurte l'action associative depuis 2006, sans qu'il s'agisse d'un frein sp\u00e9cifique \u00e0 l'exercice 2024.\",\r\n\"ameliorer\": \"R\u00e9seau Soci\u00e9t\u00e9s Migrantes : r\u00e9duction de l'isolement des professionnels accompagnant des migrants primo-arrivants.\",\r\n\"emanciper\": \"Mont\u00e9e en comp\u00e9tences de professionnelles par des formations transculturelles et inter-associatives, cycles de formation enseignants. Identification de leviers de transformation face aux ruptures d'\u00e9galit\u00e9 constat\u00e9es. Suivi \u00e0 6 mois post-formation transculturelle (R\u00e9seau Soci\u00e9t\u00e9s Migrantes).\",\r\n\"reveler\": \"\u00ab Fabriquer un nous collectif \u00bb, inauguration avenue de la Marche pour l'\u00c9galit\u00e9, restauration d'archives r\u00e9gionales construction d'une m\u00e9moire commune des quartiers populaires.\"\r\n},\r\n{\r\n\"theme\": \"DISCRIMINATIONS\",\r\n\"porteur\": \"Association maison des familles et des associations\",\r\n\"projet\": \"Pi\u00e8ce de th\u00e9\u00e2tre contre les discriminations\",\r\n\"resume\": \"Projet artistique de lutte contre les discriminations, en particulier \u00e0 l'embauche, \u00e0 destination de jeunes du 14e arrondissement de Marseille et des publics rencontr\u00e9s lors de la diffusion.\",\r\n\"territoire\": \"QPV Marseille 14e (Centre Social Saint-Barth\u00e9l\u00e9my) + tourn\u00e9e \u00e0 Martigues, La Ciotat, Toulon et Paris\",\r\n\"fis\": \"30\u202f000,00 \u20ac\",\r\n\"budget\": \"50\u202f582,00 \u20ac\",\r\n\"partFis\": \"59,3%\",\r\n\"personnes\": \"Environ 50 jeunes participants directs (com\u00e9diens, ateliers, troupe). Environ 2 500 jeunes en public b\u00e9n\u00e9ficiaire indirect, sensibilis\u00e9s lors des repr\u00e9sentations th\u00e9\u00e2trales et des d\u00e9bats organis\u00e9s (texte tronqu\u00e9 dans le document au-del\u00e0 de ce point)\",\r\n\"actions\": \"Ateliers r\u00e9guliers de pratique th\u00e9\u00e2trale + tourn\u00e9e sc\u00e9nique \u00e0 l'\u00e9chelle m\u00e9tropolitaine et au-del\u00e0 : Le ZEF (Martigues), l'\u00c9cole de la 2e Chance (Paris), Espace Busserine, La Ciotat, Centre Social Les Abeilles (La Ciotat), Toulon. D\u00e9bats organis\u00e9s apr\u00e8s chaque repr\u00e9sentation\",\r\n\"inventaire\": \"5 villes de tourn\u00e9e, de Martigues \u00e0 Paris ; ateliers de th\u00e9\u00e2tre \u00e0 l'ann\u00e9e ; un d\u00e9bat apr\u00e8s chaque repr\u00e9sentation\",\r\n\"invPartenaires\": \"5 lieux d'accueil de la tourn\u00e9e\",\r\n\"nbPartenaires\": \"NR \u2014 pas de total chiffr\u00e9 dans le CERFA ; lieux partenaires nomm\u00e9s : Le ZEF (Martigues), \u00c9cole de la 2e Chance (Paris), Espace Busserine, Centre Social Les Abeilles (La Ciotat), structure(s) \u00e0 Toulon\",\r\n\"competences\": \"Ateliers r\u00e9guliers de pratique th\u00e9\u00e2trale ayant permis aux nouveaux participants de d\u00e9couvrir les bases du jeu d'acteur ; travail d'\u00e9criture collective du script construit \u00e0 partir des exp\u00e9riences v\u00e9cues\",\r\n\"lienSocial\": \"Int\u00e9gration de nouveaux participants ayant enrichi le projet en favorisant l'inclusion et l'apport de nouvelles perspectives (texte tronqu\u00e9 dans le document)\",\r\n\"comportement\": \"Objectifs d\u00e9clar\u00e9s atteints. Les d\u00e9bats organis\u00e9s apr\u00e8s chaque repr\u00e9sentation ont montr\u00e9 une \u00e9volution significative des jeunes (texte tronqu\u00e9 dans le document). Les retours positifs des jeunes et du public confirment l'impact et la pertinence de l'action\",\r\n\"sorties\": \"NR \u2014 non document\u00e9 dans le CERFA (dispositif culturel, pas d'indicateur d'insertion\/emploi)\",\r\n\"indicateurs\": \"Source : CERFA compte-rendu financier de subvention (association loi 1901, formulaire n\u00b015059*02). Total des produits r\u00e9alis\u00e9s 47 467 \u20ac (pr\u00e9vu 50 000 \u20ac, 95 %), dont subvention FIS 30 000 \u20ac = 63,2 % du total des produits (mention explicite du porteur). Aucun \u00e9cart budg\u00e9taire signal\u00e9 (\u00ab RAS \u00bb). Sign\u00e9 le 23\/01\/2026 \u00e0 Marseille par Claire Michel, repr\u00e9sentante l\u00e9gale de l'Association de Gestion et d'Animation de la Maison des Familles et des Associations (AGA-MFA) ; action port\u00e9e par le Centre Social Saint-Barth\u00e9l\u00e9my (identification CERFA : \u00ab Centre Social St Barth\u00e9l\u00e9my \u00bb, SIRET 323 034 843 00025, cachet AGA-MFA).\",\r\n\"freins\": \"NR \u2014 aucun frein mentionn\u00e9 dans le CERFA (\u00e9carts budg\u00e9taires : RAS)\",\r\n\"ameliorer\": \"D\u00e9bats organis\u00e9s apr\u00e8s chaque repr\u00e9sentation montrant une \u00e9volution significative des jeunes. Retours positifs des jeunes et du public.\",\r\n\"emanciper\": \"Ateliers r\u00e9guliers de pratique th\u00e9\u00e2trale (d\u00e9couverte du jeu d'acteur), \u00e9criture collective du script \u00e0 partir d'exp\u00e9riences v\u00e9cues.\",\r\n\"reveler\": \"Int\u00e9gration de nouveaux participants enrichissant le projet par l'inclusion et l'apport de nouvelles perspectives.\"\r\n},\r\n{\r\n\"theme\": \"DISCRIMINATIONS\",\r\n\"porteur\": \"Compagnie Mbongui\",\r\n\"projet\": \"R\u00e9cits, corps et m\u00e9moire (\u00c9l\u00e9gie d'exil) [PROJET INTERROMPU]\",\r\n\"resume\": \"Projet artistique abordant l'exil et la marginalisation des quartiers, visant \u00e0 ouvrir des espaces de r\u00e9flexion et d'expression, \u00e0 destination des jeunes et des habitants des quartiers prioritaires de Marseille. Projet interrompu.\",\r\n\"territoire\": \"QPV Marseille\",\r\n\"fis\": \"25\u202f000,00 \u20ac\",\r\n\"budget\": \"31\u202f695,00 \u20ac\",\r\n\"partFis\": \"78,9%\",\r\n\"personnes\": \"15 pers. (sortie de r\u00e9sidence, public professionnel)\",\r\n\"actions\": \"1 r\u00e9sidence de cr\u00e9ation (16-19\/09\/2024) + 1 sortie publique\",\r\n\"inventaire\": \"1 r\u00e9sidence de cr\u00e9ation de 4 jours ; 1 pr\u00e9sentation devant des professionnels\",\r\n\"invPartenaires\": \"7 structures de quartier\",\r\n\"nbPartenaires\": \"7 structures identifi\u00e9es (Viste, Astronef, Cit\u00e9, Capelette, Salins, Viv'Anim 13, Savine)\",\r\n\"competences\": \"NR\",\r\n\"lienSocial\": \"\u00abL'int\u00e9r\u00eat r\u00e9el des acteurs de terrain pour des projets artistiques engag\u00e9s sur des sujets sensibles\u00bb observ\u00e9 lors du d\u00e9marchage.\\n5\/7 structures ont r\u00e9pondu positivement \u2014 signal d'un besoin territorial de tels projets.\\nPas d'impact lien social effectif mesur\u00e9 (aucune repr\u00e9sentation ou atelier r\u00e9alis\u00e9 avec le public cible).\",\r\n\"comportement\": \"NR\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"Aucun indicateur d'impact mesurable \u2014 phase de production uniquement r\u00e9alis\u00e9e.\",\r\n\"freins\": \"Freins humains (\u00e9quipes et publics)\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"\",\r\n\"reveler\": \"Int\u00e9r\u00eat r\u00e9el des acteurs de terrain observ\u00e9 lors du d\u00e9marchage (5\/7 structures favorables) signal d'un besoin territorial non concr\u00e9tis\u00e9, projet arr\u00eat\u00e9 [INTERROMPU].\"\r\n},\r\n{\r\n\"theme\": \"DISCRIMINATIONS\",\r\n\"porteur\": \"ARCAF Riposte\",\r\n\"projet\": \"Autod\u00e9fense f\u00e9ministe\",\r\n\"resume\": \"Projet de lutte contre les violences et les discriminations de genre, \u00e0 destination des femmes et des adolescentes des communes de la m\u00e9tropole.\",\r\n\"territoire\": \"QPV Mlle+IDF\",\r\n\"fis\": \"18\u202f000,00 \u20ac\",\r\n\"budget\": \"36\u202f042,00 \u20ac\",\r\n\"partFis\": \"49,9%\",\r\n\"personnes\": \"189 touch\u00e9s dont 109 direct\",\r\n\"actions\": \"~46 (19 stages+12 ados+8 ateliers+5 stands)\",\r\n\"inventaire\": \"19 stages d'autod\u00e9fense pour femmes ; 12 stages pour adolescentes ; 8 ateliers de 2 heures et 5 stands\",\r\n\"invPartenaires\": \"8 lyc\u00e9es ; 7 centres sociaux ; le r\u00e9seau national Riposte\",\r\n\"nbPartenaires\": \"8 lyc\u00e9es+7 centres sociaux+R\u00e9seau Riposte\",\r\n\"competences\": \"19 stages pour femmes (16+ ans) dont 2 LSF et 1 pour femmes en situation de handicap moteur.\\n12 stages pour adolescentes.\\n8 ateliers 2h dont 1 pour femmes Sourdes\/entendantes et 1 pour femmes avec handicap psychique\/cognitif.\\n1 atelier 3h pour femmes malades chroniques et \u00e2g\u00e9es \u00e0 mobilit\u00e9 r\u00e9duite.\\n1 stage 2 jours (ENSAD Paris) pour 15 enseignantes\/doctorantes\/\u00e9tudiantes.\\n16 stages Riposte aupr\u00e8s de lyc\u00e9ennes (programme R\u00e9gion Sud, avril 2024-avril 2025).\",\r\n\"lienSocial\": \"523 femmes touch\u00e9es en 2024, dont public en grande vuln\u00e9rabilit\u00e9 (femmes battues, situ\u00e9es dans QPV, en situation de handicap, sous-main de justice).\\nR\u00e9seau Riposte national \u2014 cr\u00e9ation d'un tissu de solidarit\u00e9 entre formatrices.\\nSupervision mensuelle psychologue + formation PSC1 + PSSM des formatrices \u2014 bien-\u00eatre des intervenantes.\\n\u00abSororit\u00e9\u00bb entre participantes \u2014 lien social entre femmes en vuln\u00e9rabilit\u00e9.\",\r\n\"comportement\": \"T\u00e9moignages qualifi\u00e9s : \u00abchanger de posture physique et mentale\u00bb \/ \u00absortir d'une position de passivit\u00e9 face aux menaces\u00bb \/ \u00abla peur est moindre\u00bb \/ \u00abje me sens pr\u00eate \u00e0 tenir t\u00eate \u00e0 mon conjoint\u00bb \u2014 indicateurs de changement de posture document\u00e9s.\\nRetour enseignantes : \u00ableurs postures changent, elles s'affirment, elles se sentent mieux\u00bb \/ \u00abelles me reparlent r\u00e9guli\u00e8rement de ce stage\u00bb.\\n\u2192 Changement comportemental document\u00e9 qualitativement par t\u00e9moignages multiples.\",\r\n\"sorties\": \"Stage \u00ablutte contre le harc\u00e8lement scolaire\u00bb (lyc\u00e9ennes) : r\u00e9sultat vis\u00e9 = \u00abreprendre confiance en elles, s'autoriser \u00e0 dire non\u00bb.\\n1 atelier s\u00e9lectionn\u00e9 pour le Catalogue contre les Discriminations M\u00e9tropole AMP 2025 \u2014 reconnaissance institutionnelle.\\n\u2192 Indicateurs de sortie positive qualitatifs (empowerment, confiance) mais non chiffr\u00e9s.\",\r\n\"indicateurs\": \"523 participantes en 2024.\\n164 jeunes de moins de 18 ans.\\n90 lyc\u00e9ennes programme R\u00e9gion Sud.\\n7\/8 interventions lyc\u00e9ennes r\u00e9alis\u00e9es (87,5%).\\nTaux de satisfaction tr\u00e8s \u00e9lev\u00e9 (t\u00e9moignages qualitatifs unanimement positifs).\\n1 atelier s\u00e9lectionn\u00e9 Catalogue contre les Discriminations M\u00e9tropole AMP 2025.\",\r\n\"freins\": \"Freins financiers : le Fonds pour les femmes en M\u00e9diterran\u00e9e, cens\u00e9 apporter 10 000 \u20ac, n'a vers\u00e9 aucun financement (0% de r\u00e9alisation), et l'ensemble des subventions n'a atteint que 61% des montants demand\u00e9s. L'association a d\u00fb compenser en sollicitant davantage de cofinancement aupr\u00e8s des structures partenaires locales (communes, centres sociaux), mais celles-ci disposaient de \\\"budgets limit\u00e9s\\\", ce qui a contraint le budget final ex\u00e9cut\u00e9 \u00e0 31 603 \u20ac au lieu des 36 042 \u20ac pr\u00e9vus (88%).\\n\\nFreins institutionnels\/partenariaux : la d\u00e9pendance \u00e0 de petites structures locales aux ressources restreintes (petites communes, centres sociaux) a limit\u00e9 la capacit\u00e9 de l'association \u00e0 s\u00e9curiser un cofinancement suffisant pour couvrir l'int\u00e9gralit\u00e9 du programme initial.\",\r\n\"ameliorer\": \"Changement de posture physique et mentale document\u00e9 par t\u00e9moignages, chez des femmes touch\u00e9es dont un public en grande vuln\u00e9rabilit\u00e9.\",\r\n\"emanciper\": \"Stages d'autod\u00e9fense pour femmes et adolescentes, ateliers adapt\u00e9s (LSF, handicap). Sortie d'une position de passivit\u00e9 face aux menaces, confiance en soi retrouv\u00e9e.\",\r\n\"reveler\": \"R\u00e9seau Riposte national cr\u00e9ant un tissu de solidarit\u00e9 entre formatrices. 1 atelier s\u00e9lectionn\u00e9 au Catalogue contre les Discriminations M\u00e9tropole AMP 2025 reconnaissance institutionnelle.\"\r\n},\r\n{\r\n\"theme\": \"DISCRIMINATIONS\",\r\n\"porteur\": \"\u00c9closion 13\",\r\n\"projet\": \"\u00c9galit\u00e9 F\/H culture (Femmes savantes)\",\r\n\"resume\": \"Projet de lutte contre les discriminations visant \u00e0 valoriser les savoir-faire et \u00e0 travailler la prise de parole, \u00e0 destination de femmes isol\u00e9es et de m\u00e8res au foyer \u00e0 Marseille et Martigues.\",\r\n\"territoire\": \"R\u00e9gion Sud PACA\",\r\n\"fis\": \"15\u202f000,00 \u20ac\",\r\n\"budget\": \"28\u202f912,00 \u20ac\",\r\n\"partFis\": \"51,9%\",\r\n\"personnes\": \"\",\r\n\"actions\": \"19 ateliers+56 spectacles+6 gestion, dont 13 s\u00e9ances dans 2 centres sociaux (Baussenque Marseille, Jeanne Pistoun Martigues) et 2 livrets de capitalisation\",\r\n\"inventaire\": \"56 spectacles ; 19 ateliers de m\u00e9diation culturelle, dont 13 en centres sociaux ; 6 ateliers sur la gestion d'un projet artistique\",\r\n\"invPartenaires\": \"5 partenaires culturels et institutionnels\",\r\n\"nbPartenaires\": \"PAM, ARSUD, CRESS, DRAC, CIDFF\",\r\n\"competences\": \"94 adh\u00e9rentes accompagn\u00e9es individuellement (structuration de projets artistiques, dossiers, production).\\n6 ateliers collectifs sur la gestion d'un projet artistique (cycle pilote mars 2024, ~5 personnes\/atelier).\\n19 ateliers de m\u00e9diation culturelle.\",\r\n\"lienSocial\": \"\u00abVivier d'opportunit\u00e9s et levier d'insertion\u00bb \u2014 formulation centrale.\\nCrowdfunding 3 400 \u20ac collect\u00e9s = mobilisation solidaire de la communaut\u00e9 d'adh\u00e9rentes.\\nR\u00e9seau d'entraide bas\u00e9 sur la mutualisation de comp\u00e9tences et synergies artistiques.\\n8 ap\u00e9ros mensuels (10 adh\u00e9rentes\/ap\u00e9ro) = lieu de lien social informel.\",\r\n\"comportement\": \"Atelier Osons l'\u00c9galit\u00e9 \u00abAnatomie d'une femme\u00bb : questionner la repr\u00e9sentation des femmes dans l'imaginaire collectif via le cin\u00e9ma \u2014 d\u00e9claration d'intention, pas de mesure de changement.\\nAteliers de m\u00e9diation culturelle : \u00abempowerment de femmes par la pratique artistique\u00bb \u2014 d\u00e9claration d'intention.\\nBal des Paysannes : \u00abs'\u00e9manciper des constructions sociales des rapports de genre\u00bb \u2014 idem.\\n\u2192 Pas de mesure de changement comportemental publi\u00e9e.\",\r\n\"sorties\": \"91 contrats sign\u00e9s pour 95 adh\u00e9rentes = taux de contractualisation de 96% \u2014 indicateur fort d'insertion professionnelle.\\n226 694 \u20ac de paies r\u00e9alis\u00e9es en 2024 (depuis 13 ans : 497 artistes accompagn\u00e9es \/ 781 contrats \/ 1 566 415 \u20ac masse salariale totale).\\n16 projets s\u00e9lectionn\u00e9s (Rouvrir le Monde + Provence en Sc\u00e8ne) = acc\u00e8s \u00e0 des dispositifs de diffusion professionnelle.\",\r\n\"indicateurs\": \"96% taux de contractualisation des adh\u00e9rentes (91\/95 contrats en 2024).\\n9 741 personnes touch\u00e9es par les productions.\\n497 artistes accompagn\u00e9es depuis 13 ans.\\n226 694 \u20ac de paies r\u00e9alis\u00e9es en 2024.\\n+55% subventions \/ retour \u00e0 l'\u00e9quilibre financier apr\u00e8s 2 ans de d\u00e9ficit.\",\r\n\"freins\": \"Freins financiers : les cotisations d'adh\u00e9rentes ont chut\u00e9 de 63%, un d\u00e9ficit chronique s'est install\u00e9 (-23 191 \u20ac en 2023, -32 873 \u20ac en 2022), et la structure d\u00e9pend fortement de subventions d\u00e9di\u00e9es \u00e0 des actions sp\u00e9cifiques (226 694 \u20ac) qui ne couvrent pas les besoins de fonctionnement g\u00e9n\u00e9ral, cr\u00e9ant une \\\"porosit\u00e9\\\" pour la p\u00e9rennisation des postes permanents. Les recettes propres (commissions sur ventes de prestations) restent limit\u00e9es (12 000-15 000 \u20ac\/an), rendant la structure structurellement fragile.\\n\\nFreins humains (\u00e9quipes) : l'\u00e9quipe salari\u00e9e a \u00e9t\u00e9 fortement r\u00e9duite, passant \u00e0 seulement 2 salari\u00e9es en 2024, avec plusieurs d\u00e9parts de personnel (fin de CDI, fin d'alternance) durant l'ann\u00e9e, contraignant l'association \u00e0 \\\"maintenir son action culturelle avec une \u00e9quipe r\u00e9duite\\\". Les charges de personnel ont \u00e9t\u00e9 r\u00e9duites de 24% \\\"sans licenciements\\\", mais au prix d'une r\u00e9organisation profonde du travail.\\n\\nFreins institutionnels\/structurels : la situation financi\u00e8re a conduit \u00e0 la mise en pause temporaire du Dispositif Jeune \u00c9mergence et \u00e0 une r\u00e9\u00e9valuation compl\u00e8te du mod\u00e8le socio-\u00e9conomique, n\u00e9cessitant l'accompagnement du Dispositif Local d'Accompagnement (DLA) avec France Active pour identifier de nouveaux axes de d\u00e9veloppement. L'association reconna\u00eet explicitement une baisse du nombre d'adh\u00e9rentes et de contrats sign\u00e9s comme \\\"attestant des obstacles rencontr\u00e9s cette ann\u00e9e\\\".\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"Accompagnement individualis\u00e9 \u00e0 la structuration de projets artistiques. Contractualisation quasi syst\u00e9matique des adh\u00e9rentes, autonomie \u00e9conomique acquise par la professionnalisation.\",\r\n\"reveler\": \"\u00ab Vivier d'opportunit\u00e9s et levier d'insertion \u00bb, crowdfunding 3 400 \u20ac collect\u00e9s par la communaut\u00e9, 16 projets s\u00e9lectionn\u00e9s (Rouvrir le Monde, Provence en Sc\u00e8ne) acc\u00e8s \u00e0 des dispositifs de diffusion professionnelle.\"\r\n},\r\n{\r\n\"theme\": \"DISCRIMINATIONS\",\r\n\"porteur\": \"Union sportive du panier de la victoire\",\r\n\"projet\": \"Basket inclusif\",\r\n\"resume\": \"Projet sportif de lutte contre les discriminations visant \u00e0 promouvoir l'\u00e9galit\u00e9 entre les femmes et les hommes ainsi que le bien-\u00eatre physique et mental, \u00e0 destination des habitantes et habitants des quartiers prioritaires de Marseille.\",\r\n\"territoire\": \"QPV Marseille (2e, 3e, 7e, 14e, 15e arrondissements ; terrains Busserade 13003 et Les Carmes)\",\r\n\"fis\": \"15\u202f000,00 \u20ac\",\r\n\"budget\": \"\",\r\n\"partFis\": \"46,90%\",\r\n\"personnes\": \"Environ 350 b\u00e9n\u00e9ficiaires au total : 300 femmes et 50 hommes. Public majoritairement jeune (15-25 ans), issu des quartiers prioritaires de Marseille\",\r\n\"actions\": \"Action r\u00e9alis\u00e9e entre mai 2024 et avril 2025 : entra\u00eenements r\u00e9guliers, rencontres sportives et \u00e9v\u00e9nements (tournois et festival, dont un 4e festival sur l'esplanade du Mucem). Nombre total d'actions non chiffr\u00e9 dans le CERFA\",\r\n\"inventaire\": \"entra\u00eenements de basket toute l'ann\u00e9e ; rencontres sportives et tournois ; 1 festival sur l'esplanade du Mucem\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR \u2014 non chiffr\u00e9 dans le CERFA\",\r\n\"competences\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"lienSocial\": \"Coh\u00e9sion sociale et mixit\u00e9 recherch\u00e9es dans un cadre accessible et bienveillant ; entra\u00eenements et \u00e9v\u00e9nements d\u00e9ploy\u00e9s sur plusieurs arrondissements (2e, 3e, 7e, 14e, 15e) et rassemblement lors du festival au Mucem\",\r\n\"comportement\": \"Objectifs d\u00e9clar\u00e9s atteints au regard des indicateurs d\u00e9finis (participantes r\u00e9guli\u00e8res, taux de fr\u00e9quentation\/fid\u00e9lisation, mixit\u00e9 effective, implication progressive dans la dynamique collective) : participation f\u00e9minine conforme voire sup\u00e9rieure aux objectifs initiaux, r\u00e9gularit\u00e9 de fr\u00e9quentation, am\u00e9lioration notable de la confiance et de l'engagement des participantes\",\r\n\"sorties\": \"NR \u2014 non document\u00e9 dans le CERFA\",\r\n\"indicateurs\": \"Source : CERFA compte-rendu financier de subvention (association loi 1901, formulaire n\u00b015059*02). Total des produits mon\u00e9taires r\u00e9alis\u00e9s 23 500 \u20ac (= pr\u00e9vu), dont subvention FIS 15 000 \u20ac. Contributions volontaires en nature valoris\u00e9es 9 000 \u20ac (mise \u00e0 disposition de biens\/services 4 000 \u20ac + personnel b\u00e9n\u00e9vole 5 000 \u20ac). Total g\u00e9n\u00e9ral 32 500 \u20ac. La subvention de 15 000 \u20ac repr\u00e9sente 46 % du total g\u00e9n\u00e9ral (mention explicite du porteur). Aucun \u00e9cart budg\u00e9taire signal\u00e9. Sign\u00e9 le 29\/01\/2026 \u00e0 Marseille (Nehari Nadji).\",\r\n\"freins\": \"NR \u2014 aucun frein mentionn\u00e9 dans le CERFA ; compte-rendu d\u00e9clar\u00e9 conforme au budget pr\u00e9visionnel initial\",\r\n\"ameliorer\": \"Am\u00e9lioration notable de la confiance et de l'engagement des participantes, r\u00e9gularit\u00e9 de fr\u00e9quentation.\",\r\n\"emanciper\": \"Participation f\u00e9minine conforme voire sup\u00e9rieure aux objectifs, implication progressive dans la dynamique collective.\",\r\n\"reveler\": \"Coh\u00e9sion sociale et mixit\u00e9 recherch\u00e9es dans un cadre accessible, d\u00e9ploiement sur 5 arrondissements et rassemblement au festival Mucem.\"\r\n},\r\n{\r\n\"theme\": \"ENFANCE\/JEUNESSE\",\r\n\"porteur\": \"Delta France Asso.\",\r\n\"projet\": \"Forum Monde Possibles\",\r\n\"resume\": \"\u00c9v\u00e9nement d\u00e9di\u00e9 \u00e0 la jeunesse visant \u00e0 cr\u00e9er un espace de r\u00e9flexion et d'expression sur les enjeux de demain, \u00e0 destination des jeunes de la m\u00e9tropole.\",\r\n\"territoire\": \"QPV Mlle+PACA\",\r\n\"fis\": \"20\u202f000,00 \u20ac\",\r\n\"budget\": \"46\u202f227,00 \u20ac\",\r\n\"partFis\": \"43,3%\",\r\n\"personnes\": \"8111\",\r\n\"actions\": \"56+ actions (16 Pfff+7 IM+28 DF)\",\r\n\"inventaire\": \"56+ actions pour les jeunes, dont 28 op\u00e9rations de b\u00e9n\u00e9volat\",\r\n\"invPartenaires\": \"700+ structures mobilis\u00e9es pour le forum\",\r\n\"nbPartenaires\": \"700+ structures (Forum MDP)\",\r\n\"competences\": \"227 jeunes accompagn\u00e9s programme Passe D' (363 depuis 2022) \u2014 ateliers de d\u00e9veloppement des soft skills.\\n23 jeunes programme Inclu'Sport (6 ateliers + agora citoyenne).\\nLyc\u00e9ens R\u00e9gion Sud \u2014 ateliers sant\u00e9 mentale \/ harc\u00e8lement scolaire (nombre NR).\",\r\n\"lienSocial\": \"Forum MDP : \u00abutiliser l'attractivit\u00e9 culturelle pour sensibiliser et susciter l'engagement du jeune\u00bb \u2014 outil de mobilisation citoyenne.\\nDelta Family : +68 % de mobilisation b\u00e9n\u00e9vole vs 2024 \u2014 indicateur de renforcement du tissu associatif.\\nPasse D' : lien avec QPV, rencontres professionnelles favorisant l'inclusion sociale.\",\r\n\"comportement\": \"Programme \u00abPfff\u00bb : enqu\u00eate nationale diffus\u00e9e pour recenser les habitudes de consommation et r\u00e9duire l'\u00e2ge de la premi\u00e8re exp\u00e9rimentation \u2014 d\u00e9claration d'intention, pas de mesure de changement comportemental publi\u00e9e dans ce rapport.\\nInclu'Sport : 10 000 votes sur la proposition citoyenne \u2014 indicateur de mobilisation, non de changement comportemental.\\n\u2192 Pas de mesure de changement de comportement av\u00e9r\u00e9e disponible dans ce document.\",\r\n\"sorties\": \"Passe D' : \u00absortie positive\u00bb explicitement vis\u00e9e (emploi, formation, orientation vers structure d'accompagnement) \u2014 r\u00e9sultats non chiffr\u00e9s pour 2025 dans ce document.\\nInvest in Me : accompagnement \u00e0 la cr\u00e9ation d'entreprise \u2014 pas de taux de cr\u00e9ation mesur\u00e9.\\n\u2192 Donn\u00e9es de sorties positives non disponibles.\",\r\n\"indicateurs\": \"+40 % d'op\u00e9rations Delta Family vs 2024.\\n+68 % de mobilisation b\u00e9n\u00e9vole.\\n1606 b\u00e9n\u00e9voles inscrits (320 actifs).\\n10 000 votes Inclu'Sport.\\nLivre Blanc \/ Tribune des Jeunes produit chaque ann\u00e9e.\",\r\n\"freins\": \"pas de freins\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"Accompagnement de jeunes au d\u00e9veloppement des soft skills et \u00e0 l'inclusion par le sport. Sortie positive vis\u00e9e (emploi, formation, orientation), non encore chiffr\u00e9e.\",\r\n\"reveler\": \"Forum Monde Possibles mobilisant l'attractivit\u00e9 culturelle pour susciter l'engagement des jeunes, +68% de mobilisation b\u00e9n\u00e9vole vs 2024, 10 000 votes sur une proposition citoyenne (Inclu'Sport).\"\r\n},\r\n{\r\n\"theme\": \"ENFANCE\/JEUNESSE\",\r\n\"porteur\": \"Le Sel de la Vie\",\r\n\"projet\": \"Excellence et insertion\",\r\n\"resume\": \"Projet \u00e9ducatif visant \u00e0 d\u00e9velopper l'app\u00e9tence et la r\u00e9ussite dans les fili\u00e8res scientifiques, \u00e0 destination des coll\u00e9giens, lyc\u00e9ens et \u00e9tudiants des quartiers prioritaires de Marseille.\",\r\n\"territoire\": \"QPV 13e-16e Mlle\",\r\n\"fis\": \"20\u202f000,00 \u20ac\",\r\n\"budget\": \"50\u202f000,00 \u20ac\",\r\n\"partFis\": \"40,0%\",\r\n\"personnes\": \"567\",\r\n\"actions\": \"11 actions \/ 5 mobilit\u00e9s Erasmus+\",\r\n\"inventaire\": \"11 actions \u00e9ducatives ; 5 s\u00e9jours Erasmus+, pour 54 participants\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR\",\r\n\"competences\": \"127 form\u00e9s concours sant\u00e9 (formation intensive, r\u00e9sultats aux concours).\\n37 stagiaires formations sanitaires et sociales (aide-soignant, brancardier, auxiliaire pu\u00e9riculture).\\n54 personnes Erasmus+ (attestation + Europass Mobilit\u00e9).\\n17 femmes permis bateau (Daronnes).\\nExcellence Sciences : r\u00e9sultats scolaires probants, r\u00e9ussite aux examens (non chiffr\u00e9s).\",\r\n\"lienSocial\": \"Services Civiques Combin\u00e9s : partenariat micro-lyc\u00e9e \u2014 r\u00e9int\u00e9gration dans l'\u00c9ducation Nationale.\\nDAO : r\u00e9introduction dans la formation initiale \u2014 renforcement du tissu \u00e9ducatif.\\nDaronnes : autonomisation de femmes \u00e9loign\u00e9es de l'emploi \u2014 impact sur coh\u00e9sion sociale et \u00e9galit\u00e9 des chances.\",\r\n\"comportement\": \"Excellence Sciences : \u00abr\u00e9sultats probants sur les r\u00e9sultats scolaires, l'orientation scolaire et la r\u00e9ussite aux examens\u00bb \u2014 d\u00e9claration g\u00e9n\u00e9rale sans indicateur mesur\u00e9 disponible dans ce document.\\nDaronnes : 17\/23 ont obtenu le permis bateau = r\u00e9sultat objectivable (taux de r\u00e9ussite 74 %).\\n\u2192 Changement de comportement partiel mesurable.\",\r\n\"sorties\": \"M\u00e9denpharmakine : 13 \u00abgrands admis\u00bb class\u00e9s dans le premier d\u00e9cile des concours sant\u00e9 \u2014 indicateur de sortie positive objectivable.\\nExcellence Sanitaire-Sociale : 65 % brancardiers plac\u00e9s en formation, 95 % aides-soignantes plac\u00e9es, 52 % auxiliaires pu\u00e9riculture plac\u00e9s.\\nServices Civiques Combin\u00e9s : 75 % de r\u00e9ussite au baccalaur\u00e9at.\\nSESAME : 70 % en orientation professionnelle (sports\/loisirs, BNSSA, reprise formation).\\nDAO : r\u00e9orientations vers EN, formations professionnelles, Parcoursup, alternance (nombre NR).\",\r\n\"indicateurs\": \"13 grands admis (premier d\u00e9cile) \u2014 M\u00e9denpharmakine.\\n95 % aides-soignantes plac\u00e9es.\\n75 % r\u00e9ussite au baccalaur\u00e9at (Services Civiques).\\n74 % r\u00e9ussite permis bateau (Daronnes).\\n70 % orientation positive (SESAME).\",\r\n\"freins\": \"Freins financiers : l'association n'a obtenu aucun des financements sollicit\u00e9s aupr\u00e8s de la R\u00e9gion (0 \u20ac sur 80 000 \u20ac pr\u00e9vus), du D\u00e9partement (0 \u20ac sur 40 000 \u20ac), de la Commune (0 \u20ac sur 20 000 \u20ac) et des aides priv\u00e9es (0 \u20ac sur 8 000 \u20ac) \u2014 seul le Fonds Innovation de la M\u00e9tropole AMP a \u00e9t\u00e9 partiellement vers\u00e9 (20 000 \u20ac sur 80 000 \u20ac pr\u00e9vus, soit 25%). Au total, le budget ex\u00e9cut\u00e9 n'atteint que 23 000 \u20ac sur les 228 000 \u20ac pr\u00e9vus initialement, soit \u00e0 peine 10% du plan de financement. L'association le formule sans d\u00e9tour : \\\"Nous n'avons pas pu obtenir les subventions demand\u00e9es aupr\u00e8s des autres partenaires institutionnels. Notre budget en a \u00e9t\u00e9 gr\u00e9v\u00e9\\\".\\n\\nFreins humains (\u00e9quipes) : cons\u00e9quence directe du sous-financement, les charges de personnel pr\u00e9vues (168 040 \u20ac entre r\u00e9mun\u00e9rations et charges sociales) n'ont \u00e9t\u00e9 ex\u00e9cut\u00e9es qu'\u00e0 hauteur de 21 156 \u20ac, soit environ 13% seulement, ce qui a n\u00e9cessit\u00e9 un recours accru au b\u00e9n\u00e9volat pour compenser (100h de b\u00e9n\u00e9volat pour la coordination).\",\r\n\"ameliorer\": \"74 % r\u00e9ussite permis bateau. Autonomisation de femmes \u00e9loign\u00e9es de l'emploi, levier d'\u00e9galit\u00e9 des chances\",\r\n\"emanciper\": \"Formation aux concours sant\u00e9 et aux m\u00e9tiers sanitaires et sociaux, mobilit\u00e9 europ\u00e9enne via Erasmus+. Placements en emploi et r\u00e9ussite scolaire massifs, insertion professionnelle av\u00e9r\u00e9e.\",\r\n\"reveler\": \"R\u00e9int\u00e9gration dans l'\u00c9ducation Nationale via Services Civiques Combin\u00e9s et DAO, renforcement du tissu \u00e9ducatif certification Qualiopi et mod\u00e8le Erasmus+ comme outils d'essaimage.\"\r\n},\r\n{\r\n\"theme\": \"ENFANCE\/JEUNESSE\",\r\n\"porteur\": \"FACE Sud Provence\",\r\n\"projet\": \"\u00c9ducation+Emploi\/Inclusion\",\r\n\"resume\": \"Projet d'orientation et de d\u00e9couverte des m\u00e9tiers, en lien avec les enjeux environnementaux, \u00e0 destination des jeunes scolaris\u00e9s des quartiers prioritaires de la m\u00e9tropole.\",\r\n\"territoire\": \"QPV Mlle+AMP\",\r\n\"fis\": \"7\u202f000,00 \u20ac\",\r\n\"budget\": \"8\u202f400,00 \u20ac\",\r\n\"partFis\": \"83,3%\",\r\n\"personnes\": \"1 581 jeunes touch\u00e9s\",\r\n\"actions\": \"NR (nb ateliers non pr\u00e9cis\u00e9)\",\r\n\"inventaire\": \"ateliers d'orientation et de d\u00e9couverte des m\u00e9tiers\",\r\n\"invPartenaires\": \"122 entreprises et institutions\",\r\n\"nbPartenaires\": \"122 entreprises+institutionnels\",\r\n\"competences\": \"175 collaborateurs sensibilis\u00e9s et form\u00e9s.\\n96 collaborateurs engag\u00e9s (Education & Culture).\\n150 collaborateurs engag\u00e9s (Emploi & Inclusion).\\n1 581 jeunes accompagn\u00e9s dans leur orientation scolaire (Discovery, Wifilles, Mentorat, Forum, Stand Up).\\nWifilles : 5 ateliers th\u00e9matiques (codage, robotique) \u2014 formation non certifiante.\\nJob Academy : accompagnement collectif + individuel au retour \u00e0 l'emploi.\",\r\n\"lienSocial\": \"PAQTE : contribution au d\u00e9veloppement \u00e9conomique et social des QPV.\\nVillage de l'\u00c9galit\u00e9 : d\u00e9construction des st\u00e9r\u00e9otypes dans le recrutement.\\nR\u00e9gate des Possibles : rencontre entreprises \/ talents, innovation sociale.\\nQuartier-\u00c9cole : cr\u00e9ation de liens entre les enfants et leur quartier \u2014 renforcement du sentiment d'appartenance et de s\u00e9curit\u00e9.\",\r\n\"comportement\": \"Wifilles : d\u00e9couverte du num\u00e9rique\/digital pour coll\u00e9giennes et lyc\u00e9ennes \u2014 sensibilisation, pas de mesure de changement comportemental document\u00e9e.\\nMentorat : d\u00e9veloppement soft skills et culture g\u00e9n\u00e9rale \u2014 d\u00e9claration d'intention.\\n\u2192 Pas de mesure de changement comportemental publi\u00e9e.\",\r\n\"sorties\": \"Job Academy : 59 % de retour \u00e0 l'emploi (b\u00e9n\u00e9ficiaires des Job Academy) \u2014 indicateur objectivable et solide.\\n833 heures de b\u00e9n\u00e9volat mobilis\u00e9es.\\nMission Possible (Baumettes) : pr\u00e9paration \u00e0 la sortie de prison \u2014 taux de retour \u00e0 l'emploi NR.\\nPlans de Travail (RQTH seniors) : taux d'int\u00e9gration NR.\",\r\n\"indicateurs\": \"59 % de retour \u00e0 l'emploi (Job Academy).\\n1 581 jeunes accompagn\u00e9s.\\n334 demandeurs d'emploi accompagn\u00e9s.\\n833 heures de b\u00e9n\u00e9volat.\\n122 entreprises mobilis\u00e9es.\",\r\n\"freins\": \"pas de freins\",\r\n\"ameliorer\": \"D\u00e9construction des st\u00e9r\u00e9otypes dans le recrutement. Renforcement du sentiment d'appartenance et de s\u00e9curit\u00e9 des enfants dans leur quartier.\",\r\n\"emanciper\": \"Accompagnement des jeunes dans leur orientation scolaire. Retour \u00e0 l'emploi favoris\u00e9, autonomie professionnelle retrouv\u00e9e.\",\r\n\"reveler\": \"PAQTE contribuant au d\u00e9veloppement \u00e9conomique et social des QPV, R\u00e9gate des Possibles mettant en relation entreprises et talents, 833h de b\u00e9n\u00e9volat mobilis\u00e9es effet de levier entreprises\/territoire.\"\r\n},\r\n{\r\n\"theme\": \"ENFANCE\/JEUNESSE\",\r\n\"porteur\": \"Camplus\",\r\n\"projet\": \"Programme \u00e9ducatif pour l'orientation des jeunes\",\r\n\"resume\": \"Programme \u00e9ducatif visant \u00e0 accompagner l'orientation et la construction du parcours professionnel, \u00e0 destination des lyc\u00e9ens des quartiers prioritaires de la m\u00e9tropole.\",\r\n\"territoire\": \"Lyc\u00e9es Vitrolles et St Exup\u00e9ry\",\r\n\"fis\": \"20\u202f000,00 \u20ac\",\r\n\"budget\": \"20\u202f000,00 \u20ac\",\r\n\"partFis\": \"100,0%\",\r\n\"personnes\": \"360 touch\u00e9s dont 63 jeunes accompagn\u00e9s\",\r\n\"actions\": \"3 ateliers orientation (Vitrolles 08\/02\/2025, St Exup\u00e9ry 10\/02 et 12\/03\/2025)\",\r\n\"inventaire\": \"3 ateliers d'orientation dans 2 lyc\u00e9es\",\r\n\"invPartenaires\": \"NR\",\r\n\"nbPartenaires\": \"NR (partenaires lyc\u00e9ens non d\u00e9taill\u00e9s au-del\u00e0 des \u00e9tablissements)\",\r\n\"competences\": \"61 jeunes inscrits pour un suivi imm\u00e9diat post-atelier\",\r\n\"lienSocial\": \"79% jugent l'atelier utile pour leur orientation, 56% \u00e0 l'aise avec Parcoursup suite \u00e0 l'atelier\",\r\n\"comportement\": \"79% expriment ambition et confiance renforc\u00e9es (d\u00e9claratif)\",\r\n\"sorties\": \"40% savent pr\u00e9cis\u00e9ment o\u00f9 ils vont, 60% repartent avec des pistes concr\u00e8tes, 95% souhaitent un suivi\",\r\n\"indicateurs\": \"360 touch\u00e9s \/ 63 accompagn\u00e9s \/ 79% satisfaction \/ 61 inscriptions suivi\",\r\n\"freins\": \"NR\",\r\n\"ameliorer\": \"Atelier jug\u00e9 utile pour l'orientation. Ambition et confiance renforc\u00e9es\",\r\n\"emanciper\": \"Meilleure aisance avec Parcoursup. Clarification du projet d'orientation et pistes concr\u00e8tes acquises\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"ENFANCE\/JEUNESSE\",\r\n\"porteur\": \"CitizenCorps\",\r\n\"projet\": \"Le Grand Bain (jumelage de classes)\",\r\n\"resume\": \"Projet \u00e9ducatif visant \u00e0 favoriser la rencontre entre enfants de quartiers diff\u00e9rents et \u00e0 d\u00e9velopper l'ouverture aux autres, \u00e0 destination d'\u00e9l\u00e8ves d'\u00e9coles marseillaises.\",\r\n\"territoire\": \"QPV Marseille, 34 classes\",\r\n\"fis\": \"30\u202f000,00 \u20ac\",\r\n\"budget\": \"\",\r\n\"partFis\": \"8,1%\",\r\n\"personnes\": \"854 enfants participants (34 classes, 37 enseignants)\",\r\n\"actions\": \"1 Festival du Grand Bain le 24\/05 (1500 participants) \/ 2538 courriers \u00e9chang\u00e9s \/ 85 rencontres dans la ville\",\r\n\"inventaire\": \"85 rencontres entre classes jumel\u00e9es ; 2 538 lettres \u00e9chang\u00e9es entre \u00e9l\u00e8ves ; 1 festival de cl\u00f4ture, avec 1 500 participants\",\r\n\"invPartenaires\": \"8 associations ; 16 partenaires institutionnels et financiers\",\r\n\"nbPartenaires\": \"8 associations partenaires \/ 16 partenaires institutionnels et financiers\",\r\n\"competences\": \"1 embauche en CDI\",\r\n\"lienSocial\": \"Jumelage de classes aux r\u00e9alit\u00e9s socio-\u00e9conomiques diff\u00e9rentes, mixit\u00e9 sociale d\u00e8s le primaire\",\r\n\"comportement\": \"NR (pas de mesure formelle du changement de comportement dans le bilan transmis)\",\r\n\"sorties\": \"NR\",\r\n\"indicateurs\": \"854 enfants \/ 1500 festival \/ 2538 courriers \/ 85 rencontres \/ 8 assos partenaires\",\r\n\"freins\": \"NR (bilan financier transmis sous forme d'image, montants non exploitables en l'\u00e9tat)\",\r\n\"ameliorer\": \"Mixit\u00e9 sociale instaur\u00e9e d\u00e8s le primaire via le jumelage de classes de r\u00e9alit\u00e9s socio-\u00e9conomiques diff\u00e9rentes.\",\r\n\"emanciper\": \"\",\r\n\"reveler\": \"\"\r\n},\r\n{\r\n\"theme\": \"ENFANCE\/JEUNESSE\",\r\n\"porteur\": \"Ligue Sud FF Voile\",\r\n\"projet\": \"Nautique inclusive 2024\",\r\n\"resume\": \"Projet sportif et d'orientation visant \u00e0 faire d\u00e9couvrir la pratique nautique et les m\u00e9tiers de la mer, \u00e0 destination des jeunes de 16 \u00e0 25 ans du territoire.\",\r\n\"territoire\": \"PACA 4 d\u00e9pts\",\r\n\"fis\": \"60\u202f000,00 \u20ac\",\r\n\"budget\": \"203\u202f700,00 \u20ac\",\r\n\"partFis\": \"29,5%\",\r\n\"personnes\": \"812\",\r\n\"actions\": \"20j entra\u00een.+15 comp\u00e9t.nat.+4 Wing\",\r\n\"inventaire\": \"20 jours d'entra\u00eenement ; 15 comp\u00e9titions nationales ; 4 sessions de wingfoil\",\r\n\"invPartenaires\": \"18 lyc\u00e9es ; 10+ partenaires, dont la F\u00e9d\u00e9ration fran\u00e7aise de voile\",\r\n\"nbPartenaires\": \"10+ (FFVoile, DDCS, CR SUD, 18 lyc\u00e9es)\",\r\n\"competences\": \"Secteur formation : 108 livrets CQPIV ouverts. 21 formateurs r\u00e9gionaux CQP. 15 formateurs nationaux. 10 \u00e9valuation technique niv.4\/5. 15 entra\u00eeneurs form\u00e9s (Entraineur Club \/ FFVoile). 15 BPJEPS croisi\u00e8re. 28 BPJEPS multi-support. 6 formations jeunes arbitres.\",\r\n\"lienSocial\": \"RA p.2 : accueil de 700 jeunes QPV (Olympiades Nautiques) \u2014 lien social par la pratique sportive. Colloque r\u00e9gional handivoile (premier) \u00e0 Saint-Rapha\u00ebl. Challenge tout public voilier collectif \u00e0 Marseille. Formulation d\u00e9clarative.\",\r\n\"comportement\": \"RA p.3 : \u00ab Pour la troisi\u00e8me ann\u00e9e cons\u00e9cutive, les r\u00e9sultats ont \u00e9t\u00e9 historiques avec un nombre record de titres et de podiums pour la Ligue Sud : 50 podiums aux championnats de France \u00bb. Changement de comportement pratiquant non mesur\u00e9. Sensibilisation environnement (label \u00c9co R\u00e9gatier, Vigie Voile) : d\u00e9claratif.\",\r\n\"sorties\": \"230 coureurs accompagn\u00e9s sur \u00e9preuves nationales et internationales. 50 podiums championnats de France (r\u00e9sultat sportif objectivable). 31 004 passeports voile r\u00e9gionalis\u00e9s vendus (acc\u00e8s \u00e0 la pratique). CQP Moniteur de Voile : 10 athl\u00e8tes reconvertis.\",\r\n\"indicateurs\": \"50 podiums CdF \/ 31 004 PVR \/ 700 QPV \/ 108 livrets\",\r\n\"freins\": \"Freins institutionnels et partenariaux : aucun frein partenariat signal\u00e9 explicitement. Structure mature, nombreux partenaires institutionnels stables.\\nFreins humains (\u00e9quipes et publics) : acc\u00e8s difficile pour publics QPV et handi  structurellement li\u00e9 \u00e0 l'activit\u00e9 nautique (g\u00e9ographie littorale, co\u00fbt mat\u00e9riel). Mentionn\u00e9 implicitement via les actions d\u00e9di\u00e9es.\",\r\n\"ameliorer\": \"Ouverture des Olympiades Nautiques aux jeunes de QPV\",\r\n\"emanciper\": \"Mont\u00e9e en comp\u00e9tences certifiante dans les m\u00e9tiers de la voile (formation, encadrement). Reconversion professionnelle d'athl\u00e8tes vers le monitorat\",\r\n\"reveler\": \"50 podiums aux championnats de France (3e ann\u00e9e cons\u00e9cutive de r\u00e9sultats historiques), premier colloque r\u00e9gional handivoile \u00e0 Saint-Rapha\u00ebl rayonnement sportif et territorial.\"\r\n},\r\n{\r\n\"theme\": \"ENFANCE\/JEUNESSE\",\r\n\"porteur\": \"Interface\",\r\n\"projet\": \"eNNOV Sport Clubs Engag\u00e9s\",\r\n\"resume\": \"Projet d'accompagnement des clubs sportifs visant \u00e0 renforcer leur r\u00f4le social et inclusif, \u00e0 destination des clubs et de leurs adh\u00e9rents dans les quartiers prioritaires de Marseille.\",\r\n\"territoire\": \"QPV Marseille\",\r\n\"fis\": \"12\u202f000,00 \u20ac\",\r\n\"budget\": \"52\u202f227,00 \u20ac\",\r\n\"partFis\": \"23,0%\",\r\n\"personnes\": \"205\",\r\n\"actions\": \"3 rencontres clubs+1 collectif pr\u00e9vu\",\r\n\"inventaire\": \"3 rencontres avec les 2 clubs accompagn\u00e9s ; 1 temps collectif entre clubs, pr\u00e9vu\",\r\n\"invPartenaires\": \"2 clubs de quartier prioritaire ; 1 intervenant\",\r\n\"nbPartenaires\": \"2 clubs QPV+1 intervenant\",\r\n\"competences\": \"Feuilles de route individualis\u00e9es construites pour les 2 clubs. Accompagnement structurant sur insertion professionnelle des jeunes licenci\u00e9s (Blues Stars). Section handisport (Marseille Provence Handball). Formation\/mont\u00e9e en comp\u00e9tences non formalis\u00e9e dans le CERFA.\",\r\n\"lienSocial\": \"CERFA fiche 1 : \u00ab Enclencher une dynamique de transformation autour de la structuration, de l'insertion et de l'engagement soci\u00e9tal. \u00bb Temps collectif f\u00e9d\u00e9rateur pr\u00e9vu avec Ara Katchadourian pour \u00ab renforcer la coh\u00e9sion entre clubs et valoriser l'impact social du sport. \u00bb\",\r\n\"comportement\": \"CERFA fiche 1 : \u00ab Les objectifs ont \u00e9t\u00e9 partiellement atteints. La premi\u00e8re phase du projet a permis de tester la m\u00e9thodologie, de valider les besoins identifi\u00e9s aupr\u00e8s des clubs, et d'enclencher une dynamique de transformation autour de la structuration, de l'insertion et de l'engagement soci\u00e9tal. \u00bb Changement d\u00e9claratif, non mesur\u00e9.\",\r\n\"sorties\": \"CERFA fiche 1 : Feuille de route ax\u00e9e sur l'insertion professionnelle des jeunes licenci\u00e9s (Blues Stars). Section handisport (Marseille Provence Handball). Sorties positives non encore r\u00e9alis\u00e9es (projet en cours fin 2025).\",\r\n\"indicateurs\": \"2 clubs QPV accompagn\u00e9s. ~200 licenci\u00e9s indirectement touch\u00e9s. 5 dirigeants\/salari\u00e9s directement b\u00e9n\u00e9ficiaires. Objectifs d\u00e9clar\u00e9s partiellement atteints. D\u00e9pendance au FIS : 62,5% du budget.\",\r\n\"freins\": \"Freins financiers : d\u00e9pendance au FIS \u00e9lev\u00e9e (62,5% du budget). Autofinancement limit\u00e9 (37,5%, soit ~7 180\u20ac via cotisations\/autres produits gestion courante). Structure couveuse = instabilit\u00e9 structurelle possible.\\nFreins humains (\u00e9quipes et publics) : public cible encore partiel  les clubs touch\u00e9s en phase 1 sont les dirigeants et salari\u00e9s (~5 personnes directement). Les 200 licenci\u00e9s sont indirects. Mont\u00e9e en charge pr\u00e9vue mais non r\u00e9alis\u00e9e.\",\r\n\"ameliorer\": \"\",\r\n\"emanciper\": \"Feuilles de route individualis\u00e9es pour 2 clubs, accompagnement structurant sur l'insertion professionnelle des jeunes licenci\u00e9s (Blues Stars), section handisport (Marseille Provence Handball)\",\r\n\"reveler\": \"Dynamique de transformation autour de la structuration, de l'insertion et de l'engagement soci\u00e9tal. Renforcer la coh\u00e9sion entre clubs et valoriser l'impact social du sport.\"\r\n}\r\n];\r\n\r\n    \/\/ Colonnes rep\u00e9r\u00e9es par NOM d'en-t\u00eate (et non par position) : la feuille\r\n    \/\/ peut \u00e9voluer \u2014 ajout de \u00ab Sous-th\u00e9matique \u00bb, ordre co\u00fbt\/FIS invers\u00e9\u2026 \u2014\r\n    \/\/ sans casser la lecture. On normalise l'en-t\u00eate (sans accents ni casse)\r\n    \/\/ puis on associe chaque cl\u00e9 interne \u00e0 la premi\u00e8re colonne qui correspond.\r\n    function normHead(s){\r\n        return String(s == null ? \"\" : s).normalize(\"NFD\")\r\n            .replace(\/[\u0300-\u036f]\/g, \"\").toLowerCase()\r\n            .replace(\/\\s+\/g, \" \").trim();\r\n    }\r\n    var COL_MATCHERS = [\r\n        [\"theme\",         function(h){ return h.indexOf(\"them\") === 0; }],\r\n        [\"sousTheme\",     function(h){ return h.indexOf(\"sous\") === 0 && h.indexOf(\"themat\") > -1; }],\r\n        [\"porteur\",       function(h){ return h === \"porteur\"; }],\r\n        [\"projet\",        function(h){ return h.indexOf(\"intitul\") > -1; }],\r\n        [\"resume\",        function(h){ return h.indexOf(\"resume\") > -1; }],\r\n        [\"territoire\",    function(h){ return h.indexOf(\"territoire\") > -1; }],\r\n        [\"budget\",        function(h){ return h.indexOf(\"cout du projet\") > -1 || h.indexOf(\"budget\") > -1; }],\r\n        [\"fis\",           function(h){ return h.indexOf(\"part de financement par le fis\") > -1 || h.indexOf(\"fis (euros)\") > -1; }],\r\n        [\"partFis\",       function(h){ return h.indexOf(\"part fis\") > -1 || h.indexOf(\"%\") > -1; }],\r\n        [\"personnes\",     function(h){ return h.indexOf(\"personnes\") > -1; }],\r\n        \/\/ L'inventaire des actions, r\u00e9\u00e9crit pour la fiche (colonne \u00ab Inventaire\r\n        \/\/ des actions \u00bb). Il passe avant \u00ab actions \u00bb, dont le motif attraperait\r\n        \/\/ aussi son en-t\u00eate.\r\n        [\"invPartenaires\", function(h){ return h.indexOf(\"inventaire des partenaires\") > -1; }],\r\n        [\"inventaire\",    function(h){ return h.indexOf(\"inventaire\") > -1; }],\r\n        [\"actions\",       function(h){ return h.indexOf(\"actions\") > -1 || h.indexOf(\"evenements\") > -1; }],\r\n        [\"nbPartenaires\", function(h){ return h.indexOf(\"partenaires\") > -1; }],\r\n        [\"competences\",   function(h){ return h.indexOf(\"competences\") > -1; }],\r\n        [\"lienSocial\",    function(h){ return h.indexOf(\"lien social\") > -1; }],\r\n        [\"comportement\",  function(h){ return h.indexOf(\"comportement\") > -1; }],\r\n        [\"sorties\",       function(h){ return h.indexOf(\"sorties\") > -1; }],\r\n        [\"freins\",        function(h){ return h.indexOf(\"freins\") > -1; }],\r\n        \/\/ Les trois promesses du fonds, reprises de la roue AER. Elles sont\r\n        \/\/ en fin de liste pour ne voler aucune colonne aux rubriques\r\n        \/\/ ci-dessus, et restent vides si la feuille ne les porte pas : la\r\n        \/\/ fiche affiche alors \u00ab non document\u00e9e \u00bb, comme pour le reste.\r\n        [\"ameliorer\",     function(h){ return h.indexOf(\"ameliorer\") > -1; }],\r\n        [\"emanciper\",     function(h){ return h.indexOf(\"emanciper\") > -1; }],\r\n        [\"reveler\",       function(h){ return h.indexOf(\"reveler\") > -1; }]\r\n    ];\r\n\r\n    \/\/ La carte territoriale vit maintenant dans cette page, sous l'onglet\r\n    \/\/ \u00ab Carte \u00bb. Elle a besoin du m\u00eame corpus : on le lui pr\u00eate ici plut\u00f4t\r\n    \/\/ que de l'embarquer deux fois (un quart de m\u00e9gaoctet en double, et deux\r\n    \/\/ jeux de donn\u00e9es \u00e0 tenir \u00e0 jour au lieu d'un).\r\n    window.__fisEmbedded = EMBEDDED;\r\n\r\n    \/\/ Parseur CSV minimal mais correct : g\u00e8re les guillemets, les guillemets\r\n    \/\/ doubl\u00e9s et les retours \u00e0 la ligne \u00e0 l'int\u00e9rieur d'un champ.\r\n    function parseCSV(text){\r\n        var rows = [], row = [], cur = \"\", q = false, i, ch;\r\n        for (i = 0; i < text.length; i++){\r\n            ch = text[i];\r\n            if (q){\r\n                if (ch === '\"'){ if (text[i + 1] === '\"'){ cur += '\"'; i++; } else q = false; }\r\n                else cur += ch;\r\n            } else if (ch === '\"'){ q = true; }\r\n            else if (ch === ','){ row.push(cur); cur = \"\"; }\r\n            else if (ch === '\\n'){ row.push(cur); rows.push(row); row = []; cur = \"\"; }\r\n            else if (ch !== '\\r'){ cur += ch; }\r\n        }\r\n        if (cur !== \"\" || row.length){ row.push(cur); rows.push(row); }\r\n        return rows;\r\n    }\r\n\r\n    \/\/ Normalisation NFC : la Google Sheet renvoie les accents pr\u00e9compos\u00e9s\r\n    \/\/ (\u00e9 = U+00E9) ; on aligne tout dessus pour que les comparaisons de\r\n    \/\/ th\u00e9matiques ne d\u00e9pendent pas de la forme Unicode de la source.\r\n    function nfc(s){ return s == null ? \"\" : String(s).normalize(\"NFC\"); }\r\n\r\n    function rowsToProjets(rows){\r\n        \/\/ Rep\u00e8re la ligne d'en-t\u00eate : celle qui contient une cellule \u00ab Porteur \u00bb\r\n        \/\/ (quelle que soit sa position \u2014 une colonne a pu \u00eatre ins\u00e9r\u00e9e avant).\r\n        var hRow = -1, i, j;\r\n        for (i = 0; i < rows.length && hRow < 0; i++){\r\n            for (j = 0; j < rows[i].length; j++){\r\n                if (normHead(rows[i][j]) === \"porteur\"){ hRow = i; break; }\r\n            }\r\n        }\r\n        if (hRow < 0) return null;\r\n        var heads = rows[hRow];\r\n        \/\/ Chaque cl\u00e9 interne -> index de colonne (premi\u00e8re qui correspond, sans\r\n        \/\/ r\u00e9utiliser une colonne d\u00e9j\u00e0 affect\u00e9e).\r\n        var idx = {}, used = {};\r\n        COL_MATCHERS.forEach(function(m){\r\n            for (var c = 0; c < heads.length; c++){\r\n                if (used[c]) continue;\r\n                if (m[1](normHead(heads[c]))){ idx[m[0]] = c; used[c] = true; return; }\r\n            }\r\n        });\r\n        if (idx.theme == null || idx.porteur == null) return null;\r\n        var out = [];\r\n        for (i = hRow + 1; i < rows.length; i++){\r\n            var row = rows[i];\r\n            var g = function(key){\r\n                var c = idx[key];\r\n                return c == null ? \"\" : nfc(row[c] == null ? \"\" : String(row[c])).replace(\/\\t\/g, \" \").trim();\r\n            };\r\n            if (!(g(\"theme\") || g(\"porteur\") || g(\"projet\"))) continue;\r\n            var d = {};\r\n            COL_MATCHERS.forEach(function(m){ d[m[0]] = g(m[0]); });\r\n            out.push(d);\r\n        }\r\n        return out.length ? out : null;\r\n    }\r\n\r\n    \/\/ Charge la feuille (timeout 8 s) puis rend la callback avec les lignes,\r\n    \/\/ ou null en cas d'\u00e9chec \u2192 on bascule sur EMBEDDED.\r\n    function loadData(cb){\r\n        var done = false;\r\n        var finish = function(rows){ if (!done){ done = true; cb(rows); } };\r\n        var to = setTimeout(function(){ finish(null); }, 8000);\r\n        try {\r\n            fetch(SHEET_CSV_URL, { credentials: \"omit\" })\r\n                .then(function(r){ if (!r.ok) throw new Error(\"HTTP \" + r.status); return r.text(); })\r\n                .then(function(txt){ clearTimeout(to); finish(rowsToProjets(parseCSV(txt))); })\r\n                .catch(function(){ clearTimeout(to); finish(null); });\r\n        } catch (e){ clearTimeout(to); finish(null); }\r\n    }\r\n\r\n    var attempts = 0;\r\n    var started = false;\r\n    function boot(){\r\n        var c = document.querySelector('#reu-roue-wp #chart-container');\r\n        if (typeof d3 !== 'undefined' && c && c.clientWidth > 30 && c.clientHeight > 30){\r\n            if (started) return;\r\n            started = true;\r\n            loadData(function(rows){\r\n                if (rows && rows.length){\r\n                    window.__reuRoueSource = \"google-sheet\";\r\n                } else {\r\n                    rows = EMBEDDED;\r\n                    window.__reuRoueSource = \"embedded-fallback\";\r\n                }\r\n                init(rows);\r\n            });\r\n            return;\r\n        }\r\n        if (attempts++ < 180){ setTimeout(boot, 50); return; }\r\n        console.error(\"Roue impact REU : D3 non charg\u00e9 ou conteneur non mesurable.\");\r\n        var loading = document.getElementById(\"chart-loading\");\r\n        if (loading) loading.textContent = \"La visualisation n\u2019a pas pu se charger. V\u00e9rifiez votre connexion puis rechargez la page.\";\r\n        var wrapFail = document.getElementById(\"reu-roue-wp\");\r\n        if (wrapFail) wrapFail.classList.remove(\"is-booting\");\r\n    }\r\n    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);\r\n    else boot();\r\n\r\n    function init(PROJETS){\r\n\r\n        \/\/ ============ 1. DONN\u00c9ES ============\r\n        PROJETS = PROJETS || EMBEDDED;\r\n        \/\/ Aligne la forme Unicode des donn\u00e9es (embarqu\u00e9es ou Google Sheet) sur\r\n        \/\/ celle des cl\u00e9s de th\u00e9matique ci-dessous, sinon un \u00ab SANT\u00c9 \u00bb NFC ne\r\n        \/\/ s'apparierait pas \u00e0 une cl\u00e9 NFD et le projet dispara\u00eetrait.\r\n        PROJETS.forEach(function(p){\r\n            if (p.theme) p.theme = String(p.theme).normalize(\"NFC\").trim();\r\n        });\r\n\r\n        \/\/ ---- Secours des trois promesses ----\r\n        \/\/ La Google Sheet ne porte pas encore les colonnes Am\u00e9liorer,\r\n        \/\/ \u00c9manciper et R\u00e9v\u00e9ler : elles viennent du corpus AER, fig\u00e9 ici. Tant\r\n        \/\/ qu'elles manquent \u00e0 la feuille, on les reprend des donn\u00e9es\r\n        \/\/ embarqu\u00e9es, appari\u00e9es sur le couple porteur + intitul\u00e9. Le jour o\u00f9\r\n        \/\/ la feuille les servira, ses valeurs l'emporteront sans rien changer\r\n        \/\/ \u00e0 ce code, puisqu'on ne comble que ce qui est vide. L'inventaire des\r\n        \/\/ actions suit le m\u00eame chemin : r\u00e9dig\u00e9 ici en attendant sa colonne.\r\n        (function(){\r\n            var cle = function(p){\r\n                return String(p.porteur || \"\").normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\")\r\n                        .toLowerCase().replace(\/\\s+\/g, \" \").trim()\r\n                     + \"|\"\r\n                     + String(p.projet || \"\").normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\")\r\n                        .toLowerCase().replace(\/\\s+\/g, \" \").trim();\r\n            };\r\n            var fond = {};\r\n            EMBEDDED.forEach(function(p){ fond[cle(p)] = p; });\r\n            PROJETS.forEach(function(p){\r\n                var src = fond[cle(p)];\r\n                if (!src) return;\r\n                [\"ameliorer\", \"emanciper\", \"reveler\", \"inventaire\", \"invPartenaires\"].forEach(function(k){\r\n                    if (!p[k] || !String(p[k]).trim()) p[k] = src[k] || \"\";\r\n                });\r\n            });\r\n        })();\r\n\r\n        \/\/ ---- Sous-th\u00e9matiques ----\r\n        \/\/ La colonne \u00ab Sous-th\u00e9matique \u00bb peut en concat\u00e9ner plusieurs par\r\n        \/\/ projet (s\u00e9par\u00e9es par des espaces\/points variables). On les rep\u00e8re par\r\n        \/\/ correspondance avec le r\u00e9f\u00e9rentiel officiel (PDF \u00ab sous th\u00e9matiques \u00bb),\r\n        \/\/ robuste aux accents, apostrophes et ponctuation. Un projet peut donc\r\n        \/\/ relever de plusieurs sous-th\u00e9matiques (relation plusieurs-\u00e0-plusieurs).\r\n        var SOUS_THEMES = [\r\n            \"Bien-vieillir et acc\u00e8s aux droits (retraite, parcours migratoires)\",\r\n            \"M\u00e9diation de proximit\u00e9 et orientation vers les bons interlocuteurs\",\r\n            \"Aller-vers et compr\u00e9hension des usages (d\u00e9chets, habitat)\",\r\n            \"Coordination des acteurs de l'habitat et des espaces communs\",\r\n            \"Accessibilit\u00e9 culturelle (co\u00fbts, mat\u00e9riel, dispositifs)\",\r\n            \"Culture comme levier \u00e9ducatif et social (formation des acteurs)\",\r\n            \"Valorisation des talents locaux et des initiatives \u00e9mergentes\",\r\n            \"Projets o\u00f9 les habitants sont commanditaires de l'offre\",\r\n            \"Approches globales de la sant\u00e9 mentale (au-del\u00e0 du sanitaire\/psychiatrique)\",\r\n            \"D\u00e9cloisonnement des acteurs et des dispositifs de sant\u00e9\",\r\n            \"Nouvelles formes de pr\u00e9vention et d'acc\u00e8s aux soins\",\r\n            \"Acc\u00e8s \u00e0 des produits de qualit\u00e9 auparavant inaccessibles\",\r\n            \"Inscription dans le quotidien et la dur\u00e9e (offre p\u00e9renne)\",\r\n            \"Double solidarit\u00e9 : habitants \/ producteurs (juste prix)\",\r\n            \"Possibilit\u00e9 de choix pour les b\u00e9n\u00e9ficiaires (offre choisie)\",\r\n            \"Accompagnement \u00e0 l'orientation \u00e0 court et moyen terme\",\r\n            \"Aide \u00e0 la projection \u00e0 long terme (m\u00e9tiers, parcours)\",\r\n            \"Soutien \u00e0 la pers\u00e9v\u00e9rance et aux parcours scolaires\",\r\n            \"Sport comme levier d'insertion (m\u00e9tiers, formations, forums)\",\r\n            \"Transformation des clubs (handisport, insertion, engagement)\",\r\n            \"Sport comme \u00e9cosyst\u00e8me territorial et d'innovation sociale\",\r\n            \"Espaces physiques de participation dans les quartiers\",\r\n            \"Accueil inconditionnel des publics\",\r\n            \"Facilitation de l'engagement citoyen\",\r\n            \"Passage du statut de b\u00e9n\u00e9ficiaire \u00e0 celui de participant\",\r\n            \"Sensibilisation du monde \u00e9conomique et entrepreneurial\",\r\n            \"Aide \u00e0 la prise de recul sur sa situation et son environnement\",\r\n            \"Espaces de r\u00e9flexion et de construction politique\",\r\n            \"Sensibilisation des commer\u00e7ants \/ employeurs \u00e0 l'inclusion\",\r\n            \"Inconditionnalit\u00e9 de l'accueil des profils et des situations\",\r\n            \"Restauration de la confiance et ouverture des droits\",\r\n            \"Continuit\u00e9 de l'accompagnement (actions cibl\u00e9s et solution post action)\",\r\n            \"Aide aux d\u00e9marches administratives d\u00e9mat\u00e9rialis\u00e9es\",\r\n            \"Mise \u00e0 disposition et vulgarisation d'outils num\u00e9riques et des risques associ\u00e9s\",\r\n            \"Num\u00e9rique responsable (reconditionnement, impacts \u00e9cologiques)\",\r\n            \"R\u00e9seaux de m\u00e9diation num\u00e9rique et d\u00e9cloisonnement des acteurs\"\r\n        ];\r\n        \/\/ Raccourcis d'affichage. Les libell\u00e9s du r\u00e9f\u00e9rentiel sont des phrases\r\n        \/\/ (\u00ab Mise \u00e0 disposition et vulgarisation d'outils num\u00e9riques et des\r\n        \/\/ risques associ\u00e9s \u00bb) ; pos\u00e9s radialement dans un anneau, ils \u00e9taient\r\n        \/\/ tronqu\u00e9s au milieu d'un mot. Chaque raccourci est r\u00e9dig\u00e9 \u00e0 la main\r\n        \/\/ pour rester juste et reconnaissable, l'intitul\u00e9 complet restant dans\r\n        \/\/ l'infobulle et dans la fiche. Deux entr\u00e9es voisines ne doivent jamais\r\n        \/\/ produire le m\u00eame raccourci : \u00ab Accueil inconditionnel des publics \u00bb\r\n        \/\/ et \u00ab Inconditionnalit\u00e9 de l'accueil \u00bb se ressemblent, on les\r\n        \/\/ distingue explicitement.\r\n        var SOUS_COURT = {\r\n            \"Bien-vieillir et acc\u00e8s aux droits (retraite, parcours migratoires)\": \"Bien-vieillir et droits\",\r\n            \"M\u00e9diation de proximit\u00e9 et orientation vers les bons interlocuteurs\": \"M\u00e9diation de proximit\u00e9\",\r\n            \"Aller-vers et compr\u00e9hension des usages (d\u00e9chets, habitat)\": \"Aller-vers et usages\",\r\n            \"Coordination des acteurs de l'habitat et des espaces communs\": \"Acteurs de l'habitat\",\r\n            \"Accessibilit\u00e9 culturelle (co\u00fbts, mat\u00e9riel, dispositifs)\": \"Accessibilit\u00e9 culturelle\",\r\n            \"Culture comme levier \u00e9ducatif et social (formation des acteurs)\": \"Culture, levier \u00e9ducatif\",\r\n            \"Valorisation des talents locaux et des initiatives \u00e9mergentes\": \"Talents locaux\",\r\n            \"Projets o\u00f9 les habitants sont commanditaires de l'offre\": \"Habitants commanditaires\",\r\n            \"Approches globales de la sant\u00e9 mentale (au-del\u00e0 du sanitaire\/psychiatrique)\": \"Sant\u00e9 mentale globale\",\r\n            \"D\u00e9cloisonnement des acteurs et des dispositifs de sant\u00e9\": \"D\u00e9cloisonnement sant\u00e9\",\r\n            \"Nouvelles formes de pr\u00e9vention et d'acc\u00e8s aux soins\": \"Pr\u00e9vention et acc\u00e8s aux soins\",\r\n            \"Acc\u00e8s \u00e0 des produits de qualit\u00e9 auparavant inaccessibles\": \"Produits de qualit\u00e9\",\r\n            \"Inscription dans le quotidien et la dur\u00e9e (offre p\u00e9renne)\": \"Offre p\u00e9renne\",\r\n            \"Double solidarit\u00e9 : habitants \/ producteurs (juste prix)\": \"Double solidarit\u00e9\",\r\n            \"Possibilit\u00e9 de choix pour les b\u00e9n\u00e9ficiaires (offre choisie)\": \"Offre choisie\",\r\n            \"Accompagnement \u00e0 l'orientation \u00e0 court et moyen terme\": \"Orientation \u00e0 court terme\",\r\n            \"Aide \u00e0 la projection \u00e0 long terme (m\u00e9tiers, parcours)\": \"Projection \u00e0 long terme\",\r\n            \"Soutien \u00e0 la pers\u00e9v\u00e9rance et aux parcours scolaires\": \"Pers\u00e9v\u00e9rance scolaire\",\r\n            \"Sport comme levier d'insertion (m\u00e9tiers, formations, forums)\": \"Sport et insertion\",\r\n            \"Transformation des clubs (handisport, insertion, engagement)\": \"Transformation des clubs\",\r\n            \"Sport comme \u00e9cosyst\u00e8me territorial et d'innovation sociale\": \"Sport, \u00e9cosyst\u00e8me local\",\r\n            \"Espaces physiques de participation dans les quartiers\": \"Espaces de participation\",\r\n            \"Accueil inconditionnel des publics\": \"Accueil des publics\",\r\n            \"Facilitation de l'engagement citoyen\": \"Engagement citoyen\",\r\n            \"Passage du statut de b\u00e9n\u00e9ficiaire \u00e0 celui de participant\": \"De b\u00e9n\u00e9ficiaire \u00e0 acteur\",\r\n            \"Sensibilisation du monde \u00e9conomique et entrepreneurial\": \"Sensibilisation \u00e9conomique\",\r\n            \"Aide \u00e0 la prise de recul sur sa situation et son environnement\": \"Prise de recul\",\r\n            \"Espaces de r\u00e9flexion et de construction politique\": \"R\u00e9flexion politique\",\r\n            \"Sensibilisation des commer\u00e7ants \/ employeurs \u00e0 l'inclusion\": \"Commer\u00e7ants et employeurs\",\r\n            \"Inconditionnalit\u00e9 de l'accueil des profils et des situations\": \"Inconditionnalit\u00e9 de l'accueil\",\r\n            \"Restauration de la confiance et ouverture des droits\": \"Confiance et droits\",\r\n            \"Continuit\u00e9 de l'accompagnement (actions cibl\u00e9s et solution post action)\": \"Continuit\u00e9 du suivi\",\r\n            \"Aide aux d\u00e9marches administratives d\u00e9mat\u00e9rialis\u00e9es\": \"D\u00e9marches en ligne\",\r\n            \"Mise \u00e0 disposition et vulgarisation d'outils num\u00e9riques et des risques associ\u00e9s\": \"Outils num\u00e9riques\",\r\n            \"Num\u00e9rique responsable (reconditionnement, impacts \u00e9cologiques)\": \"Num\u00e9rique responsable\",\r\n            \"R\u00e9seaux de m\u00e9diation num\u00e9rique et d\u00e9cloisonnement des acteurs\": \"M\u00e9diation num\u00e9rique\"\r\n        };\r\n        \/\/ Nom court d'un noeud : sous-th\u00e9matique abr\u00e9g\u00e9e, sinon le nom tel quel.\r\n        function labelText(node){\r\n            var n = node.data ? node.data.name : String(node);\r\n            return SOUS_COURT[n] || n;\r\n        }\r\n\r\n        function normSub(s){\r\n            return String(s == null ? \"\" : s).normalize(\"NFD\")\r\n                .replace(\/[\u0300-\u036f]\/g, \"\").toLowerCase()\r\n                .replace(\/[^a-z0-9]+\/g, \" \").trim();\r\n        }\r\n        \/\/ Rattachement HARDCOD\u00c9 porteur -> sous-th\u00e9matiques (g\u00e9n\u00e9r\u00e9 depuis la\r\n        \/\/ feuille). D\u00e9terministe et prioritaire : le placement des assos dans la\r\n        \/\/ roue ne d\u00e9pend plus du parsing de la cellule c\u00f4t\u00e9 navigateur. La\r\n        \/\/ correspondance floue (normSub) reste en secours pour tout porteur\r\n        \/\/ absent de cette table (nouvelle asso ajout\u00e9e \u00e0 la feuille).\r\n        var PORTEUR_SOUS_THEMES = {\r\n            \"In Medias Res\": [\"Accessibilit\u00e9 culturelle (co\u00fbts, mat\u00e9riel, dispositifs)\", \"Valorisation des talents locaux et des initiatives \u00e9mergentes\"],\r\n            \"Les Petits D\u00e9brouillards\": [\"Accessibilit\u00e9 culturelle (co\u00fbts, mat\u00e9riel, dispositifs)\", \"Culture comme levier \u00e9ducatif et social (formation des acteurs)\"],\r\n            \"PAIS\": [\"Continuit\u00e9 de l'accompagnement (actions cibl\u00e9s et solution post action)\"],\r\n            \"Apprentis d Auteuil\": [\"Sensibilisation des commer\u00e7ants \/ employeurs \u00e0 l'inclusion\", \"Continuit\u00e9 de l'accompagnement (actions cibl\u00e9s et solution post action)\"],\r\n            \"La Cloche\": [\"Sensibilisation des commer\u00e7ants \/ employeurs \u00e0 l'inclusion\", \"Restauration de la confiance et ouverture des droits\", \"Continuit\u00e9 de l'accompagnement (actions cibl\u00e9s et solution post action)\"],\r\n            \"Les Chemins du Faire\": [\"Sensibilisation des commer\u00e7ants \/ employeurs \u00e0 l'inclusion\", \"Restauration de la confiance et ouverture des droits\"],\r\n            \"LES JARDINS DE L'ESPERANCE\": [\"Restauration de la confiance et ouverture des droits\", \"Continuit\u00e9 de l'accompagnement (actions cibl\u00e9s et solution post action)\"],\r\n            \"La Caravelle\": [\"Inconditionnalit\u00e9 de l'accueil des profils et des situations\", \"Continuit\u00e9 de l'accompagnement (actions cibl\u00e9s et solution post action)\"],\r\n            \"AMS Environnement\": [\"Sensibilisation des commer\u00e7ants \/ employeurs \u00e0 l'inclusion\", \"Restauration de la confiance et ouverture des droits\", \"Continuit\u00e9 de l'accompagnement (actions cibl\u00e9s et solution post action)\"],\r\n            \"Les Muses Urbaines\": [\"Espaces physiques de participation dans les quartiers\", \"Facilitation de l'engagement citoyen\", \"Passage du statut de b\u00e9n\u00e9ficiaire \u00e0 celui de participant\"],\r\n            \"CEPEP\": [\"Espaces physiques de participation dans les quartiers\", \"Accueil inconditionnel des publics\", \"Facilitation de l'engagement citoyen\"],\r\n            \"Ligue Ens. 13\": [\"Facilitation de l'engagement citoyen\", \"Passage du statut de b\u00e9n\u00e9ficiaire \u00e0 celui de participant\"],\r\n            \"EnVies EnJeux 13\": [\"Facilitation de l'engagement citoyen\", \"Passage du statut de b\u00e9n\u00e9ficiaire \u00e0 celui de participant\"],\r\n            \"Ellipsis Effect\": [\"Espaces physiques de participation dans les quartiers\", \"Accueil inconditionnel des publics\", \"Facilitation de l'engagement citoyen\"],\r\n            \"Le Mouvement Associatif R\u00e9gion Sud Provence-Alpes-C\u00f4te d\u2019Azur\": [\"Espaces physiques de participation dans les quartiers\", \"Facilitation de l'engagement citoyen\"],\r\n            \"Les D\u00e9termin\u00e9s\": [\"Facilitation de l'engagement citoyen\", \"Passage du statut de b\u00e9n\u00e9ficiaire \u00e0 celui de participant\"],\r\n            \"Salon Action Sant\u00e9\": [\"D\u00e9cloisonnement des acteurs et des dispositifs de sant\u00e9\", \"Nouvelles formes de pr\u00e9vention et d'acc\u00e8s aux soins\"],\r\n            \"Coeur de Cagoles\": [\"Approches globales de la sant\u00e9 mentale (au-del\u00e0 du sanitaire\/psychiatrique)\", \"Nouvelles formes de pr\u00e9vention et d'acc\u00e8s aux soins\"],\r\n            \"INCITTA\": [\"Approches globales de la sant\u00e9 mentale (au-del\u00e0 du sanitaire\/psychiatrique)\", \"D\u00e9cloisonnement des acteurs et des dispositifs de sant\u00e9\"],\r\n            \"Lieux Publics\": [\"Acc\u00e8s \u00e0 des produits de qualit\u00e9 auparavant inaccessibles\", \"Double solidarit\u00e9 : habitants \/ producteurs (juste prix)\"],\r\n            \"Les Petites Cantines Marseille\": [\"Inscription dans le quotidien et la dur\u00e9e (offre p\u00e9renne)\"],\r\n            \"La Part Du Peuple\/ l'Apr\u00e8s M\": [\"Acc\u00e8s \u00e0 des produits de qualit\u00e9 auparavant inaccessibles\", \"Possibilit\u00e9 de choix pour les b\u00e9n\u00e9ficiaires (offre choisie)\"],\r\n            \"ACAM Bels. Manufacture\": [\"Aller-vers et compr\u00e9hension des usages (d\u00e9chets, habitat)\", \"Coordination des acteurs de l'habitat et des espaces communs\"],\r\n            \"Compagnons B\u00e2tisseurs Provence\": [\"M\u00e9diation de proximit\u00e9 et orientation vers les bons interlocuteurs\", \"Aller-vers et compr\u00e9hension des usages (d\u00e9chets, habitat)\"],\r\n            \"e-graine et Terravox\": [\"M\u00e9diation de proximit\u00e9 et orientation vers les bons interlocuteurs\", \"Aller-vers et compr\u00e9hension des usages (d\u00e9chets, habitat)\"],\r\n            \"AVENIR SOLIDARITE\": [\"Aide aux d\u00e9marches administratives d\u00e9mat\u00e9rialis\u00e9es\", \"R\u00e9seaux de m\u00e9diation num\u00e9rique et d\u00e9cloisonnement des acteurs\"],\r\n            \"Anonymal\": [\"Mise \u00e0 disposition et vulgarisation d'outils num\u00e9riques et des risques associ\u00e9s\"],\r\n            \"Ligue FAIL 13\": [\"Mise \u00e0 disposition et vulgarisation d'outils num\u00e9riques et des risques associ\u00e9s\", \"R\u00e9seaux de m\u00e9diation num\u00e9rique et d\u00e9cloisonnement des acteurs\"],\r\n            \"Arborescence-Icom\": [\"Mise \u00e0 disposition et vulgarisation d'outils num\u00e9riques et des risques associ\u00e9s\"],\r\n            \"Urban Prod\": [\"Mise \u00e0 disposition et vulgarisation d'outils num\u00e9riques et des risques associ\u00e9s\", \"R\u00e9seaux de m\u00e9diation num\u00e9rique et d\u00e9cloisonnement des acteurs\"],\r\n            \"CENTRE DE CULTURE OUVRIERE \u2013 Centre social Sainte-Marthe\": [\"Aide aux d\u00e9marches administratives d\u00e9mat\u00e9rialis\u00e9es\", \"Mise \u00e0 disposition et vulgarisation d'outils num\u00e9riques et des risques associ\u00e9s\"],\r\n            \"HUB DU SUD\": [\"Aide aux d\u00e9marches administratives d\u00e9mat\u00e9rialis\u00e9es\", \"R\u00e9seaux de m\u00e9diation num\u00e9rique et d\u00e9cloisonnement des acteurs\"],\r\n            \"MISSION LOCALE OUEST PROVENCE\": [\"Mise \u00e0 disposition et vulgarisation d'outils num\u00e9riques et des risques associ\u00e9s\"],\r\n            \"ACT\": [\"Aide \u00e0 la prise de recul sur sa situation et son environnement\", \"Espaces de r\u00e9flexion et de construction politique\"],\r\n            \"Association maison des familles et des associations\": [\"Sensibilisation du monde \u00e9conomique et entrepreneurial\", \"Aide \u00e0 la prise de recul sur sa situation et son environnement\", \"Espaces de r\u00e9flexion et de construction politique\"],\r\n            \"Compagnie Mbongui\": [\"Aide \u00e0 la prise de recul sur sa situation et son environnement\", \"Espaces de r\u00e9flexion et de construction politique\"],\r\n            \"ARCAF Riposte\": [\"Aide \u00e0 la prise de recul sur sa situation et son environnement\"],\r\n            \"\u00c9closion 13\": [\"Aide \u00e0 la prise de recul sur sa situation et son environnement\"],\r\n            \"Union sportive du panier de la victoire\": [\"Aide \u00e0 la prise de recul sur sa situation et son environnement\", \"Espaces de r\u00e9flexion et de construction politique\"],\r\n            \"Delta France Asso.\": [\"Accompagnement \u00e0 l'orientation \u00e0 court et moyen terme\", \"Aide \u00e0 la projection \u00e0 long terme (m\u00e9tiers, parcours)\"],\r\n            \"Le Sel de la Vie\": [\"Aide \u00e0 la projection \u00e0 long terme (m\u00e9tiers, parcours)\", \"Soutien \u00e0 la pers\u00e9v\u00e9rance et aux parcours scolaires\"],\r\n            \"FACE Sud Provence\": [\"Accompagnement \u00e0 l'orientation \u00e0 court et moyen terme\", \"Aide \u00e0 la projection \u00e0 long terme (m\u00e9tiers, parcours)\"],\r\n            \"Camplus\": [\"Accompagnement \u00e0 l'orientation \u00e0 court et moyen terme\", \"Aide \u00e0 la projection \u00e0 long terme (m\u00e9tiers, parcours)\", \"Soutien \u00e0 la pers\u00e9v\u00e9rance et aux parcours scolaires\"],\r\n            \"CitizenCorps\": [\"Soutien \u00e0 la pers\u00e9v\u00e9rance et aux parcours scolaires\"],\r\n            \"Ligue Sud FF Voile\": [\"Sport comme levier d'insertion (m\u00e9tiers, formations, forums)\", \"Sport comme \u00e9cosyst\u00e8me territorial et d'innovation sociale\"],\r\n            \"Interface\": [\"Transformation des clubs (handisport, insertion, engagement)\", \"Sport comme \u00e9cosyst\u00e8me territorial et d'innovation sociale\"]\r\n        };\r\n        function normPorteur(s){\r\n            return String(s == null ? \"\" : s).normalize(\"NFD\")\r\n                .replace(\/[\u0300-\u036f]\/g, \"\").toLowerCase().replace(\/\\s+\/g, \" \").trim();\r\n        }\r\n        var PST_INDEX = {};\r\n        Object.keys(PORTEUR_SOUS_THEMES).forEach(function(k){ PST_INDEX[normPorteur(k)] = PORTEUR_SOUS_THEMES[k]; });\r\n\r\n        var SOUS_NORM = SOUS_THEMES.map(function(l){ return { label: l, n: normSub(l) }; });\r\n        PROJETS.forEach(function(p){\r\n            var hard = PST_INDEX[normPorteur(p.porteur)];\r\n            if (hard){ p.sousThemes = hard.slice(); return; }\r\n            \/\/ Secours : correspondance floue depuis la cellule de la feuille.\r\n            var cell = normSub(p.sousTheme || \"\");\r\n            var found = [];\r\n            SOUS_NORM.forEach(function(s){\r\n                if (s.n && cell.indexOf(s.n) !== -1) found.push(s.label);\r\n            });\r\n            p.sousThemes = found;\r\n        });\r\n\r\n        \/\/ Gamme \u00ab Prisme \u00bb : une couleur stable par th\u00e9matique, et une encre\r\n        \/\/ sombre d\u00e9di\u00e9e aux petits textes. Les libell\u00e9s doublent la couleur.\r\n        \/\/ L'ORDRE DE CE TABLEAU FAIT PARTIE DE LA PALETTE : les teintes tournent\r\n        \/\/ avec l'angle de la roue et la clart\u00e9 alterne d'un secteur au suivant,\r\n        \/\/ ce qui est le m\u00e9canisme qui s\u00e9pare deux secteurs voisins (ecart mini\r\n        \/\/ mesur\u00e9 : \u0394E 16,6 en vision normale, 10,4 en deut\u00e9ranopie, OKLab \u00d7100).\r\n        \/\/ Permuter deux th\u00e9matiques peut recr\u00e9er une paire indistincte : il faut\r\n        \/\/ revalider la palette avant de figer un nouvel ordre.\r\n        var THEMES = [\r\n            \/\/ Palette r\u00e9harmonis\u00e9e : m\u00eames neuf teintes reconnaissables, mais\r\n            \/\/ saturation et luminosit\u00e9 align\u00e9es (corail, terre cuite, ocre,\r\n            \/\/ olive, vert-de-gris, bleu canard, indigo, lilas, prune). Les\r\n            \/\/ fluos d'origine ne tenaient pas ensemble sur fond cr\u00e8me et\r\n            \/\/ viraient au criard au vid\u00e9oprojecteur. Chaque teinte garde sa\r\n            \/\/ version sombre, qui sert au texte et aux anneaux int\u00e9rieurs.\r\n            { key: \"DISCRIMINATIONS\",  label: \"Discriminations\",     color: \"#c86a5e\", textColor: \"#8b3a2f\" },\r\n            { key: \"PR\u00c9C. ALIM.\",      label: \"Pr\u00e9carit\u00e9 alim.\",     color: \"#b25f35\", textColor: \"#7a3a19\" },\r\n            \/\/ L'ocre est la seule teinte assez claire pour faire d\u00e9crocher\r\n            \/\/ le garde-fou de labelInk : \u00e0 #cca33f elle ne portait pas le\r\n            \/\/ blanc, et \u00ab Sant\u00e9 \u00bb s'\u00e9crivait en encre fonc\u00e9e au milieu de huit\r\n            \/\/ libell\u00e9s blancs. Assombrie d'un cran, elle tient le blanc comme\r\n            \/\/ les autres et reste dans la gamme.\r\n            { key: \"SANT\u00c9\",            label: \"Sant\u00e9\",               color: \"#bd9035\", textColor: \"#7c601a\" },\r\n            { key: \"CADRE DE VIE\",     label: \"Cadre de vie\",        color: \"#8d9b4e\", textColor: \"#55602a\" },\r\n            { key: \"NUM\u00c9RIQUE\",        label: \"Num\u00e9rique\",           color: \"#55926f\", textColor: \"#2d6046\" },\r\n            \/\/ Sport ne porte aucun projet en 2025 : la roue l'\u00e9carte. Sa teinte\r\n            \/\/ n'est pas sur la maquette, elle compl\u00e8te la gamme si la grille\r\n            \/\/ change et qu'un secteur Sport r\u00e9appara\u00eet.\r\n            { key: \"SPORT\",            label: \"Sport\",               color: \"#6d9b93\", textColor: \"#3f665f\" },\r\n            { key: \"CULTURE\",          label: \"Culture\",             color: \"#4b8296\", textColor: \"#2a5365\" },\r\n            { key: \"PARTICIPATION\",    label: \"Participation\",       color: \"#45508a\", textColor: \"#2b3260\" },\r\n            { key: \"EMPLOI\/INSERTION\", label: \"Emploi \/ insertion\",  color: \"#8480be\", textColor: \"#524d8b\" },\r\n            { key: \"ENFANCE\/JEUNESSE\", label: \"Enfance \/ jeunesse\",  color: \"#92557c\", textColor: \"#632f52\" }\r\n        ].map(function(t){ t.key = t.key.normalize(\"NFC\"); return t; });\r\n\r\n        \/\/ ============ 2. HELPERS ============\r\n        function num(s){\r\n            if (s === null || s === undefined) return null;\r\n            s = String(s).replace(\/\u00a0\/g, \" \");\r\n            var m = s.match(\/\\d[\\d\\s ]*(?:[.,]\\d+)?\/);\r\n            if (!m) return null;\r\n            var v = parseFloat(m[0].replace(\/[\\s ]\/g, \"\").replace(\",\", \".\"));\r\n            return isNaN(v) ? null : v;\r\n        }\r\n        function isNR(s){\r\n            if (!s) return true;\r\n            var t = String(s).trim();\r\n            return t === \"\" || \/^nr\\b\/i.test(t);\r\n        }\r\n        var fmtEuro = function(v){\r\n            return v === null ? \"NR\" : new Intl.NumberFormat(\"fr-FR\").format(Math.round(v)) + \" \u20ac\";\r\n        };\r\n        var fmtNum = function(v){\r\n            return v === null ? \"NR\" : new Intl.NumberFormat(\"fr-FR\").format(Math.round(v));\r\n        };\r\n        function escapeHTML(v){\r\n            return String(v === null || v === undefined ? \"\" : v)\r\n                .replace(\/&\/g, \"&amp;\").replace(\/[<]\/g, \"&lt;\").replace(\/>\/g, \"&gt;\")\r\n                .replace(\/\"\/g, \"&quot;\").replace(\/'\/g, \"&#39;\");\r\n        }\r\n        function mix(hex, target, t){\r\n            return d3.interpolateLab(hex, target)(t);\r\n        }\r\n\r\n        PROJETS.forEach(function(p){\r\n            p.fisNum = num(p.fis);\r\n            p.budgetNum = num(p.budget);\r\n            p.personnesNum = num(p.personnes);\r\n            p.fisNR = p.fisNum === null;\r\n        });\r\n\r\n        var totalPersonnes = d3.sum(PROJETS, function(p){ return p.personnesNum || 0; });\r\n\r\n        \/\/ La part m\u00e9diane du corpus : le seul rep\u00e8re honn\u00eate \u00e0 poser sur la\r\n        \/\/ jauge d'une fiche. \u00ab 14 % \u00bb, pris isol\u00e9ment, ne dit rien ; rapport\u00e9\r\n        \/\/ \u00e0 ce que les quarante-sept autres projets ont obtenu, \u00e7a dit que le\r\n        \/\/ FIS est ici un appoint et non le financeur principal. La m\u00e9diane, et\r\n        \/\/ non la moyenne : deux ou trois projets tr\u00e8s subventionn\u00e9s ne doivent\r\n        \/\/ pas d\u00e9placer le rep\u00e8re de tous les autres.\r\n        \/\/ Les bornes de l'\u00e9chelle des personnes touch\u00e9es. Le corpus va de 10 \u00e0\r\n        \/\/ plus de 10 000 : sur une r\u00e9glette lin\u00e9aire, quarante projets sur\r\n        \/\/ quarante-deux s'\u00e9craseraient contre le bord gauche. L'\u00e9chelle est\r\n        \/\/ donc logarithmique et ses paliers sont des puissances de dix, seuls\r\n        \/\/ rep\u00e8res qu'on lit sans les calculer.\r\n        var PERS_ECHELLE = (function(){\r\n            var v = PROJETS.map(function(p){ return p.personnesNum; })\r\n                .filter(function(x){ return x !== null && x > 0; });\r\n            if (!v.length) return null;\r\n            var mn = Math.min.apply(null, v), mx = Math.max.apply(null, v);\r\n            if (mx <= mn) return null;\r\n            var paliers = [];\r\n            for (var e = Math.ceil(Math.log(mn) \/ Math.LN10); Math.pow(10, e) <= mx; e++){\r\n                paliers.push(Math.pow(10, e));\r\n            }\r\n            return { mn: mn, mx: mx, paliers: paliers };\r\n        })();\r\n        function persPosition(v){\r\n            if (!PERS_ECHELLE) return null;\r\n            var t = (Math.log(Math.max(PERS_ECHELLE.mn, Math.min(PERS_ECHELLE.mx, v))) - Math.log(PERS_ECHELLE.mn))\r\n                \/ (Math.log(PERS_ECHELLE.mx) - Math.log(PERS_ECHELLE.mn));\r\n            return Math.max(0, Math.min(1, t)) * 100;\r\n        }\r\n\r\n        var PART_MEDIANE = (function(){\r\n            var parts = PROJETS.map(function(p){\r\n                return (p.fisNum !== null && p.budgetNum > 0) ? p.fisNum \/ p.budgetNum * 100 : null;\r\n            }).filter(function(v){ return v !== null; });\r\n            return parts.length ? d3.median(parts) : null;\r\n        })();\r\n\r\n        \/\/ ============ 3. VUES ============\r\n        \/\/ Une seule roue d\u00e9sormais : chaque porteur p\u00e8se le m\u00eame poids dans la\r\n        \/\/ g\u00e9om\u00e9trie (peu importe son montant FIS, pour que tous les libell\u00e9s\r\n        \/\/ restent lisibles), la teinte dit combien des quatre dimensions\r\n        \/\/ d'impact sont renseign\u00e9es\r\n        \/\/ (l'empreinte, celle-l\u00e0 m\u00eame que dessine la fleur de chaque fiche).\r\n        \/\/ Quatre onglets de couleur, un par dimension, obligeaient \u00e0 basculer\r\n        \/\/ pour reconstituer mentalement ce que la fiche montre maintenant d'un\r\n        \/\/ coup ; il ne reste que la bascule vers les freins, qui est une autre\r\n        \/\/ vue et pas un autre coloriage.\r\n        var INDICATORS = [\r\n            { key: \"empreinte\", label: \"Roue d'impact\",      short: \"Impact du FIS\" },\r\n            \/\/ Juste apr\u00e8s la roue, on descend vers les structures : ce\r\n            \/\/ qu'elles produisent, vu d'abord par promesse (les \u00e9tages).\r\n            \/\/ La galerie de toutes les fleurs : ce que les associations\r\n            \/\/ produisent, structure par structure.\r\n            { key: \"fleurs\",    label: \"Fleurs des assos\",   short: \"Fleurs\" },\r\n            \/\/ Les trois \u00e9tages : la lecture par PROMESSE du fonds, reprise de\r\n            \/\/ la roue AER. Ce n'est plus un onglet : c'est le second mode de\r\n            \/\/ \u00ab Fleurs des assos \u00bb, qui reste allum\u00e9 (voir tabDe).\r\n            { key: \"etages\",    label: \"Les trois \u00e9tages\",   short: \"\u00c9tages\", sous: \"fleurs\" },\r\n            \/\/ La carte pose ensuite les m\u00eames projets sur le territoire :\r\n            \/\/ apr\u00e8s le \u00ab quoi \u00bb, le \u00ab o\u00f9 \u00bb.\r\n            { key: \"carte\",     label: \"Carte territoriale\", short: \"Carte\" },\r\n            \/\/ Le croisement des deux classeurs : quelle th\u00e9matique nourrit\r\n            \/\/ quelle promesse. Il reprend les trois couleurs des \u00e9tages.\r\n            { key: \"flux\",      label: \"Qui agit o\u00f9\",        short: \"Flux\" },\r\n            \/\/ Le radar des freins : ce contre quoi butent les porteurs, dans\r\n            \/\/ les quatre familles de la grille FIS.\r\n            { key: \"freins\",    label: \"Freins\",             short: \"Freins\" }\r\n\r\n        ];\r\n        var indicator = INDICATORS[0];\r\n\r\n        \/\/ Sans argument : le projet renseigne-t-il AU MOINS une dimension.\r\n        \/\/ Avec une couche de la fleur en argument : cette dimension pr\u00e9cise.\r\n        function documented(p, ind){\r\n            if (ind) return !isNR(p[ind.key]);\r\n            return p.empreinte > 0;\r\n        }\r\n\r\n        \/\/ ---- Les quatre couches de l'empreinte ----\r\n        \/\/ Chacune a sa forme ET sa couleur : la double cl\u00e9 fait qu'on reconna\u00eet\r\n        \/\/ une couche m\u00eame en vision des couleurs d\u00e9ficiente \u2014 et c'est la forme\r\n        \/\/ qui porte l'essentiel, le jaune et l'orange se rapprochant sous\r\n        \/\/ simulation protan\/deutan. Ce sont les teintes vives d'origine, celles\r\n        \/\/ de la roue AER, pour que les deux supports parlent la m\u00eame langue.\r\n        var FLORA_LAYERS = [\r\n            { key: \"competences\",  label: \"Mont\u00e9e en comp\u00e9tences\",      color: \"#C79A0B\", shape: \"ray\" },\r\n            { key: \"lienSocial\",   label: \"Lien social \/ coh\u00e9sion\",     color: \"#E23C7C\", shape: \"petal\" },\r\n            { key: \"comportement\", label: \"Changement de comportement\", color: \"#0E9E82\", shape: \"tendril\" },\r\n            { key: \"sorties\",      label: \"Sorties positives\",          color: \"#E07B24\", shape: \"seed\" }\r\n        ];\r\n\r\n        \/\/ \u00c9tat d'UNE couche pour UNE association : renseign\u00e9e ou non, rien\r\n        \/\/ d'autre. Un troisi\u00e8me \u00e9tat \u00ab succinct \u00bb a \u00e9t\u00e9 essay\u00e9 (seuil de\r\n        \/\/ longueur + d\u00e9tection des r\u00e9serves du type \u00ab non mesur\u00e9 \u00bb) : il\r\n        \/\/ reposait sur un seuil arbitraire et rangeait sous le m\u00eame mot des\r\n        \/\/ r\u00e9ponses de deux lignes et des r\u00e9ponses fournies dont le porteur\r\n        \/\/ signalait lui-m\u00eame l'absence de mesure. Ind\u00e9fendable devant un\r\n        \/\/ porteur qui lit sa fiche, donc abandonn\u00e9.\r\n        function floraState(p, L){\r\n            return isNR(p[L.key]) ? \"none\" : \"full\";\r\n        }\r\n        function floraStates(p){\r\n            var s = {};\r\n            FLORA_LAYERS.forEach(function(L){ s[L.key] = floraState(p, L); });\r\n            return s;\r\n        }\r\n        function floraScore(s){\r\n            return FLORA_LAYERS.filter(function(L){ return s[L.key] !== \"none\"; }).length;\r\n        }\r\n\r\n        \/\/ ---- Les trois promesses du fonds ----\r\n        \/\/ Elles viennent de la roue AER, dont ce fichier reprend d\u00e9sormais la\r\n        \/\/ lecture en \u00e9tages : la promesse dit CE QUE le fonds a cherch\u00e9 \u00e0\r\n        \/\/ produire, la fleur dit ce que la structure a effectivement\r\n        \/\/ document\u00e9. Les deux classeurs se lisent maintenant au m\u00eame endroit.\r\n        \/\/ `color` est la teinte pleine, `textColor` la m\u00eame assombrie pour\r\n        \/\/ rester lisible (>=4,5:1) partout o\u00f9 elle sert d'encre.\r\n        var PROMESSES = [\r\n            { key: \"ameliorer\", label: \"Am\u00e9liorer\", color: \"#E07B24\", textColor: \"#ad5b14\",\r\n              phrase: \"am\u00e9liorer la vie de celles et ceux qui n\u2019ont pas les m\u00eames chances\" },\r\n            { key: \"emanciper\", label: \"\u00c9manciper\", color: \"#0E9E82\", textColor: \"#087b65\",\r\n              phrase: \"donner \u00e0 chacune et chacun le pouvoir de choisir, d\u2019agir et de s\u2019\u00e9panouir\" },\r\n            { key: \"reveler\",   label: \"R\u00e9v\u00e9ler\",   color: \"#E23C7C\", textColor: \"#d51b63\",\r\n              phrase: \"les forces vives des territoires plut\u00f4t que les contraintes\" }\r\n        ];\r\n\r\n        \/\/ Calcul\u00e9 une fois : la roue s'en sert pour teinter, la fiche pour\r\n        \/\/ dessiner la fleur, la l\u00e9gende et les KPI pour compter. Les \u00e9tages y\r\n        \/\/ ajoutent, pour chaque structure, les promesses qu'elle raconte.\r\n        PROJETS.forEach(function(p, i){\r\n            \/\/ Un identifiant stable : les \u00e9tages posent quarante-huit cases\r\n            \/\/ par plan et doivent retrouver la structure d'une case au clic\r\n            \/\/ sans reparcourir le corpus.\r\n            p.id = i;\r\n            p.floraStates = floraStates(p);\r\n            p.empreinte = floraScore(p.floraStates);\r\n            p.docs = {};\r\n            PROMESSES.forEach(function(pr){\r\n                p.docs[pr.key] = !!(p[pr.key] && String(p[pr.key]).trim() && !isNR(p[pr.key]));\r\n            });\r\n            p.score = PROMESSES.filter(function(pr){ return p.docs[pr.key]; }).length;\r\n        });\r\n\r\n        \/\/ Taxonomie SIMPLIFI\u00c9E des freins (grille FIS 2025) : quatre familles.\r\n        \/\/ La feuille \u00e9crit d\u00e9sormais les libell\u00e9s en toutes lettres dans la\r\n        \/\/ colonne \u00ab Freins rencontr\u00e9s \u00bb (ex. \u00ab Freins humains (\u00e9quipes et\r\n        \/\/ publics) \u00bb) et non plus des codes F1a\u2026F1f. On d\u00e9tecte donc chaque\r\n        \/\/ famille par mots-cl\u00e9s. Le radar\/les barres comptent, par famille, le\r\n        \/\/ nombre de projets qui la mentionnent.\r\n        \/\/ shape : la barri\u00e8re que chaque famille dessine dans le glyphe de la\r\n        \/\/ fiche. Les rayons sont embo\u00eet\u00e9s, du plus proche du projet au plus\r\n        \/\/ lointain : blocs, chevrons, barreaux, murs.\r\n        var FREINS = [\r\n            { code: \"F1\", short: \"Financiers\",      label: \"Freins financiers\",                      rx: \/financ\/,\r\n              shape: \"bars\" },\r\n            \/\/ \u00ab RH \u00bb est le mot que certains porteurs emploient \u00e0 la place de\r\n            \/\/ \u00ab humains \u00bb : sans lui leur frein humain passait \u00e0 la trappe.\r\n            { code: \"F2\", short: \"Humains\",         label: \"Freins humains (\u00e9quipes et publics)\",    rx: \/humain|\\brh\\b|ressources humaines\/,\r\n              shape: \"chevrons\" },\r\n            { code: \"F3\", short: \"Institutionnels\", label: \"Freins institutionnels et partenariaux\", rx: \/institutionnel|partenari\/,\r\n              shape: \"walls\" },\r\n            { code: \"F4\", short: \"Logistiques\",     label: \"Freins logistiques et mat\u00e9riels\",        rx: \/logisti|materiel\/,\r\n              shape: \"blocks\" }\r\n        ];\r\n\r\n        \/\/ Quelles familles un projet documente-t-il.\r\n        \/\/ On croit d'abord les intitul\u00e9s que le porteur a lui-m\u00eame \u00e9crits\r\n        \/\/ (voir freinSegments) : le balayage par mots-cl\u00e9s sur toute la cellule\r\n        \/\/ comptait \u00ab financement rendu tardivement \u00bb, r\u00e9dig\u00e9 dans le paragraphe\r\n        \/\/ institutionnel, comme un frein financier. Six projets \u00e9taient ainsi\r\n        \/\/ cr\u00e9dit\u00e9s d'une famille qu'ils n'avaient pas d\u00e9clar\u00e9e. Le balayage\r\n        \/\/ reste le repli pour les cellules non structur\u00e9es.\r\n        function freinCodes(p, seg){\r\n            var txt = String(p.freins || \"\").normalize(\"NFD\")\r\n                .replace(\/[\u0300-\u036f]\/g, \"\").toLowerCase();\r\n            if (!txt || \/^\\s*(nr\\b|pas de frein|aucun frein|aucune)\/.test(txt)) return [];\r\n            var declares = (seg || freinSegments(p)).codes;\r\n            var out = [];\r\n            FREINS.forEach(function(f){\r\n                var corps = normHead((seg || freinSegments(p)).segs[f.code] || \"\");\r\n                var absenceExplicite = \/^(?:aucun(?:e)?\\s+(?:frein|difficulte|obstacle)|pas de\\s+(?:frein|difficulte|obstacle)|non renseigne|nr\\b)\/.test(corps);\r\n                if (!absenceExplicite && (declares.length ? declares.indexOf(f.code) !== -1 : f.rx.test(txt))) out.push(f.code);\r\n            });\r\n            return out;\r\n        }\r\n\r\n        \/\/ D\u00e9coupage du texte des freins par famille. Les porteurs r\u00e9digent la\r\n        \/\/ cellule en paragraphes pr\u00e9fix\u00e9s de l'intitul\u00e9 de la famille\r\n        \/\/ (\u00ab Freins humains (\u00e9quipes et publics) : \u2026 \u00bb), mais le s\u00e9parateur\r\n        \/\/ varie : deux-points, tiret, ou rien du tout. On rep\u00e8re donc\r\n        \/\/ l'intitul\u00e9 lui-m\u00eame et on prend tout ce qui suit jusqu'au suivant.\r\n        \/\/ 31 cellules sur 34 se d\u00e9coupent ainsi ; le reliquat part dans un\r\n        \/\/ volet \u00e0 part plut\u00f4t que d'\u00eatre attribu\u00e9 de force.\r\n        var FREIN_HEAD = \/Freins?\\s+(?:financiers?|humains?(?:\\s*\\([^)]{0,40}\\))?|institutionnels?(?:\\s+et\\s+partenariaux?)?|logistiques?(?:\\s+et\\s+mat[e\u00e9]riels?)?)\/gi;\r\n\r\n        \/\/ codes : les familles que le porteur a intitul\u00e9es, avec ou sans d\u00e9tail\r\n        \/\/         derri\u00e8re. C'est la d\u00e9claration, elle fait foi.\r\n        \/\/ segs  : le texte propre \u00e0 chaque famille, pour son volet d\u00e9pliant.\r\n        \/\/ reste : pr\u00e9ambule ou cellule non structur\u00e9e, rien n'est perdu.\r\n        function freinSegments(p){\r\n            var out = { codes: [], segs: {}, reste: \"\" };\r\n            var t = String(p.freins == null ? \"\" : p.freins).trim();\r\n            if (!t || isNR(t)) return out;\r\n            var heads = [], m;\r\n            FREIN_HEAD.lastIndex = 0;\r\n            while ((m = FREIN_HEAD.exec(t)) !== null){\r\n                heads.push({ i: m.index, len: m[0].length, tete: m[0] });\r\n                if (m.index === FREIN_HEAD.lastIndex) FREIN_HEAD.lastIndex++;\r\n            }\r\n            if (!heads.length){ out.reste = t; return out; }\r\n            out.reste = t.slice(0, heads[0].i).trim();\r\n            for (var k = 0; k < heads.length; k++){\r\n                var fin = (k + 1 < heads.length) ? heads[k + 1].i : t.length;\r\n                var corps = t.slice(heads[k].i + heads[k].len, fin)\r\n                    .replace(\/^[\\s:;.\u2013\u2014-]+\/, \"\").trim();\r\n                var tete = heads[k].tete.normalize(\"NFD\")\r\n                    .replace(\/[\u0300-\u036f]\/g, \"\").toLowerCase();\r\n                var fam = null;\r\n                FREINS.forEach(function(f){ if (!fam && f.rx.test(tete)) fam = f.code; });\r\n                if (!fam) continue;\r\n                if (out.codes.indexOf(fam) === -1) out.codes.push(fam);\r\n                \/\/ Famille cit\u00e9e sans d\u00e9tail derri\u00e8re : la ligne reste muette.\r\n                if (!corps) continue;\r\n                out.segs[fam] = (out.segs[fam] ? out.segs[fam] + \"\\n\" : \"\") + corps;\r\n            }\r\n            return out;\r\n        }\r\n\r\n        PROJETS.forEach(function(p){\r\n            p.freinSegs = freinSegments(p);\r\n            p.freinSet = freinCodes(p, p.freinSegs);\r\n        });\r\n\r\n        \/\/ ============ 4. HI\u00c9RARCHIE ============\r\n        var byTheme = d3.group(PROJETS, function(p){ return p.theme; });\r\n        \/\/ La grille \u00e9volue : une th\u00e9matique peut se retrouver sans projet\r\n        \/\/ (Sport en 2025). On l'\u00e9carte plut\u00f4t que d'afficher un arc vide \u00e0 0.\r\n        THEMES = THEMES.filter(function(t){ return (byTheme.get(t.key) || []).length > 0; });\r\n\r\n        \/\/ Roue \u00e0 3 niveaux : Th\u00e9matique \u203a Sous-th\u00e9matique \u203a Porteur de projet.\r\n        var hierarchyData = {\r\n            name: \"FIS AMP 2025\",\r\n            children: THEMES.map(function(t){\r\n                var list = byTheme.get(t.key) || [];\r\n                \/\/ Regroupe les projets par sous-th\u00e9matique. Un projet peut \u00eatre\r\n                \/\/ tagu\u00e9 sur plusieurs sous-th\u00e9matiques : il appara\u00eet alors sous\r\n                \/\/ chacune, avec le m\u00eame poids que les autres \u00e0 chaque fois.\r\n                var stOrder = [], stMap = {};\r\n                list.forEach(function(p){\r\n                    var labs = (p.sousThemes && p.sousThemes.length) ? p.sousThemes : [\"Non pr\u00e9cis\u00e9\"];\r\n                    labs.forEach(function(lab){\r\n                        if (!stMap[lab]){ stMap[lab] = []; stOrder.push(lab); }\r\n                        stMap[lab].push(p);\r\n                    });\r\n                });\r\n                return {\r\n                    name: t.label,\r\n                    themeKey: t.key,\r\n                    color: t.color,\r\n                    isTheme: true,\r\n                    projets: list,\r\n                    children: stOrder.map(function(lab){\r\n                        var sub = stMap[lab];\r\n                        \/\/ Un m\u00eame d\u00e9grad\u00e9 pour tout le monde, pas une teinte au\r\n                        \/\/ hasard par position : pastel au centre (th\u00e9matique),\r\n                        \/\/ puis un cran PLUS DENSE par anneau vers l'ext\u00e9rieur.\r\n                        \/\/ Le sens a \u00e9t\u00e9 invers\u00e9 avec le passage au pastel :\r\n                        \/\/ \u00e9claircir une teinte d\u00e9j\u00e0 tr\u00e8s claire la rendait\r\n                        \/\/ indistinguable du fond blanc. On la pousse donc vers\r\n                        \/\/ sa propre version satur\u00e9e (`textColor`), ce qui garde\r\n                        \/\/ la famille et marque la descente dans l'arbre.\r\n                        \/\/ Toutes les sous-th\u00e9matiques d'une m\u00eame th\u00e9matique\r\n                        \/\/ partagent la m\u00eame teinte, tous les porteurs aussi \u2014\r\n                        \/\/ seul le NIVEAU (anneau) fait varier l'intensit\u00e9.\r\n                        var stColor = mix(t.color, t.textColor, 0.14);\r\n                        \/\/ Une m\u00eame structure peut porter plusieurs projets dans\r\n                        \/\/ une m\u00eame sous-th\u00e9matique : on pr\u00e9cise alors le projet.\r\n                        var seen = {};\r\n                        sub.forEach(function(p){ seen[p.porteur] = (seen[p.porteur] || 0) + 1; });\r\n                        return {\r\n                            name: lab,\r\n                            isSousTheme: true,\r\n                            color: stColor,\r\n                            themeKey: t.key,\r\n                            themeColor: t.color,\r\n                            themeColorText: t.textColor,\r\n                            themeLabel: t.label,\r\n                            sousTheme: lab,\r\n                            projets: sub,\r\n                            children: sub.map(function(p){\r\n                                \/\/ Le poids de la feuille est pos\u00e9 plus bas par\r\n                                \/\/ egaliser(). Ni le budget, ni le FIS, ni le\r\n                                \/\/ nombre de projets de la branche n'y entrent.\r\n                                return {\r\n                                    name: (seen[p.porteur] > 1 && p.projet)\r\n                                        ? p.porteur + \" \u00b7 \" + p.projet\r\n                                        : (p.porteur || p.projet),\r\n                                    colorFull: mix(t.color, t.textColor, 0.28),\r\n                                    themeColor: t.color,\r\n                                    themeColorText: t.textColor,\r\n                                    themeLabel: t.label,\r\n                                    sousTheme: lab,\r\n                                    leafShare: 1,   \/\/ recalcul\u00e9 par egaliser()\r\n                                    projet: p\r\n                                };\r\n                            })\r\n                        };\r\n                    })\r\n                };\r\n            })\r\n        };\r\n\r\n        \/\/ Largeur d'arc : \u00c9GALE ENTRE VOISINS DE M\u00caME PARENT, \u00e0 chaque\r\n        \/\/ niveau. Les th\u00e9matiques qui portent des projets se partagent le tour\r\n        \/\/ en parts identiques (40\u00b0 chacune) ; les sous-th\u00e9matiques d'une m\u00eame\r\n        \/\/ th\u00e9matique se partagent sa part \u00e0 \u00e9galit\u00e9 ; les porteurs d'une m\u00eame\r\n        \/\/ sous-th\u00e9matique de m\u00eame. Aucun montant, aucun effectif n'entre dans\r\n        \/\/ le calcul.\r\n        \/\/\r\n        \/\/ POURQUOI PAS \u00ab TOUT \u00c9GAL PARTOUT \u00bb : une roue embo\u00eete ses niveaux,\r\n        \/\/ les enfants remplissent exactement leur parent. Rendre les 33\r\n        \/\/ sous-th\u00e9matiques toutes \u00e9gales imposerait \u00e0 chaque th\u00e9matique une\r\n        \/\/ largeur proportionnelle \u00e0 son nombre de sous-th\u00e9matiques, donc des\r\n        \/\/ th\u00e9matiques in\u00e9gales. Un seul anneau peut \u00eatre uniforme au sens\r\n        \/\/ absolu. Cette r\u00e9partition-ci est celle qui varie le moins partout :\r\n        \/\/ l'anneau int\u00e9rieur est parfait dans la vue d'ensemble COMME dans une\r\n        \/\/ th\u00e9matique ouverte. Ce qui reste in\u00e9gal, ce sont les porteurs d'une\r\n        \/\/ sous-th\u00e9matique \u00e0 l'autre \u2014 c'est le plancher, pas un oubli.\r\n        \/\/\r\n        \/\/ Les branches vides sont \u00e9cart\u00e9es du partage : SPORT ne porte aucun\r\n        \/\/ projet, lui r\u00e9server une part ouvrirait un secteur vide.\r\n        function aDesFeuilles(n){\r\n            if (!n.children || !n.children.length) return !!n.projet;\r\n            return n.children.some(aDesFeuilles);\r\n        }\r\n        (function egaliser(n, part){\r\n            var kids = n.children || [];\r\n            if (!kids.length){ n.leafShare = part; return; }\r\n            var vivants = kids.filter(aDesFeuilles);\r\n            var q = vivants.length ? part \/ vivants.length : 0;\r\n            kids.forEach(function(k){ egaliser(k, aDesFeuilles(k) ? q : 0); });\r\n        })(hierarchyData, 1);\r\n\r\n        \/\/ ============ 4. SETUP ============\r\n        var container = document.getElementById(\"chart-container\");\r\n        var tooltip = document.getElementById(\"tooltip\");\r\n        var detail = document.getElementById(\"detail\");\r\n\r\n        var width = container.clientWidth;\r\n        var height = container.clientHeight;\r\n\r\n        var svg = d3.select(container).append(\"svg\")\r\n            .attr(\"viewBox\", [0, 0, width, height])\r\n            .attr(\"preserveAspectRatio\", \"xMidYMid meet\");\r\n\r\n        var g = svg.append(\"g\");\r\n        var ornamentGroup = g.append(\"g\").attr(\"class\", \"wheel-ornaments\").attr(\"aria-hidden\", \"true\");\r\n        \/\/ Les cercles de graduation de la roue au poids r\u00e9el. D\u00e9clar\u00e9s AVANT\r\n        \/\/ les arcs : ils se tracent dessous, et chaque p\u00e9tale masque le sien\r\n        \/\/ jusqu'\u00e0 sa longueur \u2014 ce qui d\u00e9passe est exactement ce qui manque.\r\n        \/\/ \u00c9teints tant que la bascule n'a pas \u00e9t\u00e9 demand\u00e9e.\r\n        var roseGrid = g.append(\"g\").attr(\"class\", \"rose-grid\").attr(\"aria-hidden\", \"true\").style(\"opacity\", 0);\r\n        var arcsGroup = g.append(\"g\").attr(\"class\", \"arcs\");\r\n        var defs = g.append(\"defs\");\r\n        var labelsGroup = g.append(\"g\").attr(\"class\", \"labels\").attr(\"pointer-events\", \"none\");\r\n        \/\/ Les chiffres des graduations, eux, passent PAR-DESSUS : pos\u00e9s\r\n        \/\/ dessous comme leurs cercles, les premiers disparaissaient sous les\r\n        \/\/ p\u00e9tales qu'ils sont cens\u00e9s mesurer. Un halo cr\u00e8me les d\u00e9tache de la\r\n        \/\/ couleur qu'ils traversent.\r\n        var roseNums = g.append(\"g\").attr(\"class\", \"rose-nums\").attr(\"aria-hidden\", \"true\")\r\n            .attr(\"pointer-events\", \"none\").style(\"opacity\", 0);\r\n        var centerGroup = g.append(\"g\").attr(\"class\", \"center\");\r\n        \/\/ Le radar des freins vit dans le m\u00eame SVG : on bascule la visibilit\u00e9\r\n        \/\/ plut\u00f4t que de reconstruire tout le graphe \u00e0 chaque changement d'onglet.\r\n        var radarGroup = g.append(\"g\").attr(\"class\", \"radar\").style(\"display\", \"none\");\r\n\r\n        var radius, innerR, root, focus;\r\n        var gCx = 0, gCy = 0;\r\n\r\n        \/\/ ---- La roue a deux lectures -------------------------------------\r\n        \/\/ roueMode dit laquelle est demand\u00e9e ; roseP dit o\u00f9 en est la bascule\r\n        \/\/ (0 = parts \u00e9gales, 1 = p\u00e9tales). Le garder comme un \u00e9tat, et non\r\n        \/\/ comme un drapeau, permet de l'interrompre en route, de le reprendre,\r\n        \/\/ et de le faire suivre au zoom au lieu de le trancher d'un coup.\r\n        var roueMode = \"egal\", roseP = 0, roseMax = 1, roseSeq = 0;\r\n\r\n        var reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n        var motion = function(ms){ return reducedMotion.matches ? 0 : ms; };\r\n\r\n        \/\/ ---- Entr\u00e9e de page ----------------------------------------------\r\n        \/\/ Le voile s'efface, puis la chor\u00e9graphie se joue une seule fois :\r\n        \/\/ les formes d'abord, les libell\u00e9s ensuite (cf. les r\u00e8gles .is-ready).\r\n        \/\/ Les deux classes sont retir\u00e9es \u00e0 la fin pour que les rendus\r\n        \/\/ suivants (changement d'onglet, filtre) repartent sans animation.\r\n        var pageRevealed = false;\r\n        function revealPage(){\r\n            var veil = document.getElementById(\"chart-loading\");\r\n            if (pageRevealed){ if (veil) veil.hidden = true; return; }\r\n            pageRevealed = true;\r\n            var wrap = document.getElementById(\"reu-roue-wp\");\r\n            if (veil){\r\n                veil.classList.add(\"is-out\");\r\n                setTimeout(function(){ veil.hidden = true; }, 600);\r\n            }\r\n            if (!wrap) return;\r\n            requestAnimationFrame(function(){\r\n                requestAnimationFrame(function(){\r\n                    wrap.classList.add(\"is-ready\");\r\n                    setTimeout(function(){\r\n                        wrap.classList.remove(\"is-booting\");\r\n                        wrap.classList.remove(\"is-ready\");\r\n                    }, reducedMotion.matches ? 60 : 2600);\r\n                });\r\n            });\r\n        }\r\n        function computeSize(){\r\n            width = container.clientWidth;\r\n            height = container.clientHeight;\r\n            svg.attr(\"viewBox\", [0, 0, width, height]);\r\n            var top = 45, bottom = 38;\r\n\r\n            \/\/ La fiche projet est pos\u00e9e PAR-DESSUS le cadre, \u00e0 droite. Tant\r\n            \/\/ qu'on ne lui r\u00e9servait pas sa place, le disque gardait sa taille\r\n            \/\/ et son centre plein cadre : la fiche en recouvrait la moiti\u00e9, on\r\n            \/\/ ne voyait plus que deux arcs g\u00e9ants coup\u00e9s net. Quand elle est\r\n            \/\/ ouverte en panneau lat\u00e9ral, le disque se replie donc dans la\r\n            \/\/ bande rest\u00e9e libre \u00e0 sa gauche, et s'y recentre.\r\n            var bande = width;\r\n            var bandeGauche = 0;\r\n            var hautUtile = height - top - bottom;\r\n            var ficheOuverte = false;\r\n            if (detail && detail.classList.contains(\"is-open\")){\r\n                var rd = detail.getBoundingClientRect();\r\n                var rc = container.getBoundingClientRect();\r\n                var libre = rd.left - rc.left - 16;\r\n                \/\/ Sur les cadres \u00e9troits, la fiche n'est plus un panneau\r\n                \/\/ lat\u00e9ral mais un bandeau bas : la place \u00e0 lui rendre est\r\n                \/\/ alors au-dessus d'elle, pas \u00e0 c\u00f4t\u00e9. On ne remonte le disque\r\n                \/\/ que si la bande qui reste lui laisse une taille lisible,\r\n                \/\/ sinon mieux vaut le laisser dessous, tel quel.\r\n                if (rd.width > width * 0.8 && rd.top - rc.top > 40){\r\n                    var strate = (rd.top - rc.top) - top - 12;\r\n                    if (strate \/ 2 >= 110){ hautUtile = strate; ficheOuverte = true; }\r\n                }\r\n                else if (rd.width > 0 && rd.height > rc.height * 0.55 && libre > 240){\r\n                    bande = libre;\r\n                    ficheOuverte = true;\r\n                    \/\/ La colonne \u00e9ditoriale (titre, sous-titre) occupe les 300\r\n                    \/\/ premiers pixels. Si le reste de la bande laisse encore un\r\n                    \/\/ disque lisible, on la contourne : le disque ne doit pas\r\n                    \/\/ venir se poser sur le texte. Sinon on prend toute la\r\n                    \/\/ bande, le disque passant alors sous des textes rendus\r\n                    \/\/ translucides par la feuille de style.\r\n                    var apresColonne = (bande - 300 - 56) \/ 2;\r\n                    var hMax = (height - top - bottom) \/ 2;\r\n                    if (Math.min(apresColonne, hMax) >= 150){\r\n                        bandeGauche = 300 + 16;\r\n                        bande = bande - bandeGauche;\r\n                    }\r\n                }\r\n            }\r\n\r\n            radius = Math.max(65, Math.min((bande - 56) \/ 2, hautUtile \/ 2));\r\n            innerR = radius * trou();\r\n            LABEL_MAX = Math.max(11, Math.min(19, radius * 0.061));\r\n            \/\/ En plein cadre, le titre tient l'angle haut-gauche et la liste des\r\n            \/\/ th\u00e9matiques l'angle bas-droit : le disque se d\u00e9cale vers la bande\r\n            \/\/ qui reste libre, sans jamais r\u00e9tr\u00e9cir. Quand les deux bandes ne\r\n            \/\/ peuvent plus le contenir, il se recentre et les cartes, qui sont\r\n            \/\/ translucides, passent par-dessus son bord.\r\n            var cx = bandeGauche + bande \/ 2;\r\n            if (!ficheOuverte && !isScoped() && width >= 1100){\r\n                var lo = 300 + radius + 10, hi = width - 266 - radius - 14;\r\n                if (hi >= lo) cx = Math.max(lo, Math.min(cx, hi));\r\n            }\r\n            gCx = cx;\r\n            gCy = top + hautUtile \/ 2;\r\n            g.attr(\"transform\", \"translate(\" + gCx + \",\" + gCy + \")\");\r\n            if (ornamentGroup) drawOrnaments();\r\n        }\r\n\r\n        \/\/ UN SEUL ANNEAU \u00c0 L'\u00c9CRAN, \u00e0 tous les niveaux. La roue en montrait\r\n        \/\/ deux : celui qu'on venait d'ouvrir et le suivant, en avant-premi\u00e8re.\r\n        \/\/ Ce second anneau d\u00e9coupait le disque en cases de vingt degr\u00e9s o\u00f9 un\r\n        \/\/ nom comme \u00ab Association maison des familles et des associations \u00bb ne\r\n        \/\/ rentrait qu'en quatre lignes minuscules, quand il rentrait. Le niveau\r\n        \/\/ suivant est \u00e0 un clic : autant le montrer en grand quand on y est.\r\n        \/\/ L'anneau visible prend donc toute l'\u00e9paisseur du disque, ses arcs\r\n        \/\/ sont longs, et les noms s'y \u00e9crivent \u00e0 pleine taille.\r\n\r\n        \/\/ Rayon m\u00e9dian de la case : c'est l\u00e0 que s'\u00e9crit son libell\u00e9. Le\r\n        \/\/ texte vit DANS l'anneau, jamais au-del\u00e0 du bord du disque.\r\n        function labelMidR(box){ return (rIn(box) + rOut(box)) \/ 2; }\r\n        \/\/ \u00c9paisseur utile de la case, une fois \u00f4t\u00e9e la respiration qui \u00e9vite\r\n        \/\/ que le texte ne vienne l\u00e9cher les bords de l'anneau.\r\n        function labelEpaisseur(box){ return rOut(box) - rIn(box) - 12; }\r\n        \/\/ Hauteur d'une pile de n lignes, en em : n-1 interlignes pleins, plus\r\n        \/\/ la hauteur de capitale de la derni\u00e8re. Compter n interlignes pleins\r\n        \/\/ surestimait la place n\u00e9cessaire et masquait des libell\u00e9s qui\r\n        \/\/ tenaient tr\u00e8s bien.\r\n        function pileEm(n){ return (n - 1) * LABEL_LH + 0.86; }\r\n        function rScale(y){\r\n            if (y <= 1) return innerR * y;\r\n            return innerR + Math.min(1, y - 1) * (radius - innerR);\r\n        }\r\n\r\n        \/\/ Le coeur se resserre quand les p\u00e9tales poussent. \u00c0 parts \u00e9gales\r\n        \/\/ l'anneau est \u00e9pais et porte ses noms ; au poids r\u00e9el c'est la\r\n        \/\/ LONGUEUR qui parle, et il lui faut de la course \u2014 un trou trop large\r\n        \/\/ \u00e9crase les petits effectifs contre le bord du disque. roseP fait le\r\n        \/\/ chemin entre les deux valeurs, et le zoom l'emm\u00e8ne avec lui.\r\n        function trou(){ return 0.36 - 0.085 * roseP; }\r\n\r\n        \/\/ Les deux bornes d'une case. La borne ext\u00e9rieure n'est plus le bord\r\n        \/\/ de l'anneau mais une FRACTION de son \u00e9paisseur : box.k, la part du\r\n        \/\/ rayon que cette th\u00e9matique a m\u00e9rit\u00e9e. \u00c0 parts \u00e9gales k vaut 1\r\n        \/\/ partout, et la g\u00e9om\u00e9trie est exactement celle d'avant, au pixel.\r\n        \/\/ Tout ce qui mesure une case \u2014 les arcs, mais aussi la mise en page\r\n        \/\/ des libell\u00e9s \u2014 passe par ici : les deux lectures partagent donc le\r\n        \/\/ m\u00eame moteur de texte, sans une ligne de mise en page en double.\r\n        function rIn(box){ return rScale(box.y0); }\r\n        function rOut(box){\r\n            var a = rScale(box.y0), b = rScale(box.y1);\r\n            return a + (b - a) * (box.k == null ? 1 : box.k);\r\n        }\r\n\r\n        var arc = d3.arc()\r\n            .startAngle(function(d){ return d.x0; })\r\n            .endAngle(function(d){ return d.x1; })\r\n            .padAngle(function(d){ return Math.min((d.x1 - d.x0) \/ 2, 0.012); })\r\n            .cornerRadius(4)\r\n            .padRadius(function(){ return radius; })\r\n            .innerRadius(function(d){ return rIn(d); })\r\n            .outerRadius(function(d){ return Math.max(rIn(d), rOut(d) - 1.5); });\r\n\r\n        function buildRoot(){\r\n            var r = d3.hierarchy(hierarchyData)\r\n                \/\/ pas de .sort() : l'ordre des donn\u00e9es fait foi, pour que chaque\r\n                \/\/ th\u00e9matique garde sa couleur et sa place d'un mode \u00e0 l'autre.\r\n                \/\/\r\n                \/\/ leafShare vient d'egaliser() : la part exacte de tour qui\r\n                \/\/ revient \u00e0 ce porteur pour que tous les voisins de m\u00eame parent\r\n                \/\/ soient \u00e0 \u00e9galit\u00e9, \u00e0 chaque niveau.\r\n                .sum(function(d){ return d.projet ? (d.leafShare != null ? d.leafShare : 0) : 0; });\r\n            return d3.partition().size([2 * Math.PI, r.height + 1])(r);\r\n        }\r\n\r\n        function visible(d){\r\n            return d.y1 <= 2 && d.y0 >= 1 && d.x1 > d.x0 + 0.0005;\r\n        }\r\n        \/\/ Un libell\u00e9 n'est affich\u00e9 que s'il reste lisible : sinon on laisse\r\n        \/\/ l'arc muet, l'identit\u00e9 passe par le survol et par la fiche.\r\n        \/\/\r\n        \/\/ Sur la roue d'ensemble (focus = racine), on ne libelle QUE l'anneau\r\n        \/\/ des th\u00e9matiques ; l'anneau ext\u00e9rieur des projets reste sans texte.\r\n        \/\/ D\u00e8s qu'on d\u00e9veloppe une th\u00e9matique (focus = ce th\u00e8me), les projets\r\n        \/\/ deviennent la couronne principale et r\u00e9cup\u00e8rent leur libell\u00e9.\r\n        function labelFits(node, box){\r\n            box = box || node.current;\r\n            \/\/ On libelle l'anneau que l'on vient d'ouvrir (le plus int\u00e9rieur\r\n            \/\/ visible) : th\u00e9matiques \u00e0 la racine, sous-th\u00e9matiques dans un th\u00e8me,\r\n            \/\/ porteurs dans une sous-th\u00e9matique.\r\n            \/\/ Exception : une fois une th\u00e9matique ouverte, l'anneau des porteurs\r\n            \/\/ (encore un cran plus loin) est aussi libell\u00e9 \u2014 les deux anneaux\r\n            \/\/ restent lisibles \u00e0 ce niveau de zoom, inutile d'attendre un clic de plus.\r\n            return labelUtile(node, box) && node.tient !== false;\r\n        }\r\n        \/\/ La moiti\u00e9 purement g\u00e9om\u00e9trique du test : cette case m\u00e9rite-t-elle\r\n        \/\/ qu'on essaie d'y \u00e9crire ? Elle est s\u00e9par\u00e9e parce qu'elle sert aussi de\r\n        \/\/ filtre AVANT la mise en page : sur cette roue, les trois quarts des\r\n        \/\/ cases sont hors champ \u00e0 tout instant, et les mesurer pour rien \u00e9tait\r\n        \/\/ le gros du travail fait \u00e0 l'arr\u00eat du zoom \u2014 donc du soubresaut qu'on\r\n        \/\/ y voyait. L'autre moiti\u00e9 du test (\u00ab le texte tient-il vraiment ? \u00bb)\r\n        \/\/ ne peut, elle, se r\u00e9pondre qu'une fois le texte \u00e9crit et mesur\u00e9.\r\n        function labelUtile(node, box){\r\n            \/\/ On libelle l'anneau que l'on vient d'ouvrir, et c'est le seul\r\n            \/\/ affich\u00e9 : th\u00e9matiques \u00e0 la racine, sous-th\u00e9matiques dans un th\u00e8me,\r\n            \/\/ porteurs dans une sous-th\u00e9matique.\r\n            return node.depth === focus.depth + 1\r\n                && visible(box)\r\n                && (box.x1 - box.x0) * labelMidR(box) > 52\r\n                && (box.x1 - box.x0) > 0.028;\r\n        }\r\n\r\n        \/\/ Couleur d'un arc : teinte pleine de la th\u00e9matique, la m\u00eame quel\r\n        \/\/ que soit ce que le projet a renseign\u00e9.\r\n        function nodeFill(d){\r\n            return d.data.isTheme || d.data.isSousTheme ? d.data.color : d.data.colorFull;\r\n        }\r\n\r\n        \/\/ Encre du libell\u00e9 : une encre TEINT\u00c9E, d\u00e9riv\u00e9e de l'arc qu'elle\r\n        \/\/ couvre. L'encre unique bleu nuit pos\u00e9e sur toute la gamme donnait un\r\n        \/\/ texte quasi noir sur des pastels chauds \u2014 lisible au sens du ratio,\r\n        \/\/ mais sale \u00e0 l'oeil et illisible \u00e0 distance de vid\u00e9oprojecteur, parce\r\n        \/\/ que la teinte du texte n'avait rien \u00e0 voir avec celle du fond. On\r\n        \/\/ garde donc la famille chromatique de l'arc, on \u00e9crase sa clart\u00e9 et on\r\n        \/\/ contient son chroma : le mot reste dans le ton de son secteur et\r\n        \/\/ ressort franchement. Le basculement blanc\/noir d'autrefois n'est pas\r\n        \/\/ r\u00e9introduit : toute la gamme est claire, l'encre est toujours sombre.\r\n        \/\/\r\n        \/\/ Le contraste n'est pas laiss\u00e9 au jug\u00e9 : on descend la clart\u00e9 jusqu'\u00e0\r\n        \/\/ tenir 7:1 sur le fond r\u00e9el de l'arc (AAA pour le petit texte), ce qui\r\n        \/\/ couvre aussi bien les pastels clairs que les teintes pleines des\r\n        \/\/ feuilles.\r\n        function srgbLum(c){\r\n            c = d3.rgb(c);\r\n            function f(v){ v \/= 255; return v <= 0.03928 ? v \/ 12.92 : Math.pow((v + 0.055) \/ 1.055, 2.4); }\r\n            return 0.2126 * f(c.r) + 0.7152 * f(c.g) + 0.0722 * f(c.b);\r\n        }\r\n        function contraste(a, b){\r\n            var l1 = srgbLum(a), l2 = srgbLum(b);\r\n            if (l1 < l2){ var t = l1; l1 = l2; l2 = t; }\r\n            return (l1 + 0.05) \/ (l2 + 0.05);\r\n        }\r\n        var INK_CACHE = {};\r\n        function labelInk(fill){\r\n            if (!fill) return \"#12283f\";\r\n            var cle = String(fill);\r\n            if (INK_CACHE[cle]) return INK_CACHE[cle];\r\n            var base = d3.hcl(d3.color(fill));\r\n            if (isNaN(base.h)) base.h = 250;\r\n            \/\/ La roue \u00e9crit en BLANC, partout. La palette r\u00e9harmonis\u00e9e est\r\n            \/\/ assez dense et assez homog\u00e8ne pour le porter d'un bout \u00e0 l'autre\r\n            \/\/ de la gamme, et c'est cette uniformit\u00e9 qui fait la lecture : une\r\n            \/\/ encre qui change de valeur d'un secteur \u00e0 l'autre donne neuf\r\n            \/\/ typographies au lieu d'une, et l'oeil croit \u00e0 une hi\u00e9rarchie qui\r\n            \/\/ n'existe pas. Tous les libell\u00e9s se lisent donc de la m\u00eame fa\u00e7on,\r\n            \/\/ comme sur la maquette.\r\n            var blanc = \"#ffffff\";\r\n            \/\/ Garde-fou : si une teinte devenait trop claire pour tenir le\r\n            \/\/ blanc (une couleur ajout\u00e9e plus tard, un pastel qui revient), on\r\n            \/\/ retombe sur l'encre fonc\u00e9e du m\u00eame ton plut\u00f4t que d'\u00e9crire un\r\n            \/\/ libell\u00e9 invisible.\r\n            if (contraste(blanc, fill) >= 2.6){\r\n                INK_CACHE[cle] = blanc;\r\n                return blanc;\r\n            }\r\n            \/\/ Chroma plafonn\u00e9 : au-del\u00e0, une encre fonc\u00e9e vire au bonbon et\r\n            \/\/ concurrence les arcs au lieu de s'y poser.\r\n            var encre = d3.hcl(base.h, Math.min(isNaN(base.c) ? 0 : base.c, 30), 34);\r\n            var garde = 0;\r\n            while (contraste(encre, fill) < 7 && encre.l > 8 && garde++ < 60) encre.l -= 1.2;\r\n            var hex = d3.rgb(encre).formatHex();\r\n            INK_CACHE[cle] = hex;\r\n            return hex;\r\n        }\r\n        \/\/ Halo : un blanc l\u00e9ger, pas un liser\u00e9. Il ne sert qu'aux libell\u00e9s qui\r\n        \/\/ fr\u00f4lent le bord de leur arc ou chevauchent deux teintes, et son\r\n        \/\/ \u00e9paisseur est relative au corps (pos\u00e9e dans ecrire()).\r\n        \/\/ Le halo sert \u00e0 d\u00e9coller le libell\u00e9 de son arc : blanc sous une encre\r\n        \/\/ fonc\u00e9e, sombre sous une encre claire. Un halo blanc sous du blanc ne\r\n        \/\/ ferait qu'\u00e9paissir les lettres.\r\n        function labelHalo(fill){\r\n            if (!fill) return \"rgba(255,255,255,0.62)\";\r\n            return srgbLum(labelInk(fill)) > 0.5\r\n                ? \"rgba(18,32,44,0.34)\"\r\n                : \"rgba(255,255,255,0.62)\";\r\n        }\r\n\r\n        function drawOrnaments(){\r\n            \/\/ L'orbite pleine est le cadre du disque \u00e0 parts \u00e9gales. D\u00e8s que la\r\n            \/\/ roue est gradu\u00e9e, elle double le dernier cercle de graduation \u00e0\r\n            \/\/ quelques pixels pr\u00e8s, et l'oeil ne sait plus lequel des deux\r\n            \/\/ porte le chiffre : on ne garde que celui qui mesure.\r\n            ornamentGroup.selectAll(\"circle\").data(roseCible(focus) ? [] : [radius + 12]).join(\"circle\")\r\n                .attr(\"class\", \"wheel-orbit\").attr(\"r\", function(r){ return r; });\r\n            \/\/ Le cran de midi tombe pile sous le chiffre du dernier cercle\r\n            \/\/ (\u00ab 9 projets \u00bb), qui se pose sur cette m\u00eame verticale : deux\r\n            \/\/ traits pour un seul rep\u00e8re, dont l'un barre le texte. D\u00e8s que la\r\n            \/\/ roue est gradu\u00e9e, ce cran-l\u00e0 laisse la place au chiffre.\r\n            var crans = d3.range(72).filter(function(i){\r\n                return !(roseCible(focus) && (i === 0 || i === 1 || i === 71));\r\n            });\r\n            ornamentGroup.selectAll(\"line\").data(crans).join(\"line\")\r\n                .attr(\"class\", \"wheel-tick\")\r\n                .attr(\"x1\", function(i){ return Math.sin(i * Math.PI \/ 36) * (radius + 16); })\r\n                .attr(\"y1\", function(i){ return -Math.cos(i * Math.PI \/ 36) * (radius + 16); })\r\n                .attr(\"x2\", function(i){ return Math.sin(i * Math.PI \/ 36) * (radius + (i % 8 === 0 ? 23 : 19)); })\r\n                .attr(\"y2\", function(i){ return -Math.cos(i * Math.PI \/ 36) * (radius + (i % 8 === 0 ? 23 : 19)); })\r\n                .attr(\"opacity\", function(i){ return i % 8 === 0 ? .8 : .4; });\r\n        }\r\n\r\n        \/\/ ============ 4 bis. LA ROUE AU POIDS R\u00c9EL ============\r\n        \/\/ Deux lectures d'un m\u00eame disque, au m\u00eame endroit, dans le m\u00eame ordre.\r\n        \/\/\r\n        \/\/ \u00c0 PARTS \u00c9GALES, chaque th\u00e9matique occupe le m\u00eame quartier : la roue\r\n        \/\/ dit DE QUOI le fonds est fait, et neuf couleurs suffisent \u00e0 s'y\r\n        \/\/ retrouver. Mais elle ne dit pas, \u00e0 ce jeu-l\u00e0, qui p\u00e8se le plus :\r\n        \/\/ Culture et Num\u00e9rique y ont la m\u00eame part, alors que l'un compte deux\r\n        \/\/ projets et l'autre neuf.\r\n        \/\/\r\n        \/\/ AU POIDS R\u00c9EL, l'angle ne bouge pas d'un degr\u00e9 \u2014 c'est lui qui\r\n        \/\/ permet de reconna\u00eetre son secteur d'une vue \u00e0 l'autre \u2014 mais le\r\n        \/\/ p\u00e9tale s'arr\u00eate l\u00e0 o\u00f9 son effectif le porte. La longueur se mesure\r\n        \/\/ depuis le bord du coeur, ligne de d\u00e9part commune \u00e0 tous : c'est un\r\n        \/\/ diagramme en barres enroul\u00e9, pas une rosace d\u00e9corative, et les\r\n        \/\/ cercles de graduation sont l\u00e0 pour qu'on puisse le chiffrer.\r\n        \/\/ Deux poids possibles, et c'est le m\u00eame p\u00e9tale qui les porte : le\r\n        \/\/ nombre de projets, ou le montant FIS engag\u00e9. Les deux se valent comme\r\n        \/\/ mesure, mais ils ne disent pas la m\u00eame chose, et c'est bien pour \u00e7a\r\n        \/\/ qu'ils sont tous les deux l\u00e0 : le Num\u00e9rique est premier en nombre de\r\n        \/\/ projets (9) et troisi\u00e8me en argent (209 000 \u20ac), la Participation\r\n        \/\/ l'inverse (8 projets, 357 000 \u20ac). Basculer de l'un \u00e0 l'autre montre\r\n        \/\/ ce renversement sans qu'on ait \u00e0 le commenter.\r\n        \/\/ Le montant est la seule colonne du corpus renseign\u00e9e pour les 48\r\n        \/\/ projets : aucun NR \u00e0 masquer, aucun trou \u00e0 combler.\r\n        function rosePetales(){ return roueMode === \"rose\" || roueMode === \"fis\"; }\r\n\r\n        \/\/ Le montant a un d\u00e9faut que le nombre de projets n'a pas : il se\r\n        \/\/ concentre. Deux subventions font pr\u00e8s d'un cinqui\u00e8me du fonds, et\r\n        \/\/ c'est l'une d'elles qui fait passer la Participation en t\u00eate. Sans\r\n        \/\/ cette note, la roue laisse conclure qu'une th\u00e9matique a \u00e9t\u00e9\r\n        \/\/ privil\u00e9gi\u00e9e, l\u00e0 o\u00f9 un seul dossier a \u00e9t\u00e9 gros. Le compte n'est pas\r\n        \/\/ \u00e9crit en dur : il se refait sur les donn\u00e9es servies.\r\n        var ROSE_CONC = (function(){\r\n            var v = PROJETS.map(function(p){ return p.fisNum || 0; })\r\n                .sort(function(a, b){ return b - a; });\r\n            var tot = d3.sum(v);\r\n            if (!tot || v.length < 2) return null;\r\n            return { n: 2, pct: Math.round((v[0] + v[1]) \/ tot * 100) };\r\n        })();\r\n        function roseVal(d){\r\n            \/\/ Un projet tagu\u00e9 sur plusieurs sous-th\u00e9matiques est list\u00e9 autant\r\n            \/\/ de fois : on d\u00e9doublonne avant de compter ET avant de sommer,\r\n            \/\/ sinon son montant entrerait deux fois dans le total du secteur.\r\n            var list = d.data.projets ? Array.from(new Set(d.data.projets)) : null;\r\n            if (roueMode === \"fis\"){\r\n                if (!list) return (d.data.projet && d.data.projet.fisNum) || 0;\r\n                return d3.sum(list, function(p){ return p.fisNum || 0; });\r\n            }\r\n            return list ? list.length : 1;\r\n        }\r\n        \/\/ L'\u00e9chelle d\u00e9pend de la mesure : changer de poids, c'est changer de\r\n        \/\/ r\u00e8gle gradu\u00e9e. Elle se reprend donc \u00e0 chaque bascule, pas seulement\r\n        \/\/ au premier rendu.\r\n        \/\/ L'\u00e9chelle est TOUJOURS celle de la couronne qu'on regarde : le plus\r\n        \/\/ gros enfant du noeud ouvert touche le bord, les autres se mesurent \u00e0\r\n        \/\/ lui. Comparer un sous-th\u00e8me \u00e0 l'\u00e9chelle du fonds entier l'\u00e9craserait\r\n        \/\/ contre le coeur ; le remettre \u00e0 l'\u00e9chelle de ses voisins imm\u00e9diats\r\n        \/\/ est la seule lecture qui garde du relief \u00e0 chaque \u00e9chelon.\r\n        function roseMaxDe(p){\r\n            if (!p || !p.children || !p.children.length) return 0;\r\n            return d3.max(p.children, roseVal) || 0;\r\n        }\r\n        function roseMesurer(){\r\n            roseMax = roseMaxDe(focus) || 1;\r\n        }\r\n        function roseK(d, p){\r\n            \/\/ La mesure suit le zoom : la couronne affich\u00e9e est toujours celle\r\n            \/\/ des enfants du noeud ouvert, et c'est elle qui porte les\r\n            \/\/ longueurs, au centre comme dans une th\u00e9matique d\u00e9velopp\u00e9e.\r\n            if (!roseCible(p) || d.depth !== p.depth + 1) return 1;\r\n            var m = roseMaxDe(p);\r\n            return m > 0 ? roseVal(d) \/ m : 1;\r\n        }\r\n        \/\/ Un seul enfant, des enfants sans poids, ou tous au m\u00eame poids : il\r\n        \/\/ n'y a rien \u00e0 comparer. C'est le cas de la couronne des projets\r\n        \/\/ compt\u00e9s en nombre, o\u00f9 chacun vaut 1 : des p\u00e9tales tous au bord et\r\n        \/\/ une seule graduation \u00ab 1 projet \u00bb diraient une mesure l\u00e0 o\u00f9 il n'y\r\n        \/\/ en a pas. Cette couronne-l\u00e0 revient donc aux parts \u00e9gales, et la\r\n        \/\/ bascule ne reprend la main qu'au niveau o\u00f9 elle a quelque chose \u00e0\r\n        \/\/ montrer.\r\n        function roseCible(p){\r\n            if (!rosePetales() || !p || !p.children || p.children.length < 2) return 0;\r\n            var max = roseMaxDe(p);\r\n            if (!(max > 0)) return 0;\r\n            return d3.min(p.children, roseVal) < max ? 1 : 0;\r\n        }\r\n\r\n        \/\/ Les graduations : trois ou quatre cercles ronds, pas plus. Sans eux\r\n        \/\/ un p\u00e9tale se compare \u00e0 ses voisins mais ne se chiffre pas.\r\n        function roseGrads(){\r\n            var out = [], v;\r\n            if (roueMode === \"fis\"){\r\n                \/\/ Des paliers ronds, choisis par d3 : \u00ab 89 250 \u20ac \u00bb sur un\r\n                \/\/ cercle de graduation ne se lit pas, il se d\u00e9chiffre. Le\r\n                \/\/ dernier cercle reste la valeur r\u00e9elle du plus gros secteur,\r\n                \/\/ sinon le p\u00e9tale d\u00e9passerait sa propre r\u00e8gle.\r\n                var pas = d3.tickStep(0, roseMax, 4) || roseMax;\r\n                for (v = pas; v < roseMax * 0.94; v += pas) out.push(v);\r\n                out.push(roseMax);\r\n                return out;\r\n            }\r\n            var pasN = roseMax <= 4 ? 1 : roseMax <= 14 ? 3 : Math.ceil(roseMax \/ 4);\r\n            for (v = pasN; v < roseMax; v += pasN) out.push(v);\r\n            out.push(roseMax);\r\n            return out;\r\n        }\r\n        \/\/ Seul le cercle ext\u00e9rieur porte l'unit\u00e9 : la r\u00e9p\u00e9ter sur chacun\r\n        \/\/ empilerait quatre fois le m\u00eame mot sur la m\u00eame verticale.\r\n        function roseFormat(v, dernier){\r\n            if (roueMode === \"fis\"){\r\n                var k = Math.round(v \/ 1000);\r\n                return dernier ? k + \" k\u20ac de FIS\" : k + \" k\";\r\n            }\r\n            return dernier ? v + \" projet\" + (v > 1 ? \"s\" : \"\") : v;\r\n        }\r\n        \/\/ Cercles et chiffres s'allument et s'\u00e9teignent d'un seul geste.\r\n        function roseFade(op, delai, duree){\r\n            [roseGrid, roseNums].forEach(function(sel){\r\n                sel.interrupt(\"rose\").transition(\"rose\")\r\n                    .delay(motion(delai || 0)).duration(motion(duree))\r\n                    .style(\"opacity\", op);\r\n            });\r\n        }\r\n        function drawRoseGrid(){\r\n            var grads = roseCible(focus) ? roseGrads() : [];\r\n            var rayon = function(v){ return innerR + (radius - innerR) * (v \/ roseMax); };\r\n            roseGrid.selectAll(\"circle\").data(grads).join(\"circle\")\r\n                .attr(\"class\", \"rose-ring\").attr(\"r\", rayon);\r\n            \/\/ Le chiffre se pose sur la verticale haute, l\u00e0 o\u00f9 passe la\r\n            \/\/ s\u00e9paration du dernier secteur et du premier : c'est la seule\r\n            \/\/ ligne du cadran que l'oeil tient d\u00e9j\u00e0 pour un rep\u00e8re.\r\n            roseNums.selectAll(\"text\").data(grads).join(\"text\")\r\n                .attr(\"class\", \"rose-grad\")\r\n                .attr(\"x\", 0)\r\n                .attr(\"y\", function(v){ return -rayon(v); })\r\n                .attr(\"dy\", \"-0.45em\")\r\n                .text(function(v, i){ return roseFormat(v, i === grads.length - 1); });\r\n            \/\/ Les crans du pourtour d\u00e9pendent de la pr\u00e9sence de ces chiffres :\r\n            \/\/ ils se redessinent avec eux.\r\n            if (ornamentGroup) drawOrnaments();\r\n        }\r\n\r\n        \/\/ La bascule ne s'offre qu'au tour complet, et seulement sur la roue :\r\n        \/\/ ailleurs elle n'aurait rien \u00e0 \u00e9changer.\r\n        function updateRoueModes(){\r\n            var el = document.getElementById(\"roue-modes\");\r\n            if (!el) return;\r\n            el.hidden = isScoped() || !(focus && focus.children && focus.children.length > 1);\r\n            el.querySelectorAll(\".rmode\").forEach(function(b){\r\n                var on = b.getAttribute(\"data-rmode\") === roueMode;\r\n                b.classList.toggle(\"active\", on);\r\n                b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\r\n            });\r\n        }\r\n\r\n        \/\/ La l\u00e9gende du disque change avec la lecture : c'est elle qui dit ce\r\n        \/\/ que mesure la forme qu'on a sous les yeux.\r\n        function updateRoueCaption(){\r\n            var el = document.getElementById(\"stage-caption\");\r\n            if (!el) return;\r\n            var line = el.querySelector(\".caption-line\");\r\n            \/\/ roseCible, et non roueMode : dans une th\u00e9matique ouverte, la roue\r\n            \/\/ est revenue \u00e0 ses parts pleines m\u00eame si la bascule reste arm\u00e9e\r\n            \/\/ pour le retour au centre. La l\u00e9gende dit ce qu'on a sous les\r\n            \/\/ yeux, pas ce qu'on a choisi.\r\n            el.textContent = !roseCible(focus)\r\n                ? \"Secteurs \u00e0 parts \u00e9gales \u00b7 La couleur identifie la th\u00e9matique\"\r\n                : roueMode === \"fis\"\r\n                    ? \"La longueur du p\u00e9tale dit le montant FIS engag\u00e9 \u00b7 Les cercles sont les graduations\"\r\n                    : \"La longueur du p\u00e9tale dit le nombre de projets \u00b7 Les cercles sont les graduations\";\r\n            if (line) el.insertBefore(line, el.firstChild);\r\n        }\r\n\r\n        \/\/ ---- La bascule ---------------------------------------------------\r\n        \/\/ Les neuf p\u00e9tales ne partent pas ensemble : ils se d\u00e9tachent l'un\r\n        \/\/ apr\u00e8s l'autre en suivant le cadran depuis midi. L'oeil fait le tour\r\n        \/\/ avec eux, et voit chaque th\u00e9matique prendre SA longueur, au lieu de\r\n        \/\/ voir le disque se d\u00e9former d'un bloc. Le coeur se resserre pendant\r\n        \/\/ ce temps-l\u00e0, d'un seul mouvement continu.\r\n        \/\/\r\n        \/\/ Les libell\u00e9s, eux, s'\u00e9teignent AVANT le mouvement et se reposent\r\n        \/\/ apr\u00e8s, en ronde : on ne lit jamais un mot qui bouge, et un nom qui\r\n        \/\/ ne tient plus dans son p\u00e9tale raccourci s'efface sans bavure \u2014 la\r\n        \/\/ mise en page est refaite \u00e0 l'arriv\u00e9e, sur la roue immobile.\r\n        function basculePetales(){\r\n            if (!pathSel) return;\r\n            var seq = ++roseSeq;\r\n            highlight(null);\r\n            closeTooltip();\r\n            \/\/ Comme le zoom : on coupe tout ce qui tourne encore, ET on solde\r\n            \/\/ ce que ces animations laissaient derri\u00e8re elles. La chor\u00e9graphie\r\n            \/\/ d'entr\u00e9e allume les arcs un \u00e0 un ; interrompue \u00e0 mi-course sans\r\n            \/\/ rien poser, elle laissait la moiti\u00e9 du disque \u00e0 opacit\u00e9 nulle \u2014\r\n            \/\/ une roue \u00e0 deux p\u00e9tales, pour un clic un peu press\u00e9.\r\n            pathSel.interrupt(\"intro\").interrupt(\"zoom\").interrupt(\"rose\")\r\n                .attr(\"fill-opacity\", function(d){ return visible(d.current) ? 1 : 0; })\r\n                .attr(\"stroke-opacity\", function(d){ return visible(d.current) ? 1 : 0; });\r\n            labelSel.interrupt(\"entree\").interrupt(\"sortie\").interrupt(\"zoom\");\r\n            svg.interrupt(\"rose\").interrupt(\"recale\");\r\n            clearTimeout(recaleTimer);\r\n            labelsGroup.interrupt(\"intro\").interrupt(\"recale\").attr(\"opacity\", 1);\r\n            centerGroup.interrupt(\"intro\").attr(\"opacity\", 1);\r\n            ornamentGroup.interrupt(\"recale\").attr(\"opacity\", 1);\r\n            if (centerLabel) centerLabel.interrupt(\"recale\").attr(\"opacity\", 1);\r\n            updateRoueCaption();\r\n            updateRoueModes();\r\n            updateSubtitle();\r\n\r\n            \/\/ Avant de viser les longueurs d'arriv\u00e9e : passer des projets aux\r\n            \/\/ euros change la r\u00e8gle, donc le bord du disque. Sans ce recalcul,\r\n            \/\/ les p\u00e9tales se rapportaient encore \u00e0 l'\u00e9chelle qu'on quitte et\r\n            \/\/ le plus gros secteur n'atteignait plus le bord.\r\n            roseMesurer();\r\n            root.each(function(d){\r\n                d.kDep = d.current.k == null ? 1 : d.current.k;\r\n                d.kFin = roseK(d, focus);\r\n            });\r\n            var pDep = roseP, pFin = roseCible(focus);\r\n            var pousse = pFin > pDep;   \/\/ on d\u00e9ploie les p\u00e9tales, ou on les rend\r\n\r\n            \/\/ Mouvement r\u00e9duit : on pose la roue d'arriv\u00e9e, point. Les fondus\r\n            \/\/ sont coup\u00e9s AVANT d'\u00e9crire l'opacit\u00e9 finale \u2014 un fondu de dur\u00e9e\r\n            \/\/ nulle se joue quand m\u00eame, au tick suivant, et repeindrait par\r\n            \/\/ dessus ce qu'on vient de poser.\r\n            if (reducedMotion.matches){\r\n                roseP = pFin;\r\n                root.each(function(d){ d.current.k = d.kFin; });\r\n                computeSize(); drawRoseGrid();\r\n                roseGrid.interrupt(\"rose\").style(\"opacity\", pFin ? 1 : 0);\r\n                roseNums.interrupt(\"rose\").style(\"opacity\", pFin ? 1 : 0);\r\n                redrawStatic();\r\n                return;\r\n            }\r\n\r\n            \/\/ Les rep\u00e8res s'effacent d'abord : ils ne reviennent que sur une\r\n            \/\/ roue arr\u00eat\u00e9e, quand ils ont de nouveau quelque chose \u00e0 graduer.\r\n            roseFade(0, 0, 160);\r\n\r\n            var ring = (focus.children || []).slice().sort(function(a, b){\r\n                return (a.current.x0 + a.current.x1) - (b.current.x0 + b.current.x1);\r\n            });\r\n            var rang = {};\r\n            ring.forEach(function(d, i){ rang[d.lid] = i; });\r\n            var dernier = Math.max(1, ring.length - 1);\r\n            \/\/ Le d\u00e9calage mange la moiti\u00e9 du temps : assez pour qu'on suive la\r\n            \/\/ ronde, pas assez pour que le dernier p\u00e9tale se sente oubli\u00e9.\r\n            var ETALE = 0.5;\r\n            \/\/ En poussant, une courbe qui d\u00e9passe sa cible puis revient donne\r\n            \/\/ au p\u00e9tale le poids d'une chose qui se pose. Au retour, la cible\r\n            \/\/ est la pleine longueur : d\u00e9passer sortirait du disque, on rentre\r\n            \/\/ donc franchement, sans rebond.\r\n            var courbe = pousse ? d3.easeBackOut.overshoot(0.85) : d3.easeCubicOut;\r\n\r\n            g.classed(\"is-moving\", true);\r\n            labelSel.transition(\"sortie\").duration(motion(200)).ease(d3.easeSinIn).attr(\"opacity\", 0);\r\n            centerLabel.interrupt(\"centre\").transition(\"centre\")\r\n                .duration(motion(200)).ease(d3.easeSinIn).attr(\"opacity\", 0);\r\n\r\n            svg.transition(\"rose\").duration(motion(1150)).ease(d3.easeLinear)\r\n                .tween(\"rose\", function(){\r\n                    return function(t){\r\n                        roseP = pDep + (pFin - pDep) * d3.easeCubicInOut(t);\r\n                        innerR = radius * trou();\r\n                        root.each(function(d){\r\n                            var dec = (rang[d.lid] == null ? 0 : rang[d.lid]) * ETALE \/ dernier;\r\n                            var local = Math.max(0, Math.min(1, (t - dec) \/ (1 - ETALE)));\r\n                            d.current.k = d.kDep + (d.kFin - d.kDep) * courbe(local);\r\n                        });\r\n                        pathSel.attr(\"d\", function(d){ return arc(d.current); });\r\n                        centerGroup.select(\"circle\").attr(\"r\", innerR - 8);\r\n                    };\r\n                })\r\n                .on(\"interrupt.rose\", function(){ g.classed(\"is-moving\", false); })\r\n                .on(\"end.rose\", function(){\r\n                    if (seq !== roseSeq) return;\r\n                    g.classed(\"is-moving\", false);\r\n                    roseP = pFin;\r\n                    root.each(function(d){ d.current.k = d.kFin; });\r\n                    computeSize();\r\n                    pathSel.attr(\"d\", function(d){ return arc(d.current); });\r\n                    drawRoseGrid();\r\n                    redrawStatic();\r\n                    updateTitles();\r\n                    \/\/ Les noms se reposent sur une roue immobile, dans le sens\r\n                    \/\/ de lecture du cadran : midi d'abord, puis la ronde.\r\n                    labelSel.attr(\"opacity\", 0);\r\n                    var tenants = [];\r\n                    labelSel.each(function(d){ if (labelFits(d, d.current)) tenants.push(d); });\r\n                    tenants.sort(function(a, b){\r\n                        return (a.current.x0 + a.current.x1) - (b.current.x0 + b.current.x1);\r\n                    });\r\n                    var ordre = {}, ecart = Math.min(45, 260 \/ Math.max(1, tenants.length - 1));\r\n                    tenants.forEach(function(d, i){ ordre[d.lid] = i; });\r\n                    labelSel.filter(function(d){ return labelFits(d, d.current); })\r\n                        .interrupt(\"entree\").transition(\"entree\")\r\n                        .delay(function(d){ return motion(40 + ordre[d.lid] * ecart); })\r\n                        .duration(motion(520)).ease(d3.easeSinOut)\r\n                        .attr(\"opacity\", 1);\r\n                    centerLabel.interrupt(\"centre\").attr(\"opacity\", 0)\r\n                        .transition(\"centre\").delay(motion(40)).duration(motion(520))\r\n                        .ease(d3.easeSinOut).attr(\"opacity\", 1);\r\n                    \/\/ Les graduations arrivent en dernier, sur des p\u00e9tales d\u00e9j\u00e0\r\n                    \/\/ pos\u00e9s : elles chiffrent une forme, elles ne l'accompagnent\r\n                    \/\/ pas.\r\n                    if (pFin) roseFade(1, 140, 560);\r\n                });\r\n        }\r\n\r\n        function nodePaint(d){ return \"url(#fis-sector-\" + d.lid + \")\"; }\r\n        function highlight(d){\r\n            if (g.classed(\"is-moving\")) return;\r\n            pathSel.classed(\"is-muted\", function(n){ return !!d && n !== d && visible(n.current); })\r\n                .classed(\"is-hovered\", function(n){ return n === d; });\r\n            \/\/ Le libell\u00e9 s'efface AVEC son arc. Il vit dans un autre groupe et\r\n            \/\/ gardait donc sa pleine opacit\u00e9 sur un arc pass\u00e9 \u00e0 38 % : une\r\n            \/\/ encre claire y devenait illisible, et une encre fonc\u00e9e y flottait\r\n            \/\/ toute seule. Les deux s'\u00e9teignent maintenant ensemble.\r\n            if (labelSel) labelSel.attr(\"opacity\", function(n){\r\n                if (!labelFits(n, n.current)) return 0;\r\n                return (!!d && n !== d && visible(n.current)) ? 0.55 : 1;\r\n            });\r\n            document.querySelectorAll(\"#explore-list .explore-item\").forEach(function(el){\r\n                el.classList.toggle(\"is-hovered\", !!d && +el.dataset.node === d.lid);\r\n            });\r\n        }\r\n        function renderExplorer(){\r\n            var el = document.getElementById(\"explore-list\");\r\n            el.hidden = isScoped();\r\n            if (isScoped()) return;\r\n            var kids = focus.children || [];\r\n            el.innerHTML = kids.map(function(d){\r\n                var count = d.data.projets ? new Set(d.data.projets).size : 1;\r\n                return '<button class=\"explore-item\" type=\"button\" data-node=\"' + d.lid + '\" style=\"--swatch:' + nodeFill(d) + '\">'\r\n                    + '<span class=\"explore-swatch\"><\\\/span><span class=\"explore-name\">' + escapeHTML(labelText(d))\r\n                    + '<\\\/span><span class=\"explore-count\">' + count + '<\\\/span><span class=\"explore-arrow\" aria-hidden=\"true\">\u2197<\\\/span><\\\/button>';\r\n            }).join(\"\");\r\n            el.querySelectorAll(\"button\").forEach(function(btn, i){\r\n                btn.addEventListener(\"click\", function(e){ onClick(e, kids[i]); });\r\n                btn.addEventListener(\"mouseenter\", function(){ highlight(kids[i]); });\r\n                btn.addEventListener(\"mouseleave\", function(){ highlight(null); });\r\n                btn.addEventListener(\"focus\", function(){ highlight(kids[i]); });\r\n                btn.addEventListener(\"blur\", function(){ highlight(null); });\r\n            });\r\n        }\r\n        function syncArcAccessibility(){\r\n            centerGroup.select(\"circle\").attr(\"tabindex\", isScoped() ? -1 : 0);\r\n            pathSel.attr(\"tabindex\", function(d){ return !isScoped() && visible(d.current) ? 0 : -1; })\r\n                .attr(\"aria-hidden\", function(d){ return isScoped() || !visible(d.current) ? \"true\" : null; })\r\n                .attr(\"aria-label\", function(d){ return labelText(d) + (d.data.projet ? \", ouvrir la fiche\" : \", explorer\"); });\r\n        }\r\n\r\n\r\n        \/\/ ============ 5. RENDU ============\r\n        var pathSel, labelSel, centerLabel, hasEntered = false;\r\n\r\n        function render(){\r\n            computeSize();\r\n            root = buildRoot();\r\n            focus = root;\r\n            \/\/ L'\u00e9chelle des p\u00e9tales : le plus gros secteur touche le bord du\r\n            \/\/ disque, tout le reste s'y rapporte.\r\n            roseMesurer();\r\n            root.each(function(d){ d.current = { x0: d.x0, x1: d.x1, y0: d.y0, y1: d.y1, k: roseK(d, root) }; });\r\n\r\n            var nodes = root.descendants().filter(function(d){ return d.depth > 0; });\r\n            \/\/ Identifiant stable par noeud : c'est la cible des textPath des\r\n            \/\/ libell\u00e9s tangentiels, elle doit survivre aux re-rendus.\r\n            nodes.forEach(function(d, i){ d.lid = i; });\r\n\r\n            svg.interrupt(\"zoom\");\r\n            g.classed(\"is-moving\", false);\r\n            arcsGroup.selectAll(\"path\").interrupt().remove();\r\n            labelsGroup.selectAll(\"text\").remove();\r\n            defs.selectAll(\"path\").remove();\r\n            defs.selectAll(\"linearGradient\").remove();\r\n            nodes.forEach(function(d){\r\n                var gradient = defs.append(\"linearGradient\").attr(\"id\", \"fis-sector-\" + d.lid)\r\n                    .attr(\"x1\", \"0%\").attr(\"y1\", \"0%\").attr(\"x2\", \"85%\").attr(\"y2\", \"100%\");\r\n                gradient.append(\"stop\").attr(\"offset\", \"0%\").attr(\"stop-color\", mix(nodeFill(d), \"#ffffff\", .18));\r\n                gradient.append(\"stop\").attr(\"offset\", \"100%\").attr(\"stop-color\", nodeFill(d));\r\n            });\r\n\r\n            pathSel = arcsGroup.selectAll(\"path\")\r\n                .data(nodes)\r\n                .join(\"path\")\r\n                .attr(\"class\", function(d){\r\n                    return \"arc\" + (d.data.projet && d.data.projet.fisNR ? \" is-nr\" : \"\");\r\n                })\r\n                .attr(\"fill\", nodePaint)\r\n                .attr(\"fill-opacity\", function(d){ return visible(d.current) ? 1 : 0; })\r\n                \/\/ Le contour blanc des arcs vient de la CSS : sans cette ligne\r\n                \/\/ il reste peint sur les arcs \u00e0 fill-opacity 0 (l'anneau des\r\n                \/\/ porteurs, hors champ \u00e0 la racine), et dessine une couronne\r\n                \/\/ fant\u00f4me translucide tout autour de la roue.\r\n                .attr(\"stroke-opacity\", function(d){ return visible(d.current) ? 1 : 0; })\r\n                .attr(\"pointer-events\", function(d){ return visible(d.current) ? \"auto\" : \"none\"; })\r\n                .attr(\"d\", function(d){ return arc(d.current); })\r\n                .attr(\"role\", \"button\")\r\n                .on(\"mouseenter\", function(e,d){ highlight(d); })\r\n                .on(\"focus\", function(e,d){ highlight(d); })\r\n                .on(\"blur\", function(){ highlight(null); })\r\n                .on(\"keydown\", function(e,d){ if (e.key === \"Enter\" || e.key === \" \"){ e.preventDefault(); onClick(e,d); } })\r\n                .on(\"mousemove\", onHover)\r\n                .on(\"mouseleave\", function(){ hideTooltip(); highlight(null); })\r\n                .on(\"click\", onClick);\r\n\r\n            pathSel.append(\"title\");\r\n            updateTitles();\r\n\r\n            labelSel = labelsGroup.selectAll(\"text\")\r\n                .data(nodes)\r\n                .join(\"text\")\r\n                .attr(\"class\", \"label\")\r\n                .attr(\"dy\", \"0.32em\")\r\n                \/\/ La taille est pos\u00e9e par paintLabel, qui mesure le rendu r\u00e9el.\r\n                .attr(\"text-anchor\", \"middle\")\r\n                \/\/ paintLabel AVANT labelFits : c'est lui qui mesure le rendu\r\n                \/\/ r\u00e9el et pose `d.tient`, dont labelFits a besoin.\r\n                .call(paintLabel)\r\n                .attr(\"opacity\", function(d){ return labelFits(d, d.current) ? 1 : 0; })\r\n                .attr(\"transform\", function(d){ return labelTransform(d.current, d); });\r\n\r\n            renderCenter();\r\n            drawRoseGrid();\r\n            renderCrumbs();\r\n            renderLegend();\r\n            renderKPI();\r\n            updateSubtitle();\r\n            setViewMode();\r\n            syncArcAccessibility();\r\n            renderExplorer();\r\n            revealPage();\r\n            document.getElementById(\"data-source\").textContent = window.__reuRoueSource === \"google-sheet\"\r\n                ? \"Corpus 2025 \u00b7 Donn\u00e9es synchronis\u00e9es\" : \"Corpus 2025 \u00b7 Donn\u00e9es de secours\";\r\n\r\n            \/\/ computeSize() (tout en haut de cette fonction) mesure la l\u00e9gende\r\n            \/\/ AVANT que renderLegend() ne la remplisse : au premier rendu, ou\r\n            \/\/ d\u00e8s que son contenu change de hauteur (nombre de th\u00e9matiques,\r\n            \/\/ bandeau plein \u00e9cran\u2026), le rayon calcul\u00e9 repose sur une l\u00e9gende\r\n            \/\/ pas encore \u00e0 sa taille r\u00e9elle. Un second passage, une fois le\r\n            \/\/ DOM \u00e0 jour, recale le disque sur la vraie mesure.\r\n            requestAnimationFrame(function(){\r\n                computeSize(); redrawStatic();\r\n                if (!hasEntered){\r\n                    hasEntered = true;\r\n                    pathSel.filter(function(d){ return visible(d.current); })\r\n                        .attr(\"fill-opacity\", 0).attr(\"stroke-opacity\", 0)\r\n                        .transition(\"intro\").delay(function(d,i){ return motion(i * 38); }).duration(motion(850)).ease(d3.easeCubicOut)\r\n                        .attr(\"fill-opacity\", 1).attr(\"stroke-opacity\", 1)\r\n                        .attrTween(\"d\", function(d){ return function(t){\r\n                            return arc({x0:d.current.x0, x1:d.current.x1, y0:d.current.y0, y1:d.current.y0 + (d.current.y1-d.current.y0)*t, k:d.current.k});\r\n                        }; });\r\n                    labelsGroup.attr(\"opacity\", 0).transition(\"intro\").delay(motion(400)).duration(motion(700)).attr(\"opacity\", 1);\r\n                    centerGroup.attr(\"opacity\", 0).transition(\"intro\").duration(motion(900)).attr(\"opacity\", 1);\r\n                }\r\n            });\r\n        }\r\n\r\n        \/\/ \u00c9quivalent texte de la roue, lu par les lecteurs d'\u00e9cran et affich\u00e9\r\n        \/\/ en infobulle native : chaque arc annonce son \u00e9tat pour l'onglet actif.\r\n        function updateTitles(){\r\n            pathSel.select(\"title\").text(function(d){\r\n                if (d.data.isTheme){\r\n                    var n = d.data.projets.filter(function(p){ return documented(p); }).length;\r\n                    return d.data.name + \" : \" + d.data.projets.length + \" projets, \"\r\n                        + n + \" renseignent au moins une dimension d'impact\";\r\n                }\r\n                if (d.data.isSousTheme){\r\n                    var nd = d.data.projets.filter(function(pp){ return documented(pp); }).length;\r\n                    return d.data.name + \" (\" + d.data.themeLabel + \") : \"\r\n                        + d.data.projets.length + \" porteur\" + (d.data.projets.length > 1 ? \"s\" : \"\")\r\n                        + \", \" + nd + \" renseignent au moins une dimension d'impact\";\r\n                }\r\n                var p = d.data.projet;\r\n                return p.porteur + \" : \"\r\n                    + (p.fisNR ? \"FIS non renseign\u00e9\" : fmtEuro(p.fisNum)) + \", impact FIS \"\r\n                    + p.empreinte + \" \/ \" + FLORA_LAYERS.length;\r\n            });\r\n        }\r\n\r\n        \/\/ Plancher de lisibilit\u00e9, et il est haut : sous 10,5 px, un nom blanc\r\n        \/\/ sur couleur ne se lit plus, il se devine. Comme le corps est commun \u00e0\r\n        \/\/ tout un anneau, laisser passer un libell\u00e9 \u00e0 9 px y ramenait TOUS les\r\n        \/\/ autres : la couronne enti\u00e8re devenait illisible pour un seul nom\r\n        \/\/ interminable. On pr\u00e9f\u00e8re donc taire celui-l\u00e0, dont le nom complet\r\n        \/\/ reste donn\u00e9 par le survol et par la fiche, et \u00e9crire les autres \u00e0\r\n        \/\/ pleine taille. Rien n'est jamais abr\u00e9g\u00e9 : c'est la d\u00e9coupe en lignes,\r\n        \/\/ et non la loupe, qui fait tenir les intitul\u00e9s.\r\n        var LABEL_MAX = 13, LABEL_MIN = 10;   \/\/ LABEL_MAX est repos\u00e9 par computeSize\r\n        var LABEL_LH = 1.06;          \/\/ interligne, en em\r\n        var LABEL_LIGNES_MAX = 4;     \/\/ au-del\u00e0, un libell\u00e9 d'arc devient un paragraphe\r\n        var LABEL_JEU_ARC = 12;       \/\/ respiration aux deux bouts d'une ligne courbe\r\n        var LABEL_JEU_PILE = 6;       \/\/ idem, de part et d'autre d'une pile\r\n        \/\/ Marges d'un bloc droit dans sa case, distinctes selon le bord.\r\n        \/\/ Sur les C\u00d4T\u00c9S, la marge se paie deux fois : deux voisins qui\r\n        \/\/ remplissent chacun sa case jusqu'au trait se retrouvent coll\u00e9s, et\r\n        \/\/ l'on ne sait plus lequel nomme quoi. Mais elle se paie aussi en\r\n        \/\/ corps, et cher : un secteur de 36 degr\u00e9s perd trois points de police\r\n        \/\/ par degr\u00e9 retranch\u00e9. Au-del\u00e0 d'une dizaine de pixels, l'anneau bascule\r\n        \/\/ en radial et tous les noms se couchent, ce qui est pire que deux\r\n        \/\/ voisins un peu proches. Les bords INT\u00c9RIEUR et EXT\u00c9RIEUR, eux, ne\r\n        \/\/ touchent aucun texte : une marge \u00e9troite y suffit.\r\n        var LABEL_JEU_COTE = 9;\r\n        var LABEL_JEU_BORD = 6;\r\n\r\n        \/\/ L'orientation est une propri\u00e9t\u00e9 de l'ANNEAU, jamais de l'arc : deux\r\n        \/\/ orientations dans une m\u00eame couronne rendent la lecture p\u00e9nible. Mais\r\n        \/\/ elle n'est plus d\u00e9cid\u00e9e d'avance. Selon le niveau de zoom, c'est\r\n        \/\/ tant\u00f4t le d\u00e9velopp\u00e9 de l'arc et tant\u00f4t l'\u00e9paisseur de l'anneau qui\r\n        \/\/ offre le plus de place, et se tromper de sens co\u00fbtait plusieurs points\r\n        \/\/ de corps. paintLabel essaie donc les deux pour toute la couronne et\r\n        \/\/ retient celle qui autorise la plus grosse police ; ORIENT garde ce\r\n        \/\/ choix entre deux mises en page, pour ceux qui ont besoin de le\r\n        \/\/ conna\u00eetre (placement, animation).\r\n        \/\/ Trois sens de lecture, dans l'ordre de pr\u00e9f\u00e9rence \u00e0 \u00e9galit\u00e9 :\r\n        \/\/ \u00ab droit \u00bb \u00e9crit \u00e0 l'horizontale, \u00ab tangent \u00bb le long de l'arc,\r\n        \/\/ \u00ab radial \u00bb dress\u00e9 dans l'\u00e9paisseur de l'anneau.\r\n        var ORIENTS = [\"droit\", \"tangent\", \"radial\"];\r\n        var ORIENT = {};\r\n        function labelOrient(d){\r\n            return ORIENT[d.depth] || (d.depth === focus.depth + 1 ? \"droit\" : \"radial\");\r\n        }\r\n\r\n        \/\/ Les deux ressources d'une case, selon le sens de lecture. En\r\n        \/\/ tangentiel la ligne suit l'arc et la pile s'\u00e9paissit vers le bord ;\r\n        \/\/ en radial c'est exactement l'inverse.\r\n        function placeLigne(box, orient, r){\r\n            if (orient === \"tangent\") return (box.x1 - box.x0) * r - LABEL_JEU_ARC;\r\n            return labelEpaisseur(box);\r\n        }\r\n        function placePile(box, orient){\r\n            if (orient === \"tangent\") return labelEpaisseur(box);\r\n            return (box.x1 - box.x0) * labelMidR(box) - LABEL_JEU_PILE;\r\n        }\r\n        \/\/ Rayon de chaque ligne d'une pile tangentielle. La pile est CENTR\u00c9E\r\n        \/\/ dans l'\u00e9paisseur de l'anneau : une version ant\u00e9rieure l'adossait au\r\n        \/\/ bord ext\u00e9rieur pour gagner du d\u00e9velopp\u00e9, mais le texte semblait alors\r\n        \/\/ appartenir \u00e0 l'anneau voisin et laissait sous lui une large bande\r\n        \/\/ vide. Dans la moiti\u00e9 basse du disque le texte est retourn\u00e9 : la\r\n        \/\/ premi\u00e8re ligne s'y empile vers le centre, ailleurs vers le bord. Dans\r\n        \/\/ les deux cas elle se lit en haut de la pile.\r\n        function rayonsPile(box, n, taille){\r\n            var c = labelMidR(box), sens = labelFlip(box) ? -1 : 1, rs = [];\r\n            for (var i = 0; i < n; i++) rs.push(c + sens * ((n - 1) \/ 2 - i) * LABEL_LH * taille);\r\n            return rs;\r\n        }\r\n\r\n        \/\/ Une case qui occupe tout le tour est un cas \u00e0 part : ses deux c\u00f4t\u00e9s\r\n        \/\/ se confondent. Son texte se pose en haut du cercle, \u00e0 l'endroit.\r\n        function labelTour(box){ return (box.x1 - box.x0) >= 2 * Math.PI - 0.001; }\r\n\r\n        \/\/ Dans la moiti\u00e9 basse du disque, un arc parcouru dans le sens des\r\n        \/\/ angles croissants porterait son texte la t\u00eate en bas : on le\r\n        \/\/ retourne. Le sens d\u00e9cide aussi de quel c\u00f4t\u00e9 empiler les lignes.\r\n        function labelFlip(box){\r\n            if (labelTour(box)) return false;\r\n            var am = (box.x0 + box.x1) \/ 2;\r\n            return am > Math.PI \/ 2 && am < Math.PI * 1.5;\r\n        }\r\n\r\n        \/\/ Chemin d'appui d'une ligne tangentielle : l'arc de rayon r, born\u00e9\r\n        \/\/ par les deux c\u00f4t\u00e9s de la case.\r\n        function labelArcPath(box, r){\r\n            var a0 = box.x0, a1 = box.x1;\r\n            var pt = function(a){ return [(r * Math.sin(a)).toFixed(2), (-r * Math.cos(a)).toFixed(2)]; };\r\n            var arcVers = function(p, grand, sens){\r\n                return \"A\" + r.toFixed(2) + \",\" + r.toFixed(2) + \" 0 \" + grand + \" \" + sens\r\n                     + \" \" + p[0] + \",\" + p[1];\r\n            };\r\n            \/\/ Tour complet : un arc dont le d\u00e9part et l'arriv\u00e9e se confondent\r\n            \/\/ d\u00e9g\u00e9n\u00e8re en un point, et le texte n'a plus de chemin o\u00f9 s'\u00e9crire\r\n            \/\/ \u2014 c'est ce qui rendait muette une sous-th\u00e9matique \u00e0 porteur\r\n            \/\/ unique. On trace le cercle entier en deux demi-tours, en partant\r\n            \/\/ du BAS pour que son milieu, o\u00f9 le texte est centr\u00e9, tombe en\r\n            \/\/ haut et se lise \u00e0 l'endroit.\r\n            if (labelTour(box)){\r\n                return \"M\" + pt(Math.PI).join(\",\")\r\n                     + arcVers(pt(2 * Math.PI), 0, 1)\r\n                     + arcVers(pt(3 * Math.PI), 0, 1);\r\n            }\r\n            var flip = labelFlip(box);\r\n            var grand = (a1 - a0) > Math.PI ? 1 : 0;\r\n            var d0 = flip ? pt(a1) : pt(a0), d1 = flip ? pt(a0) : pt(a1);\r\n            return \"M\" + d0.join(\",\") + arcVers(d1, grand, flip ? 0 : 1);\r\n        }\r\n\r\n        \/\/ ---- Texte droit --------------------------------------------------\r\n        \/\/ La troisi\u00e8me orientation, et la seule qui se lise sans pencher la\r\n        \/\/ t\u00eate : le libell\u00e9 s'\u00e9crit \u00e0 l'horizontale, centr\u00e9 dans sa case. Elle\r\n        \/\/ n'a de sens que si le bloc tient VRAIMENT dans le secteur, or un\r\n        \/\/ secteur d'anneau n'est pas un rectangle. D'o\u00f9 un test men\u00e9 sur tout\r\n        \/\/ le contour du bloc et pas sur ses seuls coins : le point du bloc le\r\n        \/\/ plus proche du centre du disque tombe presque toujours au milieu d'un\r\n        \/\/ c\u00f4t\u00e9, jamais dans un angle.\r\n\r\n        \/\/ O\u00f9 se pose un libell\u00e9 droit : le centre de gravit\u00e9 de la case. Pour\r\n        \/\/ un tour complet, dont les deux c\u00f4t\u00e9s se confondent, on le pose en haut\r\n        \/\/ de l'anneau, l\u00e0 o\u00f9 le regard va d'abord.\r\n        function centreCase(box){\r\n            var a = labelTour(box) ? 0 : (box.x0 + box.x1) \/ 2;\r\n            var r = labelMidR(box);\r\n            return [r * Math.sin(a), -r * Math.cos(a)];\r\n        }\r\n\r\n        \/\/ (x, y) tombe-t-il dans la case, marges gard\u00e9es sur chaque bord ?\r\n        function dansCase(box, x, y){\r\n            var r0 = rIn(box) + LABEL_JEU_BORD, r1 = rOut(box) - LABEL_JEU_BORD;\r\n            var r = Math.sqrt(x * x + y * y);\r\n            if (r < r0) return false;\r\n            if (r > r1) return false;\r\n            if (labelTour(box)) return true;\r\n            \/\/ La marge de c\u00f4t\u00e9, exprim\u00e9e en angle au rayon o\u00f9 l'on se trouve.\r\n            var jeu = LABEL_JEU_COTE \/ Math.max(r, 1);\r\n            var a0 = box.x0 + jeu, a1 = box.x1 - jeu;\r\n            if (a1 <= a0) return false;\r\n            var a = Math.atan2(x, -y);          \/\/ 0 en haut, sens horaire\r\n            while (a < a0 - 1e-9) a += 2 * Math.PI;\r\n            return a <= a1 + 1e-9;\r\n        }\r\n\r\n        \/\/ Un bloc de largeur l et de hauteur h, centr\u00e9 sur centreCase, tient-il ?\r\n        \/\/ Cinq points par c\u00f4t\u00e9 suffisent : \u00e0 cette \u00e9chelle le rayon et l'angle\r\n        \/\/ varient lentement le long d'une ar\u00eate.\r\n        function blocTient(box, l, h){\r\n            var c = centreCase(box), hw = l \/ 2, hh = h \/ 2, i, k;\r\n            for (i = 0; i <= 4; i++){\r\n                k = -hw + (l * i) \/ 4;\r\n                if (!dansCase(box, c[0] + k, c[1] - hh)) return false;\r\n                if (!dansCase(box, c[0] + k, c[1] + hh)) return false;\r\n            }\r\n            for (i = 1; i <= 3; i++){\r\n                k = -hh + (h * i) \/ 4;\r\n                if (!dansCase(box, c[0] - hw, c[1] + k)) return false;\r\n                if (!dansCase(box, c[0] + hw, c[1] + k)) return false;\r\n            }\r\n            return true;\r\n        }\r\n\r\n        \/\/ Plus gros corps auquel ce bloc tient encore. Le rapport largeur sur\r\n        \/\/ hauteur du bloc ne d\u00e9pend pas du corps : une dichotomie de douze pas\r\n        \/\/ cerne le point de bascule bien en de\u00e7\u00e0 du dixi\u00e8me de pixel.\r\n        function tailleDroite(box, larg, n){\r\n            var haut = pileEm(n) * LABEL_MAX;\r\n            if (blocTient(box, larg, haut)) return LABEL_MAX;\r\n            var bas = 0, plafond = LABEL_MAX, i, m;\r\n            for (i = 0; i < 12; i++){\r\n                m = (bas + plafond) \/ 2;\r\n                if (blocTient(box, larg * m \/ LABEL_MAX, pileEm(n) * m)) bas = m;\r\n                else plafond = m;\r\n            }\r\n            return bas;\r\n        }\r\n\r\n        \/\/ ---- Mesure -------------------------------------------------------\r\n        \/\/ Toute la mise en page repose sur des largeurs MESUR\u00c9ES, jamais\r\n        \/\/ estim\u00e9es : supposer 0,56 em par caract\u00e8re coupait trop t\u00f4t les mots\r\n        \/\/ \u00e9troits et laissait d\u00e9border les larges. Mais mesurer co\u00fbte une mise\r\n        \/\/ en page du navigateur, et il faut comparer des dizaines de d\u00e9coupes\r\n        \/\/ dans deux orientations. On \u00e9crit donc l'intitul\u00e9 entier UNE fois, puis\r\n        \/\/ getSubStringLength donne la largeur de n'importe quel morceau contigu\r\n        \/\/ sans rien r\u00e9\u00e9crire : le reste n'est plus que du calcul.\r\n        function mesurerMots(el, nom){\r\n            var t = d3.select(el);\r\n            t.selectAll(\"tspan\").remove();\r\n            t.selectAll(\"textPath\").remove();\r\n            t.attr(\"font-size\", LABEL_MAX + \"px\");\r\n            var noeud = t.append(\"tspan\").attr(\"x\", 0).text(nom).node();\r\n            var bornes = [], re = \/\\S+\/g, m;\r\n            while ((m = re.exec(nom))) bornes.push({ d: m.index, f: m.index + m[0].length });\r\n            if (!bornes.length) bornes.push({ d: 0, f: nom.length });\r\n            var total = noeud.getComputedTextLength();\r\n            return {\r\n                mots: bornes.map(function(b){ return nom.slice(b.d, b.f); }),\r\n                n: bornes.length,\r\n                \/\/ Largeur des mots a..b r\u00e9unis, \u00e0 LABEL_MAX.\r\n                largeur: function(a, b){\r\n                    if (a > b) return 0;\r\n                    if (a === 0 && b === bornes.length - 1) return total;\r\n                    try { return noeud.getSubStringLength(bornes[a].d, bornes[b].f - bornes[a].d); }\r\n                    catch (e){ return total; }\r\n                }\r\n            };\r\n        }\r\n\r\n        \/\/ D\u00e9coupe en n lignes contigu\u00ebs en \u00e9galisant les LARGEURS mesur\u00e9es, et\r\n        \/\/ non les nombres de caract\u00e8res : couper au premier espace venu laissait\r\n        \/\/ \u00ab D\u00e9cloisonnement \/ sant\u00e9 \u00bb avec une ligne deux fois plus longue que\r\n        \/\/ l'autre, donc une police inutilement r\u00e9duite. Un intitul\u00e9 d'arc tient\r\n        \/\/ en quelques mots : essayer toutes les d\u00e9coupes co\u00fbte moins cher qu'une\r\n        \/\/ heuristique. Renvoie null s'il n'y a pas assez de mots.\r\n        function decouper(mesure, n){\r\n            if (n > mesure.n) return null;\r\n            if (n === 1) return [[0, mesure.n - 1]];\r\n            var best = null, coupes = [];\r\n            (function choisir(debut, reste){\r\n                if (reste === 0){\r\n                    var groupes = [], prev = 0, i, pire = 0;\r\n                    for (i = 0; i < coupes.length; i++){ groupes.push([prev, coupes[i] - 1]); prev = coupes[i]; }\r\n                    groupes.push([prev, mesure.n - 1]);\r\n                    for (i = 0; i < groupes.length; i++){\r\n                        pire = Math.max(pire, mesure.largeur(groupes[i][0], groupes[i][1]));\r\n                    }\r\n                    if (!best || pire < best.p) best = { p: pire, g: groupes };\r\n                    return;\r\n                }\r\n                for (var k = debut; k <= mesure.n - reste; k++){\r\n                    coupes.push(k); choisir(k + 1, reste - 1); coupes.pop();\r\n                }\r\n            })(1, n - 1);\r\n            return best ? best.g : null;\r\n        }\r\n\r\n        \/\/ Taille \u00e0 laquelle ce d\u00e9coupage tiendrait dans cette case, sans jamais\r\n        \/\/ d\u00e9passer LABEL_MAX. Pur calcul : les largeurs viennent de mesurerMots.\r\n        function taillePour(box, orient, groupes, mesure){\r\n            var n = groupes.length, i;\r\n            var W = groupes.map(function(g){ return mesure.largeur(g[0], g[1]); });\r\n            \/\/ Droit : ni une longueur d'arc ni une \u00e9paisseur ne d\u00e9cide, mais la\r\n            \/\/ forme enti\u00e8re du secteur. On va donc chercher le corps directement.\r\n            if (orient === \"droit\"){\r\n                var large = 0;\r\n                for (i = 0; i < n; i++) large = Math.max(large, W[i]);\r\n                return large > 0.5 ? tailleDroite(box, large, n) : LABEL_MAX;\r\n            }\r\n            var plafondPile = placePile(box, orient) \/ pileEm(n);\r\n            if (orient !== \"tangent\"){\r\n                var pire = 0;\r\n                for (i = 0; i < n; i++) pire = Math.max(pire, W[i]);\r\n                var t = pire > 0.5 ? LABEL_MAX * placeLigne(box, orient, 0) \/ pire : LABEL_MAX;\r\n                return Math.max(0, Math.min(LABEL_MAX, t, plafondPile));\r\n            }\r\n            \/\/ Tangentiel : la place d'une ligne d\u00e9pend du rayon o\u00f9 elle se pose,\r\n            \/\/ qui d\u00e9pend lui-m\u00eame de la taille du texte. Trois passes font\r\n            \/\/ converger ce point fixe largement en de\u00e7\u00e0 du dixi\u00e8me de pixel.\r\n            var taille = LABEL_MAX, passe, rs, cap;\r\n            for (passe = 0; passe < 3; passe++){\r\n                rs = rayonsPile(box, n, taille);\r\n                cap = LABEL_MAX;\r\n                for (i = 0; i < n; i++){\r\n                    if (W[i] > 0.5) cap = Math.min(cap, LABEL_MAX * placeLigne(box, orient, rs[i]) \/ W[i]);\r\n                }\r\n                taille = Math.max(0.5, cap);\r\n            }\r\n            return Math.max(0, Math.min(LABEL_MAX, taille, plafondPile));\r\n        }\r\n\r\n        \/\/ Meilleure mise en page d'un intitul\u00e9 dans une orientation : le moins\r\n        \/\/ de lignes possible pour la plus grosse police possible.\r\n        function meilleurPlan(box, orient, mesure){\r\n            var best = null;\r\n            for (var n = 1; n <= LABEL_LIGNES_MAX; n++){\r\n                \/\/ Le pr\u00e9-filtre ne vaut que pour les orientations dont la place\r\n                \/\/ se r\u00e9sume \u00e0 une seule mesure ; en droit, c'est tailleDroite\r\n                \/\/ qui tranche.\r\n                if (orient !== \"droit\" && pileEm(n) * LABEL_MIN > placePile(box, orient)) break;\r\n                var g = decouper(mesure, n);\r\n                if (!g) break;\r\n                var t = taillePour(box, orient, g, mesure);\r\n                \/\/ \u00c0 taille \u00e9gale, moins de lignes : un intitul\u00e9 court n'a aucune\r\n                \/\/ raison d'\u00eatre coup\u00e9 en deux.\r\n                if (!best || t > best.taille + 0.05) best = { taille: t, groupes: g };\r\n                if (best.taille >= LABEL_MAX - 0.01) break;\r\n            }\r\n            return best;\r\n        }\r\n\r\n        \/\/ \u00c9crit les lignes dans la case, \u00e0 la taille donn\u00e9e.\r\n        function ecrire(el, d, box, orient, groupes, mesure, taille){\r\n            var t = d3.select(el);\r\n            var lignes = groupes.map(function(g){ return mesure.mots.slice(g[0], g[1] + 1).join(\" \"); });\r\n            t.attr(\"font-size\", taille.toFixed(2) + \"px\");\r\n            \/\/ Le halo suit le corps du texte. Fig\u00e9 \u00e0 2,4 px, il cernait un\r\n            \/\/ libell\u00e9 de 13 px d'un liser\u00e9 grav\u00e9 et se perdait sous un libell\u00e9\r\n            \/\/ de trente : c'est une \u00e9paisseur RELATIVE qu'il faut, pas absolue.\r\n            t.style(\"stroke-width\", (taille * 0.12).toFixed(2) + \"px\");\r\n            t.selectAll(\"tspan\").remove();\r\n            t.selectAll(\"textPath\").remove();\r\n            if (orient === \"tangent\"){\r\n                var rs = rayonsPile(box, lignes.length, taille);\r\n                lignes.forEach(function(l, i){\r\n                    \/\/ Un chemin d'appui par ligne ET par case : son identifiant\r\n                    \/\/ est d\u00e9riv\u00e9 du noeud, pas d'un compteur, pour survivre aux\r\n                    \/\/ re-rendus.\r\n                    var pid = \"reu-lp-\" + d.lid + \"-\" + i;\r\n                    var chemin = defs.select(\"#\" + pid);\r\n                    if (chemin.empty()) chemin = defs.append(\"path\").attr(\"id\", pid);\r\n                    chemin.attr(\"d\", labelArcPath(box, rs[i]));\r\n                    t.append(\"textPath\")\r\n                        .attr(\"startOffset\", \"50%\")\r\n                        .attr(\"href\", \"#\" + pid)\r\n                        .attr(\"xlink:href\", \"#\" + pid)\r\n                        .text(l);\r\n                });\r\n                return;\r\n            }\r\n            lignes.forEach(function(l, i){\r\n                t.append(\"tspan\")\r\n                    .attr(\"x\", 0)\r\n                    \/\/ Le texte est ancr\u00e9 sur sa LIGNE DE BASE, qui passe sous\r\n                    \/\/ les capitales : une pile pos\u00e9e \u00e0 dy nul para\u00eet appuy\u00e9e\r\n                    \/\/ vers le haut de sa case. Le tiers de cadratin la redresse\r\n                    \/\/ optiquement au milieu.\r\n                    .attr(\"dy\", i === 0\r\n                        ? (0.33 - (lignes.length - 1) * LABEL_LH \/ 2).toFixed(3) + \"em\"\r\n                        : LABEL_LH + \"em\")\r\n                    .text(l);\r\n            });\r\n        }\r\n\r\n        function viderLabel(el, d){\r\n            var t = d3.select(el);\r\n            t.selectAll(\"tspan\").remove();\r\n            t.selectAll(\"textPath\").remove();\r\n            d.tient = false;\r\n        }\r\n\r\n        \/\/ ---- Mise en page d'un anneau entier ------------------------------\r\n        \/\/ En trois temps.\r\n        \/\/\r\n        \/\/ 1. Chaque intitul\u00e9 est mesur\u00e9 une fois ; on en d\u00e9duit par le calcul ce\r\n        \/\/    que donnerait chaque d\u00e9coupe, dans les deux orientations.\r\n        \/\/ 2. Par ANNEAU : on retient l'orientation qui permet la plus grosse\r\n        \/\/    police, puis la plus PETITE des tailles de l'anneau. Tous les\r\n        \/\/    libell\u00e9s d'une m\u00eame couronne s'\u00e9crivent donc au m\u00eame corps et dans\r\n        \/\/    le m\u00eame sens. Les laisser chacun \u00e0 son optimum donnait une couronne\r\n        \/\/    o\u00f9 un nom court s'affichait \u00e0 13 px \u00e0 c\u00f4t\u00e9 d'un nom long \u00e0 9 :\r\n        \/\/    illisible comme ensemble, m\u00eame si chaque libell\u00e9, pris seul,\r\n        \/\/    tenait dans sa case.\r\n        \/\/ 3. On \u00e9crit, centr\u00e9 dans l'\u00e9paisseur de l'anneau.\r\n        \/\/\r\n        \/\/ Et on n'abr\u00e8ge JAMAIS : un intitul\u00e9 tronqu\u00e9 par des points de\r\n        \/\/ suspension ne dit plus rien. Un libell\u00e9 qui ne peut pas atteindre le\r\n        \/\/ plancher de lisibilit\u00e9 est tu, et il ne tire pas son anneau vers le\r\n        \/\/ bas ; son identit\u00e9 passe par le survol et par la fiche.\r\n        function paintLabel(sel, versCible){\r\n            var fiches = [], anneaux = {};\r\n            sel.each(function(d){\r\n                var box = (versCible && d.target) ? d.target : (d.current || d);\r\n                if (!labelUtile(d, box)){ viderLabel(this, d); return; }\r\n                \/\/ Encre et halo sont pos\u00e9s ici, pas au moment du join : un\r\n                \/\/ libell\u00e9 change d'anneau au zoom.\r\n                d3.select(this)\r\n                    .style(\"fill\", labelInk(nodeFill(d)))\r\n                    .style(\"stroke\", labelHalo(nodeFill(d)))\r\n                    .style(\"font-weight\", 650);\r\n                var mesure = mesurerMots(this, labelText(d));\r\n                var fiche = { el: this, d: d, box: box, mesure: mesure };\r\n                var a = anneaux[d.depth] || (anneaux[d.depth] = { nb: {} });\r\n                ORIENTS.forEach(function(o){\r\n                    var p = fiche[o] = meilleurPlan(box, o, mesure);\r\n                    if (a[o] == null){ a[o] = LABEL_MAX; a.nb[o] = 0; }\r\n                    if (p && p.taille >= LABEL_MIN){\r\n                        a[o] = Math.min(a[o], p.taille);\r\n                        a.nb[o]++;\r\n                    }\r\n                });\r\n                fiches.push(fiche);\r\n            });\r\n\r\n            Object.keys(anneaux).forEach(function(k){\r\n                var a = anneaux[k];\r\n                \/\/ Le sens de lecture est une propri\u00e9t\u00e9 de l'ANNEAU, jamais d'un\r\n                \/\/ arc : deux orientations dans une m\u00eame couronne rendent la\r\n                \/\/ lecture p\u00e9nible. Il se d\u00e9cide en trois temps.\r\n                \/\/\r\n                \/\/ 1. On garde les orientations qui NOMMENT LE PLUS DE CASES. Un\r\n                \/\/    anneau qui nomme cinq arcs renseigne mieux qu'un anneau qui\r\n                \/\/    en nomme un, m\u00eame en plus gros.\r\n                \/\/ 2. Parmi elles, le DROIT l'emporte tant qu'il reste dans les\r\n                \/\/    trois quarts du meilleur corps. Un nom \u00e9crit \u00e0\r\n                \/\/    l'horizontale se lit d'un coup d'oeil ; le m\u00eame nom couch\u00e9\r\n                \/\/    le long d'un arc ou dress\u00e9 dans l'\u00e9paisseur se d\u00e9chiffre,\r\n                \/\/    f\u00fbt-il plus gros. Quelques points de corps ne rach\u00e8tent pas\r\n                \/\/    une t\u00eate pench\u00e9e. C'\u00e9tait tout le d\u00e9faut des anneaux \u00e0\r\n                \/\/    trois ou quatre cases, o\u00f9 des secteurs immenses portaient\r\n                \/\/    un filet de texte inclin\u00e9.\r\n                \/\/ 3. \u00c0 d\u00e9faut, le plus gros corps, le tangentiel l'emportant \u00e0\r\n                \/\/    \u00e9galit\u00e9 : il rattache plus clairement le texte \u00e0 son arc.\r\n                var nbMax = 0;\r\n                ORIENTS.forEach(function(o){ nbMax = Math.max(nbMax, a.nb[o]); });\r\n                var tenus = ORIENTS.filter(function(o){ return a.nb[o] === nbMax; });\r\n                var mieux = tenus[0];\r\n                tenus.forEach(function(o){ if (a[o] > a[mieux] + 0.01) mieux = o; });\r\n                a.sens = (tenus.indexOf(\"droit\") >= 0 && a.droit >= a[mieux] * 0.7)\r\n                    ? \"droit\" : mieux;\r\n                a.taille = a[a.sens];\r\n                ORIENT[k] = a.sens;\r\n            });\r\n\r\n            fiches.forEach(function(f){\r\n                var a = anneaux[f.d.depth];\r\n                var plan = f[a.sens];\r\n                if (!plan || a.taille < LABEL_MIN\r\n                        || taillePour(f.box, a.sens, plan.groupes, f.mesure) < a.taille - 0.01){\r\n                    viderLabel(f.el, f.d);\r\n                    return;\r\n                }\r\n                \/\/ Au corps de l'anneau, un intitul\u00e9 tient souvent sur moins de\r\n                \/\/ lignes qu'\u00e0 son optimum personnel : on cherche la d\u00e9coupe la\r\n                \/\/ plus sobre qui tienne encore \u00e0 cette taille-l\u00e0.\r\n                var groupes = plan.groupes;\r\n                for (var n = 1; n < groupes.length; n++){\r\n                    var essai = decouper(f.mesure, n);\r\n                    if (essai && taillePour(f.box, a.sens, essai, f.mesure) >= a.taille - 0.01){\r\n                        groupes = essai; break;\r\n                    }\r\n                }\r\n                ecrire(f.el, f.d, f.box, a.sens, groupes, f.mesure, a.taille);\r\n                f.d.tient = true;\r\n            });\r\n        }\r\n\r\n        \/\/ En tangentiel, c'est le chemin d'appui qui place le texte : toute\r\n        \/\/ transformation ici le d\u00e9crocherait de sa courbe.\r\n        function labelTransform(box, d){\r\n            var sens = d ? labelOrient(d) : \"radial\";\r\n            if (sens === \"tangent\") return null;\r\n            \/\/ Droit : aucune rotation, le bloc est simplement port\u00e9 au centre\r\n            \/\/ de gravit\u00e9 de sa case.\r\n            if (sens === \"droit\"){\r\n                var c = centreCase(box);\r\n                return \"translate(\" + c[0].toFixed(2) + \",\" + c[1].toFixed(2) + \")\";\r\n            }\r\n            var x = (box.x0 + box.x1) \/ 2 * 180 \/ Math.PI;\r\n            var y = labelMidR(box);\r\n            \/\/ Radial, retourn\u00e9 dans la moiti\u00e9 gauche pour ne jamais se lire\r\n            \/\/ \u00e0 l'envers.\r\n            return \"rotate(\" + (x - 90) + \") translate(\" + y + \",0) rotate(\" + (x < 180 ? 0 : 180) + \")\";\r\n        }\r\n\r\n        \/\/ Fil d'Ariane retir\u00e9 de l'interface : le retour au centre du disque\r\n        \/\/ (clic sur le coeur, \u00ab \u2039 retour \u00bb) reste le seul chemin de navigation\r\n        \/\/ vers le haut. La fonction garde son point d'appel (appel\u00e9 \u00e0 chaque\r\n        \/\/ zoom) mais ne peuple plus rien.\r\n        function renderCrumbs(){\r\n            var el = document.getElementById(\"crumbs\");\r\n            if (!el) return;\r\n            if (isScoped() || !root){ el.hidden = true; return; }\r\n            el.hidden = false;\r\n            var chaine = [], n = focus;\r\n            while (n){ chaine.unshift(n); n = n.parent; }\r\n            el.innerHTML = chaine.map(function(node, i){\r\n                var dernier = i === chaine.length - 1;\r\n                var nom = node === root ? \"Toutes les th\u00e9matiques\" : labelText(node);\r\n                return '<button class=\"crumb' + (dernier ? \" is-current\" : \"\") + '\" type=\"button\" data-i=\"' + i + '\">'\r\n                    + escapeHTML(nom) + '<\\\/button>';\r\n            }).join('<span class=\"crumb-sep\" aria-hidden=\"true\">\u203a<\\\/span>');\r\n            el.querySelectorAll(\".crumb\").forEach(function(b){\r\n                b.addEventListener(\"click\", function(){\r\n                    var node = chaine[+b.getAttribute(\"data-i\")];\r\n                    if (node && node !== focus){ closeDetail(); zoomTo(node); }\r\n                });\r\n            });\r\n        }\r\n\r\n        function renderCenter(){\r\n            centerGroup.selectAll(\"*\").remove();\r\n            centerGroup.append(\"circle\")\r\n                .attr(\"class\", \"center-hit\")\r\n                .attr(\"r\", innerR - 8)\r\n                .attr(\"fill\", \"#fffef9\")\r\n                .attr(\"stroke\", \"#e2e7df\")\r\n                .attr(\"stroke-width\", 1)\r\n                .attr(\"fill-opacity\", 1)\r\n                .attr(\"role\", \"button\").attr(\"tabindex\", 0)\r\n                .on(\"click\", centerBack)\r\n                .on(\"keydown\", function(e){ if (e.key === \"Enter\" || e.key === \" \"){ e.preventDefault(); centerBack(); } });\r\n            centerLabel = centerGroup.append(\"text\").attr(\"class\", \"center-text\");\r\n            updateCenterLabel();\r\n        }\r\n\r\n        function centerBack(){ closeDetail(); if (focus !== root) zoomTo(focus.parent || root); }\r\n        function updateCenterLabel(){\r\n            if (!centerLabel) return;\r\n            var isRoot = focus === root;\r\n            var scale = Math.min(1.25, innerR \/ 98);\r\n            var list = isRoot ? PROJETS : (focus.data.projets || []);\r\n            centerLabel.selectAll(\"*\").remove();\r\n            var rows = isRoot\r\n                \/\/ Le compte de projets, le nombre de th\u00e9matiques et le\r\n                \/\/ mill\u00e9sime sont d\u00e9j\u00e0 lus dans l'en-t\u00eate : les r\u00e9p\u00e9ter au\r\n                \/\/ centre alourdissait la roue sans rien apprendre. Le coeur ne\r\n                \/\/ porte plus que le nom du fonds.\r\n                ? [{text:\"FONDS D\u2019INNOVATION\", y:-6, size:10, weight:700, ink:\"#718784\"},\r\n                   {text:\"SOCIALE\", y:12, size:10, weight:700, ink:\"#718784\"}]\r\n                : [{text:\"\u2190 RETOUR\",y:-38,size:8,weight:700,ink:\"#5d7c76\"}]\r\n                    .concat(wrapWords(labelText(focus), 18).slice(0,3).map(function(text,i,arr){\r\n                        return {text:text,y: -6 - (arr.length-1)*7 + i*15,size:12,weight:700,ink:\"#203e49\"};\r\n                    }))\r\n                    .concat([{text:list.length + \" projet\" + (list.length>1?\"s\":\"\"),y:40,size:9,weight:500,ink:\"#718784\"}]);\r\n            rows.forEach(function(l){\r\n                centerLabel.append(\"tspan\").attr(\"x\",0).attr(\"y\", l.y*scale)\r\n                    .attr(\"font-size\", Math.max(l.size <= 9 ? 7.5 : 9, l.size*scale)).attr(\"font-weight\",l.weight).attr(\"fill\",l.ink)\r\n                    .attr(\"letter-spacing\", l.size<=8 ? .8*scale : -.5*scale).text(l.text);\r\n            });\r\n            centerGroup.select(\"circle\").attr(\"aria-label\",isRoot ? \"Vue d\u2019ensemble, \" + list.length + \" projets\" : \"Revenir au niveau pr\u00e9c\u00e9dent\");\r\n        }\r\n\r\n        function wrapWords(text, maxChars){\r\n            var words = String(text).split(\/\\s+\/), lines = [], cur = \"\";\r\n            words.forEach(function(w){\r\n                var next = cur ? cur + \" \" + w : w;\r\n                if (next.length > maxChars && cur){ lines.push(cur); cur = w; }\r\n                else cur = next;\r\n            });\r\n            if (cur) lines.push(cur);\r\n            return lines.slice(0, 3);\r\n        }\r\n\r\n        \/\/ ============ 5 bis. RADAR DES FREINS ============\r\n        \/\/ Un projet peut cumuler plusieurs freins : chaque axe compte le nombre\r\n        \/\/ de PROJETS concern\u00e9s, les axes ne s'additionnent donc pas \u00e0 100 %.\r\n        var radarScope = null; \/\/ null = tout le corpus, sinon une cl\u00e9 de th\u00e9matique\r\n\r\n        function radarProjets(){\r\n            return radarScope ? (byTheme.get(radarScope) || []) : PROJETS;\r\n        }\r\n        function radarCounts(){\r\n            var list = radarProjets();\r\n            return FREINS.map(function(f){\r\n                return {\r\n                    frein: f,\r\n                    n: list.filter(function(p){ return p.freinSet.indexOf(f.code) !== -1; }).length\r\n                };\r\n            });\r\n        }\r\n\r\n        \/\/ Le radar s'ouvre au lieu d'apparaitre : les anneaux s'\u00e9cartent du\r\n        \/\/ centre, un filet balaye le cadran, le polygone monte de z\u00e9ro vers ses\r\n        \/\/ valeurs, puis seulement les textes se posent en fondu \u00e9chelonn\u00e9.\r\n        \/\/ Rien ne se lit pendant que \u00e7a bouge.\r\n        function renderRadar(anim){\r\n            radarGroup.selectAll(\"*\").remove();\r\n            radarGroup.interrupt(\"radar\");\r\n\r\n            var list = radarProjets();\r\n            var data = radarCounts();\r\n            var maxN = Math.max(1, d3.max(data, function(d){ return d.n; }));\r\n            \/\/ Paliers entiers lisibles (jamais de demi-projet sur un axe).\r\n            var step = maxN <= 4 ? 1 : Math.ceil(maxN \/ 4);\r\n            var top = Math.ceil(maxN \/ step) * step;\r\n\r\n            var rOuter = Math.max(45, Math.min(radius * 0.86, 290, (width - 172) \/ 2));\r\n            var scale = d3.scaleLinear().domain([0, top]).range([0, rOuter]);\r\n            var angle = function(i){ return (i \/ FREINS.length) * 2 * Math.PI - Math.PI \/ 2; };\r\n            var pt = function(i, v){\r\n                var a = angle(i), r = scale(v);\r\n                return [Math.cos(a) * r, Math.sin(a) * r];\r\n            };\r\n            var anime = anim !== false && !reducedMotion.matches;\r\n            \/\/ Rep\u00e8res de la partition, en millisecondes.\r\n            var T_GRILLE = 0, T_AXES = 140, T_TRACE = 420, T_POINTS = 480, T_TEXTE = 1320;\r\n\r\n            var grid = radarGroup.append(\"g\").attr(\"class\", \"radar-grid\");\r\n            var anneaux = [];\r\n            for (var v = step; v <= top; v += step){\r\n                var c = grid.append(\"circle\").attr(\"r\", scale(v));\r\n                var lab = grid.append(\"text\").attr(\"class\", \"radar-ring\")\r\n                    .attr(\"x\", -scale(v) * .707).attr(\"y\", -scale(v) * .707 - 5).text(v);\r\n                anneaux.push({ c: c, lab: lab, r: scale(v) });\r\n            }\r\n            data.forEach(function(d, i){\r\n                var p = pt(i, top);\r\n                grid.append(\"line\").attr(\"x1\", 0).attr(\"y1\", 0)\r\n                    .attr(\"x2\", p[0]).attr(\"y2\", p[1])\r\n                    .attr(\"data-x2\", p[0]).attr(\"data-y2\", p[1]);\r\n            });\r\n\r\n            var trace = d3.line().curve(d3.curveLinearClosed);\r\n            var poly = data.map(function(d, i){ return pt(i, d.n); });\r\n            var aire = radarGroup.append(\"path\")\r\n                .attr(\"class\", \"radar-area\")\r\n                .attr(\"d\", trace(poly));\r\n\r\n            \/\/ Libell\u00e9s d'axe, pouss\u00e9s hors du dernier anneau.\r\n            var axes = [];\r\n            data.forEach(function(d, i){\r\n                var a = angle(i);\r\n                var lr = rOuter + 26;\r\n                var x = Math.cos(a) * lr, y = Math.sin(a) * lr;\r\n                var anchor = Math.abs(Math.cos(a)) < 0.25 ? \"middle\" : (Math.cos(a) > 0 ? \"start\" : \"end\");\r\n                var t = radarGroup.append(\"text\")\r\n                    .attr(\"class\", \"radar-axis\")\r\n                    .attr(\"x\", x).attr(\"y\", y)\r\n                    .attr(\"text-anchor\", anchor)\r\n                    .attr(\"dy\", \"0.32em\");\r\n                t.append(\"tspan\").attr(\"class\", \"code\").text(d.frein.code + \" \");\r\n                var axisLabel = t.append(\"tspan\").text(d.frein.short);\r\n                if (width < 520){ axisLabel.attr(\"x\", x).attr(\"dy\", \"1.2em\"); }\r\n                axes.push(t);\r\n            });\r\n\r\n            \/\/ Points + valeurs. Le point vit dans son propre groupe : l'entr\u00e9e\r\n            \/\/ se joue sur ce groupe, le r du cercle reste libre pour le survol.\r\n            var points = [], valeurs = [];\r\n            data.forEach(function(d, i){\r\n                var p = pt(i, d.n);\r\n                var g = radarGroup.append(\"g\").attr(\"transform\", \"translate(\" + p[0] + \",\" + p[1] + \")\");\r\n                g.append(\"circle\")\r\n                    .attr(\"class\", \"radar-pt\")\r\n                    .attr(\"r\", 4.2)\r\n                    .on(\"mousemove\", function(event){ radarTip(event, d, list.length); })\r\n                    .on(\"mouseleave\", hideTooltip);\r\n                points.push({ g: g, x: p[0], y: p[1] });\r\n                if (d.n > 0){\r\n                    var a = angle(i);\r\n                    valeurs.push(radarGroup.append(\"text\")\r\n                        .attr(\"class\", \"radar-val\")\r\n                        .attr(\"x\", p[0] + Math.cos(a) * 14)\r\n                        .attr(\"y\", p[1] + Math.sin(a) * 14)\r\n                        .attr(\"dy\", \"0.32em\")\r\n                        .text(d.n));\r\n                }\r\n            });\r\n\r\n            if (!anime) return;\r\n\r\n            \/\/ 1. Les anneaux s'ouvrent du centre vers le bord.\r\n            anneaux.forEach(function(o, i){\r\n                o.c.attr(\"r\", 0).attr(\"opacity\", 0)\r\n                    .transition(\"radar\").delay(T_GRILLE + i * 70).duration(560).ease(d3.easeCubicOut)\r\n                    .attr(\"r\", o.r).attr(\"opacity\", 1);\r\n                o.lab.attr(\"opacity\", 0)\r\n                    .transition(\"radar\").delay(T_TEXTE + i * 60).duration(380).attr(\"opacity\", 1);\r\n            });\r\n\r\n            \/\/ 2. Les axes se tracent du centre vers l'ext\u00e9rieur.\r\n            grid.selectAll(\"line\").each(function(_, i){\r\n                var l = d3.select(this);\r\n                var x2 = +l.attr(\"data-x2\"), y2 = +l.attr(\"data-y2\");\r\n                l.attr(\"x2\", 0).attr(\"y2\", 0)\r\n                    .transition(\"radar\").delay(T_AXES + i * 55).duration(460).ease(d3.easeCubicOut)\r\n                    .attr(\"x2\", x2).attr(\"y2\", y2);\r\n            });\r\n\r\n            \/\/ 3. Un filet balaye le cadran pendant que la grille se pose.\r\n            var sweep = radarGroup.append(\"line\")\r\n                .attr(\"class\", \"radar-sweep\")\r\n                .attr(\"x1\", 0).attr(\"y1\", 0).attr(\"x2\", 0).attr(\"y2\", -rOuter)\r\n                .attr(\"opacity\", 0.45);\r\n            sweep.transition(\"radar\").duration(1150).ease(d3.easeCubicInOut)\r\n                .attrTween(\"transform\", function(){\r\n                    return function(t){ return \"rotate(\" + (t * 360) + \")\"; };\r\n                })\r\n                .attr(\"opacity\", 0)\r\n                .remove();\r\n\r\n            \/\/ 4. Le polygone monte de z\u00e9ro vers ses valeurs.\r\n            aire.attr(\"d\", trace(data.map(function(d, i){ return pt(i, 0); })))\r\n                .attr(\"opacity\", 0)\r\n                .transition(\"radar\").delay(T_TRACE).duration(760).ease(d3.easeCubicOut)\r\n                .attr(\"opacity\", 1)\r\n                .attrTween(\"d\", function(){\r\n                    var vers = data.map(function(d){ return d3.interpolateNumber(0, d.n); });\r\n                    return function(t){\r\n                        return trace(data.map(function(d, i){ return pt(i, vers[i](t)); }));\r\n                    };\r\n                });\r\n\r\n            \/\/ 5. Les points partent du centre et glissent le long de leur axe\r\n            \/\/    jusqu'\u00e0 leur valeur, en m\u00eame temps que le trac\u00e9 les rejoint.\r\n            \/\/    Le l\u00e9ger d\u00e9passement \u00e0 l'arriv\u00e9e fait sentir le calage.\r\n            points.forEach(function(o, i){\r\n                o.g.attr(\"opacity\", 0)\r\n                    .attr(\"transform\", \"translate(0,0) scale(0.2)\")\r\n                    .transition(\"radar\").delay(T_POINTS + i * 60).duration(760).ease(d3.easeBackOut.overshoot(1.4))\r\n                    .attr(\"opacity\", 1)\r\n                    .attrTween(\"transform\", function(){\r\n                        var ix = d3.interpolateNumber(0, o.x), iy = d3.interpolateNumber(0, o.y);\r\n                        return function(t){\r\n                            var k = 0.2 + 0.8 * Math.max(0, Math.min(1, t * 1.6));\r\n                            return \"translate(\" + ix(t) + \",\" + iy(t) + \") scale(\" + k + \")\";\r\n                        };\r\n                    });\r\n            });\r\n\r\n            \/\/ 6. Les chiffres en dernier, quand plus rien ne bouge sous eux.\r\n            valeurs.forEach(function(t, i){\r\n                t.attr(\"opacity\", 0)\r\n                    .transition(\"radar\").delay(T_TEXTE + 60 + i * 55).duration(380).attr(\"opacity\", 1);\r\n            });\r\n            axes.forEach(function(t, i){\r\n                t.attr(\"opacity\", 0)\r\n                    .transition(\"radar\").delay(T_TEXTE + i * 55).duration(420).attr(\"opacity\", 1);\r\n            });\r\n\r\n            \/\/ Pas de texte au centre : le trac\u00e9 y passe et le chiffre serait\r\n            \/\/ illisible. La port\u00e9e est d\u00e9j\u00e0 donn\u00e9e par la ligne de KPI.\r\n        }\r\n\r\n        function themeLabel(key){\r\n            var t = THEMES.filter(function(x){ return x.key === key; })[0];\r\n            return t ? t.label : key;\r\n        }\r\n\r\n        function radarTip(event, d, total){\r\n            var box = container.getBoundingClientRect();\r\n            var pct = total ? Math.round(d.n \/ total * 100) : 0;\r\n            tooltip.innerHTML = \"<strong>\" + escapeHTML(d.frein.code + \" \u00b7 \" + d.frein.label) + \"<\\\/strong>\"\r\n                + d.n + \" projet\" + (d.n > 1 ? \"s\" : \"\") + \" sur \" + total + \" (\" + pct + \" %)\"\r\n                + \"<em>\" + (radarScope ? escapeHTML(themeLabel(radarScope)) : \"Ensemble du corpus\") + \"<\\\/em>\";\r\n            tooltip.style.opacity = 1;\r\n            var x = event.clientX - box.left + 16, y = event.clientY - box.top + 14;\r\n            if (x + 300 > box.width) x = event.clientX - box.left - 306;\r\n            tooltip.style.left = x + \"px\";\r\n            tooltip.style.top = y + \"px\";\r\n        }\r\n\r\n        function isRadar(){ return indicator.key === \"freins\"; }\r\n        function isFleurs(){ return indicator.key === \"fleurs\"; }\r\n        function isEtages(){ return indicator.key === \"etages\"; }\r\n        var territoireMode = \"flux\";\r\n        function isClassement(){ return indicator.key === \"flux\" && territoireMode === \"classement\"; }\r\n        function isFlux(){ return indicator.key === \"flux\" && territoireMode === \"flux\"; }\r\n        function isCarte(){ return indicator.key === \"carte\"; }\r\n        \/\/ Freins, Fleurs, \u00c9tages, Classement, Flux et Carte se lisent hors roue\r\n        function isScoped(){ return isRadar() || isFleurs() || isEtages() || isClassement() || isFlux() || isCarte(); }\r\n\r\n        \/\/ ---- Freins d'un projet : le glyphe \u00ab cage \u00bb ----\r\n        \/\/ Pendant exact de la fleur d'impact, et son contraire visuel. La fleur\r\n        \/\/ s'ouvre : quatre couches organiques qui rayonnent vers l'ext\u00e9rieur.\r\n        \/\/ La cage se referme : quatre barri\u00e8res concentriques autour d'un noyau\r\n        \/\/ qui est le projet. Plus le porteur documente de freins, plus le\r\n        \/\/ cercle se ferme. Une seule encre (le violet des freins de l'appli) et\r\n        \/\/ quatre formes franches, anguleuses : impossible de confondre les deux\r\n        \/\/ glyphes d'un coup d'oeil, alors qu'ils se lisent de la m\u00eame fa\u00e7on.\r\n        \/\/\r\n        \/\/ Un radar tra\u00e7ait ces quatre bool\u00e9ens : le point \u00e9tait soit au centre\r\n        \/\/ soit au bord, le polygone d\u00e9g\u00e9n\u00e9rait (un frein = un trait d'aire\r\n        \/\/ nulle) et deux projets \u00e0 \u00ab 2 sur 4 \u00bb donnaient des dessins sans\r\n        \/\/ rapport selon la place des familles sur le cercle.\r\n        var FREIN_INK = \"#334155\";\r\n\r\n        \/\/ Barreaux radiaux (financiers) : la contrainte qui serre.\r\n        function freinBars(){\r\n            return '<rect x=\"-2.4\" y=\"-42.5\" width=\"4.8\" height=\"10.5\" rx=\"2\"\/>';\r\n        }\r\n        \/\/ Chevrons point\u00e9s vers le centre (humains) : la pression qui vient des\r\n        \/\/ \u00e9quipes et des publics.\r\n        function freinChevrons(){\r\n            return '<path d=\"M-7,-34.5L0,-27.5L7,-34.5\"\/>';\r\n        }\r\n        \/\/ Pans de mur (institutionnels) : l'arc le plus ext\u00e9rieur, celui qui\r\n        \/\/ enferme le reste.\r\n        function freinWalls(){\r\n            var r = 47, h = 32 * Math.PI \/ 180;\r\n            var a0 = -Math.PI \/ 2 - h, a1 = -Math.PI \/ 2 + h;\r\n            return '<path d=\"M' + (Math.cos(a0) * r).toFixed(2) + ',' + (Math.sin(a0) * r).toFixed(2)\r\n                + 'A' + r + ',' + r + ' 0 0 1 '\r\n                + (Math.cos(a1) * r).toFixed(2) + ',' + (Math.sin(a1) * r).toFixed(2) + '\"\/>';\r\n        }\r\n        \/\/ Blocs (logistiques) : les cailloux les plus pr\u00e8s du projet.\r\n        function freinBlocks(){\r\n            return '<rect x=\"-3\" y=\"-21\" width=\"6\" height=\"6\" rx=\"1\" transform=\"rotate(45 0 -18)\"\/>';\r\n        }\r\n\r\n        function freinLayer(f, ink){\r\n            var col = ink || \"currentColor\";\r\n            if (f.shape === \"bars\"){\r\n                return '<g fill=\"' + col + '\">' + floraRing(freinBars(), 6, 30) + '<\\\/g>';\r\n            }\r\n            if (f.shape === \"chevrons\"){\r\n                return '<g fill=\"none\" stroke=\"' + col + '\" stroke-width=\"3.2\"'\r\n                    + ' stroke-linecap=\"round\" stroke-linejoin=\"round\">'\r\n                    + floraRing(freinChevrons(), 6, 0) + '<\\\/g>';\r\n            }\r\n            if (f.shape === \"walls\"){\r\n                return '<g fill=\"none\" stroke=\"' + col + '\" stroke-width=\"5\" stroke-linecap=\"round\">'\r\n                    + floraRing(freinWalls(), 4, 45) + '<\\\/g>';\r\n            }\r\n            return '<g fill=\"' + col + '\">' + floraRing(freinBlocks(), 8, 22.5) + '<\\\/g>';\r\n        }\r\n\r\n        \/\/ Chaque barri\u00e8re porte sa famille : survoler sa carte, dans la fiche,\r\n        \/\/ l'allume et efface les autres (voir armeVolets).\r\n        function freinGlyph(p){\r\n            var body = \"\";\r\n            FREINS.forEach(function(f){\r\n                if (p.freinSet.indexOf(f.code) === -1) return;\r\n                body += '<g class=\"imp-couche\" data-k=\"' + f.code + '\">' + freinLayer(f, FREIN_INK) + '<\\\/g>';\r\n            });\r\n            \/\/ Le noyau, c'est le projet : toujours pr\u00e9sent, m\u00eame sans aucune\r\n            \/\/ barri\u00e8re autour. Sans lui, une case vide serait inexplicable.\r\n            body += '<circle r=\"5.5\" fill=\"#0e1b2e\" fill-opacity=\"0.26\"\/>';\r\n            return '<svg class=\"imp-glyph\" viewBox=\"-52 -52 104 104\" aria-hidden=\"true\" focusable=\"false\">' + body + '<\\\/svg>';\r\n        }\r\n\r\n        \/\/ Vignette de la ligne : UN seul motif, en grand. R\u00e9duire l'anneau\r\n        \/\/ entier \u00e0 22 px donnait quatre semis de points indistinguables ;\r\n        \/\/ isol\u00e9 et grossi, le motif se raccroche tout de suite \u00e0 sa barri\u00e8re\r\n        \/\/ dans le glyphe. C'est ce qui rend le glyphe d\u00e9codable sans l\u00e9gende.\r\n        var FREIN_ICONS = {\r\n            bars:     '<rect x=\"-3\" y=\"-9\" width=\"6\" height=\"18\" rx=\"2.6\" fill=\"currentColor\"\/>',\r\n            chevrons: '<path d=\"M-8,-4.5L0,3.5L8,-4.5\" fill=\"none\" stroke=\"currentColor\"'\r\n                      + ' stroke-width=\"3.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>',\r\n            walls:    '<path d=\"M-9.5,4.5A11.5,11.5 0 0 1 9.5,4.5\" fill=\"none\" stroke=\"currentColor\"'\r\n                      + ' stroke-width=\"3.6\" stroke-linecap=\"round\"\/>',\r\n            blocks:   '<rect x=\"-6\" y=\"-6\" width=\"12\" height=\"12\" rx=\"2.2\"'\r\n                      + ' transform=\"rotate(45)\" fill=\"currentColor\"\/>'\r\n        };\r\n        function freinMini(f){\r\n            return '<svg class=\"imp-ico\" viewBox=\"-12 -12 24 24\" aria-hidden=\"true\" focusable=\"false\">'\r\n                + FREIN_ICONS[f.shape] + '<\\\/svg>';\r\n        }\r\n\r\n        function ficheFreinsHTML(p){\r\n            var nr = isNR(p.freins);\r\n            var n = p.freinSet.length;\r\n            var seg = p.freinSegs || { segs: {}, reste: \"\" };\r\n            \/\/ Une famille peut porter un texte sans \u00eatre compt\u00e9e : le porteur\r\n            \/\/ l'a intitul\u00e9e pour \u00e9crire qu'elle ne l'a pas frein\u00e9. La carte\r\n            \/\/ reste alors \u00e9teinte, mais son texte se lit.\r\n            var lignes = FREINS.map(function(f){\r\n                var on = p.freinSet.indexOf(f.code) !== -1;\r\n                return { k: f.code, label: f.short, title: f.label, ico: freinMini(f),\r\n                         c: on ? FREIN_INK : null, on: on, texte: seg.segs[f.code] || null };\r\n            });\r\n            \/\/ Pr\u00e9ambule, ou cellule qu'on n'a pas su d\u00e9couper : rien n'est perdu.\r\n            var decoupe = FREINS.some(function(f){ return !!seg.segs[f.code]; });\r\n            if (seg.reste && seg.reste.length > 2){\r\n                lignes.push({ label: decoupe ? \"Autres pr\u00e9cisions\" : \"D\u00e9tail r\u00e9dig\u00e9 par le porteur\",\r\n                              ico: IMP_ICO_TEXTE, on: true, texte: seg.reste, plus: true });\r\n            }\r\n            var titre, note, invite = true;\r\n            if (nr){\r\n                titre = \"Freins non document\u00e9s\";\r\n                note = \"Le porteur n\u2019a pas document\u00e9 ses freins.\";\r\n            } else if (!n){\r\n                \/\/ \u00ab Pas de freins \u00bb \u00e9crit en toutes lettres, ou un texte\r\n                \/\/ qu'aucune des quatre familles ne reconna\u00eet : ce n'est pas\r\n                \/\/ la m\u00eame chose, la fiche ne le dit pas de la m\u00eame fa\u00e7on.\r\n                var aucun = \/^\\s*(pas de frein|aucun frein|aucune)\/.test(normHead(p.freins));\r\n                titre = aucun ? \"Aucun frein signal\u00e9\" : \"Freins d\u00e9crits sans famille\";\r\n                note = aucun ? \"Le porteur ne signale aucun frein.\"\r\n                    : \"Le porteur d\u00e9crit ses freins sans les rattacher \u00e0 l\u2019une des quatre familles.\";\r\n                \/\/ \u00ab Aucun frein \u00bb, puis une invite \u00e0 lire : le volet ne ferait\r\n                \/\/ que le redire.\r\n                invite = !aucun;\r\n            } else {\r\n                titre = n + (n > 1 ? \" freins sur \" : \" frein sur \") + FREINS.length\r\n                    + (n > 1 ? \" signal\u00e9s\" : \" signal\u00e9\");\r\n                note = \"Obstacles signal\u00e9s par le porteur en cours de projet.\";\r\n            }\r\n            if (invite && lignes.some(function(l){ return !!l.texte; })) note += \" Ouvrez une rubrique pour en lire le d\u00e9tail.\";\r\n            return impBlocHTML({\r\n                cls: \"is-freins\", eyebrow: \"Freins rencontr\u00e9s\", titre: titre, note: note,\r\n                embleme: freinGlyph(p), lignes: lignes\r\n            });\r\n        }\r\n\r\n        \/\/ ---- Barres class\u00e9es : la forme juste pour comparer 6 cat\u00e9gories ----\r\n        \/\/ Contrairement au radar, la longueur est directement comparable et\r\n        \/\/ l'ordre des cat\u00e9gories n'influence pas la lecture.\r\n        \/\/ Le radar est la vue d'arriv\u00e9e : il donne d'un coup d'oeil la FORME\r\n        \/\/ des freins d'un corpus, ce qu'on vient chercher en ouvrant l'onglet.\r\n        \/\/ Les barres restent \u00e0 un clic pour qui veut comparer des longueurs\r\n        \/\/ exactement, ce que le radar ne permet pas.\r\n        var freinsMode = \"radar\";   \/\/ \"bars\" | \"radar\"\r\n\r\n        function renderBars(){\r\n            var el = document.getElementById(\"freins-bars\");\r\n            var headerEl = document.querySelector(\"#reu-roue-wp .header\");\r\n            el.style.paddingTop = ((headerEl ? headerEl.getBoundingClientRect().height : 190) + 24) + \"px\";\r\n\r\n            var list = radarProjets();\r\n            \/\/ D\u00e9nominateur : les projets qui ont document\u00e9 un frein. Un projet\r\n            \/\/ \u00e0 0 code n'est pas \u00ab sans frein \u00bb, il n'a pas \u00e9t\u00e9 analys\u00e9.\r\n            var base = list.filter(function(p){ return p.freinSet.length > 0; }).length;\r\n            var data = radarCounts().slice().sort(function(a, b){ return b.n - a.n; });\r\n            var maxN = Math.max(1, d3.max(data, function(d){ return d.n; }));\r\n\r\n            var caption = base\r\n                ? \"Sur les <strong>\" + base + \" projets<\\\/strong> qui documentent au moins un frein\"\r\n                  + (radarScope ? \" en \" + escapeHTML(themeLabel(radarScope)) : \" (corpus entier)\")\r\n                  + \". Un projet peut cumuler plusieurs freins, les barres ne s'additionnent donc pas \u00e0 100 %.\"\r\n                : \"Aucun projet ne documente de frein sur ce p\u00e9rim\u00e8tre.\";\r\n\r\n            \/\/ Un en-t\u00eate de colonnes, et la m\u00eame grille pour chaque ligne :\r\n            \/\/ c'est ce qui permet de comparer quatre familles sans lire les\r\n            \/\/ nombres. Les graduations sont port\u00e9es par la piste elle-m\u00eame.\r\n            el.innerHTML = '<p class=\"fb-caption\">' + caption + '<\\\/p>'\r\n                + (data.length\r\n                    ? '<div class=\"fb-head\" aria-hidden=\"true\"><span><\\\/span>'\r\n                      + '<span>Famille de frein<\\\/span><span>Projets concern\u00e9s<\\\/span>'\r\n                      + '<span>Part du corpus<\\\/span><\\\/div>'\r\n                    : '')\r\n                + data.map(function(d){\r\n                    var pct = base ? Math.round(d.n \/ base * 100) : 0;\r\n                    return '<div class=\"fb-row\">'\r\n                        + '<span class=\"fb-code\">' + d.frein.code + '<\\\/span>'\r\n                        + '<span class=\"fb-label\">' + escapeHTML(d.frein.short) + '<\\\/span>'\r\n                        + '<span class=\"fb-track\"><span class=\"fb-fill\" style=\"width:'\r\n                        + (d.n \/ maxN * 100).toFixed(1) + '%\"><\\\/span><\\\/span>'\r\n                        + '<span class=\"fb-val\">' + d.n + ' <span>' + pct + ' % du corpus<\\\/span><\\\/span>'\r\n                        + '<\\\/div>';\r\n                }).join(\"\")\r\n                \/\/ Une note de lecture : la phrase qui apprend \u00e0 lire une\r\n                \/\/ ligne, pour que personne n'ait \u00e0 deviner ce que compte la\r\n                \/\/ barre. C'est l'usage des graphiques d'institut, et cela\r\n                \/\/ vaut mieux qu'une l\u00e9gende de plus.\r\n                + (data.length && base\r\n                    ? '<p class=\"fb-note\"><b>Lecture<\\\/b> \u00b7 ' + data[0].n + ' des ' + base\r\n                      + ' projets qui documentent un frein citent un frein '\r\n                      + escapeHTML(String(data[0].frein.short).toLowerCase())\r\n                      + '. <span>Les familles se cumulent, le total d\u00e9passe donc 100 %.<\\\/span><\\\/p>'\r\n                    : '');\r\n        }\r\n\r\n        \/\/ ============ 5 bis. LE CLASSEMENT ============\r\n        \/\/ La courbe conserve la comparaison des th\u00e9matiques et des financements.\r\n        function renderClassement(rejouer){\r\n            var el = document.getElementById(\"classement\");\r\n            if (!el) return;\r\n\r\n            el.innerHTML = '<div class=\"rg-cadre\">'\r\n                + '<section class=\"rg-courbe\" id=\"rg-courbe\" aria-label=\"Euros engag\u00e9s, projet par projet\"><\\\/section>'\r\n                + '<section class=\"rg-mini\" id=\"rg-nombres\" aria-label=\"Nombre de projets par th\u00e9matique\"><\\\/section>'\r\n                + '<section class=\"rg-mini\" id=\"rg-tranches\" aria-label=\"R\u00e9partition par montant de subvention\"><\\\/section>'\r\n                + '<\\\/div>';\r\n\r\n            renderCourbe();\r\n            renderClassementComplements();\r\n            armeMini(rejouer !== false);\r\n        }\r\n\r\n        \/\/ Les deux encadr\u00e9s entrent quand ils arrivent dans le champ : sur\r\n        \/\/ mobile ils sont sous la courbe, et des barres qui ont pouss\u00e9 hors\r\n        \/\/ de l'\u00e9cran n'ont \u00e9t\u00e9 vues par personne. Un redimensionnement\r\n        \/\/ r\u00e9\u00e9crit les encadr\u00e9s ; seul celui qui n'a pas encore jou\u00e9 se\r\n        \/\/ r\u00e9arme, l'autre reste pos\u00e9. Sans IntersectionObserver, ou si la\r\n        \/\/ personne demande moins de mouvement, rien n'est \u00e9teint.\r\n        var miniObs = null, miniVus = {};\r\n        function armeMini(rejouer){\r\n            if (miniObs){ miniObs.disconnect(); miniObs = null; }\r\n            if (rejouer) miniVus = {};\r\n            if (!(\"IntersectionObserver\" in window) || reducedMotion.matches) return;\r\n            var cibles = [\"rg-nombres\", \"rg-tranches\"].map(function(id){\r\n                return document.getElementById(id);\r\n            }).filter(function(el){ return el && !miniVus[el.id]; });\r\n            if (!cibles.length) return;\r\n            miniObs = new IntersectionObserver(function(entrees){\r\n                entrees.forEach(function(e){\r\n                    if (!e.isIntersecting) return;\r\n                    e.target.classList.add(\"is-in\");\r\n                    miniVus[e.target.id] = true;\r\n                    miniObs.unobserve(e.target);\r\n                });\r\n            }, { rootMargin: \"0px 0px -6% 0px\", threshold: 0.2 });\r\n            cibles.forEach(function(el){\r\n                var n = el.querySelectorAll(\".rg-mini-row\").length;\r\n                \/\/ Les libell\u00e9s attendent la derni\u00e8re barre : elle part \u00e0\r\n                \/\/ (n - 1) \u00d7 55 ms et se tient immobile \u00e0 620 ms de son d\u00e9part.\r\n                el.style.setProperty(\"--n\", n);\r\n                el.style.setProperty(\"--fin\", ((n - 1) * 55 + 620) + \"ms\");\r\n                el.classList.add(\"is-arme\");\r\n                miniObs.observe(el);\r\n            });\r\n        }\r\n\r\n        function renderClassementComplements(){\r\n            var nombres = document.getElementById(\"rg-nombres\");\r\n            var tranches = document.getElementById(\"rg-tranches\");\r\n            if (!nombres || !tranches) return;\r\n            var themes = THEMES.map(function(t){\r\n                return { theme: t, n: (byTheme.get(t.key) || []).length };\r\n            }).filter(function(d){ return d.n; })\r\n              .sort(function(a, b){ return b.n - a.n || a.theme.label.localeCompare(b.theme.label, \"fr\"); });\r\n            var max = themes.length ? themes[0].n : 1;\r\n            nombres.innerHTML = '<h3>Projets par th\u00e9matique<\\\/h3>'\r\n                + '<p class=\"rg-mini-intro\">Le nombre de projets soutenus dans chaque th\u00e8me.<\\\/p>'\r\n                + '<div class=\"rg-mini-rows\">'\r\n                + themes.map(function(d, i){\r\n                    return '<button class=\"rg-mini-row\" type=\"button\" style=\"--i:' + i + '\" data-theme=\"' + escapeHTML(d.theme.key) + '\"'\r\n                        + ' title=\"Ouvrir ' + escapeHTML(d.theme.label) + ' dans la roue\">'\r\n                        + '<span class=\"rg-mini-name\">' + escapeHTML(d.theme.label) + '<\\\/span>'\r\n                        + '<span class=\"rg-mini-track\"><span style=\"width:' + (d.n \/ max * 100).toFixed(1)\r\n                        + '%;background:' + d.theme.color + '\"><\\\/span><\\\/span>'\r\n                        + '<strong>' + d.n + '<\\\/strong><\\\/button>';\r\n                }).join(\"\") + '<\\\/div>';\r\n            nombres.querySelectorAll(\"[data-theme]\").forEach(function(btn){\r\n                btn.addEventListener(\"click\", function(){\r\n                    var key = btn.getAttribute(\"data-theme\");\r\n                    activateTab(\"empreinte\");\r\n                    var node = root.children.find(function(c){ return c.data.themeKey === key; });\r\n                    if (node) zoomTo(node);\r\n                });\r\n            });\r\n            var classes = [\r\n                { label: \"Moins de 15 k\u20ac\", color: \"#bd9035\", test: function(v){ return v < 15000; } },\r\n                { label: \"15 \u00e0 30 k\u20ac\", color: \"#55926f\", test: function(v){ return v >= 15000 && v <= 30000; } },\r\n                { label: \"Plus de 30 k\u20ac\", color: \"#567398\", test: function(v){ return v > 30000; } }\r\n            ];\r\n            var chiffres = PROJETS.map(function(p){ return p.fisNum; })\r\n                .filter(function(v){ return v !== null && Number.isFinite(v); });\r\n            var maxClasse = Math.max(1, ...classes.map(function(c){\r\n                return chiffres.filter(c.test).length;\r\n            }));\r\n            tranches.innerHTML = '<h3>Montant par projet<\\\/h3>'\r\n                + '<p class=\"rg-mini-intro\">R\u00e9partition des subventions FIS renseign\u00e9es (' + chiffres.length + ' projets).<\\\/p>'\r\n                + '<div class=\"rg-mini-rows\">'\r\n                + classes.map(function(c, i){\r\n                    var n = chiffres.filter(c.test).length;\r\n                    return '<div class=\"rg-mini-row\" style=\"--i:' + i + '\" title=\"' + n + ' projets\">'\r\n                        + '<span class=\"rg-mini-name\">' + c.label + '<\\\/span>'\r\n                        + '<span class=\"rg-mini-track\"><span style=\"width:' + (n \/ maxClasse * 100).toFixed(1)\r\n                        + '%;background:' + c.color + '\"><\\\/span><\\\/span>'\r\n                        + '<strong>' + n + '<\\\/strong><\\\/div>';\r\n                }).join(\"\") + '<\\\/div>'\r\n                + '<p class=\"rg-mini-takeaway\"><strong>'\r\n                + (chiffres.length ? Math.round(chiffres.filter(classes[1].test).length \/ chiffres.length * 100) : 0)\r\n                + ' %<\\\/strong> des projets renseign\u00e9s re\u00e7oivent entre 15 et 30 k\u20ac.<\\\/p>';\r\n        }\r\n\r\n        \/\/ ============ 5 bis bis. LA COURBE DE CONCENTRATION ============\r\n        \/\/ Un plan cart\u00e9sien, une courbe par th\u00e9matique : en abscisse les\r\n        \/\/ projets, compt\u00e9s un \u00e0 un, en ordonn\u00e9e les euros cumul\u00e9s. Chaque\r\n        \/\/ courbe part de l'origine et monte projet apr\u00e8s projet, du plus gros\r\n        \/\/ dossier au plus petit, jusqu'au total de sa th\u00e9matique.\r\n        \/\/\r\n        \/\/ Trois choses se lisent d'un seul dessin, qu'aucun classement ne\r\n        \/\/ donne :\r\n        \/\/   - le POINT D'ARRIV\u00c9E dit le poids de la th\u00e9matique, en argent (la\r\n        \/\/     hauteur) comme en nombre (la longueur) ;\r\n        \/\/   - la PENTE MOYENNE dit la subvention type : une courbe haute et\r\n        \/\/     courte finance peu de dossiers, gros ; une courbe longue et\r\n        \/\/     basse en finance beaucoup, petits ;\r\n        \/\/   - la COURBURE dit la concentration. Les projets \u00e9tant rang\u00e9s du\r\n        \/\/     plus gros au plus petit, la courbe est toujours concave ; plus\r\n        \/\/     son premier segment est raide devant les suivants, plus la\r\n        \/\/     th\u00e9matique tient \u00e0 un seul dossier. C'est la lecture qu'aucune\r\n        \/\/     moyenne ne donne, et c'est celle qui compte en r\u00e9union.\r\n        \/\/\r\n        \/\/ Les couleurs sont celles de la roue, \u00e0 l'identique : une th\u00e9matique\r\n        \/\/ ne change pas de teinte en changeant de vue.\r\n        function courbeEuro(v, court){\r\n            \/\/ Les formats du bas de fichier appartiennent \u00e0 un autre bloc de\r\n            \/\/ script, qui n'a pas encore tourn\u00e9 au premier rendu du\r\n            \/\/ classement. Celui-ci est donc autonome.\r\n            if (v == null) return \"NR\";\r\n            if (v >= 1e6) return new Intl.NumberFormat(\"fr-FR\", { maximumFractionDigits: 2 }).format(v \/ 1e6) + \" M\u20ac\";\r\n            if (v >= 1e3) return Math.round(v \/ 1e3) + (court ? \" k\" : \" k\u20ac\");\r\n            return Math.round(v) + (court ? \"\" : \" \u20ac\");\r\n        }\r\n\r\n        function courbeDonnees(){\r\n            return THEMES.map(function(t){\r\n                var list = (byTheme.get(t.key) || []).slice()\r\n                    .sort(function(a, b){ return (b.fisNum || 0) - (a.fisNum || 0); });\r\n                var cumul = 0;\r\n                \/\/ Le point (0, 0) est le d\u00e9part commun : sans lui les courbes\r\n                \/\/ ne partiraient pas du m\u00eame endroit et leurs pentes ne se\r\n                \/\/ compareraient plus.\r\n                var pts = [{ i: 0, v: 0, projet: null }];\r\n                list.forEach(function(pr, i){\r\n                    cumul += pr.fisNum || 0;\r\n                    pts.push({ i: i + 1, v: cumul, projet: pr });\r\n                });\r\n                return {\r\n                    theme: t, pts: pts, n: list.length, fis: cumul,\r\n                    moyen: list.length ? cumul \/ list.length : 0,\r\n                    \/\/ Part du plus gros dossier dans la th\u00e9matique : le chiffre\r\n                    \/\/ que la courbure montre, pour qui veut le lire \u00e9crit.\r\n                    tete: cumul ? ((list[0] && list[0].fisNum) || 0) \/ cumul : 0\r\n                };\r\n            }).filter(function(d){ return d.n > 0 && d.fis > 0; })\r\n              .sort(function(a, b){ return b.fis - a.fis; });\r\n        }\r\n\r\n        function renderCourbe(){\r\n            var hote = document.getElementById(\"rg-courbe\");\r\n            if (!hote || typeof d3 === \"undefined\") return;\r\n            var data = courbeDonnees();\r\n            if (data.length < 2){ hote.innerHTML = \"\"; return; }\r\n            \/\/ Le panneau peut encore \u00eatre masqu\u00e9 au moment du rendu : ses\r\n            \/\/ largeurs valent alors z\u00e9ro, et un dessin compos\u00e9 sur une largeur\r\n            \/\/ devin\u00e9e d\u00e9borde de son cadre. On laisse la place vide et on se\r\n            \/\/ remet en piste d\u00e8s que le cadre se mesure, c'est-\u00e0-dire d\u00e8s que\r\n            \/\/ la vue s'affiche.\r\n            if (!courbeVeille(hote)) return;\r\n\r\n            var dispo = hote.clientWidth;\r\n            var etroit = dispo < 640;\r\n            var W = Math.max(300, Math.round(dispo));\r\n            \/\/ Le trac\u00e9 laisse la place \u00e0 la l\u00e9gende et \u00e0 la note sous les axes.\r\n            var H = Math.round(Math.max(180, hote.clientHeight - (etroit ? 190 : 175)));\r\n            \/\/ La marge haute loge le nom de l'ordonn\u00e9e : coll\u00e9 au premier\r\n            \/\/ palier, il se lisait comme une graduation de plus.\r\n            var M = { t: 26, r: etroit ? 14 : 20, b: 34, l: etroit ? 44 : 56 };\r\n            var maxX = d3.max(data, function(d){ return d.n; }) || 1;\r\n            var maxY = d3.max(data, function(d){ return d.fis; }) || 1;\r\n\r\n            var x = d3.scaleLinear().domain([0, maxX]).range([M.l, W - M.r]);\r\n            var y = d3.scaleLinear().domain([0, maxY]).nice(4).range([H - M.b, M.t]);\r\n\r\n            hote.innerHTML = '<div class=\"pn-tete\">'\r\n                + '<h3 class=\"pn-titre\">L\u2019argent, projet par projet<\\\/h3>'\r\n                + '<p class=\"pn-mode\">Chaque courbe cumule les euros d\u2019une th\u00e9matique,'\r\n                + ' du plus gros dossier au plus petit.<\\\/p><\\\/div>'\r\n                + '<div class=\"pn-scene\"><\\\/div>'\r\n                + '<div class=\"pn-leg\"><\\\/div>'\r\n                + '<p class=\"pn-note\"><b>Lecture<\\\/b> \u00b7 la hauteur d\u2019arriv\u00e9e est le total engag\u00e9,'\r\n                + ' la longueur le nombre de projets. Une courbe raide au d\u00e9part puis plate'\r\n                + ' signale une th\u00e9matique port\u00e9e par un seul gros dossier.<\\\/p>';\r\n\r\n            var svg = d3.select(hote).select(\".pn-scene\").append(\"svg\")\r\n                .attr(\"class\", \"pn-svg\")\r\n                .attr(\"viewBox\", \"0 0 \" + W + \" \" + H)\r\n                .attr(\"preserveAspectRatio\", \"xMidYMid meet\")\r\n                .attr(\"role\", \"img\")\r\n                .attr(\"aria-label\", \"Euros cumul\u00e9s en ordonn\u00e9e, nombre de projets en abscisse, \"\r\n                    + \"une courbe par th\u00e9matique.\");\r\n\r\n            \/\/ ---- Le plan : des graduations, pas une grille ----\r\n            \/\/ Les horizontales seules suffisent \u00e0 chiffrer une hauteur ; y\r\n            \/\/ ajouter les verticales aurait fait un quadrillage qui concurrence\r\n            \/\/ les courbes. Les abscisses sont des entiers : un demi-projet\r\n            \/\/ n'existe pas.\r\n            var ticksY = y.ticks(etroit ? 4 : 5);\r\n            var grille = svg.append(\"g\").attr(\"class\", \"cb-grille\");\r\n            grille.selectAll(\"line\").data(ticksY).join(\"line\")\r\n                .attr(\"x1\", M.l).attr(\"x2\", W - M.r)\r\n                .attr(\"y1\", y).attr(\"y2\", y);\r\n            svg.append(\"g\").attr(\"class\", \"cb-axe cb-axe-y\")\r\n                .selectAll(\"text\").data(ticksY).join(\"text\")\r\n                .attr(\"x\", M.l - 8).attr(\"y\", y).attr(\"dy\", \"0.32em\")\r\n                .attr(\"text-anchor\", \"end\")\r\n                .text(function(v){ return v === 0 ? \"0\" : courbeEuro(v, true); });\r\n\r\n            var ticksX = d3.range(0, maxX + 1).filter(function(v){\r\n                return !etroit || v % 2 === 0 || v === maxX;\r\n            });\r\n            svg.append(\"g\").attr(\"class\", \"cb-axe cb-axe-x\")\r\n                .selectAll(\"text\").data(ticksX).join(\"text\")\r\n                .attr(\"x\", x).attr(\"y\", H - M.b + 16).attr(\"text-anchor\", \"middle\")\r\n                .text(function(v){ return v; });\r\n            svg.append(\"line\").attr(\"class\", \"cb-base\")\r\n                .attr(\"x1\", M.l).attr(\"x2\", W - M.r)\r\n                .attr(\"y1\", y(0)).attr(\"y2\", y(0));\r\n            svg.append(\"text\").attr(\"class\", \"cb-unite\")\r\n                .attr(\"x\", W - M.r).attr(\"y\", H - 4).attr(\"text-anchor\", \"end\")\r\n                .text(\"Projets, du plus financ\u00e9 au moins financ\u00e9\");\r\n            svg.append(\"text\").attr(\"class\", \"cb-unite\")\r\n                .attr(\"x\", 1).attr(\"y\", 9).attr(\"text-anchor\", \"start\")\r\n                .text(\"Euros cumul\u00e9s\");\r\n\r\n            \/\/ ---- Les courbes ----\r\n            \/\/ Interpolation monotone : elle passe par tous les points sans\r\n            \/\/ inventer de bosse entre deux projets, ce qu'une spline libre\r\n            \/\/ ferait \u2014 et une bosse, ici, se lirait comme un dossier.\r\n            var ligne = d3.line()\r\n                .x(function(pt){ return x(pt.i); })\r\n                .y(function(pt){ return y(pt.v); })\r\n                .curve(d3.curveMonotoneX);\r\n\r\n            var gc = svg.append(\"g\").attr(\"class\", \"cb-courbes\");\r\n            var items = gc.selectAll(\"g.cb-item\").data(data).join(\"g\")\r\n                .attr(\"class\", \"cb-item\")\r\n                .style(\"--teinte\", function(d){ return d.theme.color; })\r\n                .attr(\"tabindex\", 0).attr(\"role\", \"button\")\r\n                .attr(\"aria-label\", function(d){\r\n                    return d.theme.label + \" : \" + d.n + \" projet\" + (d.n > 1 ? \"s\" : \"\")\r\n                        + \", \" + courbeEuro(d.fis) + \" au total. Ouvrir ses projets.\";\r\n                });\r\n            \/\/ Un trait large et transparent double chaque courbe : c'est lui\r\n            \/\/ qui re\u00e7oit la souris. Viser un trait de 2,5 px \u00e0 la souris est\r\n            \/\/ un exercice, pas une lecture.\r\n            items.append(\"path\").attr(\"class\", \"cb-prise\").attr(\"d\", function(d){ return ligne(d.pts); });\r\n            var trace = items.append(\"path\").attr(\"class\", \"cb-trait\").attr(\"d\", function(d){ return ligne(d.pts); });\r\n            items.selectAll(\"circle.cb-pt\")\r\n                .data(function(d){ return d.pts.slice(1).map(function(pt){ return { pt: pt, d: d }; }); })\r\n                .join(\"circle\").attr(\"class\", \"cb-pt\")\r\n                .attr(\"cx\", function(o){ return x(o.pt.i); })\r\n                .attr(\"cy\", function(o){ return y(o.pt.v); })\r\n                .attr(\"r\", function(o){ return o.pt.i === o.d.n ? 4 : 2.6; });\r\n\r\n            \/\/ ---- La l\u00e9gende ----\r\n            \/\/ Elle porte les deux chiffres d'arriv\u00e9e : sans eux, l'oeil\r\n            \/\/ redescendrait chercher l'\u00e9chelle pour chaque courbe.\r\n            var leg = d3.select(hote).select(\".pn-leg\");\r\n            var chips = leg.selectAll(\"button\").data(data).join(\"button\")\r\n                .attr(\"class\", \"cb-chip\").attr(\"type\", \"button\")\r\n                .style(\"--teinte\", function(d){ return d.theme.color; });\r\n            chips.append(\"span\").attr(\"class\", \"cb-puce\");\r\n            chips.append(\"span\").attr(\"class\", \"cb-nom\").text(function(d){ return d.theme.label; });\r\n            chips.append(\"span\").attr(\"class\", \"cb-chiffre\")\r\n                .text(function(d){ return courbeEuro(d.fis) + \" \u00b7 \" + d.n + (d.n > 1 ? \" projets\" : \" projet\"); });\r\n\r\n            \/\/ ---- Isoler ----\r\n            \/\/ Survoler une courbe ou sa pastille \u00e9teint les autres. Le\r\n            \/\/ graphique ne porte pas d'infobulle : tout ce qu'elle dirait est\r\n            \/\/ d\u00e9j\u00e0 dans la l\u00e9gende.\r\n            var scene = d3.select(hote).select(\".pn-scene\");\r\n            function isoler(d, on){\r\n                scene.classed(\"is-focus\", on);\r\n                leg.classed(\"is-focus\", on);\r\n                items.classed(\"is-on\", function(o){ return on && o === d; });\r\n                chips.classed(\"is-on\", function(o){ return on && o === d; });\r\n            }\r\n            items.on(\"mouseenter focus\", function(e, d){ isoler(d, true); })\r\n                .on(\"mouseleave blur\", function(e, d){ isoler(d, false); })\r\n                .on(\"click\", function(e, d){ courbeOuvrir(d); })\r\n                .on(\"keydown\", function(e, d){\r\n                    if (e.key === \"Enter\" || e.key === \" \"){ e.preventDefault(); courbeOuvrir(d); }\r\n                });\r\n            chips.on(\"mouseenter focus\", function(e, d){ isoler(d, true); })\r\n                .on(\"mouseleave blur\", function(e, d){ isoler(d, false); })\r\n                .on(\"click\", function(e, d){ courbeOuvrir(d); });\r\n\r\n            \/\/ ---- L'entr\u00e9e ----\r\n            \/\/ Le plan se pose d'abord, puis les courbes se tracent de gauche \u00e0\r\n            \/\/ droite, l'une apr\u00e8s l'autre, de la plus lourde \u00e0 la plus l\u00e9g\u00e8re :\r\n            \/\/ on suit le fonds en train de se r\u00e9partir. Les points se posent\r\n            \/\/ dans le sillage de leur courbe, et la l\u00e9gende n'arrive qu'apr\u00e8s,\r\n            \/\/ sur un dessin immobile.\r\n            if (reducedMotion.matches) return;\r\n            var tempo = function(d, i){ return 120 + i * 130; };\r\n            svg.selectAll(\".cb-grille line, .cb-axe text, .cb-base, .cb-unite\")\r\n                .attr(\"opacity\", 0).transition().duration(420).attr(\"opacity\", null);\r\n            trace.each(function(){\r\n                var L = this.getTotalLength();\r\n                d3.select(this).attr(\"stroke-dasharray\", L + \" \" + L).attr(\"stroke-dashoffset\", L);\r\n            });\r\n            trace.transition().delay(tempo).duration(900).ease(d3.easeCubicInOut)\r\n                .attr(\"stroke-dashoffset\", 0)\r\n                .on(\"end\", function(){ d3.select(this).attr(\"stroke-dasharray\", null); });\r\n            items.each(function(d, i){\r\n                var base = tempo(d, i), n = Math.max(1, d.n);\r\n                d3.select(this).selectAll(\"circle.cb-pt\").attr(\"opacity\", 0)\r\n                    .transition()\r\n                    .delay(function(o){ return base + 120 + (o.pt.i \/ n) * 780; })\r\n                    .duration(260).ease(d3.easeBackOut.overshoot(1.6))\r\n                    .attr(\"opacity\", null);\r\n            });\r\n            leg.selectAll(\"button\").style(\"opacity\", 0)\r\n                .transition().delay(function(d, i){ return 900 + i * 45; })\r\n                .duration(360).style(\"opacity\", null);\r\n        }\r\n\r\n        \/\/ La veille : tant que le cadre n'a pas de largeur, il n'y a rien \u00e0\r\n        \/\/ dessiner. Un observateur de taille rappelle le rendu \u00e0 la premi\u00e8re\r\n        \/\/ mesure utile, puis \u00e0 chaque changement de largeur r\u00e9el \u2014 un\r\n        \/\/ redimensionnement de fen\u00eatre passe d\u00e9j\u00e0 par ailleurs, mais pas le\r\n        \/\/ simple passage de la vue \u00e0 l'\u00e9cran.\r\n        function courbeVeille(hote){\r\n            if (!window.ResizeObserver) return hote.clientWidth > 0;\r\n            if (!hote.__obs){\r\n                hote.__obs = new ResizeObserver(function(){\r\n                    var l = Math.round(hote.clientWidth);\r\n                    if (l > 0 && Math.abs(l - (hote.__largeur || 0)) > 4) renderCourbe();\r\n                });\r\n                hote.__obs.observe(hote);\r\n            }\r\n            if (!hote.clientWidth){ hote.innerHTML = \"\"; hote.__largeur = 0; return false; }\r\n            hote.__largeur = Math.round(hote.clientWidth);\r\n            return true;\r\n        }\r\n\r\n        function courbeOuvrir(d){\r\n            activateTab(\"empreinte\");\r\n            var node = root.children.find(function(c){ return c.data.themeKey === d.theme.key; });\r\n            if (node) zoomTo(node);\r\n        }\r\n\r\n        \/\/ ============ 5 bis ter. QUI AGIT O\u00d9 : DEUX CROISEMENTS ============\r\n        \/\/ Les autres vues rangent le corpus selon UN classeur : la roue et le\r\n        \/\/ classement selon la th\u00e9matique, les \u00e9tages et les fleurs selon ce\r\n        \/\/ que la structure documente, la carte selon le territoire. Aucune ne\r\n        \/\/ montre de croisement, et c'est pourtant la question qu'on pose\r\n        \/\/ devant la roue : le num\u00e9rique, \u00e7a se passe o\u00f9, et \u00e7a co\u00fbte combien ?\r\n        \/\/\r\n        \/\/ Deux diagrammes, l'un sous l'autre, avec la m\u00eame forme et la m\u00eame\r\n        \/\/ \u00e9chelle de lecture (un ruban, une \u00e9paisseur, un nombre de projets) :\r\n        \/\/\r\n        \/\/   1. Th\u00e9matiques \u2192 SECTEURS. Le rattachement vient de la carte, qui\r\n        \/\/      tient la seule table s\u00e9rieuse (porteur \u2192 arrondissements et\r\n        \/\/      communes) : la colonne \u00ab territoire \u00bb du corpus est du texte\r\n        \/\/      libre, inexploitable pour compter. Un projet qui travaille sur\r\n        \/\/      plusieurs secteurs passe dans plusieurs rubans ; celui qui\r\n        \/\/      couvre la ville enti\u00e8re ou la m\u00e9tropole n'appartient \u00e0 aucun\r\n        \/\/      secteur et rejoint \u00ab Multisite \u00bb, qui est une r\u00e9ponse et non un\r\n        \/\/      trou.\r\n        \/\/   2. Th\u00e9matiques \u2192 TAILLE DU DOSSIER. Trois tranches de subvention.\r\n        \/\/      Un projet tombe dans une seule tranche : les rubans s'y\r\n        \/\/      additionnent exactement aux projets du fonds, ce que le premier\r\n        \/\/      diagramme ne peut pas promettre. C'est la contrepartie : une\r\n        \/\/      lecture exacte mais sans g\u00e9ographie, sous une lecture\r\n        \/\/      g\u00e9ographique mais approximative.\r\n        \/\/\r\n        \/\/ Chaque diagramme porte son propre \u00e9tat : deux svg, deux jeux de\r\n        \/\/ rubans, un isolement qui ne d\u00e9borde pas d'un cadre \u00e0 l'autre.\r\n\r\n        \/\/ La teinte d'un pilier, assombrie pour porter du texte sur l'ivoire.\r\n        function sombre(hex){\r\n            var c = d3.hcl(hex);\r\n            if (isNaN(c.h)) return \"#4a5a63\";\r\n            return d3.rgb(d3.hcl(c.h, Math.min(c.c, 42), Math.min(c.l, 44))).formatHex();\r\n        }\r\n\r\n        \/\/ Les trois tranches. Les bornes sont rondes (15 000 et 30 000 \u20ac) et\r\n        \/\/ choisies sur la distribution r\u00e9elle du fonds, qui va de 7 000 \u00e0\r\n        \/\/ 150 000 \u20ac pour une m\u00e9diane \u00e0 20 000 : elles encadrent donc le\r\n        \/\/ format courant au lieu de couper au hasard. Les dire en euros plut\u00f4t\r\n        \/\/ qu'en \u00ab petits \/ moyens \/ gros \u00bb \u00e9vite de porter un jugement l\u00e0 o\u00f9\r\n        \/\/ il n'y a qu'une taille.\r\n        var FLUX_TRANCHES = [\r\n            { code: \"gros\",  label: \"Plus de 30 000 \u20ac\",   sub: \"les gros dossiers\",  color: \"#45508a\",\r\n              test: function(v){ return v > 30000; } },\r\n            { code: \"moyen\", label: \"15 000 \u00e0 30 000 \u20ac\",  sub: \"le format courant\",  color: \"#55926f\",\r\n              test: function(v){ return v >= 15000 && v <= 30000; } },\r\n            { code: \"petit\", label: \"Moins de 15 000 \u20ac\",  sub: \"les coups de pouce\", color: \"#bd9035\",\r\n              test: function(v){ return v < 15000; } }\r\n        ];\r\n\r\n        \/\/ Le rattachement g\u00e9ographique est publi\u00e9 par la carte (window.AMP_GEO).\r\n        \/\/ Si ce bloc n'a pas encore tourn\u00e9, le premier diagramme s'efface au\r\n        \/\/ lieu d'inventer une g\u00e9ographie : mieux vaut une vue en moins qu'une\r\n        \/\/ carte fausse.\r\n        function fluxGeo(){ return window.AMP_GEO || null; }\r\n\r\n        \/\/ Un croisement : \u00e0 gauche les th\u00e9matiques, \u00e0 droite les cibles du\r\n        \/\/ mode. `cibleDe` rend la liste des cibles d'un projet \u2014 une seule\r\n        \/\/ pour l'argent, parfois plusieurs pour le territoire.\r\n        function fluxDonnees(mode){\r\n            var cibles, cibleDe;\r\n            if (mode === \"promesse\"){\r\n                cibles = PROMESSES.map(function(pr, j){\r\n                    return { key: pr.key, label: pr.label, sub: pr.phrase, color: pr.color,\r\n                             textColor: pr.textColor, j: j, rang: j, n: 0 };\r\n                });\r\n                cibleDe = function(p){\r\n                    return PROMESSES.filter(function(pr){ return p.docs[pr.key]; })\r\n                        .map(function(pr){ return pr.key; });\r\n                };\r\n            } else if (mode === \"secteur\"){\r\n                var geo = fluxGeo();\r\n                if (!geo) return null;\r\n                var ordre = geo.secteurs.concat([geo.multisite]);\r\n                cibles = ordre.map(function(S, j){\r\n                    return { key: S.code, label: S.label, sub: S.sub, color: S.color,\r\n                             textColor: sombre(S.color), j: j, rang: j, n: 0 };\r\n                });\r\n                cibleDe = function(p){ return geo.secteursDe(p.porteur, p.projet) || []; };\r\n            } else if (mode === \"frein\"){\r\n                \/\/ Les quatre familles de la grille FIS, dans l'ordre de la\r\n                \/\/ fiche. Une seule encre pour les quatre, comme dans le\r\n                \/\/ glyphe de la fiche : un frein ne se hi\u00e9rarchise pas par sa\r\n                \/\/ couleur, et les rubans gardent la teinte de leur th\u00e9matique.\r\n                cibles = FREINS.map(function(f, j){\r\n                    return { key: f.code, label: f.short, sub: f.label, color: FREIN_INK,\r\n                             textColor: sombre(FREIN_INK), j: j, rang: j, n: 0 };\r\n                });\r\n                cibleDe = function(p){ return p.freinSet || []; };\r\n            } else {\r\n                cibles = FLUX_TRANCHES.map(function(T, j){\r\n                    return { key: T.code, label: T.label, sub: T.sub, color: T.color,\r\n                             textColor: sombre(T.color), j: j, rang: j, n: 0 };\r\n                });\r\n                cibleDe = function(p){\r\n                    var v = p.fisNum;\r\n                    if (v == null) return [];\r\n                    var t = FLUX_TRANCHES.find(function(T){ return T.test(v); });\r\n                    return t ? [t.code] : [];\r\n                };\r\n            }\r\n            var rang = {};\r\n            cibles.forEach(function(C, j){ rang[C.key] = j; });\r\n\r\n            var lignes = THEMES.map(function(t){\r\n                var list = byTheme.get(t.key) || [];\r\n                var liens = cibles.map(function(C){ return { C: C, n: 0 }; });\r\n                var muets = 0;\r\n                list.forEach(function(p){\r\n                    var codes = cibleDe(p);\r\n                    if (!codes.length){ muets++; return; }\r\n                    codes.forEach(function(c){\r\n                        var j = rang[c];\r\n                        if (j != null) liens[j].n++;\r\n                    });\r\n                });\r\n                return {\r\n                    theme: t, projets: list.length, muets: muets, liens: liens,\r\n                    total: d3.sum(liens, function(l){ return l.n; })\r\n                };\r\n            \/\/ Une th\u00e9matique sans aucun ruban serait un rectangle de hauteur\r\n            \/\/ nulle avec un libell\u00e9 \u00e0 c\u00f4t\u00e9 : cela ne se lit pas, cela\r\n            \/\/ s'interpr\u00e8te.\r\n            }).filter(function(L){ return L.total > 0; });\r\n\r\n            \/\/ Les cibles vides sortent aussi : un pilier \u00e0 z\u00e9ro n'est pas une\r\n            \/\/ information, c'est une colonne qui attend.\r\n            cibles.forEach(function(C){\r\n                C.n = d3.sum(lignes, function(L){ return L.liens[C.j].n; });\r\n            });\r\n            var vives = cibles.filter(function(C){ return C.n > 0; });\r\n            if (vives.length !== cibles.length){\r\n                lignes.forEach(function(L){\r\n                    L.liens = L.liens.filter(function(l){ return l.C.n > 0; });\r\n                });\r\n                vives.forEach(function(C, j){ C.j = j; });\r\n                cibles = vives;\r\n            }\r\n            if (!lignes.length || !cibles.length) return null;\r\n\r\n            return {\r\n                mode: mode,\r\n                lignes: lignes,\r\n                cibles: cibles,\r\n                passages: d3.sum(lignes, function(L){ return L.total; }),\r\n                projets: PROJETS.length,\r\n                muets: d3.sum(lignes, function(L){ return L.muets; })\r\n            };\r\n        }\r\n\r\n        \/\/ Le contour d'un ruban : deux courbes miroir, horizontales \u00e0 leurs\r\n        \/\/ deux extr\u00e9mit\u00e9s. C'est cette tangente plate qui fait qu'on compare\r\n        \/\/ l'\u00e9paisseur d'un ruban \u00e0 celle de son voisin contre le pilier, l\u00e0 o\u00f9\r\n        \/\/ ils sont empil\u00e9s, et pas au milieu o\u00f9 ils se croisent.\r\n        function fluxRuban(x0, x1, a0, a1, b0, b1){\r\n            var xc = (x0 + x1) \/ 2;\r\n            return \"M\" + x0 + \",\" + a0\r\n                 + \"C\" + xc + \",\" + a0 + \" \" + xc + \",\" + b0 + \" \" + x1 + \",\" + b0\r\n                 + \"L\" + x1 + \",\" + b1\r\n                 + \"C\" + xc + \",\" + b1 + \" \" + xc + \",\" + a1 + \" \" + x0 + \",\" + a1 + \"Z\";\r\n        }\r\n\r\n        function fluxPose(sel, attr, val, delai, duree, ease){\r\n            if (reducedMotion.matches){ sel.attr(attr, val); return; }\r\n            sel.transition(\"flux\").delay(delai).duration(duree)\r\n               .ease(ease || d3.easeCubicOut).attr(attr, val);\r\n        }\r\n\r\n        \/\/ Isoler un flux : le pr\u00e9dicat dit quels rubans restent allum\u00e9s, les\r\n        \/\/ piliers suivent leurs rubans. Sans pr\u00e9dicat, tout se rallume. Chaque\r\n        \/\/ diagramme porte son propre svg : isoler dans l'un ne touche pas\r\n        \/\/ l'autre.\r\n        function fluxIsoler(D, test){\r\n            if (!D || !D.svg) return;\r\n            D.svg.classed(\"is-focus\", !!test);\r\n            D.cibles.forEach(function(C){ C.vif = false; });\r\n            D.lignes.forEach(function(L){\r\n                var vif = false;\r\n                L.liens.forEach(function(l){\r\n                    var on = !!test && test(l);\r\n                    if (l.ruban) l.ruban.classed(\"is-on\", on);\r\n                    if (on){ vif = true; if (l.C) l.C.vif = true; }\r\n                });\r\n                if (L.g) L.g.classed(\"is-on\", vif);\r\n            });\r\n            D.cibles.forEach(function(C){ if (C.g) C.g.classed(\"is-on\", !!C.vif); });\r\n        }\r\n\r\n        function fluxTip(event, l){\r\n            var box = container.getBoundingClientRect();\r\n            var pct = l.L.projets ? Math.round(l.n \/ l.L.projets * 100) : 0;\r\n            tooltip.innerHTML = \"<strong>\" + escapeHTML(l.L.theme.label + \" \u2192 \" + l.C.label) + \"<\\\/strong>\"\r\n                + l.n + \" projet\" + (l.n > 1 ? \"s\" : \"\") + \" sur les \" + l.L.projets\r\n                + \" de la th\u00e9matique (\" + pct + \" %)\"\r\n                + \"<em>\" + escapeHTML(l.C.label) + \" \u00b7 \" + l.C.n + \" projets du fonds au total<\\\/em>\";\r\n            tooltip.style.opacity = 1;\r\n            var x = event.clientX - box.left + 16, y = event.clientY - box.top + 14;\r\n            if (x + 300 > box.width) x = event.clientX - box.left - 306;\r\n            tooltip.style.left = x + \"px\";\r\n            tooltip.style.top = y + \"px\";\r\n        }\r\n\r\n        function fluxTipNoeud(event, titre, corps, pied){\r\n            var box = container.getBoundingClientRect();\r\n            tooltip.innerHTML = \"<strong>\" + escapeHTML(titre) + \"<\\\/strong>\" + corps\r\n                + \"<em>\" + escapeHTML(pied) + \"<\\\/em>\";\r\n            tooltip.style.opacity = 1;\r\n            var x = event.clientX - box.left + 16, y = event.clientY - box.top + 14;\r\n            if (x + 300 > box.width) x = event.clientX - box.left - 306;\r\n            tooltip.style.left = x + \"px\";\r\n            tooltip.style.top = y + \"px\";\r\n        }\r\n\r\n        \/\/ Une th\u00e9matique renvoie \u00e0 son secteur de roue, un \u00e9tage \u00e0 sa planche.\r\n        function fluxVersRoue(key){\r\n            hideTooltip();\r\n            activateTab(\"empreinte\");\r\n            var node = root.children.find(function(c){ return c.data.themeKey === key; });\r\n            if (node) zoomTo(node);\r\n        }\r\n        \/\/ Un pilier de droite renvoie \u00e0 la vue qui le raconte en entier : un\r\n        \/\/ secteur \u00e0 la carte, une tranche de subvention \u00e0 la roue lue en\r\n        \/\/ euros \u2014 o\u00f9 la m\u00eame question se repose, th\u00e9matique par th\u00e9matique.\r\n        \/\/ Une famille de frein n'a plus de vue \u00e0 elle dans la navigation :\r\n        \/\/ son pilier ne m\u00e8ne nulle part.\r\n        function fluxVersCible(D, C){\r\n            hideTooltip();\r\n            if (D.mode === \"frein\") return;\r\n            if (D.mode === \"secteur\"){ activateTab(\"carte\"); return; }\r\n            if (D.mode === \"promesse\"){\r\n                etDemande = C.rang;\r\n                activateTab(\"etages\");\r\n                return;\r\n            }\r\n            if (roueMode !== \"fis\"){ roueMode = \"fis\"; }\r\n            activateTab(\"empreinte\");\r\n            basculePetales();\r\n        }\r\n\r\n        \/\/ anim === false : on ne rejoue pas l'arriv\u00e9e. Un redimensionnement\r\n        \/\/ n'est pas une arriv\u00e9e, et voir les noms s'\u00e9teindre puis se rallumer\r\n        \/\/ \u00e0 chaque poign\u00e9e tir\u00e9e donne l'impression d'un bug.\r\n        var fluxBlocs = [];\r\n        var fluxObs = null, fluxVus = {};\r\n\r\n        function fluxChapeau(D){\r\n            if (D.mode === \"secteur\"){\r\n                return {\r\n                    eyebrow: \"Th\u00e9matiques \u2192 Secteurs\",\r\n                    titre: \"Qui agit o\u00f9, sur le territoire ?\",\r\n                    mode: \"L\u2019\u00e9paisseur d\u2019un ruban, c\u2019est le nombre de projets.\"\r\n                        + \" Survolez une th\u00e9matique pour isoler son flux, cliquez pour l\u2019ouvrir dans la roue.\",\r\n                    note: \"<b>Lecture<\/b> \u00b7 un ruban par couple th\u00e9matique et secteur.\"\r\n                        + \" Le rattachement vient de la carte. Un projet qui travaille sur plusieurs\"\r\n                        + \" secteurs passe dans plusieurs rubans : les \" + D.projets + \" projets du fonds\"\r\n                        + \" y tracent \" + D.passages + \" passages. \u00ab Multisite \u00bb r\u00e9unit ceux qui couvrent\"\r\n                        + \" la ville enti\u00e8re, la m\u00e9tropole ou au-del\u00e0.\"\r\n                };\r\n            }\r\n            if (D.mode === \"promesse\"){\r\n                return {\r\n                    eyebrow: \"Th\u00e9matiques \u2192 \u00c9tages\",\r\n                    titre: \"Qui agit \u00e0 quel \u00e9tage ?\",\r\n                    mode: \"Les trois promesses du fonds, telles que les rapports les documentent.\"\r\n                        + \" Survolez une th\u00e9matique pour isoler son flux, cliquez pour l\u2019ouvrir dans la roue.\",\r\n                    note: \"<b>Lecture<\/b> \u00b7 un ruban par couple th\u00e9matique et promesse.\"\r\n                        + \" Un projet qui documente les trois promesses passe dans trois rubans :\"\r\n                        + \" les \" + D.projets + \" projets du fonds y tracent \" + D.passages + \" passages.\"\r\n                        + (D.muets ? \" \" + D.muets + (D.muets > 1 ? \" projets n\u2019en tracent\" : \" projet n\u2019en trace\")\r\n                            + \" aucun, faute de promesse document\u00e9e dans leur rapport.\" : \"\")\r\n                };\r\n            }\r\n            if (D.mode === \"frein\"){\r\n                \/\/ Le compte utile est celui des projets qui d\u00e9clarent un frein :\r\n                \/\/ un projet muet n'est pas forc\u00e9ment \u00ab sans frein \u00bb, sa rubrique\r\n                \/\/ peut \u00eatre vide. La note distingue les deux cas.\r\n                var declarent = PROJETS.filter(function(p){ return p.freinSet && p.freinSet.length; }).length;\r\n                var autres = D.projets - declarent;\r\n                return {\r\n                    note: \"<b>Lecture<\/b> \u00b7 un ruban par couple th\u00e9matique et famille de frein.\"\r\n                        + \" Un projet qui d\u00e9clare plusieurs familles passe dans plusieurs rubans :\"\r\n                        + \" les \" + declarent + \" projets qui documentent un frein y tracent \" + D.passages + \" passages.\"\r\n                        + (autres ? \" Les \" + autres + \" autres n\u2019en d\u00e9clarent aucun ou n\u2019ont pas renseign\u00e9 la rubrique.\" : \"\")\r\n                };\r\n            }\r\n            return {\r\n                eyebrow: \"Th\u00e9matiques \u2192 Taille du dossier\",\r\n                titre: \"Et avec quel argent ?\",\r\n                mode: \"Les trois tranches de subvention du fonds.\"\r\n                    + \" Un projet ne tombe que dans une seule : ici, les rubans s\u2019additionnent exactement.\",\r\n                note: \"<b>Lecture<\/b> \u00b7 un ruban par couple th\u00e9matique et tranche.\"\r\n                    + \" Chaque projet n\u2019est compt\u00e9 qu\u2019une fois : les \" + D.passages\r\n                    + \" rubans sont les \" + D.passages + \" projets dont le montant est connu\"\r\n                    + (D.muets ? \", les \" + D.muets + \" autres n\u2019ayant pas de montant renseign\u00e9\" : \"\")\r\n                    + \".\"\r\n            };\r\n        }\r\n\r\n        function renderFlux(anim){\r\n            var el = document.getElementById(\"flux\");\r\n            if (!el) return;\r\n            hideTooltip();\r\n            \/\/ Les trois croisements (o\u00f9, avec quel argent, pour quelle\r\n            \/\/ promesse) vivent dans un seul cadre \u00e0 bascule : voir fluxFusion.\r\n            var modes = [];\r\n            var jeux = modes.map(fluxDonnees).filter(Boolean);\r\n            fluxBlocs = jeux;\r\n\r\n            el.innerHTML = '<div class=\"fx-defile\">'\r\n                + jeux.map(function(D, i){\r\n                    var C = fluxChapeau(D);\r\n                    return '<div class=\"fx-cadre\" data-bloc=\"' + i + '\">'\r\n                        + (C.titre ? '<div class=\"fx-tete\">'\r\n                        + '<div><p class=\"fx-eyebrow\">' + C.eyebrow + '<\\\/p>'\r\n                        + '<h2 class=\"fx-titre\">' + C.titre + '<\\\/h2><\\\/div>'\r\n                        + '<p class=\"fx-mode\">' + C.mode + '<\\\/p>'\r\n                        + '<\\\/div>' : '')\r\n                        + '<div class=\"fx-scene\"><\\\/div>'\r\n                        + '<div class=\"fx-pied\">'\r\n                        + '<p class=\"fx-note\">' + C.note + '<\\\/p>'\r\n                        + (i === jeux.length - 1\r\n                            ? '<div class=\"fx-actions\">'\r\n                              + '<button class=\"fx-btn\" type=\"button\" data-vers=\"etages\">Voir les \u00e9tages<\\\/button>'\r\n                              + '<button class=\"fx-btn is-fort\" type=\"button\" data-vers=\"empreinte\">Voir la roue<\\\/button>'\r\n                              + '<\\\/div>'\r\n                            : '')\r\n                        + '<\\\/div><\\\/div>';\r\n                }).join(\"\")\r\n                + fluxFusionCadre(jeux.length)\r\n                + '<\\\/div>';\r\n\r\n            el.querySelectorAll(\".fx-btn\").forEach(function(b){\r\n                b.addEventListener(\"click\", function(){ activateTab(b.getAttribute(\"data-vers\")); });\r\n            });\r\n\r\n            \/\/ Chaque cadre entre quand son diagramme arrive dans le champ, pas\r\n            \/\/ \u00e0 l'ouverture de l'onglet : les deux du bas se dessinaient hors\r\n            \/\/ de l'\u00e9cran, et ce qu'on d\u00e9couvrait en d\u00e9filant \u00e9tait d\u00e9j\u00e0\r\n            \/\/ immobile. Un redimensionnement r\u00e9\u00e9crit les cadres ; seuls ceux\r\n            \/\/ qu'on n'a pas encore vus se r\u00e9arment. Sans IntersectionObserver,\r\n            \/\/ ou si la personne demande moins de mouvement, tout est pos\u00e9.\r\n            if (fluxObs){ fluxObs.disconnect(); fluxObs = null; }\r\n            if (anim !== false) fluxVus = {};\r\n            var peutJouer = !reducedMotion.matches && \"IntersectionObserver\" in window;\r\n            var cadres = el.querySelectorAll(\".fx-cadre\");\r\n            var scenes = el.querySelectorAll(\".fx-scene\");\r\n            jeux.forEach(function(D, i){\r\n                var joue = peutJouer && !fluxVus[D.mode];\r\n                if (joue) cadres[i].classList.add(\"is-arme\");\r\n                fluxDessiner(scenes[i], D, joue, i);\r\n            });\r\n            var jouerFusion = peutJouer && !fluxVus.fusion;\r\n            fluxFusionBrancher(el, jouerFusion);\r\n            if (!peutJouer) return;\r\n            fluxObs = new IntersectionObserver(function(entrees){\r\n                \/\/ Deux cadres qui entrent ensemble (\u00e9cran haut) partent l'un\r\n                \/\/ apr\u00e8s l'autre, pas d'un bloc.\r\n                var k = 0;\r\n                entrees.forEach(function(e){\r\n                    if (!e.isIntersecting) return;\r\n                    var i = +e.target.closest(\".fx-cadre\").getAttribute(\"data-bloc\");\r\n                    var cadre = cadres[i], dec = k++ * 220;\r\n                    var D = i < jeux.length ? jeux[i] : fluxFusion.D;\r\n                    fluxVus[i < jeux.length ? D.mode : \"fusion\"] = true;\r\n                    fluxObs.unobserve(e.target);\r\n                    cadre.style.setProperty(\"--dec\", dec + \"ms\");\r\n                    cadre.classList.add(\"is-in\");\r\n                    if (D && D.entree) D.entree(dec);\r\n                });\r\n            }, { threshold: 0.3 });\r\n            jeux.forEach(function(D, i){ if (!fluxVus[D.mode]) fluxObs.observe(scenes[i]); });\r\n            if (jouerFusion && scenes[jeux.length]) fluxObs.observe(scenes[jeux.length]);\r\n        }\r\n\r\n        \/\/ ---- LE FLUX \u00c0 BASCULE ----\r\n        \/\/ Les trois croisements dans un seul cadre, avec une bascule. Les\r\n        \/\/ th\u00e9matiques restent \u00e0 gauche ; au changement, leurs piliers\r\n        \/\/ glissent vers leur nouvelle hauteur, les rubans partent de leur\r\n        \/\/ ancienne place et se redistribuent vers les nouvelles cibles.\r\n        \/\/ Les libell\u00e9s s'\u00e9teignent pendant le mouvement et se reposent apr\u00e8s.\r\n        var fluxFusion = { mode: \"secteur\", D: null };\r\n        var FUSION_MODES = [\r\n            { mode: \"secteur\",  label: \"Territoire\" },\r\n            { mode: \"argent\",   label: \"Argent\" },\r\n            { mode: \"promesse\", label: \"Promesse\" }\r\n        ];\r\n\r\n        function fluxFusionCadre(i){\r\n            return '<div class=\"fx-cadre fx-fusion\" data-bloc=\"' + i + '\">'\r\n                + '<div class=\"fx-tete\">'\r\n                + '<div><p class=\"fx-eyebrow\">Th\u00e9matiques \u2192 Territoire, argent, promesse<\\\/p>'\r\n                + '<h2 class=\"fx-titre\">Qui agit o\u00f9, avec quel argent, pour quoi ?<\\\/h2>'\r\n                + '<p class=\"fx-constat\" aria-live=\"polite\"><\\\/p><\\\/div>'\r\n                + '<div class=\"fx-bascule\" role=\"tablist\" aria-label=\"Croiser les th\u00e9matiques avec\">'\r\n                + FUSION_MODES.map(function(m){\r\n                    return '<button type=\"button\" role=\"tab\" class=\"fx-bascule-btn\" data-mode=\"' + m.mode + '\">'\r\n                        + m.label + '<\\\/button>';\r\n                }).join(\"\")\r\n                + '<\\\/div><\\\/div>'\r\n                + '<div class=\"fx-scene\"><\\\/div>'\r\n                + '<div class=\"fx-pied\"><p class=\"fx-note\"><\\\/p><\\\/div>'\r\n                + '<\\\/div>';\r\n        }\r\n\r\n        function fluxFusionBrancher(el, joue){\r\n            var cadre = el.querySelector(\".fx-fusion\");\r\n            if (!cadre) return;\r\n            var scene = cadre.querySelector(\".fx-scene\");\r\n            var D = fluxDonnees(fluxFusion.mode);\r\n            fluxFusion.D = D;\r\n            if (joue) cadre.classList.add(\"is-arme\");\r\n            if (D) fluxDessiner(scene, D, joue, \"fu\");\r\n            fluxFusionEtat(cadre);\r\n            var constat = cadre.querySelector(\".fx-constat\");\r\n            if (constat) constat.classList.add(\"is-pose\");\r\n            cadre.querySelectorAll(\".fx-bascule-btn\").forEach(function(b){\r\n                b.addEventListener(\"click\", function(){\r\n                    fluxFusionBasculer(cadre, b.getAttribute(\"data-mode\"));\r\n                });\r\n            });\r\n        }\r\n\r\n        function fluxFusionEtat(cadre){\r\n            cadre.querySelectorAll(\".fx-bascule-btn\").forEach(function(b){\r\n                var on = b.getAttribute(\"data-mode\") === fluxFusion.mode;\r\n                b.classList.toggle(\"is-on\", on);\r\n                b.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\r\n            });\r\n            var note = cadre.querySelector(\".fx-note\");\r\n            if (note && fluxFusion.D) note.innerHTML = fluxChapeau(fluxFusion.D).note;\r\n            var constat = cadre.querySelector(\".fx-constat\");\r\n            if (constat && fluxFusion.D) constat.innerHTML = fluxConstat(fluxFusion.D);\r\n        }\r\n\r\n        \/\/ Le constat : la phrase qu'on retient et qu'on cite. Calcul\u00e9e sur\r\n        \/\/ les donn\u00e9es, pour rester juste quand le fonds s'enrichit.\r\n        function fluxConstat(D){\r\n            function projets(n){ return n + \" projet\" + (n > 1 ? \"s\" : \"\"); }\r\n            function pct(n, d){ return d ? Math.round(n \/ d * 100) : 0; }\r\n            function parN(a, b){ return b.n - a.n; }\r\n            \/\/ La th\u00e9matique qui p\u00e8se le plus vers une cible donn\u00e9e.\r\n            function meneur(C){\r\n                var best = null;\r\n                D.lignes.forEach(function(L){\r\n                    L.liens.forEach(function(l){\r\n                        if (l.C === C && (!best || l.n > best.n)) best = { n: l.n, L: L };\r\n                    });\r\n                });\r\n                return best && best.n ? best.L.theme.label : null;\r\n            }\r\n            var cs = D.cibles.slice().sort(parN);\r\n            if (!cs.length) return \"\";\r\n            if (D.mode === \"secteur\"){\r\n                var locaux = cs.filter(function(C){ return C.key !== \"MULTISITE\"; });\r\n                var top = locaux[0] || cs[0];\r\n                var th = meneur(top);\r\n                return \"<b>\" + escapeHTML(top.label) + \"<\/b> est le secteur le plus investi : \"\r\n                    + projets(top.n) + \" sur \" + D.projets + \" y agissent\"\r\n                    + (th ? \", d\u2019abord en \u00ab \" + escapeHTML(th) + \" \u00bb\" : \"\") + \".\";\r\n            }\r\n            if (D.mode === \"promesse\"){\r\n                var haut = cs[0], bas = cs[cs.length - 1];\r\n                if (haut === bas || haut.n === bas.n)\r\n                    return \"Les promesses sont document\u00e9es \u00e0 parts \u00e9gales : \" + projets(haut.n) + \" chacune.\";\r\n                \/\/ Un \u00e9cart de trois projets n'est pas un constat : on dit\r\n                \/\/ plut\u00f4t que les promesses avancent ensemble.\r\n                if ((haut.n - bas.n) \/ D.projets < 0.15)\r\n                    return \"Les trois promesses avancent ensemble : chacune est document\u00e9e par <b>\"\r\n                        + bas.n + \" \u00e0 \" + haut.n + \" projets<\/b> sur \" + D.projets + \".\";\r\n                return \"<b>\u00ab \" + escapeHTML(haut.label) + \" \u00bb<\/b> est document\u00e9e par \"\r\n                    + projets(haut.n) + \" sur \" + D.projets + \", \u00ab \" + escapeHTML(bas.label)\r\n                    + \" \u00bb par seulement \" + bas.n + \".\";\r\n            }\r\n            var t = cs[0];\r\n            var p = pct(t.n, D.passages);\r\n            return (p >= 50 ? \"Plus de la moiti\u00e9 des projets\" : \"La plus grande part des projets\")\r\n                + \" re\u00e7oit <b>\" + escapeHTML(t.label) + \"<\/b> : \" + t.n + \" sur les \"\r\n                + D.passages + \" dont le montant est connu, soit \" + p + \" %.\";\r\n        }\r\n\r\n        function fluxFusionBasculer(cadre, mode){\r\n            if (mode === fluxFusion.mode) return;\r\n            var ancien = fluxFusion.D;\r\n            var D = fluxDonnees(mode);\r\n            if (!D) return;\r\n            hideTooltip();\r\n            fluxFusion.mode = mode;\r\n            fluxFusion.D = D;\r\n            var scene = cadre.querySelector(\".fx-scene\");\r\n            \/\/ O\u00f9 chaque th\u00e9matique se tenait avant la bascule.\r\n            var avant = {};\r\n            if (ancien && ancien.lignes) ancien.lignes.forEach(function(L){\r\n                if (L.y0 != null) avant[L.theme.key] = { y0: L.y0, h: L.h };\r\n            });\r\n            d3.select(scene).selectAll(\"svg\").interrupt().remove();\r\n            fluxDessiner(scene, D, false, \"fu\");\r\n            fluxFusionEtat(cadre);\r\n            if (reducedMotion.matches || !D.svg || !D.geo) return;\r\n            var constat = cadre.querySelector(\".fx-constat\");\r\n            if (constat){\r\n                constat.classList.remove(\"is-pose\");\r\n                clearTimeout(fluxFusion.minuteur);\r\n                fluxFusion.minuteur = setTimeout(function(){ constat.classList.add(\"is-pose\"); }, 900);\r\n            }\r\n\r\n            var g = D.geo, x0 = g.xa + g.NW;\r\n            var T = 780, T_TEXTE = T + 120;\r\n            var textes = D.svg.selectAll(\".fx-libelle\").attr(\"opacity\", 0);\r\n            D.lignes.forEach(function(L){\r\n                var a = avant[L.theme.key] || { y0: L.y0 + L.h \/ 2, h: 0 };\r\n                var r = L.h ? a.h \/ L.h : 0;\r\n                L.bar.attr(\"y\", a.y0).attr(\"height\", a.h)\r\n                    .transition(\"flux\").duration(T).ease(d3.easeCubicInOut)\r\n                    .attr(\"y\", L.y0).attr(\"height\", L.h);\r\n                L.liens.forEach(function(l){\r\n                    if (!l.ruban) return;\r\n                    \/\/ D\u00e9part : la part du ruban dans l'ancien pilier, tir\u00e9e\r\n                    \/\/ \u00e0 plat jusqu'\u00e0 droite ; arriv\u00e9e : sa vraie courbe.\r\n                    var s0 = a.y0 + (l.sy0 - L.y0) * r, s1 = s0 + l.ep * r;\r\n                    l.ruban.attr(\"d\", fluxRuban(x0, g.xb, s0, s1, s0, s1))\r\n                        .transition(\"flux\").duration(T).ease(d3.easeCubicInOut)\r\n                        .attr(\"d\", fluxRuban(x0, g.xb, l.sy0, l.sy0 + l.ep, l.ty0, l.ty0 + l.ep));\r\n                });\r\n            });\r\n            D.cibles.forEach(function(C, i){\r\n                C.bar.attr(\"y\", C.y0 + C.h \/ 2).attr(\"height\", 0)\r\n                    .transition(\"flux\").delay(T * 0.35 + i * 50).duration(T * 0.65)\r\n                    .ease(d3.easeCubicOut)\r\n                    .attr(\"y\", C.y0).attr(\"height\", C.h);\r\n            });\r\n            textes.each(function(_, i){\r\n                d3.select(this).transition(\"flux\")\r\n                    .delay(T_TEXTE + Math.min(i * 40, 480))\r\n                    .duration(360).attr(\"opacity\", 1);\r\n            });\r\n        }\r\n\r\n        function fluxDessiner(scene, D, anim, idx){\r\n            if (!scene) return;\r\n            var W = scene.clientWidth, H = scene.clientHeight;\r\n            if (!W || !H || !D.lignes.length) return;\r\n\r\n            var etroit = W < 760, moyen = W < 1060;\r\n            var wLab = etroit ? 118 : moyen ? 134 : 168;   \/\/ colonne des noms de th\u00e9matique\r\n            var wPr  = etroit ? 122 : moyen ? 152 : 208;   \/\/ colonne des libell\u00e9s de droite\r\n            var NW   = etroit ? 9 : 12;                     \/\/ largeur d'un pilier\r\n            var padT = 28, padB = 6;\r\n            var xa = wLab + 12;\r\n            var xb = Math.max(xa + NW + 64, W - wPr - 14 - NW);\r\n\r\n            var V = D.passages;\r\n            var gapL = etroit ? 5 : 7, gapR = etroit ? 18 : 28;\r\n            var hUtile = H - padT - padB;\r\n            \/\/ La m\u00eame \u00e9chelle des deux c\u00f4t\u00e9s : c'est ce qui autorise \u00e0 comparer\r\n            \/\/ la hauteur d'une th\u00e9matique \u00e0 celle d'un \u00e9tage. Elle est donc\r\n            \/\/ command\u00e9e par le c\u00f4t\u00e9 le plus contraint, jamais r\u00e9ajust\u00e9e ensuite.\r\n            var k = Math.min(\r\n                (hUtile - (D.lignes.length - 1) * gapL) \/ V,\r\n                (hUtile - (D.cibles.length - 1) * gapR) \/ V\r\n            );\r\n            if (!(k > 0)) return;\r\n\r\n            var hG = V * k + (D.lignes.length - 1) * gapL;\r\n            var y = padT + (hUtile - hG) \/ 2;\r\n            D.lignes.forEach(function(L){\r\n                L.y0 = y; L.h = L.total * k; y += L.h + gapL;\r\n                var c = L.y0;\r\n                L.liens.forEach(function(l){ l.sy0 = c; l.ep = l.n * k; c += l.ep; l.L = L; });\r\n            });\r\n\r\n            var hD = V * k + (D.cibles.length - 1) * gapR;\r\n            var yd = padT + (hUtile - hD) \/ 2;\r\n            D.cibles.forEach(function(C){\r\n                C.y0 = yd; C.h = C.n * k; yd += C.h + gapR;\r\n                C.curseur = C.y0;\r\n            });\r\n            \/\/ Les rubans se rangent dans l'ordre des th\u00e9matiques \u00e0 l'arriv\u00e9e,\r\n            \/\/ comme ils se rangent dans l'ordre des \u00e9tages au d\u00e9part : deux\r\n            \/\/ empilements coh\u00e9rents, donc un tressage sans croisement inutile.\r\n            D.lignes.forEach(function(L){\r\n                L.liens.forEach(function(l, j){\r\n                    var C = D.cibles[j];\r\n                    l.C = C; l.ty0 = C.curseur; C.curseur += l.ep;\r\n                });\r\n            });\r\n\r\n            var svg = d3.select(scene).append(\"svg\")\r\n                .attr(\"class\", \"fx-svg\")\r\n                .attr(\"viewBox\", \"0 0 \" + W + \" \" + H)\r\n                .attr(\"preserveAspectRatio\", \"xMidYMid meet\")\r\n                .attr(\"role\", \"group\")\r\n                .attr(\"aria-label\", \"Diagramme de flux : les \" + D.lignes.length\r\n                    + \" th\u00e9matiques du fonds et les \" + D.cibles.length\r\n                    + (D.mode === \"secteur\" ? \" secteurs o\u00f9 elles agissent\"\r\n                        : D.mode === \"promesse\" ? \" promesses du fonds\"\r\n                        : D.mode === \"frein\" ? \" familles de freins d\u00e9clar\u00e9es\" : \" tranches de subvention\"));\r\n            D.svg = svg;\r\n            D.geo = { xa: xa, NW: NW, xb: xb };\r\n\r\n            var defs = svg.append(\"defs\");\r\n            \/\/ Le ruban part de la teinte de sa th\u00e9matique et vire vers celle de\r\n            \/\/ sa promesse sans jamais l'atteindre : on suit un ruban de l'oeil\r\n            \/\/ par sa couleur de d\u00e9part, et l'inflexion d'arriv\u00e9e suffit \u00e0 dire\r\n            \/\/ o\u00f9 il va sans qu'une seconde cl\u00e9 de couleur soit \u00e0 apprendre.\r\n            D.lignes.forEach(function(L, i){\r\n                L.liens.forEach(function(l, j){\r\n                    l.grad = \"fis-fx-\" + (idx || 0) + \"-\" + i + \"-\" + j;\r\n                    var g = defs.append(\"linearGradient\")\r\n                        .attr(\"id\", l.grad).attr(\"gradientUnits\", \"userSpaceOnUse\")\r\n                        .attr(\"x1\", xa + NW).attr(\"x2\", xb);\r\n                    g.append(\"stop\").attr(\"offset\", \"0%\").attr(\"stop-color\", L.theme.color);\r\n                    g.append(\"stop\").attr(\"offset\", \"100%\")\r\n                        .attr(\"stop-color\", mix(L.theme.color, l.C.color, 0.34));\r\n                });\r\n            });\r\n            var voletId = \"fis-fx-volet-\" + (idx || 0);\r\n            var volet = defs.append(\"clipPath\").attr(\"id\", voletId)\r\n                .append(\"rect\").attr(\"x\", xa + NW).attr(\"y\", -20)\r\n                .attr(\"height\", H + 40).attr(\"width\", 0);\r\n\r\n            var gRubans = svg.append(\"g\").attr(\"class\", \"fx-rubans\")\r\n                .attr(\"clip-path\", \"url(#\" + voletId + \")\");\r\n            var gPiliers = svg.append(\"g\").attr(\"class\", \"fx-piliers\");\r\n\r\n            D.lignes.forEach(function(L){\r\n                L.liens.forEach(function(l){\r\n                    if (!l.n) return;\r\n                    l.ruban = gRubans.append(\"path\")\r\n                        .attr(\"class\", \"fx-ruban\")\r\n                        .attr(\"fill\", \"url(#\" + l.grad + \")\")\r\n                        .attr(\"d\", fluxRuban(xa + NW, xb, l.sy0, l.sy0 + l.ep, l.ty0, l.ty0 + l.ep))\r\n                        .on(\"mousemove\", function(e){ fluxTip(e, l); fluxIsoler(D, function(x){ return x === l; }); })\r\n                        .on(\"mouseleave\", function(){ hideTooltip(); fluxIsoler(D, null); })\r\n                        .on(\"click\", function(){ fluxVersRoue(l.L.theme.key); });\r\n                });\r\n            });\r\n\r\n            \/\/ ---- les piliers des th\u00e9matiques ----\r\n            var textes = [];\r\n            D.lignes.forEach(function(L, i){\r\n                var g = gPiliers.append(\"g\")\r\n                    .attr(\"class\", \"fx-noeud\")\r\n                    .attr(\"role\", \"button\").attr(\"tabindex\", 0)\r\n                    .attr(\"aria-label\", L.theme.label + \" : \" + L.projets + \" projet\"\r\n                        + (L.projets > 1 ? \"s\" : \"\") + \", \" + L.total + \" rubans vers \"\r\n                        + (D.mode === \"secteur\" ? \"les secteurs\"\r\n                            : D.mode === \"promesse\" ? \"les trois promesses\"\r\n                            : D.mode === \"frein\" ? \"les familles de freins\" : \"les tranches de subvention\")\r\n                        + \". Ouvrir dans la roue.\");\r\n                L.g = g;\r\n                g.append(\"rect\").attr(\"class\", \"fx-hit\")\r\n                    .attr(\"x\", 0).attr(\"y\", L.y0 - gapL \/ 2)\r\n                    .attr(\"width\", xa + NW).attr(\"height\", L.h + gapL);\r\n                L.bar = g.append(\"rect\").attr(\"class\", \"fx-pilier\")\r\n                    .attr(\"x\", xa).attr(\"y\", L.y0).attr(\"width\", NW)\r\n                    .attr(\"rx\", Math.min(3, NW \/ 3))\r\n                    .attr(\"fill\", L.theme.color)\r\n                    .attr(\"height\", reducedMotion.matches ? L.h : 0);\r\n\r\n                var cy = L.y0 + L.h \/ 2;\r\n                var deux = L.h >= 20;\r\n                var t = g.append(\"text\")\r\n                    .attr(\"class\", \"fx-libelle\").attr(\"text-anchor\", \"end\")\r\n                    .attr(\"x\", xa - 11).attr(\"fill\", L.theme.textColor);\r\n                t.append(\"tspan\").attr(\"class\", \"fx-nom\").attr(\"x\", xa - 11)\r\n                    .attr(\"y\", deux ? cy - 4 : cy + 4)\r\n                    .text(etroit ? shorten(L.theme.label, 18) : L.theme.label);\r\n                if (deux){\r\n                    t.append(\"tspan\").attr(\"class\", \"fx-compte\").attr(\"x\", xa - 11)\r\n                        .attr(\"y\", cy + 8)\r\n                        .text(D.mode !== \"argent\"\r\n                            ? (moyen ? L.total + \" passages\"\r\n                                : L.projets + \" projet\" + (L.projets > 1 ? \"s\" : \"\") + \" \u00b7 \" + L.total + \" passages\")\r\n                            : L.projets + \" projet\" + (L.projets > 1 ? \"s\" : \"\"));\r\n                }\r\n                textes.push(t);\r\n\r\n                var isole = function(x){ return x.L === L; };\r\n                g.on(\"mousemove\", function(e){\r\n                        fluxIsoler(D, isole);\r\n                        fluxTipNoeud(e, L.theme.label,\r\n                            L.projets + \" projet\" + (L.projets > 1 ? \"s\" : \"\") + \" \u00b7 \"\r\n                            + L.liens.filter(function(l){ return l.n; })\r\n                                .map(function(l){ return l.n + \" \" + l.C.label.toLowerCase(); }).join(\" \u00b7 \"),\r\n                            \"Cliquez pour ouvrir la th\u00e9matique dans la roue\");\r\n                    })\r\n                    .on(\"mouseleave\", function(){ hideTooltip(); fluxIsoler(D, null); })\r\n                    .on(\"click\", function(){ fluxVersRoue(L.theme.key); })\r\n                    .on(\"focus\", function(){ fluxIsoler(D, isole); })\r\n                    .on(\"blur\", function(){ fluxIsoler(D, null); })\r\n                    .on(\"keydown\", function(e){\r\n                        if (e.key === \"Enter\" || e.key === \" \"){ e.preventDefault(); fluxVersRoue(L.theme.key); }\r\n                    });\r\n            });\r\n\r\n            \/\/ ---- les piliers de droite ----\r\n            var xt = xb + NW + 13;\r\n            \/\/ R\u00e9server une ligne par cible avant de poser les textes : les\r\n            \/\/ secteurs voisins peuvent avoir des piliers tr\u00e8s rapproch\u00e9s.\r\n            var labelGap = 9;\r\n            var labelH = D.mode === \"secteur\" ? 34 : 35;\r\n            var labelBas = 20;\r\n            D.cibles.forEach(function(C){\r\n                C.labelY = Math.max(labelBas, C.y0 + C.h \/ 2 - 6);\r\n                labelBas = C.labelY + labelH + labelGap;\r\n            });\r\n            var excedent = labelBas - labelGap - H;\r\n            if (excedent > 0){\r\n                for (var q = D.cibles.length - 1; q >= 0; q--){\r\n                    var cible = D.cibles[q];\r\n                    cible.labelY = Math.max(20 + q * (labelH + labelGap), cible.labelY - excedent);\r\n                    excedent = Math.max(0, cible.labelY + labelH + labelGap -\r\n                        (q + 1 < D.cibles.length ? D.cibles[q + 1].labelY : H));\r\n                }\r\n            }\r\n            D.cibles.forEach(function(C){\r\n                \/\/ Le d\u00e9nominateur, ce sont les PROJETS du fonds, pas les rubans :\r\n                \/\/ un projet n'est compt\u00e9 qu'une fois par cible, et \u00ab 36 projets\r\n                \/\/ sur 48 \u00bb se lit, l\u00e0 o\u00f9 \u00ab 32 % des rubans \u00bb ne dit rien.\r\n                var pct = D.projets ? Math.round(C.n \/ D.projets * 100) : 0;\r\n                \/\/ Une famille de frein ne m\u00e8ne \u00e0 aucune vue : son pilier se\r\n                \/\/ survole et prend le focus pour isoler son flux, sans se\r\n                \/\/ pr\u00e9senter comme un bouton.\r\n                var inerte = D.mode === \"frein\";\r\n                var g = gPiliers.append(\"g\")\r\n                    .attr(\"class\", \"fx-etage\")\r\n                    .classed(\"is-inerte\", inerte)\r\n                    .attr(\"role\", inerte ? \"img\" : \"button\").attr(\"tabindex\", 0)\r\n                    .attr(\"aria-label\", C.label + \" : \" + C.n + \" projets.\"\r\n                        + (inerte ? \"\"\r\n                            : D.mode === \"secteur\" ? \" Ouvrir la carte.\"\r\n                            : D.mode === \"promesse\" ? \" Ouvrir la planche des \u00e9tages.\"\r\n                            : \" Ouvrir la roue lue en euros.\"));\r\n                C.g = g;\r\n                g.append(\"rect\").attr(\"class\", \"fx-hit\")\r\n                    .attr(\"x\", xb).attr(\"y\", C.y0 - gapR \/ 2)\r\n                    .attr(\"width\", Math.max(0, W - xb)).attr(\"height\", C.h + gapR);\r\n                C.bar = g.append(\"rect\").attr(\"class\", \"fx-pilier\")\r\n                    .attr(\"x\", xb).attr(\"y\", C.y0).attr(\"width\", NW)\r\n                    .attr(\"rx\", Math.min(3, NW \/ 3))\r\n                    .attr(\"fill\", C.color)\r\n                    .attr(\"height\", reducedMotion.matches ? C.h : 0);\r\n\r\n                var cy = C.y0 + C.h \/ 2;\r\n                \/\/ Les pr\u00e9cisions g\u00e9ographiques restent dans la carte et dans\r\n                \/\/ l'infobulle : elles \u00e9touffaient les six noms c\u00f4te \u00e0 c\u00f4te.\r\n                \/\/ L'intitul\u00e9 complet d'une famille de frein redirait son nom :\r\n                \/\/ il reste dans l'infobulle.\r\n                var phrase = (D.mode === \"secteur\" || inerte) ? []\r\n                    : ((!etroit && wPr >= 180 && C.sub) ? wrapWords(C.sub, 30) : []);\r\n                var haut = C.labelY;\r\n                var t = g.append(\"text\").attr(\"class\", \"fx-libelle\")\r\n                    .attr(\"x\", xt).attr(\"fill\", C.textColor);\r\n                t.append(\"tspan\").attr(\"class\", \"fx-et-nom\").attr(\"x\", xt).attr(\"y\", haut)\r\n                    \/\/ \u00ab 15 000 \u00e0 30 000 \u20ac \u00bb coup\u00e9 \u00e0 seize signes devient \u00ab 15 000 \u00e0\r\n                    \/\/ 30 000. \u00bb, qui se lit comme une phrase inachev\u00e9e : la borne\r\n                    \/\/ haute d'une tranche ne se tronque pas.\r\n                    .text(etroit ? shorten(C.label, 20) : C.label);\r\n                t.append(\"tspan\").attr(\"class\", \"fx-et-val\").attr(\"x\", xt).attr(\"y\", haut + 16)\r\n                    .text(etroit ? C.n + \" projets\"\r\n                        : C.n + \" projets sur \" + D.projets + \" \u00b7 \" + pct + \" %\");\r\n                phrase.forEach(function(ligne, q){\r\n                    t.append(\"tspan\").attr(\"class\", \"fx-et-phrase\").attr(\"x\", xt)\r\n                        .attr(\"y\", haut + 32 + q * 11).text(ligne);\r\n                });\r\n                textes.push(t);\r\n\r\n                var isole = function(x){ return x.C === C; };\r\n                g.on(\"mousemove\", function(e){\r\n                        fluxIsoler(D, isole);\r\n                        fluxTipNoeud(e, C.label,\r\n                            C.n + \" projet\" + (C.n > 1 ? \"s\" : \"\") + \" sur les \" + D.projets\r\n                            + \" du fonds (\" + pct + \" %)\" + (C.sub ? \" \u00b7 \" + C.sub : \"\"),\r\n                            inerte ? \"Un projet peut d\u00e9clarer plusieurs familles\"\r\n                                : D.mode === \"secteur\" ? \"Cliquez pour ouvrir la carte\"\r\n                                : D.mode === \"promesse\" ? \"Cliquez pour ouvrir sa planche dans Les trois \u00e9tages\"\r\n                                : \"Cliquez pour ouvrir la roue lue en euros\");\r\n                    })\r\n                    .on(\"mouseleave\", function(){ hideTooltip(); fluxIsoler(D, null); })\r\n                    .on(\"click\", function(){ fluxVersCible(D, C); })\r\n                    .on(\"focus\", function(){ fluxIsoler(D, isole); })\r\n                    .on(\"blur\", function(){ fluxIsoler(D, null); })\r\n                    .on(\"keydown\", function(e){\r\n                        if (e.key === \"Enter\" || e.key === \" \"){ e.preventDefault(); fluxVersCible(D, C); }\r\n                    });\r\n            });\r\n\r\n            \/\/ ---- l'entr\u00e9e : la g\u00e9om\u00e9trie d'abord, muette, les mots ensuite ----\r\n            \/\/ Les piliers de d\u00e9part poussent, les rubans se d\u00e9roulent de gauche \u00e0 droite\r\n            \/\/ derri\u00e8re un volet, les piliers d'arriv\u00e9e montent quand les rubans\r\n            \/\/ les atteignent. Rien n'est \u00e9crit tant que quelque chose bouge :\r\n            \/\/ un nom qui voyage avec sa barre ne se lit pas, il clignote.\r\n            if (reducedMotion.matches || anim === false){\r\n                volet.attr(\"width\", Math.max(0, xb - xa - NW));\r\n                textes.forEach(function(t){ t.attr(\"opacity\", 1); });\r\n                D.lignes.forEach(function(L){ L.bar.attr(\"height\", L.h); });\r\n                D.cibles.forEach(function(C){ C.bar.attr(\"height\", C.h); });\r\n                return;\r\n            }\r\n            \/\/ Le diagramme reste \u00e9teint, pr\u00eat \u00e0 partir : c'est renderFlux qui\r\n            \/\/ lance l'entr\u00e9e, quand le cadre arrive dans le champ. `dec`\r\n            \/\/ d\u00e9cale l'ensemble quand deux cadres y entrent ensemble.\r\n            textes.forEach(function(t){ t.attr(\"opacity\", 0); });\r\n            D.entree = function(dec){\r\n                D.entree = null;\r\n                var T_RUBANS = 340, T_ETAGES = 980, T_TEXTE = 1520;\r\n                D.lignes.forEach(function(L, i){\r\n                    fluxPose(L.bar, \"height\", L.h, dec + i * 42, 520);\r\n                });\r\n                fluxPose(volet, \"width\", Math.max(0, xb - xa - NW), dec + T_RUBANS, 760, d3.easeCubicInOut);\r\n                D.cibles.forEach(function(C, i){\r\n                    fluxPose(C.bar, \"height\", C.h, dec + T_ETAGES + i * 90, 520);\r\n                });\r\n                textes.forEach(function(t, i){\r\n                    t.transition(\"flux\")\r\n                        .delay(dec + T_TEXTE + Math.min(i * 48, 560))\r\n                        .duration(380).attr(\"opacity\", 1);\r\n                });\r\n            };\r\n        }\r\n\r\n        \/\/ ============ 5 ter. DESSIN DE LA FLEUR ============\r\n        \/\/ R\u00e9p\u00e8te un motif tout autour du centre.\r\n        function floraRing(markup, count, offsetDeg){\r\n            var out = [], i;\r\n            for (i = 0; i < count; i++){\r\n                out.push('<g transform=\"rotate(' + (offsetDeg + i * 360 \/ count).toFixed(2) + ')\">'\r\n                    + markup + '<\\\/g>');\r\n            }\r\n            return out.join(\"\");\r\n        }\r\n\r\n        \/\/ Lance effil\u00e9e, pointe vers l'ext\u00e9rieur (mont\u00e9e en comp\u00e9tences).\r\n        function floraRay(){\r\n            var r0 = 15, r1 = 45, w = 4.4;\r\n            var m1 = -(r0 + (r1 - r0) * 0.50), m2 = -(r0 + (r1 - r0) * 0.10);\r\n            return '<path d=\"M0,' + (-r1)\r\n                + 'C' + w + ',' + m1 + ' ' + (w * 0.85) + ',' + m2 + ' 0,' + (-r0)\r\n                + 'C' + (-w * 0.85) + ',' + m2 + ' ' + (-w) + ',' + m1 + ' 0,' + (-r1) + 'Z\"\/>';\r\n        }\r\n\r\n        \/\/ P\u00e9tale en coeur, pointe vers l'ext\u00e9rieur (lien social).\r\n        function floraPetal(){\r\n            var r0 = 12, r1 = 31, s = (r1 - r0) \/ 1.85;\r\n            function P(x, y){\r\n                return (x * s * 0.86).toFixed(2) + ',' + ((y + 1) * s - r1).toFixed(2);\r\n            }\r\n            return '<path d=\"M' + P(0, -1)\r\n                + 'C' + P(-1.12, -0.04) + ' ' + P(-0.88, 0.85) + ' ' + P(-0.40, 0.85)\r\n                + 'C' + P(-0.06, 0.85) + ' ' + P(0, 0.52) + ' ' + P(0, 0.34)\r\n                + 'C' + P(0, 0.52) + ' ' + P(0.06, 0.85) + ' ' + P(0.40, 0.85)\r\n                + 'C' + P(0.88, 0.85) + ' ' + P(1.12, -0.04) + ' ' + P(0, -1) + 'Z\"\/>';\r\n        }\r\n\r\n        \/\/ Vrille \u00e0 deux brins termin\u00e9s par une perle (changement de comportement).\r\n        \/\/ Les brins montent puis se recourbent vers l'ext\u00e9rieur : c'est cette\r\n        \/\/ courbure qui distingue la couche des lances jaunes, rectilignes.\r\n        function floraTendril(color){\r\n            var r0 = 13, tx = 18.5, ty = 31;\r\n            function brin(s){\r\n                return '<path d=\"M0,' + (-r0)\r\n                    + 'C' + (s * 1.5) + ',' + (-(r0 + 13))\r\n                    + ' ' + (s * 9) + ',' + (-(r0 + 26))\r\n                    + ' ' + (s * tx) + ',' + (-ty) + '\"\/>'\r\n                    + '<circle cx=\"' + (s * tx) + '\" cy=\"' + (-ty)\r\n                    + '\" r=\"2.2\" fill=\"' + color + '\" stroke=\"none\"\/>';\r\n            }\r\n            return brin(-1) + brin(1);\r\n        }\r\n\r\n        \/\/ Coeur de fleur grain\u00e9 (sorties positives) : la seule couche pleine,\r\n        \/\/ elle ancre le glyphe et reste lisible m\u00eame tr\u00e8s r\u00e9duite.\r\n        function floraSeed(color, dark){\r\n            var out = '<circle r=\"11.4\" fill=\"' + color + '\"\/>', i, a;\r\n            for (i = 0; i < 13; i++){\r\n                a = i \/ 13 * 2 * Math.PI;\r\n                out += '<circle cx=\"' + (Math.cos(a) * 10.6).toFixed(2)\r\n                    + '\" cy=\"' + (Math.sin(a) * 10.6).toFixed(2) + '\" r=\"2.7\" fill=\"' + color + '\"\/>';\r\n            }\r\n            \/\/ Le grain sombre du coeur, isol\u00e9 dans son groupe : les plans en\r\n            \/\/ fuite des \u00e9tages le retirent, trente cercles ne valant pas\r\n            \/\/ d'\u00eatre peints quand la fleur tient en deux pixels.\r\n            var grain = '<circle r=\"1.55\" fill=\"' + dark + '\"\/>';\r\n            for (i = 0; i < 6; i++){\r\n                a = i \/ 6 * 2 * Math.PI;\r\n                grain += '<circle cx=\"' + (Math.cos(a) * 4.7).toFixed(2)\r\n                    + '\" cy=\"' + (Math.sin(a) * 4.7).toFixed(2) + '\" r=\"1.55\" fill=\"' + dark + '\"\/>';\r\n            }\r\n            for (i = 0; i < 11; i++){\r\n                a = i \/ 11 * 2 * Math.PI + 0.28;\r\n                grain += '<circle cx=\"' + (Math.cos(a) * 8.7).toFixed(2)\r\n                    + '\" cy=\"' + (Math.sin(a) * 8.7).toFixed(2) + '\" r=\"1.5\" fill=\"' + dark + '\"\/>';\r\n            }\r\n            return out + '<g class=\"fl-grain\">' + grain + '<\\\/g>';\r\n        }\r\n\r\n        \/\/ Rend UNE couche si elle est renseign\u00e9e, rien sinon.\r\n        function floraLayer(L, state){\r\n            if (state === \"none\") return \"\";\r\n            var col = L.color;\r\n            if (L.shape === \"seed\"){\r\n                return '<g>' + floraSeed(col, d3.color(col).darker(1.9).formatHex()) + '<\\\/g>';\r\n            }\r\n            var head = '<g fill=\"none\" stroke=\"' + col + '\" stroke-width=\"2.1\"'\r\n                + ' stroke-linejoin=\"round\" stroke-linecap=\"round\">';\r\n            if (L.shape === \"ray\")   return head + floraRing(floraRay(), 5, 36) + '<\\\/g>';\r\n            if (L.shape === \"petal\") return head + floraRing(floraPetal(), 5, 0) + '<\\\/g>';\r\n            \/\/ Les vrilles tournaient en 6 quand les lances et les p\u00e9tales\r\n            \/\/ tournent en 5 : les deux sym\u00e9tries ne co\u00efncidaient sur aucun axe,\r\n            \/\/ la couche verte paraissait d\u00e9cal\u00e9e et cassait la fleur. Elle\r\n            \/\/ reprend le pas de 5, sur l'axe des lances qu'elle encadre.\r\n            return head + floraRing(floraTendril(col), 5, 36) + '<\\\/g>';\r\n        }\r\n\r\n        \/\/ Le CORPS de la fleur, sans son cadre : la fiche et la galerie\r\n        \/\/ l'enveloppent dans un svg, les \u00e9tages en font un symbol pos\u00e9\r\n        \/\/ quarante-huit fois par plan. Dans la fiche (couches), chaque couche\r\n        \/\/ porte sa cl\u00e9 : survoler sa carte l'allume et efface les autres.\r\n        function floraBody(states, couches){\r\n            var body = \"\";\r\n            FLORA_LAYERS.forEach(function(L){\r\n                var trait = floraLayer(L, states[L.key] || \"none\");\r\n                if (couches && trait) trait = '<g class=\"imp-couche\" data-k=\"' + L.key + '\">' + trait + '<\\\/g>';\r\n                body += trait;\r\n            });\r\n            \/\/ Sans coeur, le glyphe n'aurait plus de centre : un anneau t\u00e9moin\r\n            \/\/ marque la place vide plut\u00f4t que de laisser un blanc inexplicable.\r\n            if (states.sorties === \"none\"){\r\n                body += '<circle r=\"4.2\" fill=\"none\" stroke=\"rgba(31,49,71,0.22)\" stroke-width=\"1.3\"\/>';\r\n            }\r\n            return body;\r\n        }\r\n        function floraGlyph(states){\r\n            return '<svg class=\"fl-glyph\" viewBox=\"-52 -52 104 104\" aria-hidden=\"true\">'\r\n                + floraBody(states) + '<\\\/svg>';\r\n        }\r\n\r\n        \/\/ Seize silhouettes possibles (quatre couches, pr\u00e9sentes ou non) : on\r\n        \/\/ les dessine UNE fois dans defs et chaque fleur d'un plan n'est plus\r\n        \/\/ qu'un use. Sans cela, quarante-huit fleurs sur trois \u00e9tages\r\n        \/\/ feraient plus de six mille noeuds \u00e0 recomposer \u00e0 chaque pas de\r\n        \/\/ descente. Deux familles : la compl\u00e8te, et la m\u00eame sans le grain du\r\n        \/\/ coeur \u2014 trente cercles par fleur ne valent pas d'\u00eatre peints tant\r\n        \/\/ qu'ils tiennent en deux pixels, sur les plans en fuite.\r\n        var FL_PREFIX = \"reu-fl-\";\r\n        var FL_PREFIX_PLAN = \"reu-flp-\";\r\n        function floraCode(states){\r\n            return FLORA_LAYERS.map(function(L){\r\n                return states[L.key] === \"none\" ? \"0\" : \"1\";\r\n            }).join(\"\");\r\n        }\r\n        \/\/ Le liser\u00e9 blanc des fleurs des \u00e9tages : la m\u00eame fleur, trac\u00e9e en\r\n        \/\/ blanc, plus \u00e9paisse et pleine, gliss\u00e9e dessous. Pos\u00e9s sur un socle de\r\n        \/\/ couleur, ses traits se fondaient dans leur fond : l'ocre des lances\r\n        \/\/ sur le socle de Sant\u00e9, le vert des vrilles sur celui du Num\u00e9rique, le\r\n        \/\/ rose des p\u00e9tales sur les corails et les prunes. D\u00e9tour\u00e9e de blanc, la\r\n        \/\/ fleur se lit sur n'importe quel socle, et deux fleurs voisines qui se\r\n        \/\/ chevauchent restent deux fleurs. Le dessin, lui, ne change pas : le\r\n        \/\/ liser\u00e9 est dessous.\r\n        var FL_HALO = 2.4;            \/\/ d\u00e9bord du liser\u00e9, en unit\u00e9s du glyphe\r\n        function floraHalo(states){\r\n            var blanc = '<g fill=\"#fff\" stroke=\"#fff\" stroke-width=\"' + (3.2 + 2 * FL_HALO)\r\n                + '\" stroke-linejoin=\"round\" stroke-linecap=\"round\">', out = \"\";\r\n            if (states.competences !== \"none\") out += blanc + floraRing(floraRay(), 5, 36) + '<\\\/g>';\r\n            if (states.lienSocial !== \"none\") out += blanc + floraRing(floraPetal(), 5, 0) + '<\\\/g>';\r\n            \/\/ Les vrilles sont des traits ouverts, qu'on ne remplit pas ; leurs\r\n            \/\/ perles, sans trait, en re\u00e7oivent un pour que le liser\u00e9 les entoure.\r\n            if (states.comportement !== \"none\") out += blanc.replace('fill=\"#fff\"', 'fill=\"none\"')\r\n                + floraRing(floraTendril(\"#fff\").replace(\/ stroke=\"none\"\/g, \"\"), 5, 36) + '<\\\/g>';\r\n            \/\/ Le coeur, ou \u00e0 d\u00e9faut son anneau t\u00e9moin, sur un disque blanc.\r\n            return out + '<circle r=\"' + ((states.sorties !== \"none\" ? 13.3 : 4.9) + FL_HALO) + '\" fill=\"#fff\"\/>';\r\n        }\r\n        function floraDefs(){\r\n            \/\/ symbol et non g : seul le premier accepte qu'un use lui\r\n            \/\/ impose une largeur et une hauteur, ce dont une fleur pos\u00e9e sur\r\n            \/\/ une case de damier a pr\u00e9cis\u00e9ment besoin.\r\n            var out = '<defs>', i, k, code, states, corps;\r\n            var tete = '<symbol viewBox=\"-52 -52 104 104\" overflow=\"visible\" id=\"';\r\n            for (i = 0; i < 16; i++){\r\n                code = (\"000\" + i.toString(2)).slice(-4);\r\n                states = {};\r\n                for (k = 0; k < 4; k++) states[FLORA_LAYERS[k].key] = code[k] === \"1\" ? \"full\" : \"none\";\r\n                \/\/ Trait renforc\u00e9 sur les \u00e9tages, dont les fleurs sont vues en\r\n                \/\/ perspective et de loin, et pos\u00e9 sur son liser\u00e9 blanc.\r\n                corps = floraHalo(states) + floraBody(states).replace(\/stroke-width=\"2\\.1\"\/g, 'stroke-width=\"3.2\"');\r\n                out += tete + FL_PREFIX + code + '\">' + corps + '<\\\/symbol>';\r\n                out += tete + FL_PREFIX_PLAN + code + '\">'\r\n                    + corps.replace(\/<g class=\"fl-grain\">[\\s\\S]*?<\\\/g>\/g, \"\") + '<\\\/symbol>';\r\n            }\r\n            return out + '<\\\/defs>';\r\n        }\r\n\r\n\r\n        \/\/ ============ 5 quater. GALERIE DES FLEURS ============\r\n        \/\/ La roue ne montre l'empreinte que d'un projet \u00e0 la fois, dans la\r\n        \/\/ fiche ouverte. Ici les fleurs sont pos\u00e9es c\u00f4te \u00e0 c\u00f4te : la\r\n        \/\/ comparaison des silhouettes devient imm\u00e9diate, et les th\u00e9matiques\r\n        \/\/ servent de rang\u00e9es plut\u00f4t que de secteurs.\r\n        function leafFor(p){\r\n            if (!root) return null;\r\n            var trouve = null;\r\n            root.leaves().forEach(function(n){\r\n                if (!trouve && n.data.projet === p) trouve = n;\r\n            });\r\n            return trouve;\r\n        }\r\n\r\n        \/\/ Bo\u00eete de taille fixe autour d'un glyphe : le SVG la remplit, quelle\r\n        \/\/ que soit la feuille de style du site qui h\u00e9berge la roue.\r\n        function glyphBox(markup){\r\n            return '<span class=\"fg-glyph-box\">' + markup + '<\\\/span>';\r\n        }\r\n\r\n        function floraCard(p, node, i){\r\n            var s = p.floraStates;\r\n            var n = floraScore(s);\r\n            var couleur = node ? (node.data.themeColorText || node.data.themeColor) : \"#1f3147\";\r\n            var titre = p.porteur || p.projet;\r\n            var sous = (p.porteur && p.projet && p.projet !== p.porteur) ? p.projet : \"\";\r\n            return '<div class=\"fg-card' + (n ? '' : ' is-empty') + '\" role=\"button\" tabindex=\"0\"'\r\n                + ' data-i=\"' + i + '\" style=\"--card-color:' + couleur + '\"'\r\n                + ' title=\"' + escapeHTML(titre + (sous ? \" \u00b7 \" + sous : \"\")\r\n                    + (p.territoire ? \" \u00b7 \" + p.territoire : \"\")) + '\">'\r\n                + glyphBox(floraGlyph(s))\r\n                + '<span class=\"fg-name\">' + escapeHTML(titre) + '<\\\/span>'\r\n                + '<span class=\"fg-proj\">' + (sous ? escapeHTML(sous) : '') + '<\\\/span>'\r\n                + '<span class=\"fg-score\">' + n + '\/' + FLORA_LAYERS.length + '<\\\/span>'\r\n                + '<\\\/div>';\r\n        }\r\n\r\n        \/\/ La l\u00e9gende des th\u00e9matiques flotte en bas \u00e0 gauche, par-dessus la roue\r\n        \/\/ et le radar. Dans la galerie, cette m\u00eame bande gauche porte le chapeau\r\n        \/\/ et la cl\u00e9 de lecture : deux bo\u00eetes ind\u00e9pendantes dans un m\u00eame couloir,\r\n        \/\/ l'une ancr\u00e9e en haut et l'autre en bas, finissent par se recouvrir d\u00e8s\r\n        \/\/ que la fen\u00eatre est basse. On range donc la l\u00e9gende DANS la colonne,\r\n        \/\/ sous la cl\u00e9, o\u00f9 elle reprend simplement sa place dans le flux.\r\n        var galerieLarge = window.matchMedia(\"(min-width: 1000px)\");\r\n        function rangerLegende(){\r\n            var legend = document.getElementById(\"legend\");\r\n            var cible = document.querySelector(\"#reu-roue-wp .header\");\r\n            var note = cible.querySelector(\".reading-note\");\r\n            if (legend.parentNode !== cible) cible.insertBefore(legend, note);\r\n            legend.classList.remove(\"is-inline\");\r\n        }\r\n\r\n        function renderFlora(){\r\n            var el = document.getElementById(\"flora-grid\");\r\n            if (!el) return;\r\n            \/\/ La l\u00e9gende peut \u00eatre rang\u00e9e dans la colonne : l'en sortir AVANT de\r\n            \/\/ r\u00e9\u00e9crire le contenu, sinon innerHTML l'emporterait avec le reste.\r\n            rangerLegende(false);\r\n            var headerEl = document.querySelector(\"#reu-roue-wp .header\");\r\n            el.style.top = ((headerEl ? headerEl.getBoundingClientRect().height : 190) + 18) + \"px\";\r\n\r\n            var list = radarProjets();\r\n            var docs = list.filter(function(p){ return documented(p); }).length;\r\n            var cartes = [];   \/\/ index stable pour retrouver le projet au clic\r\n            \/\/ Les th\u00e9matiques les mieux fournies ouvrent la galerie : on entre\r\n            \/\/ par l\u00e0 o\u00f9 le fonds a le plus financ\u00e9, et la queue de corpus se\r\n            \/\/ lit en fin de page. L'ordre de THEMES, lui, tient la roue, o\u00f9 il\r\n            \/\/ dit autre chose : il n'est pas touch\u00e9 ici.\r\n            var themes = (radarScope\r\n                ? THEMES.filter(function(t){ return t.key === radarScope; })\r\n                : THEMES.slice()\r\n            ).sort(function(a, b){\r\n                var na = (byTheme.get(a.key) || []).length;\r\n                var nb = (byTheme.get(b.key) || []).length;\r\n                if (nb !== na) return nb - na;\r\n                return String(a.label).localeCompare(String(b.label), \"fr\");\r\n            });\r\n\r\n            \/\/ Rappel des quatre couches : une couche seule, dessin\u00e9e avec le\r\n            \/\/ m\u00eame code que la fleur, plut\u00f4t qu'une pastille de couleur.\r\n            var cle = floraKey();\r\n\r\n            \/\/ La grille se range par \u00e9tage, comme la vue en \u00e9tages : une\r\n            \/\/ structure qui tient plusieurs promesses fleurit \u00e0 chacune. Dans\r\n            \/\/ un \u00e9tage, on garde les rang\u00e9es par th\u00e9matique.\r\n            var dans = function(p){ return list.indexOf(p) > -1; };\r\n            var rangees = function(garde){ return themes.map(function(t){\r\n                var sub = (byTheme.get(t.key) || []).filter(function(p){ return dans(p) && garde(p); }).sort(function(a, b){\r\n                    \/\/ Les empreintes les plus compl\u00e8tes d'abord : la rang\u00e9e se\r\n                    \/\/ lit alors comme un d\u00e9grad\u00e9 du plus au moins document\u00e9.\r\n                    if (b.empreinte !== a.empreinte) return b.empreinte - a.empreinte;\r\n                    return String(a.porteur || a.projet).localeCompare(String(b.porteur || b.projet), \"fr\");\r\n                });\r\n                if (!sub.length) return \"\";\r\n                var pleines = sub.filter(function(p){ return documented(p); }).length;\r\n                return '<p class=\"fg-theme\"><span class=\"legend-dot\" style=\"--dot-color:'\r\n                    + t.color + '\"><\\\/span>' + escapeHTML(t.label)\r\n                    + '<span class=\"fg-theme-count\">' + pleines + '\/' + sub.length\r\n                    + ' document\u00e9es<\\\/span><\\\/p>'\r\n                    + '<div class=\"fg-cards\">' + sub.map(function(p){\r\n                        var node = leafFor(p);\r\n                        cartes.push({ projet: p, node: node });\r\n                        return floraCard(p, node, cartes.length - 1);\r\n                    }).join(\"\") + '<\\\/div>';\r\n            }).join(\"\"); };\r\n            var etage = function(titre, phrase, couleur, encre, garde){\r\n                var n = list.filter(garde).length;\r\n                if (!n) return \"\";\r\n                return '<h3 class=\"fg-etage\" style=\"--pr:' + couleur + ';--pr-ink:' + encre + '\">'\r\n                    + escapeHTML(titre)\r\n                    + (phrase ? '<span class=\"fg-etage-phrase\">' + escapeHTML(phrase) + '<\\\/span>' : '')\r\n                    + '<span class=\"fg-theme-count\">' + n + ' structure' + (n > 1 ? 's' : '') + '<\\\/span><\\\/h3>'\r\n                    + rangees(garde);\r\n            };\r\n            var corps = PROMESSES.map(function(pr){\r\n                return etage(pr.label, pr.phrase, pr.color, pr.textColor, function(p){ return !!p.docs[pr.key]; });\r\n            }).join(\"\") + etage(\"Aucune promesse document\u00e9e\", \"\", \"#8b8882\", \"#6f6c67\", function(p){\r\n                return !PROMESSES.some(function(pr){ return p.docs[pr.key]; });\r\n            });\r\n\r\n            el.innerHTML = '<div class=\"fg-intro\"><p class=\"fg-caption\">Les <strong>' + list.length\r\n                + ' fiches d\u2019impact du FIS<\\\/strong> c\u00f4te \u00e0 c\u00f4te'\r\n                + (radarScope ? ' en ' + escapeHTML(themeLabel(radarScope)) : ' (corpus entier)')\r\n                + ', rang\u00e9es par promesse du fonds. Le FIS est le fonds d\u2019innovation sociale ; chaque couche pr\u00e9sente = une dimension renseign\u00e9e par le porteur. '\r\n                + docs + ' association' + (docs > 1 ? 's en' : ' en') + ' renseigne'\r\n                + (docs > 1 ? 'nt' : '') + ' au moins une. Cliquez une fleur pour ouvrir sa fiche.<\\\/p>'\r\n                + cle + '<\\\/div><div class=\"fg-body\">' + corps + '<\\\/div>';\r\n\r\n            el.querySelectorAll(\".fg-card\").forEach(function(btn){\r\n                var ouvrir = function(){\r\n                    var c = cartes[+btn.getAttribute(\"data-i\")];\r\n                    if (!c || !c.node) return;\r\n                    el.querySelectorAll(\".fg-card.is-selected\").forEach(function(o){\r\n                        o.classList.remove(\"is-selected\");\r\n                    });\r\n                    btn.classList.add(\"is-selected\");\r\n                    openDetail(c.node);\r\n                };\r\n                btn.addEventListener(\"click\", ouvrir);\r\n                \/\/ La carte n'est plus un button : le clavier doit \u00eatre rec\u00e2bl\u00e9\r\n                \/\/ \u00e0 la main pour que la galerie reste navigable au clavier.\r\n                btn.addEventListener(\"keydown\", function(e){\r\n                    if (e.key === \"Enter\" || e.key === \" \" || e.key === \"Spacebar\"){\r\n                        e.preventDefault();\r\n                        ouvrir();\r\n                    }\r\n                });\r\n            });\r\n\r\n            rangerLegende(galerieLarge.matches);\r\n            var colonne = el.querySelector(\".fg-intro\");\r\n            if (colonne) colonne.style.maxHeight = el.clientHeight > 40\r\n                ? (el.clientHeight - 6) + \"px\" : \"\";\r\n        }\r\n\r\n        function setViewMode(){\r\n            document.getElementById(\"reu-roue-wp\").dataset.view = isClassement() ? \"classement\" : indicator.key;\r\n            var territoireModes = document.getElementById(\"territoire-modes\");\r\n            if (territoireModes) territoireModes.hidden = indicator.key !== \"flux\";\r\n            \/\/ M\u00eame pastille sur l'onglet Carte : la carte territoriale ou la\r\n            \/\/ carte en relief (la bascule elle-m\u00eame vit dans le script de la\r\n            \/\/ carte, section 21).\r\n            var carteModes = document.getElementById(\"carte-modes\");\r\n            if (carteModes) carteModes.hidden = indicator.key !== \"carte\";\r\n            var freinsOn = isRadar();\r\n            var fleursOn = isFleurs();\r\n            var etagesOn = isEtages();\r\n            var rangOn = isClassement();\r\n            var fluxOn = isFlux();\r\n            var carteOn = isCarte();\r\n            var showRadar = freinsOn && freinsMode === \"radar\";\r\n            var showBars = freinsOn && freinsMode === \"bars\";\r\n            var roueOn = !freinsOn && !fleursOn && !etagesOn && !rangOn && !fluxOn && !carteOn;\r\n\r\n            ornamentGroup.style(\"display\", roueOn ? null : \"none\");\r\n            roseGrid.style(\"display\", roueOn ? null : \"none\");\r\n            roseNums.style(\"display\", roueOn ? null : \"none\");\r\n            arcsGroup.style(\"display\", roueOn ? null : \"none\");\r\n            labelsGroup.style(\"display\", roueOn ? null : \"none\");\r\n            centerGroup.style(\"display\", roueOn ? null : \"none\").attr(\"aria-hidden\", roueOn ? null : \"true\");\r\n            labelsGroup.attr(\"aria-hidden\", roueOn ? null : \"true\");\r\n            radarGroup.style(\"display\", showRadar ? null : \"none\").attr(\"aria-hidden\", showRadar ? null : \"true\");\r\n            svg.style(\"display\", (showBars || fleursOn || etagesOn || rangOn || fluxOn || carteOn) ? \"none\" : null);\r\n\r\n            var modes = document.getElementById(\"freins-modes\");\r\n            if (modes) modes.hidden = !freinsOn;\r\n            var bars = document.getElementById(\"freins-bars\");\r\n            if (bars) bars.hidden = !showBars;\r\n            var grid = document.getElementById(\"flora-grid\");\r\n            if (grid) grid.hidden = !fleursOn;\r\n            var etages = document.getElementById(\"etages\");\r\n            if (etages) etages.hidden = !etagesOn;\r\n            var fleursModes = document.getElementById(\"fleurs-modes\");\r\n            if (fleursModes){\r\n                fleursModes.hidden = !(fleursOn || etagesOn);\r\n                fleursModes.querySelectorAll(\"[data-fleurs]\").forEach(function(b){\r\n                    var on = b.dataset.fleurs === indicator.key;\r\n                    b.classList.toggle(\"active\", on);\r\n                    b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\r\n                });\r\n            }\r\n            var rang = document.getElementById(\"classement\");\r\n            if (rang) rang.hidden = !rangOn;\r\n            var flux = document.getElementById(\"flux\");\r\n            if (flux) flux.hidden = !fluxOn;\r\n            var carte = document.getElementById(\"carte\");\r\n            if (carte){\r\n                carte.hidden = !carteOn;\r\n                \/\/ La carte est dans la page : on ne la charge qu'\u00e0 la premi\u00e8re\r\n                \/\/ ouverture de son onglet (voir window.__ampCarteBoot, plus bas).\r\n                if (carteOn && typeof window.__ampCarteBoot === \"function\"){\r\n                    window.__ampCarteBoot();\r\n                }\r\n            }\r\n            \/\/ Sur la roue, le KPI + fil d'Ariane (repris du design aer) couvrent\r\n            \/\/ d\u00e9j\u00e0 ce coin de l'\u00e9cran ; la l\u00e9gende ne redevient utile \u2014 comme\r\n            \/\/ filtre par th\u00e9matique \u2014 que sur Freins et Fleurs.\r\n            var legend = document.getElementById(\"legend\");\r\n            if (legend){\r\n                \/\/ Le classement porte sa propre pastille de couleur sur chaque\r\n                \/\/ ligne : une l\u00e9gende par-dessus ferait doublon.\r\n                legend.hidden = roueOn || rangOn || fluxOn || carteOn;\r\n                \/\/ Le filtre ne se replie en menu que dans la galerie : sur les\r\n                \/\/ freins il flotte seul dans un coin vide, o\u00f9 la liste ouverte\r\n                \/\/ ne g\u00eane personne et se lit d'un coup d'oeil.\r\n                legend.classList.toggle(\"is-menu\", fleursOn || etagesOn || window.innerWidth <= 860);\r\n                if (!fleursOn){ legend.classList.remove(\"is-open\"); document.getElementById(\"legend-trigger\").setAttribute(\"aria-expanded\", \"false\"); }\r\n            }\r\n            \/\/ Quitter la galerie emporterait la l\u00e9gende avec elle : la grille\r\n            \/\/ est masqu\u00e9e d'un bloc, l\u00e9gende rang\u00e9e comprise.\r\n            if (!fleursOn) rangerLegende(false);\r\n\r\n            rangerLegende();\r\n            renderExplorer();\r\n            updateRoueModes();\r\n            syncArcAccessibility();\r\n            if (showRadar){\r\n                computeSize();\r\n                renderRadar();\r\n            }\r\n            else if (showBars) renderBars();\r\n            else if (fleursOn) renderFlora();\r\n            else if (etagesOn){ etActif = etDemande; etDemande = -1; renderEtages(); }\r\n            else if (rangOn) renderClassement();\r\n            else if (fluxOn) renderFlux();\r\n            var surface = fluxOn ? flux : rangOn ? rang : etagesOn ? etages : fleursOn ? grid : showBars ? bars : svg.node();\r\n            if (surface && surface.animate && !reducedMotion.matches){\r\n                surface.animate([{opacity:0,transform:\"translateY(10px)\"},{opacity:1,transform:\"translateY(0)\"}],{duration:560,easing:\"cubic-bezier(.22,1,.36,1)\"});\r\n            }\r\n        }\r\n\r\n        function refreshFreinsView(anim){\r\n            if (freinsMode === \"bars\") renderBars(); else renderRadar(anim);\r\n        }\r\n\r\n        \/\/ ============ 6. ZOOM ============\r\n        \/\/ G\u00e9om\u00e9trie d'un noeud focalis\u00e9 : part angulaire ramen\u00e9e au tour\r\n        \/\/ complet, anneaux d\u00e9cal\u00e9s de sa profondeur.\r\n        function focusBox(d, p){\r\n            return {\r\n                x0: Math.max(0, Math.min(1, (d.x0 - p.x0) \/ (p.x1 - p.x0))) * 2 * Math.PI,\r\n                x1: Math.max(0, Math.min(1, (d.x1 - p.x0) \/ (p.x1 - p.x0))) * 2 * Math.PI,\r\n                y0: Math.max(0, d.y0 - p.depth),\r\n                y1: Math.max(0, d.y1 - p.depth),\r\n                \/\/ k voyage dans la bo\u00eete : d3.interpolate le tween comme les\r\n                \/\/ angles, et la longueur des p\u00e9tales se r\u00e8gle donc toute seule\r\n                \/\/ pendant le zoom, sans une ligne d'animation en plus.\r\n                k: roseK(d, p)\r\n            };\r\n        }\r\n\r\n        \/\/ Deux images s\u00e9parent l'arr\u00eat de la roue du rallumage du texte. Un\r\n        \/\/ nouveau clic peut tomber entre les deux : le jeton dit au travail\r\n        \/\/ d'arriv\u00e9e que son zoom n'est plus celui qu'on regarde.\r\n        var zoomSeq = 0;\r\n        var image = function(fn){\r\n            if (reducedMotion.matches) return fn();\r\n            requestAnimationFrame(fn);\r\n        };\r\n\r\n        function zoomTo(p){\r\n            \/\/ Le jeton est pris APR\u00c8S le garde-fou : un appel sans objet\r\n            \/\/ n'annulerait pas le rallumage du zoom pr\u00e9c\u00e9dent.\r\n            if (!p || p === focus) return;\r\n            var seq = ++zoomSeq;\r\n            highlight(null);\r\n            pathSel.interrupt(\"intro\").interrupt(\"zoom\");\r\n            labelSel.interrupt(\"entree\").interrupt(\"sortie\").interrupt(\"zoom\");\r\n            \/\/ Un recalage en cours (la fiche vient de s'ouvrir) tient les\r\n            \/\/ libell\u00e9s \u00e9teints : le zoom le reprend \u00e0 son compte, sinon ils\r\n            \/\/ resteraient invisibles jusqu'au prochain redimensionnement.\r\n            svg.interrupt(\"recale\");\r\n            clearTimeout(recaleTimer);\r\n            labelsGroup.interrupt(\"intro\").interrupt(\"recale\").attr(\"opacity\",1);\r\n            centerGroup.interrupt(\"intro\").attr(\"opacity\",1);\r\n            if (centerLabel) centerLabel.interrupt(\"recale\").attr(\"opacity\",1);\r\n            ornamentGroup.interrupt(\"recale\").attr(\"opacity\",1);\r\n            focus = p;\r\n            closeTooltip();\r\n            \/\/ Changer d'\u00e9chelon, c'est changer de r\u00e8gle gradu\u00e9e : on la reprend\r\n            \/\/ avant de calculer les bo\u00eetes d'arriv\u00e9e, sinon les p\u00e9tales du\r\n            \/\/ nouvel anneau se rapporteraient encore au maximum qu'on quitte.\r\n            roseMesurer();\r\n            updateRoueModes();\r\n            root.each(function(d){\r\n                d.target = focusBox(d, p);\r\n                \/\/ Un arc invisible avant ET apr\u00e8s le zoom n'a aucune raison\r\n                \/\/ d'\u00eatre anim\u00e9 : on le pose directement \u00e0 l'arriv\u00e9e. Sur cette\r\n                \/\/ roue, les deux tiers des arcs sont dans ce cas \u00e0 chaque zoom,\r\n                \/\/ et c'est autant de chemins SVG recalcul\u00e9s \u00e0 chaque frame.\r\n                d.bouge = visible(d.current) || visible(d.target);\r\n            });\r\n\r\n            var t = svg.transition(\"zoom\").duration(motion(860)).ease(d3.easeCubicInOut);\r\n\r\n            \/\/ La lecture au poids r\u00e9el suit le zoom : on entre dans une\r\n            \/\/ th\u00e9matique, les p\u00e9tales reprennent leur pleine \u00e9paisseur (par k,\r\n            \/\/ port\u00e9 par les bo\u00eetes) et le coeur retrouve sa taille, dans le\r\n            \/\/ m\u00eame mouvement. Au retour au centre, ils se red\u00e9ploient de m\u00eame.\r\n            var roseDep = roseP, roseFin = roseCible(p);\r\n            if (roseDep !== roseFin){\r\n                roseFade(0, 0, 200);\r\n                t.tween(\"trou\", function(){\r\n                    var i = d3.interpolate(roseDep, roseFin);\r\n                    return function(tt){\r\n                        roseP = i(tt);\r\n                        innerR = radius * trou();\r\n                        centerGroup.select(\"circle\").attr(\"r\", innerR - 8);\r\n                    };\r\n                });\r\n            }\r\n\r\n            \/\/ Le halo des libell\u00e9s (paint-order stroke) et le rendu haute\r\n            \/\/ pr\u00e9cision des arcs sont co\u00fbteux \u00e0 chaque frame : on les coupe\r\n            \/\/ pendant le mouvement, o\u00f9 personne ne lit, et on les r\u00e9tablit \u00e0\r\n            \/\/ l'arriv\u00e9e. C'est l\u00e0 que se jouait l'essentiel des saccades.\r\n            g.classed(\"is-moving\", true);\r\n\r\n            var immobiles = pathSel.filter(function(d){ return !d.bouge; });\r\n            immobiles.each(function(d){ d.current = d.target; })\r\n                .attr(\"fill-opacity\", 0)\r\n                .attr(\"stroke-opacity\", 0)\r\n                .attr(\"pointer-events\", \"none\")\r\n                .attr(\"d\", function(d){ return arc(d.current); });\r\n\r\n            pathSel.filter(function(d){ return d.bouge; }).transition(t)\r\n                .tween(\"data\", function(d){\r\n                    var i = d3.interpolate(d.current, d.target);\r\n                    return function(tt){ d.current = i(tt); };\r\n                })\r\n                .attr(\"fill-opacity\", function(d){ return visible(d.target) ? 1 : 0; })\r\n                .attr(\"stroke-opacity\", function(d){ return visible(d.target) ? 1 : 0; })\r\n                .attrTween(\"d\", function(d){ return function(){ return arc(d.current); }; });\r\n\r\n            \/\/ La roue s'ouvre MUETTE. Un libell\u00e9 radial pouvait techniquement\r\n            \/\/ suivre son arc (une transformation par image, rien de plus), mais\r\n            \/\/ on lisait alors, pendant toute l'ouverture, des mots qui tournaient\r\n            \/\/ en changeant de corps et de d\u00e9coupe, quand les tangentiels, eux,\r\n            \/\/ s'\u00e9teignaient : deux r\u00e9gimes de texte dans un seul mouvement. Tout\r\n            \/\/ s'\u00e9teint donc ensemble, d'un fondu sinuso\u00efdal qui part sans\r\n            \/\/ \u00e0-coup, et end.solde rallume sur des arcs immobiles. C'est aussi\r\n            \/\/ une mise en page de moins par zoom : la destination n'a plus\r\n            \/\/ besoin d'\u00eatre compos\u00e9e avant le mouvement, puisque plus personne\r\n            \/\/ ne la montre.\r\n            var eteindre = function(sel, nom){\r\n                sel.interrupt(nom).transition(nom)\r\n                    .duration(motion(240)).ease(d3.easeSinIn)\r\n                    .attr(\"opacity\", 0);\r\n            };\r\n            eteindre(labelSel, \"sortie\");\r\n            eteindre(centerLabel, \"centre\");\r\n\r\n            \/\/ Interruption par un nouveau clic : surtout NE PAS solder ici.\r\n            \/\/ d.target appartient d\u00e9j\u00e0 au zoom suivant, s'y t\u00e9l\u00e9porter\r\n            \/\/ supprimerait son animation. La position courante est une\r\n            \/\/ g\u00e9om\u00e9trie valide, le zoom suivant repart de l\u00e0.\r\n            t.on(\"interrupt.solde\", function(){ g.classed(\"is-moving\", false); });\r\n            \/\/ Arriv\u00e9e : on pose la g\u00e9om\u00e9trie exacte et on r\u00e9tablit le rendu\r\n            \/\/ soign\u00e9. Sans \u00e7a d.current reste \u00e0 un cheveu de la cible et\r\n            \/\/ l'\u00e9cart s'accumule d'un zoom \u00e0 l'autre.\r\n            t.on(\"end.solde\", function(){\r\n                g.classed(\"is-moving\", false);\r\n                roseP = roseFin;\r\n                innerR = radius * trou();\r\n                centerGroup.select(\"circle\").attr(\"r\", innerR - 8);\r\n                drawRoseGrid();\r\n                if (roseFin) roseFade(1, 140, 560);\r\n                root.each(function(d){ d.current = d.target; });\r\n                pathSel.attr(\"d\", function(d){ return arc(d.current); })\r\n                    .attr(\"fill-opacity\", function(d){ return visible(d.current) ? 1 : 0; })\r\n                    .attr(\"stroke-opacity\", function(d){ return visible(d.current) ? 1 : 0; })\r\n                    .attr(\"pointer-events\", function(d){ return visible(d.current) ? \"auto\" : \"none\"; });\r\n                syncArcAccessibility();\r\n                labelSel.interrupt(\"sortie\");\r\n\r\n                \/\/ L'arriv\u00e9e demande trois choses au navigateur, et chacune est\r\n                \/\/ lourde : remettre les arcs en rendu soign\u00e9, puis mesurer,\r\n                \/\/ d\u00e9couper et \u00e9crire les libell\u00e9s, puis lancer leurs fondus.\r\n                \/\/ Empil\u00e9es dans la m\u00eame image, les deux premi\u00e8res mangeaient le\r\n                \/\/ d\u00e9but de la troisi\u00e8me : le fondu partait d\u00e9j\u00e0 entam\u00e9, d'un\r\n                \/\/ cran, ce qui se voit plus qu'un retard. On rend donc la main\r\n                \/\/ une image avant de composer, puis une autre avant d'allumer.\r\n                \/\/ Chaque fondu part alors sur une page \u00e0 jour, et du bon bout.\r\n                var poser = function(){\r\n                    if (seq !== zoomSeq) return;\r\n                    labelSel.call(paintLabel)\r\n                        .attr(\"transform\", function(d){ return labelTransform(d.current, d); })\r\n                        .attr(\"opacity\", 0);\r\n                    updateCenterLabel();\r\n                    centerLabel.interrupt(\"centre\").attr(\"opacity\", 0);\r\n                    image(allumer);\r\n                };\r\n\r\n                \/\/ Le rallumage, case apr\u00e8s case, dans le sens de lecture du\r\n                \/\/ cadran : midi d'abord, puis la ronde. Les noms se POSENT sur\r\n                \/\/ une roue d\u00e9j\u00e0 immobile au lieu d'appara\u00eetre d'un bloc, et\r\n                \/\/ l'oeil fait le tour avec eux. L'\u00e9cart entre deux allumages se\r\n                \/\/ resserre quand l'anneau compte beaucoup de cases : la ronde\r\n                \/\/ dure le m\u00eame temps qu'on nomme quatre arcs ou quinze. Le fondu\r\n                \/\/ lui-m\u00eame est long et sinuso\u00efdal : il na\u00eet de rien et s'arr\u00eate\r\n                \/\/ sans buter, l\u00e0 o\u00f9 une courbe cubique partait d'un coup.\r\n                var allumer = function(){\r\n                    if (seq !== zoomSeq) return;\r\n                    var tenants = [];\r\n                    labelSel.each(function(d){ if (labelFits(d, d.current)) tenants.push(d); });\r\n                    tenants.sort(function(a, b){\r\n                        return (a.current.x0 + a.current.x1) - (b.current.x0 + b.current.x1);\r\n                    });\r\n                    var rang = {}, ecart = Math.min(45, 260 \/ Math.max(1, tenants.length - 1));\r\n                    tenants.forEach(function(d, i){ rang[d.lid] = i; });\r\n                    labelSel.filter(function(d){ return labelFits(d, d.current); })\r\n                        .interrupt(\"entree\").transition(\"entree\")\r\n                        .delay(function(d){ return motion(40 + rang[d.lid] * ecart); })\r\n                        .duration(motion(520)).ease(d3.easeSinOut)\r\n                        .attr(\"opacity\", 1);\r\n                    \/\/ Le nom de la case ouverte se pose au centre avec le premier\r\n                    \/\/ libell\u00e9 de la ronde.\r\n                    centerLabel.interrupt(\"centre\").transition(\"centre\")\r\n                        .delay(motion(40)).duration(motion(520)).ease(d3.easeSinOut)\r\n                        .attr(\"opacity\", 1);\r\n                };\r\n\r\n                image(poser);\r\n            });\r\n\r\n            renderCrumbs();\r\n            renderKPI();\r\n            renderExplorer();\r\n            updateSubtitle();\r\n        }\r\n\r\n        \/\/ ============ 7. INTERACTIONS ============\r\n        \/\/ Toute la descendance de cette case se r\u00e9duit-elle \u00e0 UN SEUL porteur ?\r\n        \/\/ Alors elle n'a pas d'anneau \u00e0 montrer : l'ouvrir donnait un disque\r\n        \/\/ d'une seule couleur portant un seul nom, et il fallait encore cliquer\r\n        \/\/ ce nom pour lire la fiche. Un tour de roue pour rien.\r\n        function porteurUnique(d){\r\n            var feuilles = d.leaves().filter(function(n){ return n.data && n.data.projet; });\r\n            return feuilles.length === 1 ? feuilles[0] : null;\r\n        }\r\n\r\n        function onClick(event, d){\r\n            event.stopPropagation();\r\n            hideTooltip();\r\n            if (d.data.isTheme || d.data.isSousTheme){\r\n                \/\/ Re-cliquer l'arc focalis\u00e9 revient en arri\u00e8re.\r\n                if (focus === d){ zoomTo(d.parent || root); closeDetail(); return; }\r\n                \/\/ Sous-th\u00e9matique (ou th\u00e9matique) \u00e0 porteur unique : on va droit\r\n                \/\/ \u00e0 sa fiche, comme si l'on avait cliqu\u00e9 le porteur lui-m\u00eame.\r\n                var seul = porteurUnique(d);\r\n                if (seul){\r\n                    if (focus !== seul.parent) zoomTo(seul.parent);\r\n                    openDetail(seul);\r\n                    return;\r\n                }\r\n                \/\/ Th\u00e9matique -> ouvre ses sous-th\u00e9matiques ; sous-th\u00e9matique ->\r\n                \/\/ ouvre ses porteurs.\r\n                zoomTo(d);\r\n                closeDetail();\r\n            } else {\r\n                if (focus !== d.parent) zoomTo(d.parent);\r\n                openDetail(d);\r\n            }\r\n        }\r\n\r\n        function onHover(event, d){\r\n            var box = container.getBoundingClientRect();\r\n            var html;\r\n            if (d.data.isTheme){\r\n                var sum = d3.sum(d.data.projets, function(p){ return p.fisNum || 0; });\r\n                var nd = d.data.projets.filter(function(p){ return documented(p); }).length;\r\n                html = \"<strong>\" + escapeHTML(d.data.name) + \"<\\\/strong>\"\r\n                    + d.data.projets.length + \" projets &middot; \" + fmtEuro(sum) + \" de FIS\"\r\n                    + \"<em>\" + nd + \" sur \" + d.data.projets.length\r\n                    + \" renseignent au moins une dimension d'impact<\\\/em>\";\r\n            } else if (d.data.isSousTheme){\r\n                \/\/ Donn\u00e9es agr\u00e9g\u00e9es de la sous-th\u00e9matique : porteurs, FIS, public.\r\n                var sSum = d3.sum(d.data.projets, function(p){ return p.fisNum || 0; });\r\n                var sPers = d3.sum(d.data.projets, function(p){ return p.personnesNum || 0; });\r\n                html = \"<strong>\" + escapeHTML(d.data.name) + \"<\\\/strong>\"\r\n                    + \"<em>\" + escapeHTML(d.data.themeLabel) + \"<\\\/em>\"\r\n                    + d.data.projets.length + \" porteur\" + (d.data.projets.length > 1 ? \"s\" : \"\")\r\n                    + \" &middot; \" + fmtEuro(sSum) + \" de FIS\"\r\n                    + (sPers ? \"<em>\" + fmtNum(sPers) + \" personnes touch\u00e9es<\\\/em>\" : \"\");\r\n            } else {\r\n                var p = d.data.projet;\r\n                \/\/ Pas d'extrait : la fleur de la fiche dit lesquelles des\r\n                \/\/ quatre dimensions sont renseign\u00e9es, l'infobulle en annonce\r\n                \/\/ seulement le compte.\r\n                var extrait = \"Impact du FIS \" + p.empreinte + \" \/ \" + FLORA_LAYERS.length\r\n                    + (p.empreinte ? \" dimensions renseign\u00e9es\" : \" : rien de renseign\u00e9\");\r\n                html = \"<strong>\" + escapeHTML(p.porteur || p.projet) + \"<\\\/strong>\"\r\n                    + \"<em>\" + escapeHTML(p.projet) + (p.territoire ? \" &middot; \" + escapeHTML(p.territoire) : \"\") + \"<\\\/em>\"\r\n                    + (p.fisNR ? \"Montant FIS non renseign\u00e9\" : \"FIS \" + fmtEuro(p.fisNum))\r\n                    + (p.personnesNum ? \" &middot; \" + fmtNum(p.personnesNum) + \" pers. touch\u00e9es\" : \"\")\r\n                    + \"<em>\" + escapeHTML(extrait) + \"<\\\/em>\";\r\n            }\r\n            tooltip.innerHTML = html;\r\n            tooltip.style.opacity = 1;\r\n            var tw = tooltip.offsetWidth, th = tooltip.offsetHeight;\r\n            var x = event.clientX - box.left + 16;\r\n            var y = event.clientY - box.top + 14;\r\n            if (x + tw > box.width - 8) x = event.clientX - box.left - tw - 16;\r\n            if (y + th > box.height - 8) y = event.clientY - box.top - th - 14;\r\n            tooltip.style.left = Math.max(8, Math.min(x, box.width - tw - 8)) + \"px\";\r\n            tooltip.style.top = Math.max(8, Math.min(y, box.height - th - 8)) + \"px\";\r\n        }\r\n        function hideTooltip(){ tooltip.style.opacity = 0; }\r\n        function closeTooltip(){ hideTooltip(); }\r\n\r\n        \/\/ ============ 8. PANNEAU D\u00c9TAIL ============\r\n        \/\/ Impact du FIS : la fleur, plus sa lecture ligne \u00e0 ligne. Sans\r\n        \/\/ ces quatre lignes le glyphe resterait un ornement ; avec elles il\r\n        \/\/ devient un sommaire de la fiche, et la pastille de couleur fait le\r\n        \/\/ lien entre chaque ligne et sa couche dans la fleur.\r\n        \/\/ La graine (sorties positives) n'est pas mise en anneau comme les\r\n        \/\/ trois autres couches : son motif tient dans un rayon d'une\r\n        \/\/ douzaine d'unit\u00e9s, contre 45 pour les rayons. R\u00e9p\u00e9t\u00e9e telle\r\n        \/\/ quelle dans le m\u00eame viewBox -52..52 qu'elles, elle n'est plus\r\n        \/\/ qu'un point dans une ic\u00f4ne de l\u00e9gende. Un cadrage resserr\u00e9 rien\r\n        \/\/ que pour elle la remet \u00e0 une taille comparable.\r\n        function floraKeyIcon(L){\r\n            var box = L.shape === \"seed\" ? \"-15 -15 30 30\" : \"-52 -52 104 104\";\r\n            return '<svg viewBox=\"' + box + '\" aria-hidden=\"true\">' + floraLayer(L, \"full\") + '<\\\/svg>';\r\n        }\r\n        \/\/ Rappel des quatre couches, r\u00e9utilis\u00e9 ici et dans la galerie\r\n        \/\/ (renderFlora) : un seul endroit qui sait dessiner la l\u00e9gende des\r\n        \/\/ formes, pour que les deux vues restent identiques si une couche\r\n        \/\/ change de forme ou de couleur.\r\n        function floraKey(){\r\n            return '<ul class=\"fg-key\">' + FLORA_LAYERS.map(function(L){\r\n                return '<li>'\r\n                    + glyphBox(floraKeyIcon(L))\r\n                    + '<span>' + escapeHTML(L.label) + '<\\\/span><\\\/li>';\r\n            }).join(\"\") + '<\\\/ul>';\r\n        }\r\n        \/\/ Vignette de la couche, \u00e0 la place de la pastille de couleur : c'est\r\n        \/\/ elle qui rend la ligne d\u00e9codable sans l\u00e9gende s\u00e9par\u00e9e, sur le\r\n        \/\/ mod\u00e8le de freinMini pour les freins. Le trait est doubl\u00e9 : \u00e0 20 px,\r\n        \/\/ celui de la grande fleur ne laissait qu'un fil.\r\n        function floraMini(L){\r\n            return '<svg class=\"imp-ico\" viewBox=\"' + (L.shape === \"seed\" ? \"-15 -15 30 30\" : \"-52 -52 104 104\")\r\n                + '\" aria-hidden=\"true\" focusable=\"false\">'\r\n                + floraLayer(L, \"full\").replace(\/stroke-width=\"2\\.1\"\/g, 'stroke-width=\"4.2\"') + '<\\\/svg>';\r\n        }\r\n        \/\/ Mise en forme du texte source : paragraphes et listes explicites,\r\n        \/\/ sans r\u00e9sum\u00e9 automatique, suppression de phrases ni HTML issu de la feuille.\r\n        function descriptionHTML(value, enumerations){\r\n            var text = String(value == null ? \"\" : value).replace(\/\\r\\n?\/g, \"\\n\").trim();\r\n            if (isNR(text)) return '<p class=\"detail-empty\">Non renseign\u00e9 dans les donn\u00e9es du projet.<\\\/p>';\r\n            var blocks = text.split(\/\\n\\s*\\n\/);\r\n            return blocks.map(function(block){\r\n                var lines = block.split(\"\\n\").map(function(line){ return line.trim(); }).filter(Boolean);\r\n                if (lines.length > 1 && lines.every(function(line){ return \/^(?:[\u2022\u25cf\u25aa]\\s*|[-\u2013\u2014]\\s+|\\d+[.)]\\s+)\/.test(line); })){\r\n                    return '<ul class=\"detail-prose-list\">' + lines.map(function(line){\r\n                        return '<li>' + escapeHTML(line.replace(\/^(?:[\u2022\u25cf\u25aa]\\s*|[-\u2013\u2014]\\s+)\/, \"\")) + '<\\\/li>';\r\n                    }).join(\"\") + '<\\\/ul>';\r\n                }\r\n                \/\/ Les points-virgules d\u00e9limitent souvent les r\u00e9alisations. Ne\r\n                \/\/ pas couper ceux qui sont \u00e0 l'int\u00e9rieur d'une parenth\u00e8se.\r\n                if (enumerations && block.length > 180){\r\n                    var parts = [], start = 0, depth = 0;\r\n                    for (var i=0; i<block.length; i++){\r\n                        if (block[i] === \"(\" || block[i] === \"[\") depth++;\r\n                        if (block[i] === \")\" || block[i] === \"]\") depth = Math.max(0, depth-1);\r\n                        if (block[i] === \";\" && depth === 0){ parts.push(block.slice(start,i+1).trim()); start=i+1; }\r\n                    }\r\n                    parts.push(block.slice(start).trim());\r\n                    parts = parts.filter(Boolean);\r\n                    if (parts.length > 1){\r\n                        return '<ul class=\"detail-prose-list\">' + parts.map(function(part){ return '<li>' + escapeHTML(part) + '<\\\/li>'; }).join(\"\") + '<\\\/ul>';\r\n                    }\r\n                }\r\n                return '<p>' + lines.map(escapeHTML).join('<br>') + '<\\\/p>';\r\n            }).join(\"\");\r\n        }\r\n        function sectionHeading(number, title){\r\n            return '<h3 class=\"detail-section-title\"><span aria-hidden=\"true\">' + number + '<\\\/span>' + title + '<\\\/h3>';\r\n        }\r\n\r\n        \/\/ ---- Impacts et freins : une seule grammaire ----\r\n        \/\/ En t\u00eate, un encart teint\u00e9 : l'embl\u00e8me (la fleur, ou la cage des\r\n        \/\/ freins) sur un disque blanc, le compte \u00e9crit en toutes lettres, et\r\n        \/\/ une barre \u00e0 quatre segments qui le redit d'un coup d'oeil, chaque\r\n        \/\/ segment \u00e0 la couleur de sa couche. Dessous, une carte par rubrique :\r\n        \/\/ sa vignette dans une case teint\u00e9e, son intitul\u00e9, \u00ab Lire \u00bb ou \u00ab Non\r\n        \/\/ renseign\u00e9 \u00bb, et un chevron qui d\u00e9plie le texte du porteur.\r\n        \/\/ Une ligne : { k, label, title, ico, c, on, texte, plus }\r\n        \/\/   on    : la couche est dans l'embl\u00e8me (dimension renseign\u00e9e, frein signal\u00e9)\r\n        \/\/   texte : ce que le porteur a \u00e9crit ; sans texte, la carte ne s'ouvre pas\r\n        \/\/   plus  : volet de texte libre, hors des quatre familles\r\n        var IMP_ICO_TEXTE = '<svg class=\"imp-ico\" viewBox=\"-12 -12 24 24\" aria-hidden=\"true\" focusable=\"false\">'\r\n            + '<path d=\"M-7,-5.5H7M-7,0H7M-7,5.5H2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\"'\r\n            + ' stroke-linecap=\"round\"\/><\\\/svg>';\r\n\r\n        function impTeinte(c, a){\r\n            var k = d3.color(c);\r\n            if (!k) return \"\";\r\n            k.opacity = a;\r\n            return k.formatRgb();\r\n        }\r\n\r\n        function impLigneHTML(l){\r\n            var style = l.c ? ' style=\"--c:' + l.c + ';--tint:' + impTeinte(l.c, 0.1)\r\n                + ';--pill:' + impTeinte(l.c, 0.16) + '\"' : '';\r\n            var titre = l.title ? ' title=\"' + escapeHTML(l.title) + '\"' : '';\r\n            var tete = '<span class=\"imp-tile\" aria-hidden=\"true\">' + l.ico + '<\\\/span>'\r\n                + '<span class=\"imp-label\">' + escapeHTML(l.label) + '<\\\/span>';\r\n            var ouvre = '<li class=\"imp-row rev' + (l.on ? '' : ' is-off') + (l.plus ? ' is-plus' : '') + '\"'\r\n                + (l.k ? ' data-k=\"' + l.k + '\"' : '') + style + '>';\r\n            if (!l.texte){\r\n                return ouvre + '<div class=\"imp-head\"' + titre + '>' + tete\r\n                    + (l.on ? '<span class=\"imp-state is-mention\">Mentionn\u00e9<\\\/span>'\r\n                            : '<span class=\"imp-state is-none\">Non renseign\u00e9<\\\/span>')\r\n                    + '<\\\/div><\\\/li>';\r\n            }\r\n            return ouvre + '<button class=\"imp-head\" type=\"button\" aria-expanded=\"false\"' + titre + '>'\r\n                + tete + '<span class=\"imp-state\">Lire<\\\/span>'\r\n                + '<span class=\"imp-chev\" aria-hidden=\"true\"><\\\/span><\\\/button>'\r\n                + '<div class=\"imp-body\"><div class=\"imp-body-in\"><div class=\"imp-texte\">'\r\n                + '<div class=\"detail-prose\">' + descriptionHTML(l.texte, false) + '<\\\/div>'\r\n                + '<p class=\"imp-src\">D\u00e9claratif porteur \u00b7 FIS 2025<\\\/p>'\r\n                + '<\\\/div><\\\/div><\\\/div><\\\/li>';\r\n        }\r\n\r\n        function impBlocHTML(o){\r\n            var segs = o.lignes.filter(function(l){ return !l.plus; }).map(function(l){\r\n                return '<i class=\"imp-seg' + (l.on ? '' : ' is-off') + '\" data-k=\"' + l.k + '\"'\r\n                    + (l.on ? ' style=\"--c:' + l.c + '\"' : '') + '><\\\/i>';\r\n            }).join(\"\");\r\n            return '<div class=\"imp ' + o.cls + '\">'\r\n                + '<div class=\"imp-hero rev\">'\r\n                + '<span class=\"imp-disc\" aria-hidden=\"true\">' + o.embleme + '<\\\/span>'\r\n                + '<div class=\"imp-hero-txt\">'\r\n                + '<p class=\"imp-eyebrow\">' + escapeHTML(o.eyebrow) + '<\\\/p>'\r\n                + '<p class=\"imp-count\">' + escapeHTML(o.titre) + '<\\\/p>'\r\n                + '<span class=\"imp-segs\" aria-hidden=\"true\">' + segs + '<\\\/span>'\r\n                + '<p class=\"imp-hint\">' + escapeHTML(o.note) + '<\\\/p>'\r\n                + '<\\\/div><\\\/div>'\r\n                + '<ul class=\"imp-list\">' + o.lignes.map(impLigneHTML).join(\"\") + '<\\\/ul><\\\/div>';\r\n        }\r\n\r\n        function ficheFloraHTML(p){\r\n            var s = p.floraStates;\r\n            var n = floraScore(s), N = FLORA_LAYERS.length;\r\n            return impBlocHTML({\r\n                cls: \"is-impacts\", eyebrow: \"Impact du FIS\",\r\n                titre: n === 0 ? \"Aucune dimension document\u00e9e\"\r\n                    : n + (n > 1 ? \" dimensions sur \" : \" dimension sur \") + N\r\n                      + (n > 1 ? \" document\u00e9es\" : \" document\u00e9e\"),\r\n                \/\/ La phrase qui ouvrait la rubrique vient ici, \u00e0 c\u00f4t\u00e9 du\r\n                \/\/ compte qu'elle temp\u00e8re.\r\n                note: n === 0\r\n                    ? \"Le porteur n\u2019a document\u00e9 aucune des quatre dimensions, ce qui ne signifie pas une absence d\u2019impact.\"\r\n                    : \"Effets rapport\u00e9s par le porteur. Leur nombre ne constitue pas une note de performance.\",\r\n                embleme: '<svg class=\"imp-glyph\" viewBox=\"-52 -52 104 104\" aria-hidden=\"true\" focusable=\"false\">'\r\n                    + floraBody(s, true) + '<\\\/svg>',\r\n                lignes: FLORA_LAYERS.map(function(L){\r\n                    var on = s[L.key] !== \"none\";\r\n                    return { k: L.key, label: L.label, ico: floraMini(L), c: on ? L.color : null,\r\n                             on: on, texte: on ? p[L.key] : null };\r\n                })\r\n            });\r\n        }\r\n\r\n        \/\/ ---- Le cadran de la part du FIS ----\r\n        \/\/ Une part se lit mieux en arc qu'en pourcentage pos\u00e9 \u00e0 plat : l'\u0153il\r\n        \/\/ voit tout de suite ce qui reste \u00e0 financer. Soixante traits sur 300\r\n        \/\/ degr\u00e9s, ouverts en bas comme un cadran d'instrument ; les traits se\r\n        \/\/ remplissent jusqu'\u00e0 la valeur, s'allongeant et s'affirmant \u00e0 mesure\r\n        \/\/ qu'ils en approchent. Le trait isol\u00e9 sur le pourtour est la m\u00e9diane\r\n        \/\/ du corpus : le rep\u00e8re, pas une cible. La couleur est celle de la\r\n        \/\/ th\u00e9matique, jamais celle d'un verdict \u2014 une part \u00e9lev\u00e9e dit que le\r\n        \/\/ FIS porte seul le projet, ce n'est ni un bon ni un mauvais point.\r\n        var JG = { n: 60, depart: -150, course: 300, rExt: 84, rInt: 62, c: 100 };\r\n\r\n        function jgPoint(angle, r){\r\n            var a = (angle - 90) * Math.PI \/ 180;\r\n            return [(JG.c + r * Math.cos(a)).toFixed(1), (JG.c + r * Math.sin(a)).toFixed(1)];\r\n        }\r\n        function jgTrait(angle, r1, r2, cls, op){\r\n            var A = jgPoint(angle, r1), B = jgPoint(angle, r2);\r\n            return '<line x1=\"' + A[0] + '\" y1=\"' + A[1] + '\" x2=\"' + B[0] + '\" y2=\"' + B[1] + '\"'\r\n                + ' class=\"' + cls + '\"' + (op ? ' opacity=\"' + op + '\"' : '') + '\/>';\r\n        }\r\n        \/\/ valeur en %, ou null si la part n'est pas calculable.\r\n        function jaugeHTML(valeur, mediane, themeLabel){\r\n            var connue = valeur !== null && isFinite(valeur);\r\n            var v = connue ? Math.max(0, Math.min(100, valeur)) : 0;\r\n            var pleins = connue ? Math.round(v \/ 100 * JG.n) : 0;\r\n            var traits = \"\";\r\n            for (var i = 0; i < JG.n; i++){\r\n                var a = JG.depart + (i + 0.5) \/ JG.n * JG.course;\r\n                if (i < pleins){\r\n                    var t = pleins > 1 ? i \/ (pleins - 1) : 1;\r\n                    traits += jgTrait(a, JG.rInt - 4 * t, JG.rExt, \"jg-on\", (0.58 + 0.42 * t).toFixed(2));\r\n                } else {\r\n                    traits += jgTrait(a, JG.rInt, JG.rExt, \"jg-off\", \"\");\r\n                }\r\n            }\r\n            \/\/ Le cadran vide garde son rep\u00e8re : il dit o\u00f9 en sont les autres,\r\n            \/\/ mais la note doit alors pr\u00e9ciser que les 49 % ne sont pas ceux\r\n            \/\/ de ce projet-ci, sinon le chiffre se lit comme sa valeur.\r\n            var note = connue ? \"\" : \"Part non calculable\";\r\n            if (mediane !== null && isFinite(mediane)){\r\n                var m = Math.max(0, Math.min(100, mediane));\r\n                traits += jgTrait(JG.depart + m \/ 100 * JG.course, JG.rExt + 6, JG.rExt + 14, \"jg-repere\", \"\");\r\n                note = (connue ? \"M\u00e9diane du corpus \u00b7 \" : \"Part non calculable \u00b7 m\u00e9diane \")\r\n                    + Math.round(m) + \" %\";\r\n            }\r\n            var lecture = connue\r\n                ? \"Part du FIS : \" + Math.round(valeur) + \" % du budget\"\r\n                : \"Part du FIS non renseign\u00e9e\";\r\n            if (mediane !== null && isFinite(mediane)) lecture += \", m\u00e9diane du corpus \" + Math.round(mediane) + \" %\";\r\n            return '<figure class=\"jauge' + (connue ? '' : ' is-vide') + '\" role=\"img\" aria-label=\"'\r\n                + escapeHTML(lecture) + '\">'\r\n                + '<figcaption class=\"jg-head\"><span class=\"jg-titre\">Part du FIS<\\\/span>'\r\n                + '<span class=\"jg-pill\"><i aria-hidden=\"true\"><\\\/i>' + escapeHTML(themeLabel) + '<\\\/span><\\\/figcaption>'\r\n                + '<div class=\"jg-cadran\">'\r\n                + '<svg class=\"rev\" viewBox=\"0 0 200 200\" aria-hidden=\"true\" focusable=\"false\">' + traits + '<\\\/svg>'\r\n                + '<p class=\"jg-val rev\">' + (connue\r\n                    ? '<b>' + Math.round(valeur) + '<\\\/b><span>%<\\\/span>'\r\n                    : '<b class=\"jg-nr\">&mdash;<\\\/b>') + '<\\\/p>'\r\n                + '<\\\/div>'\r\n                + '<p class=\"jg-note rev\">' + escapeHTML(note) + '<\\\/p><\\\/figure>';\r\n        }\r\n        \/\/ ---- L'\u00e9chelle des personnes touch\u00e9es ----\r\n        \/\/ Un nombre seul ne dit rien : 885, c'est beaucoup ou peu ? Le curseur\r\n        \/\/ pos\u00e9 entre des paliers \u00e9crits en clair r\u00e9pond sans rien demander au\r\n        \/\/ lecteur. Quand la cellule est une phrase et non un nombre \u2014 \u00ab 190\r\n        \/\/ jeunes sensibilis\u00e9s dont 67 suivis \u00bb \u2014 on retient le premier nombre,\r\n        \/\/ mais on l'annonce avec un \u00ab \u2248 \u00bb et la phrase reste lisible dessous :\r\n        \/\/ le curseur ne doit pas donner \u00e0 une estimation l'air d'un relev\u00e9.\r\n        function personnesHTML(p){\r\n            var v = p.personnesNum;\r\n            var brut = String(p.personnes == null ? \"\" : p.personnes).trim();\r\n            var estimation = brut.replace(\/[\\s\\u202f\\u00a0]\/g, \"\").replace(\/^[0-9.,]+\/, \"\").length > 2;\r\n            if (isNR(p.personnes) || v === null || v <= 0 || !PERS_ECHELLE){\r\n                return bulle(p.personnes, \"Personnes touch\u00e9es\", isNR(p.personnes));\r\n            }\r\n            var x = persPosition(v);\r\n            var paliers = PERS_ECHELLE.paliers.map(function(t){\r\n                return '<span style=\"left:' + Math.max(4, Math.min(96, persPosition(t))).toFixed(1) + '%\">'\r\n                    + escapeHTML(fmtNum(t)) + '<\\\/span>';\r\n            }).join(\"\");\r\n            return '<div class=\"pers\" role=\"img\" aria-label=\"Personnes touch\u00e9es : '\r\n                + (estimation ? 'environ ' : '') + escapeHTML(fmtNum(v)) + '\">'\r\n                + '<p class=\"pers-top rev\"><span class=\"pers-lab\">Personnes touch\u00e9es<\\\/span>'\r\n                + '<b class=\"pers-num\">' + (estimation ? '<em>&asymp;<\\\/em>' : '')\r\n                + escapeHTML(fmtNum(v)) + '<\\\/b><\\\/p>'\r\n                + '<div class=\"ech\"><span class=\"ech-fill rev\" style=\"width:' + x.toFixed(1) + '%\"><\\\/span>'\r\n                + '<span class=\"ech-cur rev\" style=\"left:' + x.toFixed(1) + '%\"><\\\/span><\\\/div>'\r\n                + '<div class=\"ech-ax rev\">' + paliers + '<\\\/div>'\r\n                + (estimation ? '<p class=\"pers-brut\">' + escapeHTML(brut) + '<\\\/p>' : '')\r\n                + '<\\\/div>';\r\n        }\r\n\r\n        \/\/ ---- La barre de budget ----\r\n        \/\/ Les deux montants se lisaient c\u00f4te \u00e0 c\u00f4te sans rapport visible entre\r\n        \/\/ eux. En barre, le budget total devient la longueur enti\u00e8re et le\r\n        \/\/ soutien du FIS en occupe sa part \u2014 ce qui fait appara\u00eetre le reste,\r\n        \/\/ c'est-\u00e0-dire ce que le porteur est all\u00e9 chercher ailleurs, qui\r\n        \/\/ n'\u00e9tait \u00e9crit nulle part dans la fiche alors que c'est souvent\r\n        \/\/ l'essentiel du plan de financement.\r\n        function budgetHTML(p){\r\n            var budget = (p.budgetNum === null || p.budgetNum <= 0) ? null : p.budgetNum;\r\n            var fis = p.fisNR ? null : p.fisNum;\r\n            \/\/ Sans budget total, il n'y a pas de longueur \u00e0 partager : on\r\n            \/\/ laisse les montants tels quels plut\u00f4t qu'une barre invent\u00e9e.\r\n            if (budget === null || fis === null){\r\n                return '<div class=\"fin-sommes\">'\r\n                    + sommeHTML(fis === null ? \"\" : fmtEuro(fis), \"Soutien du FIS\", fis === null, true)\r\n                    + sommeHTML(budget === null ? \"\" : fmtEuro(budget), \"Budget total\", budget === null)\r\n                    + '<\\\/div>';\r\n            }\r\n            var part = Math.max(0, Math.min(1, fis \/ budget));\r\n            var reste = Math.max(0, budget - fis);\r\n            var pc = Math.round(part * 100);\r\n            var lecture = \"Budget total \" + fmtEuro(budget) + \" : \" + fmtEuro(fis)\r\n                + \" du FIS, soit \" + pc + \" %, et \" + fmtEuro(reste) + \" d'autres financements\";\r\n            return '<div class=\"bud\" role=\"img\" aria-label=\"' + escapeHTML(lecture) + '\">'\r\n                + '<div class=\"bud-bar\"><span class=\"bud-fis rev\" style=\"width:'\r\n                + (part * 100).toFixed(1) + '%\"><\\\/span><\\\/div>'\r\n                + '<p class=\"bud-num rev\"><span><b>' + escapeHTML(fmtEuro(fis)) + '<\\\/b>'\r\n                + '<i>Soutien du FIS &middot; ' + pc + ' %<\\\/i><\\\/span>'\r\n                + '<span><b>' + escapeHTML(fmtEuro(reste)) + '<\\\/b>'\r\n                + '<i>Autres financements<\\\/i><\\\/span><\\\/p>'\r\n                + '<p class=\"bud-total rev\">Budget total &middot; ' + escapeHTML(fmtEuro(budget)) + '<\\\/p><\\\/div>';\r\n        }\r\n        \/\/ Repli quand la barre ne peut pas se tracer : la jauge dit le rapport,\r\n        \/\/ eux disent l'\u00e9chelle. 14 % de 107 000 \u20ac et 14 % de 7 000 \u20ac, ce n'est\r\n        \/\/ pas le m\u00eame projet.\r\n        function sommeHTML(valeur, label, vide, fort){\r\n            return '<div class=\"fs-item' + (fort ? ' is-key' : '') + (vide ? ' is-empty' : '') + '\">'\r\n                + '<span>' + escapeHTML(label) + '<\\\/span>'\r\n                + '<b>' + escapeHTML(vide ? \"Non renseign\u00e9\" : valeur) + '<\\\/b><\\\/div>';\r\n        }\r\n\r\n        \/\/ ---- Identit\u00e9 visuelle des porteurs ----\r\n        \/\/ Les logos ont \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9s une fois pour toutes sur les sites des\r\n        \/\/ associations et sur leurs pages HelloAsso \/ JeVeuxAider, recadr\u00e9s au\r\n        \/\/ m\u00eame gabarit optique puis embarqu\u00e9s ici : la page reste un fichier\r\n        \/\/ unique et n'appelle aucun serveur tiers \u00e0 l'affichage. La cl\u00e9 est le\r\n        \/\/ nom du porteur r\u00e9duit \u00e0 ses lettres et ses chiffres, pour que la\r\n        \/\/ fiche retrouve son logo m\u00eame si la feuille change une majuscule, une\r\n        \/\/ apostrophe ou un accent. Une valeur qui n'est pas une image est un\r\n        \/\/ alias : elle renvoie vers la cl\u00e9 qui porte le logo.\r\n        var LOGOS = {\r\n        \/\/ ACAM Bels. Manufacture\r\n        \"acambelsmanufacture\": \"data:image\/webp;base64,UklGRswWAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSNQIAAABx8UgkqQ4TIN\/0+SPgYjI0S9K1xRpq1KplFJKSpIkyYxERIQQWsgxV\/AwAJAhydq2ZXWPZ805s7Zt27bt8WK0tm0bY1Zmxu+broqIjOrdc\/mK6D8Et40cSepB7ZUxoSZ0qpn7gPrjlf\/7z7\/d8Lw\/HMVPnxwenBXz\/lR0ugaJYr6+fDIyCeg5oHtq0j02o8E3RmtoK81dIiRWevXO\/buPAeDH5ZHSDHzx\/HCaCyO0D23FWqOh+czIWFSkQqBYYwHOShJPz8r9AQDVq7P5jII2QmfVpn\/e0jUaUmqMNsYAgK\/LJcnXGsDYxHqL2RwEHfgNLNoAwP1paREQrwcbvLIGXklSDtoG4vUB\/uI+sFVgw2sEBQtQc6K3J80EMOHojc0RpMxqbYLna1uWeSwmt\/kWiGI0ALxYnClLjrGBW58AnnpynAENWOnDYhdoCuRITRWj47KOCUetYaMc5zEMXIvxGr014UvHWv3LgVy5VerQq6tNrhQdm5BgrWnI4DZ74c2Yq8OD2ZkRYOBjTKhDeAShlQA0zFZMRqI70pZ3pPPjU8XApL0ybMSb1J8xLsMJ4xvekWorR8dFwJdeEvQw2H3QDr3JiDAW3p5oBjCc1RPCr+1dHaknMPZDTEB7BQYwzihno+G4ypj\/JBEBV3gyI8XVED\/73NkDGlDK2QwFHaYg0IIe+IUfiagTtfmDYkIGrIYBrvQGDTiVEiY\/1IaOumAClZRXBb7t6+05QEjfUhwfxG\/WUkiYQiSYrCWPXY70ckUHtkNJeW7kgQYhhuEOWrpu+Rpo4pmt8c3pmSzoZZDbOEEDyDsnySHLkKLGgMA7UuPpYTHCYWCNi5RWayzJBQlKGUGlT70BvKYuIHxa39HrPDyHZZAHlU8FGCC5xAdzypjzonWvHY5kX2uAFYG6nICzDOcyBTRI4juilNe\/sJorBIbpdjQfa3+l8shqNFaQYQ4Gf6zHXeAeyYK1sCebwKK9ZSmP621aVMapdFj5kmzqsDFFy9x4Y8KwpEkcloIGiMacdu6oc4\/85HVp0Aq30hrCWPjSiPxpTX0mTVfQVpShGMUSw\/Nx53wA+gHS9mgMMRoKBuJj+Cs0T7CojJVgBOYUKZGSufSxJrQEFSkNGBdVIWjshMdRbMZismIOhlS5AoYCVsaaMc6p1GpEMqY6HScX0yzceo5eTbF+X2Kt\/c3kEAReejHUlCo1Fv+pwPvCD9YgdcJPP4addKWLI0zXF2Tbao3JCfRb+Aj3PFs6gMezQlVKMFzaWQagiTVA2\/PBfgFvHjOqDbbDuowwg7GgDdxTqkyCYbJOxmWwhui5qn4C9G+jFuO0UqR0OTwcqTEW09opVSrBSFFnbBX4RGMJRakp3XJVwpCoMnyZEkrz4LHMSQSCUZoEcvwQgCbUuqlIx9uAygFSq4whe4fJoMlxXFlSkfsRtCXUiizsmuGrhE9IU61qVjOqVaUpFXAE5o1irKLVhsn4Pa1loE6QO7yGNdc+jFGkKY54lQ63wBiiubjdUSGQm4Vj+W7R+5QyBb9MR8i8mYaiaJ1xjeTRmhZ6SpGG8QQPwLvQpw1YX2Y\/xYOUoJMul3bXnXgBANWaPe3ImjdyZvhH0T6eiLufClKGEqHJYRxtf0wJEf9qLW+MtF1FRB5znLSXPtrP0by8AA81CDQnownPvATkZoUieR8W2e\/po53PUIKo44zFat1ZsciPiMkNVNoP\/IXhquGyCh7PF8vIZyxXsoxwIn6KOJqx8Kir4lLHRfUL\/eDDkeSh9wfQ1Ax0c8wp78id3h0gFmua2ycP0xOxWHS6eiPxQsXFcDOIsa\/WAGBRzVIoZdHSu7mVqlCdnPLKFHzJQIVKItQ+aAULmHk31gnC4Ut+IgvDdiT6\/WN0k\/sdyARIUWYURsU+IWNpbX7F24hsR0cZOakmAmOgYZoYzLmiBjgVE2coaAfURPDJ9C9cyY4AtSOQj7EGvo9WKkqOcKI6DBaMoQbr4yIg9s76JjFeSFMOFEg4ezjE3jT9BNCUWJLmSKlSHKmtfBmglAtFEuzm3ZCMeO9HYCwhfhvKoAHfjFM21L\/cmabcOCkCP2G2kSEeiruNS1gl1VPKkVKJHe1U\/NLnC2hcNPAmx6ndFSxlKBJmq1O\/VAxgKHG9R\/T7Argbl81EUGpsI\/iWGEPd75QElCUTqv11WmxdE8fmjVEZcce1LLLgUzmpd30knShXkUN1e0x3ErB+\/NQ5HrXK6d\/XKOVtpVq44EXKSQ6KJdgpcia9P1FjKa2bzXoy7+NAMvVbTi1cAePtVFU2YU5FREHSoFTOD3SyEdjoTTxWL0ck42JpUvp9A0u\/Yfaa5JCfVwwVxuubX8PJRNi+okQxbhek25Z3iQAtiW8meU1\/AKf9ooehd6ecjyEOeo1RkTxOxrSrFsDS755twNPXcmP1ybvZSAknZWRlCwAwFKO19q1em62SekcjnPEGFtVwlVAEwwPjEpxk67ccna5bPvLehgeV6\/NHLp3YSyULpyScXXTOcdkznmJ14FmfF0owRUsZxmkJDhA1ccYNw6iJ4UBerGhHz3uip1RCPobdhjGBmshVPu3K8Tjz2qSGrLpe72M\/AgrvYa86Ffpe6fcxw8ipb\/dt7x0e9rrS8YlPxt1J3nHxYZW94nmwb+I9T49mpznl9X4DY+F9qQGwPvNjvvebiH+q+C1lAIfm\/+f+HOwzVon3BhE5Z1QU3zUHlKbyCTLfNUeFhBnM\/C4c2eWdmVLfhdejRO84vXegbuGjFU7\/hPLb5H1ug+Eqb3b39JSKhPIkc2aBz6qJH9G+ScqJyJySWGUotFqyJv7K64v8+1M0TtJt1or9ZQD0dW7z77yjuuhXOePY7obffb1bhf0Dl7QTkXwao8y93wILF7DP5iN1TklyBqOEb\/xmnZi\/+C1+IjUeHTXa14HSovNEjW4JR3vCwSBlVaQAVs5Iclki2tRJiw+fyNuzac2SlR1VlGXBzqOFBfn5BYV5B3tLMnL30cL8RDm2v5f645X\/+89\/FqAAVlA4ININAACwOACdASqgAKAAPkkgjUSioiEUC4X4KASEon49gBgtB+fdO0q6B5zzuKv\/eeB2q3zSfDf5L0C+h38vf9f3D\/076QvmA\/Z31pfQZ\/nfUA\/t\/UO+gx5dfsl\/2bztM0d\/sHZt\/hfyA84fIL8h9wPYAxV9YmHXiv3wyvnYP856B3s99e8AzU18IdGXgBfdf+Z7BH83\/0P\/V9S3\/n\/0Hn6\/Pv8p\/7P8v8A387\/sX\/b9bz2T+iF+sP\/jPK3A0b8sC7820iwrSxD\/JEzNDxQMZecTgjP2iEAxCfF836yQG1G\/h7DRwZM8lL18fWlipY\/EF+ztc1i7TdaAvIZQ\/jN2Szf0TpHfsym5a6tOr1Ity\/IbOkS53l9s8WSW8dlkxzWwE0jY8hln\/KXLVnJ8orDdv8t234VlOkPo40i4q9IQr+iRgE7m\/fHYUZtTau6\/m4tVbXe2YFpLCX6x5PrkxSrXQb5MU8bT2ddJzb9sOW6lAomobbMi13VGdk+sDZ9AWiZb9SKfjFgPDhgDtanm813X169gO5Qz3MOoj3N5\/miMqu6CBvrWpuh+e7+XgZdnx3s9Z\/+U9Fxfgvn6dVPHuyS6wbpsxJu0U4TgnvhyRffm2kWFZIAA\/v5HgAAAAGFsyHXMJcfR+eGfZTNoG1aQ4IFExhZOqUfZrD6WIVdjGB2iV5JrczHUXt4PYBvnTVOULdSLRtYp6LcavtQWR6q4j+0jEPw67Grpwtwof1bmh+2KnlnYggHHgI71bN\/4MTG6Tg6SdfGajpxlbKkcGcEb\/tQ+Xmwy6HmHwYsTUoT019ydz0R1XcvCBr2lkmqBkNhaKUdHD5zizLJw8sL0G0ujktQFb8e+90mSAXM+qMrfbQQ8rD6P0cBJ9c\/kWlOByxB1O9deWpwFbZT21+eDEl1suJHsZTMI6\/G4VdZPYqQIwwg8KQDScv1RHhYqtvp8RS8YZTHTPyoRq4WTVbTowuOndcJmZxRN6bRZDixLgUqVhfKElNXkPaAwrmujpBJ4AivSmYq+wIGk4OJJVwdPPUfSJr+5pnajh\/+z0GiwsvWX1l2OPF7GteUnxG6lAlcgo5QwUQGqVL5cx7ni5S81vFFTMQq\/xL3uhN5Ya4qVvqdYh0+C0s7vebb06\/1NawdeDHe\/5Lm30U7Fy43HLNtnFezd9aWjGtuwOTGvBC3IKrCwKfyXiObvTb0QZhNa9aCKfOKEAq77GY3Uz8DXjJGOKyyL1TCdkx0X6M0Jctj6GKrSVJmi\/ixDqe8T3ISrnUnhPWWz7fEwuU36nB9DRzWBD6T2dSOnXNG3dnRIGowaDaLNxOmczC4\/qY6f9TnXq7TdX+66vfenFkjNsDSGK2l6zL7\/wSOsw3H3MP3zJDoLNkOjRR2cVcfwOu\/n2KtyVF0Vet1zuOESIp0bruK8jgl3c2WulhSLoqknh3ahkIz4RRV5rgMRiUgqC5EebOEf8sukZaH+vNfv3AAQI81zH4SxYukojqpJ3Utp4BiXs8xTyHze0XrbNSTGCbaNBH9pAF8t4OuLRPNC1RG2Bdq3AeVkBjQB3cPyxBgPf4oCPvMjI7dN6Acl92nBT+W\/YuTwIMEs\/I0lDyQ4SQtKY45TmPEPaT+zwgqr6bcTwr48sjxnLDTjNiM97L4yUPlFWRFIw2Oi4EoYLKC6XX3uMULv4csCBrAOdRtyUVunT8pMqepOCdTHu7UlEEcN95zyQ2wzZU1d\/i2gOJodwxVLdn1EiwE1nZaXNH\/i0NGnJWjCFi2aYkyhgEgIeInuepr76unbyML89PBZtwb16R4aWD6jqu5SpeFfdf8PTNAmqQ9ex9Z6VdCr0z8OLXoPdcrBaaZlcJjT+WQLzh6wmu5KmJD9qtY2dZxmV8grxYf1XiTJxcTtWna2L6zwaULJIc8+kaGXBXziVD1X9UawChEM8Wezq3prdt8SY\/6SegaFb8u5DCWaYND1X9EHS9DcxsxJ9L6zdJ1bbWACjSkktR9DItfiubWnhgL3d2XCErpXN6UUJ6pDaaHHLnAvrXthhefNG5wz7kfWBopkt5jtPcCOSyXh9lSMrzV4Iq7oWTqa1i9neC7fmhQYPO1SYEG+tH2pMxk\/\/kuJ83VA6hXm4nUkAgE75lRLa6kUODf3ATbZfdvfj7y2yccC7c3RAI+mxvu7f860+KYH5umKTiCEx0Stz5F61ou7AGYxporKLf5\/J2fnmpGXJgSJCEMIsOhJAJyDxhXvCMlLxX+X6pcOdEVdNtn30qyCQoQHgF5xpIASRgkloiibZnGmPnUCYXg9wNKroOrD4amkjmLqBq8E2UKzgC79HOwBqPKMbLKcTEfFiB7LfxqTGxi2QeanlaTRFb\/awHzn\/xpSsdey85v2EH7BdoVE+nYJExa0Xv1ezxpyoFqtu92\/6jDNREeWc+dHHwWygeIofRWIou9\/WRpdQsHdkg2fiMRC9wCGDo70wxyDPGhwzGPyMnKeEE4to\/aIJdS9X243P+NrN1oW6kpfLNZNW+lDhyjJgZ23WuymGVgElr0\/lFnqltDlZjV8WkJIIdokL8rbmoO8Q5XCW7Z8bCp5L9J2gE9IAwR3Yh65cIWyrqrNBr3d9iZ4+e50h3R61alNMhPNW7G+I4yT4LbsX1pXD\/Tgfer5XCwyb1xPxoyYsTiEzRwhrwvXhp5DVoLcgniFc+UEhMI5frsbgJGCCYXI42QJ0WwKmjb\/VOp6sHDAtU0ry14xWL7Pwh6lqY5ZLabytu9p9RR3egPGx2In3p+euqEbU73Gy\/GCbo7Grv9PfYZKu01E0pQ\/loJh5rFDVwx2G9YXTvhSPVVxGxXAmbdUNl2VyKtE0yvzni4ut70Mt\/XEdAQz4HoQ2pjhnESpVXCHtpXtKlfLEiEeYS2Bm6rIee2z8lLd0l0g0+Vpp5ApgislrlKaBbNVjhdKRlO3S5\/vvWJW+KDNd+WnYH6iYBmCzmsBMMlDx4QDSEA92oPTLbdS2HW\/7qQFUZQTXvGa4nqNAGs3wdv16zc9ZO2g6gsMBN8tcgLHTo0arhVyV0blNSdJ2cwDOQmoGsU+HA4hac\/k3Iy\/oLY6JelHClTBTF134p8R7Ey1dTQI4tEKfMufYz\/OiQimj7Z3AaA9OaxoMxIvefdWE1yTNL\/zMFnwcW\/LlNS0ylS18cL6aVMr4gtoQoOvtpSNOD08BF8nItCdgfDTfFU5MgRmJhUAnGDeKoLICA9cMhFtASCnw\/XXTP+dMd9ye4R1BTyjfb6kwyy54V4s8udklPbX4eCh3JxkwLly8CqN+FvVrLEh3MUIrvOVRFvsNn9nDU09KXEaylK8Mpu+hZWCGC4RnyRsqn7llXVBkskSQNP5Hyb0pSQbXL69klRBkF4MHVjNzvfbj9msj6M5n6ouGaS+oxLej+7idL8QboH3khd6CrDujDDCxpySDjqlYC5dKuHE8psV\/uYtS1Ci9RsnrT19krcl+Wg8P6n71gwvDGtxF49OhfGBOfYdfH+R5q\/YVcd1R5nx+gM8ccJTsIuC6uyDj6PeDXE5BG8zPO\/VYy\/9pK5O+s\/VTjqmIw50P2y8RMGkY0sEADB8+v1EXLDZhYcVdNysuarFTWCpNqnTwc1So\/AVGTm8pyL0Rys2OWRQa8H6btuOWXBkdco+IQD75hgnYYvCUUpDRwHKModC\/uRbnQ+1sIyMfKeiFw8shEPgqawg4l1CvQme0dvWfG8AxvtNtdvUZrF+wl0PlErUVQMnwvWoIKlfnBvo6XuOE\/l1g8VJIgw3hEqwKRI1YI2xkynNxe1yCEJEOk9IKr0pQvcH3nS4dOjeSvLoRmPG6enRLw+LG5389WNxQtqsGJsU2GBSfMbHte5mC0L8DUZeKcQHU8tLw2TNFayhab0g8x2aL76SwyZlXlTE28eWPFWWzQHLp1Aqr3YJ9M00KfzwicMBNagSjRUSKI2hq+52yM0WC4+G6UjHQqA\/LwMy0aSBKTwThsdBZmgfiPT1ZoxVa\/O8qwZ5VPzRxn6ZuYCnO\/8nEVEej7X3BZdyl9ZXTadopfxTu7SihVXWdFQ9iRasnowgPA78jb+bCJV\/4qAftlU1hl0RbGZm0kLzKplJUOCuqZq692J0wprc2etFdWRoFGQAcq5+jmbExYfUMcFOkNJtVTQF8bjLL8swrgAaGS9rKOYWBGgupCRqkUcxr56dFUQN0h47kNvg+ZLREe3QqtAF5div41V1azwiTnVCwrkv+RKjFqBr\/oj1Mn2yqwQju7\/3j+33e6JJu7sPdGw1jysml5wCVPvhS4m4Up9o7ITKthlkI2IV8wXV0\/SQw2b42+ApLtZpu\/DVKrYoQmio+Kyng1zQEvOnVY86Awm5rNvxVBbe\/CEj\/EMNB7IVks20PCbp1ldQlF2FcpiztZaem29aHD2mJbJBZmNGagNQoE3qdgNLEnZADzK0XH14TtsGTtKki2M4hsWpRkzzBIL0w2aH8nMXZlShyiqxi7VNKYsh0nA525QM8JVpd\/T7Gla08OynqdImlAIzpSqQXSEoeyidJgBbLhqpT09OcCEi0LT3uBd1h9+VsZ8OSoSCU7KfssDLnMTJ2dvuYMy6DG3tw+SZInsTPfZfXGWSVUHEjxbWp50\/lT04sn83qhWjbBUcuwgHJ607lB1yVYdkUasYlzh1HdZlmgqa2RrDalWLH8K3wPai\/u6V9XpzTSWqznkOZ8\/sy5qJjBMeCzG+\/2fcqbqVxelmQB0jQAAAAAAAAAAA\",\r\n        \"acambelsuncemanufacture\": \"acambelsmanufacture\",\r\n        \"belsuncemanufacture\": \"acambelsmanufacture\",\r\n        \"acambelsunce\": \"acambelsmanufacture\",\r\n        \/\/ AMS Environnement\r\n        \"amsenvironnement\": \"data:image\/webp;base64,UklGRhwWAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSOULAAAB\/6WgbRtmK3\/YZxdARChs2wbpmHdH5BeC+4DnqE\/zPqK+nqY+HxV5npMDhgCP2\/6vU+L\/3\/V4PGOKGIYZymFIRxhlSAm7FQOxEQNfu6y5aW6vbneXXWt3K+Dc\/7jnlIcMr3e\/I\/o\/Afy\/\/\/+PltoX6Vq777Nvf\/zl998PTjjcsd2\/j0jysScP5KmeSKjSradERM4d3tAW9nssrfTVa0wc89ZcEhk5uihkkqb5\/NcJQ8VnIg92VxpkWCivTxCCn4t8F9NkPkWWTAiMHSIfhcjqWolMBCJX5O9JZPlLcU8AVotsVGRZP7hKzleH5FaErPvl7ZynjsqvbrI\/K9GS8z6QzzQv8DPx5rph+UKRppWRMXKaHN8tJzSpvUfFk0mjrM5xhSOP80jdMyJf6kyOSmFuU39JnJTGe\/K0m0ztsRPk9rnyASk9p+VbLxkvltm5zbz\/yJ3Cd02GyFxdeWbltrWyjuSuS9JPFmPyBuP4\/Hf27lg+fXLAfAHG\/ftmMn1C1pDN41Iwjrkk9cmDPQGVnW4ZIPkRGSabUTnCOB5+fqAsOrV78P0zCRG5+mq5ysLx595knfIz2VQXxnzjWY+0kdwsnnf0ucipuWYmfvmOpK5HTzxZWSVDjOf9UpPCabV9K3JvmU6vL9Gd7B2ZQzbznt00xrUhCaUFFG4fkwt1af0qviRFcpxsql+kkXF9lxRnAp5dIvvMVNbziyQ9JjVZ2SYHGd9fk1BmEPpLLgdTVMqeJHlygmx2yBVjnNskldlADctYY7JF0plkq3Rko1qeBhjn50trKsNIA2aKzEzylgQd6sYTIwvhUallvK+W9SnUpTvrPWlQ\/0y6HL+K2xGSA2RePSZxxn2ffJGCrQmRf7lTUfFYakFdfaQc\/YmGzGaINDP+q+uPjRS4Fl2XsQ1mCsJjj\/MxRy7g\/EHcmVj75WEVuXCfVKUCY\/EDud6cgm45pUz5yWE8vUSGTXfkTx85sVIOpQP2kMhRdzLekg2mfOnIl3fTK\/tGZK0iN6oLI560IPir3Awn01fG5sinjipZn4Yx9TuRL\/3kzG7ZnwFqm0hPEqrkvhx1dEpLMlf9qw9EvomSQ9U5qckA4qOyIgkfi3zpWDG2wl8+dcWRCyJy95UQubVMbtiZUPpAFifJG5OfHesk+cgfmyo0OXeZ\/KQzIXhf2hy8I6cc7v2vb1\/XMzlgkpv3yc9WJpSNjAUchXJPMwF8Wy4WZUKHnNcAn0skRWz\/4TYN8wY2DWza3Auoafv2d5uA0bX\/jVYNxGyHsbkca8PGgU0dLsA9sGFgYMPW8MvFDpHlOgP2y6CjXt5Ptl4SI7IX7orzrsJzUkTkH0XwlojIpXx476IJ+GQ9QUnaA1WSdONLRuyenIup9Mw7Ix5A3xq1HHrsG1RPIVz9RRuGoVBnpMfQbS1Y959EtY4nLmuG5W8bvKO9+EcXKF30s9QwabRVG1rz0tv7RE7Nc6fDHNkL8IpMc6jbZ22ct74jaUxmkXSFRACmSQ9vPJfLHvJkBX7pBoy7f1MuYcbJwDsi8u3igE7BpWcWEJZDDmpG5ZM64MqlpuaWengtYST74gFONXaYt0bnyQ2PlWQmwDtCqQw3NbfmjwfgWfSriDz+663lrZEijz38vBnQj+8qB66VN+VDxXkRkSeK3Qmd7Ot7yUbf4w2hSm60S1+qt4QycW4YHwB3264To5L6GMDHUpwEWC8Rbv9lu1wWtEhLsrVS6qiT+bwpBhGRxCr80g3o22colxm2y6XGDaeRH5nR\/683Dx\/9doZjdmIeYH3fqlgg1dz8AUChrzyPKVVfi\/vpzUlK1Ty6Z7JnVEPZI1mGf3Se0gXfSCOTRqOM8yVyBPDck4c35LTmvowkRB5aFF6VsSdyRVHzRB49kwchOCwGUPRsgBKRURFZClUio2PPEnvGMfP5RQDV\/Nb7vSas2rlnx8DgdgOM9neO9boAu\/ezw+0KaNqJs6QRY2DztsEeL+Adfm3Pnl27O8YxzogFuN0eF8l1QR5OywXgzQO0P2AAmGUlGsjPs23LZZAjj0gxcFFE7nYCxpsiIn3AzdOOsxehNSHycAq0jIo8bsB4Is4buWKdNABXTpdO\/V1aUT\/IocnNP8owXPzLceIcxujfkfjxKMazk1XT\/p6CMfJzrLmpKZwrOmQhcONbUOev0SbLAPZLgMtJTp7HJVtwumQHTi27yKXVst3xE4q3hWP3lcObWM+VZGfhI3m\/EuB9+SCiQCfeNUxT54xiOQjc\/AbM66c5fRanTuzjyp+O42dB9d6TCxFQvXflnyqMhyIiv+SMPPkcuPTP9DV3pJZjT7SjSHq5eN5x+TiAqrs2ZgOq5vJzS42c7utf154z3PIDcEZEfqiEetkFGD+KjwOJAATlTfR0Db1STLcBCyWAvEouteR34Pafhsb5hpzf+sp9WQh+Gd0+lEj4icqVNZuePVCVcn3txqcPtEpcfmXn8M6+XGHK38Cpj0g5+4rI8ShA+C+RPyuA5rMix4MQPyNyohR98bGIyFWVKxJ\/AEqlAtsipW2R3LJJatkAKjk50iW\/MLHVz45NcHAZE53\/6NTedOxQGl47g\/J4jUpnTkl6Pjs7xVaBJ1VJ48tUH0+noTaNfG965pvlTUNpVEVJP8+bnT5zkZ2iqrNi4UvUa5tlzW5UNG7Qa\/oUBeS12PhwxSshv6JFAZWVsMsORimMF+F9P0a4xcJuKaSg1SIPK14D+RXNisJwXGE3V6CWqz58zQFHNFA48+VRg2xp9w+rteWheWq52ozqc+3wNljL3YMFM6ZyNDh1MbBqfrg\/VvpdsG5p3roC+w13S7Vvix72xXxD3inWcnOrv7mLo8XNs\/micGaTsdK7NOSJe+LuJZ5+P9B0oo6X1zeXjTA3PA3wT3NNJ6+TxTGqKma50L3uuXhmAsONdYUs9DAIxU12Ex9PbVhPdC4sjFFV2pYPfb7Z+Kbld1Bc17YuuqC0rmBy4YrFDUtD0FVRXlZnvjQdQc9cSpoKFlDgi+dXdLEtGGRlWbc9J8D8smgFnaXgWwGoDbBVq612S5EaNr1uv1G3qJhVpT1W+ySm10Yr6Clo8bPEFY8aIfp1v1oaMoLAbsVfnby0bSpURIWfrt5lZkzroe5+ivpmm82YK\/umETdo1hAqA6wY+PtXldCiKV+y3Gv3LXL7V8+04ujelR00GcR1k6IdvXBBXDWpNqxlixuB0MCsaPXL819xi+sjkyNZMLyA4c1CYHIgM5cfUOXZq6gPZslveS3QhWB6XkwgdqyqLAt2CUHsssyMvdU9r+lM2gNA0eysFeypWjo\/O+v0phhsOwSukheDuxtclR7VWGJro6jBhdGYh4uZh7UL6mvBCjRYuGI2UD4NGmbgQbkpjFAwxfbQWxXVtBdSF1UUxDSgG8rBV17taPPBPkqjtmUbkK+n+B0lk91LmKRor51n4KIA7X8BHRVwbI5nY8Wk7\/SyRcFhNVTYpTfqzXG1xlxTMXkFQ51lg\/rVgk5gth88M4Kt1FZ7fwtHlwUG1\/FRafUm+nRnKNLjHvDHwFha2B1RXxX11wGv1pcORGKzAvsbQx3EYstDbSa0zQy83gl4FjDDyxa1OLjyRfSbeFbRWAdrWQdraZqBvYRlmO3VdTBo9MNqFjQCbFDQHYn5mGu0BNgG4bA3Bhs83XmH6qb2qrVlQMu2uhnRUBPlUdBvNTf5jAFozTe7jE3ULlFgboSmUuCz6ZN2+40luC9aZN\/YBNPCdE8h2mMvorDHo+u6ymvUAI2lk6ZSNjN\/JqH2AjUzDu5+VOMQW5S5l3Wo11C79fwZhGaH6jybDL9dzOYgtDQbJWqBh+VuCLcBru2Yu5XqX2d4rKKtYA1h7FYwt6Osoq86EtFLB\/JfQEEUWi2Mwbmb8gPlhP322qXeKbba6onaLO3tJRyg2pffP98DRQf61rbBlI2L4mo6VA929NPe3bta1ebRNrfXjPTNMUAvnDNLdUE3EMsH6Fg9az4cqcbuW1QGNK+euRDyOgG7od7V7dKzX0CaitSKNBXZVSRXOBVJFaBIqshYAYXzARROxUS0Vzv+3\/\/\/ayAAVlA4IBAKAAAwMQCdASqgAKAAPkkkj0WioiERrMzwKASEsrdwt+Tp\/JK578Fc93MT+XoF5Zn1F+YDzVfQ9\/fvUA\/xHUFegh5cvsq\/4ff\/+BE\/kv4geFnfX+H\/Hv4j8tP6vvLF\/H+g8nu8H39\/yXqBetv9L5rvs3ZHZ\/\/W\/QC9bvnv+m\/MnzFv7D0A+vv+Z9T39D\/4vqB\/gPAG+k\/4b2AP4v\/TP9b\/gPxz+j79w\/4n+S\/Iz2Zfkv9h\/3n+Q\/In7BP5B\/P\/9H\/bf3r\/wP\/\/\/\/\/3O+vf9nPYp\/VcdlA0eT8k7u7u7u7ufFpOMt67KVfpAF0gOKpKACk\/Qzv8ohn8y+iTaYLCVtwTpbydyNPSrfwMJFP1IzRw5HGuTvYLjjOHIMYUurEMA+1NHb8CA7bW4Xi7O27It5xpS+\/e0P\/ebe0DZWZ1fjZY5k5grdzcpYlbw6V\/\/HNhkai941aLpxCSA74klUk7ZOHldZFqilpCGp85GdA3ZwYfDrF9VvcMcl5oaVbO\/BdQh1FYBAOmznSSawlixSgaPJ+Sd3d3cwAA\/v+N3gFZcgvpW7tgJbQfmN\/C6nJ1NmlEFm5zD8RLOcM7nBD4GH+1ASzm0BgIZE5MpV6N69kORuX\/g2LgkCjwOP+C3vnmZYZJrz6cTsbt1lfZetgcNmn6gxtL9pemmzt\/4gbsP+u3pUugXm8DLhT15+BgFY5iJoR4IUPRc8h6qz8xVMsIbp7THkOFXHM\/+frBZA4AwKoxVE9vmiAfDz02qtFDxNYFXihv5IzRO3bmb0jLtKq1PF9Sryc\/3Skf01h6kNPzt\/\/qcOjN3qaAzijbwYd0Rz916PkWaNbfEuwsmKIo\/+lUa0uV01NT7xb9n0A8+ssEvs+zaylbCL8ay9XtMbOf4CA1v9eOXMqoX7\/ZmPSW83QUovodI3nXEDqH1eDtjTAx0wxK7vV5v0O8Hs6wr80R\/jXkDjVFrrBb5i25r\/iMpqc4qshGs\/EjSlLb0qxowtAx\/djyMaqTMQPYMOHV2Zh+fGC7GaPozo3mVSArm0tOMeQyvfgx\/xafy9MY\/hYIB6kFec62kW4cU32Y5ehNidj3Vt14mzLqc7zEPEoz69AWzeRkDaxyS0fYL5AoAlO+cDER6frKg22cIYnbElODU\/6iP34gkPGzXZlcYDhZoFnbDDrUXMPAy3KCgXTpyN3NWQ+4IPsrAnifIpL3OcEU4pF1ALN+DzS9xbtqMsMdEseZY8iAvWa83R4c8\/OHFB5\/69bcX4T6sTP1PZVEg2fhqu9UBsQW0CSqzAHPj9qf9wP\/\/lAf\/xIL\/\/kolA266ZLNYSiyhTnQiHGXZF\/oLWboPTDVeW9DoLIRSlfejEgXJCtcF7x87GTxd83cfJsQiWtzdY3NOQ8cqXR2b4R8+w6+IeSB4lulN3uJu4MZnmd3mOqBCi+xD\/btKC9f1HixiiBT6s07tyKsMV2ZWAFkBn1UBdY5aeYqh9x9fzd5Opcgh2aISoHYPDizgD7t4VvvnFx2LvdPdi0PWGdhifsoAH35jUTO316ZCWfewrgyzhiGnBIwfBp6Ys571z9qvoQlkVwIg2OPwyBTKu6zm889Sc8YRFyYTV+Ch7YbGkfXFyLKGbyD5wwX\/45Ki+TITZLD4Ab0T6UB12oLYMZibyptRz8RJvsR1bnu22G5pYWwvwtUrzb73iGFWRgMi5ObQo9EY+H8jevqMopG7t7f+OVNd8x8OQPoLjdfT9ofG8ohQ1BSrh+Fwb\/Tb8NDC7g\/wZBpIADer\/MUTw8a2L6upI137tqLjRIizOup3NuEtJX\/L7c9PbPgyje+2WUPEV1JswUGu8W1\/x36fNXwA+acY2ZzV9ty8IGwgL0tmcAYH6nipxjrmon31F7sHsL1aZRPgBnWF56sAsIX0NbD8gS7RYma5Jlu9P2CAmqYYsICazrkKdipVnsAI1qTDQRpq95hsLMuHyLFZdJmGGCa+oHPpVYv28x24ajFGcP\/wQAw6OzsBJwWJJ43eMDlWE6rIggfp+Ogvabt6RV\/GQZiawJ1ijBHQvN9pJ1Sd5gHSKD39G75LMUzv\/Gp\/\/dtP\/t5n\/+7astWxkAcZcxq8y2qClyeQuLiMutvKiO5\/yYZjcqMgvET1GLy8Y4j2J2TTsyPsJm4wGG6033M3IDsb\/di4z89hnVhXZP9eeYMNbyP3AzLt9bn5f3sO1LrmjPHJPUj\/\/8qKw2rm3wos94mezjz3qG8gGB2cWddPRdEhCRvVrhjYrdWwctAobXnvXSfcafD4zs8bR7gNwYuKbKOgGdfqGXrO5ou9HfNNgxo0nj42KHlm5POYgeR\/EaLX8dhzzWhKHiBxrQcx7xjswk4d7kYWwuhhhbvR3jbXutY2yGXZFH\/\/ojWb3zukyov3yZREcnngoaaBQwD2bqX2WvPGrjSZsLHl8wYkxc\/wga06I1Guz645D0Sy5vE6n9gXPRd\/5ne1vLqnJhU8gfdModd278ZZ6ezN3w0KjC\/bKcP8\/W6+yE0O248Ktkt8TUOJ90ywH36014mBJTdSZZSewXnqtcHFyDHeTMPSHSvswVs2uo3FPTxFjrMvxRh6JusfyDkSxNaddBMtn3\/wc7dJ1f9m3z5hvUPNvmaVgYmUEvBB23rwqIhqUDgtVd50HH8vHVze\/vZLjUIJjW3hh2ZgWgEmQVvypWXcAk1+SOR93afxJIv71es34gPhAHR8sffSIlPyx15nsV8HoRvAKjnxt8GkgJyXDh8\/X0yHE2VDIXwNC7lR198Undc8bNC3MAM\/GZ4AdU482jSK8qsNhbbE\/f4DOMVEawWu2p\/0\/PwKJ8Y6bVQnHiwVJuO3odM26EAa2KCTMwOn1fBslF7XQis4YumXFf6S2BwW8PCbnyQRnqs7Wbnnkyzrp1cco7ixZIK7H8Ru8kVk5Whz6lCLpyDZNDTo2XMAMqwA4qrA6o64DqRZhYgcU3iZVL5MphsGjzRtN100Uxou4Ch0OCko26\/5khmL+DyfXleX5Xuq2tsykIKIQsgcic2WwxEgYUEDnuSeItN\/WSwulrdHE4eNCj1FRG3HMPp0exyhkmww21mXiPm\/npdjiQUCXTBZ83id+HPD6Dzam9Q0OwQ+pfW5cOK49W92zs4boeo676TbKEpMUZaPQQIGFBHQZL2xru9+Cl7QaClHdBnWFaO+V4uT2ZvRpnf04BXn5U8qY2FtHwkQI8W1Sgc5lKmOhJyXZO47uLVnI83Y5oFAD2AUQ7obuPWZZ5W2QKdLENRViB0sCpTkYSbZPFTdvZxOxVeml+UYWn7sO3L04ArOIl5YgY0us\/tHv2rT8IDqYKWq\/PGzK6cgwzg1dm+1tj5ylEWHlhERtTjculhIgcRaXE+KCDX3ghnp98KrXPyCHkGXmLBqf9UJ9OPNMxa\/Y9xHko+ADUaA6mScy\/nN3znAZUROFWz6LVfbqDiKgsRCKAAAAAAAA==\",\r\n        \"secondepousse\": \"amsenvironnement\",\r\n        \"amsenvironnementsecondepousse\": \"amsenvironnement\",\r\n        \/\/ ARCAF Riposte\r\n        \"arcafriposte\": \"data:image\/webp;base64,UklGRhIaAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSNwHAAABp8WgbSNJ55Q\/6vsZREQefueSbyHNZRjEMBWRSJIkSUpKKaVSqXTqqid427ZNceNs246SZWY7yTCGmZmZmXmYGTKWHXuYmZlnDGpQV9X2DyV3V7dkfztzRvR\/AuS\/ozNuRN3kxaBE5EYU5icr4I14Si4xFtRPVgD\/llEHCeonL8AdTeQ1TGYAq0cbJjdYrt1smtQA9kbThHX1ajYMw00T0pkLlyATPg39xeYJJXdU5MSpS0AQZML6x\/KLrvVMGOr0kYucugTDCiATGI5dpDNDx44cq3z8mHfy0IHMNB77sSx3DvC5qqCgRKlsYIFrvdmoO7TvGHHzPoSjt\/cP7lap9V6kTxoO7zlD5ANsv5Hjn6tDQxnBo2Xn3GwIYMc3tq9oG+ob24CDe3MpdeGN7jsL+HA+l2vEK0A9ZMUwePlCTyb2h9qQsLBui2puby5xvCmVrhO+ofK+Bn\/dloKB4dwmbbICRMxJb6hvL5b4hnIlIo17aU9lLmMhEWe6rjYMr6GiidYD2TG+nZGS6t8OGJIbbf4dyItsM62pdBgwbKnfOrwGMMZQbrKEz8x01G4wxuC6WWSQVJoOsXaeDa9uBDCMa8jYnDTUxgFKBueeViJbU5j3lDqC\/jaPDwZNwgx5dKeQ2wmGFA3b1qy5TpuzN+jDZ63Cs5rkGTLhjk5njQWGDanrFOq+YUz\/3bY5MLjMEB4POJtCSNo6ivwUpMOOcXcZmirz9WxnuQ+P3UMpHSCg01n3Dt9seQ+fqmOOM2m58Rk6NZ+8s0cY4V3RxRow310PWdThKuXqcYrm4Ep01Xn0uqtnJANErFKOGn7SpJglXVrf6qp+cUlnAViyoNWJ3MvCJ6Ow+vB4xNUUPDIY8doFFjS4mc\/mz4lqgB\/NddWoM+FT13KuVVylmS3mOar\/PYqyENDZa+c6eoBiqaZNwSOLPrJraZ2j+\/Coad2en4mIdy61idvmhVFU2+7Dy0R5t6Mn8KgR0VxHDX9HUTaGrav5kV8bdJFHHEkjXgVbclCycXx6HD1AjYC1ba7uxS+zpO3R5Gi+rgkRX5yYLq6b8MrgV0wCy3ujcUq895Cbx\/BqQcj8bU+7qX9m7vuUAHv7ESFMYOi5iR2v\/Pd6F53bfF0Dyue5aT9FRcuF7tfQCRJrb\/hAuwuZTrEW6NFChxtp9O6WufZtLKxpEqc9g2FYAzzbJY5n4leyfuAgttZ\/Hma6G+khxQz53O+qZTA0FVIPmLJysNnRw9c2aVNtJtzT6Uqa8TJhWBbRIo5f+lVRrDaPTnE+BT8TIZ3LdrS6euZgzwZfV5lvZrprw8tEeaO47jy9ahpBdVkPd+pJE2bkbtTrTHrw+jBVhTne5ayHMWszYYv0uOs98l0XQRUZtg23imv1Ihm1cLrVnfTiPCMBLX3vKVe9l3YePHDK2tQ0Rw\/mJcX2Q6OmmgDDVFcVG\/HSMpyrk1TzswiqK\/Sjh+vTaL2ETcdyMSdp1j+D+8xUfC4vSjmS\/OXApmGDSzlxr\/IvQRjVAB3CrJU\/u5J6\/DR86sR1Xb7udQg17rMEukTEO7m8m+YbgXVng+uNjtRHACVNmtmCyBrgYydSj+8uoE4cv8loVNKkmzXARGN8pnIOGm6E1pXlZj6eivG2Dkm9CgADfJdIqSYCV+GtehVv1yvjfExAbcJoj+9FxeoixRLqMK2xtj1f6RN8ahVgNb\/FaaNojLNyY2mP0VfpMwJqGbZofo\/RYQPSNGANmu5K\/S+Jkq8pWWpayKtd9sdK3YRk0FqPrrJF8Jj8QEBGq+k7eYifReQefDLqV1oAj8p3hLWOkn2ji99kli6S4aLunUCIzNtdZkST8bFSy1fwmHwzEYD2yX5I0+fQ+4YuMRFUqVfy6XiDSQxYxgKyOyFl\/P\/++58k2rEdx+iEBqwuN4COD2i3tpLRSU0cHd8Fzq0xlmwbHBtjDG5NZRK6KDgdKNyh3HCqMFCI2V84CrcLA4X+wl7wCgOFmCuBfwsO\/113hYqnCwOFuP39R4lZGCjEdeF6MUeGhm4EzJWE3bBUyuvggMSus2wXt2uP9+8YOs98SdrElaEdQ0NDg0N\/SjUqWUqHyDfwpKh4c2CdKBFpg8ui4oARl0oKdInIBzwkKl7uWRZLdS9husgieFwSzoQ1Ut6Ct1xiB6BciPxhZomSr3k3J\/Fnw2ZRVTZF5INbPOisniGJD4fF7QKmi5Lv4bUEU0uskepewBRR8gmvqmQry+rvs3sSSSrfET2VYBq2v6Gpvj5fNbn1tuwXeCmR3ZpvzM8GTmfkr3F4NpFH+ZWqGYIZouQnoscTeZQPHzy\/MRu5VeM9mcgvKy2rmtXm5j0VeDJR4J05cyHaKYmdFWBmBfuWShIEly5eWiZVu5xOESl7LBHLRZrhrKhsrDAVfmKEN5OwRqp6BVMq2ZeTrRXpwm6XpM7WUOFTf0y\/kGijqGpaRm\/ZD4zwUqI1Ih2w24FyNl1E5BN4KdEGqeo1TFcqp35j1DzjohN2OaCSSjZPqZz6wfJCTelHUzngaRftPnsTFdFKRJRQH281mooBr9WUzVaHnuf5vg15MdE6EWmBI0nEB3JShFy8ddiS5\/meIeCNWrIF7pXyr8woLycwK0SkHfYlEt9asGEp3mbGomkiIp+ZUftKjZlSQb6El2JNZ4GISBvsTyYhEJGT2BtgqlT8DF6tJf8JH1ZQOCAQEgAA8EYAnQEqoACgAD6dPppIpaMiIS3YjDCwE4lsANROK16+Vf6z8gPyj+W2xv3n8j+wrrbjZ9s+eD\/S+oz88+wHzmfMN+0v7R+7r\/wPU1\/dfUI\/oX+R6y792\/YP\/Y305P3T+Fn++f9v9u\/gP\/cD1AP\/\/wJPkL+W9sP+W8P\/G38A\/bOQP1L25cb7J35I6gXtXzovm+zb2H\/TegR7c\/Ye\/61L\/CvsAfq\/6Yf5Pwrvvf\/J9gL+W\/1f1XP7T\/1eXH8+\/0H\/v9wb+cf230w\/aD+3fsl\/sq4Kcgm99lKddz3ALvfXC\/Xb\/L26gMH4qW2zk6CNkpFGWmJF2I7if\/TbziLWJI3vnU8\/foDEtOIprECKdiOm7lGBQ76yLkDRMkKcSokF9tRVScQMXHVmkrxNi5g3GsuqtdkCnoUs3sB4FfDXKai0lIalCz\/qNPjyzt\/Aw41xwN4ajEJFSAZbjEzFc7dwcwLP312JTSWHQwL9y7T+Yaz+2hYjUGjOQY1Wp+Bb\/mLEJVyJNZCJXdQKSIAbiZ1KaUw9C59tYa\/I+ITYs5OS5CZn7hPS03U8kppYD1Q7CpT3hRnDMEBZF18g\/sb0ZnNMUht8ZFyXqX\/hbGA\/Fvwa1bwwWQ9dr42gJnFsBZTTbfqknEAeyLCpfpI\/BUHxKODYUbaOk77D4gSNs+z+hEMFqv5SO\/Z6\/eTe2rT6MrXzcQ5q2lF+TwoI5wdc9fjl6yYVCZ+v0+imlj7H1OD8E47h9vaEFh1sp\/BC5nqvkVAB\/VgnVosAAP79bkgAQXZZyvSdzjKPcyOlzFTyurXmkqoBCt+o80782W1zClczeNpFPouhTWX7JiK3GTnIOYSi8VkHE2lN\/Rf3edd2Zj9Bqd3DdKUrNCItO71\/ZRNXsPZZEfQN8HoswX7jVdLv7TcexupZfQtWSI0LJGhtfFLotTNR+sDv533bLXNcWow6+ZOIF8h336XdYaxd+baOjoWIe++Fa4JO9PbniXDCNqTdoXNs8wFFyy5YqQQD4NW38Rw96TLLMmVwcvF+xoCj1WjYaQwQDlMTONeFsbsCNAMyRfsm+Ibiao44aE1qW\/Z9yQp9KNIfgV9JMbtQlxaMfII3zxUBIrwUNNc9YlkOYlMkQsJOrMAVi9qMXlfaFNlM+aofjLEyKfK\/fik\/fQr\/dW5KRyKda9901McDPiLpJwSBQS80IxaIrcU+Cj4wYSSABFvlzyNSX1VLZp0qmHhHoaFhKrclKLsyIOKHzI7bMiOd+Ij\/KFUytBI4prwnX76nyjgAc90fw7Nxa9c3bet2OX9Y8UXAWBwshp2nZQEv0MU0vW0AaMoTIg9NzE4ul3aWzj81BEz03vb8RmWDnR\/\/7fF+PLtpJElW6rQTnoM1m2E1NgZUu0UpOe5atY8bJ7kXDJFtF7LzySPMVdKbUamYA7tMD+\/nfEMF695\/H3t6dsCFX3UxEhedBp6OOjcVDCrgFXZrcVOUgFZmSwinIslJdxZNjlu1C4ENK7XV7a4JcD7bQ0H8k8QQXnfwHZrkhFnX5i8bK7j457LfaJADGMmHpMR\/R+6tzUd7WtCgKLmvVYIKcuyGA5oyvFUQYfX4qpfNQD9LJyLhldBuoanc7ae4YLD2Kv3VjOvz2dAk314QllJ94DdqT8rkqHSPuiBHGax\/iLvu7CUouGpJF\/pUNC9z3Lm58db2LOXyRz\/P5Xbs+OLO5zD2vccvcDjiESOba2Gt91ke9nLodvU8YzqH5+zOtEhVEwQBt5hox\/0dPwysxU9X3297OsM2GGKLf3B2w4DfidA3HJSPu6mqkvoY9wCfg3llJX1TeJSpzW+YZ0ljEr42I2Ku7fBk1dlkl0JHNQJ\/stgcC8FN9AD++hTFhd3tnwCp8uRIcW2cXEt2lJO\/vSLvsv9a3fM592aGNmmk9zD4CN1jVEsI9Sz07har0nudedACtH8Ru61g1qrLY5WHnS0fL7pYoo\/KdL0wLtbv\/LL8cNbMRcWQ4VBgV58rSpDoztFFZsfdZXZ6y4+pLw1LE+E5tuIKT2PuyQ0GloXg8eF\/VBNhzyNFpT5uhvcViaIvPWRz2dgSL96aj0wOHNLSPom0QoNqxGXKvwADy73F\/dqKW9zw+ROARDdLH56dr\/GQDW5SUm542x3QLGp2ar+OC3OLW0onPEJxIf8q4+S6kDcvYIGtmm0iTRBDc1\/5qjz8xVthXNfpnURw1FFgEfdFUpjqifARt9zJQmsdV82gFtyVWwVyUREUKVzLAea06EDMt52Lr+DABJUxX88yWdV9I5jXKZQAnpeb6isEi\/cmFJd6zy+iOFOI0Vg1YpUvP\/LL0pTv\/gp2OJPSIXlwMiF7dXo9oix+x3Z6AvaX5g910lEF2DZadylu9b9FRW6IDYaDyX95+hxDLEl48gQdp0yJqhnv7sJK3jDDSTX57p5\/viABfSVbq3p+fSz8NAoudprYA4kRJPXQyoX4GucL+EWc\/YkeIAOyuqQ\/VwdjF7gucMaUGp1rii8cSv+MbWpueGaav1qb1jx+fEPCVPf6ck5MjuOitUfhUEXDMS0IgeiQ+FIjMzHeCFa257PBSqXXQqtZpf1PkMZ1A0TXuOXNCxXYOIbH3LAZX6ehUDlpMIzMngC4xc8NWVmpEjIopRcaeJI3pZ+GWCevvO5oPSt8PIoGztBc7lwSlgR2HHBQCf5Qc09YMcBBoT8LSe\/yzuArE37V+zyceeXPbzplIwj2JApe0l1szrsbiBuXCUcvMFZ7z4L9GMqE0UHI\/lJS4XA6+IDlV6A3OrSiw71CtDciA0cvU8kk8gSDBkfq1stKhlrq+EtRn5njDBfiRWDtDqor72fxhb\/zGycGtj8o4UV9H9JCELqrlRb6cDILOrPc4li14W4Rmr2LCXyVmHd3hBjOkZMYpBn0s+LUaO8u1kN1sJtN\/FwaSLOZJGsAdp9A194QD+yEzsu+bRYzNFovZk2DgF2cyTywH1iud0SWZQt\/bVy8FW8u4WauFydgXSlNBTOxfXczxWiHrfobOCnlMm5p7p\/ycr0rnHmiMcdClaE560m+c1JepgeCDITJhQu\/tYHkC8yPVoWbUQPHaJ2\/poxmQUv6ChBxvTctEpOqdSi1UnN5mOU0p4oK0khRDb08V1wOk0CgPTRjgPekRSNKxuALQ28vdLYf1y3IyVZLcCcYnQYVC63osEWSs+cVXcGLWs5klzpOyTcblFa58RSR9rpk5c2\/MMxzgxSx5tRxAjF6NZpqdmVRTA2oYfHU16uh2siBq4v+O2Zdgpy\/gBl+yVt9\/UdpzPmBWraDKQPLr1NzRCC6SlYKFuEcOlaEiZzMfDqczHwoddJqP9UJdq1cfsOHJ3kD1dEhGxnUG8WQfIvZyS+2enMeuGVyhz2to7vi6SmzpfmITBXHKHuUDczbpB972dL0PGY6O1aa6U9ibqKiCkOJIlNZvhOhd9rPugvxNmguQHbeuRTAcjYbEdL+fQJBKy\/rF65rlbPPwGmHROELBMUp+G7jCiKrLZDRgA2MpwxUq78xBmOzjfeXmfmH6qfxacmfVbspfwd7esml7gj91UyQfEM2Io17dsN+FwfkRiadbHRMLWnfwU98uP+UZtcVn425nmuQ4ZOG+LZAZ\/c933U8eOSbvoxsaO4y7hPW\/erwYUop0YEtXCSMnqRkSNxqQIwjW1\/yJdWdbIMTXHbr64qxSJSL3n9RwxLYfnhvciPxKgqyRFLY1IxBrZu12O522NfVP6Gnr68M7sNHeLdWVxS01C2y5sO+bJhOC8\/VSnr3lvbE6Wz3Y+R\/qSFbO3l8QOM\/JbZH7haQON884lBga6\/cwJ39uoVTwW\/1p6pTnbnQK5JeTzR2qak1fDbemgSHPAPazf1QTbt+xkx34evTsAV4PYb\/AISAlDLoVoHXULo40MI6p4oP5mBXbIDvJ6yfJQfe5VzLTWSgQP9tcKvpu7y1afVotH8Ru8eU3eyp\/Ru9u98lMGRexRBJt6OIXIamuiOJPeGvPczktJcgBDRwGR0a\/7\/2YWJfLTjxxMjW2AjSBc8yOmKw5Kle3\/Xj0uJHbQlkl7HWAIjNroOTH3lL2ry90FwFmgKLrea9FtDpx6v4S1h5HvhB90CAS0KyfUjej5wMjSLiTYCokjnYdTtkC4v0u70AOtOskf7H9038O\/agqs\/gwmarUzkY40F8g5o6AkbiunGK7lax9HdaVgdI9kr37oyeoLxlLAwONGj\/5S0QGcZEY\/4CD2XSElHyAngHgLqZwv\/U0CXx1aK9BuLrKnQJ0A6E2Gq3bFaHT8YIVUhgOdE3V9kzBf4eY1HfYRD7myDxlNX1NPSD1kgx93iepueWpbK8VVWnfI0kG6PLffOPlnXQgerP7lTZA4qid9RuByRNmnrhY1rmRnshEA+pnqtmLBGapE0201KVJm4ip9xVSk5PJpVkpzcx6m0HoGRXXXeMTyChY\/NsMbN9QvvgbLbfcvUM91aOK83nbGSZA38xlTU2+pCYbYqTKbQAJGcsggL2BLJqFr9mlzLDLwpLjrdovKJl4+Ce4z5WzJFWPtPXe2eBLJcqeGAzHdBIRGZk6fuWxrdRCKmlHCTBXqM+S4CvEq+4wDc2qGZoJvuUhLoiKmgpH7aDcqgOvgPYjb0Vsre+wR5VZLqYwWrzjB\/EOYSATRj5Sa2XXnVwf6GZp80OjqJafmPZQBOv\/8u\/ZKDd9SCTPFcqMKf0XZm31QRi0QfCJlFpZ3Km28BU9DJ0IBZ+HsN+Z2fsJRlq3vHIo6mZOZgB3GBIE+bR3u9b4PQCqNEteT5TYTb4jTbyjYHgVFe12BL2JMv3kgbartcHA9A8YDh9qxIfdwQvH+6ZDYvGt99XwMWgv3UPCw\/8D44eA8oACLg+NBnIRMMHnF50gXiSSt9CvWw6XVXFpmksJEOgkGsS+6foPOQhFWxvLS2T73JG6o4BFro20lgcfVYXogiHdsYTKYD8Szf8giOrJSC3WpssOostsMIY3vfvZQGJeNS679hzjqDGzbS4uDz+RH1jBN0hhZLGj9bBWIAbdA2\/k01oaXGvpmwLUB1QuGpCW+icNeRCf+JbXEyZlDT2qq3GXBSNaPjf3+N5xMPHMOYKbrqLn2ZP5nWQ9e0FPtwp7m5vISEx6BluMOACX6QVTN6\/cWsIbNGNI3VypaB5XWVINoPZnz7ise21F+GSExcV4BCqKT0UHUUa3uNXnOS2RpjWg4MM3rOvDpndOj3DbVUHXyzoUsiHpzdFOUZWOZsO2I4sB8\/0NTWpAod8DeboJyGJKS3xZsXWxkUc4ek\/qO4EWCdfrtMBLeUVZoE4wuSZCycejj23\/JtII6XnCl7JwHYbDzv0z2SuKlQG6qvGJz1VmSMVC1lOv7a49ZAGf\/Ul4Etj7p6EpQExGMRaDeAiW2JbNf32AcutB7CX2kfYQvodSNkyomPPYx6XUxAEm1uDiy44OvYFDWt5XZm+Vo5\/Ja8UVk7Unng1H2HCUMULU\/KvrQIXUnmnqgzlE92HLtXpsJPGhsPPXOV\/TolbguLqACLTKRSVpVAZNbOr\/P1qkAV7eVpmrni6y0qzxxgOe4eTQexy\/HflgEoz+a+ioCGL5rdJuqJI\/OiDFWspPKscd05NaUGXjg\/MP4ptsptGqJ3n2bsFH3vLfkKnKxExFNTF\/2s4yWv1sBj7RNdZF7yQpQCdh9PSRB1cD8lEzmsLFtOQ6otvfJ40D2\/kUh7Zsey4M\/z8xnRJyz7xnAVz52zQxeIfXbBKQ6n6LrefHUMJYQMflpFt1VShkwsGgy55f5Eqf7lPxk6gKYteR9kCREMbecni3frqYb+\/7DUgS+TiQcaQ5PZsNcwUY\/uPHPZWyXy7VPYQMLClqTfYT+c2eonAAXXR11eNjPJTV9nO2YVKmmc0O3jlPpXzCn7fYlCB7z9iZdm8+5Jp\/lamoLVg2WaPlvKTutJrN5lcz\/K7vDnibEOd67DWXRb+jNpNi\/blopnkmnwxXsxmMYXCNIpA8bT\/6VhOKd\/42BXdl94cN8ycjrJkbrZHNAyg2DZuEiNg4qUjngQQW3GWrHJrdNHe0M4QE57t5LEeRz4fj5GSnnHZwfCbzdNVHUSnbHLCXsue8FXX1MRgv2kat+9svz2+UcysdniioYJD\/BEDvOTPmVcCHtVZjpMAWuVuLuBq+HY2ifcxYdhwl\/RuAhnAAAAAAAAAAA==\",\r\n        \/\/ Anonymal\r\n        \"anonymal\": \"data:image\/webp;base64,UklGRngWAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSPkJAAAB56WokaSIavBv+nohICJy+CV3dhBCREQiaUqSpKQ0S6msVNo69QK1bdsWN9E9E6tQqriEpVhxp7CLe9t1d8Nd1wV3aHGninVbqsm87\/vc\/y7JZJJO5+tG9H8C8H8UrdGbfztl2P37sZpwECn47CFddu4pH55m5KDgW4cUbQwp2miSP0aGoSU1nlnvJ0hl6FK0YW\/lsDPjFryuvE0qYbaKiSq\/GuFVxEz0aqWmopdGElU+9f4Cb+yWG\/B4DbWht0YSVf5k6xmeHOEoj4qSjtBrzS7bl7CBUzz4mefhrXWHht5rXvAnq4OTs5pDGePRVirmUnGNL2Ebu6NZTKG5BG+LHCU5EaMKfKnAYUvEVazLcLRHx6iZW8NLvoT9wpaoi1C7yCV4W2wMc605zpcKlMPWaKY\/mOBojw5R506u+xL2McG2aLpDTPASvA29EckZhcW+VERRbIumLKPSHO3RUirmXsk3voQvqDXbYsAsKsVv4fFRyQfDe75jhypmzdgiQs22mrm9YkRvqArZXti9lDygYbGfhOcf\/Ks7yYxCl8mef44siGRTwPxUss1HyruYKkrpFIpSkqINU\/tGZTFTVF4Y3hsyY9ZvaqhvcFv\/YT8drUXopYjWSSY\/rm\/I\/O722zR5IeJEhsbIU\/RSmFvh0FSyaEjYr6lV9sJci3Jv8obHh8ROJjlcCp9bQyDiGBk2qHXJEJhPzeFTsW4IfEA1jGieGwL1w4rIGzv\/GoYVaqkKOIorA8+JgGP4POBQ6xFBh9UBR\/GngGP4IODQJAsCjuLagGN4I+BQdEHAUVwXcAwbAw6NVAQcxW8CjmG7FWyo+VbQkd8CjnAgFGyoOD3gGF4INGIoujDIkKL5bnAxvPkTk\/wruCi+j4c0PUGmDpFewyBTD0xkMshsAvA5g4thKQCMDjIjU\/J5+HGKgo3hIwSdloCjeSzgKH4ceFYFHM3yYCNmsCDYGN5FsFH8LuBoiQcbkW4r2Ch+hWCjWRJsNE8h0IjSpcFG8V0EGsNbCDQiXdF8GNlQ15C+rqE6Tf2wofgZ8vEp3TqRlA+HDZrkzDxYxYTKPMhjKVOphwsRvpWzUEKELrUZBSDiaBkmaMx\/kVx9RU1XvAcAO5jwEzGp7sQYY9LQ4ec5KqUWV9ScDcA6T1E+qMVorQzTi2iV1ghTRRuS2umwcvOXaLoX88YGYH2r6Z\/m9u3bt+\/TtXP7zu1WZryGnE6jZraadUiNLV0z1NeuOWvuXtu9pjKK1IKiwklrVq9Zs2ZNZWEEgDXi6C2SzV+Fc2I9FpMVtSlK8ccIch2NRi3k9nNqesBf\/MMHaeilYXlw2EXtgZZGy5o8abJ7y0fGTg6n2JPH50e4U4sHLEMdsy32kR7uTKkgp+QFFlBnpXkUxYmkcj2o1vpIs2pOKVX6x\/yw7onJQkxfCMeo6VrzZgYrFotmiEVjGexYLAIgHEsXi6VEozELsGMxO50di8ZS2tiaUkY5GYnGwmkiMds7VFBnofkBxmvNLIXFaWo6RPT1UgBFV6nlXnXKttfGOAcjeMD7YcA6y8EQSv7Qhh2b9nYaeb0FgPVDl9ZyucqVkgc\/cHATgHUO63OAf6hdGfMYuEuTjeLSlEqm7Ykg0sW0M4F6kjQ8hZ+F1cBo8hjsTrreBnxKIcmeCDpc8MxkstuC5VAqcxFJGFeKs7GQmtlq\/pZyXsuTPzsUP8IPdHr\/fEXzBKFeJf\/+S8WiMTTfANsMl2E1Vfefj5nU\/LOJTo8VIfl93YMEl+JlJrlg2T3Ckah0pAU5\/ZoJlTkhp2D3iWQlTISBkGKzjZKEPLRfCKsQazc6uoDcAdRRVqOLd4BzVIVokkQZrGbDrcAe4Wx7dnUJMI+ywA1\/AA5SVmEzeSA31nO6LsU31MxecQ4wWvMqgDY+jCk2AThCLl4grAamkj\/iEhNhq4+3gA62AXiXnAJMp6wBUDRtZ7Omu93AVPJXnCan5gbxHT\/uSP\/TjloU04gHmieA8AAbAbTzYXSQ5wAsJmvnkrOAGnIrasmxJZQvgGa2A1hHzgDmkKsx4iFJOlnsAiKKLaGX7LRzlO1BUfTQ8LkFu583XFwEMI1cPo+cCcwk16FYsW4FWQG0pNlITgdmk7XWM\/L5H+8MZrETwAUOrE3yOHJcWruiNv2K2vFYRu2FKI5F2EUsyXMA9lFqXeEBb1xkt51pQ6bZM6mP2ohKFvsBLKF54bA2V\/fpdiCMc6I9oOEOhDI9DvewLwqrTViyKNNaoIHUPAwv1huOArbQTTn5PoBCGkoymqNVTKjMg9yLSmYnMtjLV7AHMrTjpJb72y7T6bVWuqqiUpztYn064ey5NOdL3ul30rShsK6k2OhzKwE8ZJIXkFv7jQhdaqcUO6mz0VxwXqliq19dB9CimlHB1CS3Y71SM4CZSq0G7Jc0ThTAU9UCYKuoGcACqqVWkqlKzUeHemJ3cGEBhQkA7+le\/X6OdlLTFZsQ6TfiTstVfEG+D\/IWgH72AKu7SPJ7YBs5D5hBbgVwnDwLAD3sBzCHrAbGC7fgrYE0XI4kW2LkKutWT+9dAKUkS3NTSCOuqDkFtdRZsArheLwUk+LFAMbFxwIIxzfXlAMoiMcjgDUpXgCghtyWMjY+DgBGxi0AhfEYEJ0yO15cGI9gfHwkxsRjgG3bADA+Ph65PUVN90ZeWWilcaP5M\/L2E5qyFD+dRM1sFddiLB2TWSsVyZfvH1E9hc9ad4zJSsxgDBfpeiPytZfkSr9poGb2modQdOl6Y2NjY1NjY2PjKeTtses3PoHfakMvhTEExhPUHhhptIJDtEtLdppV2HozZel5WJfGpvzaMtXF0v96+j45+XaJNSxgFVVWmruBzzkRQPMjnOkLAxZucSKsdHF+OX0BOfVKGLDSWIDlX1aLmCzEqAjwAf8CxvO3GeSp6BHp6TYTq6X9yjIAz74DUHzvZvcPM7r02ye3Y\/z+sf9x5Zgj\/bcK\/QjjqLPQ3ATgy85kKf5ob01OL3z4umfyBnKvzF7DDwAMVANA04NnD7lhPrkZY7oT6yc6r7nizH+WH+EqtSsj7QCw8+9r31pcmuDWZU38CHhA\/g3c+wzAm+kpT9ftOH0W+EzWo4wDqxY85lWU0p8KtXGlOStlz9GJiZO3C7Rz9MCPLz8Hbgj3Ape\/BpDYDiDUsn3\/kyPAUqnFLOl91vJS30CV8SfsZFJnTsoFpO4+jU5W22Q5zvGZHU\/ybk+oIPk+gM85FmVdfOfY98mI3c7j9gU6ETxhI6roU3Y3XZel+fkCNvVaRVe+pO4cfZ109ILflTHbAeAIu\/l3+7q\/o\/vp3H\/Ml\/xjF8217++hUvkUak4cPZH+6Im1SGvZQAiwMWquBdRUhMLA5LEhKwXh2THYlg1MmI5LTfv1CUysAWwghABa0TP4sgT\/vxAAVlA4IFgMAADwOQCdASqgAKAAPkkkj0UioiERyu1YKASEpEeQjxBXWz\/gNbw7N+PXQu8IeFOcPmDzDeGv8t\/KvxH+hH6q+wD8Z\/4D3AP1E\/TfrZeYDzh\/QB6AH8u\/0Hq1\/5z2HP239gD9nPS3\/Xr4L\/7L\/uP3K9pn\/\/5zX2V\/3Hw78dPxj215frPv8x5y96PAC\/HP6Ruu4APq135WpZ3z\/43qb\/pf\/E9Ze8++1\/7z2Av5r\/dv9393fyH\/9vlu\/Qf89\/6fcL\/n\/9p\/7Hrg+yH9sPZU\/Wth0hiXqdnJrbf6jzhu9pP9NHYRX\/bOsZ42iTkiJ8Jw++adjYcclB8\/0JCI3vTWCulRcsaxUzzxxwtxLNDI\/GGWR96jMJTTPt5\/cy9O0MdRbbB\/4pg2aahvQk\/IWn7RPxC9dAmTzTxOHS1E\/qa4P4SCWmlWmdu7cGdoiX9nTlkzeVTL91tdji1ou3zsSG2icVOxl1F1l2tXLiEWN5xBkIQPPbvK36RGynwmDPmaFmUNF6r5fnBVIOv217hW1fyrlYLhwa4FEdp1\/GVm\/PNNPRQfMsRoibLwZLauuCzMVkQTqlZdB2gt3sf\/OYPD4T6VSkB4AKd5D1iYvF++OBxgvQH2T5EEptSag5ZadhgAAP7+0BwABX+PzIzKwfq9+RuiNafwNl7vJoyb1mHtsuEFnSHD9cqksf+Dk\/\/uSnav\/\/aYQGdDJA3YwgfOq1XwvPg9PUE2k6lz4OsuZkDvMK33aQ2AvRo+hCP8GE6E2xX289rObtqEGLmDI4ueaK+sPD2I\/\/UCNMXZ9g+TnHqHfyeUrPlQI8p9muYcNuqtnkL6+n6W0NLpF3e902sIMBmRNKqLUB7cH1CXYoY3Gffiv+G73rvU3m6\/Hv28d+HFPjn02XrgR4pZY693ZHfmW81b+lQhAOT2XRJa6phh6dFmtEZ5zq2L2sJtrLoBXai18BZOCGAWYfIhmBIridqRw6DKe3om2Jhdli4FObKA8FSHZYA\/1hIjHL3TSoPEZ34590SCVlgAK1LO3k1M07\/mzpssdlObMKvl3EKPLpejjjVSseVv1e7hNRqr2+\/hkhPaArrYNbvullIeQhuLPjH5CDAcIbO5HtPrtkWEmcX9HWKhHMc1P0ExGUegzK7nGZqKiXNdrGw\/Jzf\/+x95vOw6mmhQn3C1feCgd54yaAefOSdlS6vtU9rLnKUpNBWxdiA9xCj9Hoe74ardoI4vwY3lBkMB8OrIXpJv3wqGM9e8J6T\/god93a05eExn8LW7KLZnCk79xPoMiPxZclvGaBBl5FTSEWpF9SqqGz0isiKCImfwqqq52JYGc+VXa5VS3KxST8iox46NeWZLWgENcVp3\/Z3u5r1i+dU7hzKiydT+OAT2MBdH2TM10OxpF9PcQKG8v1T6FXpos2\/jCIu8DKs7z38xYps6iReHu3BayPknEzXwvNsiqIOFAkKtAzZ+0xi9ZE+m21ER6\/Xt1BGrCDVQbLui8JWRtIbWKPsqHyea4xcf9+gz+WygoSDuJjbvcc97QzBr\/n\/\/HbE\/r6blLXCM7vf8Yujit9pole27sIvHC6m2F1eBtZMX7D\/s5WtgpBBQo8YVrVJXcY\/ncp1PVCtMiXZQWvEvsV8HPcHW\/iy52ZR1hN7DPs5tbAPnerGreGbrai7nfSecar6GKDRqNXtL+9+CuZ4h5FB5j6rJ1p37VFLDbE24OBy3nvucoUb\/La9QHQUc4ui52co3ku+WT\/YP7Q1gjrLiBZuQikYpiE\/k16wTAWr8+OSRn1O1ARb6MzWlSE\/bv1X\/J\/IyRuGFDWW0N2m0mvfvfAf6IrU6RDF3a79pQQw2cEYF3WT7bZ1LmrgTyv9hrcT2723DkBSU+RMoMB26oOiIr2HfZofXGHND8h7E48\/ZeQg4KFEfr\/r+\/v0Fq6BUm\/h4Ooyn\/dcUUofI92hftzbaFo8DczySV07Nly38BOOGXC\/H1+3SHz7f2vTS09DVG7+v851JuSvBKAPb+gX9m70DtoavDFI6koI3SlceWfviydCiX8gopx\/NGn7ErXsnxNtOi7Nj3G4c\/RiG+u1o4OLsS6CuSgV1kDxCtDdixE66nrdQqL3pTGMTjmmDe+TwffXbJBBpyqA5Xb4pTF9vNf\/chuYmsDrY9HMnDLF87acJhlqvfZBDbWm5D9TUzjZewvV0a16fDyUB0Udw+c785NKObbaxbWdbPK4x\/VduwzCVyn0b1lJiNfOlEMLbL0LcxyPk6LxrC7zbzVjG7fDNONW8TDd\/O8QsQcP2pog2rLTeKiJxkjjgv49sjJ4htrpTv3pWWG0DlBgayjY6XLKbsWcQ6rIWReMKn8doIFbg1DSgX615l\/zAfvXthrEiCSPo8RQ\/jqMmN7\/nbsasQtUglTi0WSWGvInSP1a21kPo\/VgacpXvITWJdAIkwT\/J+epvoClsKMp1AXQ1bKBkFJe+XlfUc0eENM47EPwChr953b\/5pXVxF3Lmm6iMh6\/zXj8q4gj8M8ScUiW90KtR+Voe8NAk47goWTr2p9zGQFlUXlJd6\/utFdL67R7+n7Bdt2ryr\/GNY9sSYi\/YWVUDHn3cmkRLNxQVrloyc+VacWnTbBNNGafnutzBrcxev+gVUD27Q4OxOdxgCHt\/KzYTS\/Knr2GIvvmpt10yFYtmGn4hajWxLIXuqFgk9TQFujcEyfKsT0Zq9utTHxtXxOLoSUBi1BuWVfmxot+dLS1w1N4kZshdHxXSQ6sbWcMLK9y1m0wL+7FUZ+sD5oEVJgQqSQy6q3FPprQFlk3x7xbUvWMh3spAcz\/+E1rftsj772XDkKe6iiNwLjxT2QabWiH2XVjSpOjqXqBsHrLkiGDPs0xG9BNRNrElQ2D5XieV4rxu0AccJC\/1gjtAhqMUWl+b9P2e6IcTtyIgKYX3t89K7WnzKllRMRX95s0AcNASBsbFyhVCcEn5\/5cvIq9jm5rejtGWRoimjBefO5Pjpq58L4jluq4v43Hurfetj18xH2vIhKpHYLVE7HfAg922E6o9e41zNYfCWnegOV\/4pcdgQdLXn0akyi4P3effJutM3ouocbhVr\/BB\/HKN7MfVQbJ0z0bjSkKVqf\/dvsX+WUqJD1Ol1nvKLy4uCXYfHtT\/OkjOIuHoEhebtVEIIk5d81cKn3ORqjhzv8HqtgLPw\/lXCAh4UQvQJJa68shaYbUIaNMvZSTAco1kXuxqYptstlZOlVPT8OHdCY9qw\/Rfy+VS1hErtcvC7kpma50edVqudooRxu8Py5Otd4ZnokesJ8ah1HFtUH5YtNZES\/jWF00+nsZAu\/9TmN5vvxgbcC5EK0bX0v8L4HBu4QF37PZJ+v4gvasymFsvazJC+Vg9lv2knOcDTVKANY1ZF8S+JzcD82ZvYkDrfe1rKgQfnuWPrPJfppA38hKF8lbsunFgoj33\/kqL\/a27V9VOidYojw9ZLflFt0iufxOcaJGg5twB2wxVkIO003NWB9kArP2qMQUvPaUk2SLsjgGL9j\/1Dmhl8FPTxaA0TlEhdrVkv8vYSe3zdUWmVOWchIOlOoyYxKAggagn8YgiQdzM2ghgUyGpvFtnMDt2Nx1WWCe3ipIxwiOR+N+KEW6NnqR4E0vHVouzUGiTtdseCGtGzKRLtifC5dhyXM9OKmxP3i7GVCLBf9q0EKZCTBeKAChHq7kaJzYu8x5bwTaUEIcjUVv2v9sxfiWMLytFbbRO19QxHmgwNYzsV3sTO6SAFNsTDOBDVWjHWBXuenaow2sbdpTXSgquD6Eubt7wmCwdn9\/ZvK4gB7EbG3\/lfxLwkN2jLX3vm812XmxfJwMZbXt+THQVak88B8VbTSscKOeZW0w3GklNdiPpWcyL1qXNHO\/sP0NRzanyXK3leda8wPrMRIZn+\/9XfnExPgYXuxbC0x\/ohkx6qTB7w9TR3U9e6ZRg4jrplHBYcMo2nL72QfpjfPgSTVKWmgbtQuAVN4OlJE7nM6Kye7KchlNrlZxmkBT4sgVICSnFeqOmO01jxynT6gPpJX1YYopYyB63LaS1352XBTBmKZHJTaCVCj9k\/2WhNiMPg+EOdN\/A+Q2xLXt7v23uGhY3MzhUIVEK\/WK0DzYuBMNH6uYDtGXvqhIqQRyg3MMf7qEFgj4hABHnZ+PMlQA7xiLPdmhF2cRmEwWNlIxQNnsYNTEVgczObw+HWYshwV\/TWIEqQqRFxumER8EU3\/uW1XENgAAAAAAA\",\r\n        \/\/ Apprentis d Auteuil\r\n        \"apprentisdauteuil\": \"data:image\/webp;base64,UklGRtoVAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSBoAAAABDzD\/ERGCaATD5jYnah9dRP8nQMzT2S8YclZQOCCaFQAAEFIAnQEqoACgAD5JHItDoqGhFupvkCgEhLYAaerWvzn8ku84yb438ofZj5L6VvMnez2O\/5Xr96w8u\/lP\/P\/2b8avmb\/p\/9J7DvtN9wb9Tv8T\/bOtD+4P+O9gn8t\/rv\/O\/xPum\/7D\/Zf3D3nfrJ\/uv8X\/jPkA\/lP9R61X9zvYM\/Xj\/z+zV\/uP\/T\/u\/hB\/ab9jPgP\/XT\/wfn\/sufln+l9k\/9a\/Jjzf\/EPl37j+U\/9w5LfNv+t9Cv4v9kvwH9l\/bH+2\/tj8Vf5bwL+J\/856gX4x\/J\/8B\/YP2p\/M\/j0LM+gF7i\/Rf83\/bv3m\/v3ovfy3of9aP+V9mf2Afyj+m\/5zysfDY8z9gH+ff2\/\/t\/5X3YP6L\/0f5D\/Oeo\/86\/xn\/o\/0fwHfzP+wf8j\/D\/kkpg6uPXx8dR9rMmIiN408Ts6NbcAovImCkXMz\/X8BSzE3xdyYF0o1NhdIVy5TC11hhdVJAaMVzUF\/VwLaCtRauYvY+Gw6U0FKRNS0CFTgo0G6of0WyHpw18ZYIaDwLZcPqLTlSXQH61DGNMdTtcsS3nZdewizvDNEg6JMRm5xlyhLKEQDU7CC+5UPjtcmDHXHPrWZY0AJ8bxI2jWdCGQVFzO0mKGnNMY\/jiwcYRkeEHkKhUn\/vxGX\/IfFTGp1XBl4LpZ\/QS\/gIvnIRCac37AY9fhK2UiE51gwedUHsKzsJCz9SDceJmz6uKz\/cVQW6VtI04wJUJUTXnS4Bk+kGCT6O5rUynXh6oYNs+8rh\/MHo7DPBPiKR+uGEg6eRP9YHuhhqQLo1cmWGlY2lDqG++s9RZMxbvZYp8WZ9AXNBSCHgv34qcNo0XDyqByi1JsLTrm\/aVyGFS+WFubbvZuVB3Sn\/LTUq2KaOHH17GkCcfYJLYAA\/v5Jn\/\/Hj\/\/jmf\/\/F17itiUmogCxH4f1tMjjYONwn6DWcAlhBKEG8DHeQDWRXGKsMABP2HG69qs0ZR8z9bD219WAAkN9ufnOVPOQiymfLIk23bSzfaP1jMhnGdFOGdfd0\/LD3SL8c3WVAdHfKnISLHHGUGAqtAb+s63rMKI+YIhk2oufDTKLIVMoYXF4GjrawyTqTanltKLiqtRwn27tPFXFHPeoK5Rd2ClTKuLnRxVIXPsg+ClitBMsagtYgpLnM2M9FwSgSHjsmlwQC7cs9ZAbDRYzNch93n6P3SwKnCH+BaSSMXS9482TEbwnM4mP6sLuKkX+dpinLo8liuTvd1To5fzh56kk9hLnKKlCiNzIRXy9kMbaSMEQ\/Mgi+NoPhGpmmRLid3MLxJt3uCBptiZtTfM1B2Zrnkkvf\/\/CrF4\/jCawxJo065daiRePz3dqPMgz4zslj4OC7fli+Ht\/3s3nQ7ldtK0vpo7ppWZPdThE2Oswgg0D4p5lnIc2ymFEARWq7HiDOR3B9lh7N02s8NTiPexxMWjDIxWoak8lZQgWaTOi2LA058lk30Py4XCPsl5R6UVNIh3RaT9dmJJ02YpC0zounJj\/BlvNqYNjX4kAY2RT8O8Yn4vFnrIJZRMk0DAX5HX47h2NC\/HjTUmlixHvkW5mcguCnDHbNB586JUNlMxEV\/EuqdRzU5kA7kZBVifTwlpwgmUXP9JvGK7VRgh8mESc87sRHZIIyUElTX6Xcxn\/MMBwKqCCGrw641qG9PRmuhJfl6aH\/woFIINa+GxxIwBDKiculChuJFc91tYj2ooOPjwQcX7muhp+XsPpm69ZnMKM93Jp7GtuTKdDybXU58QuXF3+9s3MUIgvZ9IEY9ZfBXoh4aIsAVAK\/rjfvD0AwNXNCl5\/jKwFTn3upNU+ITZmSJpaV0QKIkHlFLjgoEWVACp8h1LYSQaXvBI1MYSQD0exiDD1LCE0XmItBCagvkyZnIggqroeSMJ4jDzjOV0g2mu4SYQ8R\/9FToYPn\/r6NSQdTNokYJqcPxH59SqliOrwxc1ziEIbtV6ZhMZM7CdSnmqzEnp9v2obM6RLc2sHIZV\/lffMbAn21CnpyJzqHGUGvzMq7oWLfO4Hflm7\/vh\/lKmNbVPOsSM+C94D0BvXj3qlEpOn2qxt5ITFIWkcOlh0\/xEyRtf+vJyM069w5wadTDrA6HVVAaaF6X1zG+hGZUH1bOkXa\/U+dGLDlS2zZHh+EdrHzzwIFNsmBnRdsiZd4Mny9kFaGxaKrXXb+7lXL6wELiVmmuioL6CmgGsBwqSPAeI9\/tbFvdmZuQxpaa+GhoYMP8B3jvPvn4iPmmC1o2s2+IpOhnA65AnDZMeLS35FpZBMsuajAe6Z7tTL+EtLW5E41lbqEQiQ68IbLIPpRRUdSUkqVcFUh2jg+B6XJ+vHN5h+n+lCY4+WY7IvLoKgNf8cBN9x6DM2SYwA70e6tZvqmnooAntYFY\/fvgM\/EV0adeeQiqAXNJBigLX1TDY4EvrgranIjpKSNWIVRo5\/r3yBND2xjBe9mj3ssQJVUJr\/6Ojxh2cg\/oG6jHnACnJgzlHXnHby3sSixQKJBZ\/jxAJPERnDpvz6G0rW+CUB3\/0VzsZl40s9V4NcWA2FKW8ySVZK0Ph3okTfvwlrpyego9bY5MxPMgA2u8ID16yJFIcdTezUHkUQ\/fs\/7TIhtTwovXeL\/IhO\/dQQ4TiH9zOAuQx1iOPVQBjfjXoF\/289WLM+KtGedvTBM7QbmS+BJNBMaWk4KTJNL5em6YQT14Po80+fKdceLXq+suQItaaUkcSplwiQAOv6nSSkI6U3pRDJU0KSu\/GADzgQwUBnxOPu6ypPAZYKdHT+NVww25QdrdsbEO8xzuOsTAqP15MJrh4Z9XMEFlrDYJA9n\/sBlTE\/4Vdhxk+OcTffX+YOOBYSnZM5ETHirXQMRrba16+CtaZs58OdP6DP8\/9sodYRbxyau8+fYmMXBuR1fVQvvk7QOZf9s4HoMlfolteTxbomdsP9kBGvJsJZg2InuqaqVgoRq\/kVk2qjIB95Wx8zcBq74rSTAzQHnLDeCj37pY0ZtmMG3KszwNIDt+Gamm28JgDTFwFn2+B1edk+Je5L2H0pfED0Fg+cPBXlI1Ew\/DxUvGu+ZWHzvWLRg3\/fTt+Rr5R3s4ZsAHbs6JT55HGX4m28ycPSegiaLrTZSVL\/Kz07Mwp\/yDF0zMtrkHN+txaEDSqEUEacr1R5lPdFUbU23Pk1giMveo8fbcA5tg2G7nCDnPk38prfe8L6DI+WGeI6F7CyzGoQd1wm814C1E\/MuKJz\/nFyEdH8cfDy66vCbktVjkNhUlcm9aLgsdfJej6V+lJW1aNnHYEesBwhpwOTQ8uqhrbjtGAGwclgurUlUiwdaMNZW9yXxahaLYVXes2evSHg4zmxFebchzgkKsE2\/3f3da9HjLyXjUdD59EjHnwKJ57Sc9\/MsiNEGnYmhyW+BbgBe4cVGo5gDbJUWsh\/p+bHR+veYAYixbd26gHSKtFLGqw9a3zCR09x4ZumEvYJ0QZhOjOHCBz63vk0lB69RAxdNtHQ3Otp4wFCnT\/66cp+C2dj14k+0N6Jh+rJsEKej4KhETDEhmcPK6NUxl+JEdj1Iv2+HIxXCkjqnMkEW+eBeWYHEvB5rTDkVlXVNgpkjieFpVXw2U3u8JdTxIAJinoZ\/xhXxclMrETRy+ejveJ0OIHQigdeDzyXDr7cw8HidJNUqVqpz\/odt9iVBfLWN2xay6uADhe6hKg\/wkxiINsu4D5bV16OfiyqLHRq+UeYw5exHAJArZqntKCFS0qZXiN9hn\/M5Kxq2sc9XRVUw4Wvz\/cGia2T8eaUOT\/V0C61br1vJFKZ7aovL1cTBBjS82cRTF4Z5NRhj5ztxPR+K4T7fKN4Pc9lDiDkwWAgeB7Bl5fL4HF9W8yvKUBM+oeYWlFJpjcPU2JJI4qPyS4JyPUizNq0jiwZo+2JPnN0Wc3jsvHL\/9IKPDg9h8OidFkHoN4AiycrFcnZjf1MRQEpCF7FcKFCN2pekcHWWUntUDyD2Z7RTm6AFiI3zHDFmLV6We7qAAHMaG87ezCb\/1G8tsHt\/d0UQTIw6lYmivY4Gy9grLh1QRlsWfXf6I2H4ALM1mZEDeRRFgfhIJzhAiDd+FsXgeMWn8a+JshERQREPb\/qnwiXaA+bctjsiTd2BZOR9zfbxKJVOjz04J8EE27siQgT7ju5LTgoVD88Lvi6lM7Sz5sM7DnhY475FDv8687v6CCu4ja3f01LAWcvSSA8uN53ndHcQU0qgpg\/YAJcEqv1C9LHNysV\/dRjnhRuRWXxvs4d176Wl+n+1yH0N6jxq9fBX3d77p9RIrSAzV7e8xwaOi5LDCitguW6Ibv+N+goPak8X5NHIccHBoSUercODL7KXDgOPxOqudepZcJT0PFv0ThNxiCuO1j0ZLOF7wFBUBy1\/xe35AE8A8tQFytzow9fdxYL0y2bAynUFQlYFVbcjbu7VXj+WV4IQ5RMnobUc2iEdcsrLVi61TQ7YzbTrI\/q9meMO2S6l0uwT7HYmD0iTMUR7xHt6xHWBpevxF51XrdFXULoOUwCw7P\/snbjxwrAgXNoK\/XNTe\/U\/Rccdks7NjxQ4dsq0qY6+McD5xDXMTTuguaIq3+OWcMzGRFKTNYT4c+S5nB34m13DoAo5MWY4s2mfT\/eCi+dFRuvtW3PQGQL1A5QlkR0ALaJ0ATU8N4UYTV4\/1ubkJ4WoJeVS9Z\/qOohu\/wP\/zx58nViMYsTgI89pNCI9hQpj\/0uKiUCuBwSEJNw33aWRuWNNOsKDhFRYFjvzvuv\/nq+Vot7pohICZsg+7Hgr8NM+cE4dXhSzIlgkMRW38vELCDAR5H95NmZPSK7uwgDFyYHCaHBmkexcvqi1EGX\/ZdRDUu03KhFwhM+ICEo0AeEfuwKxf2cpnShbyk8ITUc70NBfR8g\/yAOi\/+e8Gd4w7pJrYcF1Am64akiVNP1C6mKydnRjfud01lPrL5Sm0mLe8s9JgfEdiIYsXWOtTqc+9nuzNrRtU2Mjc+M8FAykzOdyP11HmcZ8bGKOlB2gtF59dZc7QUH4EtOY9RIrXRRoOtrmk5YyXqEwC6cWtze+2Quf206PDAmPPSWWIM6O9+\/tLDaNM9T0XOqOdbe+0fOerFdS7jVQ7knWOjhKIV3qt195rH8oqkjWc7dgg4BHZjAMYIG5Zpz8IfpUM3Vu61zDk3iF+Hejm+PeOL\/WlvzESKe6NQ2axqQAHViKwKSWEqB3MLRG6Z4q4ftJSJ\/KYRETax1e2KFU0Bd0ojVNzecJ9r6qITtd2t0dvBVH80g+bHs1Pw\/hYWfyYuajBFdNRWaZp0wiKRqDisHaR6MA+aChzRB11oUUkeqcB\/O8A0QpxW2l+YRuvvN18HYhE5QiFrGIqVW6GIDqEhlPSUA\/hfv1FPRcGN32f+3TMrwBYIaI0LnvvmxiSacjg+x9TFwwD80TpBUNXC84jg6bKv0Gsr1qLa39E2e9kXlikrn+jLkf8XGuiQ3XDLJdB13vbx5j2JavlbL91nXBEzCtc4gxnFnPVdV1gkdSSq\/SWrJGkG39GZbFZvLgUuXjvpIa+BZoddwTrMrvMJgIiTTPISALd7gmtJegBikYskOJL50KNSdCuKuu4dmetR61Ooor7plYhO1zQJ06nBL7PgTCgMNa1aCL6aon+UU9X45CCkyKAyU4jRpwr2m5ea725P9Dw+5wTJ1dcZqyaIB1ORuh0Va4zBwcFjzbgBwKfx4Bmq8tUpMFSsHRVyHhpyACnHiMdEfwRVoFy8xChmWC58cj2K+B8W5MHSRWRJClx1QyP6YLSReY+0AZC\/yZ7mLkgTofAtkX\/0niPbY7Tofe24vFUKUpZgwHvWPUUJbhwzb32fEyGZGnMnYvBUDe8EsHpfFvr8qjqnXq+EZbO7Mzs\/hIXkBKAs08w0LOa\/89AVrsHtX4h0ZMueGneCfT9pNyw+qJMy\/8sAN9QC+XhY0tQVEDE5YnmzW+1JvCxvU0h5Alp7XYzBlEMo7PcjYTQmJGHY8b1u8FWkemCz3aYM9FfLGiUdRFVMCb6bcoQZOQopDQgpshw+uLIybhkPmkdxTnoQJ9H\/Oo9QHzOMzddUExK+zV8ggoxn6k8z0Vh5Me4lDTjTI8iWnFAnXxtOTw9S\/BvwQijmE8\/+Lg9eJWNaPwHsp6FQILAwdPhmIT++Y1WY0w7Vu1HxtrjYDkcEmT\/bo2BCVkhwnk5gWS23E37t8Mz20ptJyRJzWUO50pTR8m6WZQE5VLDhkedIIK\/MnyElYAm7SeKofnRVw8dIXoDjUcnM6DL7cwg3TvnO\/3QzZyY7xJW0jqKt47O5kpCKJKr685OntSSDQ21kv1v52MvWUcLite5EiMwMEt9DVqdH6dQ+HbQ8EYLDF2Vw+pfRra4qECN3hUdFQWHDMRTAWPAyfIVLgTMX2snShnLoNRtWtPLBcQAlN\/T6W6CotJXzAYTvCHr0vTn\/EeFrdis33JIaiKvfqhXm\/RB2O09UHg4ep9oLcbZUw5pwcY0\/Ta4QKvwuYykJ\/5neSFW+VY8oWucCPQmNP4QJjrRRJYGUsTx4pFhOlT5OlXL4EV9MGp1zFI64gwnbEUZMJifPCr63ngt2+evy2YTsQW69b\/683h7fGbBsPb7ekcc0e\/fcjpL2fIJSUDx+zw32yg5cmcjGMm2fq+\/HTSN7MslDxWlfVEkPAHBMQ\/MzPH5pPicEWXjJYvMWHqDWWo+p6sf4ahzVNO9tz3r0t9KHA1qu\/GCL\/fTItWUtqUecSbMvSWth\/RzsoZ67wb9NAanlHj+cP+7mdONJOCWC\/SSa7vUkP3A3oNf05yMhTTstylPMxxdZTQcVxkSKUCq4tiu42dWQPUQfEFSG1Txo0fH2JJE6GUvVRCredQ7ePnGd0ESuHuDI0ryrmFC\/S8oLewFKQ0b8DEMSpIMW8pw0guU0KUyynXY\/wmb\/si2StPFcza6fD2e32CppV0RnSRxWiHrjR47jwjlaEiCRY0RWcefmNnj+T88YrwwNEUpw7fnjG+Oi3FVREBDoYzRAgOClXfKWtN6hmUtp5lWWoHwC4KE56e9Pp2BkfXinv3G8bEpOroSIocL+MSSfGlEyduFGJFOYs3n9Vr\/nfsT9Bz0rUC2ZnzRabA9YNeWZ4uFkIFLhNNT9l+hH4FZmkeV+QQG7lqXO5TDKnMMTPLQL\/OrxSF0XVxcBGbzAas0HDPsk61N8mqZZ6MpI30awtxn7Q+ESfN4zM0luJTDxHtfnCJ2AybCQxxeg5e0ARi5ZCtv\/\/8O+Oefp9MqsSUoCIZ1Ac3XuoplSLuukzDxX6z6Ia74YhdJBH6oQGGc2H74iMESIohfaB4kbzZuIFhf1XARzDsgQ5IsALEywOLbCnue5X3HcUrHRZW058ZQ+2ro1oo7uG\/0Fk35h1+AAAAAAGtqst+gAAAA==\",\r\n        \"fondationapprentisdauteuil\": \"apprentisdauteuil\",\r\n        \/\/ Arborescence-Icom\r\n        \"arborescenceicom\": \"data:image\/webp;base64,UklGRioVAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSFIMAAABsIds23u3zfs7R0eW5C3vvZ3lRNnDkaNE6d57Za\/u3Tqj0zjdw6XuSLpbG4dgY2yCjbvr0GEjhA7BdBljgjHGxRhxED9eXj5e7j9+3\/c7P50S\/dlGxATI\/\/3\/v9Uu2dY8c+iNXVOXh4meWDJVeR8W3F1h9tRkCUpUOTg12eEWw5gzJTmNJ9Q3T0kukjZ+PiV53j2BsWIq8nYs4Trx794pSP00WnCjuOklqrFgcW9lssgIqgYXd9z1rh00r89eeqZ\/uQXsXVmVzP45wPl3NERE6i\/7+6lX115iFrfAzOEVVYnMuurm1V2SXrv7xQenvZR0X0QBLGd9Ze3P+tSJz8156fgIOdEQTtY6RaTr1X98atVLRHbGPYZxayWLNtWqEJHLdu+7IqstGv7UU\/sP7XrynZf2VFVf\/urHfrxv39NbX760\/t9xA0Yy+C8rGeLUY6trVYjMOzHyd8ruf3lPBaufPE\/Js59bXtEXDu4\/ePDgwX3PPdxG9tTeZ\/Y+23JPOacquVEd\/v3hpVl7i752HkzVQjBTBf7c1vrDgKlZCGZqwL6VVdSUdKPcOio8X8nN5GZA8642ah8G3CmrerSN7q+DmVPSzeBzXe3NcAvRCR8qtyNMhBC8jHOsIgU3hVqp6UexQJuBNhafRgNtB+PEvLbWo0QDvynT2JQ7aXcPjvnW6sD9VKn+8yhtt3MJGJUqtrKd16UIzI3Ne9O+vxtl4sbCSeFMmZkXMar4fZm1hEDFwVncxjYsof6wyLSrv3j0yMc2NvYTSpxv6Z9PK1+XTqmfwEgHVVM1x\/2FrtS1BCcZVM1UQ4LgF3rK\/ZaQcE69+5nfbLu+V0RmEkgqD3Y1st9zoqtjvoaSNCdp7jbxRH8mUl\/1A9yJByNpIYaxv1T9Ip7A+NbcTKIPoynjuyJrOdQjnbIOJWlw4J1Xrl536xMvQji64LucOfzH\/4CRNHj+vk1Ll1710DGwGMrdZWYTKPOExLNTeMppSveh12TSMcc9JAI750m8ftt5fiOy6DRgRtL47RqJZxv\/isVQ3l1iI1oC92mxdRhlQlejJpVXcAVG1I0hKdtz+KSI9PxbA2njQ5mUrD2BxTAObqiLSH31+0bdyyjDsW+Vwlgok1jBXk8Y10v52qczEVlGCeM+afPjWAyDc88+PRrOfGGEUoHfRBq5U1a5oZN63YkaH5Nqf4DFjJ9I2\/sJMYIBH+kXOUwoQ2Bu4Ta0jYc66QY04n6uXtFlaCxob3uzPEXgzzNFpJHjEY8o7y0cIZQyftJJn0go90nF0\/GI8oRUuAOLhfD3hohIP4HSzulMZA6B0s6JrIOeJUSM+VV1O14wVlRxCRozlkpxExprRTA2ijyIRsJEBMK0DhqJOeP1qvpwACdvVNHjHjF+LtG3xwLvHsUj35fsFA6Yf2UbVjAWd052Ei8ExqTqfkLs71kVtXN4Qbk+9i2sYMy91xXAQ205RoH5L0cLyi0ddDr118rmY4XAiFSZnYoF+mN\/JRScxmxCQdn8CS8E\/i4DqQ900ImYczKrag6h4JzJqqi3Yk5fpCvHAedsTY4SAOfsRYrK62UJVjB2d478hlDAw7Sqepyo01fFHAKAkzci\/QSAwCGRIZSy7nm39DhF52TWOd\/CIsqlVWWn8YJycxWvQAuBMYkOoAVju0hjwiPuBWObSHYSB3Dv6Zw3ukaMp6qSn2OFwJEqjhEKxo7Y3THlLSKy3a0QNxaJyF5CwVjeOYuxCIEFVb3BtYCxqb1bMIrK7bGdWGyTiCyjTOD3IiKPowVlqHOyU3jMn8\/a6YrNIUQ8nO9pZ0bLPOL0xUYJhcA8EZERQkrZXHhN6hOdIw+gEQI7s3KLDsTkiIcCgWPTyvWdIFA03yPRhuGAY92F16EJ9wv1wsZYYG8H9ViIYTw7vcxmRhIDaITAyVVlNp4jEGNtbAFG5ERW6DFPKB+R4hxCwTmTdY58CI1h6L0zI11XHIDfJ+SYhwgBvrmiVqit\/j4EouaHJH49WjB2SXQnFgvMiXTlOIDT10H1c8FjBOD5b376C89egNyPppZjMTzAi7u3P\/nMWQhOXJmfeDCmfDy2LmHslfgIoaCs7iDZSJ7AzYlaCJSQT2MxMCNqRjLnLkn+BIvdGcv+jReUTYmnsdjLO0nuI08AwdSCQ7mui+4J8GAWnHTOzySZncBja2PyLhRwTmeJ96GxxztKvkheIl1OPouVaDfncC01LRB1ZiamewCUuyQ5GAs811myFQuTcy1akSt76pJejBWc8XpCdmHg3pdagRWc87XOkteAhnb892VWYHhwb8cVPpJJyVvQQuDPkt6EYv6UpKfjBZwZVd2o46qquZ5sQxY8B2Yh5TZBs8waWgZg5ik3g9ENUvphHVdVbemOErUzmrdYXaJ2VnNV1XFdU9XtpNsRufo3AKaqag7whTLDAcbHmgpgqqoGMDpck\/JHSX6ghHwIOJ2VkCbJu6qauWXz4ODg4K2DN0qFSz\/0V5KnvrO5V8o+wxeXd0nW2PhEk+Top1dn0u7Vg7cODg4Obt4yu8y0LTdvWSxl123ZPDg4OLh5y7KqJr1n6cDg0HWrZ2RSfpGulGTWt3xgy+DAst5MppDZ8Xkytf3O9TK1ffNnZWr76rMyJe1efvW1q\/oa0wf2cL1k\/3Uz1l131eKuDrmyeXxsbGysefzAx5ZGdjZHx8bGxkZ\/++XLyyzfmVNUQHvl8bGR482rEtmB5ujoC7NlaXNkLN7sFVnZPD7S3Jb6QPN481hXLNvyW4rjO+oi25sjY8WR5vur2kzZrYXfU3JXPVZ7AjBVczwP5+qyHuBIYj3AYZHVlJwucgnFtye+BtCIzD0KrqoGfSLPkv5KVTd57g6YWc4DIvKcmxfUJvhxpHYANafoOBfqIseCKXNjTwXNuVxkhatHg08X2eC5h5z1sW2e+0RXYYmRh6AhqFmPyM9dvaj+xapuRuHUsb8DrvSIHCIw8f2fX8DJWVLYSU7ZwCyRO1DlI5He4IF\/ZyIrMSixEQW3Vl9kO0pe6Bl3w4iGXpFfYjBpynrJFv7bXbmuoDRFGj\/2oH6PiAyQU1q5W6Rr3AP\/qRXegSpvlojxlu5p3d3dkiDwfNbGD1ACB6+dM3vTLnoKypnp3d3d3fVJWSUir0CVd8ZeyETmYcoXRGTEQznnQl3kE6hyvYhk\/yS4Tospt0gyEjC2l+vHCLxXom+eETspkxpZJ5kMFO4t04+pbxVZgNGmMiAyh2AcFJH1mPGkpG5tA1BeXupB18AeKVs4lU3eYhHZiam\/PNYUqe\/0kDMs8krXtvzjIvIMFpgj8jQWWJhwxnbv2bX7UzHnlyG4sqzMPoKxsg1D9+7e\/fPdSych8Pgdr9uDoywqGBNf2fkirm7dIh+hLeMnInIppnxMprsbRyRB\/M8xZcMW1MO5afK1QkOyJgFrtBXfNAlEnZzfSyFQDMBlIvJYe4E9IpL9k+AX5A2ocl2ZkOetfH\/qOnkaCxySzyb+SaBVb0\/z\/GJ+yaTk4+MTBhdmpdyCn\/\/YHBGRe9szviUi8kY08LLfEjhTKxP9c+pGqTc9GPc+XugSOUpwprcX3TQp0daX+yRx9qyHcLZbigPtqb+t0J27O6DcIynjobnz+vtnpK4TmW3mgRYe+bKb8qY2lHNL+vvn9tcnwbhr3ca1CxoSPYRy+HIscDQrdJu3E5hXkG0YgIfeEsrNkkzJAIqTGEA9jM+KNeqxkzKpN6PKEilb+Kd8FjO2FmQ7Ws78OYkuIADm35VSN1UgD6GkstPBnTPrCytfmNE5ayuonwuu3FToMfMynrMgJocJYCwvE9h117133313VznZg6VkgAkcjn7us7+HnoLRevjue959z8CkrG7rhUyuRF19rojIlZilgvI6SV6LEvizlCE5o42u0x5SspXcPQCE0BuL76zqJmu1rNwBa9loJvJ9JnIdrYmI3AAhOHgI8GZJ186athhMrbAJs7zVao23+kQ2WKtl10ZkAapq4xF5DCwEVTPvFfmZTZi1Wq0LrSeq2gKwvtRx4LyIdLcAnslERPp3kTyySsreBeT11BpKzhC5HODmmNxCsRGR65oke0SeI\/2dqmbdOTQ03FPqquGh4RtFRJbdOXTH0GunFURWPnasNTG2\/dJMSjeGbxteJ+me4dvviA\/XRfqGh4bunJmQa4Zvv2Moi0ntph+czC\/89n1LReSy4dvvKN4+vKaq\/\/v\/f5YFVlA4ILIIAABQLwCdASqgAKAAPkkkjkUioiET2Vx4KASEpu3V68un+A7W0XXd\/yA6MXfLEBpPfif6j\/p\/uI7TfmFfph0xPMf\/KP8T+zPtIepj0AP2m6wD0APNh\/6P7e\/A\/+437R\/AT+yF4k\/kPx96OVA6jPHb6WXFBpVv1fzAehboB\/N\/8x7A38i\/rPWR\/aD2Lf10JM27u7u7u7u7u7PPJ9LuhJZnuSqqqpJ97czarv2499q7F1Snv02uBKm1+d2hFcQnvWPJCLl4o3Z0z\/o0OxHrG8tlZT+qz8AQudnWClzK3ZvXWYnbdCfONy49OGb1+QL7KumvKygR21fJYRyHalLOWot2OjQk5Nx5JbPRkYkaxJP3fod1T\/Q4ojjQIrBdBY8vRd+Sq80s573T4tMYsQJ0I0YT\/TzegHgxIH7Kc9RAu5oq1BZxf0hNTHyfbuuWbhh+aypErR4wvf7rQjqDJRsdC1KmPXVrjgYt3CqoEqsqMoWGzSuB5\/ZRe1ab85BXt3d3d3d3d3d3XgAA\/v4G0AAAAR\/\/rMqiZFoAnfreCqND1dya7jptaq1uqkPi\/3gMSzFepSHzfzpNAZVJrZ5vsui4KLBidjtcapinf4D1OjQrjh5Oef8kIzIAX6vEJ+3JsVSVGAezsXSgli5xOv5pqCG7LrnfAFzJb4K2t93bw5BcLSZ55H1z5ZO7CEvbdMXdjX6z2BWrQ+VFD1EbolkffVVVz8R0XvnAyc5Rtw2744PvAT+CjhS74HXlRokC84i2F\/OQUBTKqJP\/8RDgIhMyTcUiB1KG61ON3FFgwFYdzo16PygckjgFBrmg82oaewxXXdq9egJX0F3KEukXx3x+\/urqmPncIrL9wcsRmLDu83chAf3unAug3IUcM7Ozs8f35rHmf799Yu\/IQRR\/eiPzxwd7O4WLzJnUeL0u4L8ffDKUBbqB\/cE+vsRW6wO\/jSzP9SWoKPAuT4tXtj3YJ4aNJdwXf7xSpCIAV\/0LR8FUbk5hvHfBT\/+2ioe++ieu5v9B55qqISfCU44MtLidb1bho3z8ZDNdqh3kYzaR\/cMbfXffhftm2SsBvxz0fLXUexHoub9UZ1CUTuAUXbWXZCpEnyz3MtScFsNbVD+bnzlQ0O+g84FV06aeZA5xpk8dbBLYpBX8NcRtsENBX9eFxlnUaJQPo3+r4bxnwbgJ1l3y6N3UyU343lKyKFqWbelldaMx+TFoFdcuyczST\/AqVNM3v9LYyVXNV8NklkrJv5D9SIBLBZrEtm8TmbGaK\/0NoiJl3n7xoQYKvv9QW3Y3E6ChmiL1rPZpHa799wHOx3FWiOLwnl\/lJvCbygvXXd67ZuT3fEb3CGRbkQpS5BUIUmK\/nn4LNtEqzutHSIGD4SCKmPBvyqBnnkIQPdna4bayTqDE6ErpE0mHr11RNx2YndneSiia\/cLjwYp3W99SYZu9t6AKwGBu\/NGaf\/eWP6B\/68X6mpCjGfrH+Y9rAcIkotg+6+YZJdRPx987PvvPZVJR2fFPzO6hP+nP\/rhinC6FDZdz3W06oKdcAe8s4wm8zpVlLw6\/wSSmHkdW30kUdSGWL\/r8p42woiRexBvwj03QM3o46Kg42p5fJ\/TOUq3f3j0cIx1dCLn5BfEapDVcoy1oDXunYsSMiP6j9o5YTu\/H3nOJ7rkeRlUxLHIA65b1ZBiPa\/FhlmtykJUmtkerfghAte9kAhcb05r9RhMaFyIPVchtHhdjx6IWpI9HkMXKPsNEJRURRMrxrU3y0NDftYeiRULUpAgl5lQOBKMz1C5NixVyEqT+vLQ6m4CNmWS8jUN1QuZps\/BDjV\/QsqDUWawKtr1RryznORJzP7uQuQTe2CZ6N9sBUtJhLjGaPNdMin0aIfpgHLovePU1ztC3CL7hqI1Yv\/bltDJ8L5QQy0Fh1w\/hj4g7tK58FaU4ECmj0q+81Nd1WMwqnnyVbzWcu1n2h1POgpztoqmgHq3h++Pn965DL8fesKuonrCYsG9K7+Dqk4v\/WkDuCgp8J9n\/KbavPa51vmNT37enE5WL3NG\/ICkqDS1T6Lhdh6EBD9NuGIQaJ4do4w0KNGHcddmzp3J9V3VqhrVOgMo5ZjZF\/V+KcdkFO\/ib0qEVW7Hj\/e22rO7mqUsRZDNlb85XKFB8Zyz5xqoBK9OO1A4CrB5wtKnCSOOu8rVuU8qxdYAVRkvbkYkFvjLwOMvdal9RDeRyuf7slw4WGwiHkx8f5Sn6IYDpANzy7Oanoi8c28LMDFV2xUQJPB\/fcgyemDUaFqLMDKoWA3vrtbh9ugRowxR3y81tlN4fp0AYv7sBQ7kuhjJVG54ZCDXwRXMPV+GRzuiuFYZd2H\/7xnk1bkcwHP1TfS5CkM9SWWJ1y67F3rtnjmnJwqAXtfv5cPE395Q464uvWoP5YI2y5vd5nqtOFD+K8S1\/lAIP4fVIn+fZ+n5ebuCaWCT\/8x7Z8GUz8TXXy\/89CKoABdZ8a9jIOHVwHL4sZ0i9vNHetfP84di6lW5lHtph8fEK4vUTMI+ucv\/5C\/XG137\/emtyxTea1WOXgXkT7wn+fM3OYSz1kRgaLcF2wScMRGfT\/MViieGNv\/TNDAHHy9yKowkjXc9OSJU3bwGv5vle6Ftce3NP7cH52iE2AATjo4R8t9yFUQ034khuSZgzPC67LKq8jx6IUCg+iCscZJ33a3JoIfZf0xXZF9T77s+8UZmTaB\/fj+0G\/4uA8tIoYq3hWYnp7i9ajciaKuC7y+JI1UT7+sNtZoTZ3ZWsNyBXe8N53bLfiOlfR3Jhmf5ZQFP63hZDceLhpYnDioHASxzdf8kBZp7OT6fHhJ3OYX\/g40dTxwhWpFPn4dkWZYqgzP2QZK0WFEnjcQUBtPDZdLDaI4P\/1DZI9X1nsCEmT\/541ZEKJUJlPxgVwfcVJkl62P96SUF2caVs7ALey5mCsv05x3jIZ9ICAuwjviCigN7GgXChcFqioAAAAAAAAAA=\",\r\n        \"icom\": \"arborescenceicom\",\r\n        \"icomprovence\": \"arborescenceicom\",\r\n        \/\/ Association maison des familles et des associations\r\n        \"associationmaisondesfamillesetdesassociations\": \"data:image\/webp;base64,UklGRp4YAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSBoAAAABDzD\/ERGCaATD5jYnah9dRP8nQMzT2S8YclZQOCBeGAAAcFwAnQEqoACgAD5JHoxEoqGhFhlGgCgEhLMAZ8whh4foPNj5H7UvbniT2idiXXflK8\/\/8L7nvmr\/lf+l7M\/097Cf9m\/uvSs\/cz1C\/zf+8\/8z\/Qe8l\/qv3G92\/+J9Q7+i\/3nrUfQb\/bP03P3D+G7+xf9T9qPae\/\/GshMn\/wP5RefP479C\/evyl\/tnN9icfIfuR+a\/u37i\/239t\/mHvr+LH+R6hH4l\/M\/8N\/ZP2+\/s\/7se5btX7R\/rp7BHsN8\/\/y394\/eb\/X+kv\/e+if2P\/w35jf2n7AP51\/P\/8d+aPraeIv6B7Av8y\/qX+6\/s\/5MfHp\/zf5j\/Retf8y\/xX\/O\/x\/5QfYP\/J\/6X\/s\/7p\/mf\/l\/nv\/\/9XPtF\/cD2Wf2kbOAFl2xChu4cvV9nYxH8d+oeGOqBfY\/NnoI2XA7ep10Y5BSQYU5PwPzfH3Sz3aqiYAYTjz\/+Wj+vBfqH1o0wq2IelBfykUzRycOjdmgdC2HONs4kYbyhg9RJOhvvT4IdJQfxnOwQgDtvO+hD\/5UrrlrjGKucnuGj+JU5iwts+7sfZourdC69OjUDMe3QTn\/\/V8AjFT69apMu02wz2SbTV\/3BFMdEl+UOz3zd9u4K84pvU\/LqkQyCBr090jkN07MlSo2jkxdOcigrXht1DBtxqH6+y3ciVr4svzIwHF5dTxIC4bdI7ECxgLMRBSSAy28zLT51t8qyfAfB3I5\/UZVBy\/5ysHZ\/Mahkop7E1yKh0DXKfM8\/3oDHO1ZhJ4qsYpTKV0wrfHgrPlNwvphdZQ45jQLoGHnpRHTrZ29Kj072HWk\/pGRfPUd+ejxc9LpjnRlSkIoqDLbcUMpgPUC2mxNIHoRqATNlMswzp6XWUUOQOVgcV4sUnfh0GQ5QyI+J2ChapofzIOcl7AEp0nt8X+K2o8jTPwkUGVhgokHItQJAbaupj8TjOu3qt1y1ReMfMcH9NxI7YfUwzvn8wjYXj5IVgsYBRngOA3RH1Y+UhIZ6doPSgAD+\/\/8nDD\/\/\/tlakDY\/UqqfplNBRoDpuxG+RB\/C1Fm5OXfSv+cOIvB\/rWuVhQ8rVlNu5JIHRh7XCSzAjkoEhOniauSj+BCgryRGwf+d5eQOyw8vjfgm+9dnEfj5CAxZeoc4oFf+q++331Z0\/2lv+mF\/Y2lteuDuoizRhjb4NNOxdP4N1UpLf\/4j2MeCOaMK\/iQakTp0Qi6m\/DIMEcL27Jhs7m2vgcy8Ayok4tbQojxays3gz39EVEPC27Wsx2eQX8roCKbIKt\/B+lrl2Ig6uaILZogBXDMVlwEJ6v0pr89ZVj7ErzvfNUYHq9sB+yM2RaTZD8x8KsN\/\/yhQ1AsA5yGh5i2Uqtpp1y1mdp6HLOiX+g\/Y50xSM4Ez7h+oJhjGMYFcQ7hRY\/meuU5D39dMerl10rI7cYy6y9hCKTh8Bp1beF5n0yaLViyK3G6OV7lRR5T6GzpMr8yQzsaC2rqur+6wsu90QIuCfd2qXidd\/8qhMwGoPNjhmO27OsKJDhklZ26aHE5KsP4Nvxp3NSnqM7H6FdkNehYX1WlLRoCTd75yIcWOxWk2D\/QTPa+rWH01O2Rb7sDJipmP8Su0A9HUlikynRqNzOhcMETH4CwsurVGRYLjmYhM8WNLDnTxIIDmMcBUKwMLKyokFbCwPzmqEFWjvK8YXi66pnGl1SGc+DLJx1dCNqDDXWlHf\/vaXeUI38+\/H9VB\/zogb62lmgJQIKPVoHOSTdIcK89m+BKawhYakls1Slpz0ObyE\/II3q7xoow88N33LjjqARidH\/MYazy0cEl3ueH5I1Qiaon+3K9Prv9jXJGtbSCw4C\/A08m6nEocNrDWcKRN9O6BWmr2TPAw8b2DzE4UPlZwt7QTu7N6JBR2R6z9yTho3XPqQKU01GAphBAyTId3W1Tfe9c3cZBFE9nLCyt8\/VeoJ5ZI8laM0tJbisbeWsLrmtCdSUQcPR7C\/Y64D6ydGBtTXbXiv7POkzvfwxLmt3xgzeQVbxmJkg7dBpmy7dKJgpvIgLqS2oFatG6uSMLOd1LwH5F\/L9ffkfAPHIkfcEX2HGHCODpzP8cSXi9bCE6eGpUrTHUHFqkT2IMDp3MChE3JNRQ4DZvjWUVMyPXw\/7g43d917gXAjxw8i4mSobOrnAEZeRIi1mKLCBqo+DZ9FveqDj+5gLd8JFMgU54FLiFamhcwbm5F3hNUqDu3sEvmsF2GLVEGK0w\/cTV7OnWEMSZbGLRKba3dfYnPv\/4xR5ReanDkG\/FQ2JjlCbpuMg\/6k2zo2VROBpr1TdXB0tIMAoas+FgPd4PV4eFVpNWUmgf++OlOYEz2w4A8DQ8j\/FEgt8aEA97EcfD89M23drgorDJ43kmjSVXNHMElvb0KXlOLP82WMXaGmtMCipWKPLclQSbsTw7X5VFHP+H\/ljfHo6YMjcYJ2ImANYEtZNMedFwTdnC4R7Msfu+sAIt8C3sENB337PlK491U65+EaBVKPiXMHjWl+yhPPSIETKnA47HULujLyYORQLw0vDZA41mZ\/a9jaIhcAvAiwoyal7dXeQQaH6hN+hcUV4\/pnOhh1H3n7Z2bctuBiUdljBKiJYORbqz8I1h0N0g7yX\/lwi\/vjsQLdsvxf6we26CTw773Tdv2Zhx86+l4l2WjR0U4NjMHS3BfCloRIe8VxnAUgHPbaF+e6icAT2Ezcuejjx4I1Uth3L+K29823qN2BHDc0urjbLbZ8LuhoEjiX0vfh2CQErsZVmJtftWwGUzmWy4\/NE4mOSJPFYgu5OOmKt\/3zl3pZBNSLIdAGvc2JrKXlHK7DwngQ7tiuAYM9twJyGQZ9Ypo5CPnRfhijWlS2VWDfy6\/5U\/17CO8jbz0AkmCAX41NxZa9FkQmMA0la8TVseBPp2acXD53RiOJia\/we8sK1k\/hRUFxiLLDNepDUoe01xwuW5mF2ovhCNYKovTVOMA7odPuzwHayru2\/HWyhmO7B+0p7CucMuJXUaBr6ghWLS2B7PFgs9afeXkMqk2ysJQ+iGmfuoO9rtsbBYXikz8bT71yvZs56++F70FPfMNCiBt\/DqdSgyf+8JAy3zxKhMtZtcnx2K1RhtUnfEw4uN88z8pM3bOt0AitgwcRD36iqTCufcH1E7\/etgPp5kQEABOyfUCLH6u2tFLv9ie3OmZo09w1zkt2oQ0b9yJEd1xaaqyFclwcQGjxtP6UPCwpcrYN9R2P9TqzthLv6WKU4Bjp2Wr9lr4xgjeVJkl5tUwaR6EP5mm2DD8YG20pisFheaoZNh+7u\/mxe+VHY8b6WKBCaFL805Umm94A8HLei86xMPLPEXC\/39exutpGNr0sXtcjeKrkQs3cILXS672nsrOtvcwa683MR9YzsZA77Fj1T4xuP\/g\/2c1tBVMfQHwdpkvDpQ1R\/znI4v22zqmtv\/q9bgd7V2pPsCbF\/DknJXD8CSZTrf6emiWLRF5bLXn1BI7Z9N\/YRPt1W4xpV3YcSGooQlKKL5KxqKgoTjDDOYLigUqgQ3tOndhmUE+DfPv2JEP37A5jvMl3wywR8kt\/zI+1o+h5zscY6aGPG58BqbfhTWVTHuh91rZYgN6hQtr0YOnHZxltxZ0b6l33yKqJtwUbOXAgQYFziiPbgMN4TkHuT71G7c3DKyZKkX0BWcQHJq2VXMs6Z3F5ZLFI4\/G0Now0k4Kr5OeBh33hk7JZCMTlqTayvfgn6gSK7Xk+XWdM2REPxW+Qw1Rw8pHm0TYRVKNT+lDQy2fePE+b3gLJe0gkh\/6cf3mKc1gPBJyH5MIMs+MHW1eTbHCdUfPTJ0DqQgoyEPMczTSPWi1DC7n1hrmvRpKS+8n3x\/7Ei5+OKS2bSwfjzOhUgJFw9BrYQXrugZDdDgHlFqfGRQYEteCJXw+krE2XxSPPAAY7dZDJqj7K1Xbi70kWYruYb4TPo\/NcXO+EAWpAZZ+kaxssOurMWrHvH\/RxH8KlLIDlUtYKHWcJOmr8LV9KVTmzR3MVYyqqhc1gakbqPX5ZzIjL+xsDSvCZheimeiCSJKSvKsKbw7OW1peZYulHFyNMswWTmqc\/YFXEWWoJckBE7miaW6kzBthAP0KnyJiGUgrZR\/7808vEq\/CIXMmrzEAkifj63RjJtQfgybWOo3MAvuddbN3OZBAimDNg17cDRI0P5waABR73tDfjbWxfwEdJwRi6Lo\/Bgv62Jgs\/Vg9V30suVpSmXc1gLEZCgiJlx7frEDPM\/7RfTfJEGu48plU5sIcpQ4pPTfCU1CvBlXG5\/f1dM5TJjF5rtyC+HWZNpL9Xmlc++Jwr906FmNpkKXHAcabKQbW3aOBR9sgYPOIEnkVuwV+f4u9bhv8gLWHLQKE7BLgTsMLXMpbiOnezHwtiU+jfAo4wxxWzxjj81SNrGgWuCNVpZBei3VpmavsVew5asW8vb7PJw7dqcfzijLfSbreScSG6wF+PeYnGBM6r3CQYfZO1WUs7TvbAHe8h12uDY+ADG4y4nfwP3yNoM01h\/U3LIhhkS0iPXAwBK3zyitQJHXkhGw2M5Y+tq1BebfHMeY0ChhH\/H8pgVEcE73bFapmzGAgkzU26eqoyqpRR9mQS3dNU5Y8xLQCVHYcmnM6dhQpeyKxHZftFNt0X+\/JA8dkzra+ka9OUAqrCH5SI4WY65CE4W\/LissitXMVSvZN+FjatOOYzgP94QphHvz6NXes32GeVNrrHXeYIRxhv54dgwN5GKzWWp5y7t+6Sxv901th+lcY\/VepqaLFjlc0hG2x1wxlL5f9pfvWLfiKstvK5yPMw70HXd1b0hMpmtCUaV\/uz6AfIAIKddhpHRJ5C4eBQgMFfgz09wAwiUVtu6NQYOz1gtxRIXGEcaxk9ka0qO2AeplJaF+Oslv7soF55MZmvT12fiPiKbO2+gH0OphgpgVdgXUEEqxFOUuAhseytTE39jUwcj0KEJknw1vo34pFjpYUoSqxxy5npVfZupjrgCYNOdmbeIRnx7Jn5L46zreFH\/L\/DQ4RTJSRnI8OwNaPtKiPPWUvRwKTXv5ZLdMmVSNZ9\/oPMTD7ZKkfchH5\/awS9pxGWXP\/XEi87dIIi2BWccFBNZhlATKXUEfjazrIImedPtCOjqb5KRPQwV7c2ddt0duy0uhwui7HjPRAllTr3qJwH3F2J8TbheDiUDjzVIKBCFOET8n157fd8KH\/Qy4JZVQfL8Y1dWuw6tvf6grx1DWA1JwnrJlsX0A2XfoHHRWXd6Gfi6V9Vp8w1dsrw2mHnTuJ5TKS1sZQd2kc8wzoU\/8qMa4JeSW3PqfdkvFpumvV0+oPss8q80wnH5OTTaKE2K6lePYapcOPMojiT2asJBOkQUUTD3z0fMFiziGOq\/Hm99i\/WknsxFTQzfJ6Zl2GXrcvK2au3fzBvA0CprbCiJbeC3WU59VL2\/mWuNsnDpXzcGOO\/d\/k\/N4I\/1KXvF74EDMuEhmudF9Tt5nne8OPZ6PcOjB3ESUOYb\/n2NdhJNx4PweFCMwNBezY74gNNfGZHMF\/k8MO460Jj5c9JAWrpR9lOvdZSmXfMV9qbj8rHIhGBL+TImD8j2d+ARJwHHoJZ+6d8cdLVzQgQt1+iBhUwoSS9t2evurhWBJZdf9XAPp8nQ6fJtEGMX7KYzJ\/VKYefZGCFVN1RYtYDK5JiHTRnurcDz8ngyWudqA5WyHUP6MI+KKPVbvm1CDkCmkGDDchT+LUrJGQ+vGOrzFAe4wzDESrBeeMGyv8GkkFcx98XIKyEFsIpzS7a5l6Qm2xPMkljwfdOKn\/89en5du1hDfqK6gIGWzblZV6ReSpkc\/x+eNGPJ3NaRJGpHBMCHe9d6UPmfEqUCMdpjEB2nATByitg461KV8AuIheJ+NMrE5frW6eF4ap3O8IYZpNyj\/HNcd4FTGzUHn27wIL11Ev1XIjQ+\/Z4LeZKl0u6XMcFHZc39fCRzVtI94BjrxEZ1kF2zMWEYx9uACa0D+Bx44NI+IlzE4YRNaYAdvey9+EAX12WcmXFD87QIz2Sf\/v97KDJxSzudB6WyXdoQYP9GeMgCJsFR8HcciKDDKdPHyg7t2Yfmu6nBaq0TvomqnntN7+4loSP+xzj9EvL9whJvRpkevupEdkZltDSSXdM7M32YLoF55sZfeFag6vluSD4hD0LE+25VaA4IJzsjzT4LEcAaMkt+KwWgUxcyFUTVUkxMASqV1CGZFE\/1\/FUtsiKj\/TF2gEcR7U5VsMo5tIQCIXfCY0zJs6\/XAtm1Z1jvTNLvubinr0kI7cXKwEM4SCf0mU6a79AAtrQ1KX8+3iaAQ0L6P+T19dRUnBoG9oC0AFPbn\/FIqKgbwvdxl4jEMAexa0EvaG5J3hRwVKWboFOn67kAJM6c\/XmQDMOLFp4gOrqphDlpJ5aAfo\/SoKeW2qYyecErHbr8k9PuPSVSqEqNiH4VolOeQSM0k4a6ijzk3945r0uLd\/Sml5ZVE1rrKfDzm9adaM6hjzgFs0+io1+Ix2bsa\/5thJuSNcDI6ttdTvlH0ExJM1RpfHFht36eQJX8sXnr6cSMbymNwg5rSW5OUjmknswYxzAXK71f0Z4Zv9wiXf4jlfdn2E1H4p5jZ1zBAjryjxoZJzKR7R2RTVxzkqtrGPsmXbvB\/TiOKn6N1wbNFn6EUorxLUqmzlyJY+f83CiF3ck\/UG\/Wpde09Wnrt26tMd\/MTM91A1Qb7L6rvBMnuz5gY5oJx09kwHY2HjVOkvZEv3gGs2f64aEgJeJo3lIuPw78HPQtWzzrcXzkiG5fjZIwcmi3tq7fQiGK8TDPQIpBgjbNE3eEO3MuQRh0E+y\/3e\/KbPqWJTZDpdLU6IUOj+3OeQF\/LH+U9MAKOidhhhcrNnj8Ib+HRcJbVEZnZPU0Idds7Ad6eDt7AntB93p9c\/3mTW4l8f6peKWpRi5n1Z6mD6gBB0i\/4t8LjceqRSFmXamyZ8+ll\/pkTXaFdEqs4VnlEblZPSS+Xb3juTKcQgEIGHP3UapZTBxybTYVfgQp7Xv9ddLhlgJgjL8xEHrN\/z+xJndTmhfBqlnouHivhLyjaD\/dxJzJOk0v+JPBTPyBxMWrtUR\/8HQ8JsfAWILq9uFOWIEvTVFZKwT6ItnVMxTtI6giAlBoKtlwhOWAJSO46VrHY3tu4VYCMGbdvMCurrOw8krZQFHMtclqQbbrGQPbudcYqFAjUzukNHrPI8KGy5Q8pKVvrxuIuRqXe9mu0xLvqpKUwp\/EiCywjA\/a9KE8pUzV+Y\/1Wu8E2XLY2HjG8v2KeZR7vW\/tDleWgOJZ93ALE5GrNdReq0KcfTeeWvaJH\/aA9ZzZkL8+OpzTOk9swFL0b6GZ5Wxz+jI3RerS31kJ7SW\/yl2YJ2rQFfsTdN2EEBxs\/JxU4Oj4rm3cwuf0dnI57n7qEZMIwHv9\/lwJ0LPcHnXB7XSqWGc+\/inyohbKRWM+NoZ6+D4jAAFtm\/h+827xRZC9Du6NCgv38vuaFkfdEktZVRcPy5VAIsP100NDCjLqQ8cyWlv5j8ys5Gkt5kaztdOwcClGXoO2U6VJFAqkwvnI+Zg\/EWs6QUwsJBy\/76S09m7bxEmRpPSAlf0OgoZqMOp\/w7CV6o0hus\/afRkyfYXL3gHFtPF9cJSOQrJkW4wvws+7VLMav\/g\/bvOlFbwAhIiWhNvqy5gvzIWLB0OWoIrCbRfYhI3DJtdQ9uvY8RoqUm0OLQr65NHFbOe1k94MOCT5DvCchU9VpqwMqXvKqBbWjZQbioLu7rHKkbjeSq1H7IW5FbgcNrFHO595H\/Op3y\/IbOA1amjjD6sNtembq\/G6oSDBOnm3vkhdOncgHSvlKtus3Fn0H9Nxsy6222FjKPyZ4YNMczvT980hBTO0kygppHl6EKSOMNMjHBUSD\/8GvX2mLGghcWUMG6\/1QiW1AJ2UjbLBoeOitjxOq4heWjrrrsR2amJgS+GeoGlfu9mfQWWsdr\/+CYC8kvvbhrE9\/FgemhejX8bFmT+32bBtXizPML6Mb7pR4CJ2xaj6\/FM5xmCWZfR7dLF6LmbLNGrzf4qtxAVJ4xAZaIGJ6vt+UHnKzgmuSuMnX6yhkXsvreTUvpoRSZxiCplnqx79L\/C76pVtpHyxvSJQ0GxHDwCq0nis5An1apRHOH4FHMExCmZaKLHxVTJwGEJvaKJ7fUH2d48yY805QrCnSw9HWfapH402cpq4t3lE+kiBOKirc+8aTZd9eYxT4dLT3Oagzc9D8gKXHMOcdDcIkE\/nzZ2j3Qkl0Q2fuLt3UBG2VxWXAth5zQ2fIJQELrLdTCrOueJUPHP9XERUupVC0Uchp\/qFI1B3xpahamVLj6eg6Rl\/cAAA==\",\r\n        \/\/ CENTRE DE CULTURE OUVRIERE \u2013 Centre social Sainte-Marthe\r\n        \"centredecultureouvrierecentresocialsaintemarthe\": \"data:image\/webp;base64,UklGRqQSAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSDwJAAABsMds2\/K12f3+DHdo6aCU1fWru83dXfhoPlad0c6Yj7ShKRnzNSxtOmPu7u7u7kroZ1Ny586dO9cf\/Hie930z14iYAPrb\/3\/fMFE+5Z\/rbnz81TdffqirZZe6THTJqllLz7nt6dfffOm+TSu3HpSKLm\/Y7i2XP\/DSm68+eXP7oqnliZjlzel4F57\/6dqlKIqSHTZ8As8vOuflRpCoX3Yfw\/Pdjtl5sQkmXIy+IqrWV0UUADYNCyk55zYAMBFV66siBkDbBoRUuvwjAFARtb6qIui7aVwQh2DeSwBYDJ6mbMBVA0NI7f0JYKwGT1MG0F4YQmUHABGFrwkDeGZWENmwJwFRhKwCLA58Zn4AsCJcE4Vs75M5DjAxhKwCPDAkmuRJABsiVMGdBU55GwE2RCiG81NOYz+DCqI0BlYmIih7DqyImPHVAIehm8GGiBkv5zosBQRRq+DRotCGMhjRCzZn+pkPCKJnPBpkS3SCDTFkfFUb0hiYIo6MU7PtDDbEsRc7Z0lcj17EU4D6UOoghngap\/vMBxtiqfZqQETBlWDEVRXVIRR8p4qYMoYT0RCwIaaGIiI6FYz4qm7O9QoehSA+84kym1URV7FaonnoRZwFd3o1geFvwqKmLOZjc4k6IfA3YTETFi\/UUqGwhaDMaios5gfGAR6lEHibwFHcBENoAhjeJnAUN0MedUHgLQZHMS+IFbldGoIAX3VsXVdSWDW19TuYOZj+JxG8qeolwCenzq4pLqqeez4gLqqPUj0EvmbAdfsMLy8sqZ27uhsQP6x3qobAV9C9c5r6zWkCtL9eNNAcMHwFL81IUr9FrVDrrxfj6CFTHwVaSqj\/1Lx3IT4QVLqcZ16Cjgw5V\/eArY\/14tGAnjH1EaxIkPMEgLPYd7iQtoDAU\/HqIHJPnQLxsnUOOWrwZDSRb9l7gDALcG8O1UDgKZhPviMYYGYBzk9Qu\/ko7k2T995gD5hk+lsI9hCsIv908\/8A4KP9A6JVxh6C7cm\/cJ0CwAvziVJfwdzUXk9RiE0QD8bc\/jZC3MQeCEIgStfPnVWTIKLgbZib4EwKNXfk\/GlVARGNhsADlRTqzVA3QWc\/qc0wN0UVRVsGhbPZV5lwHJvBbowjKdxSH0NPKlstFM6C9RTxLLAbYxFFfB\/Uyaw3JyTqgDhBUZNtB4jP0KiO8lEriCj1DcxJ0EFh1\/kItsvW4mHoSUR1McRJcS9FXAqFM2NiaIlumMfx2S6HOgkupqifhDoxlkVVD3YzFIZGGyFOisuzPQpzYiyLKvgA5jE7qokehp5EeEvBToZHs73qtWtUyf94DY9qjofiBQp\/F69Xs73ptU1Uafaqi2qh16MRbOP1ZrZXvXaLKmNeI6Oa7fVSBLt6vZrtEa\/mqMqh8FgYL8PmRHjLvR7JtgnqpLg5qu3AboKWqI6HOMFQFN7FUCfFpdmaIU5mvZmIHoC6GV4Pokn2mLkxpoSW6IE5CY7LNt8DjHnRjIDAU7BFNLuD4S44L7R6CDy2zVYFc1M8F0niVVW\/zkjyvlHzgEluWOf7GAZlS7wHc4Jg2yjWQOAtGBJBcAcUvoLjQqqAwtnQncxGrSZuJr3F4S2GwF\/17WRowXkQ+Auqw7nTPAQXUr+j4QHFy+mQghYwwlR0BSGlLwYjRNP3MmEcAYE7Y1Z\/iW4zNyiezg+l4k4wwhVcnAxly7chCFXxeI7foWC4m\/Wm+6NGsAcEmyf45R0BCMIWvFDjV9YGCEJWvDfEI70WDE\/BanLM9Kp5QIGNdYFLsv4MgSnCF2B1pVN6\/HpADaErsLrCIb3DZxD4lbvQoWAfmAAvNE+rKSspq\/nHAZ1fABBEagrc968J1aUl5XVTF3V9A5ggSlPg7sbxA8sqhm5\/9leAwFdwDjkn3lX1AVTgLGKIWhTOLIhaFI5i8DXRAjeqB\/sByiyqKsxiiKUyi6oKsxriqMyiKiwGf8ae5NuE3hB+xAXXk\/8GcMxMLGaqMVL7LBNC4g5wrBSAxkoBjY2aVFKYyZvBMWL0THkZHCPGvZeDYyKQWgo3cTZEY2KMZ4oo906wxUQFXUnqAFscGD0DKfQDAI4FA2uTRJQ4CZA4GAOHBUTUAHBkKrg7nyIc\/BwgFpEJ8Nk0yj65GypRGQPP1FPWYe\/CJBJlYHFAkSYO6AVYwzMRQBanqf\/MKgBs4ZkI0L1bgvpNLQeMLSQTAW4ZRJHnLfsKMFbzM2UB8NmiPHIvawWgrOZnygLg5d3S5FzaCkBYzceEATw0kWKZ2f5eAFBmEe0rwswKAN9dOClJ\/gUHvgAAyiyifUWY2QCge82IgLwLG14HAGEWUVURZjYAfPYwim\/Zbpu64f2fW5aOTFPIwcADr\/8K3l90HTwkSeEGNY13MDzfbJuSQzFPlk\/c78QLr7z5lpuv7Fy9eIdRZUmKOFU1\/aDTO6+65ZYbuy48vXHrYcUJijZTPbuh9aJrbrz+4o4jdh5RGNBvRAumu2VWlv3UCNY9nXQJWke1\/MjklUc2alZTymXiPGoJfjwyI0cMa+kYNnJkMpL9S1eRa3OKVtGPZ6p2cO3G3WprKoMogj3K9ndJrqSCxT8ifdvyiHKIiMr6lAZ+uVMnDM1SGhBR2V40bSYVJH3KfsiCDQkq7CSifCSIAhRTVVNA6WUO88Y2BPUHEwUoJaLa6bQ0l44bSrnL0g4FCH7A0m1ElCKiuqtKiEquHBy0HzWYCnrvqMmSPrK9cUG6\/dhiKrp8eJ+RwcFEyYBals8kGkQD9iGi+quKf8CKm4hyVhLRzIq9iGaX7DJ2wbxc2rpqfQXRFkSnlBb3phZO3D5J8wubiErrx04sJ2oqKGwYX011HyXbzicKtqrYg6j6hyq3mWj\/pUTbjik8jsbulTh2\/KLpVLUddSaodgFlzqAhm2iXg8bTpIOCTiraMXn9RKL0RzRw8S6U2W1O\/doZRCuGFa+kkVN\/qGj14ImtJ1HtsRetzRm4\/MwN+aO\/S1efGNDxYyqbAypYlTzjqvSu7yZHHrF6Q1nBsUnaOIryD9xYmouy\/DXpPdZXH5Ga2rC+LVN9GP1gp\/cYRduuO5Sq1y06kPLPbNx71zWnJInSzY0JIjq4rWRAZ+MBa4+ivPaGpjRRuv2oI9LpDc27n95eRAO3pFnNM6i2bdF+wQ\/X3\/7\/i\/5WUDggQgkAAJAuAJ0BKqAAoAA+SSKNRKKiIRZpBKwoBISxN26v1XK\/wHVLUA7N+X38b94apv176Y+jfS96ce7v5\/7mPdz\/JfYr+XP7N7gH6d\/4n7k+4P5gP1j\/a\/3o\/QJ\/Z\/9B7AH99\/vfWAegB+tHpj\/uP8E\/7X\/ux7R3\/36wDhI\/8p23\/6XlT1Ptxx4hpySZfEHpHZ1P+w8bP5X\/o\/YG\/mH9y9Gb2Rftv7Fv7Kf\/85hm658Sadc+JNOuc4NvXFRm\/DsneXP8lbv+MsTSTktJnaZVqbVbSqvpTm0bOTObNKvP6jd\/D8k4wzWnnIQvKRUJydqlgTYW\/NDxcRuWPvVBjZEHnw1VLd0PJPWU+QX9YFYMVT+0R4Jlft5pRFaopm7jzAIqkz5OZwNR5b5dH\/gG+VU9JHjvIsfx8s52+2VYe2ifLg4k1JMWsEW7ydfy4b+64k6znIN39azjvZri4Plq51O1s5zTS9kKCS\/Go62e4AS3GaBcQDMJuufEmnXPiTTrnxJpEAD+\/keAAADlkeAB3zcKjkbzmS6F5NjnPwKd8g7iA25F+Qt7EsBLE1XEcKhUuzxR4N53FegucwdCpkjUm7UNPeL8rOQMExG7NJWmRQJHv4reerDjkDGtEoVSBCHraJBLjH7aEplKiWX52GaodrOdKO5eBuZxj7yJF8Tfx7qVCAswZP6h24ROcyRN+\/jlJYGOQs3DxJasZIrW+FRqSreeq\/uqIay6IUYG+NWgdecHF+1lAuDIbz0t5q8kH\/v\/SMhyn\/pE\/heI7tkJW8UXgstvmJO\/kiJ3BcImms0yM\/2uPiC5YvbFdO+bF3aS1xNQmAwcOmO7t8drMt+S9OSJwue2lt4nFje2EkErlRFYUatjYRFbjld+OiFj5+7HJ1MQwWE5lXaBfz\/abqtSVlRoP70FOZhoZnf9h8bW2RAiBrgW+LII9YCxsijqOYwI9sv1OpMFXlt9p4VdIsov1hoUW0fh9LQQ48vN7BX5IXvq+1SEj4q6RrBVCHcLFd3e56nmNYH7I46+h\/\/smmqg28VL0+MM2vEGBA6hzMZIm6mNWJUOLjSuXqE0pknsE81Vf0nT9wbHrquJozSI3CjxqvWdHnMXuGS\/vy\/2Y3k0cEif8eDoFcETUIqvw\/9BCBRuMW7Imx3bsUMw5VDxEFHg6\/n89UVVEv6Te+H2+3EYwYZxVQzSztg8jufnu2\/64cI1OIaS\/v8Sa8+BHTlOVT2Y\/2xAq4uxCIErqMC5f7z24628\/H78SBzp6ldlmy1WcMSrIKNcbpHEt1SlhtWMBKNk9NnJHBwhcjuFMZt7usObVHhh+PeTEyNw6zdoTLCc2\/cCJzj9Yoq\/DM+90aODOx9APNCIR\/bHIFTXY7nc\/59aV5XXXR7m65kEXTHsqspQnjbIvYKqcV75MR+TZX0sigMRFY4rXZqLr5pMLltY8m6Gj0A4etvcdINsE2YHHJU3YL613leCf87KTm5SZv48QDKf3fWpUwJvMxbd5J6TW6sChUSnML9sRR9TORoHhXFWX6pn2XS0QiBClYXcHtd8RI5SyHtdRQMMPVG9MXF3DbagogE3dueiw9rXO\/EWcb7PPuev8JNg3\/9ags7UbWD1hrAxqVw0QK0NOFo3fAj2jMnybfjuvCBJTztHAg0haks6l+fd9JWNx8m4JHzuJ\/v\/9df\/+TevMBYQ0B02nyi9zPQj3+LCIfsjlR8xyDe+YL29curNOLSv1ujbPpqGuGTH\/Nzv+k5equQMz\/e20UG2BQtvz+lAVSSV+VaBruF5Ju6Yk+axOpX31buuEfgkVXUP8u+5LblRM3CPS1k8jC8XiWdm7TdFyrS3UCpKjKJwr5cbGSFStA\/8T9vf\/97LO4hZYpniUngNUp3vRsooWFb2eHk5o0+LndJqNYFyr7\/NHwyVj+QP\/PmAmMTAJIbdmvUf17aBF25Tny7uNy5I4Y+TOpsH9gVp\/2s4Sb4RCN1OqqL\/gKOcEF83bsl6HKeYdOvgNjXOGPaS1A88VVMqVgZtEBFyx47udH1axfyTYbKCxpe1eNLzPYBkdFZQljRsXQek+IIY+ovzyHWrfl8q2WVZeD+oKiGSCBWMeK5Bqm2GSrTq0j+HdP0dI4qWJGTET7TeBUGFk1URP+97yoS9lm435ybhPmb01WKeo\/x7by840Tv1Hrmdzrvv3wmKyW9fL2CI3Nn3h\/F2aY9JjCymlrwbHgGOetor4JZ9tIknsKL76UxMZ+bj9cj25EpGDSXC3NaJk8\/n686xoXgu\/O7gF65sfkNMCxTlV8fD7iQnB9O6cuRtHQMoa+COfP4qr3\/kwLRUx2QMckq57IHMn3MVN9vwjCM0NWgX+7pGJ0o6dk6Ekts72LPuvdqG5WPrY+8hwkTwSwI5gYgrPnntlXa5qL2kqbEUN8i0tqMoa1M8+vokp\/vl9fEBj2xFv8Um\/EJcUCAQnO2l7NECXKvc+nlW8JlU5VOxrgDLbmeshWpenWPNjv3GjhXkQw9ocnKv8kdIWWUj2BAi\/xDmT7lueZWnjQclCI\/1RqmIPLz8k0I+qmCKE8R4WRj1QB+nByhU28D6M7v8+A0eo9MTv4a+AnCsHnSm1XGkyaa2IEACyU8PbphKTdpMP+ybSF0IvJeXKuZF7VdylSANjR\/fH95VPzhMU55ALt2dhf\/YiPcV3pHMJSj8EZd5IMiF0HXUYzUYla770tm3eDT3NmvXKfZEuD\/Gtz16DevLqsxnTjgRzu6YCtxmP8TVN5d+B1A7zjudOv1jffhdLSVu7Wk7XPG9XWB6Gq0T9LAxppf\/ykKRULWyXg8kDKyyIcm1o7cc0N8u3gQ2R\/Bwo4TutfbLUbkv4v0F30Rgl3tUh4orQvLA70zNqgm3vaz\/NZd\/a50mbHI\/BEX21eh+Dmw9APa9YhBlKP4e8TlGu7dcjhzQf9VP3kMY3oaVnXxEyXf5moq9Se1D9SKgWombghNVyscYCyW+Uv0AP4gX09WwWXREki+xzPRlNkGjWZGND5fCNzQviK1ZvKhqOJ2BxI+HfmvmK+Ln6XyIH6UVVWGZOhwFdbJlQ4D2AksQYbnN9Ui69ZKzLFPVBBP8nesXhgvH8QLud1Q0KdA0cTOADLy5n0lztu0G\/3iMsyLLuNimNr9QS5Zz+b39\/6f7l\/zBQOlhXGwAAAAAAAAAAAAAAA==\",\r\n        \"centredecultureouvriere\": \"centredecultureouvrierecentresocialsaintemarthe\",\r\n        \"cco\": \"centredecultureouvrierecentresocialsaintemarthe\",\r\n        \"ccosaintemarthe\": \"centredecultureouvrierecentresocialsaintemarthe\",\r\n        \/\/ CEPEP\r\n        \"cepep\": \"data:image\/webp;base64,UklGRggNAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSE0EAAABoAZrmyHJymps92ht27i2bdu3e65t27Zt27btO702BhUdFRkZGRlfvBFdVYmqjv23MREBwY0kRZJDyzSzB93TT2Crvbr91+2\/Nc70KS0CQeHBUoud4vDy0WV9R5dn1WTKFpX65OvR9Lehid86wGzWHQIWXVNTgFVLDiroecPPv\/mmm\/XddPNZET3C7TFu0fnDPQsNlwNKKAqTAqCjPb2mawEhhSlfnBXumQwLhD4JBNvprh3aBpuWRTTDrp\/XN2qaBz+ArqrArw06Lctg2UUhACAYE8AOMYXvYddf0R2WXEpuVAVuKxhPAbCgEm1OBUCA\/4qa91wG9fae+\/QrmMvGSOxVKBbiFYujvoHk2DJ6+g2QtX0x1VZ5MwoKhHbDdi2BCvChVvMCCOw2PhP\/PWDNE\/cER1tsQ7yboZ5nlkUJnMBMDV4plfRz4Ub\/BZzf4HnMojiJ13La7fK8zG1QAXbTyCwCx0bM1JYIcEbUAHRiUydEQZ4ZewhS4MCa48H\/Ce9xEvRipvKLFFE1H7cNfJzBzF2AACMiTlI+tnIDP2P2KCSRn2U5UriJuZGYw8y9DqVwQkxjIAT6WRiMQM7JhC6Cjy1TAZFls2QVdzub55m9BwVCzNYI8Dmz0F9KEbnILgNPCfEim4Uq7kzBOzWg2ONzIPEms+lzCAq\/8jxSo0SvdCFqHEjhYytfSS6RZyynwFO6GypTF2etJCUetPIaAAytoZqN01HJpuY97dmPII5ZVnL9+vbt50UIlNIgcDJjM5Nh+TK6IwoAx9rMvggolIrZbNZ+XKD1zLtbVSTQJ8SVP8URLTKfZduIJGJbS+7yAEAA5+LB0884PeyU03fRI1o5zqD3p9GRJ4KA83bu3ae3pl6mcYFjc6PJkBIfssTO2PWQgIChj7UiffjiSy9qAhTHg16UzawlZwAlz5k2Y1q8GdNb26Wk9t6pIBVNqNdNSEAfV8D9HtPgQVWTX23PmtjE4fdhTHtjnWRuCE1VcYaJgrGP1\/aYhnI9AwW+PgIqtev6s+nJPEUfMyDM++qbr2J98dUdm4Xfug6+v2OzLTbTtKlnpGCo\/asdMkzjR5DA7g4SeSNIes38VloKhzvOmyBx2pBhQ+INHtKD6WslqfC5lQlrrbX2Wl58XHAk+zEHVTzJHAlcwCzTjqtvW5kHAIWExtVOz81truOCas+7ycyBtPQh7+S3JjcvcXN3AvNO2\/TzOs9tXpeuhMZ9W\/p5cW\/XeXGKptcDti18rOd+XJGadeHj7tSxZ8DbCs7HZalp5BI3pa9pAWjejpOamOdyXJsa9g7kB+ljTfMAQFXmOKwL0Jt7bVWwWRdIwiDRiS1zKaibdZUksLXA4V9\/w\/XmTnNjuS5FTutSXzmtSwm50gnbBiDYtEKrHtb1vFkfwGldzw0b9h4gjQn5o1Z9rIt6jVuXS5broqXy4a575q19k1IwRPhNb7VXt\/+6\/bcmGwYAVlA4IJQIAACQLQCdASqgAKAAPkkkj0WioiERyu0UKASEpu4XHhB5H7SvhPOB5n6o\/F2qXZedIci\/6X7o\/fh\/TPy8+QH5O\/2XuAfpF\/lP7N1z\/MB+q\/\/P\/tnvi\/139Vfch+pvsAf0n+1+kB7BPoDfsj6tX+v\/Zz4Pv2w\/aX2fv\/JnHf9a7e\/8j0kIldyP1bjlLMMxSKQ8G\/6x\/t\/UZ\/tn+u9PrOp+bf6X2Bv1r63PoifroQktSxj36Pf5UMX7aljHvwWAkRR15MGrgEESiVvPGQP2KVSuXxOWvGe8u9ayAnY52Menqw\/nOEu3mMbrqw72jxzu+KbVypm1dzVyJIS+ixZqbQv7NA\/\/c38AP\/Xr3KqR2s3JzfA5qNCmQ+9oyspnZFqgoxXjST\/EV73ANW6smi55d4PD8Sc9oPe6X\/4fAZMz\/6J38fcDL03WLcsjutwX7Jrdkt1PaMbhxsXyMBI+dSF5bjUVtsBroChH3qhLUsY9+j3+VDF+2pYx79CAAP7\/p1UAAld5KsecR2Qcwt2vVXxg0qCG4n5YAZNkiuOvrv3lCoNkSV5AmDNj\/x15ZqPEM+nJSASLHGZquWAGp4MlCoumQEDm0ZGZwc2iDdXiqyKEaw9c8uG8hrWUWnVSmVxzFU9X2C7zpWoiXyS3LajYsqLQNLLE\/LJb\/Ek2AWPG6lnlBfjvlQN6YD+8Y9J0kH4t5JBzMiS9n465DRQU747oQ4BQ1Wwg636vUd8W\/pCzuKUH4ilVFOgKbnSj5g8CyFkR40FTH79TSl3P3z7C4X2zDTziQzZTfcIzr2PdH\/hIZdPyRtXabUCu9WgZ8Itpt0gNGY9bQPhPkllwJe\/LZo69zWjH73JlMLz19nr7iu5Ox+uiQPLkSCCl5GvG8CfMSRUCG4mpb3xXiOMl7IsJ+21dT2i5UqBJejCsyfCaP4G\/7JKzT0SlZDAbobAQIc55DvXkDBkQl+wZMPC\/9v928ixL92SkE82x1I1aZvwAFJIdkyboz2oHE\/0\/n+pYR3PUhygKsTkzbio9MZE+Hgu2\/\/Uwk8p80jh\/YhOwUddvszWwnckZF+YtXHDuQSCQDOK6rSt3sPDzpy5wbg46z8zC2RNAkuEsS04GTnsP8+vGOw9fsTQqzQWl218vrHVshjC2m7DEZ0U+t\/KGPSobF8DO8vRm+plw0iVSzlqCpxobE+D9D6AUDy6fFHQubVVrtlaSWLeFD5LqBCjdFSlNI4BZmnSegZHSPJX18rU1Potsdm8vmABuIE5jbXSW+e81DtbjkC9CC6FrK167xuJsiYI9SJTkOa\/G9CH93On3vay9L9oKdfFfg35rzooc7LNKIZFTAXwlwHVi+VFRu+Xg2VlnjESq\/zypgv9MaLCpiJjRcNuBPoIANyYA6qdtls\/PCe23rvrTZx6bTDm2H\/Buki7RiP74YOWUwetiWP+ZeogDYdu6Ok6T23ryMaEJgXSdJP\/CVzIjrIGzcIZmT5kNAlPXr1zU3p6P18Zg+Cr\/6T7h1mwA3WzaRwKn+lPFEHKn\/oCSwNKGnVMqH\/8ySt5VxdJNKLyU2jLjYy1\/88\/KQz8Q+qUhyJUvudxLmx7vONBeCwUndGk2K157Ivas\/oBVRKynmpFfvyi4Hvc3PRLF07ui9ZTxOSnYKtpf8ijYDCL\/uTHPQgkjtbJX8AYoZ\/pc3ukZ+nw6Y72VrRWKAHE1sjgSbmtxXmwGkMzNCy3RDdqfWqWsBg+57VTQkuMWb1BOOhr5YFKVFrEZ2Y7BzboZXa3\/vX1kvdkd0BkJDzscrmW8rUyUHhKv\/2Ac2K3wF3\/eaX6t4gZc5MMO991Y6PpCC7JQJknRLcQ1Q3c\/wz\/jiZgnd23Tlqnq\/KtYsqxTFlEejjYAP6F+5e\/+sC9HzKOsjaJ5Lw5XX\/bYJjxtUXe7oopoaiX\/YOcFZzL9corzAd7kP8oSdgcCsJpcenti7UT\/IWikdFz5J1HJhjufIys+j7an1wDT7NI9lrqMT8zToGb45Upa+tsORlfyhx\/e5qJAw27TzvC+V6jgcYmo\/Lvepq6bnRZDQ4K3qZI4\/YFEZy3UXxPGtiYM\/3dr+zRvFHBVMWY1vlgZTW8Hb4pc42gvndPIc73\/AKHoRkJMPCiAIUys+qaOthqdzJTV0FkvaAL\/zl1MJ5i20UJl5UzV9speMGYpwa6nJ++xpwV9igXRGrXiEa8tpaeR53r29KhPFQap8C7hR2wSAoOjCCsSVgu\/tN8ty2jWHN0RlgMdhZZ0MKtnbhxbAx67uu8i0oWPtfRfXytucScyxapnCNtGcZdscErLEYzQ8cP5Z4w0PlAJMBKEE6zlcH304fIFfO+2Z7ytXv8uv04v94MIYnHSUxn\/kzSvBMokO2QRXl0MitindifoJmjO76jBGGhfRyBSTRMhyUDb9N4USe9wcHoEAO5yrQYD+2wykOb5fK7ZJ\/RcJr9qMW94SkFz7g\/JR00duKdSSyNNPenA\/Tk86JJWuY55Ld5x\/WBsC4LJuyQ9ukOQU4Gq3sE5qxmR8mg+CbO7J8BkM0bIkgvR84A04QbXO0zf2uqJIndV+yuCXcQNGfmjVD\/wAjLSSiVMMTSkCc\/3Sb3T2lf9x2\/np0Zxac97pFHbI+a1NyY6DMkX\/j4u1yyz4DnlaK1IZQt55cUQuWTqVhxm08OF1Gv9m8gchF7PNOGsvUVc\/RTGq\/7QXKUPcxtttJhIgGPSodyYh\/IklSL48tZZr1qC\/\/E4hDWpGZutebBxWg0eMIaO78VnOHGsS35Q3rXkiFi5WWWHOY2w7Qys0RNXIwKB3cLeHkZjdBYkIuQUbdU8mS3VemJPxttpVtLqSj694JldvCNmB3Y38kYWh1ceiM8miNZjJFi7\/Sa7Cv52ibsF5X4iKr9Cq5NVD+6WdgE1BVwgGuIsbu199uOUXNa5FqCwVcQHAtpDtWv2uEAAAAAAAAA=\",\r\n        \/\/ Camplus\r\n        \"camplus\": \"data:image\/webp;base64,UklGRgYbAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSI0LAAAB74WobRst5s96d\/c6ABGR0y+6tZSolFJKSpIkSSIRESGEbM684H\/btmVqs\/3brxFgIMQT0oSkQjVad3dJU3d3jdfd3b13G3fiAsx5HMf2113XDHMPhB\/vO6L\/E6D\/+\/9\/hl32+e\/f3pCr3PjqLdUJyDXkX5AmbQN29k44ykNh4cYU\/ULd6\/w84eglAIsTy0RAeM9EY1IRC8oEENE7UTlVGxixEf7OJipnatYxYHi2JpqTG5whdT\/8zqM9mnB2NligCWfPosWLFy9ddFuB89SipUuXLT17xsRhOa1+aaLQh6dCa+CpmKsnCPd6ndaafzlBeDhSi5yvJgjLGSGAaCKAIMWH7ZT1LX\/9p\/\/8+tZtU1ox6fSBzubmP\/vpyhn\/jcoJVzz08hvvvvvGK4\/dvHh6SZ0QtPiU9infuInG79VGc9K3QP2xrFHnx+Snj6rrli82bvi4R9lTh2l+56OVmf9aa3adp7a9YA94Mne35Bye2lT2HISZ80SDzp1Y8mG+GM11Q+TX61rCU7J8PSVzONin7lqt1l0bIADn6lpPrVarldSulXchBY3rbMmayD4iOeB2qFT0MSMA4bXmnoXkXrfX1b\/Xg4ZhEAlmqrBWYJyk9u7dSgoANwuAxClNrKJOYTC1YBZGPnFVUy9QDyBxp1S+GyvaDxFgbM4Kehuc0V7TDpEAIgAi51c1uo46xYn5BeujyPismRdI5I0TJT1HAoKjXdPXkDcGCiY1OL2tagcwAIef1n4xRI6zGvSRaOL0XHWIKAiOVho9TyIfHKtIpQMEYPGmpIHhCFI8MXZK\/2AAzs75kjo34+HWUVTeGQ7R3IUkip0TGzxPotD4QNJ8jBwLJekaDOPDoiiItlpFAnA2dSj\/ATbCahWvxyBoMJD7DGuQeLDoWRLFiXMlPUkCgsPlXC0I47OCHgo4tY1OIwGEH+pS4d8YWytFZ5Mg+PtAzpgrqWOYxs6PBU9TpzgYrkrZNhywWKf8pIgw1hRkOxixetDZPqVd4TnjZBXfhr3RocKuIQ\/CD8w7QEAwVdISrFEwVJX0FImGxnuSZuLkOKXgehIpbi7QvCGAS9W+t5AAjFfVeFKXGn6JgbGwRkCQuiStbQZjvvQkiWYWSrqbBAR7S7nuAxE4M4vUfe3dN01T+5YPhAMRR6pNNHklCYyvtZCU21+Ssr1EE4lb9SSJxsHBsqQ\/cCDxtCQNDBJ4bFTzWftcRgIwblcLu+sWhI\/06MGc84ekPpwmnQ\/uJ9GkxUuSeiIAvN6j2oXfQUDiigYXP7Rgxvzn+9vnr3Ag4lC5Fd9gYFwvfYSB8Zaku0jN5J1mnTmSriTlOLruLwcPMLZnRdUhgL1Z20zHARJPqIWXk8D5K1O2m4DEo5J+wHMRDRwgipxNkvQZVpBPDrjTp+KXGbbEOWrb+0m5YHoLuoYsCLdpUjdB7gqpo04rneLEcknVIaLIPAASLFTxXAz3bVn7\/IUDzgY1Wyr6GAPnu9qk2i0YYJwknYkVHBmJJpz9nouwmqQzMJoNC3bPVXFpWzjGuWrbmhOA8UwT5Q\/3f1SWtIxEvh44hcFk6XkSkLj9VqxB4pVrwgDjE0l6hdQo3IDnK2q4CsPjb7XvqRhA4twmPsa5WqocdC9oMhiqKtuCA86k7EhELhIvaTVFZ0rKduG58JSAkZVT1fhSEhj9bbSClHPmNlpIve5PSaswgJRSve4FztZMUwjA+UW6FQPCeECl\/QQEgyVJM3CAAEjfXtmpJudhgfGW2ngNVjSzQbbdPXG\/FmCM2vlSuooEJC6RSoMeGFwuzcaBxMOStJyU49D3Ty\/sUtNTjoUTdqyznT4tMvobPIWROENbwnPp1osvv\/yi33Ag8Yz0AQbBsaqkqxlxhgck3U4CInpz32LgbK9otD17cUhcqnb+pihxZ9GlGBGpdD0GWHyk\/D8Nrlb5IAEpVklS9hd82StJ3+JgfCVJ1RECEg9otJMHcXA+V1t\/WRSxv1tSthyHxIPV5JFjINePARgL1IcDzpycSnOnKF8dJnKLcqdiQHjPaPoOYxB+pLO93iwi2H\/X4tv+wsFjT7YOAzw2Z7nnI+WwLt1EAudvjfJ0DILBUu5xElh8pFEuNhxInK52zJq4M1IBQd4gjOlTMYDEZZKUDeKA84\/0FgaJS0fzPAkSDyj\/Gw5O\/yjuJwJIPKqsHTr6Gs3BiohkycFgsb6KXPjuUq4PB0jxvLJNBBGHyqPZgENYd646QmDxh5ru+hILwPhKJbXlwjsbZBvDiwojMXK6egmAOucrf32knHGSOhJB4iGNstMILN5Xfi4OxqKmzjuCATg7yqVKe2jlF9UCnUzdG0WC36ZIi6xO+Ahfq\/BZq0f4CJsyTSPwNNIxmukRRJ3+gvMi4b4pa6L3YzAAj6EeTVa7\/n5kWYFWQDJ3t2RwbHkm6QQC4Odq0TUUpjlSHyMpuEGjnUY9GT+qcCHDqc4SNaw8YFgAhHGC5qttK3v4fFZOS3bQcOc9nSpcX4\/DX5ybqTi7b\/P+XZ+t6JHUGVBfrlFnG4D3qkWVfcBaFZeu2wtGPozTtajSPpp8FNZNkaTSwpe+\/vOX9++dV1LjzkllNV\/KVDz5goWdamHlnKWT1bjzhltmq7By3Q4wCsNZogt61c5zLcEbczR+9z5yCCwo9GCRrpqn9h6g7vDd2eVxqXTmh0AKio0Y0G0L1e5n4nWHvc\/MycaZ0vznBgELGhpHZumxC9X+JyfMDdjyeH9p3Og4a+UgYEaTiU01rb9YY7HvEEaYA4NvXNSbjblq\/13fDQNmQZPufJhVfliqsdmzgQR4MoAtr13RVxkrpanLnvxpCMAsaNpgheZs7tdYLb+DO0BYCoDh39fcfMqUSjtVpw7ctPLHQ+Q9edC8G7v7tGJzj8bwrZAodktO4ZHNn75410UDM3s6yllLsnJH99T+Jdc\/vO67HccojGQejDYSvJqVv\/8g05ju24h7QT7cUgoa1w\/s2PDHD59\/8Nb6tatWrV73+jsfffnjnxt27B+myUjJPGilwbZ5WnboOo310hNg0aA43FJK5kHrw81SMo+g1ebEHap++e8UjYNzfgOLppqMCHe3pt3dI4L\/cljAq1XdefRujZOX7YMUrRijkYDXe7Rw8KsejZuVu49C8vEgzCBe7taCjdtO07havWsfuMXYCjNg6w0lDfw7eKnG3crV\/wBmMUbCkwFHV81WdsnO3ZdJldM6xxlJ89ceBZJFu4UnA9i3aoHU+8rQLwNS9ZGVkzQeV8\/7cBiIZN4m4ZYcwH+7d7pUvXHTwWe7pWlrD9+jcbtjyeqd5D2ZR7Qswi2Zk7dfHz+pLHVe9+v+d0+Uypf8yZ9TNL5PueL1fyl2s5SSNZlSSmZBsf3z+pUzMynrf\/LvTasXSNmpb41Qv1jjfEmSuhZc9\/x324doddrz+7oVZ\/ZkkqqnPfT1n+9f0y1lA+sOAE9WNd4\/seu+6SrMOqb0L7n2vqdXvvn+J198+dlHb6957qGbzz95emdJkkpTzrp9zcfvPb60Jql26acjAO9O17hf2gv8++RAp1qcVTonzT794lvue\/Lx2y+c2yFJXUtXbqfwy34dB2+lbgEc++Hhxb3lUZQ6uidPmz5j+uSuSkmFHSeu+GgPQDL4pF\/Hw9qQB3gy8oPfv3TDmTNr5ayg2VLX7MXL1\/y8l3yMjIC\/1qfj4w84heHJguJj23\/\/+sM316x8deXq19\/7\/KcN+xLFYaleB7bfXdNx8hmMpsMtJaelnpK5WwLSe2eUdLxcTqKVEeHWrHsEhCcD4psrunT8vJ4ULWlhWDKAox9eUtNxNHsG8JTMI1oW4ZYsAPzXx06u6Pjacf\/bG4PicDczz4fnzcydhns+v3egU8flrGP2BQ+89fuuYVp9eMs3L94w0FPS8b5Um3Hyhbc99upbn3z9wy+\/\/fzD1x+\/+fIjN527YGpHpv\/7\/39VBQBWUDggUg8AAFBAAJ0BKqAAoAA+SSKORKKiIZSsJKAoBISzN26v4rF\/umoH9b\/ID2LK5\/U\/xH+U\/I\/Tj5enKn+3+7H4UeoD87\/8b3AP1E\/4XUi8wf7C\/tR7vv+j\/W73Of3T8Y\/8B8gH87\/xn\/37BH0AP2t9M392fg0\/cH9t\/gM\/aP\/9ewBrhf84\/FXwI\/un47\/uN7A+Mbzz7aepRkv6sr+f9d5y\/4rwd+IH8t6hH5D\/If9L9rvo575DMvMC9XPnf+t\/uXisajWQB+n\/pb\/R\/CL+if2L\/l\/3r4AP4z\/Xf+P9wH0ufvn\/I\/v\/+H\/ar2s\/jP9d\/6P+J+AX+N\/zr\/c\/3b\/Ne8j7F\/1k9jL9Z2FkzfT3Rvp7o3090b6e5o0ZugUVJKYFn7i+Vu8hv7vmFRXizwLf85dn22AeU8adH5ZPi+\/jltL1WOznUZTRT\/2NNgfzFFWAJFvzdtreYO1lqHOH6xMbQIMjuVR5mc8+0kuyoftyfIqu17Vp3y0HswXW0OQ29vBJz3FagXOknQwI1nyrPqRUnGkaz5fKEaJlzQPK8v3KrnTG\/Qzuu4k7WUjdge+OP4Z58VEcQVwegH3VRhyUiMmVf0R5Ytqr\/cmyXVrh\/HE2Kqi4nMhf9mnwl4TEjl+tp1B8Tu3HH\/r8\/5x6zBbG+bZMWvE\/Wq\/o3z0qHAM6+c05dc1oN\/s1vvQpnjxjpAUx0gKY52AA\/v7uqgAAATPPiY9iTXjzY66rZMtptt1pzOB4Xc1TL9nUsTMCccZTy1rM9LIuNU\/\/Lk+NAI8CcKb+MXBY\/nxqSV+\/+ne\/DD3A8VJIl8rSOjL7wtT6yZbL2fDXf7qysSeqYPjRGmOu4rFyuuutNmeugsYQP6qE8Eh8cu4MRTg27QDB86Sv6m0abGtkxHjKIBnyWiP4K91Dy3YuK+HMcfb1c8A\/aD8HA3lrRK9lW151hiKm2qyV+Lt+4nkRJM9TkISCB68Z0bC9\/rJGFU4WFcG\/wUyNruSyH9zgj6+hS2f2CZ36WUJ242+Q65z\/w4TsJyhDk\/276ZkROA3Vv9RDKmjkuu4HJ5LhZJV4vhfxEWGs0U4MONreg+CRv1rn1sIDBBg5C11rhVfAiCrzDynva\/Uh4Q2bShXtVGHQvUO\/tYFhuQufpdncPIw14iTM4tGxeUUKPzBRIZqM9imUpOUqiGx4E7dioR8XRzzLW8rbzAqXFxeptXFbJ5jgfBm3aRw5pzIZQ0gsOO31U5UhaYx8kJTNR0UZ2iI\/E\/HX2owNmk2lEqLqHikz3RFQMzwL0ZdJOMpZNa3tWU\/pbuIyIsU2uJ3JDYcVW5\/xW8GddrPQRIouN8Sgs8WHGRRa7zzFlJhzP8Ibj9NbAD2ZeLGAD\/v6hUyI3qVe9CX8TV9\/ziPeAyvxwhN7rzPUbIUrpDXffzv8sSYJb9Tnchn9ilMffTvyU+wH0oA0I3wFiSJ1w1K2vyI0lNVXIvJyfwXcsPKLclHRt3CbfZI0fDLDBI+aRjOA2QQdu9Y3bncC0bK6rnRrCR3cSqQ3JRmZTpm8TmBjvye94gaQDRCQZFw1p0bDpv9gKeOHVhF5HOEYnvZlhiJenMJs1mXltyheDS8shWwgsh4qJBMmXrxTo7+CIzR0U2tByTougBZuK3BH+Gy1idh+wUMPpddha2XHd2j7w3nN89ObSFzi9mnncjFNU8BQKqvx64FqOexRJmA\/wHVCYudYx+rZsiY422TmFb1i\/MwWTrAtAFfSlgiwNJFcbAw\/optIdrMDZX8PSoHPUEqF5DRZ3DD0EEjyte6bay27cbVlBe2rD2XE5C3iQ6bnk1CsTY2q3zdZNvUT71I0QwyrTy\/lrwqBK7OEfE7M1+dLS5OI6uPfgGHAFXeo\/5TZVAGnPS8pLo4wiXn3KNquZi3LzFH6A0S+s7lSCXeMJVbGWhapFyRCX9f\/0BGrJwahedpu5rOuot7mheCpGO76OfYITCpjwcLUgwZkVsXUV7HrIvdcTqzouY1HYc6qdFYby8Q3Tper8Oaepj9LHvhHSTDHDyOCwRPly0AHfDIOwW35H4ppizACXrcUCCkZ8FwB09Z5FZKvpUWkhUF5hgaVDHKgroFXbD78cB2q13A6+0yBYKcifz0wK+S0hDoOHCeHOYKTH3VK\/f2bWNcmWnpscvjMe6\/anCId7pPfxfEKFtM3qExHmNpZvTp8ljiEDW966b8dVSkvvWK11ajRu0hlCAcG0J8gB9gPAChwVGbxPqVtlmAmyrHGRN8D4tspx3NNG2hYZuCEHzkDiXAIOqaTcTYAnAp5WUdS9lpl0++ZNlUPzD4A4dkVN0gB3VOzsl4gqJaBRqInW\/mDwGUtsw1st4J7OTdTU5EaXZ\/TkZowfWfkn+DoV\/rO+xNMiY0rDKJeSeiyh7VXrc\/vnTaAZAjz1yLALkxWizyoMfeZ4u9EACPbJ72ADsso+XUXeObz+cJZ3YNYyNl6iSfQESKywkvX98CtsGbrIQc7B8dyJWhouWkGGTJ9mtVxDT7sd2Pn6WGUDD2R7JZpU3JxlUhY2l5Gtjdd9Vf4hWP+cL\/Tna6PklBfcRnm7ChBfXiXjh+2VwsXo\/sUU3670sDxq7bCOX1\/0CB24Lbyor3z1HTKnNOijKQZt8qGbHiFcuqgwOrm0qNOTAGS60IEraftVpQbWQDr4gRNUAX7BtxoUfHYr\/qaQDZD4L7XAVZWhm1Hj2u+BHl+GOazNrF+U7JlnmZEe+GkrDCMjSk6Sk3qMAHhHT1woNwj1jqEReueFe70EE+FO8lxfkrYe1eaQKSfCjxbQqlo4yYR0tKK0T8VK2fH5uCOsJVRKbDSdS3g2\/i1h1mXL+I5eW8tWn5sRbTJmsq1G8qPw2uwcrXIxu27zUYfXvk\/5\/twWPiU8MnB0vEeOGyt7pr2xzB3M84d9mF8IEOCKKYoX\/0Y1OWqOu1RDjhWWJ3qkXhsB5gbJRCqllOM+0eGphVgesy8\/VclcJpeHLKCfipai07l1TA7X3JKWfKuzWpUrQUfDU5Uc6sS8JuzYni7N3iLYrYnpNhCw324In59sB1VnLYpmgfHvX4xe4hcs\/Jeaid4NEeCLKuSCq3K5w8k9VXUh7Ba3v\/qg63Rvm++EqymxHWbQN5kQVWxpcfpD2ux3Hx5W9UFxEhWb+je+by5riGhVUi5xfS7UgzhJ0RNJ7RMLdXVQZ3nstTO4RkTUdUR3Kl\/\/UvJgUATF\/uAqoDPnEcFOF32Frk3inDOmrs\/mFCebyeLbeG6ZSaomMRc4WoY4ElQlxtrRsu9KvoppyUT0VZUvxAirSLt5PBzhSO9pvbGwE2ClNooLfACICZc7M+6qcpuyASLie9MyCHQYean2rOGIe22NfLvOHxK0hZ5j06ZhN1PzWZigcCrLuZ3jBAu67zkDWsKkrWvkiq4F\/ZoaIJquOMk0rHUufGNUJ47v5ZgV83GdVqK2YpaO7woJ7V5q9va1ZqOL5RqVRbuC8vgbxmnRPOgAbhKeTq4y77cnX5wVLbd7sE2aaxMSH2o6rdChPAIRAxD9h3B0+dExb3SaWB\/6nZbU6IzAayezc6J\/EKYy4KFj7IX30ICP56UbJEbHqzZvuUHjiPUSf5wbVjqY108T3vh5sN2Jhtw4XxDeu806W85AWR9CENfMJjAX9StYZEXJFZ+04F5GS4JIbkHKK+LWwisk74sNJdtY4LRn2KMZbiXH0QoyAdgy\/m6wzoZsBlyfQ8mvwXVutoFnBcBcJNXZ75uo0vXkMNu2PyvIxr8sWbz+UJl6AA0CZtZa3ODwdbkJ06t9bU0tFy\/b5KDU5YiSuTkgzk\/zhW3sxpXtyDWEUjrYOOFEgSkR0oFybDoTk36sWrKIX2oIqDWxNfR6s7yZa+\/3LTKPvMnCJyyW\/AVwMKDYSn+t1ek6zhMrdri4Whx\/JkPFy01ufFlJV9kUqVBM4npxYOiedpSjhT7SoKAfRWtlvJNgNV8yxNW5jzszuzYWIfEi6jQZD\/skHUqSCkYMmSlGXVJXoUbIREt\/Wj2kXZKMADlx9I8cgR43cF5CDS1qvfP\/uQZcZjHDSB5UyPAkGvPkQs2xFhlWrBKuZR6WWWoI0RHbMIEsJ0xXW8B5eN\/slxuNfwc6IxbfJJYeSsOMcdj0Aqp7a0r1d7vBbwGjlUyf1Jc3TAqoxfEf4npZvHn39iY5mNJU\/uuZxR6OawjAXDoWlMum3Xg\/XsxcZzqPX6hp0WJSmjnmwlZegJeqGIAZH0BdzcfKa+BPnqgfneiJjL4XhLW9yriDn1Xa0GlTnT4DakPUWHJKmEX5SIi7uK\/sJ9YuLYLbHJzLkzyP7\/B4l4u4ok2J1aQSCbuiQR9AJaFTW86NnL8Oh9yG2WozZuseWTVKljdq+JwYlRp9Q05v9+wKv1STUcaZFW4Cz1\/xnwA7lhykxde2gYPPx\/C8\/oc52aNVqCNjJrZMatVt4yVFnewou0jyKP\/OkEKvw4eMx8lAj7OWqCSf4OFJRefw1laTV\/+YIJPwkTn0\/4iLZjr3iwWaX7AtiGiE8LfBU0g+pF1ctu9mhzZ89n8OHN7XZT4GQVAqvfItO33FRQ3kaKPT4LNGNIJlm2hmVqyUq1IbM6C\/D46Z+hYhXyO1lvekqfMW50GCFeylXV5sGIsLBSmTEaBMJYyvK986CUc4sbkgPQdrYrjylNVDDWR2e5dvCr+2vYdGwif\/jKpD+nUNeQtgjB1m3Ihoo1Iu4qWJ39FCzN02Rt3PozlccG4pVTLTZf2YZg+HFK4IsYWjAxc1wMupzdpmEXXFg\/HC2sy3qf2eZOMYSsBy9P+c3c2ElRNKtmsvFR2cjzYZ0xKac5kg632WSAxdPKrQmt2\/B4k1vheUL\/mWeEpaOi\/ntleqzx3BUqtq5lCPdLLrnO8vBD2+n7gIeanjhYmDUAwj2\/pvguy6hYJUEmQQRq973bZphfAg1P4RyIaZy\/lqkf6vNsH\/xl8X9X1LK4vfT4m9LjwxiFIw0aeFDXNX\/lbYHKLE0dKiWNWxV4jdTLGm9gY1lOiDPOJ3D4eqM5MKE5\/f1Hb2lUwAf3uhYZqXihKQrMVpQr2baKjAdswdrpgCtYdlCD+ksuA\/aE9R8\/MCf9PcEKn0yY0eNqkdqbF\/kKdjwEOVqwiey6+U1TlkpaejyjMpSdi0dR0w0GZ86d\/5Kco9kdz6pVXdLM4u7GwIBrqYCNuQpKnis8\/U92N5uglg+5kblCGrcRag\/RDJuO9j5AWaKETt6OJrb35oFOM9h43GQAAAAAAAAA=\",\r\n        \/\/ Coeur de Cagoles\r\n        \"coeurdecagoles\": \"data:image\/webp;base64,UklGRqAWAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSJACAAABoMRQkGnb6n3Pw7dt27Zt27Zt28bM\/n9o2\/bINk46lUplTWt3UvX9f0RMQPnf\/\/\/cvzFCoMLBzU1nSqjKgo2N\/sQsFtPh+G1diRCscl\/X0gpUwq3s0NC4Q7F4qEzZzg0IAas90bWyGJWQhY0aGXymFpNJHaeNPRCCFs5tYnwVwhambuFMIrM7G5gUJXBhpv4uQCJTu7e3CU0JXZihryOpwdn1PY351Sw2lIn7WZ9K8JUDe+lexqIz+2rQx4wI4VcW7+Mkq\/EJN\/Yw+BqLD9Nx\/eZBSGBlFb+TqBlQbnbrPsIyYFbHeE2DkMLKgl5bULNwjNdtaA6UV50GP2I5wBjPZ0qUJFbm8VmRmocdfY5AsqBc43M3mgXjjc5j5CMsC1DH9ZhAyaMyncdMaB6EZTyWRTKxrcfWmVBO8jgyFzd4XIbmwXjY4+5cvOPxIJYH+MLj5VxIevgj6tVcmMejufja495MGB94XINm4nGP45E8KLd47JiLMz1WyoSwq8fsaCZW9JiYRCoze4z6AksDOoFHeQDNgvHhiMvJSBaUG4vr2tQsVPb2mQHJwyI+oyuWBGMin3IfmgPjw85pd2oOhHOK8yxIDirLeA2+x1JgNp5XuQzJgPJAcV+SmoHKJn5jhmYJUCbyK1cg8SkPlB7ny0Bl9T5GPsKiMxuO6aPsSo1O7KzS6\/im4TFtP+VSJDa1+0rPU0cnLNBXucMkMrUXu95mIjRhkdL\/jSZxqT3fNTAlgQnzlBbPRKIS7ixNjjMUC2uyNspGSEyVQ0qj3VOmEZl+MmilTEmNqDJvaXcnajzCaaXh7mE0GtUPBy2VCUUsmMp0pe0lqbFUNimtH4BEolxUmu\/uNo3D7PlBe\/\/7\/x\/kAVZQOCDqEwAAkE4AnQEqoACgAD5JIIxEoqIhFKwmICgEhLOAS0H8z1JtocSDqw\/D\/ar2gPER6QHmA\/Wb9YOxL6AH7M9ZB6AH6V9ZR+2n7b+0bmp\/9H7MP6N+RPnf+HfMf2b8jv7N7GmXPpb\/hfyd9z\/4n9Yvv\/9x\/bn+4fut8bf4Xwb+EX8n6gX4v\/Gv79+YP9y\/dn5\/fgP7T23WV\/4r\/VeoF6y\/Nv9D\/ef3U\/ynoA\/wH5Le535P\/Vf8z9vP2Afxb+Y\/4\/+2\/uz\/h\/\/\/8zf5n\/VeI39T\/ynsAfyf+if6n\/B\/5L\/lf7P\/\/\/aV+2\/8X+\/f4f9qPZ9+Y\/3X\/lf4r\/Kf9v6BP5D\/OP9T\/cP8l\/7P8v\/\/\/\/d9z\/si\/aP2Pf1x\/435\/obGMYxjGMYxjGMYxjEupHIxmcKUBv6yoFkkGJssTE03ndBklxGZkxyINNvG+S\/mjSbiiuOm2aqc9XkKuIBvhdsxYmNQRDTaCFO3K1MQ\/DUnTtDGJqle1jH1AFwmfM+nbg5bcrAkIxh4\/K9FLR64s1ErIahUiZ2PTYuQ\/r1y3OTgtlSL25GrqLheTko2X3MO0VKLNqyU4jlI5MyOLs+\/2KDq8sTB4s2X3nkofQPT0c1ybHZJcgcscwulJpmHhe5VzmQ7Yd3hABVt9bsiGcgSL15OzATeJenxWYP\/wup024BiOlpLQ485NXjGU\/dxObYr6\/rGYzvIYnbjvtDrsEuIH4mFQzx245omU6dkGX8OYood5NcZqXgxnSrfpspscbGgfXWu+31xeGYhx6ue4IlEimJnXCixSgWirAC9zdHZJEw8y1oZXOE9o7+PJ2itauC58NBwN4J1a5lX6jFMiNHmbOc5znOAAAD+\/nyUAA\/f\/BQGnp1Zs4+JZO4WT71jUee9n08c+7\/9srV831ESug5653pIpX9TJT\/FoLWF\/JDM042p0LtUESXPIoEh0y+jyrkPEgHv2j5H8DEFd1psppa\/27qhQM+KqUGNFC8A0kM3GLT7eVKU8X6fUG3wFkB8nCOL1fiaCjo94uQGL0\/eWDV91MQgQ2JQuYkP8PUVlbjB8Qf1MJO\/2nnRH8fPvFM7edUNFb59OI1UQDkwo8lYD4ftFavnsED+iquAE8BG2ywbcMUkFthCq3qhyAXQf4MVAgl33bP7vjHcMrFMpnBqPNBD9tyd\/uGLbgdJyYWIGog0HK+rb3QMyxmRxmo2aLjwxxfZ3t2uQj+PRAlv5EAE4JiBSr0GTOgXuxhhyY8svHAgUqn9Vdfgyv5IanIlYGSV8lkljt4jgfyn2lpx2OK+8iTChOJEzvPESltjP6\/M9Ssk78dZVOmbD9x9+P3bOuraQ\/AsypMVdw7lvB7e\/1KAwZe2JRX51xZg0UtNn3dk9XiBo8AmepSQDZ5+sB+jDQQLfp8Tch3Qx3fXWXb0+r0UgkK9vyIOr89HDuSY1V1Oh8lAwFufS0xOQxvFziM9KenHibtXwaWop+fPXDU5GL5m3Snfrk6\/SXvsWi7Fwg1jdWl\/jL335UNGrFBe68CQE1V9CjjDDeHAi5AyeLq3NXbwsLR47GpU2a\/\/i7BzvPC8UlnHDYPMsQ9wt1565jx1+B9EVkfaY+JftgXbEjm\/dV7XhYW9\/fxsIk6+6LEFyrPhULlsFTHuNiR4KzFL5tCnY1pNdgCAiH8MY8YhuPQsnYGCMT6DNOGINBsSPbglDujAgSxrBJGXRko5qoVq6dKdxJ\/FectaB3iYV72QhxYDp8scUn0KoNLAn3qgcQ\/jsmG4U6M+pt4iLa9iy8IAC3oQbx70cGPEGcWvAM3Aih\/LVmEVQu0BMrjZSj\/2cVFbhs240GDE0WS7sonrRRwHCo8gfRRF4An4bXNT+7EMZSsXcKZeAzCio7cTt08DcEk7kkMCT2BBLU6AEBsZZRlSVkLY6W8VoFs09yRLX1Ynf4s12NDLye3GzYD\/9AB0CSlHyX0B5k8br9j8BWvpl1eZ1go+638AZWl4DkQVDiw1i\/PmM6DqYK1bQVnq5GApKBRxB6COzBIZ2eKjkDIWK7LkocVnNtbOTX\/qN4byBzu+JXJn\/xuID\/I6h4ODkCY8Jgn4Ja9k3jtfbZYx3XIIWYwMBUQWVA24J8hBptmqFkRZrLYaszIC2yN17FyXAdY1iyfGRP7B470kCYCBCjGnP0cmqcVHWzSZMHxDcLmEuX2ATKB3GZLc5FvI1iwuzTp3viFRmyZZLvpZ+jtwfOLOPKLAAT7B7yzAWvYVwBDda3kRd+3oBvDlXInvG0E79H3GZ+8XbAffWIpmfhIdpYjZaYhbR7lR1Yo7QCqKIrbbqVLwZ1TlD3EMiVUohUfXUvDCxS7\/vGP0+TEHYBv8eWD7\/3R0+9\/KCXU599zcb6l02VLr3mNe7Ev6vOK6EpKR\/HNP3\/UMi9gU7nG10nLGBAHlVROxoeYg21qTgr6Y0es0Nqr5K4OBRjqectV9SxQQzmXQJYt3C3v9SSskDGbKw\/SAYdR6wGi4J09NhX96pImFf4dTrmIjF0Yn5n3NQETbPFlRhEsaPg\/9NvhQfn+dDu1ysWtVhVeMF4WXStqFRcLCT6wzQk81OBh1GaXDFTtbkXfTa0rDnEhMtuJ8ZE3vFUCep7rAwy0Lj5WTPm3fbKiUzw5qhRZeNdZbms8zVo789klLuAFV8eq+vHnvb\/z+LRcQk6FMrFRnNt\/+sBHCckBAUAEMbkOJix3xOfiIAgfdjwLHKcozo+urHZFPD3RLPmQVtGMp+NbA9qrBzRo7ZpnfMksZhQOfE1aFkqCp+MDRkM7ocZCVf8U7oaUI9Vxab9V7KIlC6CnEys8xxka3cVyMyxeVSMcPvGWRQPxGgKOnnMh\/Q2b3RzS6qe8YR+i9MCrua8WuzR8clkqbOA7Q\/RkOxIUPry+EErhjnJCYAmUF6jVazgcfuDPiXT\/HiwkK4scIJ2pTo0CbZ+gYYPNqzrBH15hSOa9gE6t7FIem2VvHTd0lCk2IVX4u2neyNbNLlJqVK7I\/86CWi\/lvI5JeeK7bnqFXu3vCfUjpp6F9UGsT+iRSS1AYzd4zP0ewKgrHPVyxunqkS0YedStviLF3H\/5LB2s20cjclvZ1DgIABaWHl4QsyOqCj2bxAcsjYbaJ9rokfApt3YSeWQVojrZKSJpgCPPg8uCRaIGSR8DpjH0ctffGDQrCxEbX0SVUaPeGgsBFiYlkX1AprRQTW+mVDzTInOt7YevppqWQIZt9T2d\/3+0SI3gdC7nyNWMLhaNs21B2rhhQGugEE6VE6hd\/1vq1Uy4Qlad+psoXWcIf09DKrz25JbP8JFtPdZdLGWcDHgg9MFotVg0IdoMMYQdXyBengXe7AaXlkXxR6X3NJp2Y4C6RnnL+KXcpT8DAJ2iOmscIDbrdCPRSSlSpfdT0iV25WAXiPR9J1c8blQg6RHONWMKnfEQ1um\/TxI7\/bLyrTX\/Gc42FpAuNr+xuSquaHK7GTp5e2c91Yilf76aw0A9fkRNQdZfLwNe3b6XVzdXHupdfz6nXUVKNsLc2gk9U\/eHx6eOudBctuEb90XQyiWvWui\/ZsgFZ7NRGuFAlsYc70QaLfDtgWNgKrZuGWyH\/pwIEOIsNkbbrr9VtsW7PP\/xoMn4PWtlowlIhg\/UBowa2zUPKjcQU\/fIB9GacVL\/FGe+ilorWBjQkoVNBxdfxA8iGavjWI5IEp+V\/GG7qfXTxrN74iSuP5iv+zIORC71LbtnNPVl3fQ8xHVoF\/TMUUJ3JmMLWU9+Cf3O+dC2kbAmjv4ZYbOLBmpYgzkltfrBP5XzC+gCZ\/xf\/kAdfIiqVFddoleWLr\/sot6gJANIvXiBVxMLtBV07jk96iePSu1qglbaM2XRmjNzqR\/WxlaTQsb8RvhapCMQTkFAwYGEazuaCBH0K6taPOt\/2Nrw+SpaXk7yMBqlojafm3BFrcC1bNEMjCv1VLDWXNq4oG6vfiDrxejcgFB\/LDH8hPhgpOd8e+AOokR0g6wHZdw+SIFv81rZQ15VUj4TcRAEAAsy8CIB+weH2ndcNNZ58K8NGOmnY8WoJfDwos8BfTRPJcXcd2mWgKZG1iPwsu5iAn2RN0VrvgXvFQM\/sAl2TziV\/qq1\/F6urt0LBKtgzKSPBXuWM0vkav3EmRp+Ug9MHXF8RHcm0Og8J38yXI4JgojHLd6HaPHv2KpuR2uBoZ8YBhY0QmWpc8maGqNh7DNT59o8ee5gDfc32331+J3cpYDDuFZjqV9AFwwUn4STMNxsi4VMSTDlcNSFS8imApTGK21SFNBNDZitWbnI5ldJiNqbEqomUQpsWIF6bo9a+MgWGIT\/xLJijH7X1p73wg5u5fwzgZB0gJYrWaVG74gU38Y65tbNaDoRTFtUoz9lVkftFRHnUCDPrZdMrzr\/wO1dW0BacwPl5gcjT+orO+NVyQR5ec+ewA4tmM2XUC\/F\/89uaFTLGmfAirfyVbQWcETWL9aMjQIXTFdCVcKkWx+SyCOPX2+BGqTKjdnd8ODPW7KCJWRx846WOgGoPKkaou9ZFemqInghY85MjqCk+yH2djB3RpUAUNtAasaU9f1cMH2H\/s11H3xWIMhXhWssj5t1xDNroLjWI3SFy2tacL9vtipZZx7U+pALADF6lVSF+nLww4X3mrWq4kQSE6zhnIhr5Hyj2xV33GkkM0CF5EKkJ1HBMIamyYe22p7h\/eYdDUODN2JjrUAuSCldDTT4CmqqbWEF9cAC6nFTCDZ3Gha2wQ1Td91GSmFHPyH+aWoCOLwj4qp7l5KBPIXM4U4HRxawRaN\/V+5F2bHsnjOYwl1lp69RXWUaXgTfDOpcSp7X\/iQm3fFwj2BgjnmIDuizzsmpXKpH97Mw4jZoiTV6jTwEysozZKLSPm0JSfvoHKMTXrq2MbcZZKr2TzmH66ddimUmEWDtaZ9mVtDyMNPsh3Y3DW32YAPeecFv4e9SHcwDm6pombyatm57Ziz8h07tuUGtQXLHzzxvmg+r11g6P0sgk\/j+D8FviZFK58udwMZ0CGiXmBULW8\/GS6PW+qnbsPigAc2MkzFEeEyI7+KhL2I1fhcR+YM77\/v\/YKa4A+d4dveWohCmFm\/e3+vpjDgOwo70kKJxvdt0j0FGQLiv8Dt4svnkEFTx6VgtHEXuZnP0yTDEWemrhUSbhe5wLvWpTvshqhcBqdhoR10m32jwY8JKLlbpueP1OeZGSpR6gA7ps5G3eeDyh5IVmYD\/4ys2wUwvI7Ja8Gv8SZfghS0jOlKUDmKAOtTURxgE8ut3KU1s8RyNDomuW\/+BaKfPU9XvIQ8Z2M2cQf1H\/hN6Ha\/oA9VR73VT8ChmgY2SFKIbNLQrFcRKkmUZUIy83RKP8i2XM54rGrj7vfNbpC0b6nvFkb0TXtMiQ947FFXfK1xkkDWc4iQBWDKJDjndvytLFGBBJMt+Aquru39qNBDpLKH0lj7gfKFb3njkZCPPRHRp7lD8A6fHFou9zWGdc18DpnVM49ESKMi5eq\/skWhwCDmU8Zxo0YeJG5fYt4xhF9ZEotKSNc3EtEDXckFQXmrIK1pHGds+ieAx7sADhi3G+vkzpt73+pjV4OTYwCBEZIMc\/CSmYDlKTdCove0UYQmIRc6waiHqF387t16VfgeENViQldCrf7rCPe4kQaAjY1EaE6ct86aKQVQUt4TlXmGrTcFhg2pqftRFrf9WmBDiBaLAYMcOswTwBlQK\/XL04ljpVAA+jj2ZXrperqLZyRogYglI2hOqzj\/xydze79mYZY561e99gGdKXtgLCbtV4NmEe4v7Nv1ZR7AO+2nOnNS+v\/KIiZdHm51aX4GT95YneU8znAIAHSosTCUlLRqo9MhFQj6WfhO52t4aGLGMyjPjsvBi1JkV7GjjmxWvTwZZhoCeWRNlVdnjxRMZrvUPMf4xXKAPPkHc9iGuIkozwCKEoqRlrWtpL\/sW4yzUGeVaJLpgx6+ArTLMzVytTbjmZ6GgmyLI0mJMkTZK32URtFMGkvAufB+0LNs2Fk+JnLltiUlveZ4h+\/QCrnGJWg4C3qUbk\/I5sPy3pMwWZS4yxtw\/sdd0IZE4\/9s9OGRoQm\/lU9V32qjfBi7E8QwQuP3BkYpjx499dt10lGotBBA36SxOCKPhlKnershm84U3JnlRQijB0BiGtfu89VKShfTuzAP9bZOMnF\/ep3v66+cvqj8AG63f8yvQ+6QMfqSFNI\/L6aNuJR7f0arOG1T4uatzJ6NCrJU9xS2svuy2sPuDDuaVg4+jE4\/voyhse1OOf1YhF3pWINtPVM\/Q3YLVDmVqkOyk8EM4w0JE758IqubFe6qZg6ZFeM6NHhmQJ1Pg8Cpu9ItM2rb8d4RRhHkwd2en04KVcvE0RvLb2go4PTzEcJEMSw3odUqCBjaRlT03w1eJE3KdV7R25IRpQDyU6ydz42I29lms8a15JdsYDP2D7N8t\/IEZrD0lsFPdo\/SrbLtasaQwL9UiecrSO7FR3nouJYj\/WxUeru+x2DjjGyeWUG+3zriUAdbwzJCc7tc0Xaf2AmB9t4nG3dg2oIMapnWmAGvE55LHImEE7o2+UwaNt0FZmLJi5dsX0NXyxwpLYDm9hf+eDxrTn2shOzN8WXeLdJP7K8ktBJm2ZOLgTU83Kaf47W1pWPkp8XXbuQ+JdWTLOFcHu7iaRJZonlW6feNNBs8Gr4S6zqQr7Z6kmHeMjGJ36WgIdKp7QbozmmHzvcS3AXKhT3JmPm5T7ef6HfEFkd\/hltwkF1nTtslqm6ppRnSA1se22lPG\/pHn86f3y+7Xgyl7A35SqP\/eMH3y1vjfjYCyWCi\/m\/9e9LAAAAAAAAA==\",\r\n        \"curdecagoles\": \"coeurdecagoles\",\r\n        \/\/ Compagnons B\u00e2tisseurs Provence\r\n        \"compagnonsbatisseursprovence\": \"data:image\/webp;base64,UklGRhYbAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSGQOAAAB8Ids2zyp8f9dz6uqurq6uq22FzUd17TpxLWz79uYfd\/jSOIEzSrG7MFkFs0sSjIz7wRDMpsoohhEEUUioohERBQJShAJEZFGGlGkaaQpHh4ebs4\/Xq8qkyAN778SEROgX\/3\/q147JDXNx3Pu+tHDk3TxgEXP9Tk3bFlBxOLAG4Xhym+okvlRZVZ+OFI6bTFlYWjHVckwxN1iEczA4DU3\/Mg9eCYaQDQsstwNO\/QyEeP4IfBmvr9j2FE+HI1oD3XfcBKitz8OOz60QJVul+TaZp8jEG4cbnxGCGxzkuS6t7Nh2thhRvNQDKxJlG7u7LjiyuJkN7woQdhbUN2Jhpljz7BmhJzkagw7myZckqjo1NzTWxqeJJJU6FwEHClnObkLcVIukWspOylJahRG\/hwFyaVcViFxhRoFydVwkiq\/gLQbsYFqHOTqDJeocCE5SQ0FyZWVWXQFJxWcVK7Dubok5ZJiHXKq26mhDud+GVrNEPg4NUNquPfR+7pTSddzT91flAoqjejqufPuLsld\/+CNY53UOXPBWw8\/PDGXMfapeZ9cnpGfUWkrlYpdU7rbbpr3cEtWcslDD1+Rl1QoNo6bNue9a3OplscWzS79QubigSozJJXaSvMMYGm5OPcIwPlH2lReRx\/gn+g6CJydKj1P5vHekeO7l4HHdzepZe4RMtu2xx0Ai5NcW8OiPoD+7sIU\/YPTAI9Jo28Co3\/yL+JKgoFxfrIkl\/yGwfHXLln5bL4d1j1+51\/O8gcle43FPa8D3DDqf3awSb8Ne5585KmPOFtuWM7zHcWPq1\/m9ASnr7tyNZ9P0wZY1\/XqaSY35t9g8KEbZiyF2e36xFh\/07OR69Rt\/XPaHxp45OdLNIcAGH1jnSR1EK6Z1aZiV+4wLzdK7n1\/tqKNrB5V7HgknLtmTFfTdkboObqUjGxayU7lxhQalOwfyBdWhGYVm44dLrdsD8+2VPQEa8ujfrTxhcYZE+dysM19bTfmr3\/pwdNblbOPR0uF3C+gHL0BnGtX5qu2XKWcVBrNIaXdfhbq4+OJU1Jil5JisogGPUenVEiSvkNKCl35Rx87POj0776ypG9oc\/1fJUlJBXbpUj5xSnoTfeHb9VcKUkvzaSslnLnrlqSQ\/\/mmDAQAX+1V9gImKJ0r2JIMPW4vNqz9TiqoGfKSxmeMUvrrOFKldQb0OW1kYV5jjh9IdHSxJHX6b1W2Bcq8gcv1nyNOkvad78k\/cwr+Mtr9fJ\/iAQsnG2u8YeMmpXQJNZbZdHd4vwqdamark9STMTpjC52N37Ji6tjQ59Q2MPSHD4ZYLB1LFV7s268K\/\/ldR+qxcJvWbFP60JnWtsL4hzbww4gLy19Ax7JjZmDB36CarzOvqSznNIbDk5QoGX+UFwsLhxoklXhbkiZTbHyOy5VU1FI90fAyV+dV+HYoX6hsNbBn25z2HnVS49y+3bnRfDNmSatcso27tOKoa00NSiWp+DJfXFhnfW4NmZEPEz3XlMqVDw7M7ao0qN29xt5ioVR+bWhNqbTrkJM0lcWpy61Bs7nTNXe1fs5HWuGfL4x7fHeYf+eS\/nBv28RNFWkHiaSEPZq2l\/\/1JA2zZvP+JH35jZykfUOFm6YmDaPnsLBWrqZLKncntdr6qxGI9r8xj099o1lS0z2XrYbv3v9ix8pRbefxn67ZNcjXTqsPS8nE2fw156TLKOopTh3461cwu6v5Qfo+2e0J\/PE9O3PNTY9dVeq9+\/wSSXLV49e0TAuwesUgfTeMKm3epfSRc+VbOLZsW\/\/53lrVmqE61OMyGpIxP2CARX\/rpPWevSPzL5wGLJL2ZzHSIbyjf++c\/ofjQKju\/ujSq4Ibvz8AxLBi3CUjDpEZyT6xC1hbkZor5+DACTaeA2KVAQh3PqJcecOB+f0RIPZ\/MjWLOsOLWUnbBgJAsOdu3kIcYnNyiCEzsBgjgNnxM9GMH8Y+f\/MghEDmKNe6k2gxBAwatN28GWAYQ7evMGI19o+WnD60QTh12WuxamBktkjlNYCFaABZVhvPLRl6Aw8Q2apLzFuwlVpknjqNyLJlROPb5tMnrWoAFs+HeZ278GQPxRe0hUjaIsEq3TZE5EShTXktwEfra701GoAB3h8dldtBlWwLPou0YRDDwcc7R98zvvy9N8DijzdN3mmRyB4tD4PeB8sKoRr\/vZxIHPrsDEY6eIss2IYHLAYfPIu1NSMGiIOhpxdP4C0lidMivDGkthgBiwCRSitVAAs+AHVlRx7OFR68excRwFul4RgGZn25XuqNAPteJOCZ\/VcLgAFUQ\/6tGKjpQ2cNOH0Y\/CYzCFSUrnEjntrBZjXHkEpb9PXYyZvXEwlUpNJaPEC0fVd\/ShXAQkHPPHfDM4v3YBB5qLX1vtHTqeL5zeN4zI7fNvbDKqw8hhGYX+66fjl8qE1EYnXCYxuKCxYcOj8ABN9a30w8gcWXEcH4dhQRIutHPPsVUIcx\/+rNFi2ea9GUV09Ey6B9GlXS0c9qdGob1fk+nhjvUHoLEc89s\/FgLM2p964nngoRsJPzRkxN2h6erc1Es0PSVXldcpO7EW\/xXKm+XjxV7uqMHrC+e81Se3NSz46b6toDEDki3Uu25+bx\/dGywuZCYXKVngUEM19QMS\/tynhwTgrDnkpuLyWDZqT30qx2aSMR48jO745uGViiK\/AERl1YZO3c02aYnRg\/aKTP739Qtck2CCwujfw0hFRk\/vNnMCyDVR3tLxMfno8nxtt1+yRpC5FA7\/0xAET44eDEnj8SAIuE1ztKWbW\/z99FINB+YbUjbxUPWAQMWObqM0gtanr9+2iA2YHx3xIxIoBxfOUxo7oPM6qJ0ndTJdi8cVQDgEUG7lDDD0SAaHB3rRjNQuxvvD6jI+Od+mIAzA47zcYDWPScerQuogGRO1prcLpKxDAyjdpGNZdxM1WMY8kVYBEgGi265NR5HwGCp12bUxZjCCFY++N1XNr4QtZVGZmemzq6tJpqMIAAdUWw1FFdhyc7YnDbaiKARTPb+jmxjlupmp0slLuvXgreAB8\/kW4CQgA872lrqvY3pzEC7ZJumLWOmJqSEQ0shqKkyseAAVioi3XnMAj8oXIyWoZh\/uRYPUM1BVQZ\/Rz+Qo4mpZI0bieZcWjstaNv\/d13YGB2KreaaOz\/atNnf9m48Ul9QCDwlpwkjxmDeplAzWivyilZ+OAfPZF0HYGHG8d8YIFo27un4zMgsDqnG87WqLJd8+q6jSqem5Ml6+7tanj9pAHEA7wv6YrlGHim\/IMY48YRyu7FQ7RnpNz91Yhx1m0iErjvxRgg0vTsyjuub8519nMhnsvcyOUWCKxs+I6YZXw+tkkNp4mGmecvTvPruokqwd65Aw4d\/4seIoDZG2dY1tHhchsIeOv5JxHPBzXGWCC99NHPMDBwK4l47mzGg4833QFLv17fofWE+sB2gYHnwTKRzBD\/mcvl1DD6GETgWUnvp4ZyTkr0MFUir10ThuDIykEjfd4iMLivDzMbSFYSIZ7au3fv3t17Hyr0RwMMiEC0FdqaMadpdTSifZ47XMV\/f+C+PuxCAANCfHiK+SxPqzIv3zeEP\/eYJNePpZLUTiKB3Evmzcg0270diyGQtng+2ZSqs+lTCwDBR4AqrXoMT+CjxidOGxjbThGoHeqyCBAiubcJGZFTTVkdhRFjKi0ukdSXpfQ2IsYuMLBgQOTL98MQYNGgyjq3FwMsxhir8Uk1EyK1PV9LvXg8CzX1VDCIpC16AzOyfO3o4Xb9k5gy292dz8rlympoSQpS49mq9558Kneg6sNQ\/PTuQbwPZsFX+a4yC4gxEmNgUaG4LQx570P6vF\/QmUwCHzJ9ZFdeui4O+vP+s6Iby1Dw3sdoFonRPPwji3rX9EqLLABhMI7XT\/jCOYDtSt98lPRMTT9JzW3N0m1fAxiwWL1rN1L33e+M0X3nqd3fKukq0scKTgep0wAGupQ9LXtG79L3WyXNxFv0nKjop8z\/5epVT03rvqkoSXOuWTvviZuUdLY9+MKqk33vTVt8qSRN69m8bRMbl9yo5Ju5\/1kwtXfa3FX\/W7lq6dTe2U5Sw\/KVK1etWvV5b8VJ0h3fPXPtjGkTkkSVRS9Nu3vHd\/851\/cl6\/f8eEtOc7PqdpI6zmDwwmj9lK5hkiSVbihILj9FTpKcy0vK5SQlqcwRzU6SOtqLqvda\/ZSdRRUl5wpJUZIS13hpRSWpKMn9BJnTtvHtWA1nk8r4VuWGM0o07L20Y7iTJMOd\/7\/POaklX3EX4Aq1clI+cYlUKKRcwRWLUmtSVy6VSy5a5RNnhnhjkrTs2PEPp5dzcpXr\/1m1AzMK0vi+Hklb3pEr7PbGX6XCjp33f5XTkYWSXPHW\/eHcO12Nym8\/OsB+d5Eax9bfDWyQtIZ9A8dHdDU0PIn\/4wb8Q01qO\/GBNJ6xBT3C8W\/m9CqvzSwc2di+d5+TrjrC8WdW8FZTrnKMI7N\/e7Fqtpu0Y7eTO7ChOJ+rK7lOdlWUK\/8w2KL8IkruxL5il2bGLmVug5sbmzZ\/IelFtuSlCeVcQXu2Neii3cwP8\/ixVVp\/6p\/sLkjt9EjS5OoMqWJ35OOjStTEj8ue73bSwTULeSw5+KWkL2NJNfec\/GjuwxerVs6cXtvrpJVwbkY+UW8ckypzt6QP939yPq+CmuFs7HHS8VfzfbH7zGeS3jLV3saAf+9iledyNTsnbdp3xZmD+Sa18lleyu8466RkArwqSWWuk5Oko3\/Mte2CjyW9Gu+XlHOSDq1zThfrBi6X8nlpy3ZV+I9rdV9yYNL8U8yXJLeWkVmLZ5VLDdKR5Un55SE2Oul6mHPXvHXX5KW9u2aOG9d4kerkrrLSO\/4tbYklya0DGGpL6bdbcqlmgO9z0tE\/aMrIlwY+lzTxgyOAXTlC+gZgxEXqV\/\/\/OlNWUDggjAwAAJA1AJ0BKqAAoAA+eTyWSKSjoj+mfZpr8A8JTdwYAAzeEg3n5LZq+M93v9S8w\/dR055SHNfOF8wD9RP1e9Zb1C\/t76gP1u\/Z\/3e\/Ql\/a\/UA\/nH+49aL1HPQA8uD2U\/3X9Jz\/\/\/\/PPLf5v2vf4rwh8dPvfO+yR9XGFXhp3v\/GrUIdR95vwnoBe3\/3PvuNRHvb7AHkJ3n31j\/bewB\/Pf756qf9P\/7fJl+gf4v9pfgD\/mn9p9MP2O\/uL7Ln7J\/\/UsP+75kTAG\/j8yzpGoUjDr\/8kPsbjZRXXessmziCQvRf75sN6h4PGfUnklYVi+ea0eSq3ESmf2Xu22WSwIQGix+CPSmsNtRd57xDI7MAddp65DogQwcZJaRPKSctIkQkp6u+DwqY0sGceOcf4BaIp7HfZtXoy7u3ToAO9iaOoF0Qx+y4PACG3eIw7KXfqZBqvu4R95k545db3fuzkOSlrJjn6+ALBSgycALiqQYyGEwbq5MqQ+lc6VOR7P+qiv8lG\/1v1WZamuaGp6FlHFUhJ4\/PROm7fLs9zaS+s0P6LhKwDzG9C7d7958eEVsj\/4QtL5kTAG\/j8xIAAP7RxgAAhwwGzD+Nxd88Zt102jhc5\/mDbHHzzyEKtC6VtZUkD2cYHVHEj3lW7u9JcoyTCQ2kdkVFkTRdkelk1BVcSbwQsZ1o\/guE8+hQ\/46OnH8Ji0gnGDLq\/P51fwr1Qph9T8UiUzBvU4WfIasHO+\/DwMZFRQINuzKr\/sOGSPDdlmsBnLslSYYivBST3TsMTOVQkI1ZIxi9UfxL8Zk8rEbkDSfd\/YVBGRAPRaImSIT48yYkx0SYZW1DlyvKVXwJ2rWxvWW8k6ZD6Ri3\/nAEFtQ4eQwah3N8O8SZNS1ni8N9fPmnXWDknxR2WBtXrDymiNNNqcSHoNHRyw5yD1FjkYm19TQZa+2+4w6Wn8Puaa+w819y+05EIJEjmo4bMo8H\/\/yr3o+zo+Pc9Mn8inzKlnnwfFv8395Y4qPtKczYadb\/HvMJGU3YsekLamHIe4L6yuF3Mo3150qWyMh1GAO\/dF9PC9ftbj9kPfPseLHSh9N9J7Iqx+GYf6bKNQ2niIwtI8aALyor5zyJyXM2Fm7fk6MQaN6WLVo\/AictwUkrT2KVFdOxXQ2DC2svzwzjgrTL7+bfc775RoG4Yes+fiEMa46hMC9y\/VnVNr\/o8aiVnox+k8XXOh+yJvvdCgu\/azR6DJa0ihgirGU8WgryQ9IXTX7U3c\/YfOHZOUljPiUa5FoVaLANV6X3+fWc3GhC+vE2bhjyjATneX2+NfTi5j5sDBoU8\/kWa5fgghcE3K+aqDbMrO53uHGdTxhL2odBJzKKnLYxLpwcU8\/zogrb8mg8OEF2Uk88eIT91iA3IUgmng8hHXlasxQk\/rhrUOjMf4NiKwTXaltSu+rdblRwHRe76cd7DPSwzMeDXEYmoS3YCNFjMZ7q1+Ye5ihCN6aBQp\/8WO+L49eLf2w71fy1Apgsch1illj3iwbu9b7NlpjG7fSnYMDkSOLXugQ8Pr\/BTBewINtGPremlod8t01VcvopwxhoLLBLLPIIm7XOHkYcuCW6OjRp6tpF69AU7Z3vWTgFjCzJzBytFm7Ngk2SHtjPrQAArMwijYLU\/5zpF\/1Qr45F5mz7Ijh65bOBlilks03R4u+H9v3OJKaY+LcDOrDnoFxwylD1kc6iZjHgbQZX7305OmczIWlYGXtlpwz747l1w\/PdGxy3IXVMRMGPBdM09Rwy97GWPgFZVvK+a6vrJ\/Pkbq1K78N\/p13aDPldnA7D\/aaQd3JztIMKwUFbHC\/P7znv2u8tB34UA7WD4GzUHV8tk+bPvSjMcBjrv9kdtfF1gWkkdAz92DvVLqbmv\/ksjL\/2xVf7GZwyc1EAFh9bhMcyFKvfKePzBU9YpywrwbN6\/sHdmE4s0CfTJty4FAnJkkjiAHiiz\/T97kw8mzjLG\/J5J\/6NxSPoHFNnJikWM44xFK0l\/TQ0KnVz5+wh0Rt0o4\/QATwkDNu1dh5gx9NRMu8oftU6LU7hv4q067oYAUXfBAgYj7G6Cp+CS\/Df8lM0Ezi5WMJ+t+eWfIinJftHy6rsNw0MnHnyU4r0oStVXU9ayzbnc9G4wqs\/ytjBZ9dJAC\/CsisbEC23g77FFpH8BsrJA+Zu4I2dIJr1P2+W7uAEr6tcW6bNtQpLQPUJwJEMC8OUeezgKT2Y80hHaW3\/IIulHUgj\/1ueuFAvArT6DqNZFCqcjf+qfZGmpTIsHG0OjWZh0ad8d8rk0sa4enTayZFe4qg+FNj+0WEJ\/wKdCK5pqGzP+2kNR6PC08xDtUu1ENij88epiUNZyZ\/pQX2ySz6MW6hMtiyrh4xN0JMQLw0\/kjHpiO7cMjkyFt67l1u1dqsqhO7SG7KGvttoxUvYP\/Lu6h+wyAag4kitPp3k34Zikc3P0j9+ChKUOqj0BPwv5PEHkSLiiKf\/UQ4jZrj6W8gbXWiTANgLfbD0JfsWe7xcAkvRG6tHdOnCSXBD2WLSTqx6\/nzAy\/2oU0TB+vzrdfR5CavhVNWyDEIkRcjgCX3l7FURjxHQZIDOdL+XSFprBIFaEClO6uKnBCo7GvklwuXZyuCHHOkDu69GZM5Pg3NxruqHkzUWsvrZN4En6nruSSB\/6\/rlpEeC7bTa40i+i44+pFO\/2Dgim8HcELruaOxBv4FMKU8no57jTeqrPijRB5OHWNlrLH6XnUBkFtB2YeNA9K2AL+rRp3vkjz8+i2Gy6tZvoI1y5CXAiZfdkdcez52\/R7+V8KHZmt2dLGb6hv34m50HtO1Pc99HZ7yDVpzCaTtv2sl+Bf5EHP4vPGZah7cXWpZgbrcgAijmmZ\/oD3QhYD7+Md\/yN\/fVUMVkIBvwfvOq49CEETZNZFvUfZPfqlm\/qiOzpymmAoDalxxMtalAtnmc9RcvYcYW36A4v2ovDzEyuDhgv6hxFHIMRY4iZwzf+O\/z2Dq3ckaPfR2m3w2BgfS9CXY4tzVokL\/zNlJcQijdP33BA\/P81SF4mCELXT1Z0lKEGtHxWuQapt8210MrQ9kDi5QZRLxKeb5FiNWEvgc8nKakGo8v+dJqXl3ds83OobP8w25pKlE1NT\/8urMg2Xmnol3\/4voHhsyUUQy3B2vkOK6cQ2ESAPvE+3OW36nvmMAMm2bzxrPWdiEmREt+OjsTW\/16DyfrwqLoBmgsYgAvEoJbBqMEH6oyBeALKHwhvzHXxJ+ID8z+QIexThFTuZId4RaqhSEyO3vd0BviOs9Et5vDGU5mopc\/GvEantmOdg21UCUsStEDBiUUwomfHztQ9ruUNZuEgfvYBmDwSaD5oMcQ\/Vtj+t0aBzyz+RT4b5u43sVgYAv5tUP5uICBdmfX3P5Ft2lstrcJsCGUw\/uOwkQVdp266B0E4\/YXbzvBDIqX42hEpbiljNXsQahbeAGjt0NyYJs2WldAtiUUKtHGBIZ3DlhpGHkegSEPpDEY4KvbfzdoyhBdXlwmS9mgibcBcTe2Gd4p2WH20uZYZD+cLw62UBvv6ehCneta+QGvRdq+fDRds6ErHAVDwJWZFR3A5\/nP59XtrkKcxTDNumMHmeA4HUqaRfKh77D2W8lUxjbeQ3NKo7gY9lHFWpNciKgEjxkSj5+tbt7g8GYsl5rbPJ\/ESfI3a\/n\/g\/UbA1o\/2VerpJi0+r\/A70N3Fcq80b5Xo4atyKcZ2r+80wjYthiueO\/x76yfmwNWmKqDSD54pxXF4W54OmgTzkyiOdGbf9ZBUBtqKCyzo0iwRsKqZzGzMvbh0YU2Lcs4siytG21PCEEGooAwHmKIjviUnwghxpHMya5E+UaOzq\/m8sMZtuR0svlqQshS2uepTksZwQdh4ocHjMajEWT6UjDJ1HPn9YKkhpP7yVJzl07G8cb1Tvg4+7TEASP84RNp7w2tBsR63AJp\/NFW61q4835daqZTevooWpSIkg\/DLde\/8APo84nIVsGpLKGrMSKFP59fV4G67I4ojf4xCdqBFPB6ZOlxC4cfDUY7bO308IERaT3\/QDEDXNj6PQ8jNaRT6XPPs43ZmKVnB8PWvFWFWhUc8QuEpGGC\/DkL45CrvFpfciiakjuupxFGiMZO3LiZ7vbC8fiuOB8AEilixCTQEAt4AuTbGG0qqruS5DElg+AJNtq71e087aMJKue5M4144Kc9hcOFkH3zI4QD6Nuv\/6YApJdb1\/F9o8b08WVP5eNWTmOdyldsk\/wGpflCxFB+LQBoAoxkIo+ojBCW\/AEt5nRvvrA8AAAAAAAA\",\r\n        \/\/ Delta France Asso.\r\n        \"deltafranceasso\": \"data:image\/webp;base64,UklGRjIaAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSKQIAAABz8WgbSNJ6yx\/1O8dg4jI4Ue+RD4EISsIISIikaQpSVNJKaVUKpWWdt1gff8nQ5KtaMxsz1rHxpxzj23btm3bts\/ad21PZ0bE9++bruqqrKp5dV5E9H8C5L\/wj0I5egrSbrcHze5HnTgwu9VuTym6\/2rw0wa8hAKvbnSun0pcRB\/j9BGRRwisnn0OEPnfFGICwOHZxzgY+V3kO1X4tzVFGBubGf+Y9heqEQx04tre8+4vtNZ9OzV4AGC+\/IxCnODDP5ls\/H31hyyUI2+7vvG2uk4wS37Alv5E8Gc6aqbOwP5FwMtNt1TN+OixbcphXaLzdWCgBQMIE3zQbLetkkOJQOTRRThGblfHHto41mh3\/n7c1+oanIGO5ppsD6\/bM9Zk70ay1Sl867SG6nQ6C3DXDMC3hwKiK1tnNtIxDhi5I+P7CwAc3mmizz0wpOuumafsC0XgyhujzfMqPkzkLZHviEWAwnjTHLqv9RWaT+OtImPbsELQwFmdZjmGG9fi+UBEZNqO4IWAsnq0UVYxtPvPLRGRZwkFoex5amZzjHsMPkSf42Tga4SCMOCZblP85JEhXdfPGySvYwXh5hx8qBk+RBlW\/WvJfqUfCwKP8NlhDTBjIjK0cXkO6bsXBR7Rs9u19xJhKGeb5D2N6IWBGr+O1NyVKEMHzs0lJ2JeHAS4sd62mw3lcd9x+eRUgpeARa7v1lfrB1OGVv6SYcexMkDZO6e23kEpwJ4bSlaYl4Jy8Iiamr+j7wUY3eHGCeXg8G0tzTWc4c2XFCCPqZUDfT5fWD\/z95tSYOACKbBDaSicXzfzAkYxtxXyi1tZWJ\/re\/XyGYEi3f8\/UoRcQygNlB3T6+R2Uwo1FkuRHYwUA9t69XEOkaIW5euOjo6O\/\/T9XySq7Bqri\/afUQty3T5rUO+qy6+66gCJK1vHauI7lKIjz0t7xsw\/luxisrmZqiWDsqdXC4fuD14YxkN\/MjmEEJzklS3Ta6DtOCU6qJk5FVV29ap3H0qpwcj2CqBsHanaOH1qPXJtxbqLzFJx390HS85tomKfoKQrN4f9pK\/hs1aVTtgVPAU3i\/bHy19uh6W78MRQjum++NWD3VY1SFPJ\/PrmG7uLzFLDGLi4U4HWU6oJuGF\/3dsbG+tNE5G1GBV0VVOWd9M7gkD5Dq8cJtmnoVR2gieTG12pXp6xcUzyvkmoTtR3W6m9TKB0i1tHJG9vqVp1iMxPrLc\/UL7ymOQ+gkh1gz8jib+Claf+luQ\/0irFi4mN9Y3y3fackG8DXiE9cHpiz3hIAHcW5NpRJSdK2qMaSVJ5p5Vna5XUXknsHSwNIM\/FMVLdPocktiIZ1zNyPEWojtnqXlqnHYwkGvkmxwNVin6LpH0lIRXXlTOyHqqST0ja3V1OsoHT6iBwSWKjpORHZj1cHbN\/uol95pqOcqdI+8jDjuzKPdVRvpfEvyUh6B\/15j\/A6jfXYFVxOyKxacvNUgpAiIEqO+3ELiCQdjTAolUm8oQkfrKnVnXv75yZWGst3ijKO5J4m2ZVvm4lZ42ivkCSb3tZ7sHrhLvTe4FYUs0a29L7qKywdelxW\/EaWZreu+W4bZ8psgRrsvfKIfCknHAgeo1sSe\/9kjDrfYxSH\/Zgem+UBReSvpWgjCU3tsSsLDQ5o3izH7vJHU2gbCdxY\/u0tVhBfR6R5N81Ky155UpZUpjZwvSoX6Xb3eBejPGFZLfm3rB27edzE9BauoJAsZG5Ob5h4KXlUUed07y4Q7PmEcxd+9zUPMas37HCDsn6XCOTjeaBRyk8z00hMlhL8zrCyms7nkFp1LFS3kMaSGY9Xj8lZh22TT3LSjvWYwNtwclZWusXjY1zdr9PprO8NDkGa5rW325ZkSPLk0V4w5yMkufEBI4L\/YZZa5ZHj01AFqHNsUDkjBDIjrwvKR6+15rjGOksxfL4l0nIdR4awtkibZycxoVpdLabN8UOecI0h7NFEr0JbYpt8gd5AmelIq\/RbwSCnvpyHo\/7j0lm9gG8EZRfl+BZqt9JuvM2960JhnVmJST3o9oIZjk0viYpt17cD1Y3GmP0YfKabpDEZ9y5l5p1ylXOSE2k8ytWJ85HTz\/z9D68INNV7fTk+Il+nej+ERFZgRWkEx2p4hKsELNKBB4UEdlUlPK4VHLBNvMiwNwq870XE\/0Lqej1FoYzXfo9VcyYTSzo8Kq0d5kNFZkuo6Oj36DJ3T9p+mb1Aoy\/pbLXoMME3pHJHxGTe2qSPEl\/OA3LOtXprA+eL\/CWDHwvuRjOHXBBCMNFrpYK30o\/V+AtGTi2QT0tZ6MM3oYNE3lSKv2hW47A2zL4PiKJ2YGMORv7ns\/04IxqzSD4IA+8IYNbmCemXJUhj9LPpbBAKn4WMWAhGLwrg9vfByNtC2tHslpfMeEZFgkLpfKLGLzqNckcJ5J45E7J+wnYQIW7e1KD4zdP\/HnTbadK9vwDkcSVtyX\/LbsZ\/O9FUpOjLcn9ASEx7zNnCOn2Pvnrt78e6rWllu9CSdwYlyZt7zVPzFkhTdpZZEa2pxEYb5SvUVIPnN0g3Zf2mOdZvRcfwjMtRs9zVoN8wJCnfYUO8DBQKbRRjth70MGyHMDMVMncuGnjxo0bN2z8a8Fh76IZfmZzzN1x0MzIdJgIkcm777nvnnvuvudyydk+aGRwXnPI8yj8Ggc4u9cDS5bdMWPWiAz\/Dhnmf7UbpHVN+PGkeQfUwXVDr3XNNRdJ0UuylF+lUUda8ikRUL6XMk85EMl6qVlE5hIZ8GMplxEyzDtN87PboKWlXJQVuF+adh0DjFNLOT8O8rCm1zSXaWCAtUuRNcEAn2CONO2dZNAr5xQ0WoQXW03TU2Oy+W\/tclqPAay\/XRq3w6DABVL2jMOemTsizXtBjltKa+pVg8xXt6coP2TYMpmirrQBgSOnKucRgMjnralKaz2G8blMXUevtmDftqYw\/7UNVlA4IGgRAABQRACdASqgAKAAPp1CmkklpCIhLhl6SLATiWQA1QIKX76KZseJt2J4u5Ck0PZ7+7+6L5r\/5r1R\/eB7hX6sfrD11fMx+xH7He6\/\/w\/Wb+yn67\/AB\/Sv8B1u\/oJeWd+5Pw0\/ut+1\/s4f\/\/OOv5b6E+\/X8r\/UfG\/ys+9\/b7108Y\/W5mx\/CeMLkawCPZe6sgC+tXfp6kHhn2AP1m9Qv+B4N\/nHsB\/pv0SM+D1P7Bf7D+nL7MP3P9n39uGp5PC4iG7KDOambRb4YkqmReuHEtAYRqUuAXwAEiSl0X5At073MA+y6taYGBmgne3koevLSTmAv6QiKckBFd7VKfoMh+SWsfg778yx9i4eM4hkdtUj2pT3QN+1uWKeB6PHf0s5iZKTxsPUrRJc3uNG+bbqOxraMD\/\/N+66Dgk0qnQyo\/UulwQ3SdZnrKhpwkfLOyJq\/\/FooUQoS1N5w4EZJAFjd+\/LW+sD3reUdDPfrEvHqHxd\/KoybWeeqgWXfnXy5WGH0ymUt+WmQqSNM8P6H6tURUWArdN8WyrkrWy8X0qoKGJh89VcRl+aCoEvS1B6A9CpT9tiHlNVs03zustrBurXo1+g9bsDfjo9yuITV76cxiDifhLYwmeSYT9yCrILE6EO78TountSCgfp3xwORPK7qMAdjqkhTqbYYzIs3yw1fa2ra2umTjFSSAtp2Qd7YHkla4OHZl\/5kB2aYUpsCuN9fkhI9A+FOOlnWZuGFrpJ4AAA\/v02aViXooo1zd5wtD218s+5m1qKHfASnrKt5QCWW7IgocnOXoCNKjep+416iHWdsUduTCj4aik2ZfudF1Dfz3\/sirIC9BYb\/4f0LGSpZAVzM9OMd0wC+Q0GPdNeArBO4rv3S6+rucVLsAkSfsQMAP0NHRCwgwrHb8XRBG7Am9VtPnNOcvW108IKAgiP+CrcXGCVemO98qVygqlDSabyoVsZjDxs+o6ul6UBbDjyyj7dCBtkcy1dWH5S9gMnLcSoa9cx7pl+bCUDR1mxVBSwj66qACWtLz0ql0KCEzmLvAeGqYs5yFfyGhtdbeTZxPaOQsCbfl8X4hxesIX2HD4jKBum8+Zz48hIwgPSFJwe8e1arFdH3y0M6ltCdtU3np1YtVUhjmr28Iwt76uzTbvzJdgHoP\/9ugucLFQT393IqODcmEIriIy53n16S1qC\/See9vGwZQSyMa7AkAi1eAEe4nQNdv+m2v4pP8eC3cHe+l+uwRX7sAphnP+\/SyBvuHcQUw3MUScCgB\/KqwMIwac6c5xNjAHIbt9XWZ2GUtJzqJO4QRxOAT082XL5tHtPpYXgEny+lLL86sMNECnKLDYb9UA7+fPulrvE1sNQgnBNc\/fn\/aISFDr5W\/MFZSPKHazXbTCvFVlWoD3ltcIlZKeAbSLAWvZfjp0o+SJ4Lz6f3oZZg8s\/NDQMy9K\/6\/gmpbX0wSD8LLix7FO7NJx4iFO4A9xb+qZSf2NET5x2KYCh+fYSa11qpyVfOMaD44CiV3GfygbXeRDr75CPLSbDFRlgzRwWAex2cj\/CsyHimzbCU3Ny3z+pj3F6z0o2kdrSmB3ZYf8Mi9CctQGuK11R461ME8Z2sbRLK7HNjG1YqJs7P3O2TAhRelorQvsyWsmuHIhidqPhNqEW4IuwQVAjmI5rokH7MpjMApMVESe\/\/H1kf6BnLgm9fPc98bRjo1+oBt2viOUv1qs\/LoOpJKu0VIGQonZdfwwrNXBNs0jyQmhcraG0rd0wCfwixQDsPQb05uhN4lFvDsWF2RCP7QaWA2xPMg0+XDY7W2rj3izy1NxR1QBTvbEFPJW9x477ToOlSJX00c46FGXvjqoygYg7QzlCgiE1TZMdfZ+KdgwmwxRNDn7b3UP9xfzMPQQCzh6y8dk+zhG0hf+7TOGt+5nA647zAvhO8WdRFmVGPyb3anGJiuBG\/\/Jh9I4cvhZnrd0nwBJgORfysn9q5QxCF53nqsXMuRGDRTSGebi0Sf10p1HQCL3O5SSwlOPRI1R8jTMsjAIWLWMxx5T9nM\/7Nzq7kymvTpLf10H66YGSPJkRVzRGxT\/4tl8y\/iooQoOqmqDP78iAZb5+Zat3t0PC+RRsz5TqJ0NCjE+I2D6v7+qbyPgVyQu+L952g\/tEfMXml5F8y\/wIJWP+po7vniVIoUXUhIHCe5zE4S3Q21bYb6MWKEQhxGiUSIFIcEU9+khyMEuFHNa7UIpQUsrAOBYfgGltycqAopqjpWYYXmNFlDV2zPXGvIOOv5aFJ+GEoKwTZ5Yc\/9hOzevIn\/W9fdzwUQ8jOjj1OYJBBKz3VZP5qDTJNUadfztcOrswuZ4dyPIsmCnPjZ3+nI1mA0hJxB2xWRvuPxgUzn94+yPZN7AYKXT3vqg6eE7nuqnFMqKNalBcogTCAMQ8rMJLBBOjmXtxrUF9skV4hSnlO3pjzaeD11v9CVoq20yyIB1UEM9e4IjbBliyzf6Vsn+TwJgG\/dg4byNnulvxTX2ceN1xyC6fIPaXkZpHTGVvmbKiBgKQGu8AMsrs4V4oK2MryA2nrGsuBcTSiEFsIcpCo8i38IEK12sHUFprhjx35fl\/6zkJZ34wzaYCircI+xGi42s3hgeDx74mSq0A5uDmDZDF4M+gs+jBi7x6jUkSPn9xbK7YRGJfq4G0jc8Td9CZrSdqp1MH9zme2jJuk9LSbafUMltFxAivti\/wohzwsYD+Fe7IMk6jb9GnESdcUl57eFEkoxqK6NL8tiorvGhDkwBCqp3EZ2B5JEGN1lyJ3qVJF2DHqE1BmT+H\/JNupcH5d0RaWAsEV8Z2Czob+Pwgj7\/Tg4dUooBUxjKwA5oTkQ7ZY4qAVDtTjr7AgdDQkBf6hnq3BdNS3x2klSJQ0ZuvZahaHHUCuXbvlJ6cJybr2qtmgvJKzUcWpmUhfv9IxEhJzBhAypk5zkjIUmf47nptf39frnz5y+YAM6JexDszAJN6UqzjpzS1jdKZ2bXk\/Fm+GEbPeeme\/WY2QsveiOE0sZMIlrLOThF5Kqo7Cd8efOTZZqNqE0B19eHuD59z0ae37yGA1GiijZv+eHCnu+r1m3kco91QGpw0rtLK0Ee8v7i0P5LtiOso+x8XRz7Wy10Xu593y3Rde7sm+WtwHmXjKfnNALLOamqlhE2WglLBUNMvGngRpBOYCgWeb2GgnKtufEC26Eq8QIgIlgpJEoQZIUu0\/oL10Zgj\/nOT+LWsg8GMnSRamOjWV0B4jkHeZZV2DCnh26\/f7z9GvsEvPf16KSlb14gk9eBxPQF2kXcRMVK2IVdI+PHw0PFRAr+VEgZ+kf3WUOqudH1q4wDZW31rOYllc9vA0hCZc4rEY7JdKplAVuQztJHx6PCO8W\/UI+TOyO1lo30wV1sqYyqCg8nTPYZlMS8Re\/a3t+rzq\/rzDYtzGoGlcOrgruZXojHbHXlPC8WDrXkORyVuaPvrujJn\/LAkj\/eg2xOfrjanrylNIQzOs+IEhbWJ7T+DMcK2hsv1g2AzzY+LPLHvCstEIDrFtH9p7IQUP\/J\/UFsr0BvD9CVVIm0Qfu52aD+ZsZ4M+mg+o\/OhC3Cb4jNlJFsuqdaL7bvHT1H9npHR1hBHDQjycc4It4cAJMjXfV2E9WZec5Z3qf4fIrqXdHy5Q1BUB8ygFgz\/hnJXKHZ+Nl\/xGMUDGuK2aRqyJBMHWhvyQSIT9TMLPCk9lOcLJiGpP\/Ud8Lc4+HHhhAajrUut6ijn8fRr0iBd93sO3DH18Jc52mluNZLTgryROCLM3C5oGyAUAkjZnY+jnSJrSGcjNnOwQ4BScTjULqDlRaUZc7GNnf5nAJX2KeY64Bfo76KesgW8Sh7Xo4XMu97tAWa3CdUMJCk9GZCkclyKFQiEHnWpf9eImdqiRwsNodia6NEROLwdzAdoFgoDxs0PhOq3jizxL0xfmsB2R7DG1ks5T09L8HzjxmzPFFgqO7y3H\/Tlm79odlBqL64WNGU4buMEqxuK8v+uNsOZE4JOrsgeakE\/y4kiyIe8nS2ifI7uvOV55zGsRLLXeAsBBFs3ewv4\/Qd972c9yRsfEycRcs5zn1mbPnWF1c3pIATugRm\/YrC7hQH7z9cyJaLihd\/8sM8TJAoqxHs2iFWsyBT3SLKaXz26IQu+PYn\/1XnUIVJLe42HabF5N4DfFdHUwyk\/ZBLjGK9DoueTDRLEL0h2AMw7kznHZ9mfzbFqfrz3KgWx2\/SYLNN4XLc9rVVqtIK8g3hYkB6X\/Fo9F7UGCo6os+3klVQ8Vo4LFRWDbYSQDjWk7ZYM7+aDPSgOzbWTLh+kUK1ubge5Aisue\/MhzzqwGhgjTW+z9H4B7qd+g6BFSUJu0DQhIpYhcqBf6yilMyoYwrzSmNfVg0o2\/e0APghletRhL4STmjzGhSPk8g3J5Cg6cYktTftbrFmvNVgF6fxz0huBaF\/rfPcYvIoii8IiHfXqEGWPit4v0tcaHp1rjEP8RM7IOyG\/OiLcTyYBgI8hxGU3jZ5PnUx84n\/CQchkM7P++uCBvL6E+bpd4ZdnSfCR1vKKBZye0BWbgCNCNCf0XyoKYv44qExORIBjcT9qLw0LeCG+Z0tB0dVATPtQih5Frha\/NEl53WITZX+foo1OElzi\/9wmCFRhta8mu\/nHm0SmQzRqzv3iJMRlsCRzKvUkiqgqINfKYcIrwE4EOgSnpaXMI7Bf0kq+1Fz0XQ3OxFtkFjI2QSa4ww9lBBSdY2mDlu9GFsRcqSmFgtIADi68k\/XxrixmFy9IRxV6DwP9iaX73iIZnXCjy2HYqLHBGlqrmDgUCtgWEsa8zRhCC9ekvChSUS38Nl07m5WkIGxRpjBNBa\/QzdxnvkhQE5oYFw8xYVZkLvmWPv+YTkd9v5\/tr\/hckghbHewpP8U7Zeu2jPdluzA1WW24usnm9exxsCa39yCG9KZwAuUZnPHQRV0l2LBJhaTVj3oDUHTqIMEH2M5ycfwoyuIJH8tw2lM4lspa0o4nPzlOIXiDMu2m5AD8YQGVfXaIDfjYR+HLBAQN5uzaKGKUNz0T77urDne6kaCthc2UvudIljKIt7Cx2k3z39GyENmwc4f390eeqTQ3wSh\/Evv488sBPbPv2vbfostSAstLMynYLXGpLbnC4Igqp1CQNGQIbyzBpVnjQ5IaVke6wbJRwIxaxXclJ01HsOUbAJcCnA+f01qJi2su7x47FRlE1xFDVr927xxypQ4qnR4PZtMs88HgvnK5qmjuOpNxcYxQc0ST72VTOh6PCPa9TGT0qiC4Ut1S2NBDd0\/KBbvcX7PcpbCzoSzQSr20uvdNUm2IQ1AbC3zPAEcvEPXM4tQ5zMR8NmD6NEYTGJy7\/xe6e9NZX8yed5lv7IkQFYXy44HAWv4bocXy00hU\/dl1vfhi4f6+mFZPnugm\/GGheVeVmwfUYwlPViQ0\/TnElepwxT6BZcNU9ZeijALGl\/moJGMFkqQ5iqxEtHnb2\/svKZBxoVzAF5oxAKNBaceoJbl\/uY9zfSOU4VbjS6EXUgfqSwLT1lZoSmYBe\/AWIjMkUP63mAhQNOnfgY0y9MwTVA+C8p9+S1cixuorx1cuXwzf66n222XCplno3QALNsltnXT3eg2U9Sfj2E6EWtQ2N+S\/XYz3CcaKgCh6u9UiiT5lzUKF8I3oz4KRa8AzahGPDZhH02Cph8hKb8mpG8PelK6abXlhyYOKcr7jyGyFnrNzzJqUjY+sQIxmUMdBoB4ZKW8snXCfKdK091WNvRQwipdQBPSwQq2GEglgp3oAfeyaxP\/NnGplI+oTX3JY7+9bbzzNl\/seO7rQOT97rl+XWRk861xebysmV\/uv68XY6JNKl90L\/njcogmKBee2UH+CnLqRBteyOXm4mQVBFQedBni6AAA25Vzk9bhpZU0SnnCfNqaoWlKMCZ2GVCuTQVOEoZ8\/3osbvrOflxaPBEzGUAAAAAAA\",\r\n        \/\/ EnVies EnJeux 13\r\n        \"enviesenjeux13\": \"data:image\/webp;base64,UklGRjYQAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSOUEAAABoARt\/9o2+v4CY5iTZh1mZuakzJS44C4zM+OVmRluzMzMRY89nWWmcjUazX9+B\/2teGNL10bEBOCI\/48cVHr9TeZsfPSv5GyQ74WTXpvmQHydFtT1P0w5ENe4hb6i6REHIi2wgOLSLsl5YImVdYzBgS614B+BM\/RsbrC2SAKUStOw3+4k0ZKc872WxlXAsxiAtBo2n76TCTwnN8DygAfimoDdwYeYxYql1rQY08ymXI21MSxmrLZUnSvK6YA9n\/dsLpsdRnMEjScDCASA4hXAStWmliwYy7CiXCaQTpIYY0z1MoasKkD2wzMOm07pk5etUGPBL3Dt+SkcDoe\/\/nxrdEX6CJMYk6YKJIkBiv1gSEZ6qDWW2EsWD0T\/3LozHNm+b\/vWyINID04rtiOsOybLQrECD7dIlj9BVf36XABMsh3Iy+ZLMdb54SWL3KLOn2KeqQoAaLjWlLvJZSNA7vEBEQCPFasGPbw4E2LZ9AQttRWwwXVqLM1s6JrZ0DRD1zRN0w9MAEB5Bsz5LHO5Yi9A2vG1Ih\/FeQ8z1ecCmHdMN4MdN61UTCgvK6sov6u\/rq62rvba7trjj62ury67vQYxs1a1MSS+moAuVQpcX+FyqSpjTGIZPTD3MwzLAOatlF0Bv+pyp519UqakuNQEFvFEJPpTI845CcfH8k1jKpsGy3ydDhAn4sSJvttDxBNZRIlqUEyuVc0wAINydhOwijQi0jkRcZ0SXcQTkjgRJ24mg55t7gfQr\/T6oWw1DOKciBMnIp7gIkp8nU5alQa0Zk4Bp5NOSTRpkGGUrgeqOzvR9gHnTkSn\/LxBFJzurahpIc2ZFGE6N\/RwxZDnPm44EYOfp2YTGc9PdIRIdyZL2+7WD3G9VpomzZHQgrLXSKetvRN3keFEOD1z\/k2avuc6NwZIcyI6tWduKXzq3oLp7iDpToQbx61Q0s6uH0b+k9xwIjo\/DRjqzGoowiRpyUdLdK5r+7QiqINptWwLFmh7NE3TuK4lRRElxQbU5rt7MeUeo6Qq2jgXgzNxDoa2BNd9d2ModFw6NjJfP\/yj2cdvCoWCJ35y3oK1wZnYm4IzMYMb57Yo0VtLYfZ2Qu0CxhmEy++rkGCnM+++9HocX3v73sbme68urW9oaKq+aFnV0OXV1cccV9Nc3\/\/sN0T0w0tvvj7rl947KlldSXOec43iW5OszjcOGPHVdYN0oWHohqHrhqHrum4YRMSNOB4wKpPVBaRRUtSoKlmdzw9x6zH4nCUuPsST1iU0W65rmqbpNGd1il2drE78bntUGAlHo9HdP3AS7o5Eo9FIdOu+7yKR76Lhf3dHouHf\/gxHZxv+jSKvR36IHghv\/a40WTE5tiLLClPfvWBkdHisVRanHiubpdU+SZa8QUmetdJ0SaPMpNU5koKkX+kF4J0phvXxVAiHFABYJCGOUkewFP4q2OASGaxvoxvWXUsgHvCYaorjAaBixcjxdjCAomNLMctAEQCsLQQ6Ukzuybiogep1dw\/aQNo5K8ckzNJPf5tSZKAxy4S1LB7KvHQJdqiuO39gmX8W7LQJk7kqX9Dgi4edMvyPgWKB0shs7X8tqBDMbz7OgYSGAGTXC8a6gg5ElgCktwhQzRyIMKVD5Fz93U7H2+N0fKNOB8zpsCLJ4SyjjQ4n964ih3PE\/0foCABWUDggKgsAAJA1AJ0BKqAAoAA+SSCORaKhoRKbhOgoBISzt3HciySZMhuKjcC7n\/QSLFbz9Dv+L3Tfi1+q96FPKA6yD0G\/2A9OP9u\/hM\/uH\/U9Hj\/260t4A\/kHZn\/avxT\/cP1h8Mnjf2j\/qfKr5o8Tf25\/C\/2f9nfN28K\/h1+uflV+QH2Bfj38n\/sP5gf17h0NL\/rn+49QL1i+W\/238w\/7P6FGoj3d\/13uAfxz+g\/577W\/lnvffsn+H\/0v3AfYB\/Kf65\/z\/8B7q\/8B\/0f89+5P+X9on5d\/e\/+z7g38s\/qn+7+5f51PaV+2nsdfsh\/8yLv0BKaoYv24LGPfnfpcuG\/bf9NZsepC\/rv7Tl\/4hUiLWI+pdF+3z3VyBJytHua4\/A+apa\/o+pwf9qfiIEFteDbD0Tliyri4Upb5mB+KLEwNXXfsShDXhpA0jzia8a++sLFf9cFhkeFpjJV7tY9ywRleaAs5LryJpDsgpJuvF4QcTNFsdmgy9PkPnOJMV5KrgPNVnWMjHN458sObSEOueg72s\/BaothSgGm6HPuWeDHA93\/hOb\/gl1fLHuyG0RQxbynXAS\/Khi\/bgsY9+dQAAP7\/p1UAM7aUgff8UDQVB2aidaqnftv+fn11v7ObrDpAQiquzsCen8ZS4TVywJWz6XDhQ7pvBbC40Qpu0YlLB8jArA1SOdlJiUJ3u\/HgN0AUWFudthqPYt6jfiPmtJ2j2BTg6O\/5mXcsnUbwGnqMQj4zB+\/nKRLBLL5o2rjrfa0zcI+AQ\/FeyHwVfo3CMMTgIqOAiIFQNt0Y\/QQiKA0cMdE9p1N8IsGfiPH1jZKP3S3c4kfVXmpevewNFi6fPFAG0B92cqVsC8H9jnrpp2m1DjsypP65snCwsXAyNZ41KJwdDrTLUVAh9uuRhrIJQUzSjjJ9hTsYZFZBLq2RuQd1LeI6f2Kb34ingofkuIEqa7kKxwl3e7uFfN6q2j47bMDvoCMggw5sc3ak33FhtcSeh7T3PK6SPaEqomx0gW+8qMuGnDFKXzaF8xWeacc+PB7pTVEka0WryCV2HwvTEY3CG+Z+oiGh\/4rMLcjkWFHtCFEnD80O7KxrjrFmGXrE1teQEAdkXAinDhNyByKBfHJBZgfIR4\/mbY4ndXFFXN3nvKz9E06ICOFPgRGQeZXTsAL8E5XAM0itb2B3fsAN\/hQzpie3uSa0g7Y4YWDnjBedC1WVVaAPOfnzhdjbBbKSZL\/ZDw6jsLBf9Ko1BvzvgeGUUkTbw1qj8eR\/SlTKLrTQPkuXOsBeNtko+\/JnDyzbapJYOkT9y17fK9mHc8ZXfFof3\/+M5w9\/4W2scVBOVuK5L8I4CERIdPKby0SX9ddk7YTgyZZ2C4gdv\/DpkehE3MZkjmpLGp59jXaxGYBH8LrDYdXxTA5H2kzWnT4ceyT55rdTDB\/m1H8vW8ZwAUtIf2BGLvq\/FL++acW1C0u\/HmYzLwycb5jbQyIFf1G+4oKmEstHT6uJhHdNPb5doAzKHMHrVzye6hJfIaGvzujVzSFq5ugGDlYZ+9aNs1I\/detlmzdCG1OIA6b\/t6sQeoqBTYmqdiD0irWIUvdmjErOygXNBxF1xruAFjuREN8YQPtlXntUWwdj+u+RrryqXNiowx7Z5yjHv6SIYcrgyC9NeG1FlFRb8NHVzhs\/sLe88MSZUCJr+S3771VkgNjtkQS085H6EXfzBH3uQFdsOvyLU1ZErdtSM95bK84v3loHsOjuh0VuQpRcBRXeu6FWRhNgettf5ONcifu588d9O5e+8eQrvWyR6gpbxWKpsU5s3mU4FUAIyXjN7iteQZRedi5z31XcKgi+eNR\/8I2jbOpMWrowrdI5KYewJBM1e13Kt+KFYEBQbQUyp67icntKdroV\/L89QzfK5lhW7zEv2S1aBH+o84BWzzZKU9cTY\/l2e4qGxHwYfBc+ZwviDzV1OSFcoAdx1i1YIyB\/M005X9tzv5zDL84qEd0S0do21Wb\/VoOGy2768uTTn3KeJBXQ5nP5H9s9jiVIkbRgyjOZRaoyjRsytV+KlQf4ZZ3fVC+CSvrtqSC0RvagfBkMjmrJQ4uTpyUEPot636uCVTJDrca27D0tDu3YelSw\/l76i84heqc1xi0b+Ho9L8BeHNwOs64sSkymQWCdKyvEYYvJulYVMuQMeejRmKf328hObn3iC+5w30UCZNZE3IQMuKLbklOsYEn8jyX1kwCd17r4rqPgru8VKftyLQSQEFU09QJWiEhl17\/h38NxHloFatLIM\/Wy\/UAgNKUmLgw3T180oAUWgb5lnTsKFlZZvINYYZKeZPlXH1VXgXqJvLsG5\/7VKx0zNBEQ8VeNnQ\/ghnmD31DIGWVP57INZwZuXDt5Y8IcZSwZ1VluUIsxNlW7LSwdDsoz4XmE3EM4cOAO8+h9+IwB93wtaQH3ks0zg7dglOGWbnVh5BZyZEla0r\/ks1g7RbJibmgDKCE7BqfIfn4GetTv28vTxYg6sggdTvxp6M7mw7x3kCWS7GAdoRpKX6KMFg9ghdy245F4DOcllJlYt7MpzhJpKNyhh7n5Lmp8IZOCtUsDAfDsa8\/JK5fSki+H\/hY59Py2wkejgPXDTmSZqfm2F5TfE4+b\/mvJuhcf4W1oks3D2QkaySXSoMAIN6e6Z2UxG5NxDjo6p0gPwR9\/jexm7TcjsYwLYnh+FmrqiOsDRefPzIHiXcOJDt\/Co1fkS4cckr+oytsTvmELRLkwDyyI+P9aCIfwS16QPX3KbRVtiUP+VnzZiIe0RG0QX3NDsoo2pDkarixDhdXFriEmgoG2EA\/eJ\/tIB8dV\/olcNkbJwxIsJsPTFcr5Ias35brmed728YoWwkT71HRljFe3h+dqe7\/J1bvzq3GUJ18paHUFHWYYxLI6jkVUxjq30M5SfLa66USXPcRigqugLgsd1jKR6bFSr0Dv4DWEDiOKvMbDE3HHxpvfBxdErZTTNIzwpwMHhZMouhCMkb1G9\/ULYi4xjZzOvKjrP4CWB0xHdgO7p764LwHwV2MoWZMVaoNKn+9GCf+fx\/sdUQGQVMaX6Q3D6rHH8o0Hvpgk5+QwMXkUKCEwJst\/pyGW6Sq5\/sKsdKY5sRAaAowZjIur34e5744IMhOBCjN4cfq1XI4ZR+Dwu9rNmNuvDNKQq6pAcqvGcyfT0YvHzN9Adk6Z6ZjHM\/lzhreZHaw3n\/kEEEKWe6632hE6vIHuei72rPrZOcHakh5DS4X9fJIAZAD2YoaIosLMvDarNoLCkyUvlQwmEjD3v\/y3YhVmWw\/CzyqwWjh18ofLNNh\/9i3\/9SalyPMC0N1FXfNuSGg8XUV9jCFMTdo2qbWyRA8iw78aSvvjMnMIoWrONsvlu88RtB97qxEp6H7VxgMNdJR6bOy8Ht8PXoW8fw6wJqSHf\/ynVsm6lopgSk9QPPUnfV\/Q7A9xuHegdkyaB5VcHs5CQ3H5QV86\/lmPQgFOQcMvUh3NYfOwX\/V3IG\/AGrj59k+apao9UXFd3cmgJmyj4WBvTMivf+FFiMSuO5K9O9ELbG2MwGEfjwl88XPToaG2OPFL2hsbw00YHhp\/KnuGyBO+mEHMV0Tu0+MmRwwN\/JiyYKwQD5myqVFd4IciwNI5o0Gm7PKKZF1Xkl\/7QtejGb1yTZPCMpV8k+uj\/4z3\/+233V\/\/5+YWx7HvV+qYoMl6nuEIhJJVd+3g8cGYASRrddBGHCTNN8iwM9AZQBz4HocAZqyLcpJStkTm1Mep8Do4x3nctqAYFFDCVjJlmAAqLL8T4cm0u2WTpIkZ5394TN2mYaUmk9CElf\/4Cq\/GfB6LmAAAAAAA\",\r\n        \/\/ FACE Sud Provence\r\n        \"facesudprovence\": \"data:image\/webp;base64,UklGRiAQAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSEwFAAAB8Af9\/ylH\/v\/dnqdP4zQySWfiDGObw2ySmbVt27ZtK2vbtm3b9m5qqutU16n7H+ndQWNffkXEBPB\/\/\/\/P5NGxc85fumeP9WS5Ii39TbNcYXJRcumOJ9fLcpPlaukmtP6\/+BXlPLEsMKO\/pzd9+3o2lZfx7lJmzwQXJsYT6exmgUuUVCb\/n6O8nGcJ\/kPFU6Io5IQW2\/HlEossMnFm8ec89j+MgtMaS6zFMfttm0OMSNJ4cHH0Re4Q0eNFsaZtMfEQ+OI+sIoKfZ89my4XJhYlMuavqSp0tgHI0zHQrwFKXpHeHH86Xe5QJvWnsB6Se8ZQkJh7AHS7bXygoaKT9Ui6zOjv6c2QPb3dJgW+0Sul76OODoBO1Tk6HKzxZ9MlU5vVtFHIOxbmqzas\/cD8+lzuEDypJuBfQwstfTez8k233XzvNod31gO5Q5ErSdfZrC7pdc2j6kfpd32QO2BVzp1XDlDQVmBXBcBfW2+XlOcQ\/\/j1O6FQ0OQyV0rSc205zJi3Suuq4yrCsUwYTCRqgeMHrJDB5EUAK4QV808wkaiZEMmzssbF8kNncnVbt73rUf6s9EUvr\/9uw4Xy1X8n3ZvHkMak8Xkw\/SXpg2by7pa+r88eARj0VrE9XdHkjC\/qq3tBBS0aJKZNHZ0Xmfz2cwx67sKhcdkh7+fOxk8OMK9+Uhw5w41ljS1Hd5aiAd0PczQXSpO7mN+fZAsFV\/V26Oq4WZFWLYQ9vNgsdYGPMl3W1bmbNs0SY5K8G6cT1pGwMNkIMfdYdlPTJ7exg3vxQcdstUOwU42wkaKj7kyAmXpsv2N32ropS5zvFtk+wHGPhELdHwseqz4Kkt+rkSod5DNVQQbdJtjYzSvQzZHQ4XPtxNMRJheSJW9TiIlhnQMslKT9gCv1toFNJWkjRtQB26uMdSVpKxpcSTeaLFHZaqWw2koBIr1zCwEi7XGAvP6hYoh0hKCg3YZo\/5x8INC8oMoivf3LiJ\/sa6\/fSNVmplc7LZ69fv3inaGZ2Seqk3hTNeVPLrd4eTp18bZ4vDDj2DaBUArj+AETNGAFIWAITogkDmW5ZB5Rg+3HdlIYxw+xxEH4goDtB\/xhG6wwQDA0IWARCmSAa94eky4Lw7zPpDMd2sY7YLffHevXK25zzQQdxaZvMu3nYcY+OUG6KwpDn0mn+SM6kp1\/z4d73zW+MyTtwU4\/FlB6m\/R0DYHvb7xROtyk3Y16smNrPUuLHuvYRM\/Spj44SGGf9PSqpDiMznKqtSJX6P0VjtEldOmxjq1VH9KR7Kc4vPQrG2l+rLuO\/RS1E8mRwe8V8yV1ychjGky\/pAMnKH6OG4E9lF\/t9cI+nuPzXjWkOhRghreQi70CrK\/eNte5DgSI6Uj28uLw9I+srWPbJsFeXqhXs6DK28jynoVyd+e0uyNhYFtv2tWuBasly2qSvXCUHEvn89dmaiFXy4959X3rIdcAKfbx8uHNr4xZ+QHpPHaXM+JOh0nuLj5dCJO0S9pdp9VNwUeetanWMLFXZVdoLFD2VSJsJc7+k8QBE2YkRrksEcC88AFba3UT3z\/mJA5jY21hDyRfNf4QvqtlbZlwJusyv+9wNVqJCyE\/sUPa3epK0lzsWyVpAOteSa6iPt2cKqrTJtRqDR5QEPOjZ+w7JKnS0ZlEvtdEttNnr+s0Dlec7SXpGAK6A+I6OO3u+rFkpTXigKndYDQKWH3rl5asYJmR2lS+BdMnhFaK0zBkQXcfmNoNRsPYC6ZBaGTNWP1s7IYNNq2BqQttKFptnUqwhurAXlCZdvd6htz2zOd8Oc7\/\/f8\/uwNWUDggrgoAAJA1AJ0BKqAAoAA+SSKORSKiIRJKTWQoBISm7dX6qgHYyfi8l+TPtP2v+7eSDvV538iLmf5cvfP\/h\/YB+R\/+L7gH6q+dP\/jvZJ+4HqA\/mn9m\/bv3Zf9Z+0nuI\/Y72AP6P\/nvWY\/3XsL\/3D\/b+wN+33pn+yL\/Yv99+5ftdf\/XWXvHv9w7VP9H+N3n348PVnsdyt+j+2Z+d\/KL8o\/i3vh2s92Lzrwevqn\/C8HnUd74+iX+hf6j1d76CgH\/Lv63\/z\/6z7rP85\/7vLX9Kf97\/M\/AT\/N\/6x\/x\/2C7o37K+y\/+1xSfYpfMiYA38ynJHH+DjgNFr5r48tEtR5qSdmbphTqp+VhJc6BKL1uGNgieH81PUFkROKCSXY4f2XoQmmo\/G1E\/e8dfwGt+qpic2GWYxE9Kmua8EuNF\/oyvJm++IJIV1Np6BylX58fXgozKhqCL4SdwRHpS2i7ECvemJSz5NBsoJq4b5Ji77+tuCnre1W6r3DlsEKWrjUwnW\/35b2\/9iwXjPnoS2jjdL4GFhJ5Pk0pUGc4on2PH\/Q90SUIQu8gHf6pBNlBuXewU+kvOx\/wky38ynJHH\/CFAAP7+BtAAAHak0+FrCpR51Ti4T7uWJ8SqI8EJRZhyjgyNKsgM\/\/wz1wkfDTvwxpR\/MRndLyb9aoOINnpZNZDHIRTBsgX1bX5QDOWf5rPiGUKqJKMbR4DPI\/h3R\/CMh2qbd6d\/5jCmjANUwtbPb9z1R4E1h4SJm8sJ0DzDqTaLvz52f3Tj8JlefyyVd7S\/QORSoEcvax1if3UixvazoS+D87h7YIcFppK39CZB\/66YmuleG\/kcJSQsqzFwrlQNFudIBv5rtqczAVQkh+PciuuWeTTGsk3\/qS3u\/3oOeDohGjpVbUIzVLoj954kw1udzLQSP2zzixrjfnpeql+NbfpVDVDbaJZ6ltLj5C+cF4GajEyaDG7YV55NLAn4HcvP8hqBKZCNflXqSnabpCrw3\/AQAiXH\/Lm9GSeG7qy9atR1vol2bAs+vctfz+7bYVrWRhIvTxa8721nxDoda036PRfRJmVnjxDoD+4IpJ1x0UvafIqlIZH1JyqIv+Ox2AmxqC\/zgFwa9d8qsfTmwFHexSJXV9j7BTUbGEeOz9Ka0B3Y5UuNzlOXNOdqjqxKY5QHxtrC8FkiGaHxlcDWftqQQL5SnKfQoK5Aups0zC0vLV3iwOUG9vFY6bFkr69+2+5kcGL44n5ZdpuICx7q1IVyP9o57jobio+KsPnXl4r4Yx9\/cRQbyksSKJOP+r9v+7zGlKoxgOD+AaPsvbeAVVxSD5WCQ++0wuneOS3chtD8PDtNE80SELD4wjRylAcmUjK9IDofgznDR\/Cbm4OLNT1hg9pBPqJK2d07RBIkscMO6byeeJ5cBkmNqDTWrK89aZeqG5fAWj7IeYriJ04J5pllDLMWKt0ImOQdqMqHRdD7VI6Tuf1QY4Y1Z1IDp0oK0fuQ3oMkYravUia2wx7o+GdXe6Xx9Tb\/F7jp4ToASJ3470CdtAz+JnBhKaAD1PZymS3y+6JK3Nz8uTGb0troG3JsWdlyivxW8QOkZpGO1FWExZjjt7S1t4qRYmk\/u1iyHUTGFioCzn7rJO94l1rQt1abbPs\/pmyOjGoL07VmSwzG8\/ofFFTUkSyrnfKRgQzTdaa\/fKLmtvHQKi09Lww9JMy2iRTKPv7cwveR9lgM2t8qTZyo\/wusnOhHRtx5RULGXSad+87YyJo7Y46XUWxPk\/EJ\/pnrXAr0Iz40hZM\/waCwb4j\/nZotBX7BzSWXlPmpmFGj+4chWAeXXTb+wS3t07\/\/H9HBanX+IaBAgZx2r6sXpTkAUib02rR1GNVDMvTAYP+\/EWJpg2mKJevlQXhsTc3FUn5Wm+DaYWNkdFr2lvsk00SVDiZvuzsTTcCC3777tXkSfr90\/PPSXuOKg9+i87DEbTW45R641yfmUdyNNmFNmD7qS38Um68+7nfWTqIeUTtpqYDjwnwY8B7zCAjle0fanA5d+EgcmFefu6Om0aifVRdCemGltVFPBxwReTHW28dy+mzshDorg9vMr+46RYqj+GSHRjUYsi4Rdg0Ov5CKtW4cn9Im\/KiObSBb3fWT6pZStqWRy+u5pYO1jGcBwGPQACJov+BG\/\/lfINRA\/t301Hbrhd8Z\/bP0FIu5ADnJeP++8EQPPyjpdDemuIqHQMP3aW48beyCkOHS4Mb884fZ9wZppcIKEqdNqmf8RdjofYHpyzwBBZC8pemwSCz+D\/63+5uITq5A2W4PNd37PKNyKt22l831K8ewAXaxstxAgnFykvvciH4S2xaCLXD9BmxfsG+SicsFtsKdpLmexEnvpP4MQFrunvn6lG43P\/pDl4ClKPrrAK4mNd7amtcgM8CT+7vlAnFx0oAJWe7TsOIXuiC9D0NCSlK33x6x4N4VSPgdK4PvL6XAI5DGkLqCiAwz0oC8Xz3iHXLCY7r1xBcUN4R1bbeB5qgiBJGy6m6hfQINtCUPm+Tp0l1M9JPveBknAyU6EiKlvulHURHqlyKP\/ArEgqJz3qGml7kQ0JcVo3RXm4teI4qi+tBivo\/peOYAMdrkjY\/wmZZD7mZHHUzSLZi9\/k0ojmTF\/aUqfbkh\/\/BVNpq8BNRrkzrYfO0CpCTpk5JNDfxTsWMUp15Ia7QIQdfSXxBLbhQ\/2DXkIOjuzVlWarix\/nof8FCMnXT\/6+z9f\/mePWL1f7VgImXIQIZmRMtRDD\/cZ5Ph6zVs5BJvttJCl4QCOBa6AX+gpezS\/xfZPuKTVXdUgs+aD9L5gadXr6B\/OzMFrEUT36dCHnE7aX\/vnEZJPbym2S7+mh93FAN7z3eQY4OZt5\/iQHzkhdIQhAj\/A9gMm8njGmrowp8gbrL9WhoEfz+kN7QMDB6xlG1WdtmZV6nAuJKtsfM6u1wweDUg8W8HWInl1T1u5WazJj7\/x\/mVL0vSIQSxFuHsrppOZeOuk+Shfvn7n62nxwAy3XIOwtM1U2DXykThAoQYCimwSnjUT1qKEdgGgYqziM709H5kIfzHTIBbDEI90YGDSn3DBd6Kl1TsEAjffQtoIavCh0Mg5YeC0PcFXM45OPtnsQ1opybIKEwormri\/Y5gQ+Q1Yb4cvXHAVv8FHW5TKwrAxVnR0+NjbICU6evhI7fzEh6CcfHgHmM\/PU1LPGTHJTwdeDz\/5HWdJghtL0\/uby6lMtMf7MA2cJtTHVlcJLwTBwDfagN+7DssDC4HkG13jyWsVBGhdsn\/gBpebWxeVTzMP71vt9Glxa\/5aa3WinaEw9ymcy+MpwnFrhDixwBAJbK4v084Uz5LUUKrQ9WyUWicM6gN1B7tYRNPRkNDS4Wh8xM29KD663Oy3DTPEfDKUxFu1nfKi9L+wltfXA\/OdJCVVGTOVNDeL9Iw0lpJPTxO5JJw3d1mQ8H0AO\/zqF0gt0rV53Oy2ATYaVqbPyhOLRCHksLGt7Klfz3weto2kns8B2FvLW4+Rhbd74diVgKMDMpy0qwszLcWlVtTjnKUswNIoA0HrLoXlLcVeLIWdT0dos+l25cG8gAYSsSbo6mU2yaGRZ86uCmgEXxcVo9j+ZFkhqncYsg\/OA6cOM4L0lQu34B1MosN80AcS\/pCPq5I9horv6AEw1QAAAAAAAA=\",\r\n        \/\/ HUB DU SUD\r\n        \"hubdusud\": \"data:image\/webp;base64,UklGRsIaAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSAgRAAAB8If+\/3wp\/f\/dnmfOmcXRmXEZHW1cRycd29PGXF5lK+UrN3b05buNzaU9LBRfUhjKiKI4KEoSiRKFKKKIIYNDhCJShIgkEiIhhojIcDjcefDg+sc557mN732LiAnQ\/ydyzImOXLmFXXNiyWw60pBM\/yObMonUvrTt2MnDn7cFSfX5fmculuAszC8zEBgQRxusT+afMD6JeX9R+nBDQq\/Ds7Fk\/\/TukzJj\/V3fGsd053Yls9e7KQmsAK7u3dGNcb1PMhucWxLPdXi\/zBjyjIvjSdiRTCdMjq8veT7NScHz3OXjZD6HhbF9UKYlrqmwM5nd8ER8k\/BXMipejzuVzHpYFNuHZcaWGbZzQVBi+u6JpXao7+KOnatHRWn5YOeWxf3UWWpG58QSmbc66kPMcO5GdYnqK8yVFCzf1liiasO6XInhq3Z0rBigtUm8W6a5zE8wsqgW7mRL7JqSp3hDECazmeL81N0lauFutqgd9oQYTZ5TwwNJqmmUpHFwosQqWCYp+ISSz21M4nD7k08++eTUJz6kUJS5bPZYUZO3Qp8il4cdn56jh1VhNpDnwqc7ocfRLjX5gtUWzTU7FiLzEz1w\/vMn+qr0NLMLQdFms7WS3iDPpc+2OvI+Pk9IK3EJHi4aAlaiwJ\/NUkUHeerKDaaHLRXSqL8oFA3BF\/oUvQJhVHcBCoA\/\/FSmaCqcK7EJPpH6ujzf5KQhVymk6DI8EqGHmZJUecMxu9wK767nJOll7paxErMjKLvwFwAH3XWlzpf4Cj6VXsDu1krSZPLxcervc+fMmTNv1pcU4nJ3q4q0DTaV2wMbVVxTcMlImaFzdv8JeX6riGE9fK3i7J8+gXdVupl8XJwNSrwJ35Q7BgtLZC6RSEWg4tykq\/QwJcpaqRM+KKFTJPBhmbGRmvBluku9AV+XOxriYpR54R7841C2SLrPCv7dUB0ldsGaFHxQpiVMe1FLOX8zW2Ir\/LPcdlhXoqrHlfF9i94MdxjmlwquwPslLmaK9sOn0seePSUq\/kjTb7C8aCmuVJ4HiqpuOp4vNxf3R7ZoGneLBlFgeNEP4Ta6wh+5Eo2FAi9Jk73LV0uq+MMVTcXdqSkaTz6ua\/B+mTGldNz536qlMXc85X4fIGV3kXe15erJs6lCarxOvqjGjG2BgnlYqBH0cKBOCob\/4guuVhpNnmVSxQbyRdV3C+zLSfW\/UGBhPNed+7jMWHfXtUr6F+5y8ZNO7I4r9JGmucIdCh2f\/kIPbyrk+\/RwYe1Wz+2CmyLpJD0c+fA4t\/IujFZj9BzZ3w0wS1Luji+w95ML3Cy4TyUtoIfLn2\/q4ba5xbEEF2FZmcFAo6TczxSfH3UVVyk9Bl9MpeSmIExmO8X+4c3woKT78hR\/8SD8EEbLPKXvPKviqZRc8DKskhR8RsmpH8CsWDT+dGdlGb3evVzF2SXHz3y3IKfnzi6QlO08NVBD153s6nxYESftO3NsdYMaT22tkKSGtT927WmXNvzUEkp1C\/ae6jqx\/flqlR7R0fXj5lblvv2xXsUTd3Wd+KRR\/Y7urYwnYqDygYoDhQ4UY6CogYoDRQ6CQKGDQBED\/fs2k6uuqanKBr0ok6uuqawI7kWZgZPf2Hnq4o27+fzta+e\/3zintU\/ack3T3t554uKNnp6\/rv787acvjKi6l9Q88dUlotuPb43IpCUYNOebm0S+8\/3CwcE9IdO2owfwZuZ8aefMDODXNwakoXbOaQBnZs6XdM7MAXS90qfXZV+8AJh5ontnDugclVTz5gJ4c57I3pmH\/LqBvSrz7O9g5ondm4dv70ti7EHAHLE7A76s7z0t3WCehJ2D9dVxjTgIzjyJevMUlmd6R3YtmCeFznFjUiz1HWCOFBr8NKI3DD2Pc6TUYH02Uu41h3Ok0xdgUfqme4z0euN0Xbhg2hUw0uscu3Ipew3vSHUPriHMyKNgnlQXOFObqrWYJ15fHINzXPtbply\/TWCetBtXGlK0ngIxeiuYp9gK5kN5g7VVKptd1oNzxOmdMysUCmbOx4FxrSE1aygQ2Zuj2G7f6qHYrJzBjyNUfvJFMGL0ZoT2Zj4Sxu99UjKHAlG9AVc6Zo0bUFOZq6ofPWvHn4B5wBs9f8+obPNhME9kbw4onN2zdsW8WXNfW3\/wMoC5KBhnKlJxPwUieoPr7w+vUOjsxB2AeYNt\/VS2dgOYJ7I34NfV99cEKp\/pP21nD5iPQIEdaehz0\/kIDi49l1OMDR844JcHVLZiQQ\/OEd0BHS0ZRa958RxYBArMScFBjPBGYXFWMdd9efuNrMo+egGM6M5R+LBeMWdmXMX5cN784MSexQhvHBmgBKtVtukAmCeyN\/iiTgnmPgAXCkdXkFDNLedDecfqQCms+RTMEd3g5Ggl\/OBfuFAYsxPagBHWGy8qhZlX\/sI7ojvPzecCJd5wAQvl3e2aRAZ558N4Y7pSOPEcGNG9wcfVSmN1Ny4MxoeJbMUIa8xS8oP2gXkie4ODTUpp9UVcGO\/ztQk0OE9Y42MlXv0+OE90g8uTlN4BPc6HwHgngdVYGMepIKnMizfxRnTnsOVZpbkdF8ZzIxdb9jo+hHeFgUp4\/BkwonuD7fVKeQcWAmNqbA9jhDTeULIDd4F5oht0tyr1Nbe8D+H8wdg6fBjv\/8glUvmOxxzRnefmyxn1wsVYCLDamLI38CGM+UowePoaGNG9wdoa9crcTXwIY1pMI3CU9\/5WVQItP4J5InuD74apt67CQnXENB8LYXyh2Ou3gnmiG1xqV+9txIdwXM7EswMXwjE+rtzrHueI7hzutZx6cXAGVw5PfSyZc\/hynr9y8WSmXgEjujfoqFfvfhMLYbTF0udOGMcBxTsMCkT3BidGq7ePjzAnlibCGq\/FpNVxGFydEajX93OE+jSWB3Ch2uMK9lPw4ZzD3sjpHlhxBR+mM5anQzlGxKXMDjBfzhlsa9C98RSunONwLLNDeQbGJs0pgJX2cLJF98r94bqCOBaHgn4JqN+a65Q92R4ojTWjp730dFt9kNBOLMzZTBxL0yPlxi3Z2Ln9w5kDlcbMlEN5Sv68pKZ3zQ3l6Z9Mqh85B1gxcGd+kMBeXJjuII7nQjmG3SOavgVznpKuAN9Vx3cs3DHF+Vgo48F7Qs1nYI6wvsD5qrgyF\/Fh9sUyAh9q7j2gYs4tvCNqgSNBTH0KYYz1sfQrEGpL73v4AhjR\/V1WxTQGR5glsVRcwpdzXMz0siHfgHmiG\/w8MaYlWKjHYtE3uHJ4GntVzSdgnujOc3tORjEfw4XwDIrndSyEsbQXZV66iXdE9waf9VHc9c77cp4b2Xgm4EI4zge9pvU0GNG9wcEmxb8Uo7xjv+Kt7iGso62XNGwH80Q3+O0xJVhxGR+iwJyYdAgX6kivyK4wnCO6c9xdUKEkn8UI6RkU17NYCBwP9YLJl8CI7g021irR7FXvQji6g7hq8vgw\/reKtDUdAvNE9gY\/NCvhVRghjfmKfZu3EBgfp6v6YzBPdINL7YESHoEjrC\/0jW8ULgzGYykKnr+Jd0R3jsLynJKu\/N2HMrYpwRPehfEuPyw1LV1gRPcGX9Up8eAQjrCOYUm0EQrPzUHpqNsC5onsDU6MUvLBVoywjq+V6A+4MDhu3JeCiiWGc0Q3uDojUPKZrRhhvWNIMk1YKByFKYk9\/CsY0Z3D3sgphdWHMEIb65Xwh1goPHyeS2TQPjBPZG+wrUFpbPkdI7R3N6qSyl7yLhTecXlKEFv\/9WCe6AanWlS25otNtbFVfQCO8AUmKfERmA8FBl1PVMQRjNwC3hHdPNdnBiodPHUD7vxLTSy5WddwnvDGl0rhAgoR8AZX1ozKhasYsrgbMKI7B+9UqeyQ78EM7nzSFEQIBr35JxgRHecq0qAtWARwBtw48M7MtuFDh45o+9vru38HnBHdG3QOUNncW2AevAHdb7bWZoqCbF3b212AeSJ6f7tBqcwcxqKAN0dEb44YDX6aoPIPXcQ7SnrzgLt07Jv935+5BuDNE9U7WpTSXBcWCfDOzJxzzszME6fz3Hgpo7J1O8EI68wob+aI7h2PKrVVXRRiSNwZfFytspnZecwT1XtX7InVeR5XinOHKPh0eYOvBytkJ2ak2ii0KdWZDXiXJoOzDyl0n+8wnyJf4HKT0v4imE+Lee7Mzihi8D5Yahzsr1b6m7rxlgrnYG2NYnzoOs6lwhtuXqDemFnucS4xc7C7UfFWrwdziTmD7waqtzZ0gDefgDdg\/0jFP\/J7cOYT8M7gl3b15uadgJmPxZkDtg1Xsm1HADMfi3cGnH8mo14+cPUfgDNz3pfxzswAfvlHvZIf\/uUdwJk5H8I7MwPY91BG98Bs2\/rLlPTOzBylf3p3ZEbprGrffp2SzpmZc5S8e\/DlfrpnZhpnrjt+zVP69oWv33q0LlCas82vbO66Sfnb5zqXtlbrnlvRZ9DI+yeMbaqrDNQrg2zfwaPunzChpamuMtB\/Sx27776iR3ZUJNK+qV+YeVuCFDy7vSKWgbsbYlmxIZBm7O96LaYDXMlK2s6wJJqYG4Q5TDYFZxgZyxyeieVsT0ZN3PnqzZj2Oz6T9IUNTaKyTqEzWaXwiI2KZZZNjyVTIT3olirubyjQIm1imOq2DZIqvnpU2W0tQzs7Hw1eOvDPRkk18\/cceCEjNW4d8NaeiZq5KpDu33xoem7bOFV2jJWCtS9Kal5\/bPO4MscYrdqO+hF7dz9Z1Lbph8\/uk17hKdVsbZaCDTOkxo3Hdz8ZSK+8Fjxz1HWvzsV0gBX5Xyu0mWY9xWKpkb1q4q+rP8JPN89xq0r9rrP7MIcyWsbtHvdb5jw1mgEnbp9lncawSarmnDSN219e4+\/lxuhxfr1xAqZKb1E4AtM1m5l6gPelWk5qgPt54QE6FNyictkVf21\/dUzf0G8pq\/UVzZpq86SB1qEhlh+oVf7XbHCKEdpCi7ScKVpoZ3LZSnVZZfBnfowqu22NRtk6qdpOKnv3UoWC0\/nqEA\/ZtTq12z410l2lulvX9DIzNcHelmrtO81lirR8g4KLt3N6jEWKez\/1wUWaPqBZ05gvDWKbBnNMms5b0hY\/UtfcE60t\/2C9FrBIkrrJ1vG9pCms0SjWS9V0aSRHR08YdYSRIR7kY6meg5rlX5DUf6heYabaeEfqy3caAt8+Xy9lLvfkNJklCQxSK6e\/LzFPGlLioPQUr0mbGZG57U4eO354yzDNZ0aZgb5DUmuJdVIfTqvN\/X70+ImDq7Kh3pT6cVDL\/CMqWeptqZ4DUt26G7BGQVJfM0DagGO4prvXpPF0aDCHpL+VGqVf81WSGqs0jymlctWcD6RFrNFot1Ua6E9qEHslBU0qeZTReoC3ig7pWd6QtPSYXuRptbnPpWEc0IAJCoZ006grPTlNYnFs+22glLtqbqTa+KVx2EW3TUPskPS0vS5tsVYtYENl9iWe1yKbKinodtU6yju1kx3vaxB\/jhr0I8cVnGZKpu8uakoctxY9bG9Lde6gai0\/qc\/fuKRZNlPNXG0e\/LM\/pNd5VOqkXlfuVqrdlsa2h36S2mCAKg4Db7JLDXwtTWKe9AXDFKwD+Cqjl3lYkk5RqYbfoGcj7yvYDKy5\/bNUdxoPM1TyB4ZoHMulGvZLD94Ezg7STNoV7AbeccdUfZTf\/+It6Teymsjs2Pq2qrh5nKRM66O1aq2TWvtKmYlZqWaCJDU8OmmApOzETFH\/UZKy4x\/N9WeVpNGT+qt5sKSgecrEapWuu18K2nKSxtZJqmydNCIjVUzMSEHL4\/UaNVAKmqc+Xi+psVkK2rKx9eomt1r\/th3Ain\/jBO01\/8b5f20CVlA4IJQJAAAQLgCdASqgAKAAPsVeqU6npSQiJhQ6qPAYiWRu4MAAZWGGsI8zPzPnZ2b\/E8Nwenttzxeg\/zAP1S6SXmJ\/br1Zv91+t3vX9AD+3\/2nrVfQa8tf2UP7r\/0\/SqzT\/+6fiX4W\/6TIZ1s98cpFABuscX3e+\/XfUA\/Knqnf1\/jB\/P\/9b7Avljeu\/9uPZo\/a5kCE5dO7ytElJ\/el5G61oHbXcbZHNCyLktaGqp+QM5XvoAzqxlOJuCf5cnI4o\/JULVUfSPD2ds4vz1o2AALwajXZke1T+YNxRCi2jXjh5MTGhKySrzLaFdEP8VroWBwmm2KUg8NMoibj\/QfS5MlxtlHjhpFNT32yG9V4RO9YapVbWaFbsrtzbhfhl5Ccf1PEQOnh2kGUCuQDwGQ6O5vLeGcjqbdww8FzvEbvUNdfPF8\/pWHIwi+gbMMCBQPfL4j75WasNRuhNaZn61S1s+lKQRdKo6vBlh9YUwl\/jk7R6YW1hYbT+Ut9aYXednzwkAD+vnoAN2JdzAkRtqb4ipozAfLcr83CwqvlzVStpv\/GfYAWXmiTDiZSbCwzs6R76hqc8GR99ys\/kAi1MPlQEMLsISuo3rwaETFZD80EpDC2QfmfjEwyAU\/EPfAS0NZtISry66nYM0BHNN1\/kHDXfZylbx2L96m6Y52+e0ukQUeBN9fN1axfFf3NcC8FWhHu55cA54dlecI+lTL8j41eJmmEZL3JE9Nnt4Sc9QAEw6rukQSIqJjxv7vlGvy0xJ6fa48x5kCG9fT9X8zPzGlvEFOB1iXRNId5FN9TRVXdCW5vx+GKH\/ZZJxi1XtptGEe6fXN80GlNL6xtzSTARxAUtx4hzI7\/bEvcD7Zy5scSSjwaRu\/mc8s6r4c2EVCJSjuZtXGpMNpm9LgQ6i6jMzIgODOKdY9sMq4QV5HcoP8dvGTEWv9XEjPTnPIwyzoXKRBl2yY1f8H+SflWppLMmPrXmeTblsVv5fdF\/Lza2Gy+QjAXJzdSHa\/n9\/NKjhEjfkesPsJQUsnI4UY7hsI72ndHmAdfws3kRYwflv7876D++ofocZzUIU1xr7ansGqvXVdaaZqmbzdX6KuopZqv8DVSZuJZZqVJ+An9AznzXIPIwqVt7qgxE6Td+CjC57Kcj3IzqIU9MxSJb8EMZROMItcD179RQMEZcyEGvGNbFJesL1sSD5im934GdjwpJL46i01qLNFhhDTEW8KGvShI\/i5z5biUMoTcB34h36Ryb4rsetfbE5a2oK2tDfrj9ibdmq4CbgNUFlsbOX9fuHRHLMJEBkqlmajgSlC23gy2d57R59Of\/\/3gtyauZHnPVtN5HyPKEB+8bH5vfHv59+f62+FaPhyLxJNiNKubpE2DsLf7n1Xk2QO2As+i29p9LfdOx534+3LP1nYbP3Qnu5fDV25a1GT1LLJ6XqZSQwvbUKIpUd9U3LnnVJbKpvhaPqLO0AipSRl69sJ5wTs+rlcLqbJsEfVJqM3bxnFdTmZOOSTtcM\/fgHLTfDPcWSPLRpKbz9EuGJsoNryFqZCK2pHkSYEXXy4zKFK2qyEzwBK6PSaxtK58hsg5nFqP7QOlo6puo52xRQVpEJZUj3p8RYWzFKb965MTuU\/HnM9fpaslHj6viTCfXtVX8k8\/a2NOp4oOIvxb1RIt3Ry1a7vkLDWC3D5kKU3jjLIzTzSRPVovTey4TUxCLbk6\/MBWUH2hqxLDvUOltzHzMkeHaUOTGt1Gzz9XQu14gSuta8wZv\/EZE803mhSbd0pJsUPdtLBUerYkOP6abPgWdqKiWiVrSHhiwO\/pZJn\/gwC8sQhyN6EbSUXomlQN92nuiLtv6zRrtwdE10+O30+XmNnscOWWJdicfmjgqbxMyEadCe9Z4mFWZCO5jZl8z0lHGACgCtQKqrs35HVBPkOylUqbXxTMWbZ23+xMCLfx2+a8Hp0hPfEsiknA2\/fUYxfkqpjGIMaPaOXtNk7sZ+nt8hFfGsdM7winOloafpGH3FVAqRk\/2yt7x9l+IQzjPf5r3IWwhdx+fQx\/o5gATGgFVQpU2A7\/k4tAdSfeP5E3zgrALh7kxqjAdbrLX7DNRsmoqiYZ3IkLvsiHSqsE\/z16dreEy2vw\/ujDLKaMD+aAyFqZ0p3fgGM0ez3FYEwX2N3oWTRGJr6a3vR+9Y\/pWrJHT+TcaE3MjuqAIX7Yegi9NRNNUULJhiOfI45ZfHQ\/qS3B\/1DZP9reyqH474c3uchu5M\/rz6vEblT0O+dBpG9bYCDlfuXC8paBhhC4jwkhtUfI1yxG6kBPWJtZJdf4agWLTtr2ed2pLP20fd0QMNMJaRV5u+BCs5rhN28cQb5SCxeaWv4kIeZfyw5n+vxS3EUZnRwZ7tM0tv8NfZmEv4yv1bYWtKvHuINMZ\/1M47dWXQjDDOVyj\/ZMDgQazoSKBuoTSxovkR6r3sXTu6hlLNtCjjLtZ0sOyDMtyCffLB4xFFfQqh5GpkMgvqjkHaV9j2joaVS2Djs4ANvx1Gbohg4BN82Bcate\/s\/mVX\/GqiVRQ6B\/UR5nO\/k\/M6Ps3zxL1yYKXk4eZrFeftoeKaheAWYPNnxGGJ+ThOWIB0k0O7nGoXU5krkR1SsoYDl\/UpS9axrBbMaZ6koLHlHalY+pKBNf5fRWoFuPKleWQ2nRl+Ve5zr\/clRjoTHaLSapa9KiFijoDoHdO9vzOM10hltkvYdTs+75Vhx5a4W6litQalxI6BT0rfiJS7IR1PqddIL4z3FoJCx4G62IXxl9ypfLKmn+IvrkGbaO6ud84uuWyHKs7ge4gkgliPB8z84d0BfbQVx+a96gpt2v96EpOfykuVJQnMOIdAzVu\/3gIXXa2yeHUsdVqeLBqhz0H74dnVsEzpNW1I1cYmSEV7EkRC4UUH5+TMiLqjkYVtM39hQv9NOZ\/iLqovbJujcn+a0RgMytAwk6c6K7ZlcYNY4KY5OCgrl20Ft3Ei8jTxHbpovp0xes6n5ZWw\/4EXVF\/kOw67e21lvZql3O3nG0xjxHiEVnXJz94WRd8mWKFXkAqvPLyWkf+70uxel01f9YmVnIlb6biOQCiNz22c\/14G5MTHI444Wt5HVDBtzPFpWIR+y\/qPDyYMKMVEgN+quZgtCEsHA9Iv9QrHfmAeHz\/S7bOEGAOrquiO9Cox5lbTLAbjRqxQFfWQzP6wBL3Psxi3stqYY5CPQqrbqno\/RkSYIppgWWUEgP6WS8ImU9\/w4dboLEK33XmtqAxhMGjooFv6ELS4ILzuJ5TnkQIAAAAAAA\",\r\n        \/\/ INCITTA\r\n        \"incitta\": \"data:image\/webp;base64,UklGRjoCAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSBoAAAABDzD\/ERGCaATD5jYnah9dRP8nQMzT2S8YclZQOCD6AQAAcBUAnQEqoACgAD5FHItDoqGhGZ7sACgERKbt6wDhFlP+QfhLpovwU\/FWOAZhA8H\/hAsACOABkIN+M2v1rAcDaBUEpy+8Cdzu+xlpBeIUNkgFia9MU3ELmdNu46NH5K0ZfunD\/BXxzkxPigZs77zvktfP78Cxxi8IP\/9blwrylxdSCIUuqJjdXBJ\/++6AvAydfPTFNkhKQzujro88IwmqgPD13Ag+4MPYWZjJg+g+rncASiMwAP79xQL9v2yScTBDT22pmfHnVofTSXqNs+W3WM1mFStaa3CTAhCBVuvYQ+SaMNa6nQzoIoZZg6MoD55xM\/NtHVPgCeLonl7KXtFf3d03vO\/lQfjNnXNc\/1WZKm8bZkwoVitR8zklV0OSlOws74D8m1YLWkmc6q+Ul9\/8mjwCEKQXpRWsoGd7FiyR8hJCO\/DBKLNvTAWuBdDrHvh2ooKK1NrdGYww0MJhc6M2GeV+wEIrYU0+KBVz1Wnr07WdrvFs+pKXxIckV34OImphhy+Xehj4P+5oCq+toxJgeKYLQXIfjmaCplzZ+7\/jxzm3Nt20Btb4GRmJ+DUSrMqo4fy3zM46lZlpvUkjla9tsU2JjG0r3ZZgXMBZKJ9FSI6udMer4TowW9Qc6jP5wtp2tqD4QjizEH1plt5R+XmRnkXkF1FEHJNAAAA=\",\r\n        \/\/ In Medias Res\r\n        \"inmediasres\": \"data:image\/webp;base64,UklGRuQMAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSJ8BAAABkPLatmo992NmUEX5+v2DMii2VcyMkpkZVRWDY1DsuFUkmbknOzs70577krPl9yJiArKS\/3vneBIltWoPyotoEkJ6hVXF04WQYqGnWMoemibJ5FN1kcwmkGZhf3F0IqQ6UCiKm6bJMn1TXgRDCaRbmJlfxXu1hCHakNsMhKSxJ6\/af2pJQ+jMaQVC6k7kUytK6oXuXOYTHHAkj6ofZslDac5hHIH0Cyvilb1AHWD2ozLaQAQPBkZE22k+UG7FqvmFE5X2SGMQJwSbGuk25gTlcVkc\/Kh0xjE\/BJscBz8q150DWuucwCD3LHCOcsk5xo9q32D0cY4w1j3rnWPcdg4E91Dig\/HSOcpx5whTnKP0OAdt9I3xsMw3wtbMN4GRzlHafGO8KotifhBWZ1HxY6AQ55MbjG+VcZYhThDbmcXtwrxAIVJ2HXWB8bY81miCCwKLstjV\/8wFSlu0bD3iALELWfwO1AMUcshOmiRP7WFZHv1IX2BwlusV08SpvSzLpz+SOGFIlvM5JGlqT8ry6kCTJhSy3DchCVMuZiX\/98YRAFZQOCAeCwAAEDoAnQEqoACgAD5JII1FIqIhEzpuMCgEhLO3bpr8fTbcO0EGAzJn9VffAsmbIUPEH967NP7p+RH7deu\/hy8IeyP9a\/6fOt3O+SL7Dfdv7Z+y\/5pfIvfD7\/tQL8Y\/kf95\/KX8qOO6zvzAvVP5l\/l\/7r\/c\/91\/g\/RG\/p\/Rn6r\/4z8iPoA\/kP85\/z\/5W+rz4V3nHsAfyf+v\/7T8sflb\/mP93\/l\/yS9wf5l\/eP+P\/jPgH\/k\/9D\/0391\/ef\/Nf\/\/\/\/\/dV7Nf2q9k39bf\/Od7cIP\/xHl0lnH8R5TW5aegVtN8X3LBMQ4c2hMYale594\/PiuzNUSunFOg+3A8A9aurlCEQuFXj0HCeNhHFIGthsDXlV5rNvEy2SDxbbKfLEgdIw9cYzqIyYcKU6mgYvc8CgtVTqYCzdtfgqdvVfQZRPLJL3Ysu7DaLBNl9xSu+zV3fuJg6+SLk7JpmWrxk\/XOqPIrWnS3o5hzzSQR1eYu0B6IPYTiWr+hyxjfW\/s6bUu7z2rE5Ot1E6YLO7KQiTnBBQdtGYbQ3qu93HCed+h8RKd6+uV1kXJ5QNUyZfDXMqtZm\/tDF2Hy0\/C0KFjwbW1eoVjgRAJ2M32xMGSBZ0cZyWMEsERydkTvl0lnH8NwAA\/v5HgADW\/AqZC4Wvc0dLAEoN\/+82ZmdypGFFw2\/pdey8aBvmbdatEt7KuCAzn2LLxVxnV3bvJ0CBWuUJYU4nPg1MrPHP3ARsdNtRaxrTSFVdXkjISGgbIjjeUeUJzEP+PqTKlXsF\/4Zu61wMnmOWWOXYK2GhR5SAI5fNw99nc65KCFs4pnDv01JNnD1nh+p8di9yYSfzCueRotF6Iz3WSC1f\/4BHcJXcPOBakujxP9HGg8k\/\/jAZJb3UVKE6O6B1gsHvTHCfzURFraHschn\/7eU2zFC6FKEb8wZW5v4EO4qUWADr7h7ZDromBx\/vBu8nfzU0p00UMcIHgbAFF4kzQa54hO7ow87luzDHjbTeBZKn\/qiYjuqaPntrHr7VlMNStFfHKDAnqyj1kNIkB05p4czvCjU66UIjv8CZB4xwL8i5IysJ\/dsqksDvqNNF20ebsVVLFrDDc8yZPQJBPGKBoc5RqJv6TbqBND+wY\/pz+8f8\/RP+f+n91T9yAHVm9RtC5+VtfdMFASVjgMIwt3r6v5727p3K85gwTUetkOcv3Uf\/\/9WkSKhyGJRDB\/\/J+euHUxb7gwy9\/9d7dhjH\/0MY+5kSSY6A5PYIbHoaEFNr2X4zeaP+QQa6gMlOD2jXzdLnsOCM\/iALMNNPrM\/4hqjT0GEo34+JCycvfRamh265c0+egaKh7cKKrHeMBcTwsk4aF+tYsx4L\/6ioxBaroZwDItVu67TTViuIudgqDqq3NTPYYqQjBEqamWiq9IJQfW+gDheMxY4ldC4+X45X8rbdteVUMv7pWMHcsgsm72YaErF9INoTAq0TKeDHOsT3HMvsMdsCm9FXPA82nucc6ryP+swIC5DJ\/QC5+wsXioLfeVtdkmM961w\/JVwupi94lMwVS4RJiZludm1qgEw8AOwCar2ZINOJ\/\/qetuHRYqPnEP7j\/jICRQE4yYV7oxE4O4\/rj6SC0yzxqME8PoXVhnJT+QLFutdp1zYo\/YbJJ6SFJmdZkHleRIEIuqRPqGlebw6t8oRhp6Zk6Cn58wsiuIXeFXgH2Y3ZSb+ReGpbxkA0LyUhwOOul+RpLq8AO24H+mi27zROAM6cEE+JkbBmJ4XVLhJJt169jgevUs4vjcz\/xXwAKDdJ1FVskhJWJNRC9EMnbqFqGlWBZ4LT2KVw2nZab55qlf+E2RVweYOTNC3lnvwIMuL3QIkXcQ3a2L9yVKQfd+Y2anr3IJlbU7OvkdsppOvFBHoG1ZQcaxVhzTW4r5lVWzc+YcNHlman3acZYEaMNNi3uXQhmXt8RpYbZ4Exb8bJZh8fNrhz6lerpCwFaWitqz2L3TxXrSE6at5hv0qzCeDunvVVbIp5pCucMawTC+GVOromrhm5ndjzz4R061dh0i93\/W0SoP+sK8QwvRa13atwToYjTAw9kd2xBiQe75ZhMDvmRt+4YE7a9breSyY+a\/\/mL3O\/gU7opDcL8l6+yJ9c7b8iFy+dUFcjC9aYGhkvuPI+hGTikoA0dm2bc7eL9epBXAY2LnCn3dUeqx6zqYPQVhfKiT8mPHTNpJ2W\/J8cKKcg1u3M55eBzeXKMgymijk964RpC2ycoPP+nYW5JA48t1HIeiu7geHjlpC6E3WvkaIFYe0S05\/WL8oLso\/BI9CArXYTuE7uYHK12wVO0Ha1CO85HrjhwsM34zAMvXDyxp8+IahZxPXepVac1Owth7tI3JdV02YpfifXz18AH7L4SGWwhpKAIFz3D2VvNoZQ3\/CL+MAszbewW\/z652zEjdbp7qYekED+LLDeIbpeCfEp17laEzLBXx9sDVixkqdP5Aihh3emVaWsZKecY0Ucxf\/\/Hm4Rs4I1VMT\/\/paz4++nTJwESgP7eZjZz1NZNRCeY4GVM5\/+\/+zjapuBuz909dvO3vKvL8YFqH6IZvw03gJ\/O\/TdRueJXezB9dtkMyBPZPz+ZE7bl8h8K9+te61g51EPv1fW1AkBQeMOabk2R96RlArVa5E+ks3As4KPAY68vHKrYKG489rd23EiJp2an\/QPloSivdXgh1BicaCFWhaQlNb3aV9aA6AL9abzwsyhGHekcRigOkPXwaa34YzHb8y4ZFJDaho3gIs9k0KMuiJjFYmYBvMhaY2nS48iO2f+gaRJaRPTHq+vJdNYkxRUK\/6IVCP+I0H0CPNDMfYRFyQj7HEt6oGeUg105MW2nxD+\/gmIeeuYe2pJSnFKdgiKrCr9Sg+nww2toLfYFh0GYL\/2CzZtkAWZjoKKIr9L5ObbNe0gCTWfECC7t5tTDuUZy+cbVl6GPKBHl3Ei23akHDNPdDdZqn7gYl4zGTVKoC6ZJqycnZx\/s4zoI4Q8VlhPquknJ6nYdq+Qlr1q2ZrLE3hQ3i1KVFwxjFMerc+Mfv\/m3VSk3T6u9ao50FEyQvx4l2FMkUl66khNkI21yidaEvv8tpsX4vJgR04yvLT3v+aLa2SrbdVCsxpF9mPFheKixk19H+\/D3zQWstg9uvTfBDJumB3cR5FjWdkpKr6Yoa+UI5pea6GyorXlkPiE3EIyQLSPrA5fiGJTgxAcFu6cFuSy+D\/Oy6Eo0KllLJNf\/lYbh6\/liF+zzXjbWWsM5LUodyRUVJaYziSfsE4rPVkgxSLYizp1nOqDPLRBsgFRRLEXarC1QCG328CI5TG2tbW1DWzQitiHF9G595y7xI\/tRBl1dQjOm3ht9EFCKCeoWU2F5Z12a+KzaPvf5cOpyS9qPRvoHxc+m1jG7ED4KFDtKUIlu58H1HdDAwrc1ZUp8xQIyDEJQuVUnCfhhKKy57\/esTqtXwS+LjJ\/BH8mjm1YeXwogb4OmgpYYGqJRR+s5BSVSG1iZ\/280HDtQCAsXxT\/uoZPKFNnNCfvUoxibL9LAMed0WVguuViXEX0XYRLncvBLd7dNNf85LVRCKGhArvcwqGgH1cfNi8jsnXFRcrpHAm4n7fG8HKcBvPlvr0CVtXB3u8A4kvJCMhlir\/5ReVnX+ln67GwMHh+893kf3KLVKTPA1sJ1KeErpUF7+Y\/\/fDpi1wJVAXky5iCsR388BsOKJ\/aiRLgqndJyAuHAfCA4l97sR9fAWq3es1YYfrslBcvZAQROTFDWiak6NklJsZjZdm2VJ23WOCHCqGojh2nph5DBP4BNHTiBug8hF\/ucoAAAAA=\",\r\n        \/\/ Interface\r\n        \"interface\": \"data:image\/webp;base64,UklGRm4WAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSP0KAAAB8If+\/ysn+v89Xq9TZiZ9ZpI1ZmPMXrH3mth74Vq7rL1t77u6DeNWWTFXy1UUJeI2iehVRFZCgmwQSVgkIVwkBBFRQgghBCWEYRiGw+FwePxxzpwpjl7XfxsRE4Df\/P8bMsVBm3\/yZZXAitpPa2v82WMTTYO7soh4c5TOb7LHSdM0zGPZQzSShmNx9jjNaJTfpUcombSPUZtNm15rm5o9nhshY5XpyegiGibnw6lkDQTWvJeD9I79vZo5y+0Iv8ZTdulNUs+cvzNmlz9trjNqaJnTQprK0+acZVLPmABtmlr2UxVVejlLk9KDCkhVUdVEz8+ZI4Hyda2NiwGoDulBqIqiiuSEqiiq8CJURZVpeev0t3X5ADbXnT6tQK64HIvHh07kuhz7Y90AbZ6v++O3dWMdGHfsQSwSj13cAglgNsk7BbV0ht+su0DSPldXV\/eNgDr9VFc8Ho93v5nrSZl1useIx+Odr5S5FXxwLxqJDx6vTEM\/yXIAq0gKfzdJyyLjHziG6XU+AHmYif+iAmi0ogZNWoYVN8f30qtYEqHHFR6W95G06RyRANQvmfiomrJ2M2KWAphlxofL7tHdJOcDiHqqBgqaGSV7\/hYlY\/w1B3iLJi1atmHEuOShJ+wmaVm2RcYsLnMIKT8jIyQti+QpAMo9GuS1v42SETYqqepgnI65NA2LbFnkm\/ZKnGZ8xA\/MrFn4Ky2+WF2zoDoXspERflImoFbdZYzNQBUNJuzfOa16C21aG6qrqxcgl\/+Zr2uaFjxPw7Q0OOsYs3h15wxNCy\/uXAzI64yyMQ9Qq3sY5YvpM2ixGs4xw1acb8F5hiYlXOcwwhNwVR\/YMZZiqsNmdMu6xRKAQpumgOsYJLxix1jtWMuoZW+GuxDAHkb5HlyVTsvs0dJn8gRc5duMs83lAk36XESnZfYqbiizYvwEUxwGN8M94NDcPFYyatcCUA3b5BJ41SJx+yoSTrMiXJ+2mN0v3VAYM+wHiqOBJjWXqRzlamhuvmGyHRNp0OQuJPQ71KTQa\/OeAPYxxkZNelnJKMsSyRjtM2mL8iISP6TBkmRetY2ogsS1jBtqBQ3b7pPp0J4rKekl+wXQYkft6fD8o80heKwn76RtlCsSiT4aDCXTSjt+aM+uPc69L7XTpDaOhsU7SJWv+nzXY5K02Sfgj1k2NU\/iNu3eg3v3uO7b3UIznpu++UmEk2miRc9GzHC7nyLlaJwJXXJpsBmec2nTuxEzC9JXnZ7mZEjq5TRM1qUm7yYtm0O339y0dcglh3HWegvYyZAsTN\/CdNnGO4cOH0p88IisdFxNifiVUQ7NUQGgnS52nPXecmiy49CRQ163iieOj5HspNStZ5Td+XDtcMmlxVHpKWDG+TUyMYNu0Ir6UmBwa0r+axvRIrjfcdFGbcMKeUILOaJmCd1lqz3KmmSqHLtS4X9sshtJoN6Ostbb3+0oKzOh3YyYjtnmI3OBh\/tm1Aw5zpkxU3GZyojZJpNYYMVNq8WDzzTMmKOCo2ZHgmAkat4XwExG43zB00yOGte1DOgj+TyARSSXeIiTLHH8i+QyF\/kfkndyPGlNJHnCg58kNQABkvS5yH6ScQHIAZKc5EX2kRxU01cYDoUlgILSUFhNhGA4HBaO3HAoXCgcUMsqQ6UF3tTWwfsdeR5EOByeAmdhOFSsuBWHwuEgABRWhcOlY7xgfGk4VCLSl5nSJbFMBEgpgIBMkKxbWn34311K+AMBTfPD9wwhJAChLbze0t5PdtG1lz1Xjs3zqZp4BkDp389ciJEcePjewYOv7969e+\/e3a\/vOUXXu6\/NmjZtup4yoWQ\/MfP4CMkTLxX7kWxxcfGY1Vce0zm0\/fmUCL0her6h48cTE0XWEcjZAIjc0vMW+cP0Cg2pF\/n+HS0k+c28wmQOv95E8teGdpLxTyv17DIFkKi6SvKLUz8gA0ML6y8Pkp\/sHpdoyp5asv\/8mlwA6uSZjeStrWq2UNeH\/L7g6nNt5HczNeTpmeBcV\/dqhOzpbPp7\/Zqv75B3\/rJXgccZJ8nu5pVPjKKq6vh58+fNW7Bg0eI2ug9tCiCjcwGRe7i7m6726J5yAc\/h9W+Rr2aaUKomTdh25sI1JhkxSe5VJZ7QnKLCmgOt\/ST5nzPn3pkwqUJKAH5g9hg1o+T6j\/5L1+7TRz\/65JMPPmp5\/+2lG577zCDPLgjiSRelE176ZIiuw492jCsPlRUiw7tIdn0xqbJShddlTX3kayFkTSH0FzY3MaFp1u4MTQwGteSCqSmcNbNEwH2MACCUL+6SXbuLkXVDFYoyp+H8d1cu0\/3xwwdeB0YMnq1KRfJ61V1yaLdAVvcvW7Zs+fLVO1pvJ751+9zGDcuLZPqCey2yIVfFs+rvSV4vFXh21Z4vG4v\/t+oSgK6nbtJrRZlTVQ0gR2adCxcANPzLk\/T0Ud9LyQnhJpKr7wUEq7JO\/Q0A9T8AQopSXQDQlBJdugl7NwAUVrgpRSoQEHqR4lDhKxCJhE8euwEsugtADfoAKBKAFIBWrENA5MM3RjikVqhAVeXksA+AX6kMpOdv\/wHw9x+BOSNdEWs7gNd\/3tX8hdt2Y6QJuHbqZEsFID4bbOlVIS\/f\/UtkKyC7uh\/YPwq3yaMnO4e\/A2aPA\/SOT2\/9UWBpXMcUw4fgjZ23j\/igDnY\/iPxFBca19rZeA8Y+eP1iiwJcuDkwOT311yDwpx+B2Vwqqqgjh\/uKNzHggke7BeAvKe87DhyxdEjgg2EFlcwHHh0XeaxyEcOH4PvXVbjnlx+gBhF5BTdOAaKo+NM4gNaLQuccoOmShARu\/1wyhVuBW5cF0ttwQUg0XgIWmIDPDKLC+OHnhi9z3AZfBMSnPUdufg0Mfgpn93uANIPAyHIIY6pLkBJ4\/6bb9PvnDxoasP5uGX3A0r4zn44A6DwIPFoPyVI4R1qvXjk5G2h7FWk++iiElZwALCaQy0Lo3Cugwj2+ExjLAIZOAqs4RgQEDjOE5cwBrC2QnOaCR\/UibF9xG6lHDVVA9PIDANyHPRTAvaMANwBtHX7kAv9pBnwAuo8DWFYGrC0HclMhvmm+3P8KgCltgK8tB1jQdffOqwmuLwbEZzcuXdoJ4Mhg+w0V8lhXS+90QN6cB9FW4TZtcPDi5eNuy9uvXmopBLCpXQewsu3SxR91oGEr0DIPyL840HYJ8N9sb23zAWd3An7uBHgZYkMqAOQi6aIAvIsCCSEBvM58AFAKkcoieBQ58C79kPDuC8OpP4fEIRXQAMgUZa7adsPveIaV+D+21lTryOsoB4TPS97tslRtO\/uUeZUsBqCdKobYSJ+A0LQ8n0Dgig9QhKK6qLqWqHKVQ9EU8ZQYWHPrBAD0VKF6ePTeRMy7f6eHNagcGAdcGOzp\/0UHctuu976VYF8jgKPsHtj+dFgYEdWUgOA0YEk8IIQK3+CfNExgFXDlnq7YmwD4ZpxkgqNdQCXLRIjTngaymd137UWAsKcAc2wAkB1nIfA7\/g745SjwcAcQ7PrXzc4E77UDX0Z9Aq0XISEACCFE1iqyp+n6qQEBYU0GFlEA6u1rADDJegFoPg4Mb4NgK6YMSbf324EKzsJUToeYHUDuVkWopVnrRAeAEo6H5AwgGOsfj2scvNk+BxWcBHR+Czw4AKw07z1ihdurnQAODP0yUgstyA0o4Srkfpu1dBUA8jSgQALQgwpy84vCYQ0okECODmgagNyQni9dlMYbAKCFVUDIPAGUKoCetZ5AMTCc4\/jN\/79lEwBWUDggSgsAAJA3AJ0BKqAAoAA+SSSORSKiIRIadagoBISzt26bD1MSLFXV9Sf4a0QH6x\/sB74Hol\/4HmAdYB6AH6gemH7HvlXZpX\/M+07\/AeGfic9We3XKK6D7cvnPz873\/iB\/d+oR6\/7+3YmZX\/j\/QC9gPoX+x8KDUX75+wB\/LP6z58f6rwG\/s3+l9gD+Rf07\/nf5b8pPpU\/pf\/F\/f\/On+d\/5j\/v\/574BP5b\/Wv+h\/hva79jfojfsf\/7SztvlbW+Vtb5W1vaOVD7g+VH+2\/dNprDsWD+VYYBEGD2SfkEOlU+wdnYdGQmPHvvtxFE03018LHoLm00fyq87hKcfkCbrNhu8fvIysoqqdOTg2Uv4yPMA8nxsB+K334dL2+44y1NdaHYj3gur6QosZkyVFvpFVt+VA35TWqvqQDyDC+5v1cGKTcFfGI7kH\/ki9L2ML4pJlpuXIcawv72X2gXL+G\/4ieOpYz4f\/96qe8JT\/7SvAsXqlLXgFUU1w8SwjQOTEldqVWyCWcOPIM+HDY5xqptYPSQz1zUXgCc4E5f\/JQ\/l94ABiClOi4ebNz2Duz1q\/dt6\/vDLQXksOXcJakgt6rHvDmP+UbTInoeVtb5WMAD+\/gbQAE\/GO9dqat3I4wy0uVjqtIph0y6\/R7szMs9cOD0X1+b0YWZwp93c3Vbl9m+Sl4RbVQWyGK4ePE9bxv0oCOvINpfhN4JU2xJAt9w+HoweUjub0lm1IyA9G3B8IvJnmsrpY\/1scPFHazHpX2TJKJ9R5XUboXWkgGGgFAj+KhrHt+Xk3JbFYkF6TzKvn1xBBmEaToouTFjtKljPVQdvVYmIUoNKmLAzCcUSFZ+nu\/TTWaiyKDJ3D7hLx67vbeY3mqSsOpFwQlw6D1p8MC4guABuDlSwV0E0BerHzUhypHtw3qndJ4XxLIjf4M30YwWur\/5VegGEJboPOu1Ls9v2wyIbGDniVGyiWclP\/n+DL+9HH\/6c\/MnINKA856IV6nW7vUHKAmUGTsUBJ\/CQS\/nhuYQPk\/XiS+3DLMbi0H3Xx8Eo74TQ2YpWXI54mRoJA1XDfG7\/pGVRwL03Ex4CdTyBj\/Bm3ZW+xF\/gAtJGvfg2n7oAzB50vNVjiIFFOyghCa+JiKhP32FVeZitK7xDd4wR2KDUQ1Zv07FhXCCtVWkMfe\/U\/8mxdhzXzMZpGy\/0kuuAHrbD3Hr9VPK8sq\/5PZpIBGksNTrQnGk9i\/JVcApHgCqJjHYtIr5Sa+axkHCI8DMekXsooBdZ6lIemoQS+aET2sZ2OCuwf\/R6thhi2arvg60bq+YsuqRec7\/aKNawjLhQp1Z7k5EROgWTPYJpMaV+3qE3QU+vOoIVxgiyqI4BNqJxfFYaphp8hOVn7RegSg8\/hkoVqLHKLtQ1x5RuXLXSMHVhlPTuphKvThX9vPMTfIPngC6gEk7giy60lOW\/iyaiwBqZFGg8JqORtrTQJwWHSBDUaO68p3u2O+HKdjksMEYxbEyD09+fKJzc0+WG539fCwzmfFc1NftcjrjrhTxI\/7aIjvbsbkNWQO26HGs6jAYdNcQZYgYjDksLz61vslPpf5q62KmzaIgjPGfh6glM2YNBkHVuOpLf+reMfFJbJb1Hv9YrQWZQMSjaRaUuPbf1WAny76hZ541WTWFvtwOPXv5c0d7P9yI\/PA8CA6nU5KA37Eflua+\/+CG\/7hW1Crz5295LfSniDAozrfL8W6Y29E4bnzu4SKGKTOhsW5wuC5QGBKTx2tM54r1nn+2+67Qd+60UT6NZe\/xdpaTED7CnsoaluZ2prge46rbw7ekb4Ait3TELn6eyoFsVptWGnVasvT\/Xrv5P6Ens9toGit+UemG8eltxxxo3UavjrU51XP4OAo6hfr3LzM8imD6\/KoKZ698CRvEILEyZC+Q4BEmkI03kq9BfmOQhGVQnTyHW9BVLEf4GdMQ\/iFjOZYKbWN+FhXqW+oAsPJgrgjKi8pcFrjeQMnFcuPKdzX1QpaasfKilZLXYyEsF47REBMMZQg\/9xFtNbrGhZLL0F+gKcJ3NBKAb\/d9IcOQ\/kbzdG+yaPP9pRnv059324+zUS723xvKgwSYhBn\/18XPv3yckiZYwGLvmBf65HfvdbnSuUzKH\/4QLxAFIvd4mMYBY8M2OofVTY82+gzW9\/tnZkqhLsojc0w07BaEeW7X6BfixCAGuEJ7yi7fh9uCqvfPZa81MUU3lEjsWGB5\/maWz0jA\/\/+0i\/kuLWpeGSwptmyYTpfBOc173d2vekfbdCRo39jyXKMF16IkHAnRUCk4Wn3q47v+Abj1aFTWMkAkDnqYjCyQL\/VUI\/\/OEn8naObKgnse3pA0tROP4jWF+Ef4DkGf2kpugKlvHazr3MPBzPkoFzCNcSczQErZ0M7uRM35xe5sgQBz9qTqB7IY+C1YtLT9BAVQf8PV9mC75tG7a30xbsTPzkAG5xWxsPSQWSfZo0I2gkKgiH5H\/qh9\/r\/\/Bt+g9\/6qYgJNU6530wR1nyMYn3RFv16m253aOxVW8k7aios4xK7szCLqyU8\/lx1o2TJYb+8bUkns9z89y7DwTNMAItncjaKrprW\/0NXk6Ot0dr8k+tx5OLv7vT9xOTvRePrFSYjn8XKBmYMkBtqSwcz1kz3LOhu\/GSm8ewp9f6UpycchVOwOj9HIoZ97JZ\/gbFHvjBbkxDD33mt\/aKal3BzFt3bD0+jtP8063xnJaQ\/aQanudW8es24ewhA4e+fesO74WTwrTEfpr\/NA5pag81h31\/fWqQHrmeaBDD1G9bU9eYv190A7m+FEgaKyY1hox8FVdk0\/JAxltx1\/nhAARGZPL0iNm\/eTQR+yy4hwj9ZReUBrwN6I\/KovxcCOM5bPS3Icf5320VbCeOPSkNNrYdhUjRfZzz6ZR+SSQDfDdBkIkihbKgGxhqTO7CJ1cZYDHgPGoiFRkA4Ct63FvJCefQftMZhDpJNYS+\/W+8+L5qL5FYg8OyuRhnKn5AeqynUwVcWRTbVi0mw33w+ROFB+ithYgZC5y24mVmTvXvVpJAnYTYD7UJolpn\/BKfHiCK5zWdqnZgtSobbZX+L4jAPGX7penR+e28sROZFyVne1m35Y34pZPDEgWXJSzBIFOB+B9doOZFwR7wxQbcLt4kdYlYTvk98VOYntsO53w2q4mZouT\/R0iKueQXy2z8H+fmEYwCuWcp8dvZHry8K9cmUTq47u9OXt\/m912PgvHwNNZ0yAuGO7wV4\/YG14knlNtLQn7meKJMNDx+u4tyezAK6yDWAfTxHetwk4EYP7zt4jQed0EfIH4SvALS9KR3Fj6fYTzXX2M+SBwriahT\/XmaAmRcfmbyKzrGbQhqbEtXLLP6bsRp3PPv+Lfe7uf3d2sIPuute8v1bv+evQcGm2Bzg9038r1\/z7L0Wk5rqwozqxaUm0oyLKrqYBfh6lfJU7jLdYMkSFz3+TnLb\/F\/IhpqI2jGCqoTJw++nvLPJr6f3bB+woEqHuFkYIVpDtPtuasleVHKCevYcWPHQFMQtcGCGfPeevmX5mPN5oxrT7e7fx15WjbpaPwoBe85g6idxotMIFPkmwiU3u6k53gprK1wT3qfcfNXXXjd8GACnjz3Kog\/TbRMBgN0Zl3OpMJMSQkzZBxL9M\/F7Lx3LP0n340SnY62ZS87C7aX\/wSGkt7W4kemkwL+GST4FauiH53XYssNn8aq\/jzX3ZO5jHLvtPVu5h5ybPjGL8zaeOOFjLciVwfGci+CIqER+2xbotV\/F3gwET3HTvRRYKWJFRVbW1hJdXVJYIPRiXiV1K1a6EM3Ja2iCMYQdZKrm6UeSdN\/Psf6kFDCFCFiTyVzSMHaYQCXQsAF6bapXM8AAAAAAA=\",\r\n        \/\/ LES JARDINS DE L'ESPERANCE\r\n        \"lesjardinsdelesperance\": \"data:image\/webp;base64,UklGRrocAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSJIPAAAB8Ifs\/2yn9f891h6ysxOjSUxMjDG1tSdtHTq3xs5zmXumTjjRWqp2OJMV6xlUjlgUD5UjiqWi+B6UokiDVCQioZ5JEVFEpCgiIcgmm7BZLBaLxWLx4v5jDXsnpuf91+EdEROg\/\/f\/f7YtNelq8781\/4c\/aSqmeJON5CY2WbJ0c58ho2uFiezmLzE6hL4uj5TLV8sN\/2YMlUqWrgOUiL9eapTeL3VNHAeHM5K2D18fTn95+J7xMQTolImkDEynVtM9QZy8fhWGr12\/Rg1Hrj88HgCuUaVjuqV13DIxnGRsnVunXrnyxhhYjq5EqrZplqyMJsRBxtZQKsH7Y6CsqFGrJkx7jKKeWSyrVtbfJVMbf+LoD8fGo28+ZZap5hYSNS3RPmEwxm5wezcjPNW5Jqb+9LHTa2XFnD79jaRsjWx6NWHmRlJ5bmIIvuuGYYn7exjh0Xl\/l6W2U2cB1kmy\/v49cOpbqTa2mSpJa2ZNCBpO45HScQAMH1oLKfGq8pKaMYFrYKPqzkDogCfrek0MR482SRcWTgw3krwSPXWx9XU74fm6uq\/X1mW0EMfzfiap9ZwdAiGnVI9jwHHMeTUN1QI8OqScNcHATCVnCgVJ2aykPsrm87ykbspsmYrNARUdh39mYaRBmuRU4TqO496gVxNngsuMRtW2jxHekqTppszqLHYYbs\/g4KzPtLuSRE3v0MRjoxr2Hu6VFjDC0hjKfGIxGh7OaJrxYLWIFE0aj6bipGJ9UROQ4dg3Bw+k\/+bAZR6SHmGEJXEVhvoJArYq65SAb8oRpQrdvZpwE2ocntrfdXsaOwyocK2YV5HYG9URcvh\/MhNVWEOAe3sY4T3JUicVgGuFwldSrtGMEA5H9pA+hG\/21E9MtXXCOT3+CD+VpBmYXYX2lgZl2rK7P98G4G+QRLWmEtL84+Fyxx1U\/As92Z3zJ3n2D32KLQBn6ghA2hnGObaJcYA6Scu6fiSeziw1Dj8cYPEkyvDlrkWS8pVKWF6DqbTqe2Idm3iXOVNalm3bvonWieKyARzbtm1Tm9d0tz1iwPvQetJ2gQFJBW4QPasTs4OIDTOnDmHwgnmSrgP8z8atLRMCru3YRI2dNkh6RS+CbQ+zW9O5ZpfKOyTpTkp22fY49hMBhExvky5hsJGk7N7AA7h9QmgD6J3W0TXNpoYuL6h+2gdAf4OyLwCcjuguosUp2mKgUumSpIsYQm9bTlpyIzSEZbt7QlBbZ0enolM6k7s7txPEPScp09zYWZCkzmmdnVNi1NnR2Tlj6bufAzZI0irHADaNUlO\/CeEGvRNDjZfgxb0kSa33qMZAgE13VyTEgBc+YEn3nAoMLm9nJyxLK+McFkQW7lWmNoZ622GmolttABtJKgFe8KqlCXxFXOgf6pZuuXj+dtXy089uNG6EHsXeN4qB0Nuck9p6jlKmWT8COHwsWe9ydsWchMKbCWvAfmHW7FnSyoguRXCYJElbKdNTxaSVK3tiiivnRVa+v2LlSzefH64rqv2tdQaG3ls5LzId1S1f+sHy1Tg+PCFpOSuXL\/9wlUPUDizJ0heMMDlm+vKly5cvX7H8KJxbPltSJ0PLVy3fTHT5itdvMoc+qQ\/AA0aW9Un1g8oS9YEASXikDfw1WWnhhdD3tjZp4epF50n0PLi47C7Nogzg+b5ngDduLpdXpLmVUSD0PehXfh3rVvu25\/lES5JcvGgcNk3SIXwq3K4ZA+D5XjQA48H1+fkPKPueD2A8N+TmclggPcqw63iA5\/1ZtzB3FT7Jw5IM6Z3R3D1vnzYGO+iSPqRKU2GnrDd9j0RjziesvzmCYH+X6jcRb8Jz9+Z7lfHtGOM4HtIvqfIGmT1EbbqlaffsIEiDH66WGqkAxnHBcCHhpZsDh2ek3AP33r8SHwKOSSrixETvkYh3TIzH2zpOkCS9gpOOz6WGGMDFcUafixvvSQFnb1W0gwoEZrss1ccYc\/3hvnsluXHxvv+aNPu0MSnexU0XfqbCb3wfw6XHFlEBP7ypAra8NCumPYZdUkLoo1gnEjJ7CAM2lqQdhCkWVcMe9VCBkH3SMvpeg6efuYmcYKHU8sxTzz+7Fr8KAw\/EETd3OOJQlLQ31cs4acKwf6a6IobLL8\/XU9Izr8O46X2qBjzX1TWD5DSG4R7FPxVJdihI2pOmfU8YpPFZIeU\/qPjEzpMl6VneHC8nee\/xvrfr0\/jh+lznoiWjo67rx+1OMdRjSXpUkokZcUwtLG3DJd0aWWpkyAfjhNwrrXpdL75bq74qH+s77QCr8+nWTNFsKiQGbJVUxAEDkixSxFcldewPgkjgx62WVFhNbBjS9\/gri1R7auiVb\/wslwaHx7ObK36SMefmZHpzXsRcnZPK8NYrozFFSbtMCr2ME4n3w08lyXr1PdcGTABtGkOnagMBBxskSx\/GBcHKtXikCK48WMDCBgxIej0hQLqAwSYjaZA0i3Ah4MsNBOCxIyLVgQ8YO2AsqGHgrrUU\/Tgu6pPSZ5\/WLtTrgQ9m9CnFx+WsHzD4wfMZ6f7zxiS9HXG4tQWbMDw0Pcaqf2cNPmDMP8dXhYIkzcq\/k+R7pAzNqa7CImXmhR6Gi6pCuoiBCllJ2wiS3o24PHQbDoHZ0RAT\/aXng6HUO65spkYu3vpsUvrQHGqSegvYVBfy4JxSxK88lZG+SvMKDjjMbsUGj92S5vTOmXPvnLl4gIFx1hzZP\/3F2uBzRe\/\/U64TudGTKq3NJGlXislfhj74fPIuPvjBp6r7DamNOTt2fg0OdL2QFARpTHhhTgNf3YsPGKjCsU2M4xbTWPoMl7Q+a9R88EbFtm3bjWOke8ww1Z2Z9WxCSOrA\/Fn1fyDeVH5WRbJDFW96XozvxZhfS\/VhhSrHyPAJxlTzSuPP4gL6d4RhCo5IufBqxHBBNRr1GxOCGbL0a5yYeJ8tUjflNMZ33h4jH71JaKqQPo0JvYHG2ygnmODCk1ITscZP4VUBWemvJqDCLEl3XSZIYYIzD0nFr3GTfMM5jVlOi0lMsLQ4xma+Zg\/ixRiHXbLUzG+DECBIIogEMZ6\/ec1TOfUThN6eJkmaNWh7IWEY8XhLDTOV2YsTxhj4I2NnSe9VTEJrRA3bTQB44W\/rNWUQNwhCwH5OUsMvxUgQjKxbmbSOIAjABEEQQFabpujly16ZyZJk6VkggCAIAjf4pq3nMymzD4Ig8GHdu1o\/dhlZGsBEKhQlWdqCT9ThbWnK9wDBuY1PKLawGygp7R+AYD3RbRvyin6Ny8yI2t7b8MfznDhO7A9vKJrZuIPoEo1tgqTWy3FusEDRJUGcGzwsS1O2btxylD8o5eYNWz5JpY2bN6KPt3yxcZMSf7blDF0xi3qlKZvqcls2fPHFhtN\/lPKTJcna8vmqLctkjYPAzJDAEOvwhCbf3v4lQYwfri0qNrPu8XxLUk0\/UdUf0hwjqalexYKibT\/PNNxxOSIprzGPIaBHK8oJDFN4aE+AITa0rz6k\/NS2qVOnWJpfaW5rbmmQZLW3t0RapqilpaW5uU3KT2lvb2vXpJaWluYW1XW07TZ9Lcq2NLe1t6x4xnp1XXtnUZb0wabC9SltDcq0P0J7q6SW5paWluYxoUReVwnjXHdBXfbzIIiDR6WFRAcLbSHAdUkFCCRZIGItEWtdItpzkdgntxN9Q9Id8L6UW8qKaYdhUI1QIWhUN7Fj4zk5raGmIYO750tz7RPb+sv8tt6UTn0x+q6kvG0PxozKrtifrf5Mk67Zjg3WfrtCOMrBM85fzvr8\/axdsZ0hfqr8okrlN3lN+\/4Gq+TaWzVndBS8q+KGhz1mSFpUNgmubQdxtrlHkubzuroJX89h1reflKQ6OBvZ84XA5LI5AYatm9SP+cs1p6L3af6UPU3LjA+O94R+ju3ysaw7CdbdblhtEbBrJyflBM4WNq0bG9+0y6o7hYlLa\/OCVF83myWaR7hxDg4cmZxktUoSBkCbwQ2LWR2H+j0hudWA3\/7EkG\/A4RX1+Y7vrc3cySgQsneWa69Sx\/6VwlzKhdnC2OCR10GqNwFXeqVXnmlnke7CuX6K6Oak3Lk0ltb7AB0nMcDR9h0GYM4ifBO6F+Zll4QOPus79rmB78LIAF+rYVC6xXgAl2oUJjlZ6bNKaNIZuNqt6J38XLcZ1rRy6a+731DcacVj2LVzlxoyw3t3lionXdgfnNZbo8G3O3d\/eczGYJin1wnBOD880mFCCNnayKGmBqnzgoe\/\/5ivGmMSsGRpEIxJEXCuv0vR3MvBrwuPU\/qnY7Zb2UxjvVRnwguFYjFiTGhZmQJQsM6QPxoa\/aGgzF\/CLiuTzawO3FOXeKv4tnf+22uEr86kcn3QBMYrG9hWnOXImEvS3oYafUe8b1okrT82Api4gCsdip\/nA7ivqYXYv0p1xEaIP0z0+xFj0yRpK\/EG2nrKAK9o5jWiP7cw\/FFwoB4GLAgmNxVorI36wxg8WvN10tFL\/+ODMcbA1TZZceo48c3Bo89LrQOHjhz65wFJuYH+44eP7IwMHB84cuQQ2jPAt8el05ypk6R3Br4+sP9Idu6JgTl68Lv\/2Xd4gdRx4mD\/d8cXzxw4PPBOZuDIP8tHvt2ggf4TQ8M2P9RImBhcoJAfKFgbTvoA5wbbVOviPtX0ZKt0XJI2DypaL1mqdfcOSapTfL1iT6rWAyS6I25+pJA53aIPT508dqpF4\/68pcRsXtK+6dp3S1Imq1++kyK287gs1eWU\/3vcGA4kRIP6K52qZS6bS5\/P5XKZuFzKvLK5fC6XyxXy55iWzSmTUyYXm8\/t+E0uY+WyOStNtI2LuZxysflszTQQJnmGCjOzKaysJcl6k1oOR7L11Na41Hx1Np9NzmenUTKkrZ3sJPDwYVYm4R36ZKnPKXnVuu7odklF8Gpr8L1qw9CLpVof46UsZzI1GwxTAIEHP4l7c+QnknQvNlWGHJFUZNRnvIdeep+qa6aRdBCU6I35dIGi95UdU9VRKc8oE6zn1Sx7+tK1dFDmjkjyPfhVnZCyVzwzwUDNXEnHMKkoc1u6oRImXbBXksWPhuTn9R3p7bAnlTTb9UyKkH5JypWGxoHBKaV1MTdLtL88Ug5TcEsVmuX5KWB\/RLJGzVgZ152htHd4nkkwlfEXPUQY5zCrGt0yetWLK9tfKdk2Y+R6XUrf63sJH2crwzfDd8R7dtBTlaROd9gZdbYpvTPqVJ3K9TtV7Wx7yHGcUWeDpCJeNc7YHfUd3yMoefn1c1X9gq80To97SWWvQ2Pa6I2CH\/FiRzVOT3RqHE6+OhbSYRMCdjBVtVz41xRSwd8lv+yf14\/uEUJsWvX\/\/v9P1lZQOCACDQAA8DoAnQEqoACgAD7FVKJNJ6S\/oir4e8PwGIljCh6YTTl\/lOYE+q6kGh23nOzPFc\/mHbx\/l\/B3yNfLc+7IP2DYceeH+g75\/lHMT\/nOzx1v\/QegF3z7\/rU48DdEP+q8Ob7N\/w\/YF\/m39u\/YT3YP6v9sfO5+b\/5f9r\/gF\/nf9w9Nn2Iftt7If7Hf+48aJMdOnBNk7JeXHF7d5v\/MqIH4r5W00WICcUEfDh9LhHgqPtfizOtny7WxxASo+Oo3LGrkjg675mqnmoogokXvHnqPDSqXlceSWIQT6DLrku\/7hFnWZDfaN\/H3pfg6BQ3gcPFNxQTrmwqnbvsY0BeS0i7\/4HN90Yf7GwVHADb21xRWmbBR53neeKF2NSpVk+mhl4QrSDy0u3AakAtuQdDQ5dRG4M3z1gn\/r4GkvbG6kUdIEOkP6reErJOfv3clX4PF\/OEVR11dWfgHm+OCXSum9YQojUJReqJZX\/OYQjKXJJlPbHT3Z6ottqk9inX2FJW0rHNR+nam\/aWC8ZX1uebHEcd5oCQ0gWC4Er3jB8787QlPOfpdfvh05DrkTz4ntUCSCehzxPp3BiomCJ\/DjIqy7saWZIpMDlPBxgelIq+GJqlyEnTEQR1ksEAwra76b+vLji9xMiAAAP6QsAAAHb1\/VXsOeJthphK782fVDzjQJm1ZkbiOrz88QaJcHBLsCeWKIl39nQt4hWf3354InCsr7Hd8Lg0PV8Fdy8JFUnEMsIYWUwnm5X2fcQay5kpaCRiuM\/DNDkw8nHfErPb\/yP1VL5LIuOj3n34szIfAJuCXFwM6a64\/lvUweASXWXPavK27UZ5NOCedhNGtl0tZlNKm7zN1M91uBogLSimjFAUd4h\/7cpNDxExrNt1Ey+o2rOQmo61YC63XscWW8vWF+LjCQ\/wGdRcaGGcqvh7ZnV78XIrrRkPXsGDVK\/9Erj0uzF0Ckh4Q6r7FIUREqw9jvxcNioq64CEdOJRiOQOu7nxC6UUZMr+ypw3wZdfiy3UbjdTUz80rYyEA1qAibv6mTFpf0zsAWNAXHxr8JZJ0dx\/z+RipXTXEat3ItYKuj9d4el\/ccrvwHPlTp8HDqisuWZiTiwbu1odTWfD6XEInEi5cBAdn75e9tqLaTQZ4iMi5eQSBc+Wka5bjEYAHChcQ5bu4rQ0JJa5GRXJTsHknyLlVZUImr9UC\/S0i81e26WYvUCwdbMjYjhqwHfvx1cE1z8VyOFbYGF710jHtxqJ\/Q7+sKz+unDVmuiElABFpNs0NG1K+HPr1LlcnXKQstrYoLlStpTmzeTlrzgRSf91qEZvbOJNWmoJ6btWscJSbUze\/fG\/PXOJqc3CsqAOiNpp\/skCnUVpqd098\/Imwv8WQ8HfttJiCtrl\/hy7LWZns\/YqiKPY\/Pm0QL7CHzN8VRKokcZfrfhjb0+bZWjvbH5\/d9Bk9E32nyMvPO6SSPVZ6q9eHYeik6ZbYji9NvW2ercznKc3qwu6Dg90yxh9V97NwY\/pi3mxlSFacLTf9AFRGx6Vx7YrgFB7mjl\/cVdKw9a3wkbvPjxQEOxK+u3dHKjv0R3JbGIW6LYBDbQVUB1itGbN4xMN7PZ6v9g0qilu9jgQbK8upWMX1qh480Mxg1+K7L+3qQqSef\/8VPKNqmLiyGFdGZZoQzqL\/hEhPj\/XdhdRXsfktAI6Q\/6dpPMZv1UFMGsUgdNQObab\/MwW5iQuTvuXQN\/PuUbUt21Kw2Ux9WIX\/52A6aod06ZvPhDW1ID5Hj+08qPanJjlO5\/dWhS9KOYYlj0mV9Izzqj0Afs4A9IdF4+s3Y+sl098FcrnzbBOiCJYZtBl10mv3rQOa9FBOpKSY5Hj3hOcuil1YyNQpEviHeCB4fKElkaUQoseEZPrwyIW5J743d42QjRoXNvl\/sJ9rvQJ4+BTqkyPPJgxpSjVofqvRCVBLX7z1oM2SP6W4wUe4acJgqUq4YSYL7\/zZvIvM8qjFTF1uayoCd877rfQitOpj1vYLAwZx4Q5Uw9ggIcU7zdzX3I+aZsoLgVhnwUSn0t7LBpQCDVTfdwtzqxDU+ShlvhXrWDhAefI8+2tpAf8RByepG2CrvzwT5XGICjSEKL+4iL1ow9f3wSUIntDKArz2EfQH9eaJGuAAEDPwoteq4PQUW3MxUkt1DIQ7wmXBi4GFggYGg6Q84KaQJgPdW5KE0vRSvFuLaQFPas715IoM6rlUgzGcNZ7GiZZ1wZ\/UN2DGmLeLus9dyN4aliTG1PC1wImF+4mhp93RSmJJrs9f6weGnUjuYufSc6ehiYpQz0A\/XMrD84MHexneddLXy6rdNb+mCiq0Cs4jV\/G6woUGTL2zNY3JQZ9\/sXsnLuxh2PAczAEGGom\/fUs8AVW\/bwMFXrV1ODG2ji0aiPHycMzQOuD4WAcPCDYHKo0i0XOpUJ3U+PhzhS1EE5wA0jxr0GktZUIMEdvMas5sEL3Foi2Ju0mjFc76vQlP9+rOvL+5H9XUNipP\/YYs2z7z8znfbenQKMWcOP9dYMk3izPxZf+N0OBbtAlUmERMj6uVeUS1cx8dMm1v01PaQIcCnI4XP16SDntmOSuTZLyjGOW\/KVEVEJU9IkL+oux5IQ5M\/KHa6i0uYFV3ATgd21dNTNM6NOaMBU+3o9GiHrjXvnwKYUAL0akRUprzbTzuQ8EwdEuW0fuZEmjIjR+aOl9l2BXE7MZ3o8aQ6Z2mFYd5M9cm\/6FEcgwYmc86WvRJqQQ4awtiiIGTES+NQa+IGrzrd5Np+i\/zDOPLWQUBSeeEW8v79F9RHXx0H+CdtRm41TSfCwz1akdQLzDo5tdFO1fRhmbv5NRpT+hrej0F\/EilBCxflS191jSj0HxK9KI0oDZD6IF2emsYySAljvl52\/SY7wVNJ\/U+PNoVh0xTj54EbHyjLR0UPI45G4Rjd6CWatRl9XC038s+xgsdmV7Yb7rp7R21MIyJYe9YIDhaJ3wsP4EcOC+6A\/n1Qj3H2a1LXLKrj07myIJxpD+2WhXZBlQ4+HF3O4fPsh0cYY2UW2o4nCqfpkxEpZaIckLbmiP\/lTbrB48FCFXi3OQk2nsByiv7TwuUiPy+aC8F4bH\/ZxYI+yGQCB8uMKQ7xe1k4nAKjyWhqCdqyVlMtmF14stZwpPfYtqEkughM7f5KNsuR+7uhKp9tVldI7dDjXZJo7cy8RJIDT\/GPNeVXVQ2UG8M0tGkOqAVxZvB4ng50vc8jLI9NkbLIi9laRK4s4+1TKHnKU1r7bXK7pk7WhF1E55zHWa3abneCwmxHBjsfkywJWlGzhkDGtlEHVihS+4LZJgA4pRvekw5\/4AJR+pSlgt6hK7jdQxUmcpBhc4XCqYpA9bZGuJL7L3eDsmioQlptDPqEasbpNyM+\/7+QOfhGXxbJoQqXIfKm5ielSihAZZtX07mB0fxft4YGCZNnS8ZKrohJg4mDgw4hAmWoYKj1Ru5gPc\/Z9Tv8U93OtKy2s\/YHAc1T\/MJPzopNcpqiSb6Ed1kXSaww5htqE5JhQ+edvCCyoz69oafcP22iEEgEJPyvp5AFkP+FODyuyMq4XWJyuHOP6wnj8z4LDEVObupUwMj1\/kLPUPkdfrwY7IOcsyxIIzBiM0JkKimIOzs2fSBOJz+ifX9NG2SiPqFyuvcEFaLObQ0hdFEc0Yv9LnqwhrtrZQivxm+Fdg3hEMEDIxIm2e+uZCbO2Mlv6zFlh+CEG8IUv1\/BAL3X5fK4n97OQCe8W82FbvCuT9O\/+aIKjDCc6pOHXU6SZFNjrncECygYkiHp1bpugvzg9HubEoIBxFcBte67Q6e2wP68bojZNEmql1qr\/57Q2sP7OM+8fMDKF1bJLb7gG9o9QFWNrcF69SkpUWselIEhuOkTwTGE94gUWAXCIYoWA0fF+uGpvEgqnLWNRVaHPhmGqA6k3F3orJVXs3a8B3MrfV+a4EhBt\/XKTu6Sj\/9jof+JAY3cYxR3FrOkA46i5yn2ZPdIXW3r7QmRxrg4P9NWQpB+qOvzwrDCHn0wKOFjg77XxnFXAUQcWwBcOa3\/lPsQLNWK+ialpAD+t6WiUm1TlpMF8MTDtw5QyEX0dIslw16SWvVN3QVdOEkt49xMcuCFx8VlIGeyfWxUEJUiXaqKchaBhwFuUwPVt1c9sn1EyreQ4wn5\/4IIJclm17Y1DIAadSz8rfwivUg48y+tkwFJz\/dxMcMl7dAPL\/yGVLfQiP+EziNallmNe1petVoQLc9cN2\/9ZAsy4I25tdUJ6RjMZ5xPEjDk9NGzvscTBe+KEZdpdSvBtfpgAluPhO++heNrBFEQfI85aCujhz479Ls5aNg8vcPB0\/EkRZu79a6rX9GXvhACB\/15reDdckhaoqvjydQGwd9Z0Lpmf9qtNYft31bNUQLL8UiPDgxu8E0xY84G9S4f5ECWi6FGOK3DjbgWntTgiBtQqgFwAAA\",\r\n        \/\/ La Cloche\r\n        \"lacloche\": \"data:image\/webp;base64,UklGRogPAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSBcHAAABsMf+\/+K22ed3d47jMDlJYVlKLjMF2zTjckpJhZqYeWv74JixY2ZmZihEHaZjZuaCZf30009fff44+3zZ82QMETEB+Nv\/f\/v\/99njnk4+PdX5CbMjRchLIz9ZcpLGmLve4aXqp0qcxtqaRJL7\/ERxjxDDzbHIZ4ZXjo7+9HCb76ZQeNJJtIbs2umnRuJpMkWhkEIxSfJ05yfFApK0FGFKU0gxW3nGT4lp3MqzV1FIEREKhUxy1k+H4uRmHqNwBI0wo9Dqb\/N\/MqymfdIBjgxEkSSX\/FTwPhJuD0yjkSAUI11eWBN2KQ0QWdSUVZ\/2VUcsivvG7FIRoHT2UUdOL8qkapeuOmxuCQBVv1MxgEhLaw4ANbl1anNz07TcYH0381aF8u+NZRAR0awJyfmIOweop80P5qyifz8AqouLMjVpkvx2ZDrvDPpnAnA1mwFUkr0BuF8z7dBgEw3nAAcyKcLgWpaF9bhuyqQusHq3YIeSl9aNXVLpu0PvkqGGfKB+6nomy9KcTZ4ycfyKQgDOJj0eQPm3Og7AWatv3uewA48qDtZCJuCtFcNgIoa3hbWeUzIVms\/kDhUkvlWvUkivHuCMDGtkbQwofoerfP1tajkyOm9yMoB4klW+9WxC9rtQVyH6BW0WFMvN0e7biSvXbq0MMosf5SOE3GekHQCOkIdcAPvJxkigkQAKMnSyIYRZNL2QZ6wVZkHLRLep+5n4JxcEOZJ3qTDKv+BY3zS+XgCoc3kBMrvv8NK2FfNWG0nzHK9tW7x3iwo2l7yr7lxaYdaGS7qtUl51R\/AhN8B\/eQXCqEpymK+OHxQDzqU8MchHTGvTddH\/ghNsATVJy+zE8Npu24MneVVJ9gmwkneoMCq+5hhfE98sBNQanh\/kPV7Q1tG20qR7hpe1zVvWiOCLaKy2FGZv+WZuWC3p3E5+9cKrW+WAAAv5QV6gWeliz3GRb3c+6QE4jBsjmZw3ORJAYZJpOtmA7NtpREQoWYkYkwhnLSelG2xSz2zsfI\/veZm2N+aoAPezNR0utk\/mANFOOR4ARjO1NNBkAPEM60NZTMOQJcU9wnlar5neNqd9Ig7Sp0ChOmUSmdTFNKcO7ts22nevvnR625yFDcBQyrWJITfT9vE59zO1cmBNxwBflx4HoOxbHfet1edPnze7vSTYvtShaT7thfI10z4Q28xRANQNvCETcm+l\/0YFqLeZ9hMAi5m2BWmLnqT\/eACuZjOAKrI3APdrpm0Mdmo3WM1EGGrmko72jkVLR5XssdAFgL7L5zmZ4Nb989Kz96kBgJ2XdLR3LFrSBAC1B1ywZo\/eyBhpOebSs1ZUAlBzd48DyO1YEgOgZizpaO9YuLQ0kLqjG0TzIhXCj1AphKoUgiuFH2vsZZqwKDSs+V\/4f1trrA2NYnmv6vEWMymhCWk4q6dzH6AOjyKiN1f3cNtRSzeQYmxntGc7g4bdKULNO5xsXM9XmPDlKwCeF0JuoDwnjZvri6osoioL1\/N5OQEqrBGRbiCFmqdkoRonVQIlu8UBVd8\/ApQ2NJYAvYdgGFBch\/4O1ISJ4wG1s1OdD4wbnOeLNVc7wMBJTS6QiAAoLwFqG+piACbmAhgOOA3jK4CS1niAU2iYVihCEbFitTHGWhGhUCjcyoXBnKZEP6B6Sg6gdikD0JjjTAOqjywdARQeWjnAQ3wIRpZD7TGqthhoroE\/b0YOEG1EfCgwKQqgTxUwPCdSD7h79wXQqBCpG1ADVE2JZIqnrBWhiIi1RmtLCjNabYwVv5ahgVRbRwzo1RQFgKm1QIvntAK9e0+fAVTEJy5XiI\/G6DJ4w+L\/igEYOcEHb04+ojsgPgyo8wD0rQZGRmKTgKGz2xygWcGbvTAKVDVEMx1PTRERq7XQn\/xenrny5rse3\/SJZVqtjWh52wvi9M0ZDJS09lZQtXXlQGlDQyEQz482A8VFbouCGt84GnAGoSkP6D2+xhcZPCkK9G9ucIDRLRVAeQlQ2zIhB2q4O7AAGAZEqmKDgZKWvhniKW1FaJJCft916pxhVV6CDVBKOW6sYujsk575nqQ2KbYGyeh6ADwXAFwH2UcQ0IkgbUQBgKcAwHWQ3lMI0\/EyrGZKKCnyq\/N3ijvw97KnKwR04s3HrSW1XBdCj1jwvRXR5DPTi5H5QHJ8EH9O9TEij6seqZXaCDfVuQg6wbxdlg1wqOEx6JEvoGZyhYssi2PI0h3wqLHflvVMXxh7RRW6ubD1DpJd1eiZPxG7r+oOVTr1jLdJyoFR9NAjNJOv\/7Ohd56jVCCllFdYM\/WoRz8haTftW4See7sH6E+9fNea\/xy294ply5bvccDK49fcvPYjYdrOY8Z66NHdScc9IwxZd57aVhvFT8BI6fCd9\/jv+Tc+srHr9ffeebVr46M3nr2yo3lAkafwt\/\/\/9v8fHQIAVlA4IEoIAABQKACdASqgAKAAPkkkj0UioiETDKRwKASEpu40fAIAJCDrpq2eA80W0f5H8Qb7VPXlccq\/8P7jPfF6h\/zF7AH6zfq51hfMB+zPpUftV7hv7f+Gf9A+QD+Yf3brBf3K9gD9nfTS\/dD4MP7T\/r\/2s9qX\/7ZxX2I\/5TXLslfUEkB2MWjb2z\/aehOkp\/Vf957AH8U\/uv\/A9SfO99Q+wV\/M\/6\/6ZXsD\/bz2QP2IHoD8vgFMQfl8ApiD8vgE9LbPTint6crgujJEz5n4G9sjNq3u\/h7j\/hSHQBKlvjZnUCXrIF\/nVDTc3Y0OqdKJBRpZcaK7k1doeyVIRQg1mbjhyuqFaMlwAceOHIGVJ2YoRy8cgaQHBz+W4PSmaKmfw++7u2h7lok3IZouDb2MitZXZv9b6Egj4x3qc5zZ4tO2kkTl8ApiD8vgFMQfl8ApiAgAAP7kJYAACk75PxkHVWuKLSUKU6ZmFLz81ufqRH9kz3kz0wnqLa1H9RPf2G296OgFElnILd7BXkdss\/NPwQJcweP8nwRtQGPkREzZIwkO3AmNiCScQhjjP7E+Lkumf9evydnYeYeCMToLnh+gAGYhKnNMnZH2Kxk6JOicZsAif9DBFeygdjfPD6n0fueIGd46jYxp1mUXXQIBpctXXkzzA2lKmmmfaTSFbLTwNYGFNjRnTuHocQIMmc5ucnnDjO+99W4BMhzX537y7AWyjnSIhKPOweucDyNYLzOWIyChjgy4uPQkltlYyd+auCaq5cUufVFwvjt8Ed1gWx9kH1ty2PIHc12EXGaDTtAXZRbjDK8lusrbmY4uuGaf+faqJG1j\/ehcJDyz0v4Pbuj17XmPOHzO0i0pmv3FV0fU24\/xx9B0bMxl9jFuvUrvKHplfL5HfwY\/JkjoCjwcbem4BsmDQa+qy8s80STetUTUyorq0MXGFbbc0qqm\/THCHrFvU2EfRL7FQ16rCG\/5B5jMBJkvhLLV7iUDF3T1hMkUDwfvMcvNYiTbOctm1+M7IBOyqzLVW5WX3k4sqrqdjGJF2i9et4yANqkDS8Hv1TxIs2FacZsdgc1Zj4yQ19nXdc1q76SlPfQSowQG\/psQhMMaoLq\/j2+JNL1hHJJ7U9JoypnffMIYnscn14LoX7vxw+DrBQMOUCAyjgBpxRGM2kDsTkUUteELEYpTW3P8iDUOMXIjC3mOEnXBqYNuJwnf4WIeH867PRD9UaWQCkj91HEu3h+OeKvlP6IELtHA\/hxWs\/Hk3ePf+7s0FVv6qSrIeDG\/IZMNpBxWbsah\/GHglhhvJIdGBlYPxSPrcYwDDYjPswj6HwkodOSkbv326IJ2vJAWuVm1tFfLWy0K+gex8dtfyVPD+7TkZjtrAx8rvdFC8FGCM0X4I73Peln7JS+3BjICymUAK3keDAPgcNBdaonOFLrhIXDGKSt4p\/QgIX3uEJBLsX30fIFTCcdKunJ5gKXEQy4zokNNd928B\/Gpfl3Juq3TBJ6EEIz6vFY6OiAdIyL8E5O8\/civBkX5s+zrVm6S\/d9f5e+Y\/VZSHW9Fxq4HyUOtQkb66v8LOtye0U4f6ASG3zYyi\/lIVopr3EPx5eKtez1zNPJsTW\/fddpFsoBbXL6gO3xvz+tUIZHu2HzXz0dMzbqnc0dhxnjBcrD9yLCqqTmc\/5ClUiu+7iIJkZCaxuPbgzTRm5rKyo3ghEPZ0lKs\/kYedLmKPesTQ3AUgHxIs1\/e1RvfD537PKetfA8FMOYLS4P\/6sVtJZyqqL\/\/p4\/nOCt4uK4dBXSME31kMHlmmMY526Jl2GstakYKeQj1q7fCQVCwqF3TDxwpsItR0Q\/mJyJYfS4dNVoAypL\/zONWHfO2C9gtr2gtXOg\/GQKvCVgkbqOG+E1IY3RIN0vHAOrG7Atr6uuo2JJsaoeEimHPA0dE9sEuu88OouU2fMbwgrphSkh8KV3p9NAocI5Deox2Acw3fyER2EquPDrncrkeYKYPIonqhsh1ASKS\/LfRT3U6Jgl9NkNWJwcBqKxn9IrwgmFkBbVTP60Aii8Mhbaw4iUz4S0ueM\/3KODPhXqb+KrJoAnvc0D+SssJAVAUeY+lgyevLf3lQgNpac+qjEvi+fTw+jKOVvFfU2XBFUnjDPfWpPTOZPhIK5nEKe0lDMWmlVJVCHo\/y1dH447IbDFAPEZENtMvFGJw2wQfDPGw5okQbA0SyXt8FrBQV5KA63aUyUJ8Fz\/isIP4UjPh5suT\/xBGU4xF73McFc+a3GjXVJUUiEjH1FojgBYpaV7YSqG01Ss54WuKwqRZ9OD2iXSwd16W\/jbrc9Nx2D+C2Wxx\/hwmDBH\/fcEf383uWduyToyIxX8mStGDGHDjBJjGkX41H8mCEz26KqH3Bl\/nhoqMceN27r7\/vSTc49DL8OWeWtD9TVIMKucP726eWo65NLKqfsk1dW+2oTwf7q3y4AquUXIjTjgfm9X9SmCkJWWRF+YyPPPyeJk4xCCWvQI9mJZ4uNcu8GFQXoKk6tEqJ0SSVmL9o6XqmHttwM5YreJEoiPYFD5Ruh+\/vQwQkEghfZGe0GLJJlqfTC8RAAdl1Qk0QGSKIr9YbXchDWjWSK3K8+R7YWRRgef10t+0P2H3KlI6q\/FKK3Km\/41c9iGXut\/+z8qXugDuCDJFUqGjEDIf5O56n5GNk7AunbBXaHTUPEvq+sMyoL7R0LhUOverOexxOqTSx1VH8UGXpB2cU0C2s6zkSLx+pL1oev4qiND6JQcNoC2fTSLvaLAV9JkFLX+6cDy0mddkkIMvj\/tB72hsaAae\/Dw\/\/s+zemYmNqjEtkrevv+7qrqEKAAAAAAAAAAAAAAA\",\r\n        \/\/ La Part Du Peuple\/ l'Apr\u00e8s M\r\n        \"lapartdupeuplelapresm\": \"data:image\/webp;base64,UklGRmwPAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSBIMAAABwIf833Ql\/t7385w1NbdcMjOb9r1ma8pp33ebtehr0SzVj2lopoUcDI2RopgokqIokjCapSGM+IYkIYZEEZKESCQiIiLK4XA4PDzc3NzcvP84x3PM+u1bREwA\/t\/\/\/+\/\/\/xJqFR5sDLkdNUt8\/0aZdYtxDS9b\/xYZc5l0eDdCrZzwKgB24N8WawcZiXDjB1qTLmcDeU8794p\/O1gnSUeH54unVJR85EFBmJq13n8r+O7QVezOx0ZKYyRXI9hjXOPw7L8imb43EXhKR7N7DOy\/KY02TyxcoTJG6zYBQLwx4Qva8SxPEvYoz8iZNtheNHzeJ3S16+QBE7TU1JyPDyiNoeRBwK5rWy7ehCg69Diqe\/Z7AHgfRnclklHe4\/ZXjBohnk5KfmUNk\/U3HeNyJoBf6BhtGuBr04o0So+FOEfNK9bw5VwmjSF5TQAryZYEZkUY2+4fGZj+iJK3MobnCB0q7gUQDGlNxRk4SNcYI3lLYAsd7bBi2D4dZNhQu8bhexAtmuOHmqTC6mbBfZc7Rgg8q3vI7hnDMZOOUbwvACynpDLNIk+5mjQOlyLfdbUxmsP1BWWY3fvyfNdplmAyeRlDZiqpm7yooD4jRgjgPdDDA8NgdxhtpBwLAA+ojMOlaFAuDTVfBcUzalKZ28O0ndJlXSqAapr3cc5Exw3hfW7caCY8rZo\/YARnL7aGYVlY0WE5AOTQUOk+e7W+rYyhy5M4zihpJKcltigv3lxKl5csAMEuDqb7e1iN+OI8IywFpsoIp46kBEWqfwhRWUWpwnkxe6nocLc3cryNmkabrPFsukStTIudUAEr4mQOSoe\/WwCwg6YexYzkDLGSYfPABqqoWn0jSAy1pKX7NxHPd6iMYV4DALu2k9pE84\/X\/vyslVrxjr89dLST2uFWJHzITIgRNxnVfQEAKKDDycBHcxE\/rV9F5SQgKxzlT4id8PTs\/EDhzhvNF\/MBiBMNv35VZCVRWN7yZL8\/zgGSGxDfOlJNxyyJmXilm4pXZ4a3tZT2GqO5\/CfWlIWptJOVkN3oemNWMyrlDAAY9dplJRKuYYQnAXzHqDMhRjwgGWWsmwesY2xtRiKjq0hDvvADmMJo1IwbAtsoTTg3Zu1vURq15Z8HL+37Bx3Ntj3k0S3UktdFQr6+sAdASki5PAoAme2S9zwJzaarQ6OAwIDkfREzS0vpKF7aGXV5EShnRLoOe1KHmtnNiCEj3AXgjHG0yRrKvksTGgPAv7dWa7b\/8qKsNbuVyrCrX\/XkP6BW3IDEelgA4DSl7vEDmNYv2ZKCRD2vtMsNAEoZ5SoAELcpDWWJQCNNk4CV\/kIbE+ZvIt4ywzD7d1QqfRAIhKgUc4eCp3qAmwDkHmimpqN+bV4zjq6hoWTJOGrDgYzE7IfmTxuTlVb8BAgcoMNHKUh4Lx02CsB+rU3IGzOVUuvIDCBl0LAeQNBcnhkxUgXjfETpsiENOSFdAixi+QvDmQkAqfPSACz4uZPGMNIy6DliJA1d8xCnKRXrkeQ3ZN2kejq8jqzS13R5yYeEswelawoBrGCUPwKA+J2u0nMBrGOUVQD2cSGu0mVeTG5YOmzwAD+y3QM09\/lPk6UJxbU2VxujySg3WwPUpFEs9g0aLfl1MintJKXR5t6NbpLuJoGExXmG+QsAq4EOM2MmUbrcDsBuYIQfAf6uDhsn6DITgPWUrunPAhaRk4BiVmADWSOSCu6+QUmjdE8wh5qkYh2WUhrDgmRQ2GlcQ+mSZO+vo5HkLEbMqxQA8xjhRRFTT5d1ALCGUdXtB77mGnieG\/3SBvAVXcXFsL9i\/wwAf+pc5Cj2epMqPvCSisblEWw3ijTajMFpuprddlII1BttSP3i+hcZSNZqNS7XABC3GVXTAGAelYmMBpDSqaP8EkjrarexmGHuA5AaVorPMhb38txoAB+yGrC6yIKkFh+lNtQmnIkzVKTLavhfGaV4Dsl7nhjJA0X5owSStMcG\/oUu7wsAxSbCuwKAv9043A0AFxk1bR6ghtNg3aXj5gPiLKVhiKwqAoDAq4EAgBvktmTE9hpKUrEKuEtNraJjUERpXK5OysYxuryM4dw82Ebl6lwAuMgoFwGwaugy7AOwgdJwOvANzwrM0hFeFcBi7RrDU9P8iBW1XAQAR8iryaT8+IKaRqtsiGfUxmElsNk4RrEgoUwP9vF3qY0TTGqMAMTHlC5V5cI0q5CSjRbgqabr8pgAllIqboR9nF2pEFcYMR8CaYNSa3ZYiGud4iERU0Z2WEkU12kaKnMesNqojZJ5EKfpGtXmT2Q6tyHtG0pHTUOyZZwGiCrpsH6A5J1Oo7jLCs5upDJRfgLffmqXV7yTG8mpQEAqtvnhf0BSm754abW8YCF2H02vncRqbQyNYi4gnlErngOsZ5QmUmUl0qdmwz6ho2RJMumOmgTfRbrca6dteUaSRrbeaSUVjeLNZS10pJTNLSSXAcilw8cY3cCbt41W3AoguLGPFRay84G8TmUakORxKhqXVwDgrtFGFQEBbTRfbhWJDKpzpc8peesVz45KbJwjrxx5TsWtAGBPbtWKsQP3JbV0SYYY1zybDACZdGT0egcviwl0XFfWHb3eT3c1kNIZPnl+kBEuTOYWFbVrimOOM6T+BJBLZdw\/FyDR7YzVu5EfYv9HIhHrd8a+nIe49hOjopXlx0tTF1Eakob8c82H31T+8KGFWOshNcm9AtjD+H3lKQCwk3H3I0nrERUlb1gxmRFyOoBZlOyrLE4IS2ufPKosBpA\/YHghIwEEjzQ9qdsVRPzVDPEnxDbT9H1c9fjRyXkCiadWt9z\/eTxi3z9\/7\/7NiuVpiD+\/5vnL2kVINthGbZRagLh552sEgBWU7DqUkxgsnxdx80KSvaUingDg9VkY0rpDJ5IXU0TJSsDrxTD6PBhS2B4LiQqf30LSWX3UyjSJeBACAD6j5Ot9WUkkmtPLKB+XpNj+KfcuCSQ+3vSrq4itYJRFeBcWRLVRLEGS39Dly8\/Shg1p9+kYsschDyDJQkV+FBPs0uaJ9U5I76Vih5XMD5Ts2PMGYJcpxj1rJYP8r3dYMcsZ4pd4J4pbDHMlkv2Wkn1nMt4AkLq9vrfv3qcCwy0uqYiT825AoeZrb1IbjTRuW84bAWDbeIOBfvJv6x2Bha+XI+lxlEZx7Jt6s2Jji1qHd2YAyYvHdCW\/fpsAX7Z4dwxroaZ0ozu9b9M7v+ilITnh3zCwJm1cnYH\/wLbyMsTbEEh9J\/iskVDQ1RTa9xaknTiZj9wxb13zshFgdx+y0lPh+aAIVm7eJHtmNrIyZvmzpgv4l2YBCIyFKILnw0JYhQhmIackBYA9d1XQ11Sfh9ErUmDNnS1i7CKBfA9mzBQYa4vxCJTkAxjvQXYKpnwkRE72HBvWwkkIfjA+TwB4vHQEvNfuAeBvfBhdk9ZZ33mnoS14qrPp+RUuDjR+014M5Lr2xDspt590L03rsndfH99TXQxg2+mTJ4oHwivH1u9vTDvasMcTp3Wa300\/0d1xxRqclNGU\/fzapwAebMXTiasvnTsefHq37ztRe\/Dh0sLL7fQB6Fg7AvIG0gCsbkL2q4ktnm0XrO7C6pVpDB76ca1a+nAHgKtLqxZ+2oHCgeJmbLqY17Q\/E7BVZVmn\/Y8y1DYva1myrb7EisGu31b+kt5tWy8mPc73Pci8fqYYwKy7c373h46UPShqDM74\/b3Q5gsPUNA0FQB+mDQCcL9p3PaVkwbHldXnd4sdVVATaz5KoefE8Sks2ZMFYKbqtefKgn2NGXpO7d\/2h48jgHhxbsVmHKoL7O\/65Btv1jauTJ8GwD+gxtvhhQu6M1p2lXZ6iyuZAdj3WGK9rl67ODjgmdmSGfpsZ2Eh92YLAF8XjQTvwVfP1mLF099H+0+LBZtwNuuzYv95e9VmlF4q9wIQFV9ArHlxczSOPixfl1V7bh6AzOprC5HzaId14No32Fp3KPDncgD48piF6Q2P5mJ+S9U3qRVXNwkAMy94kHOqdqZ12s4px7yamlHTLp+66QdwYf5IAGwLgCUAAQgICEAAAvAKxAoAsABAALA9iBUeAJYF+AD4hOef\/hgIAMICYEFAeBFXABAeQAAC8FiAsAT+3\/\/\/7\/\/\/tAZWUDggNAMAAFAWAJ0BKqAAoAA+SSSQRiKiIaEiVJhwUAkJZW7hdfvgMWNIEq39l2Y4o\/Wd+k6R+2A8wH68\/sd7Nfqd9AD+k\/5nrD\/QA\/Wn0wP16+C79qf2c9oCKnGM9gQY6qsbdHw4Yj8Ro4x4jRxjxGjjHiNHGPCgZgPREZFuZiB8WlJqWpUJ+IywRkzyQjH7EXwfCwKWUBhpigjuL6EZcN7BaHw6vJuMGuIdUal2R80UpzuGR8U\/EaOMeI0cY8Ro4qAA\/v\/e\/oAJ74M0uer707qY4LaIxdgzInsSb7+yJiBfh9n\/66Dtf\/VNrnjOzqZX5dzgpdc7B03qG1KykS1C4ZiiSeZIg\/YuRUBeOdWz02MBQ84d8mfOnr\/iyNoq0rd0TawRFKqJnyugZzNuu8z3\/p1\/aPzDsKyr4cNQAEraxQToD\/CufGAsK+KJRt3nEgY9lkO9ygioqpt+2MHxN2zZaBmpBUUYOEtUxrPCUBIt6DxHteGpFmY7LW\/86Dr2168Px94avsRfrl6W9SZV2+aOMnudQRmx5ZD+UJHFBynKJoqQfCtR1p5\/lVP\/QbIOPfqVwAtwn2z1hHrze7JnHRz\/2tf\/9GBZitTCfr+Jd\/YdcMBGtuHn0XXVi+9eHc6IiU1XKGUj+36DqO8aCShUAbk46k7GrM8T55rfEfpCy5lhYpJt2OwegYHFs9lmfTDo9OURXbSlaOVHQRpVTRXFdwKU51hv2szcPLb58OPePIcmeJ6L3j4Upx1dvGe59INyQjsNmk4ISksNbV6IQE3BIs4rBKyvcTbvISnng1Y+iYjPxjx0ieSi2O\/a1SYR1XRsE3wT663nJ2e\/mEo3cMwCtY1S17CmmwiPTWMejh5EqAZsd1KK25HaPwz7c3P+lghu\/eqU48HQ2XG6gEWU\/4ZmUHVIeoy9CJKj0V9p4ON+ZOvA3uTITwOWJNQ8e8gdQQMqgFzXtac8ExUMSDSXx2tSuhubXGrAP+DHfnTKW2SUcJvF\/w\/KcGPjbPkcpQHs5Ln+IDIAPFvt1Od9bTm8gg42B6GAWIKG9xq\/BuLvA3ciEmpN7nlOKYwwbeFOb3vAUgnFPTSZtf4LOY8EAAAAAAA=\",\r\n        \"lapartdupeuple\": \"lapartdupeuplelapresm\",\r\n        \"lapresm\": \"lapartdupeuplelapresm\",\r\n        \/\/ Le Mouvement Associatif R\u00e9gion Sud Provence-Alpes-C\u00f4te d\u2019Azur\r\n        \"lemouvementassociatifregionsudprovencealpescotedazur\": \"data:image\/webp;base64,UklGRnIMAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSIYJAAAB78WgbSRH5\/Bnfe0LgYjI4f8gMzKDECIiEkmSJElJKaVUKpWmVp1Af\/9\/VUr0OffeKYaGkRBpx2QJUVepXbu7uwi7g8aiu8tWpBuG+v51c86ZAOfH3Yj+TwD+9\/9\/V06P9HRaH3o6+9uYh2NZNHs42mKMh8NaT3k4uNTg6WxcUjwcv\/kAp6ia4jEoXbsdMx56\/3uk99EmDwGvPzq0e2DqZkJ8+gdqC\/IMDo45cmfpALheZZMxHkHEiLfcQVoDoS\/VegRq\/zYpsy0TwsChD3qPAB0PpE4MMEHk7HMFnuHNRhnWfhr8ZLoOT9Hab5RQ5628g3QYHqOOoiU0WsO5RanwIIcPSShjyQBYPsXBk3xcIIHCN4BaO2IBl+k8g+RhTSKR9Ibebi\/wr+V7Br7kK8Ga2z+X68D3WdrtGahjf0nAn4ZM4AfMlsJDzH8sg6L5n+v1DIr5NBUpnsIFKikpExbbLp0jW315D33bCk9x7eD5Y2fPiA8ZYYg9eDo9WIGnuNFmhXv7HCtvr71qYX+MRFs03Nr8klof3bhXRa2WP8SOuXC49ZrJplAGAIHP6O+VyRLsQOZEKBxVFZcELuQxCO9S5IqUNOAjlUkJcLj9kitYYx3E1sX7yopkpUF\/ib00F+ZY7zVXWMlLlEXnsTIn\/WgdDRDso9OjkZyQfecPR\/K6r7riZTWEZ2kX9NEOKN4rQ3KvsXDGn3OYkpVpu1UdYyOfBse\/x7vMPL9DcJ8SANPYBrnHp9xOSVSdkfRdQflMIIATlAT9TCSwnUqCAXjfo6OuurMUx1FKJsIBGIZpg8wZOuRuxoZhL6d81cDKpgNxihIA3XQU4ukw+AmU5oBPZDiT8pqnTXa6+h++AKCfrKJU0RWaOeJmUVONZjgz5YcGsPyxJ5QIQDezmo3ch\/jAvDc+yTwkSpV68a32OgCf75162OsoZAsl8m5TfP0l9zpCNxU4NaFVBYA3tA5284FbFzUJjFzHp2sShYVpczoJ\/\/noDBtDmK1KAVejEOylVLvbFI3aK3a6tfv2b9A7wv65nSPMvngtNycn507DQgqcrBhgz1aBMx2Z\/wqyu3+xlusSRW\/w7bXEw98wzf4TS88Y+BZaBeyiHUDO4hqg\/jLgX0B9Lc0\/qSxQTv32reQj933lQl\/Zx48fPr4Nhnvqh7O6\/pLyI2PtTYmCD4ilGIHPnBXYR7MnITT0kgVAJmVdowgAdZexmz7EGRjTRxXSISllcDPEPWlwa33\/0X6LlH7Jv1KqDHj2VeXd6mUAniymCEJ\/jVAoAKTTQiQAtJxOpUwIN9JFuSQR+7VzuQU4pM0c4xhpAwAY55fatnrpjGvL55\/485AaB\/vVxxZ3QryVDlnjZRIlfrrb0L\/dG6V8yVR7QyL\/LYBU8rZ71KHY4WnLnW9ENFSyEZpAXFoF8Qk6jDQKWwF0M9HFT6XS+1lDjsS7AgCoqQdgpBRwLd8ULTAkyABA54g3WUR3aAuwnWj9CjAbmGFTZfqz8b5UouumXRAlAY+\/Qli1D0KHEkY0HsunaABpI+dp67KDN9NGr0mkLfkjdcIkCJ5bbYfLs4pxZpvI+p0563gD46iV40GwG0Ma7Vp2ADZQpiCaDgDsSwnjKK0N4CpDt672Q8zaUpx1so5jaPvsBfudE0AKnVsBsJse+AIwnaOrAOA\/Wx0CIKqjz8BDHNFmCWS0iBZC5JJHNQB+P5t04GbNA4ijPAZ1uSHy93BPbefgeCK45taxz+1fJt7rIX79RZFhP6J5elot501BQLjtvQJ+6CUACKMCxoaXGxB94f7V9QzioNt02g+yAXGQPvqOp5b4yrGqIqyjJxCq4AeNv\/P6lbzsHDf1KHChbiSI43gE5c5fhtDarufB59f3kcQVx++r3hW48dhJOEhlEFoX7yoCGFpo\/Yrj+0XnEu9Ro5MM\/ePvgxnA\/AoWrkBW7Uj+w+DFNSeZulMrFha6O21Ub4W83izxI+2PEPZbdVIPQ1Dq0ePbLXA+69++Mvh90bsGdYed1K2Dy5XxxJXBq1dzUWQnc06X4jqMJriXclbkv+3slcwAnrYmm25bNZES\/NffMSYHfCefZezZs5EXFCzqO7Z7j3RG1t7du\/fogQhvIPjffQcP7TtOye4VS3EcdovGy8t+0TUGILyXGh6V09dQXkIzjf8kW45ewviYfjX3tH\/KZZyi94KtS7PNPV2SHUQt3Z3dAWB9Z4Bb9Dq\/oODFw0D3ektVit11ilMAFknnANPsAx0D1HvTRruLlG1SmLZ+YMBX4D\/0PUpjjDHw8x7zWBWVKky6MReMMYDV7wMu1mAZho9n2ZIBqDNp4G62GXHqC4M9a8kGcJxiwVXej+k4hul8BvkHz3nRC\/8urIJ0021wWctB4Ertcnj8BWeGFMDS78tTyYry2+CfJ8BCyRAq3\/I5hZ8YnFRYgbancs3ZcnXLwDxrhX7wKGAeX81Dmh8eFwr8dgHFrZCMWQwEELywGk7ypgjELxldUL8MTv9iwN4FPdBeLgAQQeE8AKbRjTIYPgbg5ACcdatNgdp9wQXV7qcupgFgffcAn6HPSQFGxsE1uhZm1jjRpEndLQJQmu0sldIA7FlSnHa5U2dgbpY1rAOATQsBgDmvn6jjiNEO2+sWaepRHICkRSaVNf4g5\/54mrOO9qsAtKEDTjtNc7TbzUaugNucDwCaadWxuYF4OzCD3+YKeqUhxYGM2aLXRbPpTmK\/rsL+9jfmrIvdISF690qc8uZZlsLAZ3co0I4baitEDKlSt8oAlN527OkzAMmzJo5pPsFZV6vh7o0lEL5sFwDNeSxQ4cFKRuNUrFTfaQAnfzv25gGAmhLwyyqddaXe3SKWAkR+84miQ816ihZoPxNRXiNjWQwFELIYKuNvl58NhJG\/IIBCnFXnbs8aIZk9pAhuvWOT6QLTYCxiKE6i8wPsy3olrON+drnA4zqIax6vDGaKlNHbjvMMtAPX+nS8EzYFyF60CO7NmjmmmeeMF0q5sMuDgeIk1pJhRbjyhckgk07461RDVF+XBt2Xb9EGRTUfo50A2CvaawTUkMbxEPCDhjvDNTCvI\/QC9m+yceGLIqH0XBU03hE0HQAu17iXRtsgn9JHfb1jdFcPQJ9Ho+3dS1NbwE23TVe87aWXZohNj+h7ef38xN\/gluaqtBuyu0jH67on6D4K3Gx1L7ZGcwCKtzU5ygC+IS5rW6gKoRp76nK6N+S9Us8djlDB3xjNUgxS+hTG2xbDw7YQIHKLe\/3v\/\/+gDVZQOCDGAgAA8BEAnQEqoACgAD5JJI9FoqIhkfldLCgEhLK3b1gO7\/CAWhzz7jXWEIfuPjc9oE53zAOcB+w3qA81X\/QeoD0AP8Z6RnqGegh+xXpv+xr+5npnABg8zht1c35w26ub9HgqFMh8FPEc4bZRz2ttyBcFYj5ME4FOcDfXYpqlfbEvhy9ik\/\/4aUpTtyR5E6ffOG3VzfnDbq5vrAAA\/v02aAAAJIPbwd7dnEdICMHUPVGIa\/HN7ORxJvYvvXFQjhEA9UYHAHwhrF1KM1IaCtx8O+ihTTiJ5bC7\/Y57w1wk8KznTWLnVocg\/A\/5MYrZumqsA3ytoS23M7b1HeKiAP\/s3XkXJbOYsu1igQXPnmzUx6kJByNovVOBUt8mNG7dEKPnNAN8fOd5p48NtT3bUVWDrhJ6jKV3BOgf+fyzgRa8wQ3qIg9VKk12A67FB2EunbsW3EOsoxgmwzAHdfQV7LcwPLTvko2wt\/NIUSH2tkQxZfmLUWriYOCDRpN40lBfGv\/KwvH03GYcvyYSweqHPUczJv0NBwTIoAJIFgjfl8gWbaUs1EIqSyLLJTcWNHl08HLpj8S6QSmPRAy5dcPC\/j9Oo8qt5S9A1s\/Fg+JjqTIV17ZOOIhphsIM9\/SbfIcC7PUGDPGl461hihpqXjodUV2Lc0nskGvdFfT7EYQ1sucUro2zsGX57O65Xv3sUCDca72yScAy8L\/Figpsn12vvrrFI32sZ5mt86iGnzDhAXu9RJNdSRAVqXsC7Ic4YLRLYcFwOdbxC+x5\/HP3N9chI4IY4v0zG+4yJ3t7aCL6wUPXeYcR7E+rb1DM4S+5+dJISdJP2tzeaCUq\/JqXyISc1BQGOMIhD4wNUeSLy+o1aNJj75wwPbMi4tvhC7pKyDZ2AH\/TvFdAz2CYyLeKq+wow\/SqCGvViN1N5JosmO+HYcGOeTsU6gQAAAAAAAA=\",\r\n        \"lemouvementassociatifregionsud\": \"lemouvementassociatifregionsudprovencealpescotedazur\",\r\n        \"mouvementassociatifregionsud\": \"lemouvementassociatifregionsudprovencealpescotedazur\",\r\n        \/\/ Le Sel de la Vie\r\n        \"leseldelavie\": \"data:image\/webp;base64,UklGRqIbAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSE4PAAABsIf+\/y0l2uf3O+fMmfGuaU5lZrpaWLu2++zFbbtfqWe70nahTdmK9CGlQqXEbrQYRVEUSVFsRFFEEUUUkkS0RCQhDhESSYiERCIyDMMwDMPh88fMnHOci389f0TEBOD\/+z+gc5wzkInx7T06xjlPwuOch2Hq4xsPXRjXflTfO8c3YfSkj2tu8Z3fMa6hs5Pjmpc5GJiAFFr7XdyFVIw6UklDoCzOrlLDoDOViI6lccYcgGmpBGv63PE1LHGnACl1Bb3lcUUHqKaWSwv27oqnm3nAsJ5aHJu\/\/f3HOCJSD65XlXF6\/PhVHAqrKUbfXdm0FyJOThgKPjPVYO9WWVeFOKVPojP1nNiNTcY3cfKBCgKpx1Xzs+N0LURc+IqBHJ8j1eBYK1Z8nYS4DAPAiCvlpNVUO44Nlth3qPlQZGNjY7MhAQyLlIPaeshr7RB2NDU2tdG0AP4ItjftbUoxm99OhrblO1ht2LO3iWaLi4qiMOrRXbsaROpwPG0Eqllsrq6VMUvLSiMBFIclUPwxIvJMbb1MEXBurYR26bIJsfMg6SNLZ5aXT4PZkATwYV55RXlF6RBJtu9UUwP2nAK09Y0lUcSOg4ycWQLLEb+HBSInz\/xEkidrtJSQ1TAbUJ7cASC3HCI5OqtqKmyM8FKLAkycU+kheVEbsz9qkgAym4sB5Y\/6NZvaSQ5VFcPeiOdUYwAorHpDnlm9RbfvROOai\/wlGeA35gDKFZKhgR+mwe6I1+aAwh+7SF5x2tS2c9YWripDUnSe+VAoIBoY8E6F\/bYABT8+Ji+sTrMk9jXv\/umnZSsrkSzVW0cBiJM+F0ScAfm\/PSRvuszJPTWbf51Tsax2HpKn+\/WiYkDdsKgYY\/PcDiD7SdC47oolV9fuqKvAN\/X8BUlUawtxPwBxi+6xMYKKHcjuJK+nRVPvsm4W0MK\/ypFEtbMMsXeZG0ArC8eklA5bkLv6OjuqMwFt08btbmDJRRYhmWpnaXjWbO59DgCtLByLom3SHiDrHnlfdRzY\/w0gDnJ3OUQS0c4x2FMIaLXzCgC0smAMKGCzQOZD8srWHwEoZ40pSKraeQZ7CiEApfcVALSxwL7PLrsAOI+GPxQD8vu1jdMgkkn6OYbfFiKquqc6F8Bhuk3MnFEetaIsLAG\/GAO17WUuIA9xFpLsUn5+WIiY8rkvG8DxTxAR5SWVNCuAD9Xltjn\/PDoBkA0fpkAkF615mGsgYgCXglmAyglA6dRZjNxRs2PHjpqavwICU0j+WFRqi+PDHgCinkshkFS1C2R3GcyKS+FMqKdY9DNJ7trTsBsxqYIHDZL8qdhaRn2LW0C5RF5NR1J1XWCwpxDmxWXmAMdJ1u2thdnpBwWGsbap4X9BsrrIQub5GQD03e27r7LTlVQ2M9wzEZaP9wKC72phkUA+dQDYsN9LzptsxnmiFALavnlAMcNdGUnEeSD4bCKsz+zLhHb5E4SFERU8IyKAdS0j5NJYqmcZBOSt\/ZAoeEKeTSJ\/Mjwb1qtJZgBnC2ExLPEFJld7yaXR1OuvCwB5eKAEAFz3AxfSk4Z+YJSrrP3C4fabTIekhdygzKIWS+D3M\/1cNEEAyg1PJiCPDhUiaiF5MWnsJHunW6qmfzPEHSLTyDBHgldFrMjlw+QqyJuedEAeGypA9PwuXtSThGN\/6FUhrFbTtxEC4kKGuBc0N3g5YwjmBZaOfOV3J9+lA\/LE5wLEdj7mC2dy+B+NClitpncjBACFDkGXKYJUzEFg+eAwP2QAov1zPszmkTeTgnbAx\/kWxK\/0boAAAO2+H49oKoyv94QFAAf4Ih1QLgzmw\/SEV+zQk8E+hvqmWyhk3wYIRBU3nGLYjItpt2BZy6m9nQ6ofz3Jh0Xnc95KAkpTyFMI82J2+DAEYkqCDhO8TFjWngczAFV\/+h9YTwud0+JEH4s2cjosTmGgFib1K44bNOETlFb0k08dgPyHxiLF2mTySZwww6E5HDbtDBlVVir7\/wvTktJrhs9hXnV2ZQOq88779wH+YC27O3QyTh4PkWSa06nZQc4xJ37kPghTynP2qzE071OYV7vDCqA84CvHbB8XWkM6LyvxATx6Rj8\/DXCCrquqakYepGeKuRkcrIVVkjFImHboHZ1CpDkOdacDWDjENcJSzjs+iRegk9Rw+sPIKMkizaFpasRBGrOlqmqaGmNysBZWFQ\/fxzDeChOKdrFfQvvXGM0EAIFN5CJLcIXb4wednkCmAHD6zeuvXq9vkJWqrh5lVO8Q96gOVXWoVUa9JeDdRxnNA5OyZ0iH+o4eJ2Ku+hqaYy2XV2X8AOgOM1dDzD1fR33+gb4+z8ueEqBy4IvP7\/f7A2xXFEsgo5mUspfyJYfeO2B2JefbwadxBdzyBXJUKSPsLujvDfwtVWFOfuy0IKWXHBztV2Bx9SgXWMr6bFyOMwCPgmSBlNKuyKwgH0hpxnrA+Ng7IGHjovA8S0jjNRF3wKUBb2gkNFlIYasUAnB98l8X0r4+AZs3kissZQ3zSQJEPxEOhEkybJpRLwoJ6IHQcwib7F8ZCC+wBJfRkTCRDeFwCUyXBH51Dfd7jSDvAWkGX0PEFRaw2loGryZUM1lhbtFpRM\/0exnVE19LOc9aeoI1keXmFpyJEekMjQT9oXdxtZpckUqiqsbreFppcFnKifcFnD9eGNRtmscFljJo3E1JHvq+0GnDfM61ZvBRShJ4QXnKMLzeTHPLGVxuJZN8kJIA\/Bs0MiDuMhAeCU+KMT9kLLWCbN5IVUJ0Bft1CCkV0RTyh0KhcIgkQ+FQ7JGB49CD15LKWVvEqE2AkF30pgGAUGRUIYSQZovJYJjPksmidiuyv9fT907aBghVORcI5sJ+IaUisgK+KwmzL8wZ5ipG15pSDB\/JsAKLb0wBkJpyzDfQX2BTdG0Cv3hvJsbf5FRzldwZS+31PRRpoY9SgVV+tABA6uo5fvnsnYVvPTNtAVQtlyN3E0G08lOJKaw6Fs05YgxqGZ1fByVMvowmv3gUKwCEpunan74QOTI6Yn7o7ZvXo7cAIIfBT\/GHerLKXAVXA3C8Pqm7IIYHHCpMvmY09BJ2S3WFsVF36eZLyK+6e3jg611AyGeP464uzGJzYs1l5H4Jv9YgHl3RVZgUL6nFMrrswuz3obmw6jRuK4DT6cwdeuvpI5\/cj7PjHH5fYgrTh14ed2UoUHo+aDBPP2KSfKXa9Ae5wVIGOxA9LS0tzUVyML6UthDnmHPztgoonf6PCkyLJ0YolsOb7pU2VRvrpKV0Xo0RVXfo6fGF7WGjykz207+cKqD2vk13wCI5EgvE+057fnrPaoxVAh4lS0zk9P+jAkgzXqiwKO6RNOG6l+l\/qtmxhVycfLSWUHd+jJxPFyXgvLzO6YBlpjPdBAgHFTvWG8F51rLCFxIM+2h4iqPkfjovAVc3+RusihuEF2YDj+C5pVkSWEyutabyeaI5WrxcEJH36ZwEnG87Mzbdh7AAZoCm0g2Xi6olVHiCW1VLzrv3XYmG\/9Eoh0Dep7MScHU\/UuFmNYQpcYXoyDEFSmSdkVbmDIS5EJbzeB4Jr7eEugoxsf+MBFzdD1RALObPEGYkswVhPve8QOiOlXqObNesacGziYedpKdl8LwE0rrvqYhcws0wq36GErSAvn\/0DN5wmBFYaXAuLDuv8VUScB4OBnhOAdK776qIPqnqwEKIGCBAKwMUSA85zeCbN4HtmrU8PshOAlgTZKsCpHff0RA7nVyM6MpRtzj22Uqe75SOnqvCxJx+gz\/ChsAxJL7APB5SgPTu2xpMykmLWbccAgAIQVpBHlXkGB0imsBuDtc4bHDwSRLAxJ4WCWR9vKfB4iKyDoBsJWSgyBI+H1ORGb4koqDs5SCrYN116nZewgnkf\/lbAlldzRKWp5UuPF8PcDJkGNYLqAFZwUsi4rv+AFt0O3gTiS5QxqMSyL5vXMqxBmDuwjP\/9AHCDhQ1CCArcFFAoIlsUWBdP3E3P+EwY3OVBLLekewpsANYsG4IEEb7MUsCPAUg23deQVmXf6eEjZPZhESf1sDvAeQHblRcY7C7wBYgGLF0sSWgkG0AskMdG4YMToedTt5JLAG30THHBVTur9ahX2Dw7UQIGxx+QIRh60S2Asj1c5htTjtkyx13YqGShyWQu6MxCwAcFxh8OxF2fLEPhTwOIO8FNwvY6DzOK0jooppNiwEU+R5qiKpdoNG9aoo1cAwwZbAZQH71As2O6bxZkjgCZdt5Q8GE2l1blymIqV2gjx43hDmxoXoMJJrZLAA8eK\/ZkM5TSODJ\/Od7oIJ3anWY1c6R7HPDvE6MASp6htkogMI1252WZOv7aYlTsZk74Nr45\/bVEhYdy\/5msG\/uVFPalzGomOsjyVYBoOOhYsHZ3OtGwhZ7G2aXruLdvSpsVM\/QS091sRmvfaVBjrBl9fxwm4DIf39RNVfAAxAJUlr1lRtm8e56AXvVMyT55YfqojEqq\/4hGCAPCsAdPCSAnI9nnWbk\/u4yJOhUkgda2jbDfmXz7yfoI71VJRFOeyqqGLlvkwAE3IFDAsgOLzOh7\/dMRoLOYeOqzRhz2U7Sz9DsqtlF8Fsqn101m\/SSDVsQ0+1vFcC0GlesqdwFkSC12xCXonbzcTJAklVGqZmKmZUzSdJLNu6AWbe3VQBNj\/Rosu5NBZK+2NlKkn4GCQjjm4ry8tJSkhwhyf07YdE92ibhHlkfRR71TUFKrPur7jDJN4Cg6aa6XXWwXjjSqqFkeyYA2djjRups3HN4MNauXQ0NDfUNsNk98hPQehBC38eNEKkDQBAQxv6mpgMYU4GGdolvtznxH775FinV4QdEGHFY9vWght3dE\/f2TEFq1UYBEYgHTBpeitKn9BYjxQoCkvEgsPO0xI9P85BqS04AOBkPQPG\/TUrtSSlSjE4A2YhPUcvKdG8NUqz2GZCMD3l54EUz5l5TU40XkMPxoKafHtSzhrdN7qtLMY4RAME4UK5ysABw+yuKTqYYSSCPY6Y6r3+6mg8A6xtWNaaYgvNQeGms5G325yLqDB\/3KClFp4TyFWOruh7338mFiIKibtalFNXfBcExUZ3P+DwLZmdyWUrRh4H0Z2Og6v8a\/7pgvmKwTqSUUSiE7Q79rfFah+VJ4f2pRAsj85ldmnZ95K0GO2fVp5LsRyDs7vCqSP0uIstv2\/jQ1Qs+GNfoH9UQxrVO8tm4xkF2Y3wTNl6MbzR2YbzzeJyTNoT\/6w9WUDggLgwAAFA4AJ0BKqAAoAA+xVimTqekoyIl1VvI8BiJaQAV4r\/Tu0X\/F\/kj6A+I73v+z\/t76+OUvru13a4vIR5TagWG\/+e7DbW\/8h6BHs99n75TUd8DewB+r3od\/nPBa+y\/6n2BP5n\/hP+5\/g\/dX\/lP\/f\/oPNT+b\/4j\/3f6H4BP5p\/Yv+\/603\/s9w\/7g+yL+v\/\/2NYJyvF8aCpp8xYaLkKpMWDeg\/wGyEF70cxXxq+OAJXHZH0sYB8NlZ\/JTy9wwG\/3UCHjA9oH91SD+8BZLlQ6QN1J2v6TkV9NM530OVoOfCs8XUfLYI6N+NSWalBQt\/TaqDLJ\/d1Y2am30fGioCdQZI86CZpRYtIMBY1FDO5h+vcllu7yVT2cQnpMoTSI\/XzmbH17pzS8m19GHMigLT0F1muPBnVjt+Cq19GMI6jhLTQ3RrtqCnYzyXyeJ4JonYjIntEiUS4wB1SBfVV8qMFKYuRom+quu\/Gdi9Zvr0b1tgeUkN\/kGVKyQWpPjpELj+NqGJaEvxUQapXIMWsqniOSFDII4n8EajTm2EHA+QO0uL0zyRp52ahQdsuvwSUhpz8ujLdgtyftMKqCkmIWHq48sRIxcXB1C3bCZyVKwj48AAD++B+FDPrj+il0VgBPD9zEnF7p8SHdfZx8WAX1esezU\/6EjbkAqgimIZZO\/f6pDzkGQ4z8CmUmpaZzv6IAxlYx0\/N9ms2xusCIp78zKrsQLP5Dm2BjZcbous6u+JwAjS3bhTxREXzHO05yl1hT\/6H8XIGpAvXuMgj5EBw0VsJUZatJuZoF+t0AlUi6y4\/IAcyUx8E3lQOqgpTb5G3pFZbywFJG8TEgPDQpNr0KVfdac2wD0cf6rn3HZ9ePAeF5fjEOTUVutOqd+NyUfzLvDk2q9TZEavO89eMe\/ul55IFHWiPM8aVLMEJy41c7Z+Yug4mrGxawVd0zJ+xOFoL5AmVYn+lruPEzsWgcW6cq2KzvnXOtiJlA8bfw7Fvbp2U9nhyyCSUcRraRSI1ee0l3cvTk3uxxCV5afXyg7OgnrXSnEKOXukvk4tIav\/\/KbL+UVUsc21aazvyMkriviSt5oXfD4I8liR7iN5CqIfbZztSUh2TN8yHixC06pLKP4oewTcjJ3mhugNvG8pz35pSpRq2z0BaXDIUcWzQ\/3d59QaFSKQmcWZt3hNgfavXCIq+HMoMLyRNYUQhGol5Ws8nrDAqzugB7hdTOgqo5VwHoxzAk0V4Bh1rhFPW7QMHgrhKabJyLzyg0rsC\/TcmYSOBEBbc6stTMlb5B3L5R5eKqM4WNw\/\/ddi8gDLCj2znFhP2zyyfJfrjIBMGrj1IYcR0DMPtfmeYgRDMw0GeuFwUWCskQ6mC51dG0ry5CplVSAs4OzFP4weWVZI3ysDSlCe+4DW62pYAFo+h9odve6uUXCt5t4lJb7GrV1POtjL30r39ZHsWhR5+sDL\/7HCFhrQCDmJB8oDvUdE6Acn0FC00gCrH6TYCb9rKgWuWz0HSATJBwjg0aLz6r7L2RaJv7DAzBrxrRl9TYWH+vnOMaL\/5SczZ+ynX+UrQo3C6nV2z4sxSDAXDs30xtTO57+Vfkayyr9jyF91EBxTbxqQJdNPUCNZGYbS23XPjnzzNPgTAJeJ\/8yNRWwz4332tfar77FKtPO4rziotKeOXokJBdrX2gw19BoE1iUQ3TkwD2wnJ5viOYh2JyA+n4TCSuDc1OwmpuxJf2cQwgCAcfrPFX+v+lEx57w2B6qllSEfjPY+jHd4Q62z0A5i9Ni6rr5lQOK9rrPG\/ynWSJiU0d\/3tw+BX+itRMHkmo6pCFRrcDH29ZF3\/FrMUj\/zjEGgOyW63FK4tZ4IZxOFMBzjBO0bSYPj2pxzz2xhQPfedWv41rPgA+ZO3I9kgiOzH9L0nSdzKj9HmnwhCgGaAXG4AO5XyFl6NTbOSR1TqycaDPVOQtAO8puzr31vWJH0JRE8OjrrHgK4olfh5OKbAYjLQd8BZDy0lKmfcj\/0QuWw+ACqObP9pv4rAGARP2eFpvI6bqPDd2XGlqjfJ\/l29LZxuO8j2khfnyXQfT3I\/54p7geYhOg02QZ0u7KT8aOAc+hC6O0Xbr\/oSTFpCa9ICKVLpD+rEpihbiArAAu9dEdDjYdIznJnZmI6rqFW4KtnDgMB\/8M30Wx\/lOpjxI6ExKZqwqP8Hh0W3TuTxsdMwZndWKVlu4yNRelrUVE4uzfeGIqQUYtTDiA3KVqnGPY5k6vZU2uNSmJXfAypYs8MbOwrFU8+SuThHtJrWSdpBUJih6MTcDloLRy5zQKlMtDdSUPBq\/joJ\/UPTtBGJKCyrRwpMBtaVIacH\/pAGuA++qH04x71EvXBPepoph3UX25gWdu7sbE4H1MZc\/xFKvhf+CNq2k7MkP7MH02URYajm95tMiOA39KM77MVo3r1pBIDQiM5sb1FG49MFmuYYPy1rHOx+hkWB7xwfkRV+rZb6QuZOaDIv6egC3KWqm1kJCVqQAA\/yllLLDeHSTwYKiiYa05s1nC+E6LT0HMtuy\/4pQNqhP87m8BG7DyYKzLnPyR8Z3vzToAK0gVyW5grXWQoMQlGLbrAjnZ9FbalG0ZlNz84Skn4Icj17mXOEoT2C4sbcJxC1vwJ8yvbcqfZtWDiuwJ8Wpx3p8t\/PnDti3BmLFb\/O5GZCWqnIdLOFRDAgC7To\/7FKoGaRJWPyX5Jh0Iadb5hgZPuWJia3YYXgJ4nNbBoy2484Dchnioz4IWc5F5ejFj9XCRnLo1yQOhrJ7\/5aC9reU\/vSb8ot3hDcCPqXECpT9OCm3p2arCuh3G+dWtjUlGTFftzAIElBdxXGMmXyQLfgsTSg9PJv2jWr9koUmaASLfxll8bnvR6FTYbnc6IFD5VK1QB5ROZLwuOV+9Go0iBYyMCwfotymlz3tA2BYnHdn391c1Fw8fA7np2EZ47teNVrNw4FcFiyqxPS4rCO94kaYdsTWlv+HBpPep8gwgfMiGbTSFvnTglY6F3M0ZjllBuIjVPHGRgE\/g31mSsp04UcfPrY+8HKLjbMwFhFt2EZ0fmrd2BXpr81ONBP+VDZQmtJfJqqLclzwMaK6OQI\/mT9FpdUOBcYk2Bs4HBszZekHD8BY0c9\/F9smg1L5tE7U1j1OvpoomTuwADdoSJGvqNB3QoJjo4TNodwjWyZXg3qDfQ1Cb8Ya6Lyj98A6Y1Q35hXpQGz1M+Y8Sdcs8JRzAkXCICjnb6\/wp+Yj6j\/sQw1ZlcNxKktia9jiEX9Lzck41wLaHmj+9YxCACY+7FjPSer3wLrUhFgK\/1klS7LKzDNIrBlL2OXGgB44h7Bs2E7Cr3ffAQenXnMpxOEj0I7MY6ocXIFcYglE6iRnsFlwjECulZYGmPBbKJjiLjplTo4haE9xnObgCryRUSp7fsxBfhoA\/f1DSGWJByb+fJVsu4N6RP9O59oISs7DRCuy4Lj\/LV1lBO8q\/P8sxUjI8P5\/stPsC9N91YYjGu3PyMxsqE5J71XUVfxrjFFkSrCkl7RKE42mij8UkA\/Epvbmf7elCucz9vy8r04ZegKSboOUGu0hfAn4mxMHiXj8LK+WKX+LyEKUzYyIVedJap52M7xiGHzURT\/RiWp9Dn5wXyguVpRuL4VYcQscBZfWHh76yQlSiJYFy6DlnDiuy6IXn\/ffcPml4XOBtiSFJQnuNkalWFUFXrOkFfq6bVrAs33o1NvVu6ZncQdYivU4a4+pxAMopcVdfBqsmujLVnzYhpf\/4ylBufTTfPk31t2wPu8qTFnDLTcCrW+K2Jr5jqBjVpVoyUYAYQ\/VFwXtaI1p4TPE7NWXztkjR1v9GNoC8Np5OS8VqlirIwTFcm0nC9BODP1TgZVwDbaH8bcLxnEtO0ZhJIRLkmVdH4IKKh4PGJaH6QoMn5RUAKv1QhF0U3Zv\/nfEvic2mRK+7GKc6Q0e7NznwBIunIXfM2UaM6UwuuSHSyUFll+zYtG84dSMVdHjUUao4DCR9q0yI4\/cdxiASoJS2t03EfZeQpB5a+eNbsl+Zx6\/LwJx8x7URD8m11aKMXN8sJs8FjwI8m6CztBKhHsu+EAJrusF\/qd6yDRi1\/32z29eOwELQUHVWW2S+hreIHDJ+BIVnwcvQ07NVIdNzskb+jnkn4oFdAUk17i9m5VAAAA=\",\r\n        \/\/ Les Chemins du Faire\r\n        \"lescheminsdufaire\": \"data:image\/webp;base64,UklGRkAbAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSNoNAAAB58WgbSNJG\/Nnve8dgojI0S960VG7piqVSqGUlCRJkkQiIkIImVlzgv39\/xRJjb49awzLssImLLaQ3fjF3ZWDJMjFE27j7u4JziFxwV0uRICVma6qrvq+\/7uu7pnheZYf7yL6PwHyf+ruhmoTbuO2xrrh14IE0uZ9gSdvuCr3+MsF83mjXBsOID0LdqqarJr7wNoFBff7Sb+0xKAdt9ZmqP5S5LH1MofthO0Qkc3WWKXQ+KtE7gjj7qGC8H5Bp52wjvhUq\/YZAOeqIvIJzCtYziSxYXPGZBQqv+USkwGkJX6HzHaJ7KC89TfKfZgsrJREhl0a+FBEqmbcUjZrzcEaUXW1PvnY+9TMiy3DWrdM5ILaBKU17BeRSl2JFh1UxdAh8h8NRcF7r2QO8OERkYWkBF6s1M7Q6JkWHBmneIpBWYdXZ4ZLsEquqHuKNfNZ4LiIJGSx8dgBFDBTM+VXrM80F8hfdBUWHM\/JhfUUQCcpzHwW9VnzDlHspxgU+QJPymjkASzWXLWQekyzDOBoUhFpO+0ozB06RdRQleRX4inXJpVKcu+41dwzchmR5jbtIPEsc3CeFI1E7s7xhNyiJgLsq7RVEhGRhHKHKDTZDJGk0iaf4Y3+Q\/L3YAAX1sglDSiHpL1S2KyDxB0wUBER+bLMXVNOI5eTAp6vJJHC9pOOMgdBC6hK\/oW619Qvyt0zaTXHa3JpA2i2UVq8n6ibpLetTaIf57IluUexYP3DclUEant273tXklyCLXH0KMVW+yW6EU+di3PLMYDT5xO5KBdsVgBsb80eohb6pPDVuoc6l4kkcl+EF+Tagui7IiLtR5yWKG3oiH2EN3pVIiJ3n3EKWP4lMo86eeusi7GjJWhuitkdUrwFj9GbRUSuP20Vp2MVWUw9pqrwtogkWEqq5oxGuiIv1bym2TwRkZUYIk\/J6O9GPRs7LgMw1liU8ZZYgBq9UnYtnjqdl+z8+bcpFCwPykUnjMZAa5wWadtnFdTE8taQL9qGp85FInLX305jz8uF1PF8KNLZ1bkIwKJuUysckNErpT\/Do+ybAFByj8vl1CGYaOBkh0gXlrwpMjDrv2iJT\/FGr0tE5BEMecONXcdSxfOJRGfMmDGEBTa1JugcKT02GZR80KDk\/I39R41S\/HdPVUQSNcDf3dQNYEyd3qocK\/PsZNDUDYrInSedRpRjhwjgw\/uxfLdm4FvjkfLf4wFUKTTcNh+D55vegd7e3u5ERKTtR6egx6Uf0jQF+kS+zBSMiWzFU+dSSeQpLCUV8Gwrs8EpeqIFE6Bs2VRqg0ZwaepzTl9ru1INjjGJfrpljUgXlrxITx\/Q29MjIhkKKd2SyJozQU24VERuPOYUyNIMNADef9NVtGkrAaAFxLeszX++LhH5koij0LJUbsag\/Ll+4\/oN638F1j5RCRZlfLaISF9fn0T\/QHFhQETkewKedV\/0yFosDTrWST5Z9\/m3EFA9ObsF\/ZMpBE\/hDrn9dFBgkkf6B94jA5s9KDdgKOm9sivBonpUGvwLJZgPP\/3iqy9OqZLf19PxuWY4Xhn4d+ZyPvumKlL98qNvAR8gOKSVYAEfDZbPz6CA4eFEZJm3YHhGrnM59fkAIVsbgUaOq9KgWn5rv8M7THaL3M1ELuUrSWQO4EMArWcMtGRoLjZNlXgdCODqSxNJ5DVqZPblLrmdCUqGtKaHxFjV3wcbwelUOvyzy7xXbKoutX8yfxV1JnlYOl9n3JgpdnWLSG99ygOaZjBHWjwEuDRvxrlz3mlq9m+GRESqm5k4w3KRjlcZN2kh4Pq7OFPPkEbnYkAOh3qamhQCwNOVrq2c4sNOkcrrADurIiKDnDJpmnpYMFdaPn\/JMIV3iPT9CTzenpPOTfBFVUQqr1JyYnhkjiTXA\/MbkiGuG04GPflVw\/ri8PDiRKRrA++2i4hUFi9cNFyVfGUp0eEhOTsXjOSXjIqI9I0MjyYS7xod7ZB8ZXTxSPSCkQGJjo7MlyYuFhE5b+SCkcUjIudXJN452iZNHF08MjIyV\/435Ur\/uc5MBnqbNHsg2j8wzSWjBts30N3I7L7+PoqvSqa1PuomAD2zSvTM7gFwadScpnda61jngqbGQbWgG7Bpmir5EOr0TGsyoBaCpo5qNYIxhqgGDcDeGdPabFIA1eCgK9Lgvh0\/V2Ra78ZAuhsIxtEpIr8VKD9u+2FnItP9jCM28L3s++0gAUeHiPiYozORc8F26hwQETmC4iiTHzwX6CZlnyQiciKDqbZSbpL+c4CuSBQPSKUETDE4\/fWrKehUDzWhtLpsxnQ3C6OxDjLAJa5UmKjIdN\/tjbJXJOnA0PDkXxNtMu3PxCgHZAZ48lM+UquN\/zWeyLngbAz5EMifEYCAnDP2YABUiU5KQUXGyXuq09ysWFwnJVbaUD13OCP5cw6NaOBviWsDmjJzeuuhDiFwUooJIRLidMs030ctcFySEgI+T7Qq0\/9sdieJlE4S8u1JXs4Fk0QaTvLyPzJf98JzL+T\/\/eLMcr0vjDbvhfJjL5ZJZPTFp16ceTa88MK\/z5Jbxp4dsxT\/OLPUfI6vef6yRpKxp8fGxp6h0fdLyIV\/Az\/ObMXYk2NjY2MvAU+eBbeteYK8i2cpP8ws0fnVFDDxxM3lKkRd+SzlnYJrH\/8L41N+mClJM5585Mkn3yDuXMajLbrzsYcBnHNKseH77oLOLWTqHGwrl7i6c87RaMpbuUS+gAAYvu+WBisPr3z4XfIuc3kg4+EW3LX6IUCdUxo0bO+LdG0mBfDmwJXlyGhqnZfbJJGRPWlG3rD9obkl2lYv+wjA5SnraNZdDywDgrVK4+FvHs91bSIl6tlVzjbHuj+ZI7JknEDcw51FbZ8B1llHw7ZZdwCZtUpJZ+POwvpemfnP2zeSUhC+LlWhEWutdRZYU5GLJsgoNvWv58SqnzLlMppoLbc3CWctJZ11lpJr7+mW6lYgo4gNpeSB1FhrbVH86XuvEJHvcJQ13B+7jAkaVWutdXCnNPlPpawDeGfZ8mX5e5d1iQxsY8pmNE0oHXh42bJl9\/5TZCiRRbuykMt8xNvPByLDaVpOrfXkl90vzSYrk\/H6iuUrEimZyFKmKO3ZWC5Z8eCKFSseiWVO4pfw8rV1AkAGIYfhwchl1IvUOafAitUrViyV5q\/AF3n3qjTc+5H1jXxVrlBjtOcS+TMDAkDKh7txOW8\/mZ3r\/tT5mJJ\/Ys1SafUqfEHqK409hKF80L3zm3B1JIRnk5zIFowJAIZNSd\/veADDMzkZCPWIwppnn7xERJJWycMUGmY3NOt9m8WC8zkCB5pANMskPv+oKvmMzZ0ic771HrDZ8silRFSPXygi5116+Yi0\/mkT8dn77Q09iyEaKAxhfRPSGG2xUwTy3q7vEJH2d4LLsSLSs8F5ILBzzhUX3w2woGWJ\/I4CKRVp+E5vI4G\/X92Kz7FekobIq38riX2nsRpV6RlZ+AsZpaRKjZKpqTuGWiULJyOGjtysBUMLC6rvhywX3L6L5HzqgOruXml0YcQjhb8Rczy2cDfgiYQHIx3\/8i4S0jQ1QHDMn9+C84fmzSXuuGpoaOHQSWBVEnkKQ96wRmSEFCAwPre\/AWK+UvBTQTQ1nmjKU5FF1GhUHTRvEMBqpDi1Z1hZEZEZb7osFzh9QyJLYoRA7bz+MnPTGEms9zBa4FJPYcbvF+fa7k9dQ2jNN20Ak6YpxSZN0zQA41wkiTyDAQhuz5CIzKUeQdOAm1UCzWn4pmAcpXF1nFwk+SXUadgr7zUNQ5NTLhDpfMNlOcdzM8\/r77sHGwOte+YUzEkjIUjhT9qYBji5SPLJvamNaChWeF+aXqPJId05R+QlLM0PExtjCYEIlYLdlNMQAhzePCz5yioMeaXspo+l+TRRQwg6xaAkHW9kWYFPTZq6Up7jUmgKdkjhzgbyh7fOl\/i1jJNXdOuOrfn\/bP1AWvmdL6UhaCB6ZFDkNSyt\/KCgh0hQKew6VEo5\/N1\/vjtfihdnaU79+JNyllJSlfzBn37+afvPVUnaXs+yiGoT6j+9J4UEIlQKxlFK1pkjpZO71OQ8GyU5S37WAoUDO3f+sLNNCt\/EklfQmKpGAt9Jcbcp2CGFv2kpE25NSt1AHUDD+ONS3BltnpiYsndvIqUrb\/gsp5z6k6CqSnHgZ0kK8OSVSkdHbB+lSLmro6vEZS7Neb6pzOiI9xPtaJ6NqDsijX5ABqD29FD\/BHl3aN8RtEDaozNsLFptChmwvL2jPXI5kQZt3tHeIkvS0LMhknKryJKj+44ePPqgyAJNIz\/KIA1bW6Oa21ugMTJnAZ5o62hvu\/JPo5Fgix1RR4uyk+2NJG+TUztxkxS3XUFKZEPChIuWAOrMEGk7VAAaAbxzjvwt3dQjzRxvjUMa\/owMwHC9FF8EntjWBEMza7TLXlUA5ZSnfHCu5pYuxjQtNE1jbQ2NpQW3l5h\/uqYR5ZPkTFOUvyoiu1HQdKLy1KkMLdH6E037SyOVhuRlsoZkLmlOWSfShm0CkyIih3J1ukXkFaXRUKujTTohzXfNei54wGc3lRnGAspaEelqqFarjdck\/zOAM7NFRF6ujYdSjrt6nGtGrfZfaeEZINgmyBr11Mw1Una+mQRYKyLSYX3EFErZn8C5qhSuMbZEFtbIqJksZ0xqjkiLT9maTaSZT1l7uTQ6aE\/ZryXabiettSelqT9YV5Wyj7kpH7FhtYjIPDtu48b+IueID2HBslr+b15WUDggQA0AAFBAAJ0BKqAAoAA+nUSbSqWjoiGoE904sBOJaQAV5X\/Ufxr8Bf8F4e+RP1fnF5O+vTNT+Jcc3IR47agXsHzUviuyk1z\/Jf9P1CPYn7D\/zvCC1OO\/\/sAfqj6I\/5nwPvvn\/M9gL+cf3D\/yf5H3S\/5b\/3\/53zp\/mf+K\/9n+q+AT+Yf139iPbc9i37WeyZ+yn\/kRlwUd1XtgQyPX4FMdB5fDt45S9P56BxhxR\/h6fOytbZDk5Mh7\/8o\/2rob39ZEhaWIHhJNDvL73WcVelglSruXGEyOPFQVNqN6U0D+IyApfsMQ9y502jTwG1F81yLeNjt4qxYbWDQRTWfYAa4URv2PcF6HQxsbYW9AaQKAsLA7v3QQ6GfOoVXTdOcgev3F+mGp8joLK9mwscJ8TPHYCRFAlp6g3wWDLE5rEQjhPKgFO+wSkeiBCf0MdcbT1mbbvdwX+B0\/kb+3tU70X0Dj80Idc5VtBiSW4\/\/HZ5HScYeNlaEQ\/azJ0a077vNDV8EIw1Mw2A5Bl51gumgUxOhtWHKh81p4E54Y6FMFMLT0QsPSLmi0oN2ZF73ysrsnUUMrr3EjuZm0YdxNyrTx2FKcjMVvdyiXwRLq9pDR7nzR3G4H9351Quz+vfk87p2uPzaGzjfTdy52XFZ6g9\/jKfafZE0\/D\/\/iIqjBlSb2JolOvaN3UyKDuU+EkpmJJ2UDHEAA\/vucwCNWrc6hYaY785p5UdW\/X8HQbwN8VjFZ9viLtZ5k2UgKxMBZ18za\/r+uMgqseuYhrLJ+IqbJ30NK6bJOXjvpIr6BG6kAwbFwpkREDo3zuCkp0Wa4SvknlQQ0kYFjtSXVE3wRQVAfxY9aP82j6HaImg6Q\/H9jwSE5fdbZjauTJ4zNXrAGTJo\/q6\/3uWx69L1X1gYRj1\/9byBPRnrtQDMKqfNy8jQRM0uPfZds2z316Uftg3XnIfltPVlfcnZdidfx7HFva4ZEwegi4+LIQ0cxV5sxb+MkIOSQEMnwOtTFeIL2vfePEPhTXkyKVCqCmECRyoehZvq+rQtJSFideVOogSDZiTvChrLgx6tgYMKCocpAcKGkZy5oi8q\/VLzoLdU\/JVEtMsLuWlTYoeDAkxlLuzUyaA3vHz0DyFYmjT+LszGm5LLVkyEsUsZNhcp4T3ALbe2Xn9tEwyayNEXmk8cWIJRti\/pVH7v6hSiV03Jt2Lbqez1fZbDZnPnd1AG7ylOPy6KnfJMAUtyfi6R5+aX3LGPj5ig5LThG2LllLRAn\/hpCjCqjsbEWmVSxY6cb+rZoiofXZJZzCW6G1aIjNanXesdeics8pharlCP0LFFy2xdF0XpivVDvTccXhHVIyq814cXS1J68\/mgd+ekCOiegA1SeZcCer3VxprHIPR\/rAx0sB88p2brXSu5Q3vFbMyRN2ZnFTGBEO20\/bVfZHQxXzGhK1A6GhoVrruXEz5Tut1hdteEQyViUh9cudInprzkRgMUmlR+Hy6UFsPnLV\/yiSGsvTpz4l\/YF39a7IurTYVHbofmNbPpygZFGlOMX816XI+XyaB2Lt6xWAk8ZdXgzOV\/A2DwhmE3FZLTPoA4eAl6R7\/okVLcdGp1BgkICMSijooEAlZDacHCw5mFcAf1kGNjD1E36Mh4FFW\/SlS3Bc5vlg\/xxR66aVb8qAxRGGOTJHLh5jQoFJVhGfdH0mbRIamkR8rn8\/e14JsHO7swg4fsN1+ZmBtiYaQ3TBLIum61OPdlwVM9f\/feq\/NO7Qj2mopZ\/ax2keqk5bHzsO2MlC6C0oCMgYx1MyeT+tCPy5p43hR0Mmz0KKuUmMXQiK\/0Vncbi2L4mZY2vcOlHhBaRsUpCb3wLtpTMRkaFJdzLsJ2hFf5+KB3N2sOQRo\/oAtl2U836P2t0BWdN2lUkPOiQ6qH4LPbLLhnHi2B4bVaz0kZbZmlcpVieaWqto8doHu+YFRPmaOa\/BJHJmjngwoE0JgmsNeiuCXXBSWd\/f5O\/IL93A4pHb1NcTyW+e2itmQ5pPznZoMWlhyEzmdqcdVx9vOS9\/GemQ6jnjd5Sp91xwyIWrRInHwbtg\/qUx\/lwiWUYVRndUVZLdzwGZwo4A7Ni766N\/kJhNdi04bmr4cmqqrob0OJeYJ3c0bUgp+o6ZTa4o\/b6vwDK73g3gYbiOIgniYKAXSmOWy5hzZP3bAbrdZWOL\/Uv6UMTHzjvFPr3KpW9PnpGiwPOwP\/+W7NLXpGUy2e5RNfy8AVTIMxjpcRP6jMmXiMyLdgpLRWVxFEUR0XgRfU+yLPrvk8NAlXoFjUGmpywv3IiiEidwH+SMV6iNNr\/gmM7bDox4y9g\/i4kYoBCltKkzNQDaBIkqgf9xdk37pkdE4PiL\/iBrO6LHlFEHBSDLfb5mzmfiYUYRZEweziXaQiRVJ9H81Cb5vGGG1+FWL7apPP7UxsS3u30upJWGUCik1gzxqt6tNc1PomFJQrMRBwnFdqNnqEmKizUPT2ZowU8qAepob82uXwI4dhhdRrGwFpRFI7otTueyMw0h6Zfn3NgRTdkd3bXr+d49OBPeG1brkyG8+GoYBc5pLa1YiihXnlPdrvvfOI49KG7oD4AmAR3RiuvE73ODR0iirs2TdtwSiUS\/YSZ6euDLeao\/Vxfskbxq4oct2azR1AO0YSFCv76LKX1tB4UGgmhwRlm\/DL3LCP9Zi0UHZe1C7lhczBXXkPB4MAP\/3RrrjOK2v\/FVzv7CulIDza8aEiCKZTcaPczRAZkBjoEDSFrL\/ZWii2BJi49MFUEwQtGU3QzZEqrTRn2J\/TRTKPRA8YHDYDZQkR9RqC0N3RyN5+eoj6brKWSj3D0m7Ey3v9yBCQac8Zyf6V5jT2E4kUzHa5TG0iM8n9E5hgXp3xlzYxKL7Ol9D61rTR6B\/qXGlHSdEmNjEyZ\/xw1pROPNfOf7F\/RYQDC6xzJpe7jGMNOTvSg+9T5h7+UCxb5Mf0gY+FJPGdwCmeuRb1FkinR8cZxqoDYH6l4BS1x0glPbJUmuq8fP6vdiVE1dTcn7FQ0zhbVy8Xv12IYsxOiV0KQCEdyupVoSgk4ny1LragFNF9BZQfdkaGkBlDSOA47hZ3tStVFd8HL9c\/PyB3tkfBMddA9iR5aXm\/ChghSimSEr2wlnqPZSfQhYYnnqeCjzjPnhxZOhIimba\/wqiCxpXzz+Oi+vwJq5YbptIhUyl\/k4TuUh5IBOGFgX8iwfxM7lVcryqW63ynJhRU7SIpi4id+VJJOY3CByUkgtEPJgzYxn4FiHNcGpwSvmLUaS917McoUUSlgL0LYYVY1SYCDsOuZglqce4xPZQzEGfpLcTsYzBFvkrCoaPND2e41Dyb\/ek6DZHMwVTWYNVVc3cexr4cAMgwM8gW0bIdszhMVXKw3mE\/r+dKfnITjNh7\/OwXmbtKSZyHaKX\/xNPuv1wTboc7bdzVb4neU8W+El12UOqNceauEioMmKhp5cZ+tD6XeRym3fif6tqK95HEPU6illnhJYeESRxl+PCwp77\/Y2HKaD+9AeRQL9rqkHhfDExZC2bKkR9w3YDh9+EFVsFGQPF1qePkUjfgJk4rILG1nuD5HMhBvo3MUVpZkg10BUKZCzLpIXIT6o9+EzNFyJ18D9tLvOMw3pkBcsHyFy8+eIM7MAJujkG7N2KczBROm9odG8aE+futpR9oL0lsMpovskVBwA+7LYOyKEL1Cz+OrwjR1JRWh+1NfAD4KlAg5vyFHY1bZXuOHZAWGLy6cJXoUv1uYcs8c+e6jJDE7CToR4ATlOm2qA4m572aa3iJJighpsXthLdHZ0wivfjzcfMUxJ144lMfCBJRrQ+VV\/WlzZVRGxE\/a6Pzq4xf9UHV\/79hrf0\/YIb3288Hrx+CkBxtmIA2E7EAufMtgSzwGt9w4iz4ZMhdT6l4B5oqRb2wGoY0nO5byjuuLSiJQQs8F98wpNszPba5qiA\/K1uiXa6oy6YEzU8QsZfQZS7XoEZtzjqCgjc9gFQBgxuxwUSQwtTmXb7h6DIsztZweQVQVsJwm84SWOeNEabaTfwhc+tEHqlmaTSd6JYq\/4unMSYOUnB4xb+a9AhYQ2+8Ujmo0NJBiRPdiBzdpM8Y\/BgK6+JkaOqsZx+2yrc45Upx0L12ueMzON9UeTU5kSqqH4YUH5vTc9287Y2AH\/4OAnEzphhLapd7LYWjfMYJ3ipnQgAOgeJfO5eB3iiin8IgQNwtcPGXK0Uhunt5ubayJI+dwpQ\/LcAqq49M3bqfFnGCx5JubSCRxcR+7qWKDuubKYSjVulphHgz\/n1X\/48g3uaMR2X98joPSkvAq5kj\/RkuxUmb824VmuCgb7UCXVc\/7od\/IKNsVz\/EapIGWqFSx+Q12y8B9mPS2xBCr32zUfT4UmuGuBFBhLmwiQCgwy2DvNmmf0fzYk04Rn4yOVN2vZ4xsctH9w+\/gqL+MgnEDqDrzI57h\/JYVaJ+PhYswXV6rQbrPhOZX7\/r9smyl0bBhqOSJv5zzviR2OpuZSOrAXiJETJ3\/Bt9fD4Xh4973QIVAqvkf4AAA\",\r\n        \/\/ Les D\u00e9termin\u00e9s\r\n        \"lesdetermines\": \"data:image\/webp;base64,UklGRtQMAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSJUJAAAB8Ifsv2sn\/v89995nn5z0ZorHljEzdo1pGo3djL3Tp5dMH5lIrChluk7LNFGUBImvIkqISEQiU5RBFHGqhGAIEkIIhhAOh81isVgsHn+svU7iaHz1lxExAfTI\/4\/8\/+\/IgZRw+dsHL4cfPmw3fcLcl+sutsE39yHCSRlW\/PLBv3VJ+EvmRSM839IHNzsuY\/Li109d64BRRCMRpuDfXn9oQ0GaPTg5qXklL396uh1G4UWjHoMx+t2nu5ePSo6zaRC2Mqese6vuVjf8JY9GIkzBn11rPLCiNBzvkD4sjgbjZPjLaCTicfiLu1c+fK1iVFrQIvPw97uQNyglScG4B6P86dTBZVPCIZv6fxJShAcnQAG8\/dqHzy0clRy0qL9WQl5R0RNEdEh4GKyU+mVoyKb+u6kW0YJrAPArEX0KNmhJnKPYQ9mlK6vO3ej1HPoakNGevvcHBde9Fxc1y83Mt4jIZvBVt2kuohIAnn2gWXG5Yyv2HG3G3ntV3tIFxGk9Xp+nAMBtlhzHJ00oTH0wuckj5j1z8EqbB13xXfeiiYhWQrBOVwMA3l77xvxQLwSqMh3SHyB2aOikhXtOXpcwSg04OGCKi8uJcc4WAEjQqublJzluYmqK40kFQN7If0AEU0fMefW9S90cehdTgnPOGOtr+vrA4jG5gQGDb\/R2a0P1+myLdGvUjqsKl+kyhGACUO79ZYdyS5btbrgahVG0F2YFh\/cwBQG9YcfKOVPHZQ5Uct\/5r6tn5GcFLTJOO8IBMNVEWTegMwy\/Pyw3I2\/u1kPNUQV\/KThjUkTEBiK6DkCi68DsMXn5OwCgZqAoQP21AXAA6lMiist7EUqox\/5kgficstU7zv\/SB6PknHOhpIB\/dXnZG0fXvaNQGSB9Io9E+PYBI3KH+aWvcLUewXEynJHo0vAJI8bshRIYQnRYRMQ9s9wh+bO3fd0UgVEIzhhjAhJGdrX38tpx4cygRZSKDeT\/NjjH7oGypr7fc5OIEp65AjhaBAKn51WevJV4GAAUQ4tFdBzAyAELJOaUbdxxobUPRsk545xzCfOtxhvqbH5ywDq5mYx5HWQ8BHEPkgGcI6INgIrMmv7qF0mdUPDNafAiHgfwGBEljxpTFuqXFRwyfu622uZeGCXnnDPOBIyy9\/cjlSfuZMXbFMJWIqK6SlN4mzajrvHQLah7kCSYukBEy7kH39Q2wTnzAIyJAEDn\/jTqfyAlXPbS3sYuD\/5KcsaFVIj11pmvtkze9qtDROPaSf9bjVb7kuZkjZl\/Yq42eulhBoV7AYmLRLRSeVJE+lhXahR6T8uZpMz8\/OGpLsVqBzOnLHz7zOVuGCXnXHDOhAIAAaDr1yNvLN+MQzYRUcFNIqLSOz7Zu7VTL2rlhyvLP1qq6VWSRUQ12W4o6FoDtgL+0ZSjNa+Xjc50LYo5kBouqXzv7F0Jfyk4Y4xxLhSMnR2AREuAiMhRT5Jefl2b1E5kx+cWHCuY8LjzVx99+jkfy42fDACtz60tzXWp\/0nc4+eIaG3f1dNvLy\/OClHsgficaSu2NtzohlFxzrgOc7s6\/eKTE1KDth1aAdwg37t5PtM6xs1etuWsarvbe+1vWyYl2US1L5kK8Orm\/U3XewC01q3Nj7dpYFMB\/EJEbtCiWC03c\/SMrTWNd2GsfXv20AucMy4U\/Hlb3b5np4STna50Mpfgut\/7qT5T4Rt5rzjdIv86gxXYCF3UV+aF6F465RXrF1OMgcSs4g1VZ1p6YZScc8baiGgk\/Nuaa1+cVXg6ZJF\/R1YMdLfFrzhguPpZRe6CVorVr6Dm+LcnvsvMy0u2iaxQ4cbt5zYMlNFy08fMqDze1Amj5JxzxoWE3hQ\/orD19unLT0\/JSrRJ\/4LMd9K1dEc70+kXIt\/prRYRTenQrNgSUx1yPyRfy1oLAAcHyk7OLX5ue\/2dCPwF45xLJTlX8BXgTceeLpwQdi1nC5mtGpPTPSYtZ8Qwr8IiopMGY9kNIqKiO1q+E5OesMqPkloYi8pd\/QkkhsvW7LrU6sEoopEIE4j5bsupvZ\/eAs6T0amMgY6F4nMK5m692NKOz9ZNTg1iGhHRhTsxBLWbWqHP4gK\/l03uFM1K2uRBgWN3P6yU8OjSecs2vX5MeNFIlMHIvvu2A0qhfWZeeoCIyCpVjSZrs2HCrqMcAGTD62PzkEZENDNIRLb3OxFZKUQUnxNDkU\/Fdz61z\/q56QU\/fPHh4drbABQGIMY4+EZ\/vbRvffmwhADREQiJ8xTjizf9nITH6jd8W6IdBHj9+gkhi4gCSNd8K3CNiOxyIhrzeAwlPiVI1Or3ZZSt3NZ4swdmJqTgEbVnoJKvfFZdkT8kziJzrdYcS1qzlnb828OfAViqvcPFd2S0kWGKU7hJRPQ+Eb01hohm+kxs0yrUZyVVNY1RGAUXLBr1uIT\/roEayBPaRS20TItv1KygRQEVERVaNdCsWUPGr96LdBOdUNe1i4VjVt0eRkRTrxMFQpt6N1Y33IrCqJjnMcYUjB3fnXpt3sQM534YCUc7p+khcMzXXoe6lh2Op5T9L5aHT+cQkVOkZeGG1gQAeYGsMQeixy7chVkwz\/O4lPCPdvxt1\/PFuUkO\/dlrYwgzewDWhDLHP\/eLlLfzg+T\/1VAisutsIqKPOomclOuSM9XbB3+llOd5jEsYuy+ceGPWuAzXovv0aCwqluDCp\/fWM6APwO8tCpfIfDSLiKit0ApmTtkh677rhFExLj2PSRh7W85Wb5iekxCg+9cdkv\/k7k4oE48lccWE7MBXEGhYlkZvAD9Ypq\/HJQ8vfC3S3SbgL5WSgnMuYOxprNk6c3Sma9F978QnpedchDSMRCy+h6GeJiLaCjQT2XEZBUtfO9XXB6NiXHoekzD23GysWjk9K+TQg\/UIhMEdTkQ08moMh4AyIss5BNnz2ZkOGBXnHmdMCPjL3nMfvT1jZLpLD+ajPOqJ85p\/fQz2Caj6yrpb3Qr+inuex5mEsefK2epFhdlxNj3QmwDgd5P1NM5aTtoTZc8dbWyDWSnpeUxI+LPuC\/tfnjUsxaVBceSMuUu3rPCxk8uboSKtvTArHvUYEzBGLp3ctWBiTtCiwdaOHzvr2WMXbwMQAKAYY57HJIzR25f2bpkVTnJpkLUCKeHJzxysv6PgL7mQgjMuYPQuHdmzYEx2nEWDbyCrrLKm4Q6M3NMljNFfL+1dNzOcEKBB3NJtxz3lRbiUMLLLX2xfOHpI0KKHx1rokZ\/O7l9eEo536OFz37Gq1Y9nhCx65P9H\/v+PXgBWUDggGAMAAFARAJ0BKqAAoAA+SSSPRaKiMBFKBN0ABIS0n6XyeNfGPx0e1+l6Rpv06mGIJ9L\/VeJJdzMladeQGheku2XUCNMPdDskxh7oXE61c2M5z0CMBqnZys88KjC1bZptcbjGj80TAlx1ibudEhiXpjQTYCRaXhSy2ElWQGf+owemz+oyVsX9vYKYg8CNMPdDskxh7odjgAD+\/TZoAAAEEtVZlqECPbfEl+oF6GU6nY0bPjd92X84A5ebCTIZrluo4SHeiN2r9IzDLNGrXC9ogL+1HrqGlk4RDT7iqWExkl9ugESWYjq3HE4q1Xw4Y+A7D5PwYSoKF8yj5TRHNQB8833xNKOeD\/LcZsCvc75o2wZhx1wSql74DxcQV4WQLMUO\/R3wTrX4arZhcxKQv2zHbptOlKvfUE\/\/9jf4Bfh2AeeX7bNb2LHcmGm3A1lnLVmtBkZHC9zoeDtkzT6\/UeJJz7MhjLcFgnfO10bAs+kTY6lo2n6+oz1fczWMEtuUwKwnMXEyYtuNXU4GiM\/5nPq+8BqN\/hPrYnHaWsofOvTSA7Ko4R7l6NL6k9ntxaBCBoUEctULqJLWiIwm+7av3mTWepnSsCGFbtXPBjK\/F2TjKZNuVSVDOxXMcRrJHWf8mGyfi\/wSTotH9MGEnIjGAXqGHNrF61YHfOUz4QcRHoIWYosjV4Frani284H0XB0l7egHWG3QZc6GR9P6HJ0LoI5g0kp8nBPefqdzK9TeimXnQP5pAb1mVfVtMsMWckRAOdVS019tIhKVqSpXm7DCx5000mBM6t0frJmLl4M1g+nmb0uMh1M6TExdqVPOPbwxuxL+kWXt+gRhUAmfnpMf5ubmtKKpoSBEbObJXyJO0jGVEownSIoTjK9umQnhdkjHfClB4gKBBvA\/SRyFBNI4KNNalfiqRazVXHszh\/yW49biAi1Niz3tDBfT1l\/htD6SldB5UBGwhiZ2nkP\/D\/9cAqH1ePfZrqcRJu\/X3SZU\/DXHA4aSEu\/7OFp2s71UXwavna76y2OdLhbpJeQxdLgcbZhpa\/aKMbXAAAAAAAAAAA==\",\r\n        \/\/ Les Petites Cantines Marseille\r\n        \"lespetitescantinesmarseille\": \"data:image\/webp;base64,UklGRrwZAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSEkFAAABsMT+n+LY0b9sj589jpNTsrx7YmY6hZmZGfyW8RRmmmVmhhvdmMFhJi\/TyKOR1WqVWq3SX6XvYdov3e6qWpYiYgLkf+qfQQYZZ6TKVRu\/RUH57cZVKWIm7PHEpMb4uUdiF1qlC8uRzx1HzQwre1XD0fAjkLPHOXxkOBou6Qwru9EwchCVnxUxRvYFcMqTVAewrxgRI6dSeb2YSHx+9vcqZjs3d9S9Oau0VXb2mInChwGtpFpVfR1eVVmqlcBX9glf51J8rlT6YmdJg2VRqVT6vGBvMYEbnEqutNazfWRPAn8gm7TaclEvcPurbRfbXBO2c+eZb9mCy4N2cY6j5WofuThgR4Kl9Q6OPKojJkD9Z74cVxBALeHkngS3378Ick8QfT7non4\/NHdTeE84fcHdAblo+qPpnYAnsHdO7\/zZ9PMBuO66jJ3OE1TvqL7++oGYNnXPA2xhrSe43lpbWAfXj6XFvdNZLJSQ++zvfGDcns5bmBP+Tb7Ung0yIpix0Z7PsIiBt4svtOYqHwUsRVte9TNXxkF\/2xbIiQMPtGWqNhb3teUBovFAW+4lj4PX8vu72rD23kw1DpTQWT0jXSiJpPr8mMHKiXle5jUWoDxn9V6FElEtXrxyR5QFUc3LI1bs7C1cXJT5OSt1SoklshY72S1iVqL7yteCJboOOL4rq9g9Hgolwpptc9zeo+bMbrZKYl16vtHcLWo98bZ8prEPgiPizs43GjKQE3WFSa+Z+7SIG2XBuJnfEzv1+TBxYP1fPD4fJg6Mk0Z9flkvaQqekGZT4PfmP32ekLQp+euoGYkeCqNmZikwbmLwwcL76Gm3PiM9UCLv0UvHtUnn9QvvYwclz62tcxCOBNT8Daau81iQhBkX1HVWKnhv31nPYb\/ONQ3Y5pP1fJuMRHT6g4NqudzlqbCzjsHnsemgtg4Ss47B57HpoLYOudzl6QC1fJssFZz+4KBaDvt1romQ8Ump9ywWaeDt\/J01nZcKmT9Xau4chEuCvzKpSzqvX3gfP2UyqstIDzR2Hr1sTeoffLDwPnKKdsXUJzKjiB5jafT3KTBqxESv5K8jSZqCJyR1fm\/+0+ePiWN5QtLG+a1XdpIGhb1Sp1xPHVLH58Nm7tPowbgZyOOmunVprxH5ILioWaw0fYvamHnHnaYps5uteLk53zPSePcEtjONks\/g9l2ygp0TABchV3L0K8aymrsnFhudEt4hK3zOHBcZh\/+grPQRZREZq7fIir8KjcoWE7Nq5nmZ13goJ3ZlxY10oYyF4o\/ryOqvvTdTjYTDGTGrJ3IveTQYSSsfwEbD7WrHVCNR8NiatBPyOFjulZa+6meujINOTUvkKr+IA4W09TNEwdvFF1qzQRaDjA1pbectzCOwyZfaI73TWWjYfPZ3PjBukXTOw2WFLcJU2MI6uH4s7b6Rnc45HxjvHDuvv34gpl3y+Tt\/Pn0IwAfFAw9Nfz79vASyX+ED4r2DvoS0P+hfDLkPhYVv9fsS2rVnvhxXBEEzjn\/mPhLkI8EGwCnndSTUF+e41jm4XcSESs6dZ75lXvWzEvT91bYs40YJ+4FstqvIT+gGbnAqubbp7+wvoe9cii+X+aIoXDOuKIrCL\/G24MZ9gyfyYSi1mp2qqr4eVaVSq4GvrkkMP6uepbPZLKPRbDabzVhqZ48ZieP1LP2rEXlThdMn5Z0H3iQdkc8uuV6MRLK7PqzeJSJmOBwNPwL5ntkMfj8crhsRkd6wuisRHz\/3SOxCl6iF9z3v6ZKWZsJyBxefvS7pedXGb1FAy80rJFHPIANyviD\/TxQAVlA4IEwUAACQUQCdASqgAKAAPkkejUSioaEUqfZAKASEsQBo3Qvvf1E\/Y\/Zn71No\/0e+1nC7hch3qt\/T3sAfqn\/svSU9V\/7l\/kB8Bf5b\/af+f\/d\/d3\/3Xq2\/vf99\/3nuAf0v\/O+sd\/ovYl\/tP+x9gv9bfTL\/cv4NP2p\/av4DP2T\/93sAdIB2MP+M+lXyM\/0X479eN7N9o+Zo9f9tv0P5h\/Gf96\/z3gj8T\/7H1Avyf+af5L8wvy048XWf9R6AXrd8\/\/135x\/5Xz\/v6\/0M+wPsAfzH+gf6f8rPjb\/Rf4jxKfuf+Y9gP+U\/2j\/af5j9w\/8B9MH9F\/0v9P+a3uV\/M\/8X\/1f8T+QH2Dfyr+nf7j++\/vZ\/if\/\/\/\/\/vB9lH7Eeyf+wTc5qRzlofmciXngHdMxvYnhgCl2D8m82TsS8z+ApFb\/vbPj\/+2c\/tSxIG1GdrqWbbcSeeSd\/K3VT5ZH2erUmTWWSn2QrN7uksJuQyb\/RyK2MEY\/sZHGJMcTzFKAWGbP3bomJBKbhH9VzZQXUq24WgC4Xdxc22NJ2P2GQDiVQIZIQliBksVgdu\/BtVHwAbdScHaosBJOwhTDcrSfUso3HVf4RFN6PMowdoXATaFQTX68xeIQjJU4UXv9XTpNfyHh98qYW7dmupDKDBD4W4hy8fAFUW9yz2G5lnmgFhOzQ6sDYL6wji6W5gGNLvOU5ffxwU6OMrbL7\/yTvoJIUk22bE\/bvQYzY93S3lBg\/KIpj0KOhOM+5WclZMwZ60jWXXCSiz4QhvXxiYFZJFu7upLD0PucOSzzd\/Vl9M25s5k34XQHWy0wwTYLTPZUjckvEumvWVPmBF5tlN2HOG6RraVGtDJO4HNnVEylpsrEQt12vrfj+0IrDh7oNdNoHUpjRgAP7+7qoLaYTP\/6m\/rEqWMQpoPzq8lxaJvV932zssl\/NOFkmjUNExrrzRs\/H3bwmQUNty1DMTCa93eXO7ApF\/+Itft\/mdsx+ZIR83\/ALdss0\/mXZHSZfEtGN04FymI5C9X0cxDWZfqtjwfYkm1fav60+Hblc9aoxMQRvtx0SoZilD8uNI7L76Cvwzpg8v3UoXvtJIE9zsRpkH9NFej0NU951mhKamRP0BJpJWyMJEwPeJgnBhXzLGyO1wh7vHW++zM96sBhukR4CnCTTwU60g9\/iVTFFaEcACHmBEv+9HaSmVJk3JuaSUCyGEVA2XrbfiJfp7QffopI\/r\/ux\/HWebVYfbWo+R3Axu2T6ttsjAT1mTukx2e\/PcQMutJ0DF2v+ltbRYS\/4eHveV8BUYk7ajN3ks0j07RZZxzbhSaeaBTdcbjk5mtAi3h+8Oql1URYKGd\/x\/OyzIngjJp+5YOX7BmPy0MmY2+ngWbuNhAzB1a5PebRi9n3fa1XhrWsgCJdbHVn+45yqzpa2hMGRz1PBEFTMEA6nhgDZ52V63MNeEUWfhyFjnnOsS+tr4s4n\/DTR1zeOjTEw8rWa\/PxYy1OxL8lSrUXUf0ei23nuAe7ha6KlI8mweTQSWHYm7D2ct99\/OIiRI2uY\/28VW3KK3rVcXNceTTTMFFpIeFkZFEPu5qpHaY99EI\/jwkY7Ro82LDVB9P7PgWXsGriwxRo7vaHSJVbqvvz0jRdCt8WUMGR3tGMQitKbtQ8r3DscRkiIRu0FOzy6n2bJhqgEQPIERUH4p7ecU9W4HbcIx+aAACYRJgnFv7q\/56wKOwNjJPZ4KxQs7tuZJ\/F1+mvAARfQ61vdaFBjRDwCglzcOwiaGuDq3i34QgQVsqq\/xepKyNVqYEhDTZhZDK8kCoH\/zVx87\/dvLXuuNsMNboQfbZIqVnbTiB7tbHyD9P\/WvuIL0Ef3u17URYKlT+Qo1QeXYhOqjAVo1\/MoPRux4Uuh0ujxDaJS6XuEl2EeQyf9kyAAFgOp69+vGUCmajcJjVp+PqYidlI7ZmU7SAMzEMlBNcSQ6fP2PTtlq6i\/2Ga1HxxY5ocMwj2Nhndehs50PxSlZ94go\/2NW32dy8QfuqOEqJJNUtKq+njmSG6328srJ\/ae2NfZlai+LkPLonLRmsLmGTR4eErGXqeu7+gKXlzSJ24I7J3zmty04jnza+9X6R01EpZrviJwLOTnDgV49AkAs8kpaBvkvT1lB+6X8qM6FRTWLNGyC\/qAlf+QHO\/wRr5MyVPGUlgdnP92Noe7F+8QviZ3KeTSKJxB7w3c3OnMOcuKZgm78FWh8dsKha5QEODUiIlEQkkka2Ol8HEnKx\/T3q8+nwQBfpDdJUOZRFine3o8hx4g5NkxbGT7D67en7BU3tduxDqff24Bc+m5hMbn51kJs\/jAkDWudDoeHZimsThlEP56XjZAhqY6WeCs4O0ON\/P8zmvMr314pwjwLvifBtJkQ0F0oT4z2LIbiXM27p8JxrERxw0aI1Psg1yLGLTofajlAnJ7Vqmpi4yDtnM+J0n63IVrRNKT8jWI76ImF7mrl4DV2fs3eQvqB+KhQMVbLbmdH1Baj9RZ7a5x3x+vkm3RcLptERjOJJn4XILdqB3zDeWI8wze9hoOiq\/6F0MWgk9bpwneUq0cU2vidtn5gBIG9SzY2V8n6MXBmpa\/rQLgRbR5PkfU9VVrf0hXRLwx2U1tMOW1j9P6PEt1aOa\/dYZWs6ZcgEfJOv+9moqfAshwHxJg5iuVv6hdPBxwZ25H9\/+bdwXe2Htu857n96Bt\/gvupKuOkeip2ghyHmq0hD6xn0Xe0D\/2tfBfqYKfopIVW0axZykX6VKqCl8ePAhxwwtZhkf9+JtLDZ10ESO+V2drT+TbRPhpj3UL4FzDpjs4XHTMixmSe+GfNN\/\/qa8+DrNH0d63HOIAWDs\/V7P1qe5oD0zoRIBds+ucuooUBPBUHBTdhp\/+7d8X0SHWb3CfL1la9cXUZtXvp7AgEB2ZevJepeowq0VmWzm\/nfhhH2v5DEUH\/jGhQqNALFYzb0xX9YtGrwMeYbPuDzw75N1im62HrLmRyFtwqcp3g4dYkLrNKpfT41fam\/wWF1X9tL3aVSqOe4fy8LLtiFfjaaQAd2uesIrN8+UuqxMEd87IEERdMnLa2FQT2ritdAZRtz6TbhNlJf92UxMatL8GbGuNm3R1ufnUrQH5j0OuixGVUDXqTYm5BTYc01XVMTEyL0wpyL66uxJPVQw65vxKlpWHGK63QOYBw3c4nScULIIubmCEKF\/kYASM+ySWHtKDC+JkQEgnPRsKiq938OmEY1cIcgCsoJlvpP7PYOQAuvvxrKuHPb\/KdaXri9nIO30wQG23tlZOUEnRV9Rc0kQK46ciwSjTkeFX3IKH6k7H+SVk7zOyU2ub\/SI\/xQ58dhexcsUP8MdnOi9c5NWeetfBqMKCqBsOv8nQn89xM1YxwC\/3a\/W0Olttltr47mK3OzAg8hd2iT7VV++SC5G9a7vqrp9obRQsjhMaIribGDPqDI2ZKQxWFWg0hXtuynuGdRHfNLZMkJTlRO2hWTL4Eu8wv15igxIddctW0l7UzISqO+5S3Vp0JMrFSoSkEhafRxQ9gVuKnoGZRiHv4yRV0NQzs70xww52VYVI08arSnra6DQ3qN5SfthBRphWH02\/kkvwzm3zSadrr1gU4dEEDuOfU2Fo9eN50yiTW+AJ95i9a+kvtwktrAM1fZUqq7kgORGMOpvz\/LB8+B1sUk+CHDFy1PmjhD4CL1CFRzQWPZtlJU5kjOXp61Ubx6ZXl7+qxfVllZKWShV2txD9jH6ZLm+bKWR8zL\/DX\/S9GgU80YD9XBI5K5ygZ+MCKFUbR9vU0px5BttcUk0oC+ucRNNpb\/x7AYuPRFWknKeqvHc5P73BG5WiVkkL+PwHmi0VcMiog6WpGfCr9O6wPxmOazplCHG\/hW8fwKwuh9nibCyDZqOD5sZu41Jm3yQoH8AP+KtjfOgE6UxkBjv8TcnA34ef0k74d7wBnoYJTDkeNkRk2gJbr49\/fdrosTYdqKR+UNCpaWjTojdHwuW6IFJxI6rG85oq5S1a7KPv9ggMcB4RORUTbPeh8k70mXvmn0j4TFANB9oDAJ3C4CYlRqAr2ZqwvAjp2jezJ05EUdpv9km8RQ7OcCH71sNZXHQu3U01\/8UyDx3ZanNWOqLEiX6znVbhVEEAPGoIMO8GSeV7bhxazgzyqGyLOnOPxE95iYe06r8pqokzhezMsd7czIn67qanEKgqKWWQqjImKOzBuTOnG40kroureqrgc1I986jCCqJakeMCPWI9xgYnfAUEqg8V\/7jTiiFVynGd11XKYpwFuv6Aep6S8nVxs4DhJExNHt9b78TDZ5aTWkNfD7KRCWwzJBbe68cvLYS0oghCZCqadc5UhFxAWvf\/ZOW0FqnPQIpkHXXT2ZqZAF3dYVot6XwggPa0LyXmKofBjh1YPqUCLL1VO3XgHt3xlT\/38JekpVxrjs7IOtx9utsbXV3SKQAslwzhJD9ZxohbDjSllGNMtDqQJuRN3YeCj+Uv5HaYSGnJXpBD8WisgF\/QlY3Io9V8igf+R+yigYHN3aK9ffrRNs\/HexfU+0G\/6cN12sxd\/oXaRfVlJIrEL4TKIybwDH+q2DfYgiYByjpvPae7mLw4Tx5oNZlmdyC0CiVr\/dGl3aQQmMiPcsVRKRve7GCO9r\/\/7EZBf++dr0OkGYpIsfBMdtS8TB\/HsefQDDbelgMBWd5YbBItIEb3GbftEyVlz2snVihr4nTWHrR8AcNj5ozkGMkinlaqu9RjTF8J\/Asaz6GXf1MsaSaqjTMuByA6\/EmKNA3o2nLthOBOxo3v6BTLSIuW5N5SOXvNtc+vXrkVPPouhx9QQrPmf\/dVGmyiMjg8FMS+smZDscrQbIiKhpOcMd8DnvHmq9GzVitHZniucl4+5XCtb9Iohs8k\/48XivVHRz+qnkLH5IwSsjMsSYyHE\/1oG+yg\/RbCkGj56E2bm4uhT2PtRbV39b\/iWADIHhsRNBBtguoCces0Bkq4jS0oqP0XieA611XlWi8UU5okOCbP\/1mnkJaKe2rVrbi6pmRA6YkWseqiYZM2HEWVcvQmPuZ6eG6gPqu9s2PIqwORT5sBfup0E\/8WzeYRcevEw9aFGRJDttqY0gucljNEkJqw2Oz3RA9n3z2EwXGJ9v3rEke9Hd16K57J3Ib696a1IEehn4mMLRFinfJcUxNLwLgPgnwg4s1g\/hYz5+N0KPay7iQT1lmIVeESnvc\/aKj9LY\/dfblNI\/DAZrO0Tg+nSKWde41SONG\/iUQ8qLoiZFOjjmmQ0rNAlu6EFblp+sDfierg6nXD0kMwvjYC7+RhLPneDB7505CHySHLlLra8fbHCVANB\/x2KYq4nwWuufJbJ6kU\/NuxY79yknZAa1njXafpVxOwjIA8iBd03VutciS0bZxDBd39E40cYOWCPCr36yWUwWFwetlD\/9mwq\/AOSmBhQJR5S\/6bzTvCnQlMEbfgK8fYYHuarGf3IMN79Sxnnpcya8pXQr\/k9GpeM8PLbKdZ6pWyhfrYSYBAXBPY3LDqk4wLEQXAws+ynFXglPrcOWisra77NrX9Wvv0XLA+k+xMsiGUP2kCx+simMi2+2TeM78u1BU8Fo1uEpkX8X5FcIoEnkNDMjidGtb8a40FeWT5UEjgpcCw3mStfcBGUuRZkibaIUgZR\/Fsg0PxQgWGPhjhXvhkje43PTDBSIP2EdBp9hAeCZ7ILVJOoSUHs+00tbi1IQg43AIFYiu466VkBp\/Ol2WkY+kTYeYED2u90TFYQlxz9DgSXaCEQdJwB+rAQzHSVVvC2X3dYVJ5T3Gq4Y54N+xoHzNsRStq8r\/5s4+pocP1f8w2\/IDHyBHrnCEoNw8QH3N3BcGyNFmEpbetCxzumISLMEPCvA3YzU51iLoAjg94PgoxyqeTdSZu3GnVHGVYf90YHBSrrkrp+8in763DBpJg+EIy2jIIUCZfAcNtrd\/MiKn52gwidIOF3EIp+7FwA\/EGNZ\/josueKCg6\/IB93DW4JnT81HkPkUHXVpKKy+TqlFP7jyVSxXR8a7UvN1OjYN8f54WfBTbxiox9vjrWMJ+SnCz\/og8t78XgoDwTaFwu8vFplc8Rt2F4qYmlOppur62AFwxnW51NtjD3b3erjPYC4tlTF7wMy3v6z6l4X2Znl3qEoSyzJLha3DeDbTeL8JO\/YNxGL\/DOWaA8a1F4c33dTKLEC4niC0DoFO\/\/k5D9IXyh1WgbRtG\/+mvM++413SF7WtavIkNmmwr\/9lwevaW5\/9lW\/eXe8lC4hYzuFMz+wORVI4FxZ9z9kYWw38bVCv\/9wCflgAFr4jPpTg4XTHwF0UEelinRs414mEazFgclhxVrmH4PEnO2sb38xL1yCnqDnFb2KiZtkpDnXispCqXx38IvG0kcZjmjVAl\/v0QMBzB2DiHdzQ8+jJxPcDnIaG0rpauva17LHVy7+hE3RvZOhOJRShz9DVwGTyHOXU0MznhpNniYdPx+IzvcqcSYe\/912+Y9uSayC6+ML1pY+H6byCmAKXArVSKnduE4IRgN26V962Bsm8Bvmw+7Wd42gAW5Fq7jcBdamrpx7\/vY2xjhbf90g0ts3BvCdh6VLzd6aPeFMbS0iSpeSjIXBGrVX+7JeuhVQSB1Oj5mMY3qimOy1o4UdKWYPtX7Ipp39Ok5CVBH2cQr9IqZ2KVscbZ32deH80ADM8uL0A+jJmxBY1bl\/Bzihq4Je9\/wANaRvBeUEQfxl7uUpDxlhIU4MRa0mq1gFylZHoQ6LPJogUEfYFGLLTdGt8HZziDPnjEtbZk9XEDOwvlKUGPuoCIGrwMJZkh5vH8VlHfAanzbg602tXsa2AV2t80L42W+Khm845Hy0I\/9en3JPh49rLY7tpmtiT89jrA0YhrTvJWi5YxBFzgJ4UsTSsjrFLGwSYXiDT+LcsMDus9CLkohAITQkgEL0DlQvYxbPNOwQT\/sTJMyOb4AAAAA=\",\r\n        \"lespetitescantines\": \"lespetitescantinesmarseille\",\r\n        \/\/ Les Petits D\u00e9brouillards\r\n        \"lespetitsdebrouillards\": \"data:image\/webp;base64,UklGRgAWAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSDkNAAABwIf+\/ysn1j6nTEubZGY0mdjLxp7oNsvqs+pmlazdbZGNBpOQa73VRYOxkMUQUQwRg8HFEBQluMWLGILeKhKyBLdIbnNvExFJCDIcDofDj8OPzx\/nzCSTvc7TnyciJgD\/7\/\/\/G7VWXHmp\/fz59l2xzCRU9ZjJfzkzAynsJoVwhNshD2iZRrCXtmRyx+KBDEO\/SpupW1yQUajradMthZAejvxKySRCv5aOS5KkdFHw9QxCLaNDkpJ\/vnDqG0oP2ZpJfChtklI+ygYCj6Qk6bA3g1AahCGEMMVKAKih8OhTMga1qIPeEdd7tD16kTkq5ccbGhuPNxz3A6pyjQ5JWx7JIFL3zaRDkoKTMxMl529SkhQ8jYw0q+AbOiQdORzKTGJ9FCSlw0nIRIOhbylIOpLLkYkqwd9SkJS0piMTVbW9tElKZ3gKMlItLIUkKTgFmalaZyds2za4DRmq8g09\/xjIVLBsU8WGDes3TwKUDOXfhbGSl15a8FpJ5MWkt3Rc7Oi48OkyYPPli5dSbu+an6SDnm0vJm2YnnuBZo56TZJTwhTCFI0vJuVbYQthiJ3AIWGIlA1neZIzFKTg0ReT+mdK0uZOoIGCKdtckeSsV8OL7SPg6OiWJznndeQFNShsIQzxIXBEmCJlQyRr8zqcJn99Tb3+gymur64PIFC3uy4H2fXV9bGUDHrWAOc56teSnPb6aZoiJHN+MBtIxhAjWYCpJJendPTc2XPnWs6XAe+fbTqV8skzNTNmzZw5a9bMO3RIh1emz5o5a\/6MWQVjlG8n7KwfzFp72C5AlGQh4vaQvTiV9J7kGH86VrSZ7REKBZIFQqFRhULBFAKhkNcSmsyHkpWVpaCICXr4Q6G0fWybwi29pHBbdnOa5t0j5dW5Lv8JSfaVJllz69aeCb0kzxd6FF8WZP87gNb9aymd+zXBzkudeT\/pd6R82IXsS4L8amGaGig4hg5b0lNF70OA71tKkizzaiOFoGU75FwAM0lJkl\/oKikp2Bkmmd9Lh5LP8xL0nJ2exrFqTkMuymmS\/yANvoWf0nAuJMgRxeOEY9HTdp75MIU2+Q9Bgy3KN0NSin98nOuYTrT5sSPlsyttNI12SVJNy3EppDuZdAueSkNIGbKcAyp8F6UltCZHDiC0tWqHVxNtObx2QulDWtyBforbWVCqhMlCbKDBQkRoMwvTmOCreOrIawi\/V1WlpOUEBcfQ4Sdp0F+lxY2LXl\/4Pi1OrWNCfrY4gKRNNJ2XAIQSQnaFbJsn579etvSJ4I9QToMFHjkoYoIvo5MJcWu+itR1XU1d089LD5lMep1MR7m06SkMURUy6O7MSsZhBQCOkN+voaSnY4k7WE2DkSTFTPA1RJ6TpLzkS6n1bw\/\/nOofB0c2B0JB9006pOBJfyjo9qXjbSYh+VMEdw+RDoe10ewnn2yTSUg+w5ujehnIa3hMSt7zpXKOo14E7ysumzuRXpevjBZXTZk1ecbisjI\/AKXkskzw9SSWnAtAe+TIzyIUrJw8e+rMstKyiVg7FgBevuckOD+Vs9KWKVtySZLrXjXjIKhJU55Uoe\/57a9vqPUNjf8G3bGdvUls6SyfvODXNHkYd4S4H4Ky\/\/c9\/XkoH1UZftLQWIGJwhAptVIwZZuLk3R7VadLGCIH79EkB0nyQ3SRbLslEyxKIuiQpO0YQcyiSd5JkGwFVosRUYCIMEQ24mJYvIK7JNu\/lSZjqbSNrizJDa9daYqQzIHSRO8qIGxTkmQnkknSTjjkPACb6Za8pgIVJKOIkczHZJIrEBmhQ5JtSPWsbdgpJ8SiZFJIacmqNIXa29r9ABbdIzmwDAAiFx3yyUdKMj5Z8oAUn02Ge2KbRT7dBAAl7efas5Dd3tpegHD72fYpQOy6SQ5tVVLq4aiXJ7lFkpI705RqaF6OAm+1NKoiaRM5AqVgrh\/J9ZJsFWnUS4o0pKy89faKVamueLtuUpKukadDQ49Hto+blEuu+pD8hOM8VfGvWfXUlHGj+XSvubfJj126rgNtJMeHpusKFF1XoOq6mi5F1zWMe9+zhP0mAKWH5NAeAFNtw\/DhrVu3WpTxkD\/8zChFn2034JBtt6ary7Zvjr9s2twBAJf41U4\/AEyj4+gYt1NJvo4E2YkjZHu6+sme8ReSpnzPFZgD72nSFuMo59CBQxPwRMp2HJbyQrp+L+XtcRVaWVsVyXYsvu\/KXVW9Mc+DjqUV7q5dGnBF48UortMBTPio9v2IS43HJwBQ40VxID8S1fCYvIjDpEfW6toPoojF4wFkx4t1X3UuoM6vq39D7SVd0d21G3PHQ4UkyftCuHxtdDepLmFdJUnzAwCPyCbShxkDdF8OAm+SDAOTSWoRkq\/jWUpr6e4S5Fb8kfz0AV9CwSOSfPhUsgfKQbor0ldPYdJt80P47lOQFPxCxXTadJuS9cBdYVGMYDJpkY7FQR3lYlgUAEXCFGpMDInS1NbQMUlJJyHKMSBMCrsw9JyGJEmHd1BHm3QEC9MVp+lwoHuE0mYlTtGQv1h7ggY7XJJD3YN0LOaijw6ZyB9wbA52mzTZjLU0mA\/EKahGmWBZCh3IpS3Y321R2lyHB3RITr9Mm0PddygddmvPTZ6e\/Yw8m679NOUWBf7rNLlBlRaXAVhPi3oRDfmpDqVGGrIG\/XQeFvlfpclDKgK90qK+NC0HHJPrgeBtaXqNvBqYJg15WQfmS8ErQWE4F4K65guk6y55GwBC0uKa2bT52\/tf3fut\/dyaEqUlswHggeQt3CO3AfuleKICKKIhpy\/xKh6LVgySdwAgQsODnwHltGQOALSSd9BAi+xYqiDdg2SnS3smubpU2kw+PUpHaK4e8gvXO8Ae8iIABGmyvIwGC4CisTiHJ+RpVw5Nr5tAIx1Hc20ke6C30P2kMF13yR5XNk2umU1h7ty5u+qddeXrsopoyWzXQ8lbrg3AQSmeqgCKaMjpS2gwB5g0Fq0YJO+6JtBIoUJazHVddwG+jY9osj9d+2lyi4JAtzS5QZWWUwIgWjJ7EabQkJ\/qUGppsAb9Hgto8LiOYK+0qC+TCS4B2qUzug7slSbXA8FemUqMBjt9wEravKEtfXWhigM0ZXaa4jQdDnQnKG1W4hQNHq1oJtmBabQlh7oH6VhOLvo81L9Ji0+7bZr8BBHaZPfvKTkWhTQc9ndblHYKuEubie77FA6vBEl+VnxJWiNqmlBPYdKdEJXw3acgafG6gukiQbfpcDNwV4gKABHSJB2LgzpwnZZN0rGFGhNDYhGeCnEeh4RoBQ5TmKSkkxDlGBDiCwB5wzQdkjTFbTTwOUmbHyDtFZIkW78n3wN8bXQ3qcAsUhwnSfMDAI\/I9wAgOkD35SAA\/TOS7COpFZB8HSZ5A83kdUDZRneXILfij2QPAIQfkOSdq+Q30M\/QXY1xGFpZu2MCwsVxDQDyX69dnwsAWrw4H8W7apcGACAajwdcwMQdtSsj8J5cUz9NmRiPA4XxuA958XgYOfHiMABkra79IIpYPB5AdjwecgETP6otUXzxeARAeFPthjz8p+zJ\/f9C1u49WILw7ur6ILC0aa8P5Tq0Vcr7Bw9WYuF05JRB2XxiK7D1wMEdHv6tgG8pgGjdnm2KUnXwJ9ug1p4q8cj+2ckpwDxyBmbu37GnTKk+8JO1rjn1exZB2QbkbARC+6s\/mqEvA95Qgrt37c1Jz8C8CX8MLDkXXNOL1dfy1\/WhaS1WHFEeT4hGcJzKtMs40px7sQIPJ0ULPDawEAU3AWw6Ez1eqTyORgvwi5rg3TwA2p\/nxx75sh6EY\/\/ICc36xxu5gUeRWK7rbM20X7+KdqCaOdBmzOGUvFvAb\/XZXcHX7qfnxvTo98GS9nnbWtCdA1wJh67iUi4G3lg+Fbs\/qyk6gvsqoCq9a5ZPdSmny44j7wKA1YfyTu5SHixbXoz5NysmKwDKTgIqqsuB7ZXAFQ2B\/qUrClzH45jQBQ3qL+uqATRuR6wN6NQmX5m3\/mJ6bp44uBCLr9VRw80Q0DYJbYvOQru\/uKwIDZP2XqvGb1UoQbVnaVkRdp\/zxR7vsdSQa0VP\/Q5F6y8tiyEYLu\/Nnt42a24D4FfqVwHrdgHdQQT6Fi7JVU58gqPTEbsGoIS9gyq2ngaiF4Br2qTbVQym554KYM0u1LRh64Xggj4VZVwE3wO\/L4DT0xWeQvNPgifq0J\/l88MXVFrfDDe87+\/LDmPzFgD+Bz6fHzdWaZ\/N08KK8sdJOcPZ4W9yw4MR4F4QWf0+nw\/hAvzstZwvVgLo3p7TvmIio3k+\/ftofBClH2NTV3oqNQBTl0Bp9GPD2cYsQDusQjna0tKIFTGUroN68MwBBb84fabRF81Xf6QgVKmfazrlmzIfgHKipeUI\/G0XN2lAYdG8Sx3zgXltZ2YCqNQQ+KT5TDUA9So71gLQa4FIRWnT4eZVmNdxfjIKVwAfZ6dlfGqfwFPvuqDAMxejPT4Vqh7o7AwFQsD1LKiAqgOaHwiqAHJaT2tQARVjqMCtKD+o\/\/f\/\/0EYAFZQOCCgCAAA8CoAnQEqoACgAD5JIo5FIqIhFCk83CgEhLK3cLiYfIA+Z\/3X5AEV\/K+fXmA+Bvqe203mA\/Zn1i\/Qt6AH7b9Yj+2\/sAeXJ7IX9t\/6f7Le1pWL+lcRPoPyTHLSbHgc6mUpJlK\/bv+d53fR7z9Kh3Su9ID9gCzYXWWxsBLwJv2n3r+eNSb1HwHC7PHXX9LYtBOzeFbiXqlxv\/B2lzpdob6fKjBJTQoJvmKh1xUb4pswoCbPTcCEcVMMPO8Qe6aNbYfYJNiXuydFNqTR4pAB4vhLmlMo8vXJvDn0mCg+CAfOraFSHp\/Yeapz4g4jzqJa9cKHWBtgJcYE5l\/fCpFxwaW6WjDGNWWA4WbcpE0vd9NkVs\/dn2c9tK3BUNwB3hpZrPeU9cl9Qgraea5Sz4BiqN\/3NH2gaG\/4dCU9nt\/OU6eM\/wXaGyxX\/VLgkP2v9YcO+l6+B\/bQ0DaqNbLmev6WxsBKsAD+\/54IAAFN7tyI7JEUEgCu9+1lBzwviAhpPtzs2ZreTIFfKENf\/c6f4UX\/fSf5P3p6jF5c38nf7TM9yfidyicGbILiIgCjLDk9MmrKfA5skzlt2KkNKUhodYyJxkixcOC82YR7qTdSslxnM9oekIgty7g\/tMt+8f0pB1EpCtdsiiwbS9ulK+QlN\/zBl7FzXdYwlpX6qP9PbOdeYOFQO03ffGLSJ82r\/yWRVfEpv\/5G0TrtfcuybntuiOmeFVAeiAqOlq0G3UdekX2RQUodwmdNCoJfLbLoI\/Okx+rrOTENoxMyaM4kP2H1HOnl+TnMLAJBnEu30y+tD03KJ0q3GycaKVXWOe277QYuqBOg7YL2y9ZG+PF5jMh3J984QZ0UReRmK77FWpL6h+mOXeH+0DTCqClGYoZB30u2fnni8fL4yhRW3LuAchRI+ws7Sb3owz2T9Xs+nYeyH0vRl1O6027srzBLIx8nElCMUtA+RNYXtBcB3baCoO\/ebnCjLWIf8T2TFL1UuEC0\/QeWr2B8evOe6bmQXMC\/v\/y5It\/Xe1M\/E6DXk\/rOyFZOqGkJeOPhbqYPRuorVBSmC+70lxAYkdDYHxqtpI1QblfuhHn47vpVSeJRKSiejRdLrtVfpFixDxk8ZnZ0bK4Z9MTyLjSLyMi5QNF4GUm7MDswWqqJXB49BCY0\/2wZlHqr8lVQt+Fh1j3V5h3WRP7rxMIp3MUxuzr9+lxvCT9DNHwQiBRNODYciI3pIVmvjSekp3d8CL48eJAZ6zqgm3hWfEVzqgYt+ZwYVoHOvjkAmGH7Wig\/lDJSwP0RYLOl8NyCiTA03Z2XHwwP5BpMFgyRmwEZ6iIqarXy39WOZTaq5c1XAkftbJ3RA81GhZ2\/iVd0est5GJC+h0dOXzN\/poe8tL1UkjVIJb9tprHt50hFmfODZYFO5nGV4o5aZsEuu0XdjRjI5EbQPJg15YagMZzWYB734LuNaKihqFwggCMyQy7BwyU04J3h41OUFgi5UfQJe6uwU8Hae7MiicAJFYgSSOzNsK6B15vr0AIO6y2Oo3aphq6DRRAka+xcHkv1hNGOvVA6WZDEYIJ+JoHI\/l2cbRazI7KgILs7mRGIgmg4WBa00M+Fq8ty9Kh5T7Gymh8kJsIbCU1Zq7LKjn7TpJoHrUqnXn7LD0S9iz+9f1\/f4\/+tn\/\/DbWe7mrKmwgScUf\/UZhCVVxodHOplrAgk+Wz8vzs2r2gEOWDi+l20+iEGL9ruBKl5MBA67\/rqKdhd\/tbZ95qTb849uZt5ZoAcYSScWMuL8zgexP3KdsBmoh1g4MoRX5DNgwQ7es1evA0Gqe+hFaIitDMenDdEJsxFt9v7mv9FJBZ+fqPCxtlYwPWkvCVQZm2Vkfd32WjNmLM2IemYPbuSyy9nW3ENLZh4hbMca9+W7YtwcczwWp3XVXU3gnJAwUqngk\/vFClWKpOrTBX0P1PxPxq0izWTPiGKpNb4M+u7o\/jaonWPq95NxdKSrPERIMgtTYSEOeSal0RHgrgTncaAsS3DnUJ+XsNBIhbEKp3BL3G90VHGzctRqSwYZWdEoMWrXUYsbM++bDBi1itKWtYQ8toCqkjluhrsyywUGy5ekcVQpLN84ZIOPtTUtpzMAvXw3L6AcWOqcSUVD4FTLfCS0MJwYaSaONgo8rlkL4ulRQpgxSs0lRXwJt2FJZG5fQSYsckssMSijqQModVZz6XYTSuFGrhTYJ2jMddx5oByJMlsyU\/HsnfENeBR9phOIVtRMObNjcgjGLzaEXG0BB\/ZIL\/WjBP\/sQ2QinGKST43ZQ3Kp\/Lmpg+1OZtqP73qqQwTzaNzEnl72EH7EQJMCirYbeF5QkIAKkpxEqMOqYl68KSbMw5NQuZe+l8Im9Au2aVvyjN6Dy6zKlqe+WI9BwBXwmGV7vlFv8Q4yEeYLgpOq2NrnqSYaW2\/1yFUCBH\/Ldq6b1isWCOzVjJmVPgshfeVK21h7zxRG7Vjq2LWkFW9f1rR7xllMXECRcEFHF5OoqTFUyWvwmmYTMZyu9xWGnyN7TzFUQCHgdoM\/ERHFguobsLDUln4rf+wP3f814fP+sdKXnxOUwwljHNDjY\/Ysf3nbXIShnjuvqGZ5lDBN0DYdPWvXN6VbpkEhTqXVyIXlMBEVa+U9e3vL3w0kfjCRgC\/Kfat8SS+0EcBs7qnJ9vd7BBTO9pNsVqUNP6jPHjryQPmFc\/vW7OSEbz0D5y94lpVp4ySRRdfwfkhVdQIP6EnmPWt48vsUEjPujIUadP8YaIYh62WwZ5wxjrj0SBUZIciugJPVx6cJttvxZHHIculi4hkvlhRtdZa8Am\/OcT9BsnFbda\/Ur\/Y4mUPCcPPcqHLzSCDk\/E9IcIlMqxe7yBufmEuM2QemQafnEx6eieA0O1DkMJd1Ehjc3aOT74ddUfmInlXfGDJ0R9EXn3GuQIshcQm70VIZFPHHREAc2dbgAAAAAAA\",\r\n        \"lespetitsdebrouillardspaca\": \"lespetitsdebrouillards\",\r\n        \/\/ Lieux Publics\r\n        \"lieuxpublics\": \"data:image\/webp;base64,UklGRroIAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSCgDAAABoMb8\/yFJ+lV19eBs27f2nm3btm3jlW3bfmf7+mwbM7OVSqVS+eeff375nLq6L1v5ne8iYgLkn9\/pNGSgW8S\/Qd8xQKZ0MwOOb4hEkVUKVC+eK5barRGP9y8cuEzTLlCW8OISlvEeOGmZZZZZoGGUX\/3ik08+2avPLKFwAKcnZkFVgcNjuxAG8jQ7Za7ELlq6LH\/xjLUTswCFg0cXigzjA3DSijPbBXyJe3OSJYJzoVr+FbCMiERW8EXRQZnC0DipyXro3Jchf3+LGRO7aAhZ\/ui5w2MTKPDD628OKWg7CCmwfWIBLYGzxy1zWe5x2snuTRNkwEZRvC+QV8pAN2qYIAVWEjkcSCuluHwlMUEGrCfxL7JKGbB2ZIYdksYyZ79AqUHbaAEcs+jsVti3R5LZj1ClCG0IwNv33GSFw\/tFZGOFtELbP0oO6RNJtlfIOlDvrXBwr0iyQxd8WVjhkD6RxrZdAP733z+KJNt3IXhnhYN7RZo7dsEXuRUO7ROJNusCYIUj+kVkA4XUKgf2StS3m0JeQYHsi0+ssGszXmjb23HqtI064OI1Jllhk6ixtwvkSvuQAZsmYoEUWEXkaCCtlBLKlcQMa4jsA2SVMnyxdmSCAjh09nlOyT1lB7BT0wIEoHX5VW8GJVAlBXZPTNBlDZn\/4oUVY7MEF7JPDl56OjGDqmo1l8Nnk6Qm68EXRaiWfwdMFJHICp0XA0qxnNRkHYUA3Lr\/\/HYpHXw0qS+2StC8\/OrRA\/ulNmsnDGVDQxeOmUnMogVwaFOsEkoPcHJsFg2hBI7utUZwzjnv8hy4ao\/d9xjfNEdZ\/HJgAL5bNkmSRKxR0T94wHRStzXzwvjpInMokL7dar32VOu11\/ZuSv1OdVoC1680bNjIYcOGDZtVDJIB+zalxqe+FNgpskwG7JNY5+A+kSiyzAE9UuP1sH\/z\/xZtaZ6tE5EosswmkXTfACnommKZDHSz2DBagp47adiwUSOGVVx6qWHDFuoxAgr88Gar9dprrYrPPdNqXTW\/Fbqfj7TOZ0tbwhedDvxQFA8taongOk2HnHvUFJ2XBTyz2L\/1\/eM3VlA4IGwFAADQIACdASqgAKAAPkkgjkUioiESGT3gKASEsbd5T3KwOvEEph53LHKvzAfPfPjeYDyp\/7B7G\/JN64D0Gv2I62L9rf2Asw38T3APk36H+Q+cX+7v3zwcvD3a03gzkP9B\/yGjQ8oZHt5+P+p5rfpX2Dv1e3VUwRBQJMj382IT+qlbfK1rtC2+K+eMyzycBV6OwFqSTHMLnD2r6DsSWnkFoLtcAGcOES2F0vwFP1nT6Wrgg9deanKVxZXXzm296J\/3ViB58hCL1AyJ66fuVqBwupN\/uG3naF0Q9OzhwiXD748tBS+QnrF3ceNIjU0XPi+yhs0CYrPfzl+KuWudZuyGOpFHR6v0ukDjLhvL00UmM6gAAP7+BtNX\/ohQ9Tf\/kV76A3roAtbg19YC6Gb7tVW3vwVF\/8YvQJ2qOluh4su1z2LvU34f0smF0P+4Bhns1j0Fv1SyMhnUSyXubnxAs0KBAv6zcIpiMFraWCeLZ2w24ca1YY6zezVfzWVoH4NxZ+y6AAsb7XpWk4pko4uAX2kffstf9L\/FcM6q87L3EuQWsZXVa3chGIlakkyBfF2VgGNBh\/6\/pqsllefZJLC9DZ49bpHXRY4PVC4vXcb3pmDNCh1vuOx2hAT4psscdZZeeG3YgzxAVeqDDPpXvdBKfblh2O0wM6XYt0SyWxecZreO+q1Y3pzWkg9Ok7jdB8rv7d9EJvY\/BifrHue0A1reH5azOY+mHYJmXm6KVhqxj+JHDDJo1ZenncZdU8qjIs4TuxqsOYY\/B\/O7Y\/i8ZzcTryqmawKF4OMsC8JC4ySDchuiYgpAi0yOMufe28JHavvQxy8g\/z7oIPR8et4\/en63SUXiYAuhvUcLJ9FFxwWoaW3V3Ppq7V23dSiY5iXNYULuktBxTemeWMHgb\/PD\/rvw+uS6hf6lXkqGwYDf8YHPDzfDw\/8\/\/5F1tBNe8NvPZQe3ovT+5iHyjm7A9eOR4ZmC\/ZByInLhDUGTkDENmyuSqOiakp8xmLe6DFnE5\/g1BRQxMGMyDLUIhdep6\/jwEffIC7xwn0Dvr2gw81g\/7BlS\/70iRqf+JUfQlP98RzsLtpx7+9mZLZywujuv0JoGMNlp9H0x2kE\/CQpjIpbxL2YPZDmC+BwAfTewl\/oXIeCiMfZrwWaSWA+3JNyxfHHLrN1U9HvathlkyjpnwE++WqYkivD7i5JYAW3wNyxW9xzCBk5OWUMLAjzxbGTksdOac1N3AkprQmLzcfzcdFeXdPatHai\/wPtZFMYVGcPWYx1hFIWyYs7YkG62E3nuFzep6x317GPKJvm8Ob\/TuCIDLBR\/N9z9Av+05X9Rf19Go1PgIJQ9c32tK30iaiTLnuWRb5UcLUpiBpnt7Vy5TRC3gPp4Pc+NVfNLvMpiB6ODcsSLViebyrmv9G5khgc8lIIG\/h5+BojhRBdR2Wf\/eeUqyfLklvsocaQN+f4kf7oWwpxRkO8NxkkYOBbscpPa5r+f+n27DICe\/8BuOBe\/2Vh\/dr6U\/\/8Y98YMvizT3Fh3uDv3vYMVuMGt3gQJAeBNgAM73kUmiGu6GP4\/9yTRevIL4P4aHTswiD\/e2vYsARAi8SdO3x+DEXjD9f\/t1\/QZVP7HW+bBWweBqs1qUwkqo2T9yS9r\/9mcr7URhyiKrCy1R7qvPwChn9NWjBhJwKc1qY55jZ55pQwmAwlZl4wW3qsdnTOogwCn2SbV2c3+qVL4bP\/yr+9KMgYEY5WIzOrZDjhqX4RJ2nK+YENyFNFLRhE0JHV1FRrj2DF8XyiqdQrz2UD\/ZMj9XEo5F9RP4Nvf4\/3G5Npm+Dm7rHr1rJhGyB9dn6mlsK1vLro5qRM4JfcwHo\/baskAAA==\",\r\n        \/\/ Ligue Ens. 13\r\n        \"ligueens13\": \"data:image\/webp;base64,UklGRsgUAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSEAKAAABoIfs\/yyl+vx+c87MnNmdpRl1nJstXhvL9pr2vUhbtM3bzoa2YpG2UOilSIqkSJLCKOKG4l0LSbqLRHEXRaIQCTFEQkQMCREZhuFw+P7h6Gw2\/96ImAD87\/\/\/6cunJziuN8UJDTs6rBQkMvYmmeSFiQvbPUhEwYkJi\/WZTCMsicrmPgoZEBITU12AQveyhGRND43+JxJQfc0wjbEqYpPUY1AtOiDBscAUA9qM8WF5B5EymlIUsTO2MWhfym7cpL0seq7L44F0d5DGLK+M2EX7GKS\/yY2MbSmIfurVcWDBeyJlTMH0iJXaAMcsW4hXlALXcgug8a0WpAV6Zp8jgbuytIBx6XJHKGm2OekawGa440l9pZ9IobEZImeHZ\/XMazNCpeFcdx6Sfh2gZ48\/r1df7PdBX9U7EwvbiXryR6TXTs+5Xwz904XbSuPH+4Vo2B9GvxA5G1QMUqlqlDt0FIU0vK8sQNs0t2k1jM9ohrb\/S7a5qd8FiBczmfZqEQoWQChJihshZc1DIsWvjOVfRAOm+Tm1o1UoBeIdOsRVlUqupkJZCWOd4vXQm2WZD5R8IKkWwLRiNKSabEfXxg0AwZzbRop\/DA+iYMfRUzMyHwmj3KCd+tuKDzhGueoKWgnLG5r5baCrrbuHDgG2ZwBcZ9n7DRtzd0yMJwDapR00LIeSCyNXYpXumRi\/PeJP2Y3r8l5WEXxomvgvbdFcD17RrR2Ss1KoJVtQmyTAfB\/At6dYvU4UOeJev48oECLoi9wlm\/EpsKRBBUh\/kwe3lCNYTNQyEKC9OEXdrz8TzWV1dD+\/+BAHVEU+iC+O4NB3AIs\/sMlt5B8RcEVulxn7y0+vKOGA+naHA4U9axjz1XeuKZfzYK6ivsPFHV4Yz\/iJrnEAxmsXinbvgLb0yoXD4wBgeUh+IhrQRk5gUNnsXAAAtZ5BNKjAzEmalCe0FBAtElPpOcD1ZoOAkVqngQmAMMFuGBegvUEBog7EtunuvXOvqMuOr6OmhmR6GmPi2X76eNWNr6X+b1k+EoVMTSSg0psMAsbKM3z6cQxuZWhOFMoccE0JL3zjJ1obP8y50xYt7JaTolBix5yc6HGPV4of8QF5wpLStGEIr1kUSu3wLmdg327N9QDGRRaTL98D8Iy8LTMFwL0pP4ODe2bqgG\/y5ukd87V8WYY4b8ssBrCZW3KSAfN8q3nFFhsmbVotANybn+MErKsM5uV5yZAOfJKLU\/hYTPML6+8LYSAF0bBB1IAdGibqnY\/F9PPfRB8mYn0vEaViRRcR5UP3guZjZgdRU8PQNIk67hIN7wS\/FCRq82JDsP4tUVMhERUxfo6I2qZiF9X8S\/RW5yMlQD9IobhzZWmDTHQIMVxqAwAvtVhNb7u4b4jq9r+ho9Z6KjCnC0m9nenams8W8Q3NYH\/QT\/MqqW+GRNSzv5E6+AJq1E0YbmU5RD9cHCIqaggO88VUZ3J1\/cu2KfTgWCttNuzqVM64OABN+pbrzUSk+P82xl658veyme8oyTfwJRmX5Gu2B3RveTKWUvOm7Me0ir9WMrX+\/hUwfezzSsrnHMxVWg03gn\/MXBQk84bgF0n1Qb7CfJ9JVaXUL178kbSblHYbuyafhfQnucHMM\/bd7yEiJRCU6RJi77bS3fL2WaN5ub9Fi+\/onmC9MEz9zuVyV\/O7hlczVa9pmkR9XogfP3slanfARq36B3L3m\/eNT60b5VagmRbC06sIj+T2lpZfX6jzqEqNY1TMzK8pVbP5jkJEwYCskKx0emLqbIh9cluGzupli4caJeQFbmmgTr6v5MwKflwuWaeJmheBacKn4cu2TdQzXQq2WjEh0CwdolepevsUtt7fBPwdmI\/J3QFeSo2TJGcG8gPXNSgKnoLlz8BUPqeOBgMyjVToBoupq44Run+pIqcoD8upXYf99MB+sGRrCy1WV1PthqPfMekd+XCEaIi6v2TpqN8OF33WmHro8tbjecijTqCbliFDIdHURd9vOLcI++mhBqVUxoRGejlXKlb8FFJWerMQ0+v0I5BS2tbfnotJ1WdFzH60zXCkp\/\/lcQnGojcDnUeZWPxgEsQNt4rXtw5kiY8v62F8VK5CetmHgdYVyKouAS7UTIS9okrApLIPfS0LMOfRNgHL630mPulOx03zIRpFoWoeWyqEZgaLxMDVIsC1AlRmix4jdRY9A0QNA3fY9dMGu1yQRIBpRQDMaNECXC0CooaBqTUAuNGiBbhWAFR6psvyOFItpu8pEEJR+mZjvJ5GN58SVXLEunXVvoIDtztJCSHTPT5umW40NT8qNCMOl9MYFaV\/NsZvpjWoEZ\/ftMjBUaiKj2Px7BsIKCNkpW8mEtNiCoagcsT03PVfyTX5lpSPikwkU3eGMW\/N+jA3rHVG7uqLxq\/js6ZdwiEKEAXpGM9vetYY5h8NvsiBfTU5Mv2yIlObFZxFEAmh+SUFA8FdiFeBhVLx2FOrhUiLqjD4RRqi57q4mSWEypRijqUXVlfciGTF9epJYWAn+QcXIh6dqcmqifsd3JYqMPvhydyYrANzqlQOl8WgZTqPmpnVam3kgEnNFOE7QjhLia7yeFDRq+uZX14UTGwfPJT0tvmc8+ePL9ROmm\/+gQqP7PWU0bG0prKD26IB3RslEAw34KdKFcLNprYUxKPQsZS5fsqG\/daUSs\/NDRAenq4SN7bthf2myr5gfsH6\/Utudv08Lypw+ylsmZ6ICNsrb0Z8BEr0ae1lOlfduvue+ic2qZZ28Lu\/PjKk1OoNbu\/xU0dWHGiUo4SSsGSqVSP8Oc+k+OCvGRw\/71\/nrn5+wFJ5eoP97KGCmSd31jlt5ZKgtxS25nvW+S5FSz8UhkIvNYigdyHi1ACwCW4nNzkAq9vODdygVUNgzACmhn46h56r1GHwSaowUDc2hRq0iCTn8aLScIzk4Bxc4lCBg6u1HBoJANQiGAdnANcIYBwC0p\/MgsAYh1orhlijjImeiBhXg+9ruW33XLydeWyv9h7tT33qeO1eTYPZ83o7k4Ed1OrMrEy\/ngZeSD97V16yt\/Pyriti7bnZl1Ko+WoIR3A0heiJgHGVdWa\/t\/cSuV5O2bcuq8Kd7H6Y227dVG7ExodZAnB6a25hRmnquTSIOSWFB7Lrcp+YGlOaHDXDhcfS\/jYgpOAfRSGq4hhnBureez8RzXnnPbbJe8PMrK9qZNvaYJFKOB5c7XFeyd941Ht16oW5k6duop90q3trHlueuxom3H5KRzx0UwyB4VAKyZc5xtvuuX1SZU+n+uLJhlXOhzevZTwyPXblVMzUzp1bedJlPPy4eoOrprwixZnmqy71LD6o\/0Ndf+qF+YL35aG0t2kTQw2EUMhfyDDubjw8CTBxiAUnNcgusws+jU+btPeM23jwpAZwFPpUmFGeDiDF7ZpumqpegUlXJmG6zjZJs+\/gqlBtIWhwIxLVoRCfpyNhHR7x3omEVfAT0XMtEldrgILlDAlsljy4CgltQbMLie1WAf\/7\/3\/WAlZQOCBiCgAAcDAAnQEqoACgAD5JJI9FIqIhErpc3CgEhKbt1fxZqD0Pa\/Nosv+T\/C3AdFT65vz\/3EfNP+w\/qh7gPMA\/TzxAPcL5g\/59\/fP2496H0Tf4j1Cf1u9Z7\/fewV\/Yf9l7AH7D+nF+zPwd\/2\/\/m\/tl8Cn7O5ob\/Nu03\/WdHh8Mzc8ndAZG+yHeLct\/Zb6L5gXsf8574j\/F9APrp0Kf47wN6AH85\/ynqs\/2f7Q+dD6p9gj9fPTD9j\/o2ft2vXP5UMUOFqWMDi9AQvymmKXS5EeriyzQKmrX+JVg31MlILQWpF2UUjQ73PwsGJ58EmYgl6kTKRQaVEmpnIV01h8fySEbdDEy7umBjdHEtbCIDCaoTPBR3WbPhf9LGv0LCTjZeItVEd8Y6RtpWk28WYHRoWW3RSOQy3zDikTKkexSmScojBOubNrMOSD3T7yERHCSV0eJJzMvyvNs2TVDAor6kusIQEm6\/Fn8SdeBYgS7hnudWrBd6unkgAQd+1GfB6xZGUzA9qOg2pYwOL0BC\/KhigsAAP7+0BwAAAErlTiIwq2wtHxjMwOXbbwwiO\/kkMFA0uIdEgF4t6vJmM0CAztW1leRPggSLEzTyn0YwNtH+SdPKv8AzfyBMMdkyZqigyex+AqgfUp9TqDgEfeL4YMPigGCP6tHzM1PMzH3YduVHe6roi1dArYwn4833bPzXKz4zHl1D1ciWRHyogArM7twQb6lJYcCfTMCMvNC1PcZG1suUNWExXHimt7Ujz7pLPwb7wVhOKXXRcvSVQLUbqvH\/qEeOiYJ3u7EfNemTobFX9671ag8rfxVxTcN3QezfAqn\/+ZQd9qssinmFmnNk7cTuBEr4Jp3nUzF8kgjx8+tmiT8TuIleqvppAM1mNLAL6r\/I3uUg3dj\/4Mb\/BAdMxKciqf\/+ozr1fjr98aaOGfzF+4dH3JOX4yK2aOvu13p8o2vOFK8rPlQwQvw1I4E1qzkIPCjBi8E98BPBlKVTEqWW0thh6PxP8X7qGB2HFgVmQBKHikQtJsT2b1mZe32QwFAzWVZDUl0KwsrcKZFJXe+8KeMjPGsgaeBwnIKLl+XBA0zyK7VVLRjInJWtXNvYRYgIS9RkUN\/sUFMhb57Z+m2wguAiF4D2577+GvY3A82oYMYP9qkmWBq5YRUkxCUuGtyjQxAxgxnFJlhW\/8tB23hvyHib+suDgBOZ6xHW7+gwU1yg4ycMmps76BFIjI+UdDJ\/kyMBpeU8FPF5xIo5NAq52wY4wV6u2IWlEGxPi9efgiNo7nr6MMoO97SrSnmBdqjmsLaGBPJtT6sOSpkSa6amGclGPvayWfyh35KjVWw5Xhoy57ubapFWC\/tzYKsuR1RLJqSzkFKShSOcsQ7JbMYzmVWnN243yj+6ifcJNrWUE7HsESyUFMkzz3CWI+aLXKGg4SIFOGO3maBhOjM1lgYb4tujxeyOpvV6BVOp6W9QwMMPdFPReBWT6wYn06jE1HzffW+qHywc+4N2Gjvd\/r2RvTDh7MwUAF7vH48w4UIdF713Mm2eZ\/DC\/YVAoAixvTOyd9z8FseB5NkZZ06Z9KV6YI8oNVkb2tR\/9NHOFKRtcJFKXbKdFBpRr1IopbMqmH07tPEcb3G8VGyoRy8cSSTjX9qGQVTvDrMw3b8zNxRFUYcWOQC24DNb39HVPYugWwwCiflHB46V0HaxOhdrtJbmfBMxKdKHwzJiuKK0WUz6NWZ6H+RD6Yps\/cApRmHbKYaq3x2JS\/AxGkLcbnK5KUjsnRIwgBiibqdTT8XyVAUwF9qt6lCdyPSiOLto1qfRmPxntRzcH1dfNRHd+t0qOMveOu9R0a5unrrjyuQTJ4xfVz+t9yPbf7DM\/83F0ikg1Zw4SMjtsg8yKkn7VEQbO\/hxIJ3kuaGp42U13bP5ocb+2u0qHakeChv\/ojTkCf4EkeiJMulm2J5U6PoRqNyR4lC58fBAF062Uq\/+RS68y5irgzC4\/AQ5JsD7IjTOfr9K0NJtAK7faYmIA8BBLo29fm5g6yW9ZDOy32g29GjHkkl6Rz3RJehUC1MZhyDfE5AT0obr5Xhohaz1Yz84TNg\/qGHu00ShT5rbcIPZvEv\/XH3qHi2c4F+vnkaY+UCscI\/X3fSN12FTQ7iR6tG6fllMdA\/JPFR8pGCLiRxAI5swz+OSucXx884EwEu\/x35j0gsIaecBbFzfOCRyBuGqMd1d6DK5DLJiTmCB7VFpWA\/bM0FjDMcJOA2Ubew5eRMioTbFd8QXDOQ2yJZcetYRa\/9Azr1yewlpla+ZsjhDf8Ffb244a6UkOQk1JK5bxQdpKl10OHanIY3\/j78dZ\/p8fHR3N+o+fRD3q+IhYzrt7r2uEbHZQVttXr6+8l\/cduvo7afeX0Y93bLCsf49yZmj1bs3EMlEwT+I7gqP6CMzLxCuohXu6F2N+E0\/bTuuFlA2xF8ZGGT4nwCUe13DFjpCNbRCx5OCS9DiHjPRljiFnZqI9Y86pFdsBE2EsS8JGgpIi7egQVaKxn+b59qAbHzthJz\/8S\/iFIo6Q4SBLunNOccgtHTWAViXoFGmT9ENYsXml+r4ccn\/kvaEjbF1zAHmn9ODjvtUGrAWn93SF2Ea\/9IKW7KN98BbOGdGIEDRVaq7fx5d8yP99es0+TnYKzhATxNjW1PvhaUHLqneRpGucAUsb7eoA01uu23PjTh+tkYKg1DD7ZVdz1eXjy2NGAS\/\/8dd1q7Pyal0WsIyNiOBakOpnFNQN7+pLVuWFSw+gTtY9KFUajmoIQPtP5P\/+eh\/\/10MJtDCIoNPTvQ\/M\/OduL3B1QaAzE3mveX0rU3wZgw7ntVeFwhruX\/d8FJJDe36PekMZjlU03W\/KWXH34peTzaakprXK34Fc6+o4LRvbjJfYFtMhZ\/AHn6k97WhPKi7t+2i3PzWt3bTlEP0EB0R0+CHWDOkG4BFch9EZSYRdXD\/byqCtGKO+e1utTnY+D6uV2VsLdHtBg7Kavw+YY+Rbv+T1e4q31x7Heb\/luF9mN8GpJl5aoFzYFmt7Wyi4nsnZmTqtAn5jR8fS5YgeZ3fajrBxGl+RiYFQLF1FfcFpecrEOUYpXH9Nw6XdCjiiLReRTNKPQAwNe65Twoa4Swzg4qjR6h3hUtGYLDWI3MtxZU\/bqf5mZDvyKEyATEBkxV1vMDzWqREtXaW2awdqleughN4S6BbvyxwN3HriMsNewgnADTmW5SM3BXBQF7hl7Pmc7hf\/P3P+deTbV+mVO6AEG3z44eT\/u38zLvoDl\/x\/FOyqCpq4Wa0YTw8NvK8cylq0uUruKysI4jKsnuXQsPlkM+JlrHvVdAYmx36x9Mo6tWPwubvI\/MFoSF9FZuMGgzJSgvCe47Ha7\/xsFA6YYWBbsqvqZDdX6y7e68K7jOGHkX7642HpQD34PxnGVVbUjxmR8jzzlj2fiqjtcNPW5THu5jVkZ8QQaO1RMTvZ1oNSsJcnci2GzXz69mHcvqP5IaiBIwHni3ITxcQQn+25Ypm4XafZEQDt01\/pj7k3\/+G74tsayUsILCxCAqwAAAAAAA\",\r\n        \"liguedelenseignement13\": \"ligueens13\",\r\n        \"liguedelenseignementdesbouchesdurhone\": \"ligueens13\",\r\n        \/\/ Ligue Sud FF Voile\r\n        \"liguesudffvoile\": \"data:image\/webp;base64,UklGRkoWAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSBkIAAABsMbsn+JG0t+OHSeT4cwsaXeYMsvMzMzMjFlmZmZmPmZmvhxfVivePeaxoihqlVqlUumv90N3dVfbOn87XURMgPzf\/\/8r\/KyTZvT3NLX74Hdbb93DyFydAI7tYRZ6480kx\/QuS0mAlGPX7VUaDzgHeFjRo8ipGIA0YUWPsslfnQKosuGMnkR+jM9AymO9yQyCOvnxip5EbCC7vBepowU8S3sQ2QEb0oQVPcjAB1YDaMryrlg8Uo8wr0BtKDNfRGqtoZFVK0dmFaiPrFMfFJFZq4eK1UaWFJFdMCEUlnaD8tnjc7a\/5PzRY0SkOXqFH71wdEOR1qXnP\/\/3IZl1yeRlc+WTv\/wjwD9HmzlbjL4On\/vd6HYz23w0Kq3R80ezl46+DpeuW+DAQqhhZbn1LhldVM3JSZupTO1zAFvIwAfkr5SPgck59TU4JsYAY4xRpmU2A4wCL+3AGnhsbQqalORnDwa2axci9Tf2lWml4BZU0f9lte5XmV21ndqP138QrPVpmipHqZ1w+0sfCRac9wDJ1ICIbI6zDnU+VRRnfzzPTtp8BxZ4oZkjX8UVQT3NEseSWFi\/gp1IlPcyO2HIqpLrONZgOFhOVwVVwtNEBFWCCsp355OSrx7U2mcCGxgthNd6ifPU4y0L423vjfL9zK4ZNR5I\/z015eBJh+FAASWofDB9UETkHQJtJfPqrAK5asdm5skaiiuPlBjEgCZuONYMtXiamc1JCNdExn\/T+gLecLh8VATrz5AseZZ57wDeNTbH5ijjP1QFw8JAu4xODBRbixRIOTTWEKG+h53L8xxf32Un\/ex2f0YNWw8nnrCmel3O7vi8wXFAmUvQcuCOGDB+vUik3FFsKAfHwZHmZSb7RWSYFLBASrOPoOe7E2gB4Jqca\/KUTxuw7C1pgYv6xlQxLAj8vYwy\/kh\/gdqn0Yw6G+lhNNU9RUT+7AimtOaaSbxRyio\/\/M0tku1HNZOv+vFCG3BcsXdqUfPO3AAxpxchX\/W9Zpw98Si7b7zxlmT1SgXP0RZAyXrNaMZx1X27D2fe8I58R1GlYMIpEjwPXyZ1jSIuj5T74pD1AC5Di7jOU\/DBzMOEgi6DZtSjhvHBUMPbMsrNBUQDasfXi9J2AKmZmMSYxHww\/VteIVVS8\/exCZtn4C1jMs6k52fuS3NSY96achlQSxsDakH5qCHhWZTCcUmoFSJhyyjgvHPewTMAC+RCEu+cd3CL\/J3UO+eULxy0DnjnnEt4MPMljHPOAbM9zjvnXMrWMw2pA6vJJf1SsPlJ58v49IcDge\/iA9adW48xciO51y6sjaxcOdKQ7V4i96SRYVlwLNl\/jtSlObIJuXY4s\/Y+ZPdYtbqx5Aby9xKZuwf8\/XiYL8VXkpQhYd\/AFwpgmRFDpJUrBWutXMltZZuS28ptSn4rK7mtfMm2Wg1p9UvJrTGl1Lw9Pe+zhdxwnP+GW0QgZTin8TOvIaCX0NmZge\/i6FEYziwlodv6hw5s\/7UddU377VDf9GlXtv\/ejrmm\/ZNoMDEkIgu86bbBj6nw4EDzl1SZ2TyK52ciMo+ku2rXvYPxsRTJb\/wM43wkx0hmm0ifFqm9rr67ngQlutLIuerveKI7+jLL26nG+JLIF1C6avAj46iiLzPtZ1iqGMjItdgYnxT5ne+uGe+opwqXcwhTVOFbOTfHUPfndRat8ZR0HbYBU4RTUz4hM\/u9VEOpKT\/JQM6NMUjZ\/wxsGTpsf29DjphfrYnIdAyV\/rhRhe50mJZQnu+sJp6gctA2221Tcstt6iIil6kPeI7eZrttSm65bUOqYOcjKGG1v8NcKNXdJHKtQUGbNiR+rD2OK8WczqoRMqwfa4fBv4cM20mHgbUU9+7L\/Z21Y6GlsWQ1WmDzzitt\/aX1zkrQAiuivYcvsFPX4ZndWWOhlDMl+mdDmv5x7W7TtL2RdPZ4yPH40lXLS6+T89WQ443Fq5aXXbpy3Y6y3CAd\/rtQ5N\/kfCkUe+3O8g932PHWEfam9JR5NbO3sYS9KZ2Yb0knqab1DrsVWyCi543MWaQFIipjHeX9VdLhV1X1w8xJVf2moyz1Tru5GvxQ5tSqvtFB6ti51mGbeEOliWSPqKrRQXbNrtLpm1ERNRFpvepcFdDXOV4\/kI7fohrLliIiK0ioUovcUpljnc5bQVKgvxZRsou8CXiGajElfEVVyjvS8fVLvA1pTWLPJynQkCoHPud9Jd5+odl5Q1gK1mPVn1cfcs1KdiKhUqMHSucPupDyUbQmnhD9lWzqTSWp+WW9C4YIpQxL7IYLeX29XslWVKJwiHRhs9Ba0foIJawrla6uxHLfaunGT6IhNy9aq4BhRSWtcafxnH5JutMSTlkv2q\/QkF9SyQws8dOpA7rk7yHnn21GGy\/C6kqaGs97kC79ZyhhN4n+m5D1d9UreQaNZeGQWV3S39aA4dBojfc0kHKyVEp0x7cOlW79BKnmGw6MdgdG842eVc2\/I6nlOune+xzBKX94tOs8BS+sph3HwxXb9XfPF\/jxWD7sEO1EfjiW\/\/2xgyu5Ql0Mz8dXzv9JX\/fse7gEDzxY4u8qnTn4E+8jOH7ZlF7xIBJKa8pP+qVXnPV2quWgfY30jEMYyipv3duU3vFC9SW8ei6TXpKyFibTq3qJ6baYpnxhd6lJL\/lLfAFVuFV6zc8WSeE760iveYi15NuUiTk16TmPxmQUB+fOld5z2jesBwU4Z4H0optgIFX94JP90pM2cGgKK6VXbaDAiQukh7G8NEP+7\/\/\/UQ0AVlA4IAoOAAAQOwCdASqgAKAAPkkij0UioiETawzoKASEpu3Twpre+E\/KX2QK7\/bPxFvtVW+WZyx\/tv7P+QHwO\/2fsh\/O\/sB\/p702vML+1Pqxf5\/1O\/rv+ufwAfzb+6f+7sJf2z9gT9wPTb9lf9t\/3I9qPNXf5L2tf5bxD8VXrX2t5hj1P3X\/UcMfqh9QL1t5iMHLlv8z6B3tz9D\/1Phs6i\/fL2AP5b\/L\/9T6pf4v\/R+NP9l\/zfsAfxv+kf6n8y\/8d9J38d\/zf8b+W\/tc\/Mf7n\/yP8Z+TP2C\/yf+gf8H+5\/kx80Psg\/a72OP1rYIeJdQQ8S6gh4l1BDwzaRzJ6lNM78k+el\/Dvc0YAEmvIfgqp6B\/F0QdsLOzIJls57v2e4Hf1cYqAtcAS45l0viCLIOnFgZnmEwzc6XrZsxDz3SX\/mavflxh\/2Er+NXRszk2qyTn3Nvenh0AHTFVWzkD9iQIzXXmMcRU+kBepLlkRllkv0AavRJpCxgo8Ek0P3TVcJFkzXIWVOxp5WuylmKcbviKp\/3HMUgpi7oolj6XGKSjkpfA60h\/hZgR3AqnciwbVL9Y71bbSp0cBGZGikinABsT9dZdw2wupvD+Dtbv\/7QTtiJDgPUilnuc9xaCP\/N7bLxIrx9xIpP7iQ2AAP7+0BwAEN5uLJDk4e88Zv5QzoNa0Bkm18bYdx3C1ybSu0Gtiagzx6sQ8PKmsKZCWBeHXhY+yDKkUvEGbOtw0Hp9v6pUTb01AyDn4ZkLpFZpw2zAvnp5d7PWYzaWTWiuQ7WZl3TCnboKteIAfTHiKSFNGpgl5J0KmDB27o9z5tZ7mHG9I3qS5Cq4HbLcp5FqapLeVfSmrPCvJliwwbdMHFrkPrRhxFF9u6zQZhS9OzQk7NP72twehcJFh9GxpRTA2oyz+CswlqrzcQ76xm3Q\/5j9AdcjB78cibOz\/2ddYkNmn4uKruOIaWcPXQ5YvYA4FgN\/M+sZF9jXGe+T90Q25CvK\/2icVMc3J8b8wsP98U9slmP07jjGLPiDaFgHra3JnDlfGAR99AW3milY3LM97QnZmD3KeawDNhInD6cIutWPNAtbzemMdsCTcfYKSeR5p3SseZjrBwCX4fryJYQ8FlBZgvT+AsWImX2YPPrjefHidIsJcHjqII+GXeRJD7HbfXaO7nscUfQRrnaFTBUNGaGt02\/gpWgs4IGN8ZMD3DuHenfMAts7PPeLug8k64BlOITEDKOhDtB\/C23mts5uoASg6zdc5MliG0f9V7a3pZAcQtHH8NMywJDVBY4FAPo6v\/uNdhW2nbK8IPz\/wgmkzC+WkWW1Q4jnanLHkrPmgc3owOH3PtPbXy38tdUWfDB5YiksdOXenyqeKvISHRuy\/\/i8sykE5vGumn6rTs4eEb0ky4jIZ3TnQZVAGF5ogNbEWMnQvU\/m1oN1pPu+5peGXmIhJvB1EvvdwJ\/3YIjizbdp4MNy0KO2JqlpfgjeW1aY7LngGVkfvN\/\/2hh8LXrsuwbogcnpX5j0HuWp6bz7azf0vgtKWG5r2QeEryR7+hOWyqwE2qNNDhplUMZPLYc0KqxpKsMhpnRqpj0e4+WAx921vP0u7YydVTD1YmVd9cl\/eL1jOyW+f9dPDVyGjHLHDco0bYgpzPdmvlTprVxr\/8I0c3702oesvBVd9uMW2rbcrhn3mUwTv6ZTt+eXiVHO\/oRrOki39QyZZIEMWvuqk3m\/UY6HTgO95W\/Dr1LAbRLXn59EFmoYNnriSm84j6CJlbxqpL\/D+UZlsDDU0tAU5TFQp+5+JcvIeZmvPucVfa994+PZYHhtHc5rVBnGlLfrLGBqM9nN2NinWssMnab0TbxUWmUPCdtSVt0bWLWhvLFodOGvfHv93KwdRMGXbCtBHmSVmk1MnZ+XX0xdfoVZ2DrLVEjFGQYDPo1OLJasJDzi\/H08JidDf\/tue\/OD\/dL9LCZjKKaAcyTvd5y+qMkZc\/DJ5miEWsRNK8Bucek5UIqzMjzloD3sMufG87GtQu5nbxnnoQz9cFEhRyYCo9HHULcj1GyKcEA2V9oe+ksjEYTk7E9nNgQR50\/iT784ZlYYjw\/VwhyjbHHAJeFR2Qh47a2889Yfq\/UaxwbIK1RtCpKddSV9uTRql05x\/FvTtZZiPTGqzfYlB38A4jtI\/dPAk21zxIji00QIrz41VQq44jWZhKJGGtJ+a+2xNx\/xSmvBDF9iZIZOMq7acPuIawCtGrhTLB\/5Wc753B\/8gvc379fWjv4c9UU+WPOoBEKxdp7k5\/p0s\/PU4fQ0oKtz8YofUYJAVkTJVF+Oy0mCmX5YgBsnroJTdT\/bUb5JgWqUlzRhQSZv1P1WSOfyhqSXTnkRsLg\/\/AnlpaLZwFrLuhLMyou6rum4vUdsOTV+s961FfDBLtmEHqSI3JOX2LG+q75RxwRxlGk85+vogTb4ndX77puhcD+rWw4UvJ4uvA980jVOgxCNmL94Ug67DFE6edky15P6w+30WkAurU2WtFYtC567htvrUlxBmR6Mul9L3PwsPibFItikmzzCG6eKGHn51prdkRpPBf93paFXRrRyEI9LxpRP8DV0zv9+w12ymTC91ZPyIJF+esFlWcl4+qOAZBLSv4\/Cc\/jIKpiur6cqDvupqmH5J\/e31uHBVwiiJAEFxhr7RsKa6ksj58BpJGVbI3ZccUQ73epyBn8wCCvbGA17l\/HnoRTHV8oFWgVRDo+U3ZX2BY7qAqfDZaS3Yhw2DDJnagTLGsnou9o3vdiyDZXd3LubP3ZBM3PzYcauf70n2uR+V9cvzd4RSYy0I0e0xvTt7vnXfTWX+0t8+gdToAk5cGqaxIDSgV3ROscprKyLIVa9cedCQbBbXoGPMLfq2H4r\/rpG7fmI+ZjBdyFsFgzPF++gOWhyApIbzyNhsTP0BBg+ItaxZWH8CmIx\/18iUa945KuMUC7SBn4BT+rCiVsPCU+zqjTaWoUwHMRpGPCi8z0TfM\/jeGyPm1A41DOFxLw7DvaaSuLIUb5cc0D\/B+2pYAxGTQNsgswfdyf5v+fJRK0XBqDACtEUjECvdwcFLn9jcgvVedjuKCvJ8dRkk94n8wnjndQRchoLCyOZEANffqIQjDxa4x5C8+lcR+oiP5miVcp2sNF7ov5tqGHEm8M\/0DCwCbXIUGOIAXGx39co8EycOqrIV35lCF8ItH8auXMMIPaee\/UL8PAIBScw9xRYSL5WKuZXntq2ZMP568Ek8MpGD3z307ZvUNMWwUjo8X5A4U8YoEKgo\/4hEdprUTmlz9IVGz\/j5xPwHPw3BPwdrzgZxWbEhZAgxzL4WvoUuJp1\/qOMCRGg1TeVrDWbCn7WgzIOg24r5mJ4SYWFjxzjmMjtaTYBDmTn4ARrXu5JygnJOIkkwCyuSDRzAbJKzZ40Hlh7Zg3OBV9CdD5dQ6LxT8\/24PDhckQZ0LD37Jtlvwj8Z80aaK8lVKBbSQeePZgQD5cYdE0TDfH7jKYSXyIO6pvb5Kgn0zcWz\/6uwseAVJ3i+Me+IZLF8UpsSWggO33U7MsRRaY95O5ttxWZagNDPpTM8ln2p5488HyHwYrmLqvE80T+2e+rFpXkebNgDILbsMcyAkY2gx2b9OW3R7U3cw5mAJELNviy0YnN4sDrTiVMO+pnzDQmb2J3grWEsl4RkFquSGDJYhfr7pFosFDjRiTwpaUPQx54F1gxaqbiD5ZYHvF99gxLOngvfu96lAlTkG2ze+jFX2NxV4gOZIeST+F7vExOgI4WTAnFpyEg\/iQyFJE2n1e39Tqrq8mKdQ3WJ5wRRUr3qBORkRKbis9nYvGydiuYjjgh\/bFhvUMDs0zGpOBvEFDCCQCDpcuhr8Ixj4uKxOUdi7SaoRiqAcp0zeXlOQ6QBm0bv3rIrMbLvLdnq1GQs+lN0UaTpBqLU+we4lFaAPvrv7IiJrM4\/y0gG\/jqwO9xfhOaQ3l24PVESKvLDPwgSF5vdWE3oFNv7plkqznWwPJFagbA1BNO08TAcAAPkhFphBDY0KBRE9fz2r+BW\/\/3M3\/9jJf\/9gz2uPr8D\/X9PLSfxI9e6bMesL5qM9pc0s1aeOK3fqzUSnwZilCHtQeENUohMf558VrqAySmfPO8H747FLoTl2IJauNUcYF3mdYfMeR0sRAscs\/\/rrwARonz2YZzsweouKhD2kh6NCYZYMNt0nSuignbSmywuwXbcdsuUjyRfetcQjQIxccF4i900OSPeFY5sN98VZ2AzyvGCLC5R15HTuw6LL+ZQVPwzar9A7yWw0FZEUmqddhdieakjujNvbGweqoTV1BjSWToPimiCF\/5pg4VeQ581W2EIfLe0ZnlCCSdFQaPxRy88c85vWOY6uDYwbb6LBJDdFoIW47zO2GmvXcK+lTGi14\/rC6eVSiKxuOf22RJkOE\/Rq5P176knU8XWTUMcoIwo1U\/67UmbfBO3ZiL7TnS\/Wk6u6WOfM+ocbG5Vg2+A8GAOwx+7ySZEWvzel4QgE4p0gD0yH\/nZEXztk6n\/9HsRG7GpYbhhHs9+DyLltf\/4Q5K462cTPaykpDdyjf8Qu6TlF\/\/pbobhaw7695Vom\/+ltUAAAAMvxirAF6ej5eJQTQ+dRhFHQ8KKKuHml7CayjB9Bnpnl6MSeSWisEzQx9bv5rwMHWSW9iSIA0DFYynM5I8FMNUPAgO69r7+qQ3kEnzEjQBt1\/UZSL30veRCI9InmzputBkA8W8cLbmUozrRSnw9iTpZZfpamrmLBw77mZAaCn\/H1q0WvnMhOgbMGFgOirYOAX6cmvAB8ZUBJxFvZ\/ksAAAAAAAAAA=\",\r\n        \"liguesuddevoile\": \"liguesudffvoile\",\r\n        \/\/ MISSION LOCALE OUEST PROVENCE\r\n        \"missionlocaleouestprovence\": \"data:image\/webp;base64,UklGRngkAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSMcTAAAB8If8\/2Sn\/f\/dn3POya6JiWk0pjE2rrE1Lu3LdN8tr+57la1UpVVaWbBSX1S0pFSUiuUllUpLpbS0FIMooohSSiUERSQiQUQJIYRDSAjhMByGYRiG2x8zZ8nx6Pv9Wf6IiAnQ\/y\/fGFOCh83DxroHiclcArwwMPXe45tHjzLuEJ1OUV9xj1GyC9eGzs7Ozn2dA+BAzb3F8wzC9jWKnLHpQ1ybhnuJxP5Rdr2ibNv7xx1a7h1ixxj+TDl6uEHXPUPJr\/QTe7EyuxmzbffqknuFegZ48qPXrOwkHA7dK1T43kqVK+faIPjsHqGkb5Tlyif22Iq7lUkOJZO3knOjyhjhKRmdjOdguSnW342M+ZuASIepJhSM8KTyWQqr7kLmB1zfj\/KAKqmMCVh79zEHGQN+\/unn774eAM9nssrdfFnwRqLsLmO+Zpjvd2+TZJU17h4m5VAdY5hn8mEW+jw192HNaFRdQ8N9DYm7gdnDEOsV2fScNM+DtN+6x2ZJPsS4t07SIpYQ7mpdaIpdfDcjfPJ4IkKS0dwVI77\/h1z7QGUeXkzbrJEa5lxgeCiZHAG+LHb1DHpb1B7PFL5E0LObEebkAd\/d9+rsmlswTHhsJMlerTFFy+xRvZP0G5UrePz9dJA8lshpUzrNjkTFywza1Da3NL8HjPPVLBXvGapkiMU5TR4Pgo\/LvBHOx7LaUykIrlSotteG6u2SNLVmP2P8p4ip5J9R722Tk4AtVeDQY2VTpm8dbsbVPOz488qONoQkc5gUxaycJMuUewIntSW2mhQ3TVTbldLXeqDfkhYySJVKldH8jNddzIJhHs+DcILN0mrSjI78WX5ai31sIH1JakgNBa3K+iugmPnDPJyX4CdL0gay9IDbktTEIPVZxfUH40WsgpHgDZNbOa69WpI2ncsEl89JMqX1DPuPmWx2TzpEqoglTrnjtOcGdCr6y6NH\/sDj8qEf45JU8Wmll0r3VmYjnSpqKneH\/EbpAZPdMJzIIMlimEeUeRYD1Cky3hjxW3Gbxoi3yWizlVWLG\/Qty6acEZ6XyVB+aISpUZWvh6ZdIVnMEjvsFF8o+wUE9CrbUkZ4RtGJl7WA1PYoqaFe+hWbYqZmRm12Z9VO2k+25i3epordNp0Zan+qru1xWFLUtA07zYEdGebscH2PHuVNiQ16jGEORcla0Yu9QMW8Yb35irQLR7ZJqj98myDw\/PTG\/MWnqoNUmmMHQnV7uxnDFDWrXOYrHM+FU2dP94MLEPBh3qRpN9LgwalTZ07fApsZKv4HybF0HJfVeasfSzP9K3yinaBJf1zvvXbt0rWOYjXzer3068B4atRlbGhwmoxMGod3czFRU1wvOX6fdHF8dHx0dGhkuTkwRnRqbJZkipAVLan+E8lS5GVsXs1qhQ7cF6pmhJeU9brAA7g2AOBRedgqNqUdRJcnpIT0cUtoUl03Y6zI5hlF1uCRXpyhUtJqxuk+efqoSk4fPzVOmipNKibTNR\/SqdR4atzBr+lYXV6pyNObrB5GeC6nKbje4dmKjn0n612GOWOUcW7KT9P4RTH5sI2xcSLdEYdua\/byKElWN0M8F5HuTz8ZqmecJ1VeFyWpjn66LGW5wHVtKorI3CZS0P3B6g9WfgD2GFfKlNF6ud50keQlSWXA65KacOiQZi3KYtUof8SV9QJIU0QgxcCTNQovfZG0zdpMsdVrVrZ3McybkvVUx3PVSxP1uKNLlLXZzOh3Jcpxzs1gcHHxuJr2uu9T5sdwnD8bMkjm+RJzljEUPevjwVEbZV9OPy8q5xQki8bKtM8FmUxa7IzyWBaSXm4\/7Y9mUPUtuD8H43r7ynKbOsaZonGb4FzL18oyTsq+OD2rGiuRJJNKJlcre6vH5l3lcZC\/isY5uK6KbNRKknlZSYqVZJHHhoB1+RgqIhdIWsq+ilQwdOPmjcy3em\/FFP3mo5JO3+i7kW3fJZe1Rc1cZEhZlx4uI03OiQyRt8jVYVU+BovHN2mS2UmVfsq\/4ebQkF0yJ9v7NA\/WoHe+WKjPG6zKzjxCP\/d1nPyjK\/OJPy9aWR3syvpE11\/A1lhOAdwsGptgf3YlJ87SO10FbA6eZKglp80HD24qGnrmY+VqtlarsONbp6ioz1eO1lszdI\/5tsnlgzn3Gv+37YO3e26Xh8pu99xuv5Nm3n6gSC3HpkpS3MenZW39LsfO243UxMxlQWGsc8oK7WEGg9IQQId0LPDydtuZmNnMK4wN3AEwK+LmKf4lnYW8BRSF9YW3lB97SEgxVpeyWFr13aG87f727vQQpe86cSkRrK9hie7g4rWI2vXEJfFlVaj10Y7QkraH2pZELF3Y1l4aWtoRii9ua1saWrasyixua19m5ba07aG2JVbE0oVti8tDcx9auKgpq6VtbYsTBbKE6nUkpJXX6u8LXQQpvovwtpi0GuCnl8skkBQ7ArBBisHF3QA5mQ2ED5RKeh+gq0xaCjA2UybDhwA\/xQvjAapXBpLhNz0Q+sEel2LsndnQ8CNGnzDU3LwVmqXro1LJz\/ynubmXHbLscTjQfJ5dJgdxfOacmTsol9aSam7+iFM1uuy1zlzK2FxFfcat5ubt\/FZWCFNOU7OT7yTnhGaGjhHIOsxePVH15vh+Q99kyXw0NlXqd6UpbLekin+QRYqDMZV1YeVwIP2tpJfcowkxMFkyq2l45IYj6SG2ZuBypWR9Sn0hzIPW+FkkutSSKcb3MTMp\/g1YY5cl6XEaoqq8F2Wkk64s\/EOWjPa5ucBpGb0PFUoNSFKbV3EQjJQIPsjg\/i1j9KRXUwizfNr0i5db8nlJVjwuvK8lmbiiJvGGJJ1FFmyRpO\/IxfvbSHoXr0zuYOhfTDeJuKQKVmfgH0l6jimF8ADM1+9InMnkS9XwkiJj8KWio14PnYnYGTqUE+5\/ZPQulGdY6jcqMpsgGB0dGxpmamEE8\/QrZtj\/IauSgX6eNCElYbvJ1+d54kQukcbEfVifzdgo6cHawuAhnUdclpqykKaOwIKQdfE6vFVQzhf5sG4BF\/koA\/9IevRRFeQsLk3XJnsKV3LR9F\/7mGckqeQyvGoK6ISknEr6+OXYBovVmS6qcJuYI6ML0JNdfaWktqtYqp8ilX\/zK00F1NeYS3yaOcpBSVU5ldabQrifZZIuprmQRaAYv0tGnznLRCBJS926Ako+kctT1KwLlJf3mFoY7ZL+ATv0SJQ1vEOSvgZrpCf0PPWZ3gqdzU+bjCS7d4qkD3DKMjxsV20iLinGqlCFRHfoRbumcM4yPk+awRzpSBAoQXerLG0Ha+yKjFG7WycNuFKV86yM0Yl0HlppkiQD52VpBVRqrF8ymutmWM866SMsyb4gY9ThVBeK0QjXJTXzW616fF\/q4DOppSe9TCSfk6p+p0m66r+rqZyslTpuIcvJZR5HNn+2abMW2JfaNfV0+gUjRv8tlf9C7dpA2rQXNkjr03skBp6Uqo\/TUAhN7iJJk0eQ1OLyoKps75v3LG50dvaDpWnQ2XmW1Zbkeawxb\/J3Z2eamYrhbg8dcKMWuIQ\/F6Q6r0KlVAednSf51Bxj31f4Te4qaTf8V9PwOjsv8LYphBb+JUlulaQ5MF8qCfBU\/gKwtNxI9QBrJakMhqTXAJokNbI79AtR7USrfC7wWrklaQrAJqOSa+DFE3wsJcr\/wWgawHsqzLgJxRSOx42kWMySFLNiiozHYjFFxuKWpFgsFlc4boWsuCJNPBaPx+MxSTErpuh4LBaTJCsWi0lxI0lWTFI8Fovp\/66uq6urLy2Yyoa6uqm1d5kWgHNVhfJfwk13lQd5+umn17B2gpZk2mK\/8dRzXL+rjDmSyrznJoiVGbZipMeuLbqbnENSHS9NUC8ZtlEqieMyd4+LoRpW5DB\/nxUR2zcr9JEzmEVCigXfKrwmFrL2zcmlfb\/JMPVgWcTB\/U9GfbLvznldL3SVSuraJrV2pbnYJVldPYx1NWoLuF07s7HYWXqydnYXVySrq5tUV7M2dhkp1vWatAz+6ZJiXR3l4\/SWSToDPCGjlV3w\/R3zhrZQKRnOSQ\/RYfVwTYaT1suMln+PH3A5G8P2yQyMUXOyT4Zz1vOMVXZiSQn2qd1dZN2gRyUMjzz\/LANlOs9Vq9V\/VGug0uLHO2e9XyEZv0tNqYclXcC4xyW9QIM04Cp6G3GZUbZO9lkiHceMnpX0GFUbvZiU8HfpaeqkXpTw+UTaRJkYkqp5TTsol4av3TkbCHFSLTxm4uYvzwyekLSkr1bqz7SdKVaKo2qkQ1I3hjMyeoQmnUGy2KcneMAyvZ7ifC6j9UGZ0kmpntf1KZMsq\/RKEZhNtAxnEpbCWezkEhyWGiL2njOcldHyDHXjK\/U8kYqzU0YbKZOTlCade0Q7CN8sAg9w7vCRwz8fU+ynU+wxOWxDW44okyTOZDiBDAelRzl++Puff8wp\/AnHDh\/+flcRaGa+MsZ+Z6fJpVThfNxExjkiPUKNwok8fERMd2J+lsuotV1trYr\/zhfxHBJ5atQz4\/Ot4GCoSZrbnluiQR9TIWnenVQV1eQulzSMoU8qOUDTBJ2V0WNMk64hzoamS6B4DoljO\/QZZdKbbsGdC9X5r2itH5PESc1hrozODBt+lKVlqdqJSZ+QpTb3Pun6+Id9jaEmqSeZ1UhSauQZbfQrJM4W3Ii7USrjQ+1hvz7YTpdiK\/8ol06gObc6pCVMl\/oybXdzov9ZVf9Ji9QDx2W01K+RusmKm1KFs0JfYUmj5wuuEg7uP\/lTwpSc5gh4v0sPcvrQAaZLpA590\/eekTx3W9RmSiLu85ZHNeId+ovVlpTy7Jsyep7fDh2kXnFvh4zWe6WawsFDx3hPJRd+P3CIwYJTCfC3Jck6D5Wcl7E2ANMkNQIbJakEon5bqsjpPBWlacA6SSrBS0iyPgfqpASdMtpKmTQZ6LSk2CCUJgpPlmUZhY1lybIkybIshS3LUqRlRVnKaJkMsixLkZalSMuyJMkykowlSZZlKWwsS\/+3YNU9D5p6D9AwIc+\/yIPtD97dFz3IhAiHu78zIVbas+\/+TIjBB3AD1wEH8DxcB8chZ88DN8ABfBdcHwfAd3F9zwGHaDfAIex5RAYu4PoAgUPY9XECAgfPI7IAfPLo5QQBYY+AjAHZ+xD4+EQGPnkPAvI4cWmav5sTSw2WM87LT9IWv1WRIMjOYcUzUN9FKS7bFkLDV5R6uGxsYdaBRbFBexI+kKbuGKU+QMcKXAi4UM0wC9biQm85DtD6BWU3uFjFG4tIF4QdzF+e7rsY+JexaW+lZK136ZdS3KwIhpqfxzpKVyL4SQtI947THScIBi9R917\/X76tSQH\/XhjUrUp5PT7fTKVviICAa4nLts+NIQLwrrq8PpvKjVzxeuNXSN4gKAxmvTl6G\/pKGKN9NmUHIGlycHrTbU9Q+fvtGxZj\/R42pT9hjQZ7GkiPOuMwEP+1NLn8fsp34eHzeSnJNIA\/PPp9A2kig2B88KVWbrnJEa7EueYRUBDgMsv86l+TN8qrT1G+B69XWXn8bD2Dy02nRPBZFePjTPmVIeGTYvKW6YcZMOxauGUGpXtxPZ9Djd6i53AAMdqd9APf86C75M8aRpn01f1mBLrMA73pAPAKIKze4Vqg928qjwI1eFlE28R\/ZNJZDtSdglM2QXLSBS9wePwAMGjhp5paaFlBeGyQ6P2Tg+NqJkW4R4BN7W6AAD5vJw0wYT4ntt76uu4mbD3IS09QsjS163NyDFyfFNYPnivYs\/jM1in7fY\/rwva58OXWLfaQ8L+r2grNz4z8x2O7dm48hx9Qjc\/Rhh+dH7ZuHeNGU2CTYtL8LZ84MLD5FD4E7Jwwhw+rL7UNwtXqDoC36gYapzhBdmGHpX\/R\/xAObKruxoPLS3AdXplcVz3ozscHGGfWlSaXf5rra3biAg4Oe5\/hierqG0Q6rJxaWzMKf1X\/23XAp37CMgaEPY+J9x3AJ4++7UGaHG3AI2OQJs8F4NpBOoDAdgAcO7Dt\/KR9AhvAs32AIB1ybdsOsMmYDmzwbdv2QpGug2PbARkd27aBwHajkhNjj9t5TttOHu5sJ3DsPKdtJoZ7wZkToqo8J6omVS3CKSIOzddbq\/KuO\/GopCrsImJTEVNRjUuquwOCPAURdSq+tRH+rb6g7zakk9wG+m4M9Q2SvH6jzw2lbjEy5Abc9MEn2h+NGk\/DzcC\/TURtsXKYbCWtGkaWLfZr19vEjKxWXo8nrAsEHvtnBK9pN0HpENDf7QcQIB+waXgdSkauJi44QRELOE\/ks7UMkTgKVw3QPUg4YOBMmuXPDnpA3w+bHyRN4ByeHDXjbRxgaArpIpZC3ziBm+aLp7xhzxzBvXi\/O8Kjb7qpAHy+X8QQlVuxA27P5fY5ghR1gO\/aNL6Ft218yy8EFDGXR13fTgN4ae\/NywRE+wABt0\/4A1RuwWPs3W+91hpvjA24ACPejPcIZvRXiHQxw2MF4PPdF8CG6zCwDoe9Z\/AAj08TsL35hO+TbOqg8zD2lmkePqc2wIwXcIDFmz2vqKUeb25Z5Kf\/O2Xvqn1P\/R1wXAzRbP70vNCmSWdmtZzFJ+yy82P0T8dQ4J2cunHvjN88P+17Z0WqmBHwwUvv49L184HfAIa\/xOX8qr\/xIeDi4UsrruMAge147p5DfHlr1Rg+vft+\/h0fCK7vxS9qOIQ9ACcgvz559AE8srSpK164jgt4vucDBC7gO0GU7wWOT5aehxu4AL7ne0QGLpCisogVx8C5XXpvkw6a9f+PBwBWUDggihAAALA\/AJ0BKqAAoAA+xVajTCekoyIs1NvY8BiJZA3BRbmlaxzcCN6\/1XnK3vtA\/UeSTy350v9p6hvMA\/yHQX8xH7QetR\/nfV5\/summ9Rv0EfLt9mv\/Mb\/\/wI\/9J7ev9P4c+S8MvrEitf2PefwCMTf9b2MWq\/7X0CPa3Ae1F\/E3QD\/m\/CE+mf672AP5Z\/YP+\/\/ifdh\/rf2v85X6L\/o\/YH\/XL0zv\/\/7if3C\/\/\/uh\/st\/8W5yA0qKVumDSxeWfD+PcKnXMd4sVdLOYqnmHfmxAp422FqYGUG5aaMbF\/UnhvDSqhbGziTLDNjPht\/e01rMeXVwnx5FLgubeLuBnGAfpHD7mP43GxRvgVbNhFSeJLAHgGWvdPJnP4wGS3kR3nnGVuvgLya9EKQEzKFXS0dHq1yQ\/Oso7eqGq7\/Jhclt86a9OrHlJprAHcyHOnfoXVZzOQGwKYLSthRMrgYAprlquYNFzh5IA4pdvHaNM4NqyIJTGsYhFQKglJOB8cC5pqHIl\/SUMF1nR8BZ+AmVI7YLsADCR2mp+oR5d5LEiKi7qX+9tLUScGL0+6J0e8qCbCIKwxRRlBV8nxayqkB8gH10ehXq5u9aOfxf1hT0WoIN7n4mfP0yBCLtmy+XXPT\/Sk+7WdzMM1aifYDcWV9GkTlq\/cdL\/BUOfWrb+3QWfQ1v5fObRM5+b3SGFUgAAP78XNFA8BSOjBZNfldNRY2cVnDXAO7NhRXGnyo\/+3Eorm9wKiuSGqnOeuBuYNv\/EgvS9\/xsvQFOOxsJq8sU+fa\/lsqsao1i3MNZ5dkdB+2T6zz4T5BQDjD5ntzxATsxrHKsrMoVGRu\/JTyYRHdniNCh26OC0hLezYpgXfNByf7PWZ\/2JrK0po1luaGMVudOdQPa1sVzOOm0v5KcOb56I49BZwV4k6F\/twxSK+P+MQ9tDuKfSflq+xEDbpJfF40E2NkY54Xvoq3lD5lGoQ46MFBZZhfAqIK1JHuVYUnsE+cnasRLgk4l7jIKJ+BjZF+khgHfO3o+5jj9jr0t2+p0heVNgaLcdJcIkQbYh\/KE\/Zeb2qLEpG3ldvz1rt+NwyeHhJD6IvpLyzbrbllI15ZVqWKnqacH7ERaD34t5q6WLTpgJICuN5CkiGvwA03vGHNaC9SdemD0Tiy6w+nqaFzZUyzK79UhaYAmpBLJDeJrhdjUY619gf2ce6cyUuybWDK0UeegSo+7+SNSYe5wCPQNFwbcbCp26n6izcG0v389zch0I+F2M0QhkvbFupoVfWoKTswOrUuB+MiVu+zpqioubkre41gWXT2VlNFSBEfV8AoCubv9WTm5cs8NhULcY\/WUjTwEJHMuMtD7\/IHhMYAxl1sAUQLf0z4+Z3Lxf476Sl9E3uqgfH\/MouyYFqv3kE+n20bSPAiqWFbmhIbLIoJzU9VScsbxMq2ji8cmlVjk1oHTKuX9IRam2MzsmWp\/4rX\/UIfOvtBrAsNje3ZaPAbPopncb23+k1NzI2\/PKiFsdSetLfcVyxmxxjQNMZlsdk++3aJT\/6MkZheI7FmvKhwPSfD4a2fe51FCWhwP3UCaNrc3BHnVeV9BzJU+1Bqz9tlZhpRqodjo6uHBH4SQq8bdWimTYNa0qg99g19Gl6lfBto5QiZNDKoua+4ADiSK8tGwnzXr7\/zOUkjaj8rTjJrW9iDHUGYZQcf77pap9gpcqk0d3uNBUDOMhL2AAu4gmVYdHPJ4qHfLQGOfSUPmFCBMGbseF\/gS9qzMIIRqJMIE\/B3tQo+CU11F1jujHP4P95U\/m1cH0V4F5f9hg+eTCR3lLNiLZX9MOi3ttG5nzhC6SAOpHZP5tbsk8Ikh9Zup985GZObf1ZgApWeB3UnNK5Xy4O5k5xSf9BCGLonQkNHUlH\/z3zU5GReM77\/nVckgOe\/rvcIupfAhvZ+t2NWsem69uw23f3r2rbBK\/RsMnJzA9Qf5KCn+Cfy0O2IwsCJrWq8h5FC8LYjpTUFuAbC2ULqog86f8XSw9KCFavlQemxnd5XzaMkfQGQ9NEFQ1q97j4Hw7BZNin0A+IDGSa+C4HPeATmMWrpMBLbelhfbOkuVcis6QbDWHVINCUsqgxIU5Y56paY6z\/c7uAO7wkXGO+yYgAXNQi9eHJgG7BBIWR5F7y+jMvdZbDlAfz7iywdoTThePGDHsh7bvScE0a1ajhOxKERylW95CXnuUis7xtcf7YmCQfwRFODLJshfQ12YP3GqI7z3XQWe0K5roaIsVkqVmdT175sSPDy3FsRH1B7iyNZu2Sf0RAEt06NzqRAgvLSfWO7C1DVUZ7lKktT1mYXjXUWW+fCcJDjBAEmJ6mXqE9kUcy4MLW1K\/\/D1YZXYU4G50f0b7XrH9k5Pe3VUAMnWuV8CQmOPM3H771WShbhKc303NnXXl5Z+PBbiH9EqU+VRrc6ssaSG8JVik2GE7xVW0I9cRZLVpt5EQW9K\/V+IFoT8KcfBVSYLPnPSUSLdHY\/hgQvblVbmm97dLXabyfUb9F7FkltwDfYZpTdk+KQZhvcTEa6rMdBJSyB2NQ8Q8efcIY4DKp4OzmOI8V7aVSIQkQi7OdlqEQ71+kMvZjGmkHkisMrqF0Y54xti9+fXTYkBDZ2e6HozB3ykJ7dZZ5muR5qUEOxFxI2BW\/hvqlNz7Ly5VgcEEh3eGdTNhTWxpTw+izNIBDKFYYDmpAgqq6rUcSg4ZkUo0wu+jzPgBymc9tBDkmPXv46JZ1VxoQ75LbKMe7\/Y69SpNbsB9pPaLuqzzJQoCa5gk2bz+VlU\/r9M4gRYyyD\/HToCKihAZrrRjqU+FAcbKLOB5HPGyfrdODLUf9ayeAsQOO06xoyMM70vpVvR7ROZAEXIOZurVW7A7gmTn8Wi\/+vWn5hXGWdziapstFp\/d3o3ZGAjGh9Te93mvGFCPf+HfErpM+N0LMOQYE++UrwE2kH1QbzUbxqlXQm3SNpFTur7qhosHqbD0wxzZdXfVig+UundEmeOC0Tk3eyr7HtzkwzyY1i3OdKUMv3x8wbjJaDU\/WvIkGnM6Mp1m+SGhdCxpO9Ub+YH25CwBIMDaU9ZIVFZuwegenU+x94ZwMg6ykzoIC2LoA2KIKfCD0198of8ifJMaTlZDzJS9GGp48xDHPNHw7PFN4ztCnW+tD3GTh1eUqNGCk1M8Tbrf1EPC0sK7YtumXip6F574EDLSzkkaX3kE1YJoAw9gnTPR6+eG+Nr8SeZU1y2A4oUf7auJj2dwKrsALn+PfvIZ4A6r4bYXH8cP20bxqQ7XiTqTwHXqlnVxpKMWXgMYU6+xtdsxtM6epykGocPxpL2+K3RfI3SuMuUxMjn4In1\/EVT9j8x3Mnxe36yMPobBeE7NndK4G+GGDJXInYFvY3+rIX4AjqrfHywoiAjceqvi1BvXC5IMwfng1f9blIlsWVul23+Cstx\/0kTz8kXD5ZJAFNmjJoN8vWYZGtZNCPe6tjNNANy1kl\/98iXTZWnuZJQQLBhrRMu0uePrFt96fz\/9DYMfrl7pdGhuYzFem4My2s\/ZeG+8DfPrgRCtuhMLOhHdvtPDYW\/Pq6k465toiUVybs0hsIp9WfmS5sUJbdKA45fwNWP8LroQw0hpHpQi9mCz0oS9dkCgSDC3htHPJEAsJG0o0GzQPLLj0qR3eCgyJn05jQtFdbmYQqB2APNMoZ6imDz1HzbLTHxwnr6UC44kSBbaE233cbV7Y1nnLHR3GDpm0VjEWJMFilHQNW3gpXjfVYlL4T3J2p8YXGIPVNQuwaYmv6VrxAJ8MAFyc98Uu7NLPHMya8TQme8\/ZqACf9eAnxNGf6Em1SGTW+ucQkOd+gM8j2LAJOUc+Lg8ncTR9VlO95eklCzcGBEiVVrcL6dfU3q6FakanjMsJfKiT3CUz8ez8\/RC2+XKW2XlzvMCI7jRc5IA6mTjb\/vte3IE0GcSZRW5vp6TX33nWR0bD8JWm9X4FczpFwvH88Mq7BgDxF+kriUwLQz20qM1dAQN0qNdIQ0Lp8FDOeQFTL9TjSIH1cSqrmHH2In6C97hEVYxTUTUxrunX\/OWIg6SxJMtHSpdoL3VYyH\/qrVSDeB6Z4uhsmFD2y7WY0upqQRkSwhHXMHzPjBncxyssyLZ\/WMJuwmdFEF5T9IYj2Oc337VaU+bN44GjoizUkgl2gVC0IsfAbWDGgzwdTBPhx0yXyxr5oc8yxe6jfFw1M3Vlao2fXOWpWLlvcX6OHKrWFra77VF2GLd02pwHzAg+GVnN8X16DJ6MmUpIrj9rzUjNFN+C5OPAbjw9A1YwpqCVpSgDim5toslQwYLyd4PkQd+\/TKc9cnczcIi5pJ2qLVDH9j1GAgyg23ceyfs11kGIY8lQq1uvzv9tvIEM2mGSt37W9gIrDxKQkfEk5voNvIfEEXSmU518TcdOj2OyPCNtMv4RdeNoT3ZNMDU5MuqT8RJUCZgOuBMH+8Jx+q7RSyqLeqyIe+JYB29NXAwiIU68q3F8E6MXnsfdZbj96U7DHh9fo4ueD2s3cTWu9tIriaug7qkFMx8Y02jfMcWH2dktMJpNp64smCvE23r0lNCH82ePP5EoPFP6kf6vYOHKc+V0SoDeoL\/e34iLSW2IfdJPcHSoHSt4GMiq0nlKe\/CbR4WYjFar+RmKueMBGf1PgOTwHLN1wYvkPQEfpFM+FLJIq+owMNrPohq8WnR2+VewT4Qtm0xBoJPZ4r\/UD\/Zgzgtkja1SHWjcRh489TOWRQQtSh9Bj27QlaEEUwCTiwJB2LZDg0tXxp\/hQwocVp9yNUhENG21j5BJBNoMIXw\/+CQCPJAPnQcq7k4WSgltcP\/oV5TtR+uMVRsHgvb6a2s2dS3gZMzZwFZQLZY1lDZeqdMPRyaT9JYFRGga73\/PfEYCuN54gUc4908EAkp9m01RV6AJcJF5JcJGAlpeayl\/JHS3aR\/+fQco4u2dCJbdbP0ZEN6oXfNa3lRnDnJawXrxyaPQgB6b\/smh1CaHxK2+iOMBzfnbhoeYQdxYGAPY3w2xALfKGIjZgmFPRKEswSEbt0cq7xGp2I6ASgvXlQ+n36fv9Bw3y7aIgmxmu5draCdJ\/SNJV+QS4J7RmAKLltECH7hNxZ6cq6E9IQvePjPrAjsoYmsiHu3grm6+OMEArvvdQK\/t4b2VcEA1wX3V03p0A21l+j2UvdA3gz74OUcJywbNXsDAY+O0IjK5dT0syS\/YNuoiRiangZ5uRq2dVZf+\/DQkeh42QVb2yzc9jKdx+ydAxj7p0GQSSy38z58rv4ku8fQnnm0G+XVf\/9sL+KedthgX\/sgIGxYRQvcS34vzvB43Cm7mpUIb8EQno9mHzECbb\/Kc6ZGS6YNgxCXB70PP6R13gCJ+nUBDsswygbUtnFsdq8Pb2ahyR10\/rL0VHFs9vYE3qyYCdP4X1WtpvjENcKHqTTzynuTAZVertXkwBwTyUqi8jdtAHq1LSTY1BwOPaHvNX\/Vtxf5fF1j8aeP7+U8\/jyNQbTXrnxUjG4XGEq\/Xi2owXM54Zf5eqIwDss06qv5lrOCbmeb+g2gFbKdePKF156tdEKmVyjNOXwxSBcFpd8O3gsie+tln5DwhCbeOATMZf4aqJS1ohA0V8\/EamnYdRdlKr5m6nZYytTKxktO5XLsFmhgWcnqoAAAAA=\",\r\n        \/\/ Salon Action Sant\u00e9\r\n        \"salonactionsante\": \"data:image\/webp;base64,UklGRnggAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSDwRAAAB76WobSNpneGPeo\/XAoiIXH7JnR0GISIikTSSJCkppZRKpdLWqRc87v+\/yGn9f49ZiSspBymkAbqETdqkDvUWih+ouxdaUgs9Td3dcHe3QikSMi9\/\/HUzr5FdOG9\/XxH9nwD8f0CD1sW3\/rsxbfbkSFtXQwRjD7dP6upq\/ndhMoD7nhkGOqrkkerN1erAlBdIcqL72vPwiuXLVyxftXzl6lWr\/e+q1Y+vvn34rsdX\/Ukl6ZVKjnPbNaXlx0\/GvmPegrQiVpPOHWy+phTa32VvuVwqlUuHSn1yXPq1k0pKKZW0TG65CVf\/oFA4NR69PH7hxEV9+vSZ06fPnDanz9OxBrV7xxcU4lN1j58fH6+vR1nXmh\/GlVp\/YvycND20ZH0tt2F9rY+bRWNtGIbKfpFO1tsKyjyUV+dW+mBCMVbhmuGi9Du6fHooyMu9s2b+xhKAGW+vHRlZ83ZzmudG1q0dKUV6R9a9jvLImpG3amFlJs5axna0RFtbhpm1r1NJx7MAghYA148z9lRjokc2MHp4A4BVJDccJclNL+b3SCYkL4wFhSCAPygEWy5cyqGbIakurAsCALiZUa14uSEuwJRzioakJHcFeFhf0WSotCafzCt4xalURh7Z+jsybafMrOUsNUk6VgDczt+\/+foPOkeHSXF3U1mxbet5Gs3NWE5J40hS8I28bqVgWqd4AzJuoMgMbafNhJSk5VygccvtHZ1zqUkVh1ZKkkD3AaW5IWKpRw9Yp\/hKXtNdmMbyxNK2jIKnnckOnX+R1KQhysNjJKmZpNkoxycQYDknYoQ5OwuvU+bX8IM2KZw+2Iasi7TMAR1z5yyiJkO0kipkrK+FyhIAnmMYE3ILgo6dVuQ2iYIpLbciyKqg8one4SQvFTdPaLKnbT5lMvInAI8y5B8xOxHgE4a5dUiZxjQUkHmJObQdPz41CFqOacezDTSGk9FwTLsEzVKSBAbGpbE7YnYA+Cq\/y5hNkYKIbQJQ+Npq61d20l\/M0NdN0lqSRrF0RDqGjPUEqPCSs86SlFyPZZ4v81sXPGpVIscf494H8Bg1c\/d1hhelUlII8jt08KJUSgohxGV0i0tCBOg6RSOUkkJwBHhQXBCbAHwqLogX88EkCibWLMQBaPpKm2Qmo3\/F9ND7w5NA469MiH+QZAB0PSUZuxbAYyTPIsBmkqM5dWiZpjnBfIbMX3NdTHFocGhoaGhgqAAAxeGBofibUBwaHBpCdNrQzUNDNw0BQNvQ4FAfgGlDg0OTcupkqsYEg1bUgNN\/zotcxTNoSnCTvWLyo+QT15piArxEaqVsPpofIGGhGM2oGAA4Ev4dDtSb4awkwz98Q5LS5TOaRDOaRbnjOr4L4IQZNzfVG8lCAgDPvPbyPhqh8lif5Jy11thbUgXtR0n7FgCSXFB\/CqlbFlwmla2F24RjNBWe4eUJvgxgxpy+OQ315z78ZxqgY9owM092jJakC5\/3NI2OvD+6pDC63TrHg6OtWP3ME890RVpHR0bfHb0rEoyuG23CmtGR0faM2tNZ7gde6k4GoGkZrbM2k\/d9T1zSjPB8TLD1FKOH6D1ZvkLyLgBNZxiVW2cAJZKntpLk2eZspqSjEGsRIMMgOM0sNT\/2jTF0zw1YwQMBgOAkKUkqJmzeoS\/rQeDUBLUkBammoKiVJoUwimFTFiUaptd8qSkLYP2GndqlouSKuNJXLuSaQQrLHxBgF7XhqQ2byQ1n6RzP\/7qxfIAhh9BsSc29G0jnWAxo6Rh1ZCYuCzryoUyAZop0gs\/GrWBoz05u2KEVPwY6jlqjdjQDIw9gFZXmKwDOMOQwLtIZbgzwCZ1xhYDW8vORT5QlXSbMhFZyxX0zsiitNyaNNbuvi2n+RmkeHb7jByp7YBp+oZacjwAAnoisQ4DTMfup9XdFoEBtGJEsokRJsnZIRcpX3iylwhSGaTTXIfYWhvRKvoVPnZZcCgABHo+8CXgOc4L9AJp9iq0orLY6m2JmVJLkgV8+TtNPke6DuFlG0NFakk6c7FlDLflABHFrExynlScnAWVq4+KagW6G2TRmRzqtSR47fW8irHYq1VhMx0XlyPHx8cskQ\/Y+ZrST47MCtH+Jp5zSfBsBTsXsNE5wLornSMWibzpFNszZWkfyzkQPUaag5MpIC4XjbwCwRhtpV+KEEiRp+RNepySp2bSXIW8GKI1jVPNkoeCZWh8kHTXvSrIoixWR28JxIRC7T4iL7F5GCiHkhPwMg0qGQozLxu3ighgAPiGFlFJc4f4ySmLismgCpoiLQtQFSc378iszWojRJDkDS0cY+wcwh7HNF0jOB7D6a8buawRKJNkK9JJkvVAxP1TmVatVxPZVq\/3VEoBqf7U6r\/oPANcPVKv91aC3OrfaCACF6txqde5AEwBUq\/3VAChV+6vVWnHOpXEXEjyS2dXbZGFIGmMSOMOLCR685jBDUz58KCSp\/OSZgi94wqnsglJ8DZQKvkf1ZflzKZ+f6FIRwMyvPv+W\/pPfN8A\/gyGzCrp\/Z\/xgTg3dXdzuKY7RKj6YD2jSBYh97vnYp5\/rRsLiS1pnVXiHNGZiYkKasZzWkOZHBDEPMXQcRr7lHJLe9lbgaaRgVj285BirkfNSeYHfIr5ihZ2OnEs10TUX0Sd+xPfSZtappeOlydOn\/MASgFljo2OjYzMizWPvjQFj\/1o\/VgAax\/bS8vzox50AGnco61ZdDbzl9p3M0uek4zkAaADQO8HohV3NwGSSB\/eS5LEfiifonYVg52kaS+565KoR\/EidiVsW6aYkdThaLADAAKOaFE3o0ROaDKXRvNJJf29wirQkBd+vOWTb0bqedMyET0da9o8bxg4CuP\/0+5+MfUdrSUyipJMk6Zz7+dfTtLz8\/e8tP1AbbhsLGfLhWuvv6+0L0kxfQNIyU6eP3RDBjVRC0jnDYaBjQc\/knpuoSRlDrvmBxnEbsJIT\/BbARlrFJ3vOMuTNtRb9bOHihQsXPrQQWPjwwkULSakss9Vch9j2+0+QypCaaLjrZ5I0JFXE8R5cZ0LHPcAzDPkzAmygZazRXzbWmBBS0PvJ+4xqycw1\/xUHtM6cy+gEWkkhGRtDAvMoyN3AUwz5ExCnhSND9tVYVMt4UkYd81jvA9B0KyUvFndPaLKj6XZKX4DgeSd8PwL4IxKreH0d+LVm3r72c+dmBkHjGe14tkxjeB2a\/9TOB+BuhpEnXMhfgwJ2GCt5b7mxPPB5ENRRDfq66DXSNVCQlrFJHo57hZI07HmOgnTWCvcScr16dIpLQgghBbm+8BsnpBSkkOIyusUlIQDcLy6IrcA8LUNxUczECEMppBwXL14beuj9chkQfE+SF98jSfyDJANgFcnzAGYxOgd4lfGjOVllrbVXgUJlTqVSqcyuFACgMHf2jZUuVGZX5qBYmVOpAGiuzKlMB4CplRvnVEoAKnMqlcqcSkdOTOg8Llp7V\/FitDEMQ1KGsYw1Obsk717tEi7dV0Ds5n37Duxj7sobii+L14q0\/\/zs089y\/OKzi0zohq9NuU998rEnYx97ajb+q7t35dXgw33b9y3IbOjZmmjIA0F2hYTFTBvCpCT5aFbBIs7v6OrIsjnS3NHR3oGGKW92dAXZZT2l9yHWshNueVaTGDJjU+nvryiSfPwE+8n3Kv2VOZVy7dz\/4tMLFy2MfWThn9bYDJNRckVWnVpqma0jSSelkqSilIzdtGzlsujSZfNj7khTXLZoWXTpsuGBwWHvrcNn6Jh3HpTM2AkhhCNJZSlJLYSQgklHR0dH3+NjCe4efW90C+u2HrI20m8YNUcSfEmSUslM3TUksdZaS\/f55Cc8b6tQG9btVSlquRX+r6iZq5FSSn1Nu+eicVkpIaRgrJBCyGsVfqXNxCnF6MaFSx5Z+B6jSpksVtWBswldTcy\/YFwWluRjfbNv6Csh2tc7q2+YWQo+VAfJXS18Rc3UjuTm1g6k7mh7mSqNkyen1pqSzxaKBW8HdQ2879JZyrOFAJkuoEhDwZtqzNifkbR4RLj83mYqzXNNyDh4zql0bm6NOS5KhEkMcyv\/aE0Ky1OtyHouBdOxv7acno\/kTV9Ik9ebFExu1Y5OZD7L1h8vI+0gw7xaN1qbTHE9sp\/N+nNMVVrvdE5YR53Iun1NiUpfff5V9POvGgHMqj\/LxlRYaWReH6bhT0i680\/6\/zp45KUpdefsiVbPnJ+LcfiZJpNtvqVOMqnjWSTdQho\/SWpmWGNSN6yN9AQFnugDEEwCVkzYTDb6VjKHxmPW0u+cY6Y1JtiN6Moy7NcNABpWANhKl87Z49d5VuSxh5r515Y2awsxwFOOT8B7MQtqflcLU044Vz9dmYScCi+tvdPXLZiFe6cWcIzOuXppy8ZVPB8Lx1O7m+OgM+H7npWp\/kxUDknS2rroo0on+Ri8R+kEh+E9qjP53PNwqr+CJED7meMktda21ooHrEvl1F\/zfNvoQl7nC2jTmSsr4krvWZ2IlpuTAXjwl19I0tYYmihSafcSvN0nndP26YLvU2fTWG5E\/ORDyiZz7kBXGgBr3nrjFCdkbXVTpuMXvt9oSMkGD8oU6bZ58ABFMip+kAGAzvOkrqnOdM4daPe94wxp5eeBp9PJdFt9j1CmcPLglEzQPnOAtq4sN8A7\/6J2JC2Lng6KdFs8009Ll4KWF3syAVChcfWkvvM9ScWICTwYpki13zNIwdTWia4gG8y11tWOTuOo4V9jdQw7fZNPhi6Fec8z12VAR+qmYia46Zx0tdJDkWqtp\/A6Fb0+LKFIxr\/h7WcWJC0PTp2RBT6kqpXiW0Yno4J3GkMj4y\/M8123y9hk53OjIrl2\/t29qWadtq5GSh8Zk4IFT7OaoP+cD69QJ3L6ac+8zGilIMnnX2tMhl9oa6SHgomNm4X44kFyQUdnR3TKgQQfprkyyTM7O5JKSkce\/D7ZxprpokymWfKgqaEIfyFBsNnZJPwb8W1\/K5cDSacVeTDRhpppPqRcEiePN\/h6\/ols9zDZBU83JXO3mrvqIVjsZJKQk5H70+Muky5XA3RuTz30UDChNh+U8wPpsujUNcHd9dChZRKjv2vMqmnajd2em5nY10ORzhljXJod9dDpEmkzUsrq0ONNjR4ku+gJVluVyusSkifqoYuJJjgI74\/79u7z7993lOemwxtYmwX6KFJYbi83lTdYy6TjpXpov6Scz1k74ClcYsorHPChhdrjGPiqGfyOaMPxI8djDx9vQ9KXnWaNYApDj1Nnb4V3C41Lruyqgq+4w1jfJF9\/Bhtisi5840ytlNYb7dH8DfGd5S9omVKwzYd2I+JIVycNX1GzVspfGBPn3F99nncHXk1n5FuBr5ehj3XSyyusGUxn6OE+xN\/w+O0njEtDzQZf4WWrYhx762P0F2NraIDCd8xTDl6mYjpdKIzFYZAiziKPP7LbzExz6PcxRBCHu5Vkln9f+Chu+qLlTsewkMfmIJNCMHaB2tbJ372HWr5b3NLWcg81s3Q839jS3NLS0ta8ipIkndsVZEdqvtLS1txS8hVaWlqGSdIx05pI6lijiiXkQcfo4Zl9M2fOnNk3cwtJOjpmXBvaKWuUUoaZK6\/xteVDq5RSTKiU0sy+NmpfsZhTrBVey3yvMjbWWbu9\/G5+NVtvTic1ml7HCkqe6jUu9a49u3bt3nVZ7NwawHu9uiSlVNJeM6RIfubpZ5+Of+bp9e9VEDvlRiQsjNArpPCqq5KRXqa946474m+\/A5gVl7zxpRWrV69e\/fjqE0wqlZSKNFJ6nKqHueaK8VtD\/4LqQDXpzUuXLI1fshTlgSwStlb7q7GD1dcZNYakNbGksSa9zWuAyV\/o6umKxVWxq7O7azb5bNckxh8cYvY5BKXkuAqXSgBK8QWU0pdLd1Lm8\/+0BFZQOCAWDwAAsD8AnQEqoACgAD7FVKJNp6QjIiqUbMDwGIliANRIucuJs\/u6Tk86558nHq127HmA\/Uz1gvxm92Xmn9TN+2\/sJ+XH7QXlR6qF517MP9z4h+Xz5zLIaHslOARiN2A+t\/7n0AvaS\/31L5QDKB+1f8r2B\/5P\/g\/+37M39749\/0T\/YewT+vfpuexv92fY8\/bdwIckx97xgc9YQVD2gT\/XpfyhetudLvXeQj3Rduk49vMoahv5AmmdLRuh2KfYn7H\/TdPD3C+uFEtyNeqn7TjSeh211u8LHybXEsoox2ih58depI4w0aH\/u616K9lyEG4gOQbUYKBm+iDXtrVtgzd\/xr5LYYoPbvvRbIhGTyyQ503sbj9cqntsM5c90nc0tscbCOhCb1hpI1VOPyAgS1tjIFQU6kM996uGAwjYRbIngn4Hs14twynYKer5Hv8qU1YS8KS9aPQY3BQ+8d9fjepddwsBJDC3TzXp+7PNactJMnIGlDrkiCkwQUJ\/gy6i9IO\/a9vLIUUmkff4U8vHZQGrPbus51Cgi2err8tOvmTvFT0zGYKEYPKd+qwLbg\/wnW1PqXtT9YfmxRdVitNyVurQ8WonX2tRqH\/v6Dh7BEvwVxYvv6nMoKb0hMScbC2xA30jDkTm\/wv6Xv+JT\/Va4EsbA\/Ld8RYMorTXjEh18xzn2PI5sBa4ZY7zCAAA\/vuc0V6YX1T\/+OZ\/\/2A+veR+UMHCgAd8octXvuujx9\/miFD+eQ2\/XNtv808Zicvcfs0JxMrSQPlkWbVQBEu2E2lbI9zre09OoOIhJ\/R9YnjRDPIO8tcXsFnsqO7mZYc9+opTP\/V4t7JS68BObVpuiLaF3rRkhoqKmJehDSlaXoAb6e02png3WQO0ClUCWbC2X69knYRiu\/5u9RD0XEvnK8A3XifBIf38irknhVKyNMdeomYwPp2oFq8EvsVW5z7mDHqmrufMqlYQWlRNYWHLXy6KuNDAqAbHBvv\/HV7nvtunfXBmi2I09pTyyQsm4frWLFKsaMPzHGce371zzu4jIsp4dhxWm9X+30f8qAD8byIwqX2pgg8wa2Qg2YQ78buNC\/ckJ9CZ28hRPkJJK8UenKDw1gpdOBsjn0eVlBbtNSDit33vE2WUp3ZOXIIlxU62v4j9L0oPzp4DvOkPnpEM0opgJMarLf3CR8+VP\/vYvzuE6ruqv5Gxyuwc8bQOdhMj6iOH0uQp5Lgnjfihrgf\/1bFvZ\/XMR4mnOCBcM8ZpsxQfNKn2UCm2OFGhjehR8Rd1Bb0lPZwxOP2d2weFpUo+KlHU+85LhY0Rh7ImYnqfVQPx+6h6MaRqBQx6uCewlBioD9v\/2Do3Yf2LK\/iVKDubLsRHuE7NxVV8BajI9lDXk7Jfizo5aihSqY4m\/BLjIvA\/cJSeUEhtv\/ORwEM1MFLee\/V+Pt0BrmTofUe\/f+MEkcjaXNxiAk7X9n9N5B7dbCv4MGCiDjPw8q7vXSrD9SjFZlYvsWP8q4V1vw3p+A67bZV8hcFWqdkXLNx47AMwxv2A+Z4zaG3t4pCMJ2WQlM3f77gpe+JcutAeKuBWqAAhZBe7\/+G5F\/Qz8u52Vl3JbukDKhk\/NHg8ySpSrAXi09IlRiDu9pOmksBf0DC0l9hsudmkg2g5LQmYpOr9d+3\/KqZ2A1r65HHFiGJoML9TJYtJkrEStUktuD7ts4y+mXPjFgo\/2NSPnVukWSIluSSCHLyK1ybkRXlSnz26R3HVhi\/Ep7TlBuKmOTj3menAB8Lkv9UsGOxF6hZntXLbIoUvG0\/fXAdE\/lNbUCk1BR5CyqK8niW1+varXzkEULtUm7EX3NKJFfRf5JAuTc1Hgt9UIvFm828cYXxce41qtkbJJtsWj9uAV+fPzti1XG3w06\/ev6Tg7eJzYsSdA2T8m+GJqOzZE0YZccNH0IvDJW+F3nTptPsqIxJu\/iQPm0\/PcGVcHgnn\/Mi8zM2+qmSOW05S3ixwoCsmUItdtlQzBh8+5zG+9nXFLrIovwpO9zdN08SR0O1LE5hBjjXMgnphH9uixFAuac6PD1otDsUMJwKsHFZZsFMG+Eofd93bQbaoT82lAyqNvSU\/tky6yxeDB2+KExMqfnjKOwgTLZ\/DpKAX7OTqb3SXqeMg7m4UjVhR\/Cvy+\/v+a2v85xguH2COYzbXOG0zY7hZqle4AzS2LFj9iJXz0bxPvxuxooQT\/N60kO+BOXRiNJYckOIEJDDGdKcQn154snPWvYEyc9alalai7zDgoU2lc0\/LLuWJfyfAB5DVWf3bn+aaA3tWK7OaJZ0qMm1xVkZmV2O\/7DzvgnjWnK65WrcZQKp9phlUL3tZpebiQ7r2st6NtJ37rYeZaLTo2KsBw5MznfACmXzr3dZVpKzGo+M7g9J+i3cQiTIO\/ceP+aKXEfGMJnMe1htKj+lL8wi1oSYeJIbSz7m4G2TtgKO2yuOaS2agxgARr2vtyWTP1FwOsD0NKTAIeJj44ZkBSwD7YVLmKNmy1TRTOdmUKkYZyllyRhoZVsphCFv6YOkM5qk03u+pov6xihKK7HzZZOjx5JgWk+1X6FGL3tD1oe\/2tiKz+xSmQLzBKmiQaN+yHODDFDw9kF8HywQQvBOkTshepUKX9uB8QRCLdOwe1UoGCJNgCyS6gB8I3svCPBfbpx8Sh\/ZneA4UU3gOq0mB4YGZog7BAna7wEOf95O2pG273GpOzFnJtZU8INEvAA7ChZGE584PxRAtC981y3ySRRTBIh07blI7Apm0M6mID4pBvsTtoumUq5S\/Ju\/QTpACN0iWiiJRd7zi08\/5FuwbdVImQX7zukbT1msvNczypLwvnSqUmCUDMaoyLfO22J0pz\/PWj65LW+LoIswHBMdh4cN7ES3BUyJKmRC0VX76w0Yc3myat896x1FlodAVGL2pok\/xNp3THlVVNMHODRsMog2J8fIQ7sX4l+ElEv4vyq1E0QGj2OgkL2on0ranU8sW3+\/LO\/c0gCBKqtTW7gZcFHrn54LH\/f3Pn8Q\/y+nQThzAVPnNf9qa9xknNCc2c2zKj3EQcBEQOFaERPpHAcC78PeqyL3XEWGc3hFSEVh2RQTmvKM9wIkdgPsd42htXQTK0ZyEvHoYFp8m\/0YEOEb\/VS0o8hgX\/pyyBoYBCwhQTVim8A1j6vh6qaLOYGS6dFwEXaXl8Z68\/Qb\/T7FqFe\/9uPJS+ThQFeRDM7CszXTc6Q2aE+N1PWAby88VixANe8JpzpLXboYr7+WvC6roHXrpnlz4qpiQKzHK0YWRnaU5hZHRzWXSVydmTWw4we+Hn3kz1RlBKH5Xvb41POQz5mg6tAfZTBC\/qvR2PAGQ2KIlCaMUqqoOFDfqc\/\/rSbNpyn30TKde\/6ZXeYmmqQhLvqUJiwr\/rpTc8dpt4CHpHtOLX1oj5ZPLMkAGMsVr5mCVEza291yNMMBtgmIjNny6iWy\/vE5ewB5iBMu+\/ZTt25yNAYELRQNBoxQYr9HGTjjGRMIbYVYeCa4+Sl5AkhtY0DFgITDKuOgN90Dtdv6+iS01muoCQUYnGidK74XRfi1Id1OyOi2gh9pY2q95ejWb529Agyw3C4JmWJNQnBJu52I3r52xNvT8guSctC8ziOdLpzR00NstDCZZARNeEVsbR7BlwWoNbrVlhDVUNJC98vgTOtQSwvrtb73CWMuteT5ngbKQEatOqzhPDg71o7Huz\/GOZLpyfDOihCzplPG0EAcW8qViUn90W909oL\/xJgXpiVvk2wVYfacXMyxLFHVT3txzaC2nt\/S7p5Gb5QFD8k8pWvWiLq9FPCKnMr2yJHfLGD+6PWVq1v05Yk3W44JNwMTOPnmVbzRvuCUR0EqfjRgZTgd\/mJbF5Kq\/lrrYsAnASr0iDFTUrJb0hKonsRKyJP3LDQmfWrhmZ30AwMQl\/HchmkJcUoRW5wzESJbvVspUJrIy98WjEkzCC3FaUWYdl0Tx4bQj2ZTHMdEVm0NRnYxmvFyHgPTqdi9ujk3nu2M+cqH3QhzPoHh1OSNsmQXbd2su2DOgcVaMBugUJmwx8jZjhbWI4fSRpPKPDrp\/IW\/1bWpmhm1My5wP5edknp\/fzJbxJdvEXvbR17LgLInEpdvrH1wcOUrsFdAmnmtVktSe724P2dFGxNwhJVUsQu2xDyAm\/oYgrxrngqSx+cYHvkaCflmEU1j04W\/mx\/wgVnIqDgZ6WjITxdh2Z2Oo2jrW8V7HlJMPKUuVg4U95C5pngKBlx2nV4oQ\/j\/oPl+ff0L4ftUKSU6qr\/3cLo0QWRt5dZw6+DzLOJoRLMj7y5rXQc3gNixbYf8hgnQ7dzVDmIqICPvgTaqt\/4XX21ZmeuUraFV2mRH6H\/UB5KXlX+kPeN6IVu0bwhJO3c\/n3a3KFcPgFgXBZ19\/R65C4CehYaNmbx8q0rMMERaoJgTMhCk\/VjDyA94yA34W7FA6hBqbHQwmnlxVwVa2Cp0nNeJJzRwhH+i6URCDYC54EiwP921YV0ZmevqnMPLUCGM\/g9xtiy+4OnkJ+3XaF0+6xXhP5tUQurpvox67\/FvcOCzCpRzPNrNUao1vZX8fnS9P1\/bRcdeyr+eAkMYkT4tJdxpROEm5YUZZpP8ENkmmqjtgjqvcoiT\/qQUMynl3UFHdYeT8VvGpEvzaXqP8U\/dx2IeIfUDF+FmDUHZwbd7NM0cXxG1qHVddeVMhbxfumRZtyHFtkkohZDKG+lT58Io9lNsKgcgg31yheU06IEcbjVqPXMTeLcU7TR37hQePMYVe9EPXMEV1ReSB8fAM5SmGx\/1XVMw\/X0a8z18Zk2geg036SjEpz+1kzxHP\/YMR93BT2DoMhlGpes\/\/pOKeREovZ73R30P9CcIr4Fu2bZio\/tTD+Zk78kauZU0GIB6uQCmt0ud5c0gKSmEKxqr\/tjxZnD73ZABS+TnT2KoBStw0LKBfHTZcebvBDnJg2iZHxPyWt7rMwre2imd338RX6rt4x0kdBPFZvSFMGsbuEVMC5dFdf2ThYQ5CK+9G9U1cnZn8fgeb0C1GPWd056Ci3fCaCj75iplzf\/JI6Q1F5MT4vJFQySJaLtT1VqlwDeDpLds5zips7e+Xq\/OuA7zENC8mAUY3\/RrbNngTIggTMNJIpoDbqrD5wZtNsmAi+\/kZ6YgZF3Xr0CVsQSCQAA==\",\r\n        \/\/ Union sportive du panier de la victoire\r\n        \"unionsportivedupanierdelavictoire\": \"data:image\/webp;base64,UklGRmAaAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSF8NAAABBn\/Itj1y2\/\/fjLRq7r0XueaV3hOl996cEDlO7733CJs4vcehO71XG+NgbIyMMfKrJRinGGOMjDFCCLHLsgzDMAwPDw\/3H1u0Mzurv97lfCJiAvhfCaf9RygMCtzaOMywGWubrLUduwQ\/OwxpPbvTLlnaae2qnBDlhxmuA0f3SaXGG2bMPNvaVVK5P7zI3JOHbGXGqzvupHm23c6r5kI7z57SI0Do4VsgNCV0dGNdGbmih830VHM7PeyMijBlpYQKbqgLbWPs6HFjrD0zK\/F6EBmp1BQEHszUgZab3uX1VUC3xKytNTK0p9OuwVp7+B4pq4M4Qy1DNfi677dLGlJu1u3WviMVRrGaoehQlPfEQWOc9HZxyNwqEOnyJFp5wuCJTnq3HHfGWR0nX9otgAlKRySrYFTvISl2+I6c7e3Pq6IaVZ7ovo6UGt9u53VJaQ8iUyMFgUvdVMrctBX2ljEgNVriIid1G0Zbe\/AWAbw8Hr6Sqmtr4jHWBrkfn5iTPlNXvLPqC09AF\/J4oTZVs4EXxWNDMduPampw3LRotNZ1oGmJADqU2g8DMVsXOOk56spbOchh3O0bijApoJUN9z9zalsquA7uyTnhhRb3AsEUEExoi30dg\/W9MB5QnhCe5dbU+JPhhJNO5viO01cL7LnyzB+EfCTQ\/8Chhx0KF2wQTFQFhbDt\/COeNEJoYtChwHenj6uhhs5B2Dtg+\/sYDAVMLhsJygj8eYhTPPJlwfhVCBE+HuGcoAXPxoCRUKLsVW4ttM5qnzdrztHrpdLQ9wSwsPP6mzfvu2T0qNHWLvpMMGEVIgtrF47t1EIQh7HBoBXWHTW6Bo5au2Xr+s3\/8isCIxAKLG9qeTz6\/YcvfrR284CAqYJByG3+eaeAJkYb+KEYsf+5OZO8JVLaK1ifHa89u8GLRAMYu\/HlQzMjuyQ1da4A\/zm8NXEXlFFeqNWqCa1LlRHfCBCc3TLi3BW\/qdTwfCWoNbe2Je0cX6IBL9QSKOGVVvciMeKZbPe2A\/4x7qQdQuDZ0FqLjsGEgYrDCOT\/whco5KDv2EY3WUsEM+grI8oIW5de8KFEOuLbBVPvVy+ec4+ACokAa+KwYSzWCF93nLgGgoEC8GnnNDdRZ\/Qr42mpOFDCy83OWQKRAal5X8ODDc6loRHfRAXEP81J9MSzu\/YWtLKVRBrWnbDoaSkOdO0VNNztMPraHoF8nxFOdcBNDu5B25QJokqKw779hRJp6Gt4uc2h6SaBnAWvw0n4jH2CHwroKPCISpQMvdCkgTVadV8yxWHUknf6c16U77+\/vTVZ8\/vKKBtgqMQgqWgktIWdz41xcI\/Z7kVkVW\/36cmatnzTYKiMloqtbyPS04ZCsGRMS+PZnlDIAqtnNLsJykw4cb02NqzMWGVSxFqg5\/XlDyKQ9wT6V1\/eliBofk3QAf3\/+i0nYCSFTaQFUL\/t1ILJecJ3oxPlrhCMkmdmLvhQMGE6UfTyzKN6hfx+X\/iuJVHj3pPiJW7mcUH7aQSmAJzjNC0Pjc5peHdsglqPuOlfSgu8sPiILwQTxqHCwFqLrgVb8HPe4wvGTzvlV4FCfvPSQ1oTM3tNNgoigULvfl\/AxKGjkjWBEV\/ne29sbLhRIOtH2TVzE3OIJ\/hF8WsltR1o6Jkz4tCutaoQCLnkLNwtBIkw1q8xIxD8+uDkEed6ygh\/zkjM3I2BLqF8SwwmEhhc99k7b\/LBDgFdA1AYgN0tzrSsEHk9J49oTEj7Fm1KGIWJwQ5aYfWC8W0tjH1AwDe1YPPCtowzOSsU8tk1yxckZF6PUCJWgxgZ6DnKKW5cJuDVRBRq1kzPnFQQ8ghcmpC5mwIdX5AFnp7sOiw4zZ63WiBKgPUDPRRrbbS76+bVkRAULUnIvO1CfDZA7TjKgXndglaSgtYTkzs7IQfnBD8mpQX\/moPmcEhHl6Sl8Ux04IyELNotBDEFEfw40jlmd+8BmxraE\/JnJ2Tcte\/u9iOjxSpMVZSEasMdR7aNfVwA5RGoBCiBb296ZKeg7VBM4IXlznWT4Ta1f+xHOhTlB7oaJhDDbU2Np329twgDEr\/xBS5uHP2uEAVDwUC58xMCLR8L2qfaJhC4o3nUF4I3QGQkkSUuzYz9QIjCIZUuyp3iJHXE2lhQAt0PLx8QVICRhCqBNfcv\/0swuloFyB2fmNFdvQUdSm5PrydghlQ+VJKm2scULs+4CbFzzv7YaHnl2FN\/FExUH4wyof32+lluMqBxmcD5TuOjgvarY6QWTSxgPIGlmUS4Dpwp0OFwl6C9qqjA6uQpP9DxFATuTQbgLhE412l4RNB+VVLZeALLkjLmiDcFLm9oerrORN4VjcnI3LilT+AKN\/N4nTFcnUmC23Lwv6T4yvoDnYmYePPXangzf6+Q7RdYMhxxHZjRLwz21atlTXEVz+sR\/Gy96szE13rYXX\/lVZSvRwWBi5z4j\/ktqzxtvHrkCVzuxtU660UBX+MDV7qZJ+qBVqUjX2Dl4qnxNHSs7xPQGE\/g6oamJ+uACW3ZSKB349p4mu4WgkEtmILAxY77YIqZslKpAYF4mu8WdN6UOdvhLkF76WRCD3wLqhIPYmu4ItTiFfkC12faVgg6SKdKc72wz8IBJSXj4ZxQScEIKIEfl926RTAqVUzoWxtY3+oKnjgKOo4\/ivO3JyHTKeAVlTSS9lEobGt3wHWg6V6BIKYjT39PIKwgbU0UUsm7V1vbecXV9qSMU3bm1dZefpWNZc++goCRtNZRiC6357AGaARcp8KGkrHIUCPPV6lScv1Ka1c8s9Je0+LU4pAMkDrZ09qsHWmtbXZq0g9UZamqDexeu45nRjk1rTBppXMerFgwjQlubUmKhwLLXKfm\/UClVvHtTu0bSW3jC9zQWHuSzpEfsmf5UljQMEzxCyEbFjYATu2\/sOo\/Ajptiv8z0UnHEZMfFghMCu2akRJwkUEKaWLEsOdXa1dOTo3zvEi8FDGhsd7yBTOYnEmLpuuFdCkILHWdFG1+QAgHdaJUYIkjL3Crk6aZawRTIFEYJA5P4NqGNHFn39QtEJkkGBtaQOI0ylj\/02vbUwU3c62ApxNSHIsKxPSd2eg6KTu9a222oK0pYayqrrUgpfvee2cnoKvjCb2LndR1207p8XSoStjAA5+hWwtl3p06ZaVAWB1f2Hd42rgOzPhT8MISsZqtX3+5sXvTcQ7XC3hV29+RNsVzc8KAF1\/2hJHjZs2fk3G4LZ4TUmlNTowWIxD276V3f5+1B3r3Vvznrr28Nckp6U54UyCo3nFp1HrwzVnBy2lhy7lzaD\/y5JNOPHLBHOYyp+xc4JBTjhjhQHPHw78pRNUVGLdaUINK+HS8U327JnsBMGedMiFS3TRzD39kjxD4ZuNxk5nkFrVOmDjJwoSSkyfZiWdEcpvrMHuvENiqGbXnmHTCHbVSCHO6sL2HTUc6MPKuTVu2burZutkWw4aNu2TwDAemd8cT7T46lVwHDnlrl2Ck+L15zc7o36WK3TMdxp6zpaCgWp7AqalU3Dj2fkHliwbWHOo0\/lyNreOcEc9tzXvKEMcZKeU6MP+7vUKYP+ALz4xsPfez7YVBf8+mtXbd+rXWbtkXmh0HNXcI+Eqqa1CBv\/PLRSlV3Dj9ZsEc2JcXdnV1jBy9NAqiN4+Ywez2GXBRjzIDbz36g4AyVVIY\/ful05pTDKb+kBcjBBZWtzqnCNzW6JSesl6IAG2NVDtEWDfZSfeGxbcOCJCF\/suOflrgZrfM+LWCBlRUvcDCz2NTDsZ+KBAagdDLCTzSXGbGBiGMJNYQ4dfpqeceddONN68X\/IiST7c6uDgwZ6MQ5P3QxLRhdurRaG3mKkHlBQ082uJA0cwNQoiROIt+nZF+xVO6uoVgsE\/Bw81DkJiMXje9PrgjzvPF9O\/14P5k6eDHafXAdWDMC38aKV7REo+ByoSeWfWg2J10zp4Sq1pj0YEXVRJY2N9eL6D1mcEscFdzLEMNifJfTq0fzDiFk2GG65Suhgoqi9B289J\/NNeRIVfD6Mp84MWRTh0voyJrBKNDlKAeuGCVQGQEPIEnGoYDQVgUBYVQ2DrePVXA0wI+sKKlns1Yr02IVGr\/9ewZrS2XisYv9+Koejb9x0AHtiIebssc+eJmCdCmzAsj6tmc7UJkzZ9ru7NCsGnNf6K7m1peE\/ApWfRcWz2bf0DQ1naOW\/ijsPPoMafuW3\/9DbsF1HBh2rcFJahjnbZ3hW1TnFl\/CRilpWz9az5k2RZBP3joOd3C3s5Dru8XIFCVqKCrrsHoVwQzmPeUYPy8NUWVWox+ts41Ph6CVKr8QJcxNspGwqcj61tLV2D9sBKMlDcqGAiED+vc2I8FVMHTggm80Eh5o6X4wGcXNdW30V8L4PlawFojFdpAFb0+rcWp76139LCtV0AbpEJjrcCOHuhw6n3DpHnt87sEM5gPVBmjvJwVws72ebat7pU8bEcgEZVra7wvJjrDxpYTV8rQB28\/uGH4AO3bBUw5I\/DWKGfY6DrQeNJSbvhRIIyEwludS1nsDDMz1rbdLpD3hH2nZ6xtGG4UnycwmBd2tTv\/8z4AVlA4INoMAACwOQCdASqgAKAAPnk2l0ikoqIhKBM7gJAPCWQIcgGVhkG\/fLT8z5w1hfxP9V\/V\/KQGV7vsh3qH\/Tn\/I9wT9WukX+4HqA\/ar1g\/9V6qP8V6iH9L6jr0FPLn9m793v2z9sbVQvMf95\/Brwv\/ufh7+L\/Qv4riqvVfg39N5j99Pwu1AvWe8u6r5gXtV9q\/Xbx8dWvwl7AHBa+RewH5Jn9b\/8P9F6UfzT\/Q\/+j3FP1z643ozNGQ6CU\/gFj7koiLMG9BD3JXUbZrZoHhzR4d5r2\/5n0RoYHXFv\/Sh+OKoBJ4a7tLdYRpdXMqeintD1bEuzqWP9GsNjPulpJxtTt2Ed9KO3nGCUxooXZyZaVqiLCTHO7e84SOYGy9ZhjnwCkHwORrEbFKqXYAPs1UCHGdONSbgngxs5y5r\/jSk\/fq5yaNJ2cRdGg7TZnhbdaWtKVvKknToHO9G2Q6ew\/vwSo9plufz\/7kb0T4dM0FY161U+9cNEeKDOj4+gYnEj6LIe7WLqVEONgDMDj2KIhcvRQywDua86Whfb6iQKjU89iQ2hZ18ScbLQO41SJZH99QggLUlv2zp6Ksf+Bo7iBQvRZ5UGj4UX8\/Gfv7Gsw3rEaeueT3\/5Eh4by5NYBbAAD+4G0HKGTf+KGLNuvJYkAOE2AMmpYRTllf7K5\/8IYanAYbXadoFcwNkvci+fqqNvCA3wtEIgT97zJGDGLCaXxfOs79KwwJKeIYqAI491XZ82zxkp+dHaYZRfrWPiOebm5nm5JIelTmIDfnsdZPgEyoLkWueSIgTOiT90+4GA5yqw5j6A8zHNxfL6jnSsGN0lK81jF8NERZHX4LSxDGGpeoaD1GDNASeOvoLP3n07UgJuer3LQtZ7z\/0s7gqM\/0Frryx1bhScy6L7ZE964qx1Bz0E6Th37EK0fNvrn5aZGVpm454l5690br7GuxteuF0bmPKBRm2R0BAlY7JpvERbbQ8T2i+7za4gLjs0Z0e2W3qbPheE5TwOzZ5OJmlxz4CVm0Zookr293FZAkaFu2mLXT2ADqqU445WBgHulOISJIh5tJ\/VSxw9lKLuxfclMW\/9W7sf56CsAnY9PiWcGS915UZeUa29AQl5v8zmJcrCRc8hPSZzn9Yq7IgMEBtnpZXrsUkYtemBTmcfNcnUekhxadtOdYmEn1WtMap6tPgwSnf5pX+M88e\/Ov6L0nHzjCCdmjDDqSaMZumVqD8WTKOusNT24IKGb88Zi0tBBu8wHjHTpnIMocu6zEwTvAzBxOKSOU1I8KjqaN3pmG\/pyR93D9OUh\/KZUgmEC6R+1GndhrcLy2HB06iYOmD58+d7TXcB0jHyEGKHiGmVvIZgEu61JAueJVdZZzchyu8Jx\/t0KDrqdWbVzxygImKatMd4x14mUzB5qvcAB6pUzCUa0lDxZblUQBF2TMLI0Vh+FiEw6jHLaMyReaAbTDPU3M\/54WiFJhMVRVA2hC4OtaMf8SUF2eKJGPdWfSyuEN4TaM2\/g+l1qwT\/I18ahUokm7oYGpuvFfSDv3wTWrThEZ4R2l51J5oPGaMyI9PRW2cdKVFejYMBlyqI7C44DtvEYUhifwSWH+C2cgAg6NeonzQtsaAyFFH\/ELQO4qnOQmwkcTSHZMiEk8yzpSWJSFsH9N8ASxDTSO4Tl9mn9\/4KE6cZYUZVYGLwe4q0khSCixmJrHBn+79T08SMMFOnunDm\/ZG1CYnLnOzQeqAJWUk96ew5sPOKQR9GjkexnNw+FiDlX4x3VVImelOMJ1tDbHiuFve2znOSokfknk893xiGcXZ9dvf+BysDhCl+q8lslqMyR6\/yOP1f+Qa+tgHo4Pd9GKs7o3gk1\/u1E9tA9VfH98ZSY7QDo\/HscWptj2HRiYOVXJ+Uhl1R3PWS7i84jWKiluqOOjCp\/C58NdrSI1q0JdB0snw04KIUSfkHG1xoImy7zra7gZRW1hobR\/5kVn95ftjuDLdxrqink8lG08WaTd81te44E+31+ynWaUpvMAPGaS6PbJ5nC0edf8PM4bTKNUXswBAACmZ0CFfkz4n4ZbQnCOx6TZu4SHOcbJRrqKIIyTssIK64AmVw2Ih12+lkoOKXLQHLz9++4izbPLRcfkWWN+8k4A8drJmzZ3IIG38p4wbzxd8+kqBT9fR2WFl5EeAGeqk0j8ondeFiqKoibPz58UFOdxmaQZXEQCA12ke3sV3jRTyZOJ2SIC3G1fTReou44y6VzqEDjJiBNCw2WPtQZPs8jgT3HQbGiU6DGHlR6b412SGyeX5Hn8kg6DVlskOkvfh72gnotGF+1z73Jp1Wml1JlkRct5tkCVAGC3J1f9qyG\/nnpLbNNk1xHh\/GZx2LcYz7oKLdDj9x1VdG0ANoN54RbarmNFmB1gKoxxXzPPBEfYA\/rxBWP7gmj5EqDznHVR9o2nZEgDFy4iQYRpxnMZWIRAW3n\/FItBkpYihCVv5531XtN6yoVs\/bYE8qkaon7toBpl0F0Qmr0MUs4n+Zqb1uTrdJPRjTX2uKQ61np7QtJSjqztOij1Q0Wya6YVYlL8HtGR9k\/jfLSP8m4PHGDBFgkD9S95f4NzQHvNlVKXiV5KjYq3QU4X4JJ1C9kjgO8DOoKMom4rXQufVeLWDeW70F6I69ICUKjM0gFcVxe8DoabrS0rjK67icHRQi6WexwOwv5UoRx5o9hoT3a4jKtIMLc+Nj0TNZyVZFJdO0ht3gDsOJWI+Qf10zhUr1n2B550+XTX1w9h3ozcC\/16vOd8bk0WsPRkey6NP4\/ejNW16pF6b00Nlpc4nVARXerKBk3Ih214fElfedNk+gxnk2tqm\/UuXvUv2N+1hmBKZjd1jSWpxq3E39Db+VKQzUmVHKkVb8cK8QtNdK9WuvfrXOcmGN8cSld+oo7QGE9iOMmEEVXKiP5htEq17gw\/HCu4TUCam\/JkR3pmB88niI1dmzpErT0kqny3KrutCecDIutQzvqBZjttz63GTtyekLfuGruNYlnrazluN8QbQnbAc0dYgGO\/p6enbgyZLyAwBNGTdEKGy\/DlmhL+2Pg+TaPdl7oqPfZ3RtI5cHhuZ+rva+YeN7FyizKF096iXz5QxNQxFeKB4B8wnOcb5xiAPN5TpOWXha8abSIC0U7UAbcmsAXJZbMzrGr9MSov\/j+EfYn79PN8GKlet\/Or6j+3XooxbWSNJrDmmgvPGAGupd6BQnQoyqAm05NqRLASnxhcVOZpudwteK1INucm7KV1VS0h1vJvu1iiFZ3L6t\/G\/9\/BxJoZ\/CSS\/2wWdm3wAuiNacX6im0YGb66Bq4x6VCOOvBbUGHm1zjZKkDkx3pLEzBrCiuUHNFFvJ64y8a4Gxe4lp7ZNIg+gXCY2t\/LajmnAj+J+n9PKBLt36Ib8Oa2Yye2jEc6XJOGhE7cyTKV3rok3cXLvdLqQlB0Z8zv1bM3A5iPcLTNB2GaV1u0O9d70lpGJhafc\/s7NFm3buCX66IWlWdOVJ50AGoqH0LE1S3Whw\/iBnucyiJuVlRjPcXncIIQBzhjRNaEw9Mx\/bP9i5lnf2MQMDEqF4VM+Pg61BFTF0AlUKTCZi3gURJaA7hukDdhl5T3LlDz1+ltaefSa0oSIkPczpdwVAhS66JZCqeLlw2c4T630+I6iVeG1ZjzCE6JrZJG7y8g\/P7P9d25drTYWy96plbQOzpNABSWDojlrDvyvvtD4ifsoTUeRrujTOKtmEXeJ0LxjBcyyU16CG8B4ZrjxeQZ2DFQsH08XU1D+iSbmZTiCRfmjzH6wZhWfs\/JOh974oEyZ5C0r1mLZDFARKQYFfh85nH\/6F3E5HDsTbaaf4mmIRZ2dd3SxOFqHZriT7MTcq4kdoapGp18Lap9vIuTXKGygIZBqny\/GXSEgbBg4siEIWKDkgX5Qk9G2rNeBEGDNP\/NKlLvywN0BLYAAZ3Uxgv\/vAkknpvoCSREgu0j1giX6+8o8zxV+kuXjkjTZbI1VJDYr1Tl0\/DhKXe4u1hrJ2d8ZWoBC8ZwW131RoBBjHtBf79xBOrwzgSOv9xC3YXNHC+33jRfVHsIHerBxRpcsJMItw\/k5x0GWOl7r81vqnZieItPLAYrOG02b4bpNFh6YNUKUMeIrpfvJV5gSOlvir\/78GR751jxnTsoHpDBlqNgj9fig5YwviBnsCStZaaAEbgmfa69tJ2Ny2IxUbIUsbRDO2bCddeHCToH2jxYDlnt821cxJi5EoGI9j27mVFmHbbp2q\/kjCtJN8eWp67W4AykG9KBwiIeAGpEhklFZeEpO48Dr\/kqNyn38D\/EiJQqTEb7kDnRmKUZlMXsGk+fdzTY5\/9z6\/ONZvPn\/sFyenwwi4eQ9gK+J1\/wf+zJ9GfRsXnTBjvOAhWerxv\/NmEM83Vs4AAAAA==\",\r\n        \/\/ Urban Prod\r\n        \"urbanprod\": \"data:image\/webp;base64,UklGRmQNAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSC4AAAABUBLJCkUIetA\/2lPYp07xiYgJiDk9YToE09Ew33\/vv\/ff++\/9NxYJpqNgOtZGVlA4IBANAAAQQQCdASqgAKAAPkkijUUioiET3aygKASEoA1i23\/o\/5FbBb5nj\/uWIMrqTljnDeYB+i3649YbzCfsX+4HtZfpL73f8l6hX9K\/z\/WLegB5sv\/T\/aj4K\/2u\/aP4B\/1j\/8XWAf\/\/iQ\/8r2zf238c\/QP8R+fftH5N\/1jcoPQ3+N\/ZX71\/bP2l\/s37hfIH9p8N\/i3\/J+oF+Pfyj+1\/ll+U\/H+AA\/KP6X\/ify680z+J\/Ir3W+sn+S\/Kr6AP5R\/Uf7h+ZH9l9qLw9PFPYC\/kH9H\/1f5Uf5L6X\/6z\/t\/5v8t\/cT+bf4z\/qe4N\/Kf6L\/rP7Z+73+S\/\/\/LEfs+pSJMOF8q3336YEEUavM\/K1+Xr\/anHMNZUy\/DkOr4mIAGzDuRHmyA5G75Jt7BU6jttuH6c7LmN6FD4awBbxMfmjHSocw41QCAdW1kM8afG5n+Xn+cfGjAtOzD0DzRdSYzLttWlE+lep7AGEGEpLWuK5W+bo7YduV4nWj0ZwUdiEWjP7ZamChTVOngaxDfXm5W3ePZchhdp7xJKIyCR7MGO5XdFml92K2TXnvMu+oyRuUn6yW53TbIrCN\/JP7q4K44ifv6Duqgw6dK5l\/+RYY1UHRsWYKE1E5KYkGCLrCug\/nnCnd4Oe2wMI6rfq5Q4TYKuSbQ78lDGAaUr\/MP4MDfWP87uDAKb4sitFvZXlIn2k0aFvlW+uJE3tSUAAP7\/wwpc\/\/h5kkPnWezs4v+ssKhnWkAAofDh+l7B8KuSIfnjKRTv\/\/+OCgDYJuHJyLHD2ICFbR0XYg+x+NnKyGXOC9gsme4jt9QAARfg8\/3t7zvnkintV35LCR5DJ6qDkgHKPLElzYS94UYFpYFowkLwJT6lnNpA0ztsF7ptP6m3izNKJqT8R\/1p+UIdqaCFXaljd5dlu3jLnP66aKKmOFHV6XUhwrTuCrP00zf9B4Tb0Kxrkg0qkpLz\/B97O1xwhXQs\/PdLBh9Dox\/9Q0UnG6TNAifDDgVaGAGXk81P+Qq3xFWEmWrOSlnWod3b4cQnOPkLVnW8TtW1xi2lgDnCqKERuZeeooHodWEcIlFoXEZ6HfFfMAujgQS36a29O6QDn6s0i90XfceB9XGHZPH+zpUhtULgI7aTTcvhfkcbtiuqHQwypYVT+iFP1j0LKe2b\/Hqn1YmKSr\/z8YeczbnhCEHJKK83+03xiTx1ravjCOCUWZAfK\/VG9HB57lnQTnBOyV6+XWidSgzv\/79SF6MS6KzNJEpB8InlMlQLoOxYofhvdw7K1i+\/hq1xY47uE8pI3D8v67XGzBSQfbZw+0XR9I3++6WZDFzNsf9Xsvyv\/m490GZUxXd+3cvdqCqmVB4dLO643ldq06Z0RaZFmJSSjuNY9ESVimd5d16cpQgxBO5D1TkayM5TxmF83FEd6XxofOkyLlutSPIQHW84seBta62Y7az3QRgUa5PB+7G7MB+Wnx7wqbTQ3Pa5ev9xCilOrzkyU+NT3RrbVwyB9xr8tOvIjFdForPVzjd3lG1zHMs59TAvHTz7YELchxDDzWwd7TuIqC4s+n3VE9dkEt+QwFLBrX7Ha7Re8oEkn6bIZryX0ww25ZZnz\/QhRjjxd5VWkuKV2v4Zg\/ra0thlkL5ioWAvOyZ1yL1HnZYe8OCKVpKdBdpLM75f3S9SZX78MuxHZ8dhUXtzUzQvnGl+SlbRFlHWBSj3f64UlO6Gez3r39yGeCzSAccUeYcltkYig6\/lSwBqkW3qPEIejX\/1mzze7RnTO0cnw4VELW7ztu5Kb4d6pr+GiIEWXbBhikjAfOk3syhba8Toed3SwCvMSr4fp0acxv6kPxl\/ZvzuvBo4RmAXT4spUD9CX5adtAkZdFni+FCQAzUYdxFowlDfKhxscWqOS85DZmnhdEapZWszB4RpoBwiQFVsGNiGinYoM4rPL3RkYuXF\/\/Hk0GvlOAbCeCiAZK4FPC2XiN\/Xsw00tEp1TOcY7oaJrX7RFOTbuV9+CbXuairbY3Qx0luugwSWneoo1+rNu9+PcM5aaxO59abEj+VYQRxucW2pX1ukq\/QOxHde1An+l6oM1pNGtcg\/djAHrd0v49hXyKWXkopDLwrO1Bk3\/tYv9UP2zCWgTTBKYstrx8B7MSaqJ7ictAuz55lXaRysBqSJoL7LpOXwqRqziWXDw8v\/vJyVzzqnwwf4O2JV47GpTvfSjghlHi\/Ke9zJ9dhIOMkjCXxHB\/yGmJVmOAWf4W5+TH1mMQ\/EfScb6MFnz9d0\/mvISbAjzqXi\/\/GmuQbB2iz46N2qhngZFA9Q0EHTBW7BWkRi7GqLhhUfG6gQCTtJN0RrK+0u7MnYKKW+jftF7ezYXmYpDdXxBEzWxQSw0sYg8HxRG4DVkSNQPMk2yy\/DPndv001JSNCZUQhYSB+Aj9RjnzG437DV6LYsl09u0DdDD\/3hlZLMNB\/tCczxyJ7+tafDPixHRUWB26WizR3CCEIyq5alOLSYoWVZLaTfbTL+y9clVHKNEmCEla61je6AnVdow6Mx2TrPRlEWA9nVjDoj6ryp2VP3szX9UnzeIKKsssmqNCMe7np6x\/Smvo6258D\/\/hl\/\/5oFAUU9sfz5H\/KCS7kwoaJbISVePsmfgj7Rc++Uy1vYrcQEGwVHvj\/HjNCJyZp6iQMgv4Lip92ajse\/fvtJQTsbUD6CknkaGs7V8TVf9UjzcF6YbTaorBgha7wIYaEl6kGfzJxzU+cCMuEJkaa4ez9He78\/Q00GJftzsTubED4NRVGzC\/rwsQKTTpNQX5ZwWJtW4u+g9I4qKwM2cPs3aNJk\/bxxDzBLTlJC0fTrtTj2WQWUC+RALHsw0asFCXqJFdUFF77L0Nv3BGrHvrxLVs7jzgjnk2R9WpHJb+BOogW3ncjfbW7ygBb4S+uOcg6qJD0Oi2Q2ncfp4XrOcK9yYpNSVuL3+YtMtZjhUW\/RNWjgEqzkmqAo7yTHxaToaLSXEJRXSD644\/OxLuwdcubHtpNF2Fhay+T\/tcR7ioXLwzXX10XOaI9Tc\/+LqsyWZxwBNnYyfh5+I3QUVn0IrmVP14ppko6Pg4Ia1Q+WN+Fkmknp2X+MK6MfNGhBbwZeQhTey74vC8TfljUR5aSRR\/1oAAruE1FacBXCYhdWIY7EZbpobtKhFp+GrYt1qaUuVCvdqEnkd\/9HSbrXpPfs7dyfxsyoM8l4R1r+xkLW8Ddv8luGpu7Y3P4EkPR2AxqPellyQcnkYINw\/K+cbniTfR5YKKbxEUJXf1PWdLIkvEBjmxKT\/TP+tZgpDi6XuR4IIh5G5TBEburaCuOgVyBO2pwLdX+fg8ud3yXBv\/rK+RFm6D\/ngxoP4\/vEOl8qQ7ci9rZi1hZLyuNYz3wlm9RZPIsbHd8oQtmjl+76S\/txtMhRqh4rcBqK96MHasLl7++WsP7IENmhXYjvbEo7G6RHztBmhs0XxUj\/ib6ylyoJP\/42Mn4XyZ\/0UN+FSfuJgkOEUwnyDn389myrfC\/oz81MjpRGZwy9WZaxizFAyIKi+HwvnyHNwQgMRiWdMw0GKfvQERiF2RvTXN+amit8ARBr7gY3p5rbr1KsdfaPPaBwH6kh9EiPbtI4Fth2nfntYYUzXHrCTUuk7xlDFLHNGloS3qcip\/\/6luQ2IYlQ4dUcwOtHruzcCQdBJ2Pz7Y9OD9U\/t6TXnQhh2wA\/6GjK6KhGq7IvxB\/QylvjJdfMaqW+R5xCipAiLiqTpzVyd2c5nEMIgvGh5J868R7z8LETWAuWg6qKJ4uyOATdtZ4d\/4weJH1y4lkWLa6lQaaq3I6rK9axMzTFibCA0gO0nHaLLxYk0Iy\/wEKRRQo4MSBBfyBIxj9Zi\/5iqgv9NsvzSBemFk93UNveduvFSlhEz02MHXGOyGmIJeVBYPcOaHigMYrO\/8T393\/QqnAaodvH7Pi7XrskWIN2ZcuChHhMz00VY8A+SXzXJ1odXZrxLQVWWwgEZFOmiUQVew0GLmCItoI4H\/+371P78dAoBDCX1+aC2kiJCUbKngx2KHsqPncf72ri8\/Qgwdp3pW3G\/3ruvqBxAZWdxKi3XepWyJmOGzSlGjafslwc\/HrDIz0qAuROC6\/sq6W23cKRfuFhFBUgcEcrUOIsJjG5J01eeJgDZjYC53oZcr5ZtiIP8ZEbxyWAP0F8rpnZHfz+hghThNs6ykfv3cSetUPWIJxso4kb5CZdHktFy17aSuzM9Dzf6eObUJnOnru\/N8c2ighY84YcAqBWPskK5bxk1zK+yEN+n6o4tEmyBjT21g7BQ58k8bYNmApwi3phR33e2gN3F\/kjqAKxkTIF9LCe\/7EV2dUSZmuguXppm3n6akDahT79yKK\/Jd7ksFTxqIjayk1V2k8cbJmCDyvJVRQB+ejttC63QDZIIkDAsqAAEPw7ZZ5xFy1MGEUA20wzhWszZGZKFifar6jedWAqbfYAEmDplQ5vwuXHDYu188+XKYAAAA==\",\r\n        \/\/ e-graine et Terravox\r\n        \"egraineetterravox\": \"data:image\/webp;base64,UklGRlAUAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSG8HAAAB96WgbRum7fiz\/gdARChs2wbpmHcH+IWUfeDnXF\/M55HrK7WJch\/kUZH3c+FAQko4aCPJkbp65vI8f8Abn0FE\/ydAfw122F6rDRF8rmvuiaDNPfeM7Q73PfKEPaoJtnhCe+6J6+oBMQDOV1IFi3lL7tngBkv2RDce6QbINMMq9fOkfj0YrMLPtm2LG9vadp53lViyLMvcDPZkZmZKRzZ5hvP\/zJznzJhjZp5zYDOD7TbJqlLBfQbtlgWXKpvbFhETgP+XTJCSCkzY3Qhe2cpUWNylz57Hle88n6igiN0VAM9\/7XpeTPKtA3gC+tXX94tJ67nLIgn39o2ABYThW99DECC676gVEbQ\/1RQBQOGrukUkeN2rQRx\/6kLAwsHSG5s4npi7WELxbJ6njoOC9SoLBxeWMGy3huKxPDdUpcyiwWC9MZRzKJyl9UAcQioelRUMneWFg83F4Qa+eHQ7w2V50aBbbYHDeK+CgWAtxNASiiOPqZ6ChiqMJJ1zlDi3igJKlhfWzi013KC33e6CRYOsnvvMV862QwCKkiaGd5BmXrDwoY+9sQsIAHHiUDlmPIOV16wHEEAAEHiCCjJJM4won14JIRKjrjbi3MtL5IyqrLYgYuRE990dJb3dnV2v2VReKGPMc29YrFQbrUp6IRxkmjkMaiE4pmF71\/761\/uxny1BAAgTKQDE4PYffv2QnB1KARCTKxDp1V\/U3MzQoCdhwkXsb3QCzoi054nJFxtnl4PZMLifYCqFsNNytI+4s4cpJVBtBKB18o+hKQGEwHlZly\/7KQKgvqdpFFeJ6R4cBbRMR936tOGwBstTdKVp82dJmqW9TgnTLq4swO4BOjCwdLokq7RVC8DpY2spkVHRTp2EhfNBblTlLS2YqMr8kadF7GxAJoDzLobF7swabCTC9r6XPQw2m6AJIJuDvkGobzrBSIXusbeH7VMwk6zuxAatd+wAKtG2rKE73TBELr+dyhiEq040Azh12tGayiJMbV8qwZx5S6jwfJXGsNq0BMDKnDVoVIxZmLeG9bIxzY6jMdUQNIQozTsYWw1hq2sG1oSBMVmdthAOxvqqs8XicuEJaYuQeWsImgIkuT3GamCOtwb9FLJFkC2KBrBVmWBsPzbGp9Yo3jcGA28Mkj1jFNuzZUzeNyd\/kFKW+L6Mkb97CEOF7MgbAz3esQRIIsma3h1bor5gbXwtpyVxDGuVXzuADIliWQN\/7yEsjVKYq4MboiFpJnMQvxBBdmQe5ip\/+QEM9TBYD\/\/uaUfJGUS\/VaHMqP+tJ3Ogo16NZnT+sWsQ8scKzVi8ciczCMleAzKBaA6ejyzS4RysZPvJ3cwg5I2csgH1taOtzB66ZQ8z51+11Is9CFriqu8L7UB9403n50JKAI0gy6\/7KgwVgWj3wc0r17aj3HPqCIbNtz+3QUMAEYCirRv\/fv6x1zQRZFBdePW73jIHcwUCSO4\/H8SpB6eAIBhW5lYvbpxfq0M0B4AAAmtL9X6UixNGBqV6d\/3c+dWlZgkQCKtFVBaXqns9P1EMWqc3Lp9e7FQAQCBsF1277Z6InBSy+Y4PbnZDABAAYgYSjcqGxAkJlr7woQYAAcSMJEV+4v31HJwEJaxBwswVKmtnK5PA3isxQMxiob1WnoQ\/38SsJlCvOXBM5E9iaEY97bPMcTyo\/JqY6ToKMF4uXKFmGvoNjYU8fzjjiOVkLChtijBXnCSgEww0Bs5tQPZMuCrvW3bjOHWamFZNjXgSXHh9yJExeM08plMwVNXX10aH+mudpgMAx8AJA9ZbGDm7FzA9lrZaHBXdxkIhqJZHhnCjLBRAL4y8to5C2I80KjaXCwDReU3IUaHTKgQrKxi561QLANySF0fFVmn2EbVSXxh5JQBnnQK3k2FaBfAp0TIs7h340amfQaMSiGNFjJR2VLr3M4xhO8JIBRBQ0t\/fOzxKgvm10+WTGSkgDYJYY6A2a+BJRABI9h\/dv3dvez9K\/be+9\/0XMnv0lMODP6lEjDNtLAB8hgACQNbbuXf92sP9OPVewOHB7u58TVOh4XiCYwdX\/tEpEWP1D\/okdAwBKDt88vDOjbs7\/Sz3ggDASzizSU6GhiFGKUhClivLskF\/\/9ZOIyDGfPT8S++Yx7F+cLD78N6de7u9Qe4FYUih9s5FjFsgTij5TGnmsyzPsixPsyzPB3mWJFmSpnE86KvUKjmM3e\/94TWvX60FeXy4s\/1o6zBKcy8JJ6Vbuug0KgEgjs29T5I0SQZRHEdxHA\/SOEmTNEvzPPe5vLy8vJ4ZOBIT6I+CcrXkfJ6meS4vCKMNVxegUQgggDyN+keHvYPDw16v34\/TNMvzXF4SBAECIDwtPFuYVBHE0wKE0TNcrsKdSASQHu5sbz3e3tuL4izL5CVBAIRnC7MxCDNAGkIg1Nu+ff32g4M4yb0k4WlhNpOl7pmO47MIJFtXbuxVm94RAITZTzXaDcfj8t7tK\/fL9ZIjURw12IuifquEwdGTO1fydjkgUSiJ7ODWC80QSdSLk9ARBVT5AAQkobAK\/\/cUAFZQOCC6DAAAUDsAnQEqoACgAD5JII1EoqIhFPlN+CgEhLGAa2xUfkt+pkgux+TP9V0xPMA8QD1S+YD9a\/Sm9ZPoAf2n+7dZb6G3lp+zf+6HpTZo7\/S+zv+8\/kH4lfnv7z+VHrBZk+u7Mv9hvyf9u\/cL1c\/x\/hf6qPUC\/Gv5r\/i\/y7\/MjjuoL\/YI9ufp\/+A\/tn7qedTqg+AvYA\/Un\/mf2Pk7aAX9D\/tP\/f9lv+o\/8v+f9GH5t\/l\/\/H\/ovgO\/l39T\/4n+A\/ezjO\/17Qay5VgUkSTibdAzJZeQd1ZS1Qpjn8Syjiq5Z7DjzYHs3ow45cBYflEYwMX9op4MBVhc9YbNMCdCLAbiDmEkPVXOq7IOQZOITf6qckk6jzb2ridVP7lBoYAJosM6nqtZAJRKCZx7GPRDA7qmdGgh09xMikY\/5VVQrj+l+zOabVr2xdZSnf70Nm+zNhIx95gUZqPoobR8TMsTmlB8Thp\/yBjte5mGZ91Nk9VgZHnVC3vGz\/arG7RTEfIyTUzfc5PB65y3eMcS7v6RSZNpe5B6p0rNjxHz0rLiHtWGUIJ7z43nvv9bWb7deaIEOSKYUCuuL3rz+OX57R2gkHhLkJLYpmv0h5Zf1Vdv4k5GpsFkss\/DpWBWu4VlvPukvuNeskRrfLwAAP7+R4DNdNU+HqKrpB+Ihwm7jeYXy1pvT\/Q0Whk1Y\/9KpbNgw2XYdyAlBCVNFLxUTw7EnYSx4Cx77pHsqADCDAy5YXlwtA0G2W61cMuj++gNY5Z4Tf4N9UWb+20PXyreg0oJZwD\/9GTiR3HVXHZ7mO17oHwG8Sj0Da\/kYd7MTDFQU89n61+944Nr55LaxBy3D0QOIBVnTNM87HUAGkIUD9e659j0Df3\/Y40XX1j5Pw17+MCdur+eDGZGpl20kZ6FqjG2y2ow6066yOCvD5ONh0K6HB\/v9VUgfFwHkT8EVqGV+nqN9YL06Z7oidSuIEfdLw6TIgA4jHx0rdRWAvETujnRInZXZzxCtWX+ch3Vz+TbbwA4PC2rwLl9BHpAaxIwOOlvryjvcH0YSpbMjvbHJshhVr6nvQ2s+vfVG6jP0Mvrhqr\/+oQdRA5qPlmkun23ruQlRiI8eq\/yS7L87nP3AwYbliRsHutnmtpfUouTHJw\/3\/i+Ucdp1st2LHPDkeXRjWPr6nEPaO6Y0ViX91QtCLEc4H4hWU\/8gSg\/hee7MTdNFCHVsrA90v\/zPOAKUsNrIrLwwHUWv3y8h5uGWV\/2pX4K9asgxbeHRXROKdXCplXD4css+Kg0zKY\/xcZXbrseUAIYG5HKowym\/OcrjA0bB8kIMmG3rHb1wvjdykIKNWYjVwxNp\/JIrsbpXcASa+abyk+OmdNDrNcPj5Gwo\/eeAsi71VnRgpibU1pcfiWEI\/rFrjSCcLIcnWkDA1PPi6tpFgtbsVmA0Az0tsoiYO6jq65yU35vSzqdX6V9es\/VJdjyoD+5GfJNdDuP9VitV8HR4\/+vl+YEV79Tbf\/5ShkwXtEZnjnl68OemVxWChNLdBq7lV1ro59CwWgr\/X6B\/+SDkZlxGo1W45vzaRXgeWa+NRiWqYXO6+XUhPpFChbkS2z1U9aDq\/nR\/kRQ2\/lgmYQKGJcygjlcSzLMjZcFrOEBxWSDw8y38ybCGryRlJduh0fR5f36EW0nB+gAbDoP+HPFPMIZ9RSkRrIQHDEuUcyN0yF08VKpBp0+cjkhRw0KGNHUyhnovgv0blynTB0bWW0yv0Lyi\/8AySRcm9haRfDd51YIMg3r4CcEWj0t53xf8C\/GWrGFe09SmbafE1WbmlxeCgT08p\/d8WsLUgq2WMwLkbJlvulmoIfNhjmGCEunEKBjOOPrBNxlACVHQbC1FJCfcXqbKMONYsQ9JlrDeec41mRqL8iv5yp3vRgbcKl9KGP74V+gidx\/BTSPYogtck1pvchjm4ZP5wIdVqTPlem2qA1MJMfz+L1jMdwYQVVSnRV0ugE6XM7s5+17njj6W98txfwnoNTZvWZIMdXnbqQ3TwF5RllQRb4WQY5+hH0bCgwd9bC9LGHH0cbQPOdvaU3VTf0N5v9rHLddBjMm\/29h0w8acQ1gvlohOW13psZ0mEQUZtr\/Nv27jfbTIYLIFRLhNeyeCWP9FEbYhWQJktnefFG187cM0QiR1d9qDitJBvrVsUu2+UJBGCWOlgZP9XKvV7Dwup8cQcoKzoAXmDbUHGfnzE2mxD1ADloYBWbun84kZ47OP9mdx5+Fsd0Ljd0IjV7wmHrjxr4kfPigfomcZ+YZ38qwNt\/H3jE35Yx+IWGFZch8f4CgU79uJKwxypmKqgU6NOROuEmE4Mps\/2gibQ\/iAu27ANZ6nK9CKo9aWtzDJZywkkc+CtsIoHXyK9BkV9lJQkXzEqYfZ+eHWRBLHStIjE5VHHCQh4SsEsXHYxeJFan0hyclMTkmN7mVnvGfaUJmRfQ9hHPhfZv\/G2ihWpSGKAKaGCKem1WdBzBxxBPepBHa5298TXHQZx1mOzeuXH0hkeb1zAEjQ\/8pBhQlSEPby4Rz5OWP3nGoZAMFrhcfCT64E2mYv3YhP8UCnEQubcJX5GpaZCunttXi2W3KEjXqbhOJhfSV1NRv7P0+OpKV6F\/hsNqmztsRSiX6nFdcLMSI0TVOjnKdZl4ZRN2rYkl\/gmpmL7Zr\/ZX2uyjl5ZQ7Qlf4iA+f+VcldAsH96JbL9GYiUTGmpk\/jAEts0\/0SKLbyMmWsVOLRpy1tI5EgJipnn2n3Aka2LM+yCRogou+2gocsGut350uYJokx4Mo4FeWsGzZ5FNxtv5b\/L+volv753iXK6riEyFagCbk7ejZhF64VmMxvjxLcoZKMAvtIRjRLQ3+dj8kZ6D9jDysihlmgSf+n2HLC2Cgptd90sawE43QiXMbunIAMZKKcY8L01C9Afn+iVkKUk\/Qh3i9wt6JVXBwVKrxfk2hE23DmFLs+XaORBhzkCuSz8YEU3EIUzOl7quN5fYHMShDchFfQod837cjAQ0gs1GvCpWSfnaxCqV6mxZrtwwfGqK1P9GFtoSVbhETgpaaaT08jBfcqVTpyHrrTq\/ClI9zwOHLrH9ZWOjCZKbgQl+U\/6c67cYyIzlsO6kdDN1M9fCTL7AEgy+6vRJfRd6FHIadyZ84nmtaKxK+dydjdjv8SkBVPjYTXpvo2dK9mICmflB4S1dCDffFOkEeXlzWpm3bM+4tVc4qX9hW8GTXVb9eYvP2FrIhAXG4bWNpFW38WuM52gUsmv5tZT76cmdcP7vz+7I7eE7+vw8HL7hNS\/88TnbhVhwZ+RFzwAUia7L4DPYF7OvP2KeKP5vLbWwYbrg1\/ZWewk8OftAzxbRjeiQVxVmXoOcQfY+sCcFbk0h2wo\/NxCHjrdP7AS9fZMMyJHxmPMDO7AAuSbgtb16E3hkR5wUCfHWmnOuTxdwF1dBm\/f7WvKspmjVpWJIwWp3JY2KWIzIP59xz\/0Zk38coG\/jCq0KIJL6cF77WGsiaGkuw\/XtHoqgY8StFm1kPsiKYqG61+fw0etG68YlqPQXirk6uL+VSLhfXmHYIxZxse5pHmShR\/CN2VucsSwI1sBKAGrix7vT1z3aeRTeJoHiT76C6WNStq+y2xNlGjkxmAe5rNo+cx9RqbXcbK3G6z2euT5y+5\/GUQGJLCINhAc307ms3gZpPC5oCn5\/p1rQD6rM5UTPLhxOw6Zk5DyAdGy\/4JBuqT\/1VmS5jLr6CbGnVRJP2AVXEeZjSAgl92qEWBCAf\/Fk6IGwPti55rKWWy6n2A4G3NMaRg3XBufx977VHM2UhEMF20SZmaj\/XlOttuBRaxFVV2spLAOlMhy++NlH6nxSL3GuFd\/HBzCEgF2+QkQLNlBv4V1HYUFh5eRiz5naGg5yWtPP7NgMUdmrAse6pJc7A5p8oJkVBETuIFxg1G2dqFU3gSJmiNCMOcIfUT7y2af9qaMEYmk0u4JJ03ua5rJ37tqEblpo8bH8JLBujCxnk\/4zATdaKUtB9lcgInHNwsIFV9rWkjFfO1K4q9QK\/\/B9RDzsn2ZBx9SgH4VqqbPBh31nRRcwrb3ozmvHBu2KRzA+JJNXSD7Z1hXsKjsONtDvJQwZPqiFndwOnu+g65\/2DS30RPBfVJsCK8QpPKkL9RVhrgQVrWg6t+ZbSTJT2\/BKTGyIvwqdW0N28M4jpXPXPmqIIFMI3DNmMNTo92ILvDWqBRTVx7v7vU4uF\/UgzYfFdt2A16UBvcUocVLYon2aS58Q3yusXIoP0fJTvsK+IrnTc1II54ElKzVMh8xXjyGDz6TXggki5dkVb7ZOwTawz4CU5Tl47K5O2p0zf2kCsX4N\/w9EDp\/KuKwAgAAAA\",\r\n        \"egraine\": \"egraineetterravox\",\r\n        \/\/ \u00c9closion 13\r\n        \"eclosion13\": \"data:image\/webp;base64,UklGRjQaAABXRUJQVlA4WAoAAAAQAAAAnwAAnwAAQUxQSDgNAAAB\/6WgbRtmK3\/YZxdARChs2wbpmHdH5BeC+4DnqE\/zPqK+nqY+HxV5npMDhgCP2\/avU7Jt2\/79zQzMMMQAIoiAKIqKhM3Yncdpd3fredjdHUd5GNh1CIqHrdR8Y\/\/jfsFPmDnPq6+I\/k8A\/t\/\/\/x0yvupfCiGE6IRYS+b\/axAoHDl1+qjqvkX50aDwEL1LaZ6L1Je79NavW2oyLXR6aCslJZenuPS5bxOHewv4KHaRmkqTmakstp9cFISveY+pjDLkhUKk7qxD5NoA\/B2vKJUhD8aQusVSyTsx+H2SbSQP5CCFFzwmV8F\/q4nmUAypfBqZqMWPLFyXgVQu9lN\/L0aXtUTKCdxkoi0PXTgcSDGBBrabXuiklVk2bNqixYuW\/BSvzEvrFHqkpRTxJ9tYC89Zc659oWf5ZM\/AgDdUBFPJWbZzHbz2ukKSRkl3TZJfN0c8ibEidaxhOx\/Ao7WXNFIZejZaKbJjlhekz0wZlUwok+Mh\/QmVoq9GGZ4UHlBVmyJC37XkBrgH\/qKks1HSWWkbaRI85QX7I6nhDKX5EvBwkZKOWtGrVjYywSleck+nhH5Ukj\/BvZaSjop8d37ttLEjx0xZcewVqR2Magt5wIkhKUC8MMq0BN1Es9EOmlfLLLiLHsepbZT8h5ecRpH86qkkd8C9mop2xZno7FRqmzZPvODOxKQnXhutWeDhpnFQXIbOH6EiaWjCXmo\/Jb2BVIav4J6eoF3zBXzMoyZJxTIvFiuT3Q2jJDd5GEhlk4z7Id7TkJSMe8H1u0kuQxsqVnhYR0nSmESaH7hN7TDH01iGk9tMShqV7uE6NUnNu\/D1ustPnmKclNx+pdL8C+6i0UFxlz+\/ucz1FFC\/JrVQB43iRQ\/BDhqSkrN8EW9cxnnCExVMZuVUlNzhIUpDh2pfsoymQ39vZ9k7mc2npORCD\/nUNsUSXw5R2QyzvO3grGR2koqS0z0UU9k0i3xI20pNkobvhLe1PJTMHlF3op8T+eb5i86+lDS0S7MT3lfwThKzPtF0osLNV0Unxjqxiu+s5JUmHWb5YXTnDR0T3ItObmZLKHlFSFJytR++6wQfWp05TBVJXtk0pOIhD+VuWvqqSF4NoLO3yIzkFaMmNW976OXmt\/m9Cp0WTUktSkMafrbc8qhtmicmzpja6enj+kbgY1iRkeQVJg2pGXPLoKPkeHTZcmqdnryCrTbJcW6BVhqSinu6znKa74HkJd5Qk4rn3fDSQfN212kgG5HEf7UZtgbdzlORNGwLdpWoVryRzHZQkpQc7jaPkiQVK7vKPLZxazKLO2jediulcrrURUQjExyZzHKpSVKzwCXwlYYkNQu7xkAqw5xkJv6mIal40QVHjXIwrwJd4r5RfCOSGfYbSZKKRS7FdKDmvUgXqKJSZg+Sen8qB9PggjtG2ajZtiCjcyKUUVjowXqrtWJ5crM+0ZCk4gyXHpQO1CQf\/HNevKa6esjQMTOX7Tx24\/HfreRrDxuoDN+L5IaNlDajVI4TVjDhQKPop1EfLZcSKkquRpKPGm2j5gvLCaeYMDbSaCW9KqWNMYYZTqGPWtOYjGSHk1Q2Kp5zwX5SGpuvJiGLHcQdaioeRdLPoXag5HYX1H8hldSmE8ZoJRXJuMNpKlKbrOSHn6kcKLnBBaFlzSRplHTXho7fLo8J2k5Qkoq7kQJDrdo4UHKfC2D129Dwnd5l8+19k4uCsFvnKUmjW0KpAPWUTpS8EXKxB7JLa8bPnDVz1sThA4qyQwLu0YeUJCWHIzVepHKi5PtyL\/7XtFCRVDyLFBl8b7QTFbkt+KPCR0hNUvNdMFWgwCjjRKP5YYL4EYH5rVSGpFE6H6mzmtI4kYpsnBryKzzvPalI0khWIZVOoDIuNIpsOVgR7Fyo6mSCVIYkjeJopNbJ1NqFNIrkt0vzyqMBYRPBrIrFN9tJKkO71hyDVFtLKjfSKEX798YnDQ1P37TSrpShoyKrkXqL3lMaN5JGSWXoapRUhs5G8u+eSMVpl0nlxdFouzH0qsgLaUjRk9qoVSd8VJqtE5C6I4dJrYx\/RmnyUAQ\/UvT5+Xw1yv98+fbuYtGtIrk+AYUXSEpl\/DBKkTxfgB97luRKVNy5fFNyUHcq\/fg+6BfQY18LSSWVNm5GK6lItuzJx4\/umz9JzYZ9pJzQjRaRqtI\/IDj83DfajbJrQ\/u3M3VBdMU45wAQYgV7dZ8zbFkXwQ8Oli251JSga6Lp4qKyILroeNvoRDv3ovuWzrPQNUWksE\/lwPKCsEBXdsgcU3+9ZVB3CcWikWgsmi5sgZIRo0cPzg8A4WhUeMmojNdX58E5UDysPl7XOwwgLRq1HDL6jxpdWyAcAtFoyCEtmom4DUCMR7rJvDbaVaISwMwvdDwIPCRL3UKn6fhuhG2JpqOqAU6TcQBp5+jYVA1AvCS\/ZtqukeFaOQtCCDFZHe0evejeD5hG153AfZoSF9FARd1OkgOAQhqShuQA4KQxcUA8oaZuJ8lyIJgwCZ62XTEmPJrLsFF9aCWHdo85WjWW9yzsWVBoIdAmzfO6oqKSiiwb3QaznUsjoZJGqZ8BC7V6WJQZjcVyBXCSjAN1bOfCSFrZW6kfAIEWkibbRkZzVhWh77bj5\/cNQvecTe6Ba3+qRAZcPf1seAsA+lIxC2vIeXB3OmJ4BQAqqUwEwRa+eGoOOeWiu88mt7jNM\/wDvtwlZ9oCrYaVWKz1nVBnHpKTbKEOwz4IfudvC6izHGJJwFwrKy8r6xcGdpCHfBGvySE20UTGUcQOftlTZrmNgdVMVtrEO3IYgi18kfGFR5KGpON84Gdyuz\/NZLkND8mJwBbam1cEPHwgS2x4To6xvcNi6mxcTw7q8517d2831AH\/JLf61sfhgQOqfqf9VciHp+RY21sEW3koWXA3XHeRB\/xpIgc7vCbjsGfPf8p27nR7R\/a3iWZyhO2NwHqq8IEkscttEXnTW6kTGshJtsB3YyodALGK5jlwiowDT8i4Ldhq2M\/WJJDWynVbksEscodbFVVryFOxy1HDc7ZCKma7IId8K1zOGJ6w9aZipgvWsvmeSQJztX6cHbYLpKkEbxZGMqJ5ecDv2hztmZ+fl5+GUewwoy0RvafVGwGRlREOp0e2Gf0cLmPZoYdZIuuhVq+AgFOojdRJoB8lmZCyw5QAayhJZcg3wA520HEprGZKvv9LUTMOlFImZJtmB3cDx5WqB6wPlPz7L0XN4UDgq3otAKxlW8LkdjvspusQANvp\/NVC2gM6bwSyHtIxsQBAFV3vhoBL5AQAscd07JgLIEh+sYW+k8zofogNqKio6FucbwFAZv2ylStmV0UBoHBARUW\/3j1CAFA8bcXKhbXpACDyqmeuWLlyejEA5JSUpgGAKJ62YuWCmnTYe5UUwh4pKY3hP3LLBvyLk30ut2uNyADQe+7MWgBDNqwqEROXLClDcOzM6WH0W7U8VjN56MRxQO1wAD2WrSoIjgBgjZo1MweiPggxMq06PDgTqMtCbEIEGFqA4JC0yWOHTRsEIDiuF1CVg\/BwAJEpMyaK7DVz6lA0Nh2Z4\/IwNGzVpyOnAiNCgfoQ8vr7wTgQ4altC4FKrto+LMj9mxnb17Jxb8ZQHtpfvuwab+1FLtkXvXhu\/8ASCmC12bS7GIITUMEISy+fRjoLcF+dRohKxJh34DFP\/QPAatUs0L4YVbSAp693bk\/\/enPzVus+N+AcL4J1+byOhS\/Asj48ii1Nfsg6IFeHAWAEw0CaDOBb3bndEHhwAAACMgxs2rL4OPY+A9CnVQBHLkEA2HURWy9A5ff\/hEGfEXlX9kkEG59NTO8IoOIb7I2VD8vQNAv9OwTwaRgQYCmAhl2XrD\/23sTXgYXNjdkjb0MWVbx9nT7zvh9mOJDDR8\/igHWSLwsC5swx5hxpafhFPF8MAYQZA5pGVbTg2CUIlCUsYFvHvYchoO8XPBkDFlu0tpzG9OeBlhLRMux+2Zcg6toEgCymnd2Jd3NQqSzgWfO9tVb76ycr8W7YtREXxj7G90G9Xk4+MfZPsGhww9y9Mx75wUogpoNwtA42pcl14wtwZwOA59sAIF3lIMJXz5i++QGA8jYAR8\/Dbn0qeR+GLser6t9rcaXlTmKNMOH1N54HUd0CAJPM3Y\/P0DgH\/YwAmmeHAgH2BPAtf9\/HxeWv8WVQ4Vfx69XzUEUDmqyGq9f9aLs5ZVQeF40aDERmDjnzMp1RANeeDRsfmsVp00oQYS4WfwgEni8v5OIpFQVcPDtv\/afh8SwAZ5ruwmIlljW\/DwTZ1xrbGmFmkCaIYbS9WW\/lMHPD++q7dwAk6gHL7BlZF2J28S9ZfdqErikiKnkF7D1IoZ6+lB85t11MOnduLZBz6cGVHmJ3GEDOz6dO52DRnd9rENydjtkjgYGLMOb3uzOx4NyZytDO02fLAPQ8PABiRw7C+6cjZycQ2Jm9MYwJmwV6bAEg9kaBtcViy93DYQDrigBUnzq7N21TOoDsddiQl7EV2DgGu6K56yA2x\/34f\/\/\/91VWUDgg1gwAAFA3AJ0BKqAAoAA+SSKORKKiIZOKNXAoBISzBQtkPf7f4DrRsZeC\/rH7ge1TXv7d+LOL5K52Ifuft6+A\/\/A9gH57\/4XuAfqP+uHWH8wf8w\/rX7Se8n\/qP1V9yX9k\/z3sAf1T\/TetV\/tfYE\/uX+m9gD9c\/TT\/cv4NP7B\/v\/21+A79s\/\/l7AHoAcKX\/eO2\/\/c+JPkohp5Sxm5qtju1GpLLI7+3f8j2BP5R\/evRjzhvXXsFeWl7MvRJ\/cJl+5DNFr4hmbp82dcLK6ObNfEL6Q2QrR4C+7+6Lm3B3xoWE8rT7ZRvxizzxy2GnUye0Lp2l+nPgZXHAtAsx9tD6QY6vt8m7yCaldtCCpTOmgJiU92ea7NhBR\/tOAh2g1nthpvJi1KZcs3f8ihXKRmhgpHPSz7809ZvxZk\/qCoB8yyWea06z5k8fcyqfbA8JeUwJDp92kbymyuO0b+FnxvcgC9UyDOgF4Myt6HJr+IdtHfZsF74CWdEXcyWcEFNC2u0fsv\/R237\/RoQlUdIzOUPEgg7V7f8oea7kHHRp3cVAYhFiYBFXrSy3BJKhqLDb7yLhp2CtRSD+tlvxlYjbtv9EqyHsTrdMz2K4QAA\/v\/gEaAG6AseBqmjBWLXvs0c42m9nnZj7F4UI6YIpKmihnag7X8k92icP09iN4\/2Njo9ZKtOnzlY4nIzCm5zxw4W+A9FdJE0+DoAzuV2fAYKO7NUWzA9ARJE1pRufPijMKw0hhfbwDq+lZWLyp9mhUG91RPcl2iX8DhUSciJuoWeebfyB0LQ9q3GrtY\/mXa0nnwCyaIFc7rSw+337huunU+7wNRNvV\/5OANWcWwoTLPCY+95JWXUXCsnT\/QXUU9\/13zm\/jsH5QOxpG4zyZTX91Rt0k5my02cXOh\/whm9DwXHG9RqTKZvjCcxwwNMV45DAMSFK16xmHSZS7ze\/5Pj+vA7YB\/PWeR4Eswwri6ZgsK1iHASkgW6f3+bEUpFgbIqkq1efxEOYImIFOBim7exdkZrgNlUuEEohPrixdH8\/PzCaAU\/RYWFK6bkQDHYW1v7mEsFQUIwwWK5blujpHJzKnpAR2vQ66M\/QcKb6uy3ezKVK3SnND7kOvzZvEBJ6\/NpINYey83e7DzkSqJ+pO+zykLuNNtYnC\/xMJniazWAzPD8Or3mvebYekn2hiS1Hrz6t5gCev5Z8f5BpeLy\/2\/EBJ0VczyeI48qZe17WJT0VuYwLZTjIAkpBfI5T2FMc68kVYmes6CP3n+ZqMPJ+8XDtXKGRtJ0M56FRAxYuBP4DoycNDz+zDDQEEy\/MlhTHD0WwNYr8FRbcb4i3uZW1F0zr0vLiwGw99VA7yUI32WQMcWO+DbXNYXn\/DRQUoX7zLGt2BfhM0iK5bf767T3JLSR+Y9jeb7zftV60J8Yux+p6xzf2xxk3w33M8j6kJ7mx3UdDxYZwzCnKmGINczV9XyCxUHMQ\/pdI8wryt9ZFFT\/EakAkdVz1T8SOMHt9atxPvMHzmhSL7fLA9LMj5l0TypZvTBJmqHCq\/TeSqmnNKgyrYgDAXWkGEityriT+fD9hrXKDAwTz5TFQIWG1tJjQVWeZCe6rue4GfKOEsXg9\/ftBQED5\/z3hLtrlFrUVe28msJfPrXwIz0yf+eEgj69i0r780BS935K7UHFvOmVPeCUZrZid7svqE5UwprIkmIruENAPvuSpS2XbakjAhOI+qq1hL7\/CI4PR+l2V4cK34QbxlKZcXYdsUDl6QUoRVc2kcV9Pah0v\/ZYuo278ro2q5wPncqk\/MCFegxCf+Cz3PmhYiNcZzqqkJVKS7mhdh5lFOub2Dfd7MrqBGApYpV8O\/\/qoLl3JJNMYiiL2aYydDfnikWtX6a5Z1pbra6PZdQcEZbr1\/BWQZLy8BO3NZG9SHqEer8m1CXTR\/uzmdzsZ7QXItxmBGBA6JpUnBdLUWJ\/GFVg2kCQ1zKYJzSaQmYGBR7T0EbZgcduqjSz5H2ome2nJeZTt4sPshU6Tp1LSnI9GIEkDVVhoUx\/IF\/PQ2qmoUievnA5ElPjJNea4T\/RXXDfliTASnhABzY7Tv+SWpWEDt1dd6neaQwfSwkuhyY6FzUf74PGxNTzn2LSPQydVTT2fhIfl5h4XnoGxlLw4Ly9HmuiLMOEHbw3VLuN3VO84z0OAFCkRI4+ocEqyCdVpmb5vL8a2UeV8yPqPVMxNUA+MEjz2IA7aVcdzkOmot615q6fIg1PwcB5AyPDXMwE5gDTEL9HD0tO335eMXNDQKH56430XvkMPmkojPCUsYVCCmPnRZECFkXo7+kllDlQrkGfXmb+BmoRTfWgi9ld4dk3iK\/unNFJw0xAbz9tkL5lWXhLPS\/Dpqg9+4rHO8uNIj3mPesJVYKqFh9wH7w9SJ6M8\/H3fbTEbJlzlEJAnuDkSUCaT4oYYUq7SEwQwgVj865gqr2HJyVyKaS3OgS\/KA24FCbGoSFQxKNvdzM7cSvrzD4cUgDHNrsj3J9dBhIT9XHvL40Dij3qPTtWXgzAsKUhcGD510FbfYoOmnHh47FnzscHFpV3yGc5UcJJdu+MShHZBSMNxoLPzGpjK1EFKMGPNjx\/4TLQac+HomxCg\/irDQt0gNh+pklWtjqw2STIayc5Amr1g0SDMgRfhKZFMBYuHQ5O0aXLb0ZQQ1ej07mO8J3ffi2da6Ul+mqdIIQH\/tM6gdS\/aSdMorRVWwmBvySZUjfRXIhkzpbG0wga25J81InyBFeSzNKtiRFgK4kEzsZQZg26xcRp4gZ0eKuhjjOeHNE4kI6AwiIr97sSfCRZlRxNvGntHntxsmzF1ZHOYlHHOc54iM4WMc7FqzO1v7p4+4X5dxPu9IwLHm\/LE08BqUxpVAQVk0IMz1vrvj+G86o6y+XD7hxWEyy+071ghgHxpmPlEd5yTV7qczIR44NMTWijjsDG7+NFNziWLbjtn\/NuBMw0v+hrHg3Ah5VWEZeDSvS+TSb6J8fayq0DpRqbAO35wnZtXhx2Ej9rSlp7vKwpxEA65MBUEgwc\/p4Vx770WfvHw87FkWQqwGkcS47pvEP5EWH7rE19f96M7WkOnu1479KXHW0pCpvzwpRWF0eRicz5vG5C+Ft2z1v5hrQxRDRYHoWlWP1xIQNGWkCcS8JjQVk6Q+Ftg137M3MWl1bvWW+jJGcYphcvp36\/nnXVtVR+c6+bhHb+C1xIq5xb02lwU6iMa0z1VT\/XQTYKINkAemj6\/0rNusovDFgI\/4QY380IoLV92YXDtOe84rg3CoT4ua6RmIIMF2tirquRJKt8\/U+e9zrjv6eHxmdDRI49u0lwE93UozBR5ApUGV4RxBWt\/2hYpIDK0Ag+3l7LJyX0yn+Q71GRNdHO97\/7r1bgmWAqMGyccTb77p\/kQCDIaMhSSOksC9J5VNc1ffxFTsSzd0aanCslMKminT9SrwWaEPLaCC1mSkKPx1jidpcgyoWxLYk54knPQcxgUZodDDTQFFhBfAVqx+jAmA2l8UPIXFZ2+jLepKBYUKr3KjEZf2cANSfTp\/VyLMJyPa1rf3zVjpbo5u\/1VH1LpB8rSzuFPve84F9t1hBJez50p304Lv+oiGIeu4ULFkhrtzSwtQrRjmLMONI\/3as2Salo0zaWqq1f\/8jTzTkW8g1\/QyvRH\/id3cFC9GcGY2HdgOpzplJIIGL+2o8wZxxO1+T0Q44tattrpG8gY9sIvEEZw5Zsco\/qPCgHXeWa2p97S6tsdfmbvW2d2XR5MP54j73sl21hqBV8fFcJFtBYOuIEL0gET4YQmNdVbZKg+XX60Ron23XwH6J7b+K10zGb85ohJ6mBsBfkzu1b+4sfvnJppHDqkYyhT7Si2tsT0MsW6+sc2PYR0rPHiDAO0RQcTH6vNcXe1e7WE\/vp0hMtCL6cAfAOEI\/aLBnFPw426ZmqY6rmded2M3mRVlwTzvh4jZgl\/EWCxHUs8QNOy+YzvLi4\/XIx34x\/Vr74tvfU8clj+oBmEsbusPqCS28QwODZPBBqjuS6wLWYnZuQTUHUnO8ppGqw8WtqjDEXRcYL88bj3Wcj47RSnqzyHPY9vfN0yASAdpnv8zz0FPMQK4XsiHuIPQ+lcBTg9wgk\/58asXXtAabFltcDwLTd51x0AvIEYLDlp3hltQcCsXW+XPMVFouB6NNJLy6l+uau02GFMcSJl0iKty\/3fIq58+5X1lwfAUYd9jve+oKZMV+aHmgU1e1eoISNyGsDdANcb+8yzsi0PlXhoexoWh6WcLl+nJ65KF3wnYVCMEU2GmW7g0yeTL977RqxWnzbo6LoD3Ldxe0K3NWcuY73Ne7dgudT+cw6m1FXrI8RevqXxB7bu7z0Z5\/To\/yYK88TfWR58V0QeTSzkxSo7AAAAAAAAAA=\",\r\n        };\r\n\r\n        \/\/ Pr\u00eat\u00e9s \u00e0 la carte, pour la m\u00eame raison que le corpus : ses fiches\r\n        \/\/ sont les m\u00eames, elles montrent donc les m\u00eames logos.\r\n        window.__fisLogos = LOGOS;\r\n\r\n        \/\/ Initiales de repli : deux lettres au plus, prises sur les mots qui\r\n        \/\/ nomment vraiment la structure. Un sigle d\u00e9j\u00e0 \u00e9crit en capitales\r\n        \/\/ (PAIS, ACT) se suffit \u00e0 lui-m\u00eame et n'est pas red\u00e9coup\u00e9.\r\n        var LOGO_VIDES = { \"de\":1, \"du\":1, \"des\":1, \"la\":1, \"le\":1, \"les\":1,\r\n            \"l\":1, \"d\":1, \"et\":1, \"en\":1, \"association\":1, \"asso\":1, \"cie\":1,\r\n            \"compagnie\":1, \"centre\":1, \"union\":1 };\r\n\r\n        function logoKey(nom){\r\n            return (nom || \"\").normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\")\r\n                .toLowerCase().replace(\/[^a-z0-9]+\/g, \"\");\r\n        }\r\n        function logoSrc(nom){\r\n            var v = LOGOS[logoKey(nom)];\r\n            if (typeof v === \"string\" && v.slice(0, 5) !== \"data:\") v = LOGOS[v];\r\n            return (typeof v === \"string\" && v.slice(0, 5) === \"data:\") ? v : null;\r\n        }\r\n        function logoMonogramme(nom){\r\n            var brut = (nom || \"\").replace(\/[^A-Za-z\\u00C0-\\u024F]+\/g, \" \").trim();\r\n            if (!brut) return \"?\";\r\n            var sigle = brut.split(\" \")[0];\r\n            if (sigle.length > 1 && sigle === sigle.toUpperCase()) return sigle.slice(0, 2);\r\n            var mots = brut.split(\" \").filter(function(m){\r\n                return m.length > 1 && !LOGO_VIDES[m.toLowerCase()];\r\n            });\r\n            if (!mots.length) mots = brut.split(\" \");\r\n            \/\/ Toujours deux capitales : \u00ab La Caravelle \u00bb ne laisse qu'un mot\r\n            \/\/ utile, et un \u00ab C \u00bb seul dans la pastille p\u00e8se deux fois moins\r\n            \/\/ que les \u00ab AC \u00bb et \u00ab MU \u00bb de la fiche d'\u00e0 c\u00f4t\u00e9.\r\n            if (mots.length === 1) return mots[0].slice(0, 2).toUpperCase();\r\n            return mots.slice(0, 2).map(function(m){ return m.charAt(0).toUpperCase(); }).join(\"\");\r\n        }\r\n        \/\/ La pastille est toujours l\u00e0, avec ou sans logo : c'est elle qui tient\r\n        \/\/ l'alignement de la t\u00eate de fiche. Le logo identifie le porteur, d'o\u00f9\r\n        \/\/ le alt ; le monogramme, lui, ne dit rien de plus que le titre juste \u00e0\r\n        \/\/ c\u00f4t\u00e9, donc il est masqu\u00e9 aux lecteurs d'\u00e9cran.\r\n        function ficheLogoHTML(porteur){\r\n            var src = logoSrc(porteur);\r\n            if (src) {\r\n                \/\/ Pas de loading=\"lazy\" : l'image est d\u00e9j\u00e0 dans la page, il n'y\r\n                \/\/ a rien \u00e0 aller chercher, et diff\u00e9rer sa peinture ferait\r\n                \/\/ clignoter la pastille \u00e0 chaque ouverture de fiche.\r\n                return '<div class=\"detail-logo\"><img src=\"' + src + '\" alt=\"Logo '\r\n                    + escapeHTML(porteur) + '\" decoding=\"async\"><\\\/div>';\r\n            }\r\n            return '<div class=\"detail-logo detail-logo--mono\" aria-hidden=\"true\"><b>'\r\n                + escapeHTML(logoMonogramme(porteur)) + '<\\\/b><\\\/div>';\r\n        }\r\n\r\n        \/\/ ---- Les trois promesses, dans la fiche ----\r\n        \/\/ Elles \u00e9taient jusqu'ici dans un fichier \u00e0 part. Les poser ici,\r\n        \/\/ au-dessus des moyens, met la fiche dans l'ordre o\u00f9 on la raconte :\r\n        \/\/ ce que le projet est, ce qu'il promet, ce qu'il a co\u00fbt\u00e9 et d\u00e9ploy\u00e9,\r\n        \/\/ ce qu'il a produit, ce qui l'a frein\u00e9. Une promesse muette n'est pas\r\n        \/\/ cach\u00e9e : son absence est une information sur le r\u00e9cit du porteur,\r\n        \/\/ pas sur son action.\r\n        function fichePromessesHTML(p){\r\n            var lignes = PROMESSES.map(function(pr){\r\n                var muet = !p.docs[pr.key];\r\n                return '<li class=\"pr-item rev' + (muet ? ' is-none' : '') + '\"'\r\n                    + ' style=\"--pc:' + pr.color + ';--pc-text:' + pr.textColor + '\">'\r\n                    + '<p class=\"pr-head\"><span class=\"pr-dot\" aria-hidden=\"true\"><\\\/span>'\r\n                    + escapeHTML(pr.label) + '<\\\/p>'\r\n                    + '<p class=\"pr-phrase\">' + escapeHTML(pr.phrase) + '<\\\/p>'\r\n                    + (muet\r\n                        ? '<p class=\"detail-empty\">Non document\u00e9e par cette structure.<\\\/p>'\r\n                        : '<div class=\"pr-text detail-prose\">' + descriptionHTML(p[pr.key], false) + '<\\\/div>')\r\n                    + '<\\\/li>';\r\n            }).join(\"\");\r\n            return '<p class=\"pr-score\">' + p.score + ' promesse'\r\n                + (p.score > 1 ? 's' : '') + ' sur 3 racont\u00e9e'\r\n                + (p.score > 1 ? 's' : '') + ' par le porteur<\\\/p>'\r\n                + '<ul class=\"detail-promesses\">' + lignes + '<\\\/ul>';\r\n        }\r\n\r\n        function openDetail(d){\r\n            if (!detail.contains(document.activeElement)) detailReturnFocus = document.activeElement;\r\n            highlight(null);\r\n            var p = d.data.projet;\r\n            var pctNum = p.fisNum !== null && p.budgetNum > 0 ? p.fisNum \/ p.budgetNum * 100 : null;\r\n            var pct = pctNum === null ? \"Non renseign\u00e9e\" : Math.round(pctNum) + \" %\";\r\n            var html = '<div class=\"detail-toolbar\">'\r\n                + '<span class=\"detail-theme\"><span class=\"legend-dot\"><\\\/span>' + escapeHTML(d.data.themeLabel) + '<\\\/span>'\r\n                + '<div class=\"detail-controls\"><button class=\"detail-expand\" type=\"button\" aria-label=\"Agrandir la fiche\" aria-pressed=\"false\" title=\"Agrandir la fiche\">'\r\n                + '<svg viewBox=\"0 0 20 20\" width=\"15\" height=\"15\" fill=\"none\" aria-hidden=\"true\"><path d=\"M7 3H3v4m10-4h4v4M3 13v4h4m10-4v4h-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\\\/svg><\\\/button>'\r\n                + '<button class=\"detail-close\" type=\"button\" aria-label=\"Fermer la fiche\">&times;<\\\/button><\\\/div><\\\/div>'\r\n                + '<nav class=\"detail-nav\" aria-label=\"Rubriques de la fiche\">'\r\n                + '<button type=\"button\" data-section=\"fiche-moyens\" aria-current=\"location\">D\u00e9ploiement<\\\/button>'\r\n                + '<button type=\"button\" data-section=\"fiche-projet\">Le projet<\\\/button>'\r\n                + '<button type=\"button\" data-section=\"fiche-promesses\">Promesses<\\\/button>'\r\n                + '<button type=\"button\" data-section=\"fiche-impact\">Impacts<\\\/button>'\r\n                + '<button type=\"button\" data-section=\"fiche-freins\">Freins<\\\/button><\\\/nav>'\r\n                + '<div class=\"detail-body\" tabindex=\"0\" aria-label=\"Contenu de la fiche\">'\r\n                + '<header class=\"detail-hero\"><p class=\"detail-eyebrow\">Fiche projet <span>FIS \u00b7 2025<\\\/span><\\\/p>'\r\n                + '<div class=\"detail-ident\">' + ficheLogoHTML(p.porteur || p.projet)\r\n                + '<div class=\"detail-ident-text\">'\r\n                + '<h2 class=\"detail-title\" id=\"detail-project-title\">' + escapeHTML(p.porteur || p.projet) + '<\\\/h2>'\r\n                + '<p class=\"detail-project-name\">' + escapeHTML(p.projet) + '<\\\/p>'\r\n                + '<\\\/div><\\\/div>'\r\n                + (!isNR(p.territoire) ? '<p class=\"detail-territory\"><svg width=\"15\" height=\"18\" viewBox=\"0 0 20 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M17 9c0 5-7 12-7 12S3 14 3 9a7 7 0 1 1 14 0Z\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><circle cx=\"10\" cy=\"9\" r=\"2.3\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\\\/svg><span>' + escapeHTML(p.territoire) + '<\\\/span><\\\/p>' : '')\r\n                + ((p.sousThemes && p.sousThemes.length)\r\n                    ? '<details class=\"detail-topics\"><summary>Sous-th\u00e9matiques <span>' + p.sousThemes.length + '<\\\/span><\\\/summary><ul>'\r\n                        + p.sousThemes.map(function(topic){return '<li>' + escapeHTML(topic) + '<\\\/li>';}).join('') + '<\\\/ul><\\\/details>' : '')\r\n                + '<\\\/header>'\r\n                + '<section class=\"detail-section is-lead\" id=\"fiche-moyens\" tabindex=\"-1\" aria-label=\"Financement et d\u00e9ploiement\">'\r\n                + sectionHeading(\"01\", \"Financement & d\u00e9ploiement\")\r\n                + '<div class=\"fin-card\">'\r\n                + jaugeHTML(pctNum, PART_MEDIANE, d.data.themeLabel)\r\n                + budgetHTML(p)\r\n                + '<\\\/div>'\r\n                + personnesHTML(p)\r\n                + '<div class=\"detail-bubbles\">'\r\n                + inventaireHTML(p)\r\n                + inventaireHTML(p, \"invPartenaires\", \"nbPartenaires\", \"Partenaires mobilis\u00e9s\")\r\n                + '<\\\/div><\\\/section>'\r\n                + '<section class=\"detail-section\" id=\"fiche-projet\" tabindex=\"-1\" aria-label=\"Le projet\">'\r\n                + sectionHeading(\"02\", \"Le projet\")\r\n                + '<div class=\"detail-prose detail-summary\">' + descriptionHTML(p.resume, false) + '<\\\/div><\\\/section>'\r\n                + '<section class=\"detail-section\" id=\"fiche-promesses\" tabindex=\"-1\" aria-label=\"Les trois promesses du fonds\">'\r\n                + sectionHeading(\"03\", \"Les trois promesses\")\r\n                + '<p class=\"detail-section-intro\">Am\u00e9liorer, \u00e9manciper, r\u00e9v\u00e9ler : les trois promesses du fonds, telles que cette structure les raconte dans son rapport.<\\\/p>'\r\n                + fichePromessesHTML(p) + '<\\\/section>'\r\n                + '<section class=\"detail-section\" id=\"fiche-impact\" tabindex=\"-1\" aria-label=\"Impacts document\u00e9s\">'\r\n                + sectionHeading(\"04\", \"Impacts document\u00e9s\")\r\n                + ficheFloraHTML(p) + '<\\\/section>'\r\n                + '<section class=\"detail-section\" id=\"fiche-freins\" tabindex=\"-1\" aria-label=\"Freins rencontr\u00e9s\">'\r\n                + sectionHeading(\"05\", \"Freins rencontr\u00e9s\") + ficheFreinsHTML(p) + '<\\\/section>'\r\n                + '<footer class=\"detail-confid\"><strong>\u00c0 propos de cette fiche<\\\/strong><p>' + CONFID_TEXTE + '<\\\/p>'\r\n                + '<p class=\"detail-data-note\">Une information non renseign\u00e9e ne signifie pas une absence d\u2019action ou d\u2019impact.<\\\/p><\\\/footer><\\\/div>';\r\n\r\n            pathSel.classed(\"is-selected\", function(n){ return n === d; });\r\n            detail.style.setProperty(\"--theme-color\", d.data.themeColor);\r\n            detail.style.setProperty(\"--theme-color-text\", d.data.themeColorText);\r\n            clearTimeout(detailClearTimer);\r\n            detail.classList.remove(\"is-expanded\");\r\n            detail.innerHTML = html;\r\n            detail.inert = false;\r\n            detail.setAttribute(\"aria-hidden\", \"false\");\r\n            detail.classList.add(\"is-open\");\r\n            var detailBody = detail.querySelector(\".detail-body\");\r\n            detailBody.scrollTop = 0;\r\n            armeApparitions(detailBody);\r\n            detail.querySelector(\".detail-expand\").addEventListener(\"click\", function(){\r\n                var expanded = detail.classList.toggle(\"is-expanded\");\r\n                this.setAttribute(\"aria-pressed\", expanded ? \"true\" : \"false\");\r\n                this.setAttribute(\"aria-label\", expanded ? \"R\u00e9duire la fiche\" : \"Agrandir la fiche\");\r\n                this.title = expanded ? \"R\u00e9duire la fiche\" : \"Agrandir la fiche\";\r\n                recaleDisque();\r\n            });\r\n            var sectionButtons = detail.querySelectorAll(\".detail-nav button\");\r\n            sectionButtons.forEach(function(btn){\r\n                btn.addEventListener(\"click\", function(){\r\n                    var section = detail.querySelector(\"#\" + this.dataset.section);\r\n                    detailBody.scrollTo({top:section.offsetTop - 20, behavior:reducedMotion.matches ? \"auto\" : \"smooth\"});\r\n                });\r\n            });\r\n            function updateDetailNavigation(){\r\n                var active = \"fiche-moyens\";\r\n                detail.querySelectorAll(\".detail-section\").forEach(function(section){\r\n                    if (section.offsetTop <= detailBody.scrollTop + 80) active = section.id;\r\n                });\r\n                if (detailBody.scrollHeight - detailBody.clientHeight - detailBody.scrollTop < 8) active = \"fiche-freins\";\r\n                sectionButtons.forEach(function(btn){\r\n                    if (btn.dataset.section === active) btn.setAttribute(\"aria-current\", \"location\");\r\n                    else btn.removeAttribute(\"aria-current\");\r\n                });\r\n            }\r\n            detailBody.addEventListener(\"scroll\", updateDetailNavigation, {passive:true});\r\n            updateDetailNavigation();\r\n            detail.querySelector(\".detail-close\").addEventListener(\"click\", closeDetail);\r\n            detail.querySelector(\".detail-close\").focus({preventScroll:true});\r\n            armeVolets(detail, \"fiche-rubrique-\");\r\n            requestAnimationFrame(recaleDisque);\r\n        }\r\n\r\n        \/\/ ---- Les cartes d'impacts et de freins ----\r\n        \/\/ Un seul volet ouvert \u00e0 la fois dans toute la fiche, sinon elle\r\n        \/\/ devient un mur de texte au troisi\u00e8me clic. Seules les cartes qui ont\r\n        \/\/ un texte sont des boutons ; les autres restent hors du jeu. La carte\r\n        \/\/ se d\u00e9plie muette et le texte se pose une fois qu'elle est ouverte\r\n        \/\/ (voir la feuille de style). \u00ab Lire \u00bb ne change pas : c'est le\r\n        \/\/ chevron qui se retourne.\r\n        \/\/ Survoler une carte allume sa couche dans l'embl\u00e8me et son segment\r\n        \/\/ dans la barre, les autres s'effacent ; au clavier, le focus fait de\r\n        \/\/ m\u00eame. Une carte sans couche (non renseign\u00e9e) n'\u00e9teint rien.\r\n        function armeVolets(racine, prefixe){\r\n            var volets = racine.querySelectorAll(\"button.imp-head\");\r\n            volets.forEach(function(btn, index){\r\n                var ligne = btn.parentNode;\r\n                var corps = ligne.querySelector(\".imp-body\");\r\n                corps.id = prefixe + index;\r\n                btn.setAttribute(\"aria-controls\", corps.id);\r\n                btn.addEventListener(\"click\", function(){\r\n                    var ouvrir = btn.getAttribute(\"aria-expanded\") !== \"true\";\r\n                    volets.forEach(function(o){\r\n                        o.setAttribute(\"aria-expanded\", \"false\");\r\n                        o.parentNode.classList.remove(\"is-open\");\r\n                    });\r\n                    if (ouvrir){\r\n                        btn.setAttribute(\"aria-expanded\", \"true\");\r\n                        ligne.classList.add(\"is-open\");\r\n                    }\r\n                });\r\n            });\r\n            racine.querySelectorAll(\".imp\").forEach(function(bloc){\r\n                function eclaire(k){\r\n                    var trouve = false;\r\n                    bloc.querySelectorAll(\".imp-couche, .imp-seg\").forEach(function(el){\r\n                        var lui = !!k && el.getAttribute(\"data-k\") === k;\r\n                        el.classList.toggle(\"is-lit\", lui);\r\n                        if (lui && el.classList.contains(\"imp-couche\")) trouve = true;\r\n                    });\r\n                    bloc.classList.toggle(\"is-lit\", trouve);\r\n                }\r\n                bloc.querySelectorAll(\".imp-row[data-k]\").forEach(function(ligne){\r\n                    var k = ligne.getAttribute(\"data-k\");\r\n                    ligne.addEventListener(\"pointerenter\", function(e){ if (e.pointerType !== \"touch\") eclaire(k); });\r\n                    ligne.addEventListener(\"pointerleave\", function(){ eclaire(null); });\r\n                    ligne.addEventListener(\"focusin\", function(e){\r\n                        var clavier = true;\r\n                        try { clavier = e.target.matches(\":focus-visible\"); } catch (err) {}\r\n                        if (clavier) eclaire(k);\r\n                    });\r\n                    ligne.addEventListener(\"focusout\", function(){ eclaire(null); });\r\n                });\r\n            });\r\n        }\r\n\r\n        var CONFID_TEXTE = \"Confidentialit\u00e9 : cette fiche pr\u00e9sente une description synth\u00e9tique du projet (th\u00e9matique, objectif, public). Les modalit\u00e9s pr\u00e9cises de mise en \u0153uvre et toute donn\u00e9e permettant d'identifier des personnes en sont volontairement exclues.\";\r\n\r\n        function stat(value, label, empty){\r\n            return '<div class=\"detail-stat' + (empty ? ' is-empty' : '') + '\"><span>' + escapeHTML(label) + '<\\\/span><b>' + escapeHTML(value) + '<\\\/b><\\\/div>';\r\n        }\r\n        \/\/ Les moyens ouvrent la fiche : avant de lire le projet, on voit ce\r\n        \/\/ qu'il a re\u00e7u, ce qu'il a co\u00fbt\u00e9 et ce qu'il a d\u00e9ploy\u00e9. Sous forme de\r\n        \/\/ bulles, la ligne se parcourt d'un coup d'oeil et accepte aussi bien\r\n        \/\/ un montant qu'une phrase courte. Un champ vide reste une bulle :\r\n        \/\/ son silence fait partie de ce que dit la fiche.\r\n        function bulle(value, label, empty, fort){\r\n            var v = String(value == null ? \"\" : value).replace(\/\\s*\\n+\\s*\/g, \" \u00b7 \").replace(\/\\s+\/g, \" \").trim();\r\n            var longue = v.length > 34;\r\n            return '<div class=\"detail-bubble rev' + (empty ? ' is-empty' : '') + (fort ? ' is-key' : '')\r\n                + (longue ? ' is-long' : '') + '\"'\r\n                + (longue ? ' title=\"' + escapeHTML(v) + '\"' : '') + '>'\r\n                + '<span class=\"db-key\">' + escapeHTML(label) + '<\\\/span>'\r\n                + '<b class=\"db-val\">' + escapeHTML(empty ? \"Non renseign\u00e9\" : v) + '<\\\/b><\\\/div>';\r\n        }\r\n        \/\/ ---- Les actions, en inventaire ----\r\n        \/\/ La colonne \u00ab Nb actions \/ \u00e9v\u00e9nements \u00bb est une prise de notes\r\n        \/\/ d'analyste (\u00ab 144j CVI+HHNS Festival+107 FNE \u00bb) ou un paragraphe que\r\n        \/\/ la bulle coupait \u00e0 quatre lignes. L'inventaire la r\u00e9\u00e9crit pour un\r\n        \/\/ lecteur : une \u00e0 trois lignes \u00ab nombre + nom en toutes lettres \u00bb,\r\n        \/\/ s\u00e9par\u00e9es par des points-virgules dans la cellule. Le nombre passe\r\n        \/\/ dans sa colonne, une ligne sans nombre prend une puce. Aucun total\r\n        \/\/ n'est calcul\u00e9 : des jours, des arbres et des paniers ne s'additionnent\r\n        \/\/ pas. Quand aucune ligne n'est chiffr\u00e9e, la carte le dit (\u00ab Non\r\n        \/\/ chiffr\u00e9 \u00bb) : on sait ce qui a \u00e9t\u00e9 fait, pas combien de fois, et ce\r\n        \/\/ n'est pas un champ vide. Sans inventaire, l'ancienne bulle reprend.\r\n        function inventaireHTML(p, cle, repli, label){\r\n            cle = cle || \"inventaire\"; repli = repli || \"actions\"; label = label || \"Actions & \u00e9v\u00e9nements\";\r\n            var brut = String(p[cle] == null ? \"\" : p[cle]).replace(\/\\s+\/g, \" \").trim();\r\n            if (!brut) return bulle(p[repli], label, isNR(p[repli]));\r\n            if (isNR(brut)) return bulle(\"\", label, true);\r\n            var lignes = brut.split(\/\\s*;\\s*\/).filter(Boolean).map(function(t){\r\n                var m = t.match(\/^(?:([\u2248~]) ?)?((?:\\d{1,3}(?: \\d{3})+|\\d+)(?:,\\d+)?\\+?) (.+)$\/);\r\n                return m ? {n: (m[1] ? \"\u2248\u202f\" : \"\") + m[2].replace(\/ \/g, \"\u202f\"), l: m[3]} : {n: \"\", l: t};\r\n            });\r\n            var chiffre = lignes.some(function(x){ return x.n; });\r\n            return '<div class=\"detail-bubble detail-inv rev\">'\r\n                + '<span class=\"db-key\">' + escapeHTML(label) + '<\\\/span>'\r\n                + (chiffre ? '' : '<span class=\"inv-nc\">Non chiffr\u00e9<\\\/span>')\r\n                + '<ul class=\"inv\">' + lignes.map(function(x){\r\n                    return '<li>' + (x.n\r\n                            ? '<b class=\"inv-n\">' + escapeHTML(x.n) + '<\\\/b> '\r\n                            : '<b class=\"inv-n is-puce\" aria-hidden=\"true\">\u2022<\\\/b> ')\r\n                        + '<span class=\"inv-l\">' + escapeHTML(x.l.replace(\/(\\d) (?=\\d{3}(?!\\d))\/g, \"$1\u202f\")) + '<\\\/span><\\\/li>';\r\n                }).join(\"\") + '<\\\/ul><\\\/div>';\r\n        }\r\n        \/\/ ---- Apparition au d\u00e9filement ----\r\n        \/\/ Les jauges se remplissent quand elles entrent dans le champ, pas \u00e0\r\n        \/\/ l'ouverture de la fiche : une barre qui s'est anim\u00e9e trois \u00e9crans\r\n        \/\/ plus bas n'a \u00e9t\u00e9 vue par personne. L'observateur est recr\u00e9\u00e9 \u00e0 chaque\r\n        \/\/ fiche puisque le corps est r\u00e9\u00e9crit. Sans IntersectionObserver, ou si\r\n        \/\/ la personne demande moins de mouvement, la classe n'est jamais\r\n        \/\/ pos\u00e9e : tout s'affiche d'embl\u00e9e, immobile \u2014 rien ne d\u00e9pend de\r\n        \/\/ l'animation pour \u00eatre lisible.\r\n        var revealObs = null;\r\n        function armeApparitions(body){\r\n            if (revealObs){ revealObs.disconnect(); revealObs = null; }\r\n            body.classList.remove(\"js-reveal\");\r\n            if (!(\"IntersectionObserver\" in window) || reducedMotion.matches) return;\r\n            var cibles = body.querySelectorAll(\".rev\");\r\n            if (!cibles.length) return;\r\n            body.classList.add(\"js-reveal\");\r\n            revealObs = new IntersectionObserver(function(entrees){\r\n                entrees.forEach(function(e){\r\n                    if (!e.isIntersecting) return;\r\n                    e.target.classList.add(\"is-in\");\r\n                    revealObs.unobserve(e.target);\r\n                });\r\n            }, { root: body, rootMargin: \"0px 0px -6% 0px\", threshold: 0.12 });\r\n            cibles.forEach(function(c){ revealObs.observe(c); });\r\n        }\r\n\r\n        var detailClearTimer, detailReturnFocus;\r\n        function closeDetail(){\r\n            var etaitOuverte = detail.classList.contains(\"is-open\");\r\n            var restoreFocus = detail.contains(document.activeElement);\r\n            if (pathSel) pathSel.classed(\"is-selected\", false);\r\n            document.querySelectorAll(\"#reu-roue-wp .fg-card.is-selected\").forEach(function(o){\r\n                o.classList.remove(\"is-selected\");\r\n            });\r\n            detail.inert = true;\r\n            detail.setAttribute(\"aria-hidden\", \"true\");\r\n            detail.classList.remove(\"is-open\");\r\n            if (restoreFocus){\r\n                var returnTo = detailReturnFocus && detailReturnFocus.isConnected && detailReturnFocus !== document.body\r\n                    ? detailReturnFocus : (isFleurs() ? document.querySelector('.toggle-btn.active') : centerGroup.select(\"circle\").node());\r\n                if (returnTo) returnTo.focus({preventScroll:true});\r\n            }\r\n            clearTimeout(detailClearTimer);\r\n            detailClearTimer = setTimeout(function(){ if (!detail.classList.contains(\"is-open\")) detail.innerHTML = \"\"; }, motion(480));\r\n            \/\/ Seule la fermeture d'une fiche R\u00c9ELLEMENT ouverte rend de la\r\n            \/\/ largeur au disque. Or on passe ici \u00e0 chaque clic sur une\r\n            \/\/ th\u00e9matique, fiche ouverte ou non : redessiner \u00e0 chaque fois\r\n            \/\/ relan\u00e7ait une remise en page compl\u00e8te une image apr\u00e8s le d\u00e9but du\r\n            \/\/ zoom, en pleine animation.\r\n            if (etaitOuverte) requestAnimationFrame(recaleDisque);\r\n        }\r\n\r\n        \/\/ Redessine sans animation apr\u00e8s un changement de largeur utile.\r\n        \/\/ paintLabel doit \u00eatre rappel\u00e9 ici : ouvrir\/fermer la fiche change la\r\n        \/\/ largeur du disque (donc l'\u00e9paisseur des anneaux), et un libell\u00e9\r\n        \/\/ mesur\u00e9 pour l'ancienne taille d\u00e9borde de son arc \u00e0 la nouvelle.\r\n        \/\/ ---- Le disque se range, il ne saute pas -------------------------\r\n        \/\/ Quand la fiche s'ouvre, le disque doit gagner sa nouvelle place en\r\n        \/\/ glissant : on mesure la cible, on revient \u00e0 l'\u00e9tat d'avant, et on\r\n        \/\/ interpole rayon et centre. Le texte, lui, ne voyage jamais : les\r\n        \/\/ libell\u00e9s s'\u00e9teignent au d\u00e9part et se reposent \u00e0 l'arriv\u00e9e, sur une\r\n        \/\/ g\u00e9om\u00e9trie immobile \u2014 c'est la m\u00eame r\u00e8gle que pour le zoom.\r\n        var recaleTimer = null;\r\n        function recaleDisque(){\r\n            clearTimeout(recaleTimer);\r\n            glisseDisque();\r\n            \/\/ La fiche entre en glissant et son \u00e9largissement dure 0,4 s : la\r\n            \/\/ mesure prise \u00e0 la premi\u00e8re image porte encore sur une position\r\n            \/\/ de passage. On repasse donc une fois qu'elle est pos\u00e9e.\r\n            recaleTimer = setTimeout(glisseDisque, motion(700) + 40);\r\n        }\r\n\r\n        function glisseDisque(){\r\n            if (!pathSel) return;\r\n            var depart = { radius: radius, innerR: innerR, label: LABEL_MAX, cx: gCx, cy: gCy };\r\n            computeSize();\r\n            var cible = { radius: radius, innerR: innerR, label: LABEL_MAX, cx: gCx, cy: gCy };\r\n            var ecart = Math.abs(cible.radius - depart.radius) + Math.abs(cible.cx - depart.cx)\r\n                + Math.abs(cible.cy - depart.cy);\r\n            \/\/ Rien n'a boug\u00e9, ou le mouvement est d\u00e9sactiv\u00e9 : on pose, point.\r\n            if (ecart < 1 || reducedMotion.matches){ redrawStatic(); return; }\r\n\r\n            var zoomEnCours = g.classed(\"is-moving\");\r\n            var pose = function(e){ radius = e.radius; innerR = e.innerR; LABEL_MAX = e.label;\r\n                g.attr(\"transform\", \"translate(\" + e.cx + \",\" + e.cy + \")\"); gCx = e.cx; gCy = e.cy; };\r\n            pose(depart);\r\n\r\n            \/\/ Pendant le trajet : pas de libell\u00e9s, pas d'ornements. Ils\r\n            \/\/ reviennent en fondu une fois le disque arr\u00eat\u00e9.\r\n            labelsGroup.interrupt(\"recale\").transition(\"recale\")\r\n                .duration(motion(170)).attr(\"opacity\", 0);\r\n            if (centerLabel) centerLabel.interrupt(\"recale\").transition(\"recale\")\r\n                .duration(motion(170)).attr(\"opacity\", 0);\r\n            ornamentGroup.interrupt(\"recale\").transition(\"recale\")\r\n                .duration(motion(170)).attr(\"opacity\", 0);\r\n            if (!zoomEnCours) g.classed(\"is-moving\", true);\r\n\r\n            var i = d3.interpolate(depart, cible);\r\n            svg.interrupt(\"recale\").transition(\"recale\")\r\n                .duration(motion(620)).ease(d3.easeCubicInOut)\r\n                .tween(\"recale\", function(){\r\n                    return function(t){\r\n                        pose(i(t));\r\n                        \/\/ Si un zoom tourne en m\u00eame temps, c'est lui qui\r\n                        \/\/ redessine les arcs image par image, sur le rayon\r\n                        \/\/ qu'on vient de poser : inutile d'y repasser.\r\n                        if (!zoomEnCours) pathSel.attr(\"d\", function(d){ return arc(d.current); });\r\n                        centerGroup.select(\"circle\").attr(\"r\", innerR - 8);\r\n                    };\r\n                })\r\n                .on(\"end\", function(){\r\n                    pose(cible);\r\n                    if (!zoomEnCours) g.classed(\"is-moving\", false);\r\n                    drawOrnaments();\r\n                    redrawStatic();\r\n                    labelsGroup.transition(\"recale\").duration(motion(300)).attr(\"opacity\", 1);\r\n                    if (centerLabel) centerLabel.transition(\"recale\").duration(motion(300)).attr(\"opacity\", 1);\r\n                    ornamentGroup.transition(\"recale\").duration(motion(400)).attr(\"opacity\", 1);\r\n                })\r\n                .on(\"interrupt\", function(){\r\n                    labelsGroup.attr(\"opacity\", 1);\r\n                    if (centerLabel) centerLabel.attr(\"opacity\", 1);\r\n                    ornamentGroup.attr(\"opacity\", 1);\r\n                });\r\n        }\r\n\r\n        function redrawStatic(){\r\n            pathSel.attr(\"d\", function(d){ return arc(d.current); });\r\n            centerGroup.select(\"circle\").attr(\"r\", innerR - 8);\r\n            drawRoseGrid();\r\n            updateCenterLabel();\r\n            \/\/ Si un zoom est en cours, la roue se redessine d\u00e9j\u00e0 image par\r\n            \/\/ image et c'est end.solde qui remettra les libell\u00e9s en page \u00e0\r\n            \/\/ l'arriv\u00e9e, \u00e0 la bonne taille. Les recalculer ici les mesurerait\r\n            \/\/ sur une g\u00e9om\u00e9trie de passage et, pour ceux qui sont en train de\r\n            \/\/ quitter le champ, les viderait au milieu de leur fondu.\r\n            if (g.classed(\"is-moving\")) return;\r\n            \/\/ Le coeur s'\u00e9teint le temps d'un zoom : si l'on redimensionne ou\r\n            \/\/ change de vue entre-temps, personne d'autre ne le rallumerait.\r\n            if (centerLabel) centerLabel.interrupt(\"centre\").attr(\"opacity\", 1);\r\n            labelSel.call(paintLabel)\r\n                .attr(\"transform\", function(d){ return labelTransform(d.current, d); })\r\n                .attr(\"opacity\", function(d){ return labelFits(d, d.current) ? 1 : 0; });\r\n        }\r\n\r\n        \/\/ ============ 9. L\u00c9GENDE + KPI ============\r\n        function renderLegend(){\r\n            var list = document.getElementById(\"legend-list\");\r\n            var radar = isRadar();\r\n            \/\/ Freins et Fleurs se filtrent par th\u00e9matique, la roue s'y zoome :\r\n            \/\/ la l\u00e9gende change de r\u00f4le, d'o\u00f9 les deux drapeaux distincts.\r\n            var filtre = isScoped();\r\n            var ttl = document.querySelector(\"#reu-roue-wp .legend-title\");\r\n            if (ttl) ttl.textContent = filtre ? \"Filtrer par th\u00e9matique\" : \"Th\u00e9matiques\";\r\n            \/\/ En mode filtre, une entr\u00e9e explicite pour tout remontrer. Le\r\n            \/\/ seul moyen de lever le filtre \u00e9tait de recliquer la th\u00e9matique\r\n            \/\/ d\u00e9j\u00e0 choisie : invisible dans une liste, impossible \u00e0 deviner\r\n            \/\/ dans un menu repli\u00e9.\r\n            var tout = filtre\r\n                ? '<li><button class=\"legend-item legend-all' + (radarScope ? '' : ' is-on')\r\n                    + '\" type=\"button\" data-theme=\"\">Toutes les th\u00e9matiques<\\\/button><\\\/li>'\r\n                : '';\r\n            list.innerHTML = tout + THEMES.map(function(t){\r\n                var projs = byTheme.get(t.key) || [];\r\n                \/\/ Sur l'onglet Freins, le compteur devient \u00ab projets avec frein \u00bb.\r\n                var n = radar\r\n                    ? projs.filter(function(p){ return p.freinSet.length > 0; }).length\r\n                    : projs.filter(function(p){ return documented(p); }).length;\r\n                var active = filtre && radarScope === t.key;\r\n                return '<li><button class=\"legend-item' + (active ? ' is-on' : '') + '\" type=\"button\" data-theme=\"' + escapeHTML(t.key) + '\"'\r\n                    + ' title=\"' + n + ' projet(s) sur ' + projs.length\r\n                    + (radar ? ' documentent un frein' : ' renseignent au moins une dimension d\u2019impact') + '\">'\r\n                    + '<span class=\"legend-dot\" style=\"--dot-color:' + t.color + '\"><\\\/span>'\r\n                    + escapeHTML(t.label)\r\n                    + '<span class=\"legend-count\">' + n + '\/' + projs.length + '<\\\/span><\\\/button><\\\/li>';\r\n            }).join(\"\");\r\n\r\n            \/\/ Le d\u00e9clencheur du menu porte la s\u00e9lection courante : repli\u00e9, il\r\n            \/\/ doit \u00e0 lui seul dire ce qui est affich\u00e9.\r\n            var trig = document.getElementById(\"legend-trigger\");\r\n            if (trig){\r\n                var choisi = radarScope\r\n                    ? THEMES.filter(function(t){ return t.key === radarScope; })[0]\r\n                    : null;\r\n                trig.innerHTML = (choisi\r\n                        ? '<span class=\"legend-dot\" style=\"--dot-color:' + choisi.color + '\"><\\\/span>'\r\n                            + escapeHTML(choisi.label)\r\n                        : 'Toutes les th\u00e9matiques')\r\n                    + '<span class=\"legend-caret\" aria-hidden=\"true\">'\r\n                    + '<svg viewBox=\"0 0 10 6\" width=\"10\" height=\"6\"><path d=\"M1 1l4 4 4-4\" fill=\"none\"'\r\n                    + ' stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\\\/svg>'\r\n                    + '<\\\/span>';\r\n            }\r\n\r\n            list.querySelectorAll(\".legend-item\").forEach(function(btn){\r\n                btn.addEventListener(\"click\", function(){\r\n                    var key = btn.getAttribute(\"data-theme\");\r\n                    \/\/ Choisir referme le menu : le laisser ouvert repousserait\r\n                    \/\/ les fleurs qu'on vient de demander \u00e0 voir.\r\n                    var aside = document.getElementById(\"legend\");\r\n                    if (aside) aside.classList.remove(\"is-open\");\r\n                    document.getElementById(\"legend-trigger\").setAttribute(\"aria-expanded\", \"false\");\r\n                    if (isScoped()){\r\n                        \/\/ Radar et galerie se filtrent par th\u00e9matique au lieu\r\n                        \/\/ de zoomer : c'est le m\u00eame p\u00e9rim\u00e8tre pour les deux.\r\n                        radarScope = key ? ((radarScope === key) ? null : key) : null;\r\n                        closeDetail();\r\n                        if (isFleurs()) renderFlora();\r\n                        else if (isEtages()) renderEtages();\r\n                        else refreshFreinsView();\r\n                        renderLegend();\r\n                        renderKPI();\r\n                        return;\r\n                    }\r\n                    var node = root.children.find(function(c){ return c.data.themeKey === key; });\r\n                    if (node) { closeDetail(); zoomTo(focus === node ? root : node); }\r\n                });\r\n            });\r\n        }\r\n\r\n        \/\/ Bandeau de KPI retir\u00e9 de l'interface. La fonction garde son point\r\n        \/\/ d'appel (bascule d'onglet, zoom, filtre) mais ne peuple plus rien.\r\n        function kpiChip(v, l){\r\n            return '<div class=\"kpi\"><span class=\"kpi-value\">' + v + '<\\\/span><span class=\"kpi-label\">' + l + '<\\\/span><\\\/div>';\r\n        }\r\n        function renderKPI(){\r\n            var row = document.getElementById(\"kpi-row\");\r\n            if (!row) return;\r\n            var list;\r\n            if (isScoped()){\r\n                list = radarScope ? (byTheme.get(radarScope) || []) : PROJETS;\r\n            } else {\r\n                list = focus && focus !== root ? (focus.data.projets || []) : PROJETS;\r\n            }\r\n            var themesCount = new Set(list.map(function(p){return p.theme;})).size;\r\n            row.innerHTML = kpiChip(list.length, \"Projets\") + kpiChip(themesCount, themesCount === 1 ? \"Th\u00e9matique\" : \"Th\u00e9matiques\");\r\n        }\r\n\r\n\r\n        \/\/ ---- Ce que les \u00e9tages empruntent au reste de la roue ----\r\n        \/\/ Le halo pos\u00e9 au sol sous une fleur dit la TH\u00c9MATIQUE de la\r\n        \/\/ structure. La teinte pastel des secteurs, \u00e0 30 % sur une dalle\r\n        \/\/ claire, n'y \u00e9tait plus qu'un souffle : on prend le point milieu\r\n        \/\/ entre elle et son encre, qui reste dans le ton tout en se voyant.\r\n        var THEME_TON = {}, THEME_SOCLE = {};\r\n        THEMES.forEach(function(t, i){\r\n            THEME_TON[t.key] = mix(t.color, t.textColor, 0.45);\r\n            \/\/ Le socle d'une fleur, sur les \u00e9tages : le dessus prend la teinte\r\n            \/\/ pleine (en d\u00e9grad\u00e9, voir etDefs), les deux chants son encre, le\r\n            \/\/ gauche plus sombre que le droit pour la m\u00eame lumi\u00e8re que la dalle.\r\n            THEME_SOCLE[t.key] = {\r\n                i: i,\r\n                gauche: mix(t.color, t.textColor, 0.7),\r\n                droite: mix(t.color, t.textColor, 0.36)\r\n            };\r\n        });\r\n        function themeColor(k){ return THEME_TON[k] || \"#5d6672\"; }\r\n\r\n        function shorten(v, n){\r\n            var s = String(v == null ? \"\" : v).trim().replace(\/\\s+\/g, \" \");\r\n            if (!s) return \"\";\r\n            return s.length > n ? s.slice(0, n - 1) + \"\u2026\" : s;\r\n        }\r\n\r\n        \/\/ Une fleur d'un plan renvoie \u00e0 la fiche de sa structure : c'est la\r\n        \/\/ feuille de la roue qui la porte, on la retrouve par le projet.\r\n        function openFicheProjet(p){\r\n            if (!p) return;\r\n            var node = leafFor(p);\r\n            if (node) openDetail(node);\r\n        }\r\n\r\n        \/\/ ============ 5 ter. LES TROIS \u00c9TAGES ============\r\n        \/\/ La lecture en volume des trois promesses du fonds : trois dalles\r\n        \/\/ empil\u00e9es, une par promesse, et sur chacune les structures du corpus.\r\n        \/\/ Six partis pris, qui tiennent ensemble :\r\n        \/\/\r\n        \/\/ 1. Une structure garde la M\u00caME case sur les trois \u00e9tages. Une fleur\r\n        \/\/    revient donc au m\u00eame endroit de l'\u00e9cran d'un \u00e9tage \u00e0 l'autre : on voit\r\n        \/\/    sans rien compter qui tient les trois promesses et qui n'en tient\r\n        \/\/    qu'une.\r\n        \/\/ 2. Les 48 structures ont leur case sur CHAQUE dalle. Celles qui\r\n        \/\/    documentent la promesse y fleurissent, les autres n'y laissent\r\n        \/\/    qu'une case vide, en pointill\u00e9 : la densit\u00e9 d'une dalle reste le\r\n        \/\/    taux de documentation, mais le corpus entier est l\u00e0.\r\n        \/\/ 3. Les cases se rangent en \u00eelots, un par th\u00e9matique, trois par trois\r\n        \/\/    dans l'ordre de la roue. Leurs noms ne sont pas \u00e9crits sur la\r\n        \/\/    dalle, o\u00f9 ils couvraient des fleurs : une petite l\u00e9gende les donne\r\n        \/\/    \u00e0 c\u00f4t\u00e9, dans le cartouche, avec le socle de chaque th\u00e9matique et\r\n        \/\/    son compte (etThemes).\r\n        \/\/ 4. La fleur garde le dessin de la galerie d'impact. Elle pousse sur un\r\n        \/\/    socle de la couleur de sa th\u00e9matique ; le d\u00e9tail reste au clic.\r\n        \/\/ 5. On ne regarde qu'UN \u00e9tage \u00e0 la fois, en grand, les suivants empil\u00e9s\r\n        \/\/    dessous : on voit leur chant et leur liser\u00e9, pas leur d\u00e9tail.\r\n        \/\/ 6. Le d\u00e9filement EST la cam\u00e9ra. Un cran et l'on descend d'un \u00e9tage :\r\n        \/\/    celui qu'on quitte grandit et passe au-dessus de la t\u00eate, celui qu'on\r\n        \/\/    rejoint monte, se pose et ses fleurs s'ouvrent. En remontant, le\r\n        \/\/    mouvement s'inverse exactement.\r\n\r\n        \/\/ La perspective d'une maquette, deux pour un : assez de profondeur pour\r\n        \/\/ lire des parcelles, assez peu pour que la dalle tienne en largeur \u00e0\r\n        \/\/ c\u00f4t\u00e9 du cartouche. Une fleur est plus large que sa case n'est haute\r\n        \/\/ (72 contre 50) : \u00e0 56, elle tenait vingt pixels sur un \u00e9cran\r\n        \/\/ d'ordinateur portable, d'un trait d'un pixel qu'on ne lisait plus.\r\n        \/\/ Deux fleurs de la m\u00eame colonne d'\u00e9cran se chevauchent donc d'un\r\n        \/\/ p\u00e9tale, et c'est leur liser\u00e9 blanc (floraHalo) qui les s\u00e9pare.\r\n        var ISO_W = 100, ISO_H = 50;\r\n        var ET_EP = 9;                \/\/ \u00e9paisseur de la dalle\r\n        var ET_SOCLE = 6;             \/\/ hauteur du socle d'une fleur\r\n        var ET_FLEUR = 72;            \/\/ fleur d'impact\r\n        var ET_TIGE = 30;             \/\/ tige, du socle au coeur de la fleur\r\n        var ET_CARREAU = 0.8;         \/\/ part de la case couverte par le socle\r\n        var ET_ALLEE = 0.82;          \/\/ all\u00e9e entre deux \u00eelots, en cases\r\n        var ET_BORD = 0.5;            \/\/ marge de la dalle autour des \u00eelots\r\n        var ET_CADRE_W = 7.5, ET_CADRE_H = 7.5;   \/\/ cadre minimal, en cases\r\n\r\n        var etPiste = null, etColle = null, etSvg = null, etScene = null, etQueue = null;\r\n        var etPlansG = [], etPasN = [], etSols = [];\r\n        var etOmbres = [];\r\n        var etMondeW = 0, etMondeH = 0, etPlanW = 0, etPlanH = 0, etBaseY = 0, etChute = 0;\r\n        var etCxLocal = 0, etCyLocal = 0, etCentreX = 0;\r\n        var etPasH = 0, etActif = -1, etOrdre = \"\", etRAF = 0;\r\n        var etDemande = -1;\r\n        var etAnnot = null, etAnnots = [];\r\n        var etCamera = 0, etFrameTime = 0, etRequested = 0;\r\n        var etMeasuredW = 0, etMeasuredH = 0;\r\n        var etIlots = [];\r\n        var etAccents = [\"#ad5b14\", \"#087b65\", \"#d51b63\"];\r\n        function etWake(){ if (!etRAF) etRAF = requestAnimationFrame(etCadrer); }\r\n\r\n        function isoPt(c, r){ return [ (c + r) * ISO_W \/ 2, (r - c) * ISO_H \/ 2 ]; }\r\n\r\n        \/\/ Un rectangle du sol aux coins arrondis, en cases, projet\u00e9 point par\r\n        \/\/ point. Vu de biais, le quart de cercle d'un coin devient un quart\r\n        \/\/ d'ellipse : on l'\u00e9chantillonne dans le plan puis on le projette,\r\n        \/\/ plut\u00f4t que de chercher l'arc \u00e9quivalent \u00e0 l'\u00e9cran. Le trac\u00e9 tourne\r\n        \/\/ gauche, fond, droite, avant ; le milieu de chaque arc est l'extr\u00eame\r\n        \/\/ du losange dans sa direction.\r\n        function isoArrondi(c0, r0, c1, r1, ray){\r\n            var pts = [], n = 6;\r\n            ray = Math.min(ray, (c1 - c0) \/ 2, (r1 - r0) \/ 2);\r\n            [[c0 + ray, r0 + ray, 1], [c1 - ray, r0 + ray, 1.5],\r\n             [c1 - ray, r1 - ray, 0], [c0 + ray, r1 - ray, 0.5]].forEach(function (k) {\r\n                for (var j = 0; j <= n; j++){\r\n                    var a = (k[2] + j \/ n \/ 2) * Math.PI;\r\n                    pts.push(isoPt(k[0] + ray * Math.cos(a), k[1] + ray * Math.sin(a)));\r\n                }\r\n            });\r\n            return pts;\r\n        }\r\n        function etChemin(pts, dy, ouvert){\r\n            dy = dy || 0;\r\n            return \"M\" + pts.map(function (p) {\r\n                return p[0].toFixed(1) + \",\" + (p[1] + dy).toFixed(1);\r\n            }).join(\"L\") + (ouvert ? \"\" : \"Z\");\r\n        }\r\n        \/\/ Les deux chants d'un volume, sous le pourtour de son dessus : de\r\n        \/\/ l'angle droit \u00e0 l'angle avant, puis de l'angle avant \u00e0 l'angle gauche.\r\n        \/\/ Deux faces et non une : elles ne prennent pas la m\u00eame lumi\u00e8re, et ce\r\n        \/\/ seul \u00e9cart de valeur fait lire une \u00e9paisseur. Le pied est l'ar\u00eate\r\n        \/\/ basse des deux, celle o\u00f9 la dalle porte son liser\u00e9.\r\n        function isoChants(pts, ep){\r\n            var n = pts.length, g = 0, d = 0, b = 0;\r\n            pts.forEach(function (p, i) {\r\n                if (p[0] < pts[g][0]) g = i;\r\n                if (p[0] > pts[d][0]) d = i;\r\n                if (p[1] > pts[b][1]) b = i;\r\n            });\r\n            function suite(i, fin){\r\n                var out = [pts[i]];\r\n                while (i !== fin){ i = (i + 1) % n; out.push(pts[i]); }\r\n                return out;\r\n            }\r\n            function face(ch){\r\n                return etChemin(ch.concat(ch.slice().reverse().map(function (p) {\r\n                    return [p[0], p[1] + ep];\r\n                })));\r\n            }\r\n            return { droite: face(suite(d, b)), gauche: face(suite(b, g)), pied: etChemin(suite(d, g), ep, true) };\r\n        }\r\n\r\n        \/\/ Les formes d'une case, les m\u00eames pour toutes : le dessus du socle et\r\n        \/\/ ses deux chants, et la case vide en pointill\u00e9, \u00e0 plat sur l'\u00eelot.\r\n        var ET_CASE = (function () {\r\n            var a = ET_CARREAU \/ 2, sol = isoArrondi(-a, -a, a, a, 0.13);\r\n            var haut = sol.map(function (p) { return [p[0], p[1] - ET_SOCLE]; });\r\n            var ch = isoChants(haut, ET_SOCLE);\r\n            return { vide: etChemin(sol), dessus: etChemin(haut), gauche: ch.gauche, droite: ch.droite };\r\n        })();\r\n\r\n        \/\/ Une case par structure, la m\u00eame sur les trois \u00e9tages, dans l'\u00eelot de\r\n        \/\/ sa th\u00e9matique. Tous les \u00eelots ont la taille qu'il faut \u00e0 la th\u00e9matique\r\n        \/\/ la plus fournie du corpus ENTIER, filtre ou pas : un \u00eelot garde son\r\n        \/\/ dessin quand on filtre. Dans un \u00eelot, les structures les mieux\r\n        \/\/ document\u00e9es d'abord, du fond vers l'avant : le rang du fond se\r\n        \/\/ remplit en premier et l'\u00eelot s'\u00e9claircit vers l'avant. Le fond et\r\n        \/\/ l'avant sont ceux de l'\u00c9CRAN : les cases se remplissent par rangs de\r\n        \/\/ profondeur, de l'angle du fond vers l'angle avant, et, dans un rang,\r\n        \/\/ du milieu vers les bords.\r\n        function etagePlacement(list){\r\n            var plein = 1;\r\n            THEMES.forEach(function (t) { plein = Math.max(plein, (byTheme.get(t.key) || []).length); });\r\n            var Z = Math.max(2, Math.ceil(Math.sqrt(plein)));\r\n            var themes = THEMES.filter(function (t) {\r\n                return list.some(function (p) { return p.theme === t.key; });\r\n            });\r\n            var G = Math.max(1, Math.ceil(Math.sqrt(themes.length)));\r\n            var GR = Math.max(1, Math.ceil(themes.length \/ G));\r\n            var pas = Z + ET_ALLEE, cases = {}, rangs = [];\r\n            for (var dc = 0; dc < Z; dc++) for (var dr = 0; dr < Z; dr++) rangs.push({ dc: dc, dr: dr });\r\n            rangs.sort(function (a, b) {\r\n                return (a.dr - a.dc) - (b.dr - b.dc)\r\n                    || Math.abs(a.dc + a.dr - (Z - 1)) - Math.abs(b.dc + b.dr - (Z - 1))\r\n                    || (a.dc + a.dr) - (b.dc + b.dr);\r\n            });\r\n            var ilots = themes.map(function (t, i) {\r\n                var c0 = ET_BORD + (i % G) * pas, r0 = ET_BORD + Math.floor(i \/ G) * pas;\r\n                var membres = list.filter(function (p) { return p.theme === t.key; })\r\n                    .sort(function (a, b) {\r\n                        return b.score - a.score\r\n                            || String(a.porteur || \"\").localeCompare(String(b.porteur || \"\"), \"fr\");\r\n                    });\r\n                membres.forEach(function (p, k) {\r\n                    cases[p.id] = { c: c0 + rangs[k].dc, r: r0 + rangs[k].dr };\r\n                });\r\n                \/\/ L'\u00eelot d\u00e9borde un peu de ses cases.\r\n                var tour = isoArrondi(c0 - 0.12, r0 - 0.12, c0 + Z + 0.12, r0 + Z + 0.12, 0.34);\r\n                return { theme: t, membres: membres, d: etChemin(tour) };\r\n            });\r\n            return {\r\n                cases: cases, ilots: ilots,\r\n                C: 2 * ET_BORD + G * Z + (G - 1) * ET_ALLEE,\r\n                R: 2 * ET_BORD + GR * Z + (GR - 1) * ET_ALLEE\r\n            };\r\n        }\r\n\r\n        \/\/ La fleur reprend les couches d'impact de la galerie ; son socle garde\r\n        \/\/ la couleur de la th\u00e9matique, l'anneau les trois promesses.\r\n        \/\/ Sur un plan en fuite, la fleur est referm\u00e9e en bourgeon : on voit que\r\n        \/\/ l'\u00e9tage est habit\u00e9, sans que son d\u00e9tail parasite l'\u00e9tage lu.\r\n        function etageFleur(p){\r\n            var code = floraCode(p.floraStates);\r\n            var s = THEME_SOCLE[p.theme] || { i: -1, gauche: \"#6f757c\", droite: \"#8a8f96\" };\r\n            return '<path class=\"et-socle-g\" d=\"' + ET_CASE.gauche + '\" style=\"fill:' + s.gauche + '\"\/>'\r\n                 + '<path class=\"et-socle-d\" d=\"' + ET_CASE.droite + '\" style=\"fill:' + s.droite + '\"\/>'\r\n                 + '<path class=\"et-socle\" d=\"' + ET_CASE.dessus + '\"'\r\n                 + ' style=\"fill:' + (s.i < 0 ? \"#a3a8ae\" : 'url(#fis-et-socle-' + s.i + ')') + '\"\/>'\r\n                 + (p.score === 3 ? '<ellipse class=\"et-anneau\" cy=\"-' + ET_SOCLE + '\" rx=\"19\" ry=\"9.5\"\/>' : '')\r\n                 + '<g transform=\"translate(0,-' + ET_SOCLE + ')\">'\r\n                 + '<ellipse class=\"et-pied\" rx=\"6.5\" ry=\"3.2\"\/>'\r\n                 + '<g class=\"et-bourgeon\"><path d=\"M0,-1V-13\"\/><circle cy=\"-15.5\" r=\"3.6\"\/><\\\/g>'\r\n                 + '<g class=\"et-fleur-in\">'\r\n                 + '<path class=\"et-tige\" d=\"M0,-1L0,-' + ET_TIGE + '\"\/>'\r\n                 + '<use class=\"et-use\" data-code=\"' + code + '\" href=\"#' + FL_PREFIX_PLAN + code + '\"'\r\n                 + ' x=\"' + (-ET_FLEUR \/ 2) + '\" y=\"' + (-ET_TIGE - ET_FLEUR \/ 2)\r\n                 + '\" width=\"' + ET_FLEUR + '\" height=\"' + ET_FLEUR + '\"\/>'\r\n                 + '<\\\/g>'\r\n                 \/\/ Une fleur n'est qu'un faisceau de traits : sans disque de\r\n                 \/\/ pointage, il faudrait viser un p\u00e9tale au pixel pr\u00e8s. Il reste\r\n                 \/\/ HORS du groupe qui s'ouvre et grossit, sinon la cible bougerait\r\n                 \/\/ sous le curseur et la fleur clignoterait.\r\n                 + '<circle class=\"et-cible\" cy=\"-' + ET_TIGE + '\" r=\"33\" fill=\"transparent\"'\r\n                 + ' pointer-events=\"all\"\/>'\r\n                 + '<\\\/g>';\r\n        }\r\n\r\n        \/\/ La cl\u00e9 de lecture, en marques plut\u00f4t qu'en phrases : chaque signe du\r\n        \/\/ plan est montr\u00e9 \u00e0 c\u00f4t\u00e9 de ce qu'il veut dire. Les th\u00e9matiques ont leur\r\n        \/\/ propre l\u00e9gende, dans le cartouche (etThemes).\r\n        function etLegende(complets){\r\n            var pleine = {};\r\n            FLORA_LAYERS.forEach(function (L) { pleine[L.key] = \"full\"; });\r\n            function marque(dessin){\r\n                return '<span class=\"lg-marque\"><svg viewBox=\"-46 -30 92 56\" aria-hidden=\"true\">'\r\n                    + dessin + '<\\\/svg><\\\/span>';\r\n            }\r\n            return '<ul class=\"et-legende\">'\r\n                + '<li><span class=\"lg-marque\">' + floraGlyph(pleine) + '<\\\/span>'\r\n                + '<span>Promesse document\u00e9e<\\\/span><\\\/li>'\r\n                + '<li>' + marque('<path class=\"et-vide\" d=\"' + ET_CASE.vide + '\"\/>')\r\n                + '<span>Non document\u00e9e<\\\/span><\\\/li>'\r\n                + '<li>' + marque('<path class=\"et-socle-g\" d=\"' + ET_CASE.gauche + '\"\/>'\r\n                    + '<path class=\"et-socle-d\" d=\"' + ET_CASE.droite + '\"\/>'\r\n                    + '<path class=\"et-socle\" d=\"' + ET_CASE.dessus + '\"\/>'\r\n                    + '<ellipse class=\"et-anneau\" cy=\"-' + ET_SOCLE + '\" rx=\"19\" ry=\"9.5\"\/>')\r\n                + '<span>Les trois promesses <b>' + complets + '<\\\/b><\\\/span><\\\/li>'\r\n                + '<\\\/ul>';\r\n        }\r\n\r\n        \/\/ Ce que la sc\u00e8ne ajoute \u00e0 ses propres d\u00e9fs : la lumi\u00e8re du dessus de\r\n        \/\/ dalle, ses deux chants, et le dessus des socles, un par th\u00e9matique.\r\n        \/\/ Les chants restent de la couleur du pl\u00e2tre, \u00e0 peine teint\u00e9s de LEUR\r\n        \/\/ promesse : c'est le liser\u00e9, au pied, qui dit l'\u00e9tage, et la pile vue\r\n        \/\/ de biais montre trois liser\u00e9s l'un sous l'autre.\r\n        function etDefs(){\r\n            var chants = PROMESSES.map(function (pr, i) {\r\n                return '<linearGradient id=\"fis-et-chant-g-' + i + '\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">'\r\n                    + '<stop stop-color=\"' + mix(\"#e3ddd2\", pr.color, 0.08) + '\"\/>'\r\n                    + '<stop offset=\"1\" stop-color=\"' + mix(\"#d6cfc2\", pr.color, 0.12) + '\"\/><\\\/linearGradient>'\r\n                    + '<linearGradient id=\"fis-et-chant-d-' + i + '\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">'\r\n                    + '<stop stop-color=\"' + mix(\"#eeeae2\", pr.color, 0.06) + '\"\/>'\r\n                    + '<stop offset=\"1\" stop-color=\"' + mix(\"#e4dfd5\", pr.color, 0.1) + '\"\/><\\\/linearGradient>';\r\n            }).join(\"\");\r\n            var socles = THEMES.map(function (t, i) {\r\n                return '<linearGradient id=\"fis-et-socle-' + i + '\" x1=\"0\" y1=\"0\" x2=\".6\" y2=\"1\">'\r\n                    + '<stop stop-color=\"' + mix(t.color, \"#ffffff\", 0.3) + '\"\/>'\r\n                    + '<stop offset=\"1\" stop-color=\"' + t.color + '\"\/><\\\/linearGradient>';\r\n            }).join(\"\");\r\n            return '<defs>'\r\n                + '<linearGradient id=\"fis-et-dalle\" x1=\"0\" y1=\"0\" x2=\".7\" y2=\"1\">'\r\n                + '<stop stop-color=\"#ffffff\"\/><stop offset=\".5\" stop-color=\"#fbfaf7\"\/>'\r\n                + '<stop offset=\"1\" stop-color=\"#f3f1eb\"\/><\\\/linearGradient>'\r\n                + chants + socles\r\n                + '<\\\/defs>';\r\n        }\r\n\r\n        \/\/ Le cartouche de la planche : le rang, la promesse regard\u00e9e et ce\r\n        \/\/ qu'elle p\u00e8se. Il ne change qu'au changement d'\u00e9tage, pas \u00e0 chaque\r\n        \/\/ image de la descente ; le cadrage le mesure pour ne pas s'y cogner.\r\n        function etAnnoter(i){\r\n            var a = etAnnots[i];\r\n            if (!etAnnot || !a) return;\r\n            etAnnot.style.setProperty(\"--pr\", a.color);\r\n            etAnnot.style.setProperty(\"--pr-text\", a.ink);\r\n            \/\/ La l\u00e9gende des th\u00e9matiques reste en place d'un \u00e9tage \u00e0 l'autre :\r\n            \/\/ seuls ses comptes changent. R\u00e9\u00e9crite avec le reste du cartouche,\r\n            \/\/ elle se rejouerait \u00e0 chaque \u00e9tage.\r\n            var legende = etAnnot.querySelector(\".et-themes\");\r\n            [].slice.call(etAnnot.children).forEach(function (n) {\r\n                if (n !== legende) etAnnot.removeChild(n);\r\n            });\r\n            etAnnot.insertAdjacentHTML(\"afterbegin\", '<span class=\"et-annot-rang\">La promesse <b>0' + (a.rang + 1) + '<\\\/b> \/ 03<\\\/span>'\r\n                + '<h2 class=\"et-annot-titre\">' + escapeHTML(a.label) + '<\\\/h2>'\r\n                + '<p class=\"et-phrase\">' + escapeHTML(a.phrase.charAt(0).toUpperCase() + a.phrase.slice(1)) + '.<\\\/p>'\r\n                + '<div class=\"et-stat\"><strong>' + a.docs + '<\\\/strong><span>\/ ' + a.total + '<\\\/span><\\\/div>'\r\n                + '<span class=\"et-stat-label\">' + (a.docs === 1 ? 'structure documente' : 'structures documentent') + ' cette promesse<\\\/span>'\r\n                + '<span class=\"et-meter\" aria-hidden=\"true\" style=\"--coverage:' + (a.total ? a.docs\/a.total*100 : 0) + '%\"><i><\\\/i><\\\/span>'\r\n                + '<span class=\"et-annot-sub\">Dont <b>' + a.fleuries + '<\/b> ' + (a.fleuries === 1 ? 'porte' : 'portent') + ' une empreinte d\u2019impact.<\\\/span>');\r\n            if (!legende){\r\n                etAnnot.insertAdjacentHTML(\"beforeend\", etThemes());\r\n                var pied = etColle && etColle.querySelector(\".et-themes-pied\");\r\n                if (pied) pied.innerHTML = etThemes();\r\n                var liste = etAnnot.querySelector(\".et-themes ul\");\r\n                liste.addEventListener(\"mouseover\", function (e) {\r\n                    var li = e.target.closest ? e.target.closest(\"li[data-t]\") : null;\r\n                    if (li) etIsoler(li.getAttribute(\"data-t\"));\r\n                });\r\n                liste.addEventListener(\"mouseleave\", function () { etIsoler(null); });\r\n            }\r\n            etCompter(PROMESSES[a.rang].key);\r\n            etSerrerThemes();\r\n        }\r\n\r\n        \/\/ La l\u00e9gende des th\u00e9matiques, \u00e0 c\u00f4t\u00e9 de la dalle et non plus dessus.\r\n        \/\/ Une ligne par \u00eelot, dans l'ordre de la roue : le socle de la\r\n        \/\/ th\u00e9matique, son nom, et son compte, que etCompter remplit.\r\n        function etThemes(){\r\n            return '<div class=\"et-themes\" aria-live=\"off\">'\r\n                + '<span class=\"et-themes-titre\">Th\u00e9matiques<\\\/span><ul>'\r\n                + etIlots.map(function (z) {\r\n                    var t = z.theme, s = THEME_SOCLE[t.key] || { gauche: \"#6f757c\", droite: \"#8a8f96\" };\r\n                    return '<li data-t=\"' + escapeHTML(t.key) + '\">'\r\n                        + '<svg class=\"et-themes-socle\" viewBox=\"-42 -28 84 50\" aria-hidden=\"true\">'\r\n                        + '<path d=\"' + ET_CASE.gauche + '\" fill=\"' + s.gauche + '\"\/>'\r\n                        + '<path d=\"' + ET_CASE.droite + '\" fill=\"' + s.droite + '\"\/>'\r\n                        + '<path d=\"' + ET_CASE.dessus + '\" fill=\"' + mix(t.color, \"#ffffff\", 0.15) + '\"\/><\\\/svg>'\r\n                        + '<span class=\"et-themes-nom\">' + escapeHTML(t.label) + '<\\\/span>'\r\n                        + '<span class=\"et-themes-n\"><\\\/span><\\\/li>';\r\n                }).join(\"\")\r\n                + '<\\\/ul><\\\/div>';\r\n        }\r\n        \/\/ Combien de structures de chaque th\u00e9matique documentent la promesse\r\n        \/\/ regard\u00e9e, sur le nombre de ses structures. Redit en toutes lettres\r\n        \/\/ au survol, pour la l\u00e9gende sur deux colonnes qui n'a plus la place\r\n        \/\/ de ses comptes.\r\n        function etCompter(prKey){\r\n            if (!etColle) return;\r\n            var n = {};\r\n            etIlots.forEach(function (z) {\r\n                var d = z.membres.filter(function (p) { return p.docs[prKey]; }).length;\r\n                n[z.theme.key] = { court: d + \"\/\" + z.membres.length,\r\n                    long: z.theme.label + \" : \" + d + \" sur \" + z.membres.length\r\n                        + (d > 1 ? \" documentent\" : \" documente\") + \" cette promesse\" };\r\n            });\r\n            etColle.querySelectorAll(\".et-themes li\").forEach(function (li) {\r\n                var c = n[li.getAttribute(\"data-t\")];\r\n                li.querySelector(\".et-themes-n\").textContent = c ? c.court : \"\";\r\n                li.title = c ? c.long : \"\";\r\n            });\r\n        }\r\n        \/\/ Survoler une ligne de la l\u00e9gende isole son \u00eelot : les autres\r\n        \/\/ s'effacent, et l'on voit o\u00f9 se trouve la th\u00e9matique sur la dalle.\r\n        function etIsoler(cle){\r\n            if (!etSvg) return;\r\n            etSvg.classList.toggle(\"et-isole\", !!cle);\r\n            etSvg.querySelectorAll(\"[data-t]\").forEach(function (n) {\r\n                n.classList.toggle(\"is-dans\", !!cle && n.getAttribute(\"data-t\") === cle);\r\n            });\r\n        }\r\n        \/\/ Dans l'autre sens, survoler une fleur allume sa ligne.\r\n        function etLigne(cle){\r\n            if (!etAnnot) return;\r\n            etAnnot.querySelectorAll(\".et-themes li\").forEach(function (li) {\r\n                li.classList.toggle(\"is-on\", li.getAttribute(\"data-t\") === cle);\r\n            });\r\n        }\r\n        \/\/ La l\u00e9gende tient sous la promesse, au-dessus du pied. Quand la\r\n        \/\/ hauteur manque (un portable de 13 pouces, une fen\u00eatre basse), elle se\r\n        \/\/ resserre, puis perd son titre, et ne passe sur deux colonnes qu'en\r\n        \/\/ dernier recours, plut\u00f4t que de glisser sous le pied qui la couvrirait.\r\n        \/\/ Mesur\u00e9 en mise en page : les \u00e9l\u00e9ments du cartouche entrent en\r\n        \/\/ glissant, et leur glissement fausserait le compte.\r\n        function etSerrerThemes(){\r\n            var th = etAnnot && etAnnot.querySelector(\".et-themes\");\r\n            var pied = etColle && etColle.querySelector(\".et-bottom\");\r\n            if (!th || !pied) return;\r\n            th.classList.remove(\"is-serre\", \"is-tasse\", \"is-deux\");\r\n            if (!th.offsetHeight) return;          \/\/ masqu\u00e9e : c'est le pied qui la porte\r\n            var bas = pied.offsetTop - 12;\r\n            function fin(){ return etAnnot.offsetTop + th.offsetTop + th.offsetHeight; }\r\n            if (fin() <= bas) return;\r\n            th.classList.add(\"is-serre\");\r\n            if (fin() <= bas) return;\r\n            th.classList.add(\"is-tasse\");\r\n            if (fin() <= bas) return;\r\n            th.classList.add(\"is-deux\");\r\n        }\r\n\r\n        function renderEtages(){\r\n            var el = document.getElementById(\"etages\");\r\n            if (!el) return;\r\n            \/\/ Un filtre par th\u00e9matique reb\u00e2tit la sc\u00e8ne : l'infobulle de la\r\n            \/\/ fleur qu'on survolait resterait sinon coll\u00e9e au-dessus d'une\r\n            \/\/ dalle o\u00f9 cette fleur n'est plus.\r\n            hideTooltip();\r\n            var keepLevel = Math.max(0, etActif);\r\n            if (etRAF) cancelAnimationFrame(etRAF);\r\n            etRAF = 0; etFrameTime = 0;\r\n\r\n            var list = radarScope ? (byTheme.get(radarScope) || []) : PROJETS;\r\n            var pl = etagePlacement(list);\r\n            var C = pl.C, R = pl.R;\r\n            etIlots = pl.ilots;\r\n            etPlanW = (C + R) * ISO_W \/ 2;\r\n            etPlanH = (C + R) * ISO_H \/ 2;\r\n            etCxLocal = (C + R) * ISO_W \/ 4;\r\n            etCyLocal = (R - C) * ISO_H \/ 4;\r\n            \/\/ L'\u00e9cart entre deux dalles de la pile : assez pour que le chant et\r\n            \/\/ le liser\u00e9 de la suivante se lisent sous celle qu'on regarde.\r\n            etChute = Math.max(etPlanH, 6 * ISO_H) * 0.17;\r\n            \/\/ Un premier cadre, que etMesurer remplace d\u00e8s que la sc\u00e8ne a sa taille.\r\n            etMondeW = Math.max(etPlanW, ET_CADRE_W * ISO_W) * 1.2;\r\n            etMondeH = Math.max(etPlanH, ET_CADRE_H * ISO_H) * 1.5;\r\n            etBaseY = etMondeH * 0.45;\r\n            etCentreX = etMondeW * 0.5;\r\n\r\n            \/\/ La dalle et ses \u00eelots ne d\u00e9pendent pas de la promesse : on les\r\n            \/\/ trace une fois pour les trois \u00e9tages.\r\n            var dalle = isoArrondi(0, 0, C, R, 0.45), chants = isoChants(dalle, ET_EP);\r\n            var dessus = etChemin(dalle);\r\n            \/\/ L'ombre port\u00e9e : dix copies du pourtour, chacune un peu plus bas\r\n            \/\/ que la pr\u00e9c\u00e9dente. Empil\u00e9es, elles font un d\u00e9grad\u00e9 qui ne d\u00e9borde\r\n            \/\/ que sous les chants ; \u00e9largies, elles dessinaient des marches aux\r\n            \/\/ deux angles. Un flou de filtre ferait le m\u00eame travail, mais il se\r\n            \/\/ recalculerait \u00e0 chaque image de la descente.\r\n            var ombre = \"\";\r\n            for (var k = 0; k < 10; k++){\r\n                var e = k * 0.008;\r\n                ombre += '<path d=\"' + etChemin(isoArrondi(-e, -e, C + e, R + e, 0.45 + e), ET_EP + 2 + k * 3.2) + '\"\/>';\r\n            }\r\n            var ilots = pl.ilots.map(function (z) {\r\n                return '<path class=\"et-ilot\" data-t=\"' + escapeHTML(z.theme.key) + '\" d=\"' + z.d + '\"\/>';\r\n            }).join(\"\");\r\n            var plans = \"\";\r\n\r\n            PROMESSES.forEach(function (pr, i) {\r\n                var docs = list.filter(function (p) { return p.docs[pr.key]; });\r\n                var muets = list.filter(function (p) { return !p.docs[pr.key]; });\r\n\r\n                \/\/ La dalle : une ombre port\u00e9e, deux chants de valeurs diff\u00e9rentes\r\n                \/\/ et le liser\u00e9 de la promesse \u00e0 leur pied, un dessus en d\u00e9grad\u00e9.\r\n                \/\/ Le plan ne porte AUCUN texte : les th\u00e9matiques sont nomm\u00e9es\r\n                \/\/ dans la l\u00e9gende du cartouche (etThemes).\r\n                var g = '<g class=\"et-etage\" data-i=\"' + i + '\" style=\"--pr:' + pr.color\r\n                      + ';--i:' + i + '\"><g class=\"et-etage-in\">'\r\n                      + '<g class=\"et-ombre\">' + ombre + '<\\\/g>'\r\n                      + '<path class=\"et-chant et-chant-g\" d=\"' + chants.gauche + '\" style=\"fill:url(#fis-et-chant-g-' + i + ')\"\/>'\r\n                      + '<path class=\"et-chant et-chant-d\" d=\"' + chants.droite + '\" style=\"fill:url(#fis-et-chant-d-' + i + ')\"\/>'\r\n                      + '<path class=\"et-lisere\" d=\"' + chants.pied + '\"\/>'\r\n                      + '<path class=\"et-dessus\" d=\"' + dessus + '\"\/>'\r\n                      + '<g class=\"et-sol\">' + ilots;\r\n\r\n                \/\/ Les cases vides d'abord, \u00e0 plat : elles ne doivent jamais passer\r\n                \/\/ devant une fleur. Elles disent que la structure est l\u00e0, sur ce\r\n                \/\/ plan, et qu'elle ne raconte simplement pas cette promesse.\r\n                muets.forEach(function (p) {\r\n                    var cse = pl.cases[p.id];\r\n                    if (!cse) return;\r\n                    var q = isoPt(cse.c + 0.5, cse.r + 0.5);\r\n                    g += '<g class=\"et-muet\" data-p=\"' + p.id + '\" data-pr=\"' + pr.key + '\"'\r\n                       + ' data-t=\"' + escapeHTML(p.theme) + '\"'\r\n                       + ' transform=\"translate(' + q[0].toFixed(1) + ',' + q[1].toFixed(1) + ')\">'\r\n                       + '<path class=\"et-vide\" d=\"' + ET_CASE.vide + '\"\/><\\\/g>';\r\n                });\r\n\r\n                \/\/ Les fleurs du fond d'abord : sur un sol isom\u00e9trique, une case\r\n                \/\/ plus proche de l'oeil a un r-c plus grand. Les dessiner dans cet\r\n                \/\/ ordre suffit \u00e0 ce qu'elles se recouvrent correctement, et le m\u00eame\r\n                \/\/ rang commande le retard d'\u00e9closion : l'\u00e9tage s'ouvre du fond vers\r\n                \/\/ l'avant, comme une vague.\r\n                docs.slice().sort(function (a, b) {\r\n                    var ca = pl.cases[a.id], cb = pl.cases[b.id];\r\n                    return (ca.r - ca.c) - (cb.r - cb.c);\r\n                }).forEach(function (p) {\r\n                    var cse = pl.cases[p.id];\r\n                    if (!cse) return;\r\n                    var q = isoPt(cse.c + 0.5, cse.r + 0.5);\r\n                    g += '<g class=\"et-fleur\" data-p=\"' + p.id + '\" data-pr=\"' + pr.key + '\"'\r\n                       + ' data-t=\"' + escapeHTML(p.theme) + '\"'\r\n                       + ' style=\"--pousse:' + Math.round((C - cse.c + cse.r) * 22) + 'ms\"'\r\n                       + ' transform=\"translate(' + q[0].toFixed(1) + ',' + q[1].toFixed(1) + ')\">'\r\n                       + etageFleur(p) + '<\\\/g>';\r\n                });\r\n                plans += g + '<\\\/g><\\\/g><\\\/g>';\r\n            });\r\n\r\n            \/\/ Ce que le cartouche de la sc\u00e8ne aura \u00e0 dire, \u00e9tage par \u00e9tage.\r\n            etAnnots = PROMESSES.map(function (pr, i) {\r\n                var docs = list.filter(function (p) { return p.docs[pr.key]; });\r\n                return {\r\n                    rang: i,\r\n                    label: pr.label,\r\n                    phrase: pr.phrase,\r\n                    color: pr.color,\r\n                    ink: pr.textColor,\r\n                    docs: docs.length,\r\n                    total: list.length,\r\n                    fleuries: docs.filter(function (p) { return p.empreinte > 0; }).length\r\n                };\r\n            });\r\n\r\n            var complets = list.filter(function (p) { return p.score === 3; }).length;\r\n            var pas = PROMESSES.map(function (pr, i) {\r\n                return '<div class=\"et-pas\" data-i=\"' + i + '\"><\\\/div>';\r\n            }).join(\"\") + '<div class=\"et-queue\"><\\\/div>';\r\n\r\n            \/\/ Plus de colonne \u00e0 gauche : la sc\u00e8ne prend tout le cadre et ses\r\n            \/\/ rep\u00e8res se posent dans les angles, l\u00e0 o\u00f9 le losange de la dalle ne\r\n            \/\/ va jamais. Le cartouche dit ce qu'on regarde, la cl\u00e9 ce que valent\r\n            \/\/ les marques, la l\u00e9gende des th\u00e9matiques ce que contient chaque \u00eelot.\r\n            el.innerHTML = '<div class=\"et-piste\" id=\"et-piste\" tabindex=\"0\"'\r\n                + ' aria-label=\"Descente des trois \u00e9tages, un par promesse\">'\r\n                + '<div class=\"et-colle\">'\r\n                + '<div class=\"et-masthead\">FIS \u00b7 Les trois promesses<\\\/div>'\r\n                + '<span class=\"et-watermark\" aria-hidden=\"true\">01<\\\/span>'\r\n                + '<svg viewBox=\"0 0 ' + etMondeW.toFixed(0) + ' ' + etMondeH.toFixed(0) + '\"'\r\n                + ' preserveAspectRatio=\"xMidYMid meet\" role=\"group\"'\r\n                + ' aria-label=\"Trois dalles empil\u00e9es, une par promesse, parcourues en descendant\">'\r\n                + floraDefs() + etDefs()\r\n                + '<g class=\"et-plans\">' + plans + '<\\\/g><\\\/svg>'\r\n                + '<div class=\"et-annot\" id=\"et-annot\" aria-live=\"polite\"><\\\/div>'\r\n                \/\/ Le pied : la cl\u00e9 des marques, et elle seule. On descend d'un\r\n                \/\/ \u00e9tage \u00e0 la molette, au doigt ou au clavier ; le cartouche dit\r\n                \/\/ lequel on regarde.\r\n                + '<div class=\"et-bottom\">'\r\n                + '<div class=\"et-themes-pied\"><\\\/div>'\r\n                + '<div class=\"et-cle\">' + etLegende(complets) + '<\\\/div><\\\/div>'\r\n                + '<\\\/div>'\r\n                + pas + '<\\\/div>';\r\n\r\n            etPiste = document.getElementById(\"et-piste\");\r\n            etColle = etPiste.querySelector(\".et-colle\");\r\n            etSvg = etPiste.querySelector(\"svg\");\r\n            etScene = etPiste.querySelector(\"g.et-plans\");\r\n            etPlansG = [].slice.call(etPiste.querySelectorAll(\"g.et-etage\"));\r\n            etSols = etPlansG.map(function (g) { return g.querySelector(\".et-sol\"); });\r\n            etOmbres = etPlansG.map(function (g) { return g.querySelector(\".et-ombre\"); });\r\n            etPasN = [].slice.call(el.querySelectorAll(\".et-pas\"));\r\n            etQueue = el.querySelector(\".et-queue\");\r\n            etAnnot = document.getElementById(\"et-annot\");\r\n            etActif = -1; etOrdre = \"\";\r\n\r\n            \/\/ Un seul jeu d'\u00e9couteurs sur la sc\u00e8ne plut\u00f4t que deux cents : les\r\n            \/\/ fleurs et les cases vides sont retrouv\u00e9es par d\u00e9l\u00e9gation.\r\n            \/\/ Seul l'\u00e9tage au premier plan re\u00e7oit les pointeurs (voir etCadrer),\r\n            \/\/ donc une fleur des plans en fuite ne peut pas voler le clic.\r\n            etSvg.addEventListener(\"mousemove\", function (e) {\r\n                var n = e.target.closest ? e.target.closest(\".et-fleur, .et-muet\") : null;\r\n                etLigne(n ? n.getAttribute(\"data-t\") : null);\r\n                if (!n){ hideTooltip(); return; }\r\n                etageTip(e, PROJETS[+n.getAttribute(\"data-p\")], n.getAttribute(\"data-pr\"),\r\n                    n.classList.contains(\"et-muet\"));\r\n            });\r\n            etSvg.addEventListener(\"mouseleave\", function () { hideTooltip(); etLigne(null); });\r\n            etSvg.addEventListener(\"click\", function (e) {\r\n                var n = e.target.closest ? e.target.closest(\".et-fleur, .et-muet\") : null;\r\n                if (!n) return;\r\n                e.stopPropagation();\r\n                hideTooltip();\r\n                openFicheProjet(PROJETS[+n.getAttribute(\"data-p\")]);\r\n            });\r\n\r\n            etPiste.addEventListener(\"scroll\", function () {\r\n                hideTooltip();\r\n                etWake();\r\n            }, { passive: true });\r\n\r\n            etPiste.addEventListener(\"keydown\", function (e) {\r\n                var next = {ArrowDown:1, ArrowRight:1, PageDown:1, ArrowUp:-1, ArrowLeft:-1, PageUp:-1};\r\n                if (next[e.key] || e.key === \"Home\" || e.key === \"End\") {\r\n                    e.preventDefault();\r\n                    etVersEtage(e.key === \"Home\" ? 0 : e.key === \"End\" ? 2 : etRequested + next[e.key]);\r\n                }\r\n            });\r\n            \/\/ Les marqueurs sont aussi atteignables au clavier, sur le plan actif.\r\n            etSvg.querySelectorAll(\".et-fleur, .et-muet\").forEach(function (node) {\r\n                var p = PROJETS[+node.dataset.p];\r\n                node.setAttribute(\"role\", \"button\");\r\n                node.setAttribute(\"aria-label\", \"Ouvrir la fiche : \" + (p.porteur || p.projet));\r\n                node.addEventListener(\"keydown\", function (e) {\r\n                    if (e.key === \"Enter\" || e.key === \" \") {\r\n                        e.preventDefault(); e.stopPropagation(); openFicheProjet(p);\r\n                    }\r\n                });\r\n            });\r\n            \/\/ Le cartouche est rempli AVANT le cadrage : c'est sa hauteur qui\r\n            \/\/ dit jusqu'o\u00f9 la dalle peut monter \u00e0 c\u00f4t\u00e9 de lui.\r\n            etAnnoter(keepLevel);\r\n            etMesurer();\r\n            etCamera = keepLevel; etRequested = keepLevel;\r\n            etPiste.scrollTo({top:keepLevel * etPasH, behavior:\"instant\"});\r\n            etCadrer();\r\n        }\r\n\r\n        \/\/ La hauteur de d\u00e9filement est pos\u00e9e \u00e0 la main : la sc\u00e8ne coll\u00e9e mesure un\r\n        \/\/ cadre, sa marge n\u00e9gative la retire du flux pour que les crans d\u00e9marrent \u00e0\r\n        \/\/ z\u00e9ro, et chaque cran vaut un \u00e9tage. Une marge en pourcentage se\r\n        \/\/ calculerait sur la LARGEUR du conteneur, ce qui n'aurait aucun sens.\r\n        function etMesurer(){\r\n            if (!etPiste || !etColle) return;\r\n            var h = etPiste.clientHeight;\r\n            if (h < 60) return;\r\n            etMeasuredW = etPiste.clientWidth;\r\n            etMeasuredH = h;\r\n            \/\/ Un cran ne vaut PAS une hauteur de cadre. \u00c0 ce prix, il fallait\r\n            \/\/ d\u00e9rouler une demi-page pour changer d'\u00e9tage, et un cran de molette\r\n            \/\/ trop court se faisait ramener en arri\u00e8re par l'aimant : la descente\r\n            \/\/ paraissait coll\u00e9e. Une demi-hauteur, c'est une chiquenaude par \u00e9tage.\r\n            etPasH = Math.max(210, Math.min(430, Math.round(h * 0.55)));\r\n            etColle.style.height = h + \"px\";\r\n            etColle.style.marginBottom = (-h) + \"px\";\r\n            \/\/ Le pied est une vraie zone r\u00e9serv\u00e9e : ni dalle ni fleur ne peut\r\n            \/\/ passer derri\u00e8re sa l\u00e9gende, m\u00eame si elle se replie sur deux lignes.\r\n            var footer = etColle.querySelector(\".et-bottom\");\r\n            etColle.style.setProperty(\"--et-footer\", footer.offsetHeight + \"px\");\r\n            \/\/ La l\u00e9gende se resserre AVANT le cadrage, qui mesure le cartouche.\r\n            etSerrerThemes();\r\n            var sceneW = etSvg.clientWidth, sceneH = etSvg.clientHeight;\r\n            if (sceneW > 0 && sceneH > 0){\r\n                var cadre = etCadrage(sceneW, sceneH);\r\n                etMondeW = sceneW \/ cadre.k;\r\n                etMondeH = sceneH \/ cadre.k;\r\n                etCentreX = cadre.cx \/ cadre.k;\r\n                etBaseY = cadre.cy \/ cadre.k;\r\n                etSvg.setAttribute(\"viewBox\", \"0 0 \" + etMondeW.toFixed(1) + \" \" + etMondeH.toFixed(1));\r\n            }\r\n\r\n            etPasN.forEach(function (n) { n.style.height = etPasH + \"px\"; });\r\n            \/\/ Sans ce talon, la course s'arr\u00eaterait une hauteur de cadre trop t\u00f4t\r\n            \/\/ et le dernier \u00e9tage resterait hors d'atteinte : la course vaut la\r\n            \/\/ hauteur du contenu moins celle du cadre, pas la somme des crans.\r\n            if (etQueue) etQueue.style.height = Math.max(0, h - etPasH) + \"px\";\r\n        }\r\n\r\n        \/\/ Le cadrage : la plus grande \u00e9chelle \u00e0 laquelle la dalle, le ciel de ses\r\n        \/\/ fleurs et le chant de l'\u00e9tage suivant tiennent dans la sc\u00e8ne sans passer\r\n        \/\/ sous le cartouche ni sous le filtre, pos\u00e9s dans les deux angles du haut.\r\n        \/\/ La dalle est un losange : elle laisse libres les quatre coins du cadre,\r\n        \/\/ mais le cartouche est assez haut pour mordre sur sa pente. On cherche\r\n        \/\/ donc, \u00e9chelle apr\u00e8s \u00e9chelle, une position qui les \u00e9vite, en gardant la\r\n        \/\/ dalle au milieu tant que rien ne la pousse. Rendu en pixels de sc\u00e8ne.\r\n        function etCadrage(W, H){\r\n            var fullW = Math.max(etPlanW, ET_CADRE_W * ISO_W), fullH = Math.max(etPlanH, ET_CADRE_H * ISO_H);\r\n            var ciel = ET_SOCLE + ET_TIGE + ET_FLEUR \/ 2 + 4;\r\n            \/\/ Sous la dalle, de quoi lire le chant et le liser\u00e9 de la suivante.\r\n            var pile = ET_EP + etChute + ET_EP + 6;\r\n            \/\/ Les bo\u00eetes sont mesur\u00e9es \u00e0 l'\u00e9cran puis ramen\u00e9es en pixels de mise en\r\n            \/\/ page : un th\u00e8me qui agrandit la page par une transformation ne doit\r\n            \/\/ pas d\u00e9placer la dalle.\r\n            var m = 14, s = etSvg.getBoundingClientRect(), zoom = s.width \/ W || 1, gene = [];\r\n            [etAnnot, document.getElementById(\"legend\")].forEach(function (n) {\r\n                if (!n || n.hidden) return;\r\n                var b = n.getBoundingClientRect();\r\n                if (!b.width || !b.height) return;\r\n                gene.push({ x0: (b.left - s.left) \/ zoom - 18, x1: (b.right - s.left) \/ zoom + 18, y1: (b.bottom - s.top) \/ zoom + 14 });\r\n            });\r\n            var k = Math.min((W - 2 * m) \/ fullW, (H - 2 * m) \/ (fullH + ciel + pile));\r\n            var repli = null;\r\n            for (var essai = 0; essai < 30; essai++, k *= 0.97){\r\n                var hw = etPlanW \/ 2 * k, hh = etPlanH \/ 2 * k, cielK = ciel * k;\r\n                var cyMin = m + hh + cielK, cyMax = H - m - hh - pile * k;\r\n                if (cyMin > cyMax) continue;\r\n                if (!repli) repli = { k: k, cx: W \/ 2, cy: (cyMin + cyMax) \/ 2 };\r\n                \/\/ Au milieu d'abord ; plus bas ensuite, o\u00f9 la pente de la dalle\r\n                \/\/ laisse plus de place aux rep\u00e8res du haut.\r\n                var cys = [(cyMin + cyMax) \/ 2, cyMax];\r\n                for (var j = 0; j < cys.length; j++){\r\n                    var cy = cys[j], lo = m + hw, hi = W - m - hw;\r\n                    gene.forEach(function (b) {\r\n                        \/\/ Une bo\u00eete qui passe au-dessus de la plus haute fleur ne g\u00eane pas.\r\n                        if (b.y1 <= cy - hh - cielK) return;\r\n                        \/\/ Sinon, son coin bas doit rester au-dessus de la pente la plus\r\n                        \/\/ proche, ou la dalle doit s'\u00e9carter d'elle tout enti\u00e8re.\r\n                        var pente = Math.max(0, cy - cielK - b.y1) * hw \/ hh;\r\n                        if (b.x0 + b.x1 < W) lo = Math.max(lo, b.x1 + hw - pente);\r\n                        else hi = Math.min(hi, b.x0 - hw + pente);\r\n                    });\r\n                    if (lo <= hi) return { k: k, cx: Math.max(lo, Math.min(hi, W \/ 2)), cy: cy };\r\n                }\r\n            }\r\n            return repli || { k: Math.min(W \/ fullW, H \/ fullH), cx: W \/ 2, cy: H \/ 2 };\r\n        }\r\n\r\n        \/\/ O\u00f9 se pose un plan, selon sa distance \u00e0 l'\u00e9tage regard\u00e9. Au-dessous, il\r\n        \/\/ s'enfonce en se resserrant sur les suivants : la dalle reste presque\r\n        \/\/ pleine, pour que la pile se lise, et son sol s'efface tout \u00e0 fait, pour\r\n        \/\/ que ses socles ne se m\u00ealent pas \u00e0 ceux qu'on lit. Au-dessus, il grandit\r\n        \/\/ et file vers le haut, comme un plafond qu'on traverse.\r\n        function etPose(d){\r\n            if (d >= 0){\r\n                return {\r\n                    s: 1 \/ (1 + 0.035 * d),\r\n                    y: etChute * d,\r\n                    o: 1 \/ (1 + 0.14 * d * d),\r\n                    \/\/ Le CARR\u00c9, et non la distance : \u00e0 mi-chemin, le sol qui\r\n                    \/\/ monte est d\u00e9j\u00e0 aux deux tiers de sa densit\u00e9, et c'est lui\r\n                    \/\/ qu'on regarde. Une opacit\u00e9 lin\u00e9aire le laissait \u00e0 moiti\u00e9\r\n                    \/\/ transparent tout le temps du passage. Au repos, un cran\r\n                    \/\/ plus bas, il est nul : la pile ne montre que ses dalles.\r\n                    sol: Math.max(0, 1 - 1.3 * d * d)\r\n                };\r\n            }\r\n            \/\/ L'\u00e9tage qu'on quitte s'efface LENTEMENT, lui aussi en carr\u00e9 : il\r\n            \/\/ reste large et presque net au-dessus de la t\u00eate pendant la premi\u00e8re\r\n            \/\/ moiti\u00e9 du passage, puis s'en va d'un coup. Les deux courbes se\r\n            \/\/ croisent haut, vers 0,7 chacune : \u00e0 mi-descente on voit les DEUX\r\n            \/\/ \u00e9tages, l'un au-dessus de l'autre, et c'est cette image-l\u00e0 qui dit\r\n            \/\/ qu'on traverse un plancher.\r\n            var a = -d;\r\n            return {\r\n                s: 1 + 0.16 * a,\r\n                y: -a * etPlanH * 0.8,\r\n                o: Math.max(0, 1 - 1.6 * a * a),\r\n                sol: 1\r\n            };\r\n        }\r\n\r\n        \/\/ La cam\u00e9ra, rejou\u00e9e \u00e0 chaque image de d\u00e9filement. Trois transformations,\r\n        \/\/ six opacit\u00e9s, et de loin en loin un changement d'ordre : c'est tout ce\r\n        \/\/ que co\u00fbte la descente.\r\n        function etCadrer(now){\r\n            etRAF = 0;\r\n            if (!etPiste || !etPasH || !etPlansG.length || !isEtages()) return;\r\n            \/\/ Le navigateur peut r\u00e9-aimanter le scroll avant le recalage du resize.\r\n            \/\/ Garder l'\u00e9tage courant jusqu'\u00e0 ce que les nouvelles dimensions soient pos\u00e9es.\r\n            if (etPiste.clientWidth !== etMeasuredW || etPiste.clientHeight !== etMeasuredH) return;\r\n            var target = Math.max(0, Math.min(2, etPiste.scrollTop \/ etPasH));\r\n            var stamp = typeof now === \"number\" ? now : performance.now();\r\n            var dt = etFrameTime ? Math.min(40, stamp - etFrameTime) : 16;\r\n            etFrameTime = stamp;\r\n            \/\/ Amortissement ind\u00e9pendant de la fr\u00e9quence de l\u2019\u00e9cran. Aucune boucle au repos.\r\n            etCamera += (target - etCamera) * (reducedMotion.matches ? 1 : 1 - Math.exp(-dt \/ 78));\r\n            if (Math.abs(target - etCamera) < .0007) etCamera = target;\r\n            else etWake();\r\n            var prog = etCamera;\r\n            var rangs = [];\r\n\r\n            \/\/ Le plongeon de cam\u00e9ra ENTRE deux \u00e9tages : la sc\u00e8ne se rapproche \u00e0\r\n            \/\/ mi-chemin puis se repose sur le cran suivant. Sans lui, la descente\r\n            \/\/ n'est qu'un glissement ; avec lui, on tombe d'un \u00e9tage.\r\n            var frac = prog - Math.floor(prog);\r\n            var dol = Math.sin(Math.max(0, Math.min(1, frac)) * Math.PI);\r\n            if (etScene){\r\n                etScene.setAttribute(\"transform\",\r\n                    \"translate(\" + etCentreX.toFixed(1) + \",\" + (etBaseY - dol * 16).toFixed(1)\r\n                    + \") scale(\" + (1 + dol * 0.068).toFixed(4) + \") translate(\"\r\n                    + (-etCentreX).toFixed(1) + \",\" + (-etBaseY).toFixed(1) + \")\");\r\n            }\r\n\r\n            PROMESSES.forEach(function (pr, i) {\r\n                var d = i - prog, p = etPose(d), g = etPlansG[i];\r\n                if (!g) return;\r\n                g.setAttribute(\"transform\",\r\n                    \"translate(\" + etCentreX.toFixed(1) + \",\" + (etBaseY + p.y).toFixed(1) + \")\"\r\n                    + \" scale(\" + p.s.toFixed(4) + \")\"\r\n                    + \" translate(\" + (-etCxLocal).toFixed(1) + \",\" + (-etCyLocal).toFixed(1) + \")\");\r\n                g.style.opacity = p.o.toFixed(3);\r\n                if (etSols[i]) etSols[i].style.opacity = p.sol.toFixed(3);\r\n                \/\/ L'ombre n'a de sens que sous l'\u00e9tage de devant : d\u00e8s que son plan\r\n                \/\/ s'\u00e9loigne ou remonte, elle s'en d\u00e9tache et n'est plus qu'une\r\n                \/\/ tache grise pos\u00e9e sur la dalle d'en dessous.\r\n                var om = etOmbres[i];\r\n                if (om) om.style.opacity = Math.max(0, 1 - Math.abs(d) * 1.7).toFixed(3);\r\n                rangs.push({ i: i, d: d });\r\n            });\r\n\r\n            \/\/ Peintre : du plus lointain au plus proche. L'\u00e9tage qu'on vient de\r\n            \/\/ quitter est le plus pr\u00e8s de l'oeil, donc le dernier peint.\r\n            rangs.sort(function (a, b) { return b.d - a.d; });\r\n            var cle = rangs.map(function (r) { return r.i; }).join(\"\");\r\n            if (cle !== etOrdre){\r\n                etOrdre = cle;\r\n                rangs.forEach(function (r) { etScene.appendChild(etPlansG[r.i]); });\r\n            }\r\n\r\n            if (Math.abs(target - Math.round(target)) < .01) etRequested = Math.round(target);\r\n            var actif = Math.max(0, Math.min(PROMESSES.length - 1, Math.round(prog)));\r\n            if (actif !== etActif){\r\n                etActif = actif;\r\n                etPlansG.forEach(function (g, i) {\r\n                    var on = i === actif;\r\n                    g.classList.toggle(\"is-active\", on);\r\n                    var pref = on ? FL_PREFIX : FL_PREFIX_PLAN;\r\n                    g.querySelectorAll(\"use.et-use\").forEach(function(u){\r\n                        u.setAttribute(\"href\", \"#\" + pref + u.getAttribute(\"data-code\"));\r\n                    });\r\n                    \/\/ Un plan transparent reste cliquable : sans cela, l'\u00e9tage qu'on\r\n                    \/\/ vient de traverser, agrandi par-dessus tout le cadre, volerait\r\n                    \/\/ les clics destin\u00e9s \u00e0 celui qu'on regarde.\r\n                    g.style.pointerEvents = on ? \"\" : \"none\";\r\n                    g.setAttribute(\"aria-hidden\", on ? \"false\" : \"true\");\r\n                    g.querySelectorAll(\".et-fleur, .et-muet\").forEach(function (n) {\r\n                        n.setAttribute(\"tabindex\", on ? \"0\" : \"-1\");\r\n                    });\r\n                });\r\n                etAnnoter(actif);\r\n                etPiste.style.setProperty(\"--et-accent\", etAccents[actif]);\r\n                etPiste.querySelector(\".et-watermark\").textContent = \"0\" + (actif + 1);\r\n                \/\/ La sc\u00e8ne prend la teinte de la promesse qu'on regarde : le\r\n                \/\/ changement d'\u00e9tage se voit avant m\u00eame qu'on ait lu le cartouche.\r\n                etPiste.style.setProperty(\"--et-teinte\", PROMESSES[actif].color);\r\n            }\r\n        }\r\n\r\n        function etVersEtage(i){\r\n            if (!etPiste || !etPasH) return;\r\n            etRequested = Math.max(0, Math.min(2, i));\r\n            etPiste.scrollTo({ top: etRequested * etPasH, behavior: reducedMotion.matches ? \"instant\" : \"smooth\" });\r\n        }\r\n\r\n        \/\/ Apr\u00e8s un redimensionnement, la sc\u00e8ne se remesure et se repose sur l'\u00e9tage\r\n        \/\/ regard\u00e9, sans animation : on n'a pas d\u00e9fil\u00e9, on a chang\u00e9 de fen\u00eatre.\r\n        function etRecaler(){\r\n            \/\/ L'\u00e9tage regard\u00e9 se note AVANT de remesurer : changer la hauteur des\r\n            \/\/ crans d\u00e9place le d\u00e9filement, ce qui d\u00e9clenche un tour de cam\u00e9ra, qui\r\n            \/\/ recalcule l'\u00e9tage courant depuis une position qui n'a plus de sens.\r\n            \/\/ On repartait alors du premier \u00e9tage \u00e0 chaque poign\u00e9e tir\u00e9e.\r\n            var etage = Math.max(0, etActif);\r\n            etMesurer();\r\n            if (!etPiste || !etPasH) return;\r\n            void etPiste.scrollHeight;   \/\/ force la remise en page avant de viser\r\n            etCamera = etage; etRequested = etage;\r\n            var cible = etage * etPasH;\r\n            try { etPiste.scrollTo({ top: cible, behavior: \"instant\" }); }\r\n            catch (e){ etPiste.scrollTop = cible; }\r\n            etCadrer();\r\n        }\r\n\r\n        function etageTip(event, p, prKey, muet){\r\n            if (!p) return;\r\n            var pr = PROMESSES.filter(function (x) { return x.key === prKey; })[0];\r\n            var box = container.getBoundingClientRect();\r\n            var couches = FLORA_LAYERS.filter(function (L) {\r\n                return p.floraStates[L.key] !== \"none\";\r\n            }).map(function (L) { return L.label; });\r\n            tooltip.innerHTML = \"<strong>\" + escapeHTML(p.porteur || p.projet) + \"<\\\/strong>\"\r\n                + escapeHTML(themeLabel(p.theme)) + \" &middot; \" + p.score + \"\/3 promesses &middot; \"\r\n                + p.empreinte + \"\/4 couches d'impact\"\r\n                + (pr ? \"<em>\" + escapeHTML(pr.label) + \" : \"\r\n                    + (muet ? \"non document\u00e9e par cette structure\" : escapeHTML(shorten(p[pr.key], 150)))\r\n                    + \"<\\\/em>\" : \"\")\r\n                + \"<em>\" + (couches.length ? \"Impact document\u00e9 : \" + escapeHTML(couches.join(\", \"))\r\n                    : \"Aucune couche d'impact renseign\u00e9e\") + \"<\\\/em>\"\r\n                + \"<em>Cliquez pour lire la fiche<\\\/em>\";\r\n            tooltip.style.opacity = 1;\r\n            var x = event.clientX - box.left + 16, y = event.clientY - box.top + 14;\r\n            if (x + 310 > box.width) x = event.clientX - box.left - 316;\r\n            if (y + 170 > box.height) y = Math.max(6, event.clientY - box.top - 170);\r\n            tooltip.style.left = x + \"px\";\r\n            tooltip.style.top = y + \"px\";\r\n        }\r\n\r\n\r\n        \/\/ ============ 10. BASCULE ROUE \/ FREINS \/ FLEURS ============\r\n        document.getElementById(\"indicator-tabs\").addEventListener(\"click\", function(e){\r\n            var btn = e.target.closest(\".toggle-btn\");\r\n            if (btn) activateTab(btn.getAttribute(\"data-ind\"));\r\n        });\r\n\r\n        document.getElementById(\"territoire-modes\").addEventListener(\"click\", function(e){\r\n            var btn = e.target.closest(\"[data-territoire]\");\r\n            if (!btn || territoireMode === btn.dataset.territoire) return;\r\n            territoireMode = btn.dataset.territoire;\r\n            this.querySelectorAll(\"button\").forEach(function(b){\r\n                b.setAttribute(\"aria-pressed\", b === btn ? \"true\" : \"false\");\r\n            });\r\n            switchIndicator();\r\n        });\r\n\r\n        \/\/ Un mode sans onglet \u00e0 lui allume celui qui le porte.\r\n        var fleursMode = false;   \/\/ vrai quand la bascule Grille \/ 3 \u00e9tages demande la grille\r\n        function tabDe(key){\r\n            var i = INDICATORS.filter(function(x){ return x.key === key; })[0];\r\n            return i && i.sous ? i.sous : key;\r\n        }\r\n        document.getElementById(\"fleurs-modes\").addEventListener(\"click\", function(e){\r\n            var btn = e.target.closest(\"[data-fleurs]\");\r\n            if (btn){ fleursMode = true; activateTab(btn.dataset.fleurs); fleursMode = false; }\r\n        });\r\n\r\n        function activateTab(key){\r\n            var tabs = document.getElementById(\"indicator-tabs\");\r\n            var target = tabs.querySelector('.toggle-btn[data-ind=\"' + tabDe(key) + '\"]');\r\n            if (!target || indicator.key === key) return;\r\n            \/\/ L'onglet Fleurs s'ouvre sur les \u00e9tages ; la grille est le second mode.\r\n            if (key === \"fleurs\" && !fleursMode){\r\n                if (tabDe(indicator.key) === \"fleurs\") return;\r\n                key = \"etages\";\r\n            }\r\n            tabs.querySelectorAll(\".toggle-btn\").forEach(function(b){\r\n                var on = b === target;\r\n                b.classList.toggle(\"active\", on);\r\n                b.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\r\n                b.tabIndex = on ? 0 : -1;\r\n            });\r\n            target.scrollIntoView({block:\"nearest\",inline:\"nearest\"});\r\n            indicator = INDICATORS.filter(function(i){ return i.key === key; })[0];\r\n            switchIndicator();\r\n            ongletEntree();\r\n        }\r\n\r\n        \/\/ Changer d'onglet ne coupe plus sec : la nouvelle vue monte de\r\n        \/\/ quelques pixels en se r\u00e9v\u00e9lant, puis chaque vue joue sa propre\r\n        \/\/ entr\u00e9e. La bascule elle-m\u00eame reste synchrone (les appels qui\r\n        \/\/ encha\u00eenent activateTab puis zoomTo ou renderFlux en d\u00e9pendent) :\r\n        \/\/ seule l'apparition est anim\u00e9e. Translation seule, sans \u00e9chelle,\r\n        \/\/ pour ne pas fausser les mesures que les vues prennent en arrivant.\r\n        function ongletEntree(){\r\n            if (reducedMotion.matches) return;\r\n            var m = document.querySelector(\"#reu-roue-wp .main-content\");\r\n            if (!m) return;\r\n            m.classList.remove(\"is-entree\");\r\n            void m.offsetWidth;\r\n            m.classList.add(\"is-entree\");\r\n        }\r\n        document.querySelector(\"#reu-roue-wp .main-content\").addEventListener(\"animationend\", function(e){\r\n            if (e.target === this && e.animationName === \"ongletEntree\") this.classList.remove(\"is-entree\");\r\n        });\r\n\r\n        \/\/ Le radar ne se lit pas comme la roue : on explique ce que mesure\r\n        \/\/ chaque axe, sinon la forme reste abstraite.\r\n        function updateSubtitle(){\r\n            var el = document.querySelector(\"#reu-roue-wp .map-subtitle\");\r\n            el.textContent = isCarte()\r\n                ? \"Localisation territoriale des projets soutenus \u00e0 travers la M\u00e9tropole.\"\r\n                : isRadar()\r\n                ? \"Comprendre les obstacles rencontr\u00e9s par les porteurs de projets.\"\r\n                : isFleurs() ? \"Les dimensions d\u2019impact document\u00e9es par chaque association.\"\r\n                : isEtages() ? \"Am\u00e9liorer, \u00e9manciper, r\u00e9v\u00e9ler : les trois promesses du fonds.\"\r\n                : isFlux() ? \"Ce que chaque th\u00e9matique verse aux trois promesses du fonds.\"\r\n                : isClassement() ? \"Le poids r\u00e9el de chaque th\u00e9matique dans le fonds.\"\r\n                : \"Explorez les projets soutenus par le fonds d\u2019innovation sociale.\";\r\n            document.getElementById(\"stage-label\").textContent = isCarte() ? \"Carte territoriale\" : isRadar() ? \"Les freins rencontr\u00e9s\" : isFleurs() ? \"Les fleurs des associations\" : isFlux() ? \"Qui agit \u00e0 quel \u00e9tage\" : isEtages() ? \"Les trois promesses\" : isClassement() ? \"Le classement des th\u00e9matiques\" : focus === root ? \"Vue d\u2019ensemble\" : labelText(focus);\r\n            var onglets = INDICATORS.filter(function(i){ return !i.sous; });\r\n            document.getElementById(\"stage-index\").textContent = String(onglets.indexOf(INDICATORS.filter(function(i){ return i.key === tabDe(indicator.key); })[0]) + 1).padStart(2, \"0\") + \" \/ \" + String(onglets.length).padStart(2, \"0\");\r\n            document.getElementById(\"stage-caption\").hidden = isScoped();\r\n            updateRoueCaption();\r\n            document.getElementById(\"reading-note\").textContent = isCarte()\r\n                ? \"Cliquez sur une commune ou un projet pour explorer son ancrage territorial.\"\r\n                : isRadar()\r\n                ? \"Un projet peut documenter plusieurs freins. Filtrez par th\u00e9matique.\"\r\n                : isFleurs() ? \"Chaque fleur repr\u00e9sente un projet. Cliquez pour lire sa fiche.\"\r\n                : isEtages() ? \"Un \u00e9tage par promesse. Faites d\u00e9filer pour descendre.\"\r\n                : isFlux() ? \"Un ruban par couple th\u00e9matique et promesse. Survolez pour isoler.\"\r\n                : isClassement() ? \"Une courbe par th\u00e9matique. Survolez pour lire les financements.\"\r\n                : focus !== root ? \"Cliquez un secteur pour poursuivre. Le centre permet de revenir.\"\r\n                : (roueMode === \"fis\" && ROSE_CONC)\r\n                    ? \"Le p\u00e9tale dit l\u2019argent engag\u00e9, pas le nombre de projets. Les \"\r\n                      + ROSE_CONC.n + \" plus gros projets en concentrent \" + ROSE_CONC.pct + \" %.\"\r\n                : \"Choisissez une th\u00e9matique pour explorer ses projets.\";\r\n        }\r\n\r\n        document.getElementById(\"legend-trigger\").addEventListener(\"click\", function(){\r\n            var aside = document.getElementById(\"legend\");\r\n            if (!aside) return;\r\n            var ouvert = aside.classList.toggle(\"is-open\");\r\n            this.setAttribute(\"aria-expanded\", ouvert ? \"true\" : \"false\");\r\n        });\r\n\r\n        document.getElementById(\"roue-modes\").addEventListener(\"click\", function(e){\r\n            var btn = e.target.closest(\".rmode\");\r\n            if (!btn || btn.classList.contains(\"active\")) return;\r\n            roueMode = btn.getAttribute(\"data-rmode\");\r\n            hideTooltip();\r\n            basculePetales();\r\n        });\r\n\r\n        document.getElementById(\"freins-modes\").addEventListener(\"click\", function(e){\r\n            var btn = e.target.closest(\".rmode\");\r\n            if (!btn || btn.classList.contains(\"active\")) return;\r\n            this.querySelectorAll(\".rmode\").forEach(function(b){ b.classList.toggle(\"active\", b === btn); });\r\n            freinsMode = btn.getAttribute(\"data-fmode\");\r\n            hideTooltip();\r\n            setViewMode();\r\n        });\r\n\r\n        function switchIndicator(){\r\n            hideTooltip();\r\n            highlight(null);\r\n            closeDetail();\r\n            updateSubtitle();\r\n            if (isScoped()){\r\n                \/\/ Bascule vers le radar ou la galerie : la roue est masqu\u00e9e,\r\n                \/\/ pas d\u00e9truite, et le fil d'Ariane n'a plus d'objet.\r\n                \/\/ setViewMode en dernier : barres et galerie r\u00e9servent la\r\n                \/\/ hauteur de l'en-t\u00eate, qui vient de changer (crumbs, KPI).\r\n                renderCrumbs();\r\n                renderLegend();\r\n                renderKPI();\r\n                setViewMode();\r\n                return;\r\n            }\r\n            setViewMode();\r\n            renderCrumbs();\r\n            \/\/ Le cadre du disque change de largeur avec la vue : en plein cadre\r\n            \/\/ il prend toute la place, en colonne il la rend au panneau. On le\r\n            \/\/ remesure, sinon il reste cal\u00e9 sur la vue qu'on vient de quitter.\r\n            computeSize();\r\n            redrawStatic();\r\n            pathSel.transition().duration(motion(420)).attr(\"fill\", nodePaint);\r\n            labelSel\r\n                .style(\"fill\", function(d){ return labelInk(nodeFill(d)); })\r\n                .style(\"stroke\", function(d){ return labelHalo(nodeFill(d)); });\r\n            updateTitles();\r\n            updateCenterLabel();\r\n            renderLegend();\r\n            renderKPI();\r\n        }\r\n\r\n        \/\/ Geometry-only resize preserves the focused branch and open project.\r\n        var resizeTimer;\r\n        window.addEventListener(\"resize\", function(){\r\n            clearTimeout(resizeTimer);\r\n            resizeTimer = setTimeout(function(){\r\n                computeSize(); redrawStatic();\r\n                if (isRadar()) refreshFreinsView(false);\r\n                if (isFleurs()) renderFlora();\r\n                if (isClassement()) renderClassement(false);\r\n                \/\/ Le diagramme est dessin\u00e9 \u00e0 la taille exacte du cadre : un\r\n                \/\/ cadre qui change, c'est une g\u00e9om\u00e9trie \u00e0 refaire.\r\n                if (isFlux()) renderFlux(false);\r\n                \/\/ Les \u00e9tages ne se re-rendent pas : ils se remesurent et se\r\n                \/\/ reposent sur l'\u00e9tage regard\u00e9. Les redessiner remettrait la\r\n                \/\/ descente \u00e0 z\u00e9ro \u00e0 chaque poign\u00e9e tir\u00e9e.\r\n                if (isEtages()) etRecaler();\r\n                var legend = document.getElementById(\"legend\");\r\n                legend.classList.toggle(\"is-menu\", isFleurs() || isEtages() || window.innerWidth <= 860);\r\n            }, 120);\r\n        });\r\n        document.getElementById(\"fullscreen-btn\").addEventListener(\"click\", function(){\r\n            if (document.fullscreenElement){ document.exitFullscreen(); }\r\n            else if (document.documentElement.requestFullscreen){\r\n                document.documentElement.requestFullscreen().catch(function(){\r\n                    document.getElementById(\"fullscreen-btn\").title = \"Utilisez le mode plein \u00e9cran du navigateur.\";\r\n                });\r\n            }\r\n        });\r\n        document.addEventListener(\"fullscreenchange\", function(){\r\n            var active = !!document.fullscreenElement;\r\n            var button = document.getElementById(\"fullscreen-btn\");\r\n            button.querySelector(\"span\").textContent = active ? \"Quitter le plein \u00e9cran\" : \"Plein \u00e9cran\";\r\n            button.setAttribute(\"aria-label\", active ? \"Quitter le plein \u00e9cran\" : \"Passer en plein \u00e9cran\");\r\n        });\r\n        document.getElementById(\"reu-roue-wp\").addEventListener(\"keydown\", function(e){\r\n            if (e.key === \"Escape\"){\r\n                if (detail.classList.contains(\"is-open\")){ closeDetail(); }\r\n                else if (!isScoped() && focus !== root){ zoomTo(focus.parent || root); }\r\n                hideTooltip();\r\n            }\r\n        });\r\n        document.getElementById(\"indicator-tabs\").addEventListener(\"keydown\", function(e){\r\n            var tabs = Array.from(this.querySelectorAll(\".toggle-btn\"));\r\n            var i = tabs.indexOf(document.activeElement);\r\n            if (i < 0 || ![\"ArrowRight\", \"ArrowLeft\", \"Home\", \"End\"].includes(e.key)) return;\r\n            e.preventDefault();\r\n            var next = e.key === \"Home\" ? 0 : e.key === \"End\" ? tabs.length-1 : (i + (e.key === \"ArrowRight\" ? 1 : -1) + tabs.length) % tabs.length;\r\n            tabs[next].focus(); activateTab(tabs[next].dataset.ind);\r\n        });\r\n\r\n        \/\/ ============ MODE PR\u00c9SENTATION ============\r\n        \/\/ Une suite d'\u00e9tapes qu'on d\u00e9roule aux fl\u00e8ches (ou \u00e0 la t\u00e9l\u00e9commande,\r\n        \/\/ qui envoie PageUp \/ PageDown). Chaque \u00e9tape pose une vue, puis,\r\n        \/\/ une fois le mouvement fini, sa phrase de constat en grand.\r\n        \/\/ \u00c9chap ou la sortie du plein \u00e9cran rendent le site tel quel.\r\n        var PRES = { on: false, i: 0, minuteur: null, el: null };\r\n\r\n        function presEuros(v){\r\n            if (v >= 1e6) return (Math.round(v \/ 1e5) \/ 10).toLocaleString(\"fr-FR\") + \" M\u20ac\";\r\n            return Math.round(v \/ 1000).toLocaleString(\"fr-FR\") + \" k\u20ac\";\r\n        }\r\n        function presProjets(n){ return n + \" projet\" + (n > 1 ? \"s\" : \"\"); }\r\n        function presParTheme(val){\r\n            return THEMES.map(function(t){\r\n                var list = byTheme.get(t.key) || [];\r\n                return { t: t, n: list.length, v: d3.sum(list, val) };\r\n            }).sort(function(a, b){ return b.v - a.v; });\r\n        }\r\n        function presFis(p){ return p.fisNum || 0; }\r\n        function presRoue(mode){\r\n            var b = document.querySelector('#roue-modes .rmode[data-rmode=\"' + mode + '\"]');\r\n            if (b && !b.classList.contains(\"active\")) b.click();\r\n        }\r\n        function presFlux(mode){\r\n            var t = document.querySelector('#territoire-modes [data-territoire=\"flux\"]');\r\n            if (t && territoireMode !== \"flux\") t.click();\r\n            setTimeout(function(){\r\n                var cadre = document.querySelector(\"#flux .fx-fusion\");\r\n                if (cadre) fluxFusionBasculer(cadre, mode);\r\n            }, 80);\r\n        }\r\n        function presSurRoue(){\r\n            activateTab(\"empreinte\");\r\n            if (focus !== root) zoomTo(root);\r\n        }\r\n\r\n        var PRES_ETAPES = [\r\n            { nom: \"Roue d\u2019impact\", pose: function(){ presSurRoue(); presRoue(\"egal\"); },\r\n              dit: function(){\r\n                  var tot = d3.sum(PROJETS, presFis);\r\n                  return \"<b>\" + presProjets(PROJETS.length) + \"<\/b> soutenus dans \"\r\n                      + THEMES.length + \" th\u00e9matiques, pour <b>\" + presEuros(tot) + \"<\/b> engag\u00e9s.\";\r\n              } },\r\n            { nom: \"Roue d\u2019impact \u00b7 nombre de projets\", pose: function(){ presSurRoue(); presRoue(\"rose\"); },\r\n              dit: function(){\r\n                  var r = presParTheme(function(){ return 1; })[0];\r\n                  return \"<b>\u00ab \" + escapeHTML(r.t.label) + \" \u00bb<\/b> rassemble le plus de projets : \"\r\n                      + r.n + \" sur \" + PROJETS.length + \".\";\r\n              } },\r\n            { nom: \"Roue d\u2019impact \u00b7 montants\", pose: function(){ presSurRoue(); presRoue(\"fis\"); },\r\n              dit: function(){\r\n                  var r = presParTheme(presFis), tot = d3.sum(PROJETS, presFis);\r\n                  var p = tot ? Math.round(r[0].v \/ tot * 100) : 0;\r\n                  return \"<b>\u00ab \" + escapeHTML(r[0].t.label) + \" \u00bb<\/b> capte \" + p\r\n                      + \" % de l\u2019argent engag\u00e9, soit \" + presEuros(r[0].v) + \".\";\r\n              } },\r\n            { nom: \"Zoom sur une th\u00e9matique\",\r\n              pose: function(){\r\n                  activateTab(\"empreinte\"); presRoue(\"fis\");\r\n                  var top = presParTheme(presFis)[0];\r\n                  var node = root.children.find(function(c){ return c.data.themeKey === top.t.key; });\r\n                  setTimeout(function(){ if (node) zoomTo(node); }, 60);\r\n              },\r\n              dit: function(){\r\n                  var r = presParTheme(presFis)[0];\r\n                  return \"Dans <b>\u00ab \" + escapeHTML(r.t.label) + \" \u00bb<\/b> : \" + presProjets(r.n)\r\n                      + \", \" + presEuros(r.v) + \" engag\u00e9s.\";\r\n              } },\r\n            { nom: \"Les trois \u00e9tages\", pose: function(){ activateTab(\"etages\"); },\r\n              dit: function(){\r\n                  return PROMESSES.map(function(pr){\r\n                      var n = PROJETS.filter(function(p){ return p.docs && p.docs[pr.key]; }).length;\r\n                      return \"<b>\" + escapeHTML(pr.label) + \"<\/b> \" + n;\r\n                  }).join(\" \u00b7 \") + \" : les projets qui documentent chaque promesse.\";\r\n              } },\r\n            { nom: \"Fleurs des associations\",\r\n              pose: function(){ fleursMode = true; activateTab(\"fleurs\"); fleursMode = false; },\r\n              dit: function(){\r\n                  var n = new Set(PROJETS.map(function(p){ return p.porteur; })).size;\r\n                  return \"<b>\" + n + \" associations<\/b>, une fleur chacune : ce que chacune documente de son impact.\";\r\n              } },\r\n            { nom: \"Carte\", carte: true,\r\n              pose: function(){\r\n                  activateTab(\"carte\");\r\n                  var b = document.querySelector('#carte-modes [data-carte=\"relief\"]');\r\n                  if (b && b.getAttribute(\"aria-pressed\") !== \"true\") b.click();\r\n                  else if (window.__ampReliefTour && window.__ampReliefTour.pret()) window.__ampReliefTour.rejoue();\r\n              },\r\n              dit: function(){\r\n                  var D = fluxDonnees(\"secteur\");\r\n                  if (!D) return \"Les projets du fonds sur le territoire de la M\u00e9tropole.\";\r\n                  var multi = D.cibles.find(function(C){ return C.key === \"MULTISITE\"; });\r\n                  var m = multi ? multi.n : 0;\r\n                  return \"<b>\" + (D.projets - m) + \" projets sur \" + D.projets\r\n                      + \"<\/b> s\u2019ancrent dans un secteur pr\u00e9cis, \" + m\r\n                      + \" couvrent la ville enti\u00e8re ou la m\u00e9tropole.\";\r\n              } },\r\n            { nom: \"Lieux & financements \u00b7 territoire\", pose: function(){ activateTab(\"flux\"); presFlux(\"secteur\"); },\r\n              dit: function(){ var D = fluxDonnees(\"secteur\"); return D ? fluxConstat(D) : \"\"; } },\r\n            { nom: \"Lieux & financements \u00b7 argent\", pose: function(){ activateTab(\"flux\"); presFlux(\"argent\"); },\r\n              dit: function(){ var D = fluxDonnees(\"argent\"); return D ? fluxConstat(D) : \"\"; } },\r\n            { nom: \"Lieux & financements \u00b7 promesse\", pose: function(){ activateTab(\"flux\"); presFlux(\"promesse\"); },\r\n              dit: function(){ var D = fluxDonnees(\"promesse\"); return D ? fluxConstat(D) : \"\"; } },\r\n            { nom: \"Les freins\",\r\n              pose: function(){\r\n                  activateTab(\"freins\");\r\n                  var b = document.querySelector('#freins-modes .rmode[data-fmode=\"radar\"]');\r\n                  if (b && !b.classList.contains(\"active\")) b.click();\r\n              },\r\n              dit: function(){\r\n                  var fams = FREINS.map(function(f){\r\n                      return { f: f, n: PROJETS.filter(function(p){\r\n                          return p.freinSet && p.freinSet.indexOf(f.code) > -1; }).length };\r\n                  }).sort(function(a, b){ return b.n - a.n; });\r\n                  if (!fams.length || !fams[0].n) return \"\";\r\n                  return \"Les <b>freins \" + escapeHTML(fams[0].f.short.toLowerCase()) + \"<\/b> sont les plus d\u00e9clar\u00e9s : \"\r\n                      + presProjets(fams[0].n) + \" sur \" + PROJETS.length + \" les citent.\";\r\n              } }\r\n        ];\r\n\r\n        function presBandeau(){\r\n            if (PRES.el) return PRES.el;\r\n            var el = document.createElement(\"div\");\r\n            el.className = \"pres-bandeau\";\r\n            el.setAttribute(\"aria-live\", \"polite\");\r\n            el.innerHTML = '<div class=\"pres-piste\">'\r\n                + PRES_ETAPES.map(function(){ return '<i><\\\/i>'; }).join(\"\") + '<\\\/div>'\r\n                + '<p class=\"pres-nom\"><\\\/p><p class=\"pres-dit\"><\\\/p>'\r\n                + '<p class=\"pres-aide\">\u2190 \u2192 pour avancer \u00b7 \u00c9chap pour quitter<\\\/p>';\r\n            document.getElementById(\"reu-roue-wp\").appendChild(el);\r\n            PRES.el = el;\r\n            return el;\r\n        }\r\n\r\n        function presAller(i){\r\n            if (i < 0 || i >= PRES_ETAPES.length) return;\r\n            PRES.i = i;\r\n            var E = PRES_ETAPES[i], el = presBandeau();\r\n            hideTooltip();\r\n            \/\/ Le bandeau se tait pendant que la vue bouge, et revient apr\u00e8s.\r\n            el.classList.remove(\"is-pose\");\r\n            el.querySelectorAll(\".pres-piste i\").forEach(function(b, k){\r\n                b.classList.toggle(\"is-fait\", k <= i);\r\n            });\r\n            E.pose();\r\n            clearTimeout(PRES.minuteur);\r\n            el.classList.toggle(\"is-muet\", !!E.carte);\r\n            PRES.minuteur = setTimeout(function(){\r\n                el.querySelector(\".pres-nom\").textContent = (i + 1) + \" \/ \" + PRES_ETAPES.length + \" \u00b7 \" + E.nom;\r\n                var dit = \"\";\r\n                try { dit = E.dit(); } catch (err){ dit = \"\"; }\r\n                el.querySelector(\".pres-dit\").innerHTML = dit;\r\n                el.classList.add(\"is-pose\");\r\n            }, reducedMotion.matches ? 0 : 1400);\r\n        }\r\n\r\n        function presLancer(){\r\n            if (PRES.on) return;\r\n            PRES.on = true;\r\n            document.getElementById(\"reu-roue-wp\").classList.add(\"is-presente\");\r\n            if (!document.fullscreenElement && document.documentElement.requestFullscreen){\r\n                document.documentElement.requestFullscreen().catch(function(){});\r\n            }\r\n            \/\/ La vue a perdu le bas de l'\u00e9cran : elle se remesure avant la\r\n            \/\/ premi\u00e8re \u00e9tape (et encore une fois quand le plein \u00e9cran est pris).\r\n            window.dispatchEvent(new Event(\"resize\"));\r\n            setTimeout(function(){ presAller(0); }, 200);\r\n        }\r\n\r\n        function presQuitter(){\r\n            if (!PRES.on) return;\r\n            PRES.on = false;\r\n            clearTimeout(PRES.minuteur);\r\n            document.getElementById(\"reu-roue-wp\").classList.remove(\"is-presente\");\r\n            if (PRES.el){ PRES.el.remove(); PRES.el = null; }\r\n            if (document.fullscreenElement) document.exitFullscreen().catch(function(){});\r\n            window.dispatchEvent(new Event(\"resize\"));\r\n        }\r\n\r\n        document.getElementById(\"present-btn\").addEventListener(\"click\", presLancer);\r\n        document.addEventListener(\"fullscreenchange\", function(){\r\n            if (!document.fullscreenElement && PRES.on) presQuitter();\r\n        });\r\n        document.addEventListener(\"keydown\", function(e){\r\n            if (!PRES.on) return;\r\n            var suiv = [\"ArrowRight\", \"ArrowDown\", \"PageDown\", \" \", \"Enter\"];\r\n            var prec = [\"ArrowLeft\", \"ArrowUp\", \"PageUp\", \"Backspace\"];\r\n            \/\/ Sur la carte en relief, les fl\u00e8ches parcourent d'abord ses\r\n            \/\/ propres \u00e9tapes, puis passent \u00e0 la vue suivante.\r\n            var T = PRES_ETAPES[PRES.i].carte && window.__ampReliefTour;\r\n            if (T && !T.pret()) T = null;\r\n            if (suiv.indexOf(e.key) >= 0){\r\n                if (T && T.etape() < T.total() - 1) T.va(T.etape() + 1);\r\n                else presAller(PRES.i + 1);\r\n            }\r\n            else if (prec.indexOf(e.key) >= 0){\r\n                if (T && T.etape() > 0) T.va(T.etape() - 1);\r\n                else presAller(PRES.i - 1);\r\n            }\r\n            else if (e.key === \"Home\"){ presAller(0); }\r\n            else if (e.key === \"End\"){ presAller(PRES_ETAPES.length - 1); }\r\n            else if (e.key === \"Escape\"){ presQuitter(); }\r\n            else return;\r\n            e.preventDefault();\r\n            e.stopPropagation();\r\n        }, true);\r\n\r\n        render();\r\n        if (document.fonts && document.fonts.ready){\r\n            document.fonts.ready.then(function(){ if (!g.classed(\"is-moving\")) redrawStatic(); });\r\n        }\r\n    }\r\n})();\r\n<\/script>\r\n\r\n<script type=\"text\/javascript\" data-category=\"functional\" class=\"cmplz-native\">\r\n(function(){\r\n  \"use strict\";\r\n\r\n  if (window.__ampCarteFISLoaded) return;\r\n  window.__ampCarteFISLoaded = true;\r\n\r\n  \/\/ \u2550\u2550 1. RATTACHEMENTS ADMINISTRATIFS (secteurs PDV, QPV) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  var T = {\"secteurs\":{\"M\u00e9tropole (Multisite)\":\"MULTISITE\",\"Marseille (Toute la ville)\":\"MULTISITE\",\"Marseille 15e et 16e\":\"SUD EST 1\",\"Marseille 13e et 14e\":\"SUD EST 2\",\"Marseille sud est 3\":\"SUD EST 3\",\"La Ciotat\":\"SUD EST 3\",\"Sept\u00e8mes-les-Vallons\":\"SUD EST 3\",\"Allauch\":\"SUD EST 3\",\"Aubagne\":\"SUD EST 3\",\"Aix-en-Provence\":\"NORD\",\"Berre l'Etang\":\"NORD\",\"Gardanne\":\"NORD\",\"Roque d'Anth\u00e9ron\":\"NORD\",\"Martigues\":\"OUEST\",\"Miramas\":\"OUEST\",\"Salon-de-Provence\":\"OUEST\",\"Port-St-Louis-du-Rh\u00f4ne\":\"OUEST\",\"Port-de-Bouc\":\"OUEST\",\"Fos sur Mer\":\"OUEST\",\"Marignane\":\"OUEST\",\"Grans\":\"OUEST\"},\"qpv\":{\"Aix-en-Provence\":[\"Beisson\",\"Corsy\",\"Jas-De-Bouffan\",\"Encagnane\"],\"Berre-l'\u00c9tang\":[\"Quartier Centre Ville\",\"Quartier B\u00e9alet-Bessons-Mari\u00e9lie\"],\"Marignane\":[\"Centre ville\",\"Florida Parc\"],\"Pertuis\":[\"Centre ancien\"],\"Vitrolles\":[\"Secteur Centre\",\"La Frescoule\"],\"Aubagne\":[\"Le Charrel\"],\"Marseille 10, 11e et 12e Arrondissement\":[\"Air Bel\"],\"Marseille 10e Arrondissement\":[\"Ch\u00e2teau Saint Loup\",\"Benza\",\"La Capelette\"],\"Marseille 11e Arrondissement\":[\"Saint Thys\",\"La Rougui\u00e8re\",\"Valbarelle N\u00e9r\u00e9\u00efdes Bosquet\"],\"Marseille 11e Arrondissement et la Penne-sur-Huveaune\":[\"Les Escourtines\"],\"Marseille 12e Arrondissement\":[\"Caillols La Moularde\"],\"Marseille 1er et 5e Arrondissement\":[\"Centre Ville 1er et 2e arrondissements\"],\"Marseille 2e\":[\"Cap Janet La Cabucelle\",\"Les Crottes\"],\"Marseille 2e et 3e Arrondissement\":[\"Centre Ville 3e arrondissement\"],\"Marseille 9e Arrondissement\":[\"La Cravache Le Trioulet\",\"La Cayolle\",\"La Soude Bengale\"],\"Marseille 9e et 10e Arrondissement\":[\"La Sauvag\u00e8re\"],\"Marseille 13e Arrondissement\":[\"Le Petit S\u00e9minaire\",\"Frais Vallon\",\"Saint Gabriel Bon Secours\",\"Malpass\u00e9 Corot\",\"Balustres Cerisaie\",\"Les Olives\",\"Le Clos La Rose\",\"La Marie\",\"Saint J\u00e9r\u00f4me Les Tilleuls\"],\"Marseille 14e Arrondissement\":[\"La Simiane La Paternelle Vieux Moulin\",\"Canet Arnavaux Jean Jaur\u00e8s\",\"Grand Saint Barth\u00e9l\u00e9my\"],\"Marseille 14e\":[\"Bassens\",\"La Visitation\",\"Le Castellas\",\"Micocouliers\"],\"Sept\u00e8mes-les-Vallons\":[\"La Gavotte - Peyret\"],\"Marseille 15e Arrondissement\":[\"La Viste\",\"Kalliste La Grani\u00e8re La Solidarit\u00e9\",\"Les Aygalades\",\"La Savine Bosphore\",\"Saint Louis Campagne L\u00e9v\u00eaque\",\"Les Tilleuls La Maurelette\",\"Plan d'Aou Saint Antoine\"],\"Marseille 15e et 16e Arrondissement\":[\"Consolat Ruisseau Mirabeau\",\"La Castellane La Bricarde\"],\"Marseille 16e Arrondissement\":[\"Saint Henri\",\"Saint Andr\u00e9\"],\"Istres\":[\"Le Pr\u00e9paou\"],\"Martigues\":[\"Mas de Pouane\",\"Notre Dame Des Marins\",\"Canto Perdrix\",\"Boud\u00e8me-les 2 Portes-Bargemont\"],\"Miramas\":[\"La Carraire\",\"La Maille\"],\"Port-de-Bouc\":[\"Les Aigues Douces\",\"Les Comtes\"],\"Port-Saint-Louis-du-Rh\u00f4ne\":[\"Port St Louis\"],\"Salon-de-Provence\":[\"La Monaque\",\"Les Canourgues\"]}};\r\n\r\n  var EPCI_AMP = \"200054807\";\r\n  \/\/ Les deux communes de la m\u00e9tropole hors Bouches-du-Rh\u00f4ne : Pertuis (84) et\r\n  \/\/ Saint-Zacharie (83). Saint-Zacharie est 83120 ; 83112, \u00e9crit ici jusqu'au\r\n  \/\/ 23 septembre 2026, est Saint-Cyr-sur-Mer, hors m\u00e9tropole.\r\n  var HORS_13  = [\"84089\", \"83120\"];\r\n  var ALIAS    = { \"vitroles\":\"vitrolles\" };\r\n\r\n  \/\/ \u2550\u2550 2. GOOGLE SHEET \u00ab GRILLE COMPL\u00c8TE \u00bb \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  var SHEET_ID = \"1sF0RyAW_F-64s0rf6-9jONx629QQGQvr721f9ecL7-0\";\r\n  var SHEET_TAB = \"Grille compl\u00e8te\";\r\n  var SHEET_CSV_URL = \"https:\/\/docs.google.com\/spreadsheets\/d\/\" + SHEET_ID\r\n      + \"\/gviz\/tq?tqx=out:csv&sheet=\" + encodeURIComponent(SHEET_TAB);\r\n\r\n  \/\/ Le corpus vient de la roue, qui le pr\u00eate \u00e0 la page (window.__fisEmbedded) :\r\n  \/\/ les deux vues d\u00e9crivent les m\u00eames projets, elles n'ont aucune raison\r\n  \/\/ d'embarquer deux fois le m\u00eame quart de m\u00e9gaoctet.\r\n  function corpusEmbarque(){ return window.__fisEmbedded || []; }\r\n\r\n  function normHead(s){\r\n    return String(s == null ? \"\" : s).normalize(\"NFD\")\r\n        .replace(\/[\u0300-\u036f]\/g, \"\").toLowerCase()\r\n        .replace(\/\\s+\/g, \" \").trim();\r\n}\r\nvar COL_MATCHERS = [\r\n    [\"theme\",         function(h){ return h.indexOf(\"them\") === 0; }],\r\n    [\"sousTheme\",     function(h){ return h.indexOf(\"sous\") === 0 && h.indexOf(\"themat\") > -1; }],\r\n    [\"porteur\",       function(h){ return h === \"porteur\"; }],\r\n    [\"projet\",        function(h){ return h.indexOf(\"intitul\") > -1; }],\r\n    [\"resume\",        function(h){ return h.indexOf(\"resume\") > -1; }],\r\n    [\"territoire\",    function(h){ return h.indexOf(\"territoire\") > -1; }],\r\n    [\"budget\",        function(h){ return h.indexOf(\"cout du projet\") > -1 || h.indexOf(\"budget\") > -1; }],\r\n    [\"fis\",           function(h){ return h.indexOf(\"part de financement par le fis\") > -1 || h.indexOf(\"fis (euros)\") > -1; }],\r\n    [\"partFis\",       function(h){ return h.indexOf(\"part fis\") > -1 || h.indexOf(\"%\") > -1; }],\r\n    [\"personnes\",     function(h){ return h.indexOf(\"personnes\") > -1; }],\r\n    \/\/ L'inventaire des actions passe avant \u00ab actions \u00bb, dont le motif\r\n    \/\/ attraperait aussi son en-t\u00eate.\r\n    [\"invPartenaires\", function(h){ return h.indexOf(\"inventaire des partenaires\") > -1; }],\r\n    [\"inventaire\",    function(h){ return h.indexOf(\"inventaire\") > -1; }],\r\n    [\"actions\",       function(h){ return h.indexOf(\"actions\") > -1 || h.indexOf(\"evenements\") > -1; }],\r\n    [\"nbPartenaires\", function(h){ return h.indexOf(\"partenaires\") > -1; }],\r\n    [\"competences\",   function(h){ return h.indexOf(\"competences\") > -1; }],\r\n    [\"lienSocial\",    function(h){ return h.indexOf(\"lien social\") > -1; }],\r\n    [\"comportement\",  function(h){ return h.indexOf(\"comportement\") > -1; }],\r\n    [\"sorties\",       function(h){ return h.indexOf(\"sorties\") > -1; }],\r\n    [\"indicateurs\",   function(h){ return h.indexOf(\"indicateurs\") > -1; }],\r\n    [\"freins\",        function(h){ return h.indexOf(\"freins\") > -1; }],\r\n    \/\/ Les trois promesses du fonds, comme sur la roue d'impact. En fin de\r\n    \/\/ liste pour ne voler aucune colonne aux rubriques ci-dessus ; vides si\r\n    \/\/ la feuille ne les porte pas, la fiche dit alors \u00ab non document\u00e9e \u00bb.\r\n    [\"ameliorer\",     function(h){ return h.indexOf(\"ameliorer\") > -1; }],\r\n    [\"emanciper\",     function(h){ return h.indexOf(\"emanciper\") > -1; }],\r\n    [\"reveler\",       function(h){ return h.indexOf(\"reveler\") > -1; }]\r\n];\r\n\r\nfunction parseCSV(text){\r\n    var rows = [], row = [], cur = \"\", q = false, i, ch;\r\n    for (i = 0; i < text.length; i++){\r\n        ch = text[i];\r\n        if (q){\r\n            if (ch === '\"'){ if (text[i + 1] === '\"'){ cur += '\"'; i++; } else q = false; }\r\n            else cur += ch;\r\n        } else if (ch === '\"'){ q = true; }\r\n        else if (ch === ','){ row.push(cur); cur = \"\"; }\r\n        else if (ch === '\\n'){ row.push(cur); rows.push(row); row = []; cur = \"\"; }\r\n        else if (ch !== '\\r'){ cur += ch; }\r\n    }\r\n    if (cur !== \"\" || row.length){ row.push(cur); rows.push(row); }\r\n    return rows;\r\n}\r\nfunction nfc(s){ return s == null ? \"\" : String(s).normalize(\"NFC\"); }\r\n\r\nfunction rowsToProjets(rows){\r\n    var hRow = -1, i, j;\r\n    for (i = 0; i < rows.length && hRow < 0; i++){\r\n        for (j = 0; j < rows[i].length; j++){\r\n            if (normHead(rows[i][j]) === \"porteur\"){ hRow = i; break; }\r\n        }\r\n    }\r\n    if (hRow < 0) return null;\r\n    var heads = rows[hRow];\r\n    var idx = {}, used = {};\r\n    COL_MATCHERS.forEach(function(m){\r\n        for (var c = 0; c < heads.length; c++){\r\n            if (used[c]) continue;\r\n            if (m[1](normHead(heads[c]))){ idx[m[0]] = c; used[c] = true; return; }\r\n        }\r\n    });\r\n    if (idx.theme == null || idx.porteur == null) return null;\r\n    var out = [];\r\n    for (i = hRow + 1; i < rows.length; i++){\r\n        var row = rows[i];\r\n        var g = function(k){\r\n            var c = idx[k];\r\n            return c == null ? \"\" : nfc(row[c] == null ? \"\" : String(row[c])).replace(\/\\t\/g, \" \").trim();\r\n        };\r\n        if (!(g(\"theme\") || g(\"porteur\") || g(\"projet\"))) continue;\r\n        var d = {};\r\n        COL_MATCHERS.forEach(function(m){ d[m[0]] = g(m[0]); });\r\n        out.push(d);\r\n    }\r\n    return out.length ? out : null;\r\n}\r\n\r\nfunction loadSheet(cb){\r\n    var done = false;\r\n    var finish = function(rows){ if (!done){ done = true; cb(rows); } };\r\n    var to = setTimeout(function(){ finish(null); }, 8000);\r\n    try {\r\n        fetch(SHEET_CSV_URL, { credentials: \"omit\" })\r\n            .then(function(r){ if (!r.ok) throw new Error(\"HTTP \" + r.status); return r.text(); })\r\n            .then(function(txt){ clearTimeout(to); finish(rowsToProjets(parseCSV(txt))); })\r\n            .catch(function(){ clearTimeout(to); finish(null); });\r\n    } catch (e){ clearTimeout(to); finish(null); }\r\n}\r\n\r\n\r\n  var LIEUX = {\r\n  \"In Medias Res\":                              { a:[12], c:[\"Grans\"] },\r\n  \"Les Petits D\u00e9brouillards\":                   { a:[1,10,13,14,15,16], c:[\"Marignane\",\"Martigues\",\"Miramas\"] },\r\n  \"PAIS\":                                       { c:[\"Salon-de-Provence\"] },\r\n  \"Apprentis d Auteuil\":                        { ville:true, hors:\"Arles\" },\r\n  \"La Cloche\":                                  { ville:true },\r\n  \"Les Chemins du Faire\":                       { a:[2] },\r\n  \"LES JARDINS DE L'ESPERANCE\":                 { c:[\"La Ciotat\"] },\r\n  \"La Caravelle\":                               { ville:true },\r\n  \"AMS Environnement\":                          { c:[\"Roque d'Anth\u00e9ron\",\"Jouques\"] },\r\n  \"Les Muses Urbaines\":                         { ville:true },\r\n  \"CEPEP\":                                      { a:[1] },\r\n  \"Ligue Ens. 13\":                              { ville:true, c:[\"Sept\u00e8mes-les-Vallons\",\"Martigues\",\"Aix-en-Provence\"] },\r\n  \"EnVies EnJeux 13|Budget participatif quartier Corsy\": { c:[\"Aix-en-Provence\"] },\r\n  \"EnVies EnJeux 13|Budget participatif QPV Le Charrel\": { c:[\"Aubagne\"] },\r\n  \"Ellipsis Effect\":                            { a:[1] },\r\n  \"Le Mouvement Associatif R\u00e9gion Sud Provence-Alpes-C\u00f4te d\u2019Azur\": { multi:true },\r\n  \"Les D\u00e9termin\u00e9s\":                             { ville:true },\r\n  \"Salon Action Sant\u00e9\":                         { c:[\"Salon-de-Provence\",\"Berre l'Etang\"] },\r\n  \"Coeur de Cagoles\":                           { ville:true },\r\n  \"INCITTA\":                                    { c:[\"Miramas\"], a:[10] },\r\n  \"Lieux Publics\":                              { a:[15] },\r\n  \"Les Petites Cantines Marseille\":             { a:[1,3,5,6,12] },\r\n  \"La Part Du Peuple\/ l'Apr\u00e8s M\":               { a:[1,3,13,14,15] },\r\n  \"ACAM Bels. Manufacture\":                     { a:[1] },\r\n  \"Compagnons B\u00e2tisseurs Provence\":             { a:[3] },\r\n  \"e-graine et Terravox\":                       { a:[13] },\r\n  \"AVENIR SOLIDARITE\":                          { ville:true, c:[\"Aix-en-Provence\",\"Fuveau\"] },\r\n  \"Anonymal\":                                   { c:[\"Aix-en-Provence\",\"Gardanne\"] },\r\n  \"Ligue FAIL 13\":                              { c:[\"Port-St-Louis-du-Rh\u00f4ne\",\"Roque d'Anth\u00e9ron\",\"Ensu\u00e8s-la-Redonne\",\"Rognes\",\"Roquevaire\",\"Venelles\"], hors:\"Saint-Martin-de-Crau, Tarascon\" },\r\n  \"Arborescence-Icom\":                          { a:[15,16] },\r\n  \"Urban Prod\":                                 { ville:true, hors:\"R\u00e9gion Sud\" },\r\n  \"CENTRE DE CULTURE OUVRIERE \u2013 Centre social Sainte-Marthe\": { a:[14] },\r\n  \"HUB DU SUD\":                                 { multi:true },\r\n  \"MISSION LOCALE OUEST PROVENCE|Gaming House de l'insertion \u00e0 Miramas\": { c:[\"Miramas\"] },\r\n  \"MISSION LOCALE OUEST PROVENCE|Cr\u00e9ation d'une \u00ab gaming house\\\" \u00e0 Port Saint Louis du Rh\u00f4ne\": { c:[\"Port-St-Louis-du-Rh\u00f4ne\"] },\r\n  \"ACT\":                                        { ville:true, c:[\"Port-de-Bouc\",\"Martigues\"] },\r\n  \"Association maison des familles et des associations\": { a:[14], c:[\"Martigues\",\"La Ciotat\"], hors:\"Toulon, Paris\" },\r\n  \"Compagnie Mbongui\":                          { ville:true },\r\n  \"ARCAF Riposte\":                              { multi:true, hors:\"\u00cele-de-France\" },\r\n  \"\u00c9closion 13\":                                { a:[2], c:[\"Martigues\"] },\r\n  \"Union sportive du panier de la victoire\":    { a:[2,3,7,14,15] },\r\n  \"Delta France Asso.\":                         { multi:true },\r\n  \"Le Sel de la Vie\":                           { a:[13,14,15,16] },\r\n  \"FACE Sud Provence\":                          { multi:true },\r\n  \"Camplus\":                                    { c:[\"Vitrolles\"], a:[15] },\r\n  \"CitizenCorps\":                               { ville:true },\r\n  \"Ligue Sud FF Voile\":                         { multi:true, hors:\"Var, Vaucluse, Alpes-Maritimes\" },\r\n  \"Interface\":                                  { ville:true }\r\n};\r\n\r\n  \/\/ \u2550\u2550 4. UTILITAIRES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction ringArea(r){ var s=0,n=r.length,j=n-1; for(var i=0;i<n;j=i++) s+=r[j][0]*r[i][1]-r[i][0]*r[j][1]; return s\/2; }\r\nfunction rewindRings(rings){ return rings.map(function(r,i){ var cw=ringArea(r)<0; return (i===0?cw:!cw)?r:r.slice().reverse(); }); }\r\nfunction rewind(g){ if(!g||!g.coordinates)return g; if(g.type===\"Polygon\")return{type:\"Polygon\",coordinates:rewindRings(g.coordinates)}; if(g.type===\"MultiPolygon\")return{type:\"MultiPolygon\",coordinates:g.coordinates.map(rewindRings)}; return g; }\r\nfunction rewindF(f){ return{type:\"Feature\",geometry:rewind(f.geometry),properties:f.properties}; }\r\n\r\nfunction norm(s){ return String(s==null?\"\":s).normalize(\"NFD\").replace(\/[\u0300-\u036f]\/g,\"\").toLowerCase().replace(\/['\u2019\\-]\/g,\" \").replace(\/\\bsaint\\b\/g,\"st\").replace(\/\\b(le|la|les|de|du|des|d|l)\\b\/g,\" \").replace(\/\\s+\/g,\" \").trim(); }\r\nfunction key(s){ var n=norm(s); return ALIAS[n]||n; }\r\nfunction arrNums(s){ var out=[],re=\/(\\d{1,2})\\s*(?:er|e|\u00e8me)?\\b\/gi,m; while((m=re.exec(String(s)))!==null){ var v=+m[1]; if(v>=1&&v<=16)out.push(v); } return out; }\r\nfunction uniq(a){ return a.filter(function(v,i){ return a.indexOf(v)===i; }); }\r\nfunction esc(v){ return String(v==null?\"\":v).replace(\/&\/g,\"&amp;\").replace(\/<\/g,\"&lt;\").replace(\/>\/g,\"&gt;\").replace(\/\"\/g,\"&quot;\").replace(\/'\/g,\"&#39;\"); }\r\nvar escapeHTML = esc;\r\n\r\nfunction isNR(s){\r\n    if (!s) return true;\r\n    var t = String(s).trim();\r\n    return t === \"\" || \/^nr\\b\/i.test(t);\r\n}\r\nfunction num(s){\r\n    if (s === null || s === undefined) return null;\r\n    s = String(s).replace(\/\u00a0\/g, \" \");\r\n    var m = s.match(\/\\d[\\d\\s\u202f]*(?:[.,]\\d+)?\/);\r\n    if (!m) return null;\r\n    var v = parseFloat(m[0].replace(\/[\\s\u202f]\/g, \"\").replace(\",\", \".\"));\r\n    return isNaN(v) ? null : v;\r\n}\r\nfunction fmtEuro(v){ return v === null ? \"NR\" : new Intl.NumberFormat(\"fr-FR\").format(Math.round(v)) + \" \u20ac\"; }\r\n\/\/ Dans un compteur de 130 px, \u00ab 1 405 000 \u20ac \u00bb d\u00e9borde : au-dessus du\r\n\/\/ million, on arrondit. Les montants d'une fiche, eux, restent entiers.\r\nfunction fmtEuroCourt(v){\r\n    if (v === null) return \"NR\";\r\n    if (v >= 1e6) return new Intl.NumberFormat(\"fr-FR\", { maximumFractionDigits: 2 }).format(v \/ 1e6) + \" M\u20ac\";\r\n    if (v >= 1e4) return new Intl.NumberFormat(\"fr-FR\").format(Math.round(v \/ 1e3)) + \" k\u20ac\";\r\n    return fmtEuro(v);\r\n}\r\n\/\/ Une seule interrogation pour tout le fichier : si la personne demande\r\n\/\/ moins de mouvement, aucune chor\u00e9graphie ne se d\u00e9clenche.\r\nvar REDUCED = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n\/\/ \u2550\u2550 5. INDEX DE L'ANALYSE TERRITORIALE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ Les comptages (combien de projets\/sites par territoire) viennent d\u00e9sormais\r\n\/\/ de PROJETS+LIEUX (\u00a710, aliment\u00e9s par la feuille en direct) plut\u00f4t que d'un\r\n\/\/ second classeur fig\u00e9 : la carte et le panneau de d\u00e9tail lisent la m\u00eame\r\n\/\/ source que la liste des fiches, ils ne peuvent plus diverger. `secteurs` et\r\n\/\/ `qpv` restent lus depuis T : ce sont des rattachements administratifs\r\n\/\/ stables (secteur Politique de la Ville, p\u00e9rim\u00e8tre QPV), pas des comptages\r\n\/\/ susceptibles de se p\u00e9rimer.\r\nvar secteurByKey={};\r\nObject.keys(T.secteurs||{}).forEach(function(k){ secteurByKey[key(k)]=T.secteurs[k]; });\r\n\r\n\/\/ Les 16 arrondissements marseillais existent tous sur la carte m\u00eame sans\r\n\/\/ aucun projet ; contrairement \u00e0 un objet de comptages fig\u00e9, byArr (vivant)\r\n\/\/ n'a pas de cl\u00e9 pour un arrondissement rest\u00e9 \u00e0 z\u00e9ro, donc on \u00e9num\u00e8re la\r\n\/\/ plage plut\u00f4t que ses cl\u00e9s.\r\nvar ARR_NUMS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];\r\n\r\nvar qpvByArr={}, qpvByCommune={};\r\nObject.keys(T.qpv||{}).forEach(function(k){\r\n  var list=T.qpv[k];\r\n  if(\/marseille\/i.test(k)){ arrNums(k.replace(\/marseille\/i,\"\")).forEach(function(n){ qpvByArr[n]=(qpvByArr[n]||[]).concat(list); }); }\r\n  else{ var kk=key(k); qpvByCommune[kk]=(qpvByCommune[kk]||[]).concat(list); }\r\n});\r\nfunction marseilleQPV(){ var a=[]; Object.keys(qpvByArr).forEach(function(n){ a=a.concat(qpvByArr[n]); }); return uniq(a); }\r\n\r\n\/\/ \u2550\u2550 6. SECTEURS PDV \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ Les cinq secteurs gardent leurs teintes d'origine, r\u00e9harmonis\u00e9es dans la\r\n\/\/ gamme de la roue : m\u00eame rep\u00e9rage, mais pos\u00e9es sur un fond ivoire elles ne\r\n\/\/ crient plus.\r\nvar SECTEURS = [\r\n  { code:\"NORD\",      label:\"Nord\",      sub:\"Aix, Berre, Gardanne\u2026\",  color:\"#92557c\" },\r\n  { code:\"OUEST\",     label:\"Ouest\",     sub:\"Martigues, Miramas\u2026\",    color:\"#b25f35\" },\r\n  { code:\"SUD EST 1\", label:\"Sud-Est 1\", sub:\"15e \u2013 16e arrond.\",      color:\"#4b8296\" },\r\n  { code:\"SUD EST 2\", label:\"Sud-Est 2\", sub:\"13e \u2013 14e arrond.\",      color:\"#8d9b4e\" },\r\n  { code:\"SUD EST 3\", label:\"Sud-Est 3\", sub:\"1er \u2013 12e arrond. + communes voisines\",color:\"#45508a\" }\r\n];\r\nvar SECT_COLOR={}, SECT_META={};\r\nSECTEURS.forEach(function(s){ SECT_COLOR[s.code]=s.color; SECT_META[s.code]=s; });\r\nvar NODATA=\"#eef0ea\";\r\nvar FALLBACK_COLOR=\"#5f7d84\";\r\n\r\nfunction secteurArr(n){ if(n===15||n===16)return\"SUD EST 1\"; if(n===13||n===14)return\"SUD EST 2\"; return\"SUD EST 3\"; }\r\nfunction secteurOf(d){ if(d.properties.num)return secteurArr(d.properties.num); return secteurByKey[key(d.properties.nom)]||\"\"; }\r\nfunction valueOf(d){ return d.properties.num?(byArr[d.properties.num]||[]).length:(byCommune[key(d.properties.nom)]||[]).length; }\r\n\r\nfunction hexToRgba(hex, a){\r\n  var r=parseInt(hex.slice(1,3),16), g=parseInt(hex.slice(3,5),16), b=parseInt(hex.slice(5,7),16);\r\n  return \"rgba(\"+r+\",\"+g+\",\"+b+\",\"+a+\")\";\r\n}\r\n\/\/ Un seul niveau de couleur pour toute zone qui a des sites : la teinte ne\r\n\/\/ dit plus \"combien\" (\u00e7a n'a plus lieu d'\u00eatre sans la l\u00e9gende d'intensit\u00e9),\r\n\/\/ juste \"o\u00f9\". Seule l'absence de site distingue encore une zone (NODATA).\r\nvar PRESENT_OPACITY = .42;\r\nfunction fillOf(d){\r\n  var s=secteurOf(d), v=valueOf(d);\r\n  if(v===0) return NODATA;\r\n  var base = s ? SECT_COLOR[s] : FALLBACK_COLOR;\r\n  return hexToRgba(base, PRESENT_OPACITY);\r\n}\r\nfunction strokeOf(d, hovered){\r\n  var s=secteurOf(d), v=valueOf(d);\r\n  if(!hovered && v===0) return \"#e2e6df\";\r\n  var base = s ? SECT_COLOR[s] : FALLBACK_COLOR;\r\n  return hovered ? base : hexToRgba(base, .55);\r\n}\r\n\r\n\/\/ \u2550\u2550 7. TH\u00c9MATIQUES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ La palette r\u00e9harmonis\u00e9e de la roue d'impact, \u00e0 l'identique : m\u00eames neuf\r\n\/\/ teintes reconnaissables, saturation et luminosit\u00e9 align\u00e9es. Les fluos\r\n\/\/ d'origine ne tenaient pas ensemble sur fond cr\u00e8me. Chaque teinte garde sa\r\n\/\/ version sombre, qui sert au texte \u2014 c'est elle qui porte les 4,5:1.\r\nvar THEMES = [\r\n  { key: \"DISCRIMINATIONS\",  label: \"Discriminations\",    color: \"#c86a5e\", textColor: \"#8b3a2f\" },\r\n  { key: \"PR\u00c9C. ALIM.\",      label: \"Pr\u00e9carit\u00e9 alim.\",    color: \"#b25f35\", textColor: \"#7a3a19\" },\r\n  { key: \"SANT\u00c9\",            label: \"Sant\u00e9\",              color: \"#bd9035\", textColor: \"#7c601a\" },\r\n  { key: \"CADRE DE VIE\",     label: \"Cadre de vie\",       color: \"#8d9b4e\", textColor: \"#55602a\" },\r\n  { key: \"NUM\u00c9RIQUE\",        label: \"Num\u00e9rique\",          color: \"#55926f\", textColor: \"#2d6046\" },\r\n  { key: \"SPORT\",            label: \"Sport\",              color: \"#6d9b93\", textColor: \"#3f665f\" },\r\n  { key: \"CULTURE\",          label: \"Culture\",            color: \"#4b8296\", textColor: \"#2a5365\" },\r\n  { key: \"PARTICIPATION\",    label: \"Participation\",      color: \"#45508a\", textColor: \"#2b3260\" },\r\n  { key: \"EMPLOI\/INSERTION\", label: \"Emploi \/ insertion\", color: \"#8480be\", textColor: \"#524d8b\" },\r\n  { key: \"ENFANCE\/JEUNESSE\", label: \"Enfance \/ jeunesse\", color: \"#92557c\", textColor: \"#632f52\" }\r\n].map(function(t){ t.key = t.key.normalize(\"NFC\"); return t; });\r\n\r\nfunction mixLab(hex, target, t){ return d3.interpolateLab(hex, target)(t); }\r\n\r\nvar THEME_META = {};\r\nTHEMES.forEach(function(t){\r\n  THEME_META[t.key] = {\r\n    label: t.label,\r\n    color: t.color,\r\n    textColor: t.textColor,\r\n    \/\/ Le ton moyen : la pastille d'une fiche est un peu plus sombre que\r\n    \/\/ l'aplat, sinon elle dispara\u00eet sur fond blanc.\r\n    ton: mixLab(t.color, t.textColor, 0.45)\r\n  };\r\n});\r\nfunction themeKey(t){ return String(t || \"\").normalize(\"NFC\").trim(); }\r\nfunction themeMeta(t){ return THEME_META[themeKey(t)] || null; }\r\nfunction themeColor(t){ var m = themeMeta(t); return m ? m.ton : \"#5d6672\"; }\r\nfunction themeInk(t){ var m = themeMeta(t); return m ? m.textColor : \"#40565d\"; }\r\nfunction themeLabel(t){ var m = themeMeta(t); return m ? m.label : themeKey(t); }\r\n\r\n\/\/ \u2550\u2550 8. EMPREINTE D'IMPACT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nvar FLORA_LAYERS = [\r\n    { key: \"competences\",  label: \"Mont\u00e9e en comp\u00e9tences\",      color: \"#C79A0B\", shape: \"ray\" },\r\n    { key: \"lienSocial\",   label: \"Lien social \/ coh\u00e9sion\",     color: \"#E23C7C\", shape: \"petal\" },\r\n    { key: \"comportement\", label: \"Changement de comportement\", color: \"#0E9E82\", shape: \"tendril\" },\r\n    { key: \"sorties\",      label: \"Sorties positives\",          color: \"#E07B24\", shape: \"seed\" }\r\n];\r\nfunction floraState(p, L){ return isNR(p[L.key]) ? \"none\" : \"full\"; }\r\nfunction floraStates(p){\r\n    var s = {};\r\n    FLORA_LAYERS.forEach(function(L){ s[L.key] = floraState(p, L); });\r\n    return s;\r\n}\r\nfunction floraScore(s){\r\n    return FLORA_LAYERS.filter(function(L){ return s[L.key] !== \"none\"; }).length;\r\n}\r\n\r\n\/\/ \u2550\u2550 9. FREINS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nvar FREINS = [\r\n    { code: \"F1\", short: \"Financiers\",      label: \"Freins financiers\",                      rx: \/financ\/,\r\n      shape: \"bars\" },\r\n    { code: \"F2\", short: \"Humains\",         label: \"Freins humains (\u00e9quipes et publics)\",    rx: \/humain|\\brh\\b|ressources humaines\/,\r\n      shape: \"chevrons\" },\r\n    { code: \"F3\", short: \"Institutionnels\", label: \"Freins institutionnels et partenariaux\", rx: \/institutionnel|partenari\/,\r\n      shape: \"walls\" },\r\n    { code: \"F4\", short: \"Logistiques\",     label: \"Freins logistiques et mat\u00e9riels\",        rx: \/logisti|materiel\/,\r\n      shape: \"blocks\" }\r\n];\r\nvar FREIN_HEAD = \/Freins?\\s+(?:financiers?|humains?(?:\\s*\\([^)]{0,40}\\))?|institutionnels?(?:\\s+et\\s+partenariaux?)?|logistiques?(?:\\s+et\\s+mat[e\u00e9]riels?)?)\/gi;\r\n\r\nfunction freinSegments(p){\r\n    var out = { codes: [], segs: {}, reste: \"\" };\r\n    var t = String(p.freins == null ? \"\" : p.freins).trim();\r\n    if (!t || isNR(t)) return out;\r\n    var heads = [], m;\r\n    FREIN_HEAD.lastIndex = 0;\r\n    while ((m = FREIN_HEAD.exec(t)) !== null){\r\n        heads.push({ i: m.index, len: m[0].length, tete: m[0] });\r\n        if (m.index === FREIN_HEAD.lastIndex) FREIN_HEAD.lastIndex++;\r\n    }\r\n    if (!heads.length){ out.reste = t; return out; }\r\n    out.reste = t.slice(0, heads[0].i).trim();\r\n    for (var k = 0; k < heads.length; k++){\r\n        var fin = (k + 1 < heads.length) ? heads[k + 1].i : t.length;\r\n        var corps = t.slice(heads[k].i + heads[k].len, fin)\r\n            .replace(\/^[\\s:;.\u2013\u2014-]+\/, \"\").trim();\r\n        var tete = heads[k].tete.normalize(\"NFD\")\r\n            .replace(\/[\u0300-\u036f]\/g, \"\").toLowerCase();\r\n        var fam = null;\r\n        FREINS.forEach(function(f){ if (!fam && f.rx.test(tete)) fam = f.code; });\r\n        if (!fam) continue;\r\n        if (out.codes.indexOf(fam) === -1) out.codes.push(fam);\r\n        if (!corps) continue;\r\n        out.segs[fam] = (out.segs[fam] ? out.segs[fam] + \"\\n\" : \"\") + corps;\r\n    }\r\n    return out;\r\n}\r\nfunction freinCodes(p, seg){\r\n    var txt = String(p.freins || \"\").normalize(\"NFD\")\r\n        .replace(\/[\u0300-\u036f]\/g, \"\").toLowerCase();\r\n    if (!txt || \/^\\s*(nr\\b|pas de frein|aucun frein|aucune)\/.test(txt)) return [];\r\n    var declares = (seg || freinSegments(p)).codes;\r\n    var out = [];\r\n    FREINS.forEach(function(f){\r\n        \/\/ Comme sur la roue : une famille intitul\u00e9e pour \u00e9crire \u00ab aucun frein \u00bb\r\n        \/\/ n'est pas un frein. Sans ce garde-fou, la carte comptait un frein de\r\n        \/\/ plus que la roue pour le m\u00eame projet (Ligue Sud FF Voile).\r\n        var corps = normHead((seg || freinSegments(p)).segs[f.code] || \"\");\r\n        var absenceExplicite = \/^(?:aucun(?:e)?\\s+(?:frein|difficulte|obstacle)|pas de\\s+(?:frein|difficulte|obstacle)|non renseigne|nr\\b)\/.test(corps);\r\n        if (!absenceExplicite && (declares.length ? declares.indexOf(f.code) !== -1 : f.rx.test(txt))) out.push(f.code);\r\n    });\r\n    return out;\r\n}\r\n\r\n\/\/ ---- Glyphe \u00ab cage \u00bb des freins (identique \u00e0 la roue d'impact) ----\r\n\/\/ Encre ardoise, la m\u00eame que sur la roue : les deux fiches n'en font qu'une.\r\nvar FREIN_INK = \"#334155\";\r\n\r\n        \/\/ Barreaux radiaux (financiers) : la contrainte qui serre.\r\n        function freinBars(){\r\n            return '<rect x=\"-2.4\" y=\"-42.5\" width=\"4.8\" height=\"10.5\" rx=\"2\"\/>';\r\n        }\r\n        \/\/ Chevrons point\u00e9s vers le centre (humains) : la pression qui vient des\r\n        \/\/ \u00e9quipes et des publics.\r\n        function freinChevrons(){\r\n            return '<path d=\"M-7,-34.5L0,-27.5L7,-34.5\"\/>';\r\n        }\r\n        \/\/ Pans de mur (institutionnels) : l'arc le plus ext\u00e9rieur, celui qui\r\n        \/\/ enferme le reste.\r\n        function freinWalls(){\r\n            var r = 47, h = 32 * Math.PI \/ 180;\r\n            var a0 = -Math.PI \/ 2 - h, a1 = -Math.PI \/ 2 + h;\r\n            return '<path d=\"M' + (Math.cos(a0) * r).toFixed(2) + ',' + (Math.sin(a0) * r).toFixed(2)\r\n                + 'A' + r + ',' + r + ' 0 0 1 '\r\n                + (Math.cos(a1) * r).toFixed(2) + ',' + (Math.sin(a1) * r).toFixed(2) + '\"\/>';\r\n        }\r\n        \/\/ Blocs (logistiques) : les cailloux les plus pr\u00e8s du projet.\r\n        function freinBlocks(){\r\n            return '<rect x=\"-3\" y=\"-21\" width=\"6\" height=\"6\" rx=\"1\" transform=\"rotate(45 0 -18)\"\/>';\r\n        }\r\n\r\n        function freinLayer(f, ink){\r\n            var col = ink || \"currentColor\";\r\n            if (f.shape === \"bars\"){\r\n                return '<g fill=\"' + col + '\">' + floraRing(freinBars(), 6, 30) + '<\/g>';\r\n            }\r\n            if (f.shape === \"chevrons\"){\r\n                return '<g fill=\"none\" stroke=\"' + col + '\" stroke-width=\"3.2\"'\r\n                    + ' stroke-linecap=\"round\" stroke-linejoin=\"round\">'\r\n                    + floraRing(freinChevrons(), 6, 0) + '<\/g>';\r\n            }\r\n            if (f.shape === \"walls\"){\r\n                return '<g fill=\"none\" stroke=\"' + col + '\" stroke-width=\"5\" stroke-linecap=\"round\">'\r\n                    + floraRing(freinWalls(), 4, 45) + '<\/g>';\r\n            }\r\n            return '<g fill=\"' + col + '\">' + floraRing(freinBlocks(), 8, 22.5) + '<\/g>';\r\n        }\r\n\r\n        \/\/ Chaque barri\u00e8re porte sa famille : survoler sa carte, dans la fiche,\r\n        \/\/ l'allume et efface les autres (voir wireAccordions).\r\n        function freinGlyph(p){\r\n            var body = \"\";\r\n            FREINS.forEach(function(f){\r\n                if (p.freinSet.indexOf(f.code) === -1) return;\r\n                body += '<g class=\"imp-couche\" data-k=\"' + f.code + '\">' + freinLayer(f, FREIN_INK) + '<\/g>';\r\n            });\r\n            \/\/ Le noyau, c'est le projet : toujours pr\u00e9sent, m\u00eame sans aucune\r\n            \/\/ barri\u00e8re autour. Sans lui, une case vide serait inexplicable.\r\n            body += '<circle r=\"5.5\" fill=\"#13293f\" fill-opacity=\"0.26\"\/>';\r\n            return '<svg class=\"imp-glyph\" viewBox=\"-52 -52 104 104\" aria-hidden=\"true\" focusable=\"false\">' + body + '<\/svg>';\r\n        }\r\n\r\n        \/\/ Vignette de la ligne : UN seul motif, en grand. R\u00e9duire l'anneau\r\n        \/\/ entier \u00e0 22 px donnait quatre semis de points indistinguables ;\r\n        \/\/ isol\u00e9 et grossi, le motif se raccroche tout de suite \u00e0 sa barri\u00e8re\r\n        \/\/ dans le glyphe. C'est ce qui rend le glyphe d\u00e9codable sans l\u00e9gende.\r\n        var FREIN_ICONS = {\r\n            bars:     '<rect x=\"-3\" y=\"-9\" width=\"6\" height=\"18\" rx=\"2.6\" fill=\"currentColor\"\/>',\r\n            chevrons: '<path d=\"M-8,-4.5L0,3.5L8,-4.5\" fill=\"none\" stroke=\"currentColor\"'\r\n                      + ' stroke-width=\"3.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>',\r\n            walls:    '<path d=\"M-9.5,4.5A11.5,11.5 0 0 1 9.5,4.5\" fill=\"none\" stroke=\"currentColor\"'\r\n                      + ' stroke-width=\"3.6\" stroke-linecap=\"round\"\/>',\r\n            blocks:   '<rect x=\"-6\" y=\"-6\" width=\"12\" height=\"12\" rx=\"2.2\"'\r\n                      + ' transform=\"rotate(45)\" fill=\"currentColor\"\/>'\r\n        };\r\n        function freinMini(f){\r\n            return '<svg class=\"imp-ico\" viewBox=\"-12 -12 24 24\" aria-hidden=\"true\" focusable=\"false\">'\r\n                + FREIN_ICONS[f.shape] + '<\/svg>';\r\n        }\r\n\r\n\/\/ ============ 5 ter. DESSIN DE LA FLEUR ============\r\n        \/\/ R\u00e9p\u00e8te un motif tout autour du centre.\r\n        function floraRing(markup, count, offsetDeg){\r\n            var out = [], i;\r\n            for (i = 0; i < count; i++){\r\n                out.push('<g transform=\"rotate(' + (offsetDeg + i * 360 \/ count).toFixed(2) + ')\">'\r\n                    + markup + '<\/g>');\r\n            }\r\n            return out.join(\"\");\r\n        }\r\n\r\n        \/\/ Lance effil\u00e9e, pointe vers l'ext\u00e9rieur (mont\u00e9e en comp\u00e9tences).\r\n        function floraRay(){\r\n            var r0 = 15, r1 = 45, w = 4.4;\r\n            var m1 = -(r0 + (r1 - r0) * 0.50), m2 = -(r0 + (r1 - r0) * 0.10);\r\n            return '<path d=\"M0,' + (-r1)\r\n                + 'C' + w + ',' + m1 + ' ' + (w * 0.85) + ',' + m2 + ' 0,' + (-r0)\r\n                + 'C' + (-w * 0.85) + ',' + m2 + ' ' + (-w) + ',' + m1 + ' 0,' + (-r1) + 'Z\"\/>';\r\n        }\r\n\r\n        \/\/ P\u00e9tale en coeur, pointe vers l'ext\u00e9rieur (lien social).\r\n        function floraPetal(){\r\n            var r0 = 12, r1 = 31, s = (r1 - r0) \/ 1.85;\r\n            function P(x, y){\r\n                return (x * s * 0.86).toFixed(2) + ',' + ((y + 1) * s - r1).toFixed(2);\r\n            }\r\n            return '<path d=\"M' + P(0, -1)\r\n                + 'C' + P(-1.12, -0.04) + ' ' + P(-0.88, 0.85) + ' ' + P(-0.40, 0.85)\r\n                + 'C' + P(-0.06, 0.85) + ' ' + P(0, 0.52) + ' ' + P(0, 0.34)\r\n                + 'C' + P(0, 0.52) + ' ' + P(0.06, 0.85) + ' ' + P(0.40, 0.85)\r\n                + 'C' + P(0.88, 0.85) + ' ' + P(1.12, -0.04) + ' ' + P(0, -1) + 'Z\"\/>';\r\n        }\r\n\r\n        \/\/ Vrille \u00e0 deux brins termin\u00e9s par une perle (changement de comportement).\r\n        \/\/ Les brins montent puis se recourbent vers l'ext\u00e9rieur : c'est cette\r\n        \/\/ courbure qui distingue la couche des lances jaunes, rectilignes.\r\n        function floraTendril(color){\r\n            var r0 = 13, tx = 18.5, ty = 31;\r\n            function brin(s){\r\n                return '<path d=\"M0,' + (-r0)\r\n                    + 'C' + (s * 1.5) + ',' + (-(r0 + 13))\r\n                    + ' ' + (s * 9) + ',' + (-(r0 + 26))\r\n                    + ' ' + (s * tx) + ',' + (-ty) + '\"\/>'\r\n                    + '<circle cx=\"' + (s * tx) + '\" cy=\"' + (-ty)\r\n                    + '\" r=\"2.2\" fill=\"' + color + '\" stroke=\"none\"\/>';\r\n            }\r\n            return brin(-1) + brin(1);\r\n        }\r\n\r\n        \/\/ Coeur de fleur grain\u00e9 (sorties positives) : la seule couche pleine,\r\n        \/\/ elle ancre le glyphe et reste lisible m\u00eame tr\u00e8s r\u00e9duite.\r\n        function floraSeed(color, dark){\r\n            var out = '<circle r=\"11.4\" fill=\"' + color + '\"\/>', i, a;\r\n            for (i = 0; i < 13; i++){\r\n                a = i \/ 13 * 2 * Math.PI;\r\n                out += '<circle cx=\"' + (Math.cos(a) * 10.6).toFixed(2)\r\n                    + '\" cy=\"' + (Math.sin(a) * 10.6).toFixed(2) + '\" r=\"2.7\" fill=\"' + color + '\"\/>';\r\n            }\r\n            out += '<circle r=\"1.55\" fill=\"' + dark + '\"\/>';\r\n            for (i = 0; i < 6; i++){\r\n                a = i \/ 6 * 2 * Math.PI;\r\n                out += '<circle cx=\"' + (Math.cos(a) * 4.7).toFixed(2)\r\n                    + '\" cy=\"' + (Math.sin(a) * 4.7).toFixed(2) + '\" r=\"1.55\" fill=\"' + dark + '\"\/>';\r\n            }\r\n            for (i = 0; i < 11; i++){\r\n                a = i \/ 11 * 2 * Math.PI + 0.28;\r\n                out += '<circle cx=\"' + (Math.cos(a) * 8.7).toFixed(2)\r\n                    + '\" cy=\"' + (Math.sin(a) * 8.7).toFixed(2) + '\" r=\"1.5\" fill=\"' + dark + '\"\/>';\r\n            }\r\n            return out;\r\n        }\r\n\r\n        \/\/ Rend UNE couche si elle est renseign\u00e9e, rien sinon.\r\n        function floraLayer(L, state){\r\n            if (state === \"none\") return \"\";\r\n            var col = L.color;\r\n            if (L.shape === \"seed\"){\r\n                return '<g>' + floraSeed(col, d3.color(col).darker(1.9).formatHex()) + '<\/g>';\r\n            }\r\n            var head = '<g fill=\"none\" stroke=\"' + col + '\" stroke-width=\"2.1\"'\r\n                + ' stroke-linejoin=\"round\" stroke-linecap=\"round\">';\r\n            if (L.shape === \"ray\")   return head + floraRing(floraRay(), 5, 36) + '<\/g>';\r\n            if (L.shape === \"petal\") return head + floraRing(floraPetal(), 5, 0) + '<\/g>';\r\n            \/\/ M\u00eame correction que sur la roue d'impact : les vrilles tournaient\r\n            \/\/ en 6 face \u00e0 des lances et des p\u00e9tales en 5, aucune sym\u00e9trie\r\n            \/\/ commune, la couche verte cassait la fleur. Pas de 5, axe des\r\n            \/\/ lances.\r\n            return head + floraRing(floraTendril(col), 5, 36) + '<\/g>';\r\n        }\r\n\r\n        \/\/ La fleur de la fiche : chaque couche porte sa cl\u00e9, survoler sa carte\r\n        \/\/ l'allume et efface les autres (voir wireAccordions).\r\n        function floraGlyph(states){\r\n            var body = \"\";\r\n            FLORA_LAYERS.forEach(function(L){\r\n                var trait = floraLayer(L, states[L.key] || \"none\");\r\n                if (trait) body += '<g class=\"imp-couche\" data-k=\"' + L.key + '\">' + trait + '<\/g>';\r\n            });\r\n            \/\/ Sans coeur, le glyphe n'aurait plus de centre : un anneau t\u00e9moin\r\n            \/\/ marque la place vide plut\u00f4t que de laisser un blanc inexplicable.\r\n            if (states.sorties === \"none\"){\r\n                body += '<circle r=\"4.2\" fill=\"none\" stroke=\"rgba(36,71,109,0.22)\" stroke-width=\"1.3\"\/>';\r\n            }\r\n            return '<svg class=\"imp-glyph\" viewBox=\"-52 -52 104 104\" aria-hidden=\"true\" focusable=\"false\">'\r\n                + body + '<\/svg>';\r\n        }\r\n\r\n        \/\/ Vignette de ligne : la m\u00eame forme que dans la fleur, isol\u00e9e et \u00e0 sa\r\n        \/\/ couleur pleine. Comme sur la roue d'impact, la forme devient elle-m\u00eame\r\n        \/\/ la l\u00e9gende, et son trait est doubl\u00e9 : \u00e0 20 px, celui de la grande\r\n        \/\/ fleur ne laissait qu'un fil.\r\n        function floraMini(L){\r\n            return '<svg class=\"imp-ico\" viewBox=\"' + (L.shape === \"seed\" ? \"-15 -15 30 30\" : \"-52 -52 104 104\")\r\n                + '\" aria-hidden=\"true\" focusable=\"false\">'\r\n                + floraLayer(L, \"full\").replace(\/stroke-width=\"2\\.1\"\/g, 'stroke-width=\"4.2\"') + '<\/svg>';\r\n        }\r\n\r\n\/\/ ---- Impacts et freins : une seule grammaire (identique \u00e0 la roue) ----\r\n\/\/ En t\u00eate, un encart teint\u00e9 : l'embl\u00e8me sur un disque blanc, le compte \u00e9crit\r\n\/\/ en toutes lettres, et une barre \u00e0 quatre segments qui le redit d'un coup\r\n\/\/ d'oeil. Dessous, une carte par rubrique : vignette dans une case teint\u00e9e,\r\n\/\/ intitul\u00e9, \u00ab Lire \u00bb ou \u00ab Non renseign\u00e9 \u00bb, et un chevron qui d\u00e9plie le texte.\r\n\/\/ Une ligne : { k, label, title, ico, c, on, texte, plus }\r\n\/\/   on    : la couche est dans l'embl\u00e8me (dimension renseign\u00e9e, frein signal\u00e9)\r\n\/\/   texte : ce que le porteur a \u00e9crit ; sans texte, la carte ne s'ouvre pas\r\n\/\/   plus  : volet de texte libre, hors des quatre familles\r\nvar IMP_ICO_TEXTE = '<svg class=\"imp-ico\" viewBox=\"-12 -12 24 24\" aria-hidden=\"true\" focusable=\"false\">'\r\n    + '<path d=\"M-7,-5.5H7M-7,0H7M-7,5.5H2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\"'\r\n    + ' stroke-linecap=\"round\"\/><\/svg>';\r\n\r\nfunction impTeinte(c, a){\r\n    var k = d3.color(c);\r\n    if (!k) return \"\";\r\n    k.opacity = a;\r\n    return k.formatRgb();\r\n}\r\n\r\nfunction impLigneHTML(l){\r\n    var style = l.c ? ' style=\"--c:' + l.c + ';--tint:' + impTeinte(l.c, 0.1)\r\n        + ';--pill:' + impTeinte(l.c, 0.16) + '\"' : '';\r\n    var titre = l.title ? ' title=\"' + escapeHTML(l.title) + '\"' : '';\r\n    var tete = '<span class=\"imp-tile\" aria-hidden=\"true\">' + l.ico + '<\/span>'\r\n        + '<span class=\"imp-label\">' + escapeHTML(l.label) + '<\/span>';\r\n    var ouvre = '<li class=\"imp-row rev' + (l.on ? '' : ' is-off') + (l.plus ? ' is-plus' : '') + '\"'\r\n        + (l.k ? ' data-k=\"' + l.k + '\"' : '') + style + '>';\r\n    if (!l.texte){\r\n        return ouvre + '<div class=\"imp-head\"' + titre + '>' + tete\r\n            + (l.on ? '<span class=\"imp-state is-mention\">Mentionn\u00e9<\/span>'\r\n                    : '<span class=\"imp-state is-none\">Non renseign\u00e9<\/span>')\r\n            + '<\/div><\/li>';\r\n    }\r\n    return ouvre + '<button class=\"imp-head\" type=\"button\" aria-expanded=\"false\"' + titre + '>'\r\n        + tete + '<span class=\"imp-state\">Lire<\/span>'\r\n        + '<span class=\"imp-chev\" aria-hidden=\"true\"><\/span><\/button>'\r\n        + '<div class=\"imp-body\"><div class=\"imp-body-in\"><div class=\"imp-texte\">'\r\n        + '<div class=\"detail-prose\">' + descriptionHTML(l.texte, false) + '<\/div>'\r\n        + '<p class=\"imp-src\">D\u00e9claratif porteur \u00b7 FIS 2025<\/p>'\r\n        + '<\/div><\/div><\/div><\/li>';\r\n}\r\n\r\nfunction impBlocHTML(o){\r\n    var segs = o.lignes.filter(function(l){ return !l.plus; }).map(function(l){\r\n        return '<i class=\"imp-seg' + (l.on ? '' : ' is-off') + '\" data-k=\"' + l.k + '\"'\r\n            + (l.on ? ' style=\"--c:' + l.c + '\"' : '') + '><\/i>';\r\n    }).join(\"\");\r\n    return '<div class=\"imp ' + o.cls + '\">'\r\n        + '<div class=\"imp-hero rev\">'\r\n        + '<span class=\"imp-disc\" aria-hidden=\"true\">' + o.embleme + '<\/span>'\r\n        + '<div class=\"imp-hero-txt\">'\r\n        + '<p class=\"imp-eyebrow\">' + escapeHTML(o.eyebrow) + '<\/p>'\r\n        + '<p class=\"imp-count\">' + escapeHTML(o.titre) + '<\/p>'\r\n        + '<span class=\"imp-segs\" aria-hidden=\"true\">' + segs + '<\/span>'\r\n        + '<p class=\"imp-hint\">' + escapeHTML(o.note) + '<\/p>'\r\n        + '<\/div><\/div>'\r\n        + '<ul class=\"imp-list\">' + o.lignes.map(impLigneHTML).join(\"\") + '<\/ul><\/div>';\r\n}\r\n\r\nfunction ficheFloraHTML(p){\r\n    var s = p.floraStates;\r\n    var n = floraScore(s), N = FLORA_LAYERS.length;\r\n    return impBlocHTML({\r\n        cls: \"is-impacts\", eyebrow: \"Impact du FIS\",\r\n        titre: n === 0 ? \"Aucune dimension document\u00e9e\"\r\n            : n + (n > 1 ? \" dimensions sur \" : \" dimension sur \") + N\r\n              + (n > 1 ? \" document\u00e9es\" : \" document\u00e9e\"),\r\n        \/\/ La phrase qui ouvrait la rubrique vient ici, \u00e0 c\u00f4t\u00e9 du compte\r\n        \/\/ qu'elle temp\u00e8re.\r\n        note: n === 0\r\n            ? \"Le porteur n\u2019a document\u00e9 aucune des quatre dimensions, ce qui ne signifie pas une absence d\u2019impact.\"\r\n            : \"Effets rapport\u00e9s par le porteur. Leur nombre ne constitue pas une note de performance.\",\r\n        embleme: floraGlyph(s),\r\n        lignes: FLORA_LAYERS.map(function(L){\r\n            var on = s[L.key] !== \"none\";\r\n            return { k: L.key, label: L.label, ico: floraMini(L), c: on ? L.color : null,\r\n                     on: on, texte: on ? p[L.key] : null };\r\n        })\r\n    });\r\n}\r\n\r\nfunction ficheFreinsHTML(p){\r\n    var nr = isNR(p.freins);\r\n    var n = p.freinSet.length;\r\n    var seg = p.freinSegs || { segs: {}, reste: \"\" };\r\n    \/\/ Une famille peut porter un texte sans \u00eatre compt\u00e9e : le porteur l'a\r\n    \/\/ intitul\u00e9e pour \u00e9crire qu'elle ne l'a pas frein\u00e9. La carte reste alors\r\n    \/\/ \u00e9teinte, mais son texte se lit.\r\n    var lignes = FREINS.map(function(f){\r\n        var on = p.freinSet.indexOf(f.code) !== -1;\r\n        return { k: f.code, label: f.short, title: f.label, ico: freinMini(f),\r\n                 c: on ? FREIN_INK : null, on: on, texte: seg.segs[f.code] || null };\r\n    });\r\n    \/\/ Pr\u00e9ambule, ou cellule qu'on n'a pas su d\u00e9couper : rien n'est perdu.\r\n    var decoupe = FREINS.some(function(f){ return !!seg.segs[f.code]; });\r\n    if (seg.reste && seg.reste.length > 2){\r\n        lignes.push({ label: decoupe ? \"Autres pr\u00e9cisions\" : \"D\u00e9tail r\u00e9dig\u00e9 par le porteur\",\r\n                      ico: IMP_ICO_TEXTE, on: true, texte: seg.reste, plus: true });\r\n    }\r\n    var titre, note, invite = true;\r\n    if (nr){\r\n        titre = \"Freins non document\u00e9s\";\r\n        note = \"Le porteur n\u2019a pas document\u00e9 ses freins.\";\r\n    } else if (!n){\r\n        \/\/ \u00ab Pas de freins \u00bb \u00e9crit en toutes lettres, ou un texte qu'aucune des\r\n        \/\/ quatre familles ne reconna\u00eet : ce n'est pas la m\u00eame chose.\r\n        var aucun = \/^\\s*(pas de frein|aucun frein|aucune)\/.test(normHead(p.freins));\r\n        titre = aucun ? \"Aucun frein signal\u00e9\" : \"Freins d\u00e9crits sans famille\";\r\n        note = aucun ? \"Le porteur ne signale aucun frein.\"\r\n            : \"Le porteur d\u00e9crit ses freins sans les rattacher \u00e0 l\u2019une des quatre familles.\";\r\n        \/\/ \u00ab Aucun frein \u00bb, puis une invite \u00e0 lire : le volet ne ferait que le\r\n        \/\/ redire.\r\n        invite = !aucun;\r\n    } else {\r\n        titre = n + (n > 1 ? \" freins sur \" : \" frein sur \") + FREINS.length\r\n            + (n > 1 ? \" signal\u00e9s\" : \" signal\u00e9\");\r\n        note = \"Obstacles signal\u00e9s par le porteur en cours de projet.\";\r\n    }\r\n    if (invite && lignes.some(function(l){ return !!l.texte; })) note += \" Ouvrez une rubrique pour en lire le d\u00e9tail.\";\r\n    return impBlocHTML({\r\n        cls: \"is-freins\", eyebrow: \"Freins rencontr\u00e9s\", titre: titre, note: note,\r\n        embleme: freinGlyph(p), lignes: lignes\r\n    });\r\n}\r\n\r\n\/\/ \u2550\u2550 9 bis. IDENTIT\u00c9 VISUELLE DES PORTEURS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ ---- Identit\u00e9 visuelle des porteurs ----\r\n\/\/ Les logos ont \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9s une fois pour toutes sur les sites des\r\n\/\/ associations et sur leurs pages HelloAsso \/ JeVeuxAider, recadr\u00e9s au\r\n\/\/ m\u00eame gabarit optique puis embarqu\u00e9s ici : la page reste un fichier\r\n\/\/ unique et n'appelle aucun serveur tiers \u00e0 l'affichage. La cl\u00e9 est le\r\n\/\/ nom du porteur r\u00e9duit \u00e0 ses lettres et ses chiffres, pour que la\r\n\/\/ fiche retrouve son logo m\u00eame si la feuille change une majuscule, une\r\n\/\/ apostrophe ou un accent. Une valeur qui n'est pas une image est un\r\n\/\/ alias : elle renvoie vers la cl\u00e9 qui porte le logo.\r\nfunction logosPorteurs(){ return window.__fisLogos || {}; }\r\n\r\n\/\/ Initiales de repli : deux lettres au plus, prises sur les mots qui\r\n\/\/ nomment vraiment la structure. Un sigle d\u00e9j\u00e0 \u00e9crit en capitales\r\n\/\/ (PAIS, ACT) se suffit \u00e0 lui-m\u00eame et n'est pas red\u00e9coup\u00e9.\r\nvar LOGO_VIDES = { \"de\":1, \"du\":1, \"des\":1, \"la\":1, \"le\":1, \"les\":1,\r\n    \"l\":1, \"d\":1, \"et\":1, \"en\":1, \"association\":1, \"asso\":1, \"cie\":1,\r\n    \"compagnie\":1, \"centre\":1, \"union\":1 };\r\n\r\nfunction logoKey(nom){\r\n    return (nom || \"\").normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\")\r\n        .toLowerCase().replace(\/[^a-z0-9]+\/g, \"\");\r\n}\r\nfunction logoSrc(nom){\r\n    var table = logosPorteurs();\r\n    var v = table[logoKey(nom)];\r\n    if (typeof v === \"string\" && v.slice(0, 5) !== \"data:\") v = table[v];\r\n    return (typeof v === \"string\" && v.slice(0, 5) === \"data:\") ? v : null;\r\n}\r\nfunction logoMonogramme(nom){\r\n    var brut = (nom || \"\").replace(\/[^A-Za-z\\u00C0-\\u024F]+\/g, \" \").trim();\r\n    if (!brut) return \"?\";\r\n    var sigle = brut.split(\" \")[0];\r\n    if (sigle.length > 1 && sigle === sigle.toUpperCase()) return sigle.slice(0, 2);\r\n    var mots = brut.split(\" \").filter(function(m){\r\n        return m.length > 1 && !LOGO_VIDES[m.toLowerCase()];\r\n    });\r\n    if (!mots.length) mots = brut.split(\" \");\r\n    \/\/ Toujours deux capitales : \u00ab La Caravelle \u00bb ne laisse qu'un mot\r\n    \/\/ utile, et un \u00ab C \u00bb seul dans la pastille p\u00e8se deux fois moins\r\n    \/\/ que les \u00ab AC \u00bb et \u00ab MU \u00bb de la fiche d'\u00e0 c\u00f4t\u00e9.\r\n    if (mots.length === 1) return mots[0].slice(0, 2).toUpperCase();\r\n    return mots.slice(0, 2).map(function(m){ return m.charAt(0).toUpperCase(); }).join(\"\");\r\n}\r\n\/\/ La pastille est toujours l\u00e0, avec ou sans logo : c'est elle qui tient\r\n\/\/ l'alignement de la t\u00eate de fiche. Le logo identifie le porteur, d'o\u00f9\r\n\/\/ le alt ; le monogramme, lui, ne dit rien de plus que le titre juste \u00e0\r\n\/\/ c\u00f4t\u00e9, donc il est masqu\u00e9 aux lecteurs d'\u00e9cran.\r\nfunction ficheLogoHTML(porteur){\r\n    var src = logoSrc(porteur);\r\n    if (src) {\r\n        \/\/ Pas de loading=\"lazy\" : l'image est d\u00e9j\u00e0 dans la page, il n'y\r\n        \/\/ a rien \u00e0 aller chercher, et diff\u00e9rer sa peinture ferait\r\n        \/\/ clignoter la pastille \u00e0 chaque ouverture de fiche.\r\n        return '<div class=\"detail-logo\"><img src=\"' + src + '\" alt=\"Logo '\r\n            + escapeHTML(porteur) + '\" decoding=\"async\"><\\\/div>';\r\n    }\r\n    return '<div class=\"detail-logo detail-logo--mono\" aria-hidden=\"true\"><b>'\r\n        + escapeHTML(logoMonogramme(porteur)) + '<\\\/b><\\\/div>';\r\n}\r\n\r\n\/\/ \u2550\u2550 9 ter. LES INSTRUMENTS DE LA FICHE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ Repris tels quels de la roue d'impact : m\u00eames rubriques, m\u00eame ordre, m\u00eames\r\n\/\/ instruments. Une personne qui passe de la roue \u00e0 la carte ne r\u00e9apprend rien.\r\n\r\nvar fmtNum = function(v){\r\n    return v === null ? \"NR\" : new Intl.NumberFormat(\"fr-FR\").format(Math.round(v));\r\n};\r\n\r\nvar CONFID_TEXTE = \"Confidentialit\u00e9 : cette fiche pr\u00e9sente une description synth\u00e9tique du projet (th\u00e9matique, objectif, public). Les modalit\u00e9s pr\u00e9cises de mise en \u0153uvre et toute donn\u00e9e permettant d'identifier des personnes en sont volontairement exclues.\";\r\n\r\n\/\/ Les trois promesses du fonds. `color` est la teinte pleine, `textColor` la\r\n\/\/ m\u00eame assombrie pour rester lisible partout o\u00f9 elle sert d'encre.\r\nvar PROMESSES = [\r\n    { key: \"ameliorer\", label: \"Am\u00e9liorer\", color: \"#E07B24\", textColor: \"#ad5b14\",\r\n      phrase: \"am\u00e9liorer la vie de celles et ceux qui n\u2019ont pas les m\u00eames chances\" },\r\n    { key: \"emanciper\", label: \"\u00c9manciper\", color: \"#0E9E82\", textColor: \"#087b65\",\r\n      phrase: \"donner \u00e0 chacune et chacun le pouvoir de choisir, d\u2019agir et de s\u2019\u00e9panouir\" },\r\n    { key: \"reveler\",   label: \"R\u00e9v\u00e9ler\",   color: \"#E23C7C\", textColor: \"#d51b63\",\r\n      phrase: \"les forces vives des territoires plut\u00f4t que les contraintes\" }\r\n];\r\n\r\n\/\/ Les rep\u00e8res du corpus, calcul\u00e9s une fois les projets pr\u00e9par\u00e9s : la part\r\n\/\/ m\u00e9diane (le rep\u00e8re de la jauge) et les bornes de l'\u00e9chelle des personnes\r\n\/\/ touch\u00e9es. Le corpus va de 10 \u00e0 plus de 10 000 : sur une r\u00e9glette lin\u00e9aire,\r\n\/\/ presque tous les projets s'\u00e9craseraient contre le bord gauche, d'o\u00f9 une\r\n\/\/ \u00e9chelle logarithmique dont les paliers sont des puissances de dix.\r\nvar PART_MEDIANE = null;\r\nvar PERS_ECHELLE = null;\r\n\r\nfunction calculeReperes(){\r\n    var parts = PROJETS.map(function(p){\r\n        return (p.fisNum !== null && p.budgetNum > 0) ? p.fisNum \/ p.budgetNum * 100 : null;\r\n    }).filter(function(v){ return v !== null; });\r\n    PART_MEDIANE = parts.length ? d3.median(parts) : null;\r\n\r\n    var v = PROJETS.map(function(p){ return p.personnesNum; })\r\n        .filter(function(x){ return x !== null && x > 0; });\r\n    PERS_ECHELLE = null;\r\n    if (v.length){\r\n        var mn = Math.min.apply(null, v), mx = Math.max.apply(null, v);\r\n        if (mx > mn){\r\n            var paliers = [];\r\n            for (var e = Math.ceil(Math.log(mn) \/ Math.LN10); Math.pow(10, e) <= mx; e++){\r\n                paliers.push(Math.pow(10, e));\r\n            }\r\n            PERS_ECHELLE = { mn: mn, mx: mx, paliers: paliers };\r\n        }\r\n    }\r\n}\r\nfunction persPosition(v){\r\n    if (!PERS_ECHELLE) return null;\r\n    var t = (Math.log(Math.max(PERS_ECHELLE.mn, Math.min(PERS_ECHELLE.mx, v))) - Math.log(PERS_ECHELLE.mn))\r\n        \/ (Math.log(PERS_ECHELLE.mx) - Math.log(PERS_ECHELLE.mn));\r\n    return Math.max(0, Math.min(1, t)) * 100;\r\n}\r\n\r\n\/\/ Un texte de porteur n'est jamais un bloc : les listes r\u00e9dig\u00e9es au tiret ou\r\n\/\/ \u00e0 la puce redeviennent des listes, les retours \u00e0 la ligne des paragraphes.\r\nfunction descriptionHTML(value, enumerations){\r\n    var text = String(value == null ? \"\" : value).replace(\/\\r\\n?\/g, \"\\n\").trim();\r\n    if (isNR(text)) return '<p class=\"detail-empty\">Non renseign\u00e9 dans les donn\u00e9es du projet.<\\\/p>';\r\n    var blocks = text.split(\/\\n\\s*\\n\/);\r\n    return blocks.map(function(block){\r\n        var lines = block.split(\"\\n\").map(function(line){ return line.trim(); }).filter(Boolean);\r\n        if (lines.length > 1 && lines.every(function(line){ return \/^(?:[\u2022\u25cf\u25aa]\\s*|[-\u2013\u2014]\\s+|\\d+[.)]\\s+)\/.test(line); })){\r\n            return '<ul class=\"detail-prose-list\">' + lines.map(function(line){\r\n                return '<li>' + escapeHTML(line.replace(\/^(?:[\u2022\u25cf\u25aa]\\s*|[-\u2013\u2014]\\s+)\/, \"\")) + '<\\\/li>';\r\n            }).join(\"\") + '<\\\/ul>';\r\n        }\r\n        if (enumerations && block.length > 180){\r\n            var parts = [], start = 0, depth = 0;\r\n            for (var i = 0; i < block.length; i++){\r\n                if (block[i] === \"(\" || block[i] === \"[\") depth++;\r\n                if (block[i] === \")\" || block[i] === \"]\") depth = Math.max(0, depth - 1);\r\n                if (block[i] === \";\" && depth === 0){ parts.push(block.slice(start, i + 1).trim()); start = i + 1; }\r\n            }\r\n            parts.push(block.slice(start).trim());\r\n            parts = parts.filter(Boolean);\r\n            if (parts.length > 1){\r\n                return '<ul class=\"detail-prose-list\">' + parts.map(function(part){\r\n                    return '<li>' + escapeHTML(part) + '<\\\/li>';\r\n                }).join(\"\") + '<\\\/ul>';\r\n            }\r\n        }\r\n        return '<p>' + lines.map(escapeHTML).join('<br>') + '<\\\/p>';\r\n    }).join(\"\");\r\n}\r\n\r\nfunction sectionHeading(number, title){\r\n    return '<h3 class=\"detail-section-title\"><span aria-hidden=\"true\">' + number + '<\\\/span>' + title + '<\\\/h3>';\r\n}\r\n\r\n\/\/ ---- Le cadran de la part du FIS ----\r\n\/\/ Une part se lit mieux en arc qu'en pourcentage pos\u00e9 \u00e0 plat : l'\u0153il voit\r\n\/\/ tout de suite ce qui reste \u00e0 financer. Le trait isol\u00e9 sur le pourtour est\r\n\/\/ la m\u00e9diane du corpus : un rep\u00e8re, pas une cible. Une part \u00e9lev\u00e9e dit que le\r\n\/\/ FIS porte seul le projet, ce n'est ni un bon ni un mauvais point.\r\nvar JG = { n: 60, depart: -150, course: 300, rExt: 84, rInt: 62, c: 100 };\r\n\r\nfunction jgPoint(angle, r){\r\n    var a = (angle - 90) * Math.PI \/ 180;\r\n    return [(JG.c + r * Math.cos(a)).toFixed(1), (JG.c + r * Math.sin(a)).toFixed(1)];\r\n}\r\nfunction jgTrait(angle, r1, r2, cls, op){\r\n    var A = jgPoint(angle, r1), B = jgPoint(angle, r2);\r\n    return '<line x1=\"' + A[0] + '\" y1=\"' + A[1] + '\" x2=\"' + B[0] + '\" y2=\"' + B[1] + '\"'\r\n        + ' class=\"' + cls + '\"' + (op ? ' opacity=\"' + op + '\"' : '') + '\/>';\r\n}\r\nfunction jaugeHTML(valeur, mediane, themeLab){\r\n    var connue = valeur !== null && isFinite(valeur);\r\n    var v = connue ? Math.max(0, Math.min(100, valeur)) : 0;\r\n    var pleins = connue ? Math.round(v \/ 100 * JG.n) : 0;\r\n    var traits = \"\";\r\n    for (var i = 0; i < JG.n; i++){\r\n        var a = JG.depart + (i + 0.5) \/ JG.n * JG.course;\r\n        if (i < pleins){\r\n            var t = pleins > 1 ? i \/ (pleins - 1) : 1;\r\n            traits += jgTrait(a, JG.rInt - 4 * t, JG.rExt, \"jg-on\", (0.58 + 0.42 * t).toFixed(2));\r\n        } else {\r\n            traits += jgTrait(a, JG.rInt, JG.rExt, \"jg-off\", \"\");\r\n        }\r\n    }\r\n    var note = connue ? \"\" : \"Part non calculable\";\r\n    if (mediane !== null && isFinite(mediane)){\r\n        var m = Math.max(0, Math.min(100, mediane));\r\n        traits += jgTrait(JG.depart + m \/ 100 * JG.course, JG.rExt + 6, JG.rExt + 14, \"jg-repere\", \"\");\r\n        note = (connue ? \"M\u00e9diane du corpus \u00b7 \" : \"Part non calculable \u00b7 m\u00e9diane \") + Math.round(m) + \" %\";\r\n    }\r\n    var lecture = connue\r\n        ? \"Part du FIS : \" + Math.round(valeur) + \" % du budget\"\r\n        : \"Part du FIS non renseign\u00e9e\";\r\n    if (mediane !== null && isFinite(mediane)) lecture += \", m\u00e9diane du corpus \" + Math.round(mediane) + \" %\";\r\n    return '<figure class=\"jauge' + (connue ? '' : ' is-vide') + '\" role=\"img\" aria-label=\"'\r\n        + escapeHTML(lecture) + '\">'\r\n        + '<figcaption class=\"jg-head\"><span class=\"jg-titre\">Part du FIS<\\\/span>'\r\n        + '<span class=\"jg-pill\"><i aria-hidden=\"true\"><\\\/i>' + escapeHTML(themeLab) + '<\\\/span><\\\/figcaption>'\r\n        + '<div class=\"jg-cadran\">'\r\n        + '<svg class=\"rev\" viewBox=\"0 0 200 200\" aria-hidden=\"true\" focusable=\"false\">' + traits + '<\\\/svg>'\r\n        + '<p class=\"jg-val rev\">' + (connue\r\n            ? '<b>' + Math.round(valeur) + '<\\\/b><span>%<\\\/span>'\r\n            : '<b class=\"jg-nr\">&mdash;<\\\/b>') + '<\\\/p>'\r\n        + '<\\\/div>'\r\n        + '<p class=\"jg-note rev\">' + escapeHTML(note) + '<\\\/p><\\\/figure>';\r\n}\r\n\r\n\/\/ ---- La barre de budget ----\r\n\/\/ Le budget total devient la longueur enti\u00e8re, le soutien du FIS en occupe sa\r\n\/\/ part \u2014 ce qui fait appara\u00eetre le reste, c'est-\u00e0-dire ce que le porteur est\r\n\/\/ all\u00e9 chercher ailleurs.\r\nfunction budgetHTML(p){\r\n    var budget = (p.budgetNum === null || p.budgetNum <= 0) ? null : p.budgetNum;\r\n    var fis = p.fisNum;\r\n    if (budget === null || fis === null){\r\n        return '<div class=\"fin-sommes\">'\r\n            + sommeHTML(fis === null ? \"\" : fmtEuro(fis), \"Soutien du FIS\", fis === null, true)\r\n            + sommeHTML(budget === null ? \"\" : fmtEuro(budget), \"Budget total\", budget === null)\r\n            + '<\\\/div>';\r\n    }\r\n    var part = Math.max(0, Math.min(1, fis \/ budget));\r\n    var reste = Math.max(0, budget - fis);\r\n    var pc = Math.round(part * 100);\r\n    var lecture = \"Budget total \" + fmtEuro(budget) + \" : \" + fmtEuro(fis)\r\n        + \" du FIS, soit \" + pc + \" %, et \" + fmtEuro(reste) + \" d'autres financements\";\r\n    return '<div class=\"bud\" role=\"img\" aria-label=\"' + escapeHTML(lecture) + '\">'\r\n        + '<div class=\"bud-bar\"><span class=\"bud-fis rev\" style=\"width:'\r\n        + (part * 100).toFixed(1) + '%\"><\\\/span><\\\/div>'\r\n        + '<p class=\"bud-num rev\"><span><b>' + escapeHTML(fmtEuro(fis)) + '<\\\/b>'\r\n        + '<i>Soutien du FIS &middot; ' + pc + ' %<\\\/i><\\\/span>'\r\n        + '<span><b>' + escapeHTML(fmtEuro(reste)) + '<\\\/b>'\r\n        + '<i>Autres financements<\\\/i><\\\/span><\\\/p>'\r\n        + '<p class=\"bud-total rev\">Budget total &middot; ' + escapeHTML(fmtEuro(budget)) + '<\\\/p><\\\/div>';\r\n}\r\n\/\/ Repli quand la barre ne peut pas se tracer : la jauge dit le rapport, eux\r\n\/\/ disent l'\u00e9chelle. 14 % de 107 000 \u20ac, ce n'est pas 14 % de 7 000 \u20ac.\r\nfunction sommeHTML(valeur, label, vide, fort){\r\n    return '<div class=\"fs-item rev' + (fort ? ' is-key' : '') + (vide ? ' is-empty' : '') + '\">'\r\n        + '<span>' + escapeHTML(label) + '<\\\/span>'\r\n        + '<b>' + escapeHTML(vide ? \"Non renseign\u00e9\" : valeur) + '<\\\/b><\\\/div>';\r\n}\r\n\r\n\/\/ ---- L'\u00e9chelle des personnes touch\u00e9es ----\r\n\/\/ Un nombre seul ne dit rien : 885, c'est beaucoup ou peu ? Le curseur pos\u00e9\r\n\/\/ entre des paliers \u00e9crits en clair r\u00e9pond sans rien demander au lecteur.\r\nfunction personnesHTML(p){\r\n    var v = p.personnesNum;\r\n    var brut = String(p.personnes == null ? \"\" : p.personnes).trim();\r\n    var estimation = brut.replace(\/[\\s\u202f\u00a0]\/g, \"\").replace(\/^[0-9.,]+\/, \"\").length > 2;\r\n    if (isNR(p.personnes) || v === null || v <= 0 || !PERS_ECHELLE){\r\n        return bulle(p.personnes, \"Personnes touch\u00e9es\", isNR(p.personnes));\r\n    }\r\n    var x = persPosition(v);\r\n    var paliers = PERS_ECHELLE.paliers.map(function(t){\r\n        return '<span style=\"left:' + Math.max(4, Math.min(96, persPosition(t))).toFixed(1) + '%\">'\r\n            + escapeHTML(fmtNum(t)) + '<\\\/span>';\r\n    }).join(\"\");\r\n    return '<div class=\"pers\" role=\"img\" aria-label=\"Personnes touch\u00e9es : '\r\n        + (estimation ? 'environ ' : '') + escapeHTML(fmtNum(v)) + '\">'\r\n        + '<p class=\"pers-top rev\"><span class=\"pers-lab\">Personnes touch\u00e9es<\\\/span>'\r\n        + '<b class=\"pers-num\">' + (estimation ? '<em>&asymp;<\\\/em>' : '')\r\n        + escapeHTML(fmtNum(v)) + '<\\\/b><\\\/p>'\r\n        + '<div class=\"ech\"><span class=\"ech-fill rev\" style=\"width:' + x.toFixed(1) + '%\"><\\\/span>'\r\n        + '<span class=\"ech-cur rev\" style=\"left:' + x.toFixed(1) + '%\"><\\\/span><\\\/div>'\r\n        + '<div class=\"ech-ax rev\">' + paliers + '<\\\/div>'\r\n        + (estimation ? '<p class=\"pers-brut\">' + escapeHTML(brut) + '<\\\/p>' : '')\r\n        + '<\\\/div>';\r\n}\r\n\r\n\/\/ Un champ vide reste une bulle : son silence fait partie de ce que dit la\r\n\/\/ fiche.\r\nfunction bulle(value, label, empty, fort){\r\n    var v = String(value == null ? \"\" : value).replace(\/\\s*\\n+\\s*\/g, \" \u00b7 \").replace(\/\\s+\/g, \" \").trim();\r\n    var longue = v.length > 34;\r\n    return '<div class=\"detail-bubble rev' + (empty ? ' is-empty' : '') + (fort ? ' is-key' : '')\r\n        + (longue ? ' is-long' : '') + '\"'\r\n        + (longue ? ' title=\"' + escapeHTML(v) + '\"' : '') + '>'\r\n        + '<span class=\"db-key\">' + escapeHTML(label) + '<\\\/span>'\r\n        + '<b class=\"db-val\">' + escapeHTML(empty ? \"Non renseign\u00e9\" : v) + '<\\\/b><\\\/div>';\r\n}\r\n\r\n\/\/ ---- Les actions, en inventaire ----\r\n\/\/ M\u00eame lecture que sur la roue : une \u00e0 trois lignes \u00ab nombre + nom en toutes\r\n\/\/ lettres \u00bb, s\u00e9par\u00e9es par des points-virgules dans la cellule, sans total\r\n\/\/ (des jours et des paniers ne s'additionnent pas). Aucune ligne chiffr\u00e9e :\r\n\/\/ la carte dit \u00ab Non chiffr\u00e9 \u00bb. Sans inventaire, l'ancienne bulle reprend.\r\nfunction inventaireHTML(p, cle, repli, label){\r\n    cle = cle || \"inventaire\"; repli = repli || \"actions\"; label = label || \"Actions & \u00e9v\u00e9nements\";\r\n    var brut = String(p[cle] == null ? \"\" : p[cle]).replace(\/\\s+\/g, \" \").trim();\r\n    if (!brut) return bulle(p[repli], label, isNR(p[repli]));\r\n    if (isNR(brut)) return bulle(\"\", label, true);\r\n    var lignes = brut.split(\/\\s*;\\s*\/).filter(Boolean).map(function(t){\r\n        var m = t.match(\/^(?:([\u2248~]) ?)?((?:\\d{1,3}(?: \\d{3})+|\\d+)(?:,\\d+)?\\+?) (.+)$\/);\r\n        return m ? {n: (m[1] ? \"\u2248\u202f\" : \"\") + m[2].replace(\/ \/g, \"\u202f\"), l: m[3]} : {n: \"\", l: t};\r\n    });\r\n    var chiffre = lignes.some(function(x){ return x.n; });\r\n    return '<div class=\"detail-bubble detail-inv rev\">'\r\n        + '<span class=\"db-key\">' + escapeHTML(label) + '<\\\/span>'\r\n        + (chiffre ? '' : '<span class=\"inv-nc\">Non chiffr\u00e9<\\\/span>')\r\n        + '<ul class=\"inv\">' + lignes.map(function(x){\r\n            return '<li>' + (x.n\r\n                    ? '<b class=\"inv-n\">' + escapeHTML(x.n) + '<\\\/b> '\r\n                    : '<b class=\"inv-n is-puce\" aria-hidden=\"true\">\u2022<\\\/b> ')\r\n                + '<span class=\"inv-l\">' + escapeHTML(x.l.replace(\/(\\d) (?=\\d{3}(?!\\d))\/g, \"$1\u202f\")) + '<\\\/span><\\\/li>';\r\n        }).join(\"\") + '<\\\/ul><\\\/div>';\r\n}\r\n\r\n\/\/ ---- Les trois promesses, dans la fiche ----\r\n\/\/ Une promesse muette n'est pas cach\u00e9e : son absence est une information sur\r\n\/\/ le r\u00e9cit du porteur, pas sur son action.\r\nfunction fichePromessesHTML(p){\r\n    var lignes = PROMESSES.map(function(pr){\r\n        var muet = !p.docs[pr.key];\r\n        return '<li class=\"pr-item rev' + (muet ? ' is-none' : '') + '\"'\r\n            + ' style=\"--pc:' + pr.color + ';--pc-text:' + pr.textColor + '\">'\r\n            + '<p class=\"pr-head\"><span class=\"pr-dot\" aria-hidden=\"true\"><\\\/span>'\r\n            + escapeHTML(pr.label) + '<\\\/p>'\r\n            + '<p class=\"pr-phrase\">' + escapeHTML(pr.phrase) + '<\\\/p>'\r\n            + (muet\r\n                ? '<p class=\"detail-empty\">Non document\u00e9e par cette structure.<\\\/p>'\r\n                : '<div class=\"pr-text detail-prose\">' + descriptionHTML(p[pr.key], false) + '<\\\/div>')\r\n            + '<\\\/li>';\r\n    }).join(\"\");\r\n    return '<p class=\"pr-score\">' + p.score + ' promesse'\r\n        + (p.score > 1 ? 's' : '') + ' sur 3 racont\u00e9e'\r\n        + (p.score > 1 ? 's' : '') + ' par le porteur<\\\/p>'\r\n        + '<ul class=\"detail-promesses\">' + lignes + '<\\\/ul>';\r\n}\r\n\r\n\/\/ ---- Apparition au d\u00e9filement ----\r\n\/\/ Les jauges se remplissent quand elles entrent dans le champ, pas \u00e0\r\n\/\/ l'ouverture de la fiche. Sans IntersectionObserver, ou si la personne\r\n\/\/ demande moins de mouvement, la classe n'est jamais pos\u00e9e : tout s'affiche\r\n\/\/ d'embl\u00e9e, immobile \u2014 rien ne d\u00e9pend de l'animation pour \u00eatre lisible.\r\nvar revealObs = null;\r\nfunction armeApparitions(body){\r\n    if (revealObs){ revealObs.disconnect(); revealObs = null; }\r\n    body.classList.remove(\"js-reveal\");\r\n    if (!(\"IntersectionObserver\" in window) || REDUCED.matches) return;\r\n    var cibles = body.querySelectorAll(\".rev\");\r\n    if (!cibles.length) return;\r\n    body.classList.add(\"js-reveal\");\r\n    revealObs = new IntersectionObserver(function(entrees){\r\n        entrees.forEach(function(e){\r\n            if (!e.isIntersecting) return;\r\n            e.target.classList.add(\"is-in\");\r\n            revealObs.unobserve(e.target);\r\n        });\r\n    }, { root: body, rootMargin: \"0px 0px -6% 0px\", threshold: 0.12 });\r\n    cibles.forEach(function(c){ revealObs.observe(c); });\r\n}\r\n\r\n\/\/ \u2550\u2550 10. PR\u00c9PARATION DES PROJETS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nvar PROJETS = [];\r\nvar byArr = {}, byCommune = {}, VILLE = [], MULTI = [];\r\n\/\/ La carte en relief (section 21) montre les m\u00eames projets : elle les re\u00e7oit\r\n\/\/ d'ici, rang\u00e9s par lieu, d\u00e8s que la grille est lue. Demander les projets\r\n\/\/ lance au besoin le chargement de la carte territoriale.\r\nvar tientProjets, projetsPrets = new Promise(function(r){ tientProjets = r; });\r\nwindow.__ampProjets = function(){\r\n    if (typeof window.__ampCarteBoot === \"function\") window.__ampCarteBoot();\r\n    return projetsPrets;\r\n};\r\n\r\nfunction lieuOf(p){\r\n    return LIEUX[p.porteur + \"|\" + p.projet] || LIEUX[p.porteur] || null;\r\n}\r\n\r\n\/\/ ---- Secours des trois promesses ----\r\n\/\/ La Google Sheet ne porte pas encore les colonnes Am\u00e9liorer, \u00c9manciper et\r\n\/\/ R\u00e9v\u00e9ler : elles viennent du corpus AER, fig\u00e9 c\u00f4t\u00e9 roue. Tant qu'elles\r\n\/\/ manquent \u00e0 la feuille, on les reprend des donn\u00e9es embarqu\u00e9es, appari\u00e9es sur\r\n\/\/ le couple porteur + intitul\u00e9. Le jour o\u00f9 la feuille les servira, ses\r\n\/\/ valeurs l'emporteront sans rien changer ici, puisqu'on ne comble que ce qui\r\n\/\/ est vide. C'est le m\u00eame secours que sur la roue d'impact : les deux vues\r\n\/\/ racontent donc les m\u00eames promesses.\r\nfunction clePromesse(p){\r\n    var plat = function(v){\r\n        return String(v || \"\").normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\")\r\n            .toLowerCase().replace(\/\\s+\/g, \" \").trim();\r\n    };\r\n    return plat(p.porteur) + \"|\" + plat(p.projet);\r\n}\r\nfunction comblePromesses(rows){\r\n    var fond = {};\r\n    corpusEmbarque().forEach(function(p){ fond[clePromesse(p)] = p; });\r\n    rows.forEach(function(p){\r\n        var src = fond[clePromesse(p)];\r\n        if (!src) return;\r\n        PROMESSES.forEach(function(pr){\r\n            if (!p[pr.key] || !String(p[pr.key]).trim()) p[pr.key] = src[pr.key] || \"\";\r\n        });\r\n        \/\/ L'inventaire des actions suit le m\u00eame secours, r\u00e9dig\u00e9 c\u00f4t\u00e9 roue.\r\n        if (!p.inventaire || !String(p.inventaire).trim()) p.inventaire = src.inventaire || \"\";\r\n        if (!p.invPartenaires || !String(p.invPartenaires).trim()) p.invPartenaires = src.invPartenaires || \"\";\r\n    });\r\n    return rows;\r\n}\r\n\r\nfunction prepare(rows){\r\n    comblePromesses(rows);\r\n    PROJETS = rows.map(function(r){\r\n        var p = {};\r\n        Object.keys(r).forEach(function(k){ p[k] = r[k]; });\r\n        p.theme = String(p.theme || \"\").normalize(\"NFC\").trim();\r\n        p.fisNum = num(p.fis);\r\n        p.budgetNum = num(p.budget);\r\n        p.personnesNum = num(p.personnes);\r\n        p.floraStates = floraStates(p);\r\n        p.empreinte = floraScore(p.floraStates);\r\n        p.freinSegs = freinSegments(p);\r\n        p.freinSet = freinCodes(p, p.freinSegs);\r\n        \/\/ Les trois promesses : document\u00e9e ou muette, comme sur la roue.\r\n        p.docs = {};\r\n        PROMESSES.forEach(function(pr){\r\n            p.docs[pr.key] = !!(p[pr.key] && String(p[pr.key]).trim() && !isNR(p[pr.key]));\r\n        });\r\n        p.score = PROMESSES.filter(function(pr){ return p.docs[pr.key]; }).length;\r\n        p.lieu = lieuOf(p) || { multi: true };\r\n        return p;\r\n    });\r\n\r\n    \/\/ Les rep\u00e8res du corpus (part m\u00e9diane, \u00e9chelle des personnes) se calculent\r\n    \/\/ sur le corpus effectivement charg\u00e9, feuille en direct ou repli embarqu\u00e9.\r\n    calculeReperes();\r\n\r\n    byArr = {}; byCommune = {}; VILLE = []; MULTI = [];\r\n    PROJETS.forEach(function(p){\r\n        var L = p.lieu, pose = false;\r\n        (L.a || []).forEach(function(n){ (byArr[n] = byArr[n] || []).push(p); pose = true; });\r\n        (L.c || []).forEach(function(nom){\r\n            var k = key(nom);\r\n            (byCommune[k] = byCommune[k] || []).push(p);\r\n            pose = true;\r\n        });\r\n        if (L.ville){ VILLE.push(p); pose = true; }\r\n        if (L.multi || !pose) MULTI.push(p);\r\n    });\r\n    tientProjets({ projets: PROJETS, parArr: byArr, parCommune: byCommune, ville: VILLE, multi: MULTI, cle: key });\r\n}\r\n\r\n\/\/ ---- Pont vers la roue : o\u00f9 agit un projet ----\r\n\/\/ La vue \u00ab Qui agit o\u00f9 \u00bb a besoin du rattachement g\u00e9ographique que seule la\r\n\/\/ carte tient : la table LIEUX (porteur \u2192 arrondissements et communes) et la\r\n\/\/ grille des secteurs. Plut\u00f4t que de recopier ces deux tables dans le script\r\n\/\/ de la roue, o\u00f9 elles d\u00e9riveraient \u00e0 la premi\u00e8re mise \u00e0 jour, la carte les\r\n\/\/ publie ici, sous une forme r\u00e9duite \u00e0 ce que la roue demande.\r\n\/\/\r\n\/\/ Un porteur qui agit \u00ab sur toute la ville \u00bb ou sur toute la m\u00e9tropole ne\r\n\/\/ tombe dans aucun secteur : il est multisite, et c'est une r\u00e9ponse, pas un\r\n\/\/ trou. Les projets sans rattachement connu le sont aussi.\r\nwindow.AMP_GEO = {\r\n    secteurs: SECTEURS.map(function(S){\r\n        return { code: S.code, label: S.label, sub: S.sub, color: S.color };\r\n    }),\r\n    multisite: { code: \"MULTISITE\", label: \"Multisite\", sub: \"Ville enti\u00e8re, m\u00e9tropole ou au-del\u00e0\", color: \"#5f7d84\" },\r\n    \/\/ Renvoie les codes de secteur d'un projet, identifi\u00e9 comme dans LIEUX.\r\n    secteursDe: function(porteur, projet){\r\n        var L = LIEUX[porteur + \"|\" + projet] || LIEUX[porteur] || null;\r\n        if (!L) return [\"MULTISITE\"];\r\n        var out = {};\r\n        (L.a || []).forEach(function(n){ out[secteurArr(n)] = 1; });\r\n        (L.c || []).forEach(function(nom){\r\n            var c = secteurByKey[key(nom)];\r\n            if (c) out[c] = 1;\r\n        });\r\n        if (L.ville || L.multi) out[\"MULTISITE\"] = 1;\r\n        var codes = Object.keys(out);\r\n        return codes.length ? codes : [\"MULTISITE\"];\r\n    }\r\n};\r\n\r\n\/\/ Projets rattach\u00e9s \u00e0 une entit\u00e9 g\u00e9ographique de la carte.\r\nfunction fichesOf(d){\r\n    if (d.properties.num) return byArr[d.properties.num] || [];\r\n    return byCommune[key(d.properties.nom)] || [];\r\n}\r\n\r\n\r\n\r\n  \/\/ \u2550\u2550 11. \u00c9TAT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  var features = { communes:[], arrs:[] };\r\n  var selected = null;\r\n  var currentTerritory = null;\r\n  var currentListCtx = null;\r\n  var currentView = \"all\";\r\n  var zoomBehavior = null;\r\n  var svg, gRoot, gCommunes, gMarseilleBoundary, gBubbles, gLabels;\r\n  var projection, gpath;\r\n  var W = 900, H = 650;\r\n\r\n  function pinDot(){\r\n    return '<svg width=\"11\" height=\"13\" viewBox=\"0 0 11 13\" fill=\"none\"><circle cx=\"5.5\" cy=\"5\" r=\"2\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><path d=\"M5.5 1C3.29 1 1.5 2.79 1.5 5c0 2.8 4 7 4 7s4-4.2 4-7c0-2.21-1.79-4-4-4z\" stroke=\"currentColor\" stroke-width=\"1.3\" fill=\"none\"\/><\/svg>';\r\n  }\r\n\r\n  \/\/ \u2550\u2550 12. INITIALISATION ET CHARGEMENT G\u00c9OGRAPHIQUE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  \/\/ L'attente n'est pas un vide : trois points qui respirent, un filet qui\r\n  \/\/ balaie, et le texte dit \u00e0 quelle \u00e9tape on en est. Quand les contours\r\n  \/\/ arrivent, le voile s'efface et la chor\u00e9graphie part \u2014 les formes d'abord,\r\n  \/\/ les libell\u00e9s ensuite, jamais pendant.\r\n  var loaderEl, loaderTxt;\r\n\r\n  function loaderDit(texte){\r\n    if (!loaderTxt) loaderTxt = document.getElementById(\"amp-loader-text\");\r\n    if (loaderTxt) loaderTxt.textContent = texte;\r\n  }\r\n  function loaderSort(){\r\n    if (!loaderEl) loaderEl = document.getElementById(\"amp-loader\");\r\n    if (!loaderEl) return;\r\n    loaderEl.classList.add(\"is-out\");\r\n    setTimeout(function(){ if (loaderEl) loaderEl.hidden = true; }, 600);\r\n  }\r\n  function loaderEchoue(message){\r\n    if (!loaderEl) loaderEl = document.getElementById(\"amp-loader\");\r\n    if (!loaderEl) return;\r\n    loaderEl.classList.add(\"is-error\");\r\n    loaderDit(message);\r\n  }\r\n\r\n  function boot(){\r\n    loaderEl = document.getElementById(\"amp-loader\");\r\n    loaderTxt = document.getElementById(\"amp-loader-text\");\r\n    var panel = document.getElementById(\"amp-panel\");\r\n    if (panel) panel.inert = true;\r\n\r\n    loaderDit(\"Lecture de la grille FIS\u2026\");\r\n    loadSheet(function(rows){\r\n      prepare(rows && rows.length ? rows : corpusEmbarque());\r\n      loaderDit(\"Trac\u00e9 des contours communaux\u2026\");\r\n      loadGeo();\r\n    });\r\n  }\r\n\r\n  \/\/ Les contours servent aux deux cartes de l'onglet, la carte territoriale et\r\n  \/\/ la carte en relief (section 21) : une seule promesse, pr\u00eat\u00e9e \u00e0 la seconde\r\n  \/\/ par window.__ampContours. Les deux cartes lisent ces trac\u00e9s sans jamais\r\n  \/\/ les modifier. Un \u00e9chec lib\u00e8re la promesse : une autre ouverture retente.\r\n  var contours = null;\r\n  function chargeContours(){\r\n    if (contours) return contours;\r\n    contours = Promise.all([\r\n      fetch(\"https:\/\/geo.api.gouv.fr\/departements\/13\/communes?format=geojson&geometry=contour&fields=nom,code,codeEpci\").then(function(r){ return r.json(); }),\r\n      Promise.all(HORS_13.map(function(c){ return fetch(\"https:\/\/geo.api.gouv.fr\/communes\/\"+c+\"?format=geojson&geometry=contour&fields=nom,code\").then(function(r){ return r.json(); }); })),\r\n      fetch(\"https:\/\/public.opendatasoft.com\/api\/explore\/v2.1\/catalog\/datasets\/georef-france-commune-arrondissement-municipal\/records?where=com_code%3D%2213055%22&select=com_arm_name,com_arm_code,geo_shape&limit=20\").then(function(r){ return r.json(); })\r\n    ]).then(function(res){\r\n      var d13 = res[0], hors = res[1], arr = res[2];\r\n      var amp = d13.features.filter(function(f){ return f.properties.codeEpci === EPCI_AMP; }).map(rewindF);\r\n      return {\r\n        communes: amp.filter(function(f){ return f.properties.code !== \"13055\"; }).concat(hors.map(rewindF)),\r\n        arrs: (arr.results || []).map(function(x){\r\n          var nom = Array.isArray(x.com_arm_name) ? x.com_arm_name[0] : x.com_arm_name;\r\n          var code = Array.isArray(x.com_arm_code) ? x.com_arm_code[0] : x.com_arm_code;\r\n          return {\r\n            type: \"Feature\",\r\n            geometry: rewind(x.geo_shape.geometry),\r\n            properties: { nom: nom, code: code, num: +String(code).slice(-2) }\r\n          };\r\n        })\r\n      };\r\n    });\r\n    contours.catch(function(){ contours = null; });\r\n    return contours;\r\n  }\r\n  window.__ampContours = chargeContours;\r\n\r\n  function loadGeo(){\r\n    chargeContours().then(function(c){\r\n      features.communes = c.communes;\r\n      features.arrs = c.arrs;\r\n\r\n      initMap();\r\n      renderRailStats();\r\n      renderRailLegend();\r\n      setupControls();\r\n      majBandeau();\r\n\r\n      loaderSort();\r\n      lanceEntree();\r\n    }).catch(function(e){\r\n      loaderEchoue(\"Impossible de charger les contours g\u00e9ographiques. \" + e.message);\r\n      console.error(e);\r\n    });\r\n  }\r\n\r\n  \/\/ La chor\u00e9graphie d'entr\u00e9e : le rail se pose (CSS), la carte se dessine\r\n  \/\/ (ici). Les \u00e9tiquettes de communes arrivent en dernier, une fois les\r\n  \/\/ formes immobiles.\r\n  function lanceEntree(){\r\n    var el = document.getElementById(\"amp-map\");\r\n    if (!el) return;\r\n    el.classList.remove(\"is-booting\");\r\n    el.classList.add(\"is-ready\");\r\n    if (REDUCED.matches){\r\n      if (gCommunes) gCommunes.attr(\"opacity\", 1);\r\n      if (gMarseilleBoundary) gMarseilleBoundary.attr(\"opacity\", 1);\r\n      if (gBubbles) gBubbles.selectAll(\".amp-bubble\").attr(\"opacity\", 1);\r\n      if (gLabels) gLabels.attr(\"opacity\", 1);\r\n      return;\r\n    }\r\n    animeCarte();\r\n  }\r\n\r\n  \/\/ Le fond se r\u00e9v\u00e8le par vagues d'ouest en est (les communes se teintent\r\n  \/\/ dans l'ordre o\u00f9 l'\u0153il les balaie), puis les pastilles se posent, puis\r\n  \/\/ seulement les noms.\r\n  function animeCarte(){\r\n    if (!gCommunes) return;\r\n\r\n    var paths = gCommunes.selectAll(\"path.amp-commune\");\r\n    var xs = [];\r\n    paths.each(function(d){ var c = gpath.centroid(d); xs.push(isFinite(c[0]) ? c[0] : 0); });\r\n    var xmin = Math.min.apply(null, xs), xmax = Math.max.apply(null, xs);\r\n    var etendue = Math.max(1, xmax - xmin);\r\n\r\n    paths.attr(\"opacity\", 0)\r\n      .transition().duration(520).ease(d3.easeCubicOut)\r\n      .delay(function(d){\r\n        var c = gpath.centroid(d);\r\n        var x = isFinite(c[0]) ? c[0] : xmin;\r\n        return 60 + (x - xmin) \/ etendue * 320;\r\n      })\r\n      .attr(\"opacity\", 1);\r\n\r\n    if (gMarseilleBoundary){\r\n      gMarseilleBoundary.attr(\"opacity\", 0)\r\n        .transition().duration(420).delay(520).attr(\"opacity\", 1);\r\n    }\r\n\r\n    var k = (zoomBehavior && svg) ? (d3.zoomTransform(svg.node()).k || 1) : 1;\r\n    gBubbles.selectAll(\".amp-bubble\")\r\n      .attr(\"opacity\", 0)\r\n      .attr(\"transform\", function(d){ return \"translate(\" + d.xy + \") scale(\" + (0.2 \/ k) + \")\"; })\r\n      .transition().duration(460).ease(d3.easeBackOut.overshoot(1.4))\r\n      .delay(function(d, i){ return 420 + i * 22; })\r\n      .attr(\"opacity\", 1)\r\n      .attr(\"transform\", function(d){ return \"translate(\" + d.xy + \") scale(\" + (1 \/ k) + \")\"; });\r\n\r\n    \/\/ Les noms ne voyagent pas : ils se posent une fois tout immobile.\r\n    gLabels.attr(\"opacity\", 0)\r\n      .transition().duration(520).delay(760).attr(\"opacity\", 1);\r\n  }\r\n\r\n  \/\/ Le bandeau du haut dit ce qu'on regarde, en toutes lettres \u00e0 gauche et en\r\n  \/\/ chiffres \u00e0 droite \u2014 m\u00eame grammaire que le bandeau de rubrique de la roue.\r\n  function majBandeau(titre, compte){\r\n    var lab = document.getElementById(\"amp-stage-label\");\r\n    var idx = document.getElementById(\"amp-stage-index\");\r\n    if (lab) lab.textContent = titre || \"Carte territoriale\";\r\n    if (idx){\r\n      if (compte != null) idx.textContent = compte;\r\n      else {\r\n        var zones = Object.keys(byCommune).length\r\n          + ARR_NUMS.filter(function(n){ return (byArr[n] || []).length > 0; }).length;\r\n        idx.textContent = PROJETS.length + \" projets \u00b7 \" + zones + \" territoires\";\r\n      }\r\n    }\r\n  }\r\n\r\n  function allFeatures(){\r\n    return features.communes.concat(features.arrs);\r\n  }\r\n\r\n  \/\/ \u2550\u2550 13. DESSIN DE LA CARTE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  function initMap(){\r\n    var stage = document.getElementById(\"amp-stage\");\r\n    var svgEl = document.getElementById(\"amp-svg\");\r\n    if (!stage || !svgEl) return;\r\n\r\n    W = stage.clientWidth || 900;\r\n    H = stage.clientHeight || 650;\r\n\r\n    svg = d3.select(svgEl);\r\n    svg.selectAll(\"*\").remove();\r\n    svg.attr(\"viewBox\", \"0 0 \" + W + \" \" + H);\r\n\r\n    gRoot = svg.append(\"g\");\r\n    gCommunes = gRoot.append(\"g\").attr(\"class\", \"amp-g-communes\");\r\n    gMarseilleBoundary = gRoot.append(\"g\").attr(\"class\", \"amp-g-mboundary\");\r\n    gBubbles = gRoot.append(\"g\").attr(\"class\", \"amp-g-bubbles\");\r\n    gLabels = gRoot.append(\"g\").attr(\"class\", \"amp-g-labels\");\r\n\r\n    var all = allFeatures();\r\n    projection = d3.geoMercator().fitExtent([[30, 20], [W - 30, H - 20]], { type: \"FeatureCollection\", features: all });\r\n    gpath = d3.geoPath(projection);\r\n\r\n    zoomBehavior = d3.zoom().scaleExtent([1, 40]).on(\"zoom\", function(ev){\r\n      gRoot.attr(\"transform\", ev.transform);\r\n      var k = ev.transform.k;\r\n      \/\/ Franchir le seuil d\u00e9plie (ou replie) les seize arrondissements.\r\n      var groupes = k < ARR_SEUIL;\r\n      if (groupes !== arrGroupes){\r\n        arrGroupes = groupes;\r\n        drawBubbles();\r\n      }\r\n      gBubbles.selectAll(\".amp-bubble\").attr(\"transform\", function(d){\r\n        return \"translate(\" + d.xy + \") scale(\" + (1 \/ k) + \")\";\r\n      });\r\n      replaceLabels();\r\n    });\r\n\r\n    svg.call(zoomBehavior).on(\"dblclick.zoom\", null);\r\n\r\n    svg.on(\"click\", function(ev){\r\n      if (ev.target === svgEl || ev.target.tagName.toLowerCase() === \"svg\"){\r\n        hidePanel();\r\n      }\r\n    });\r\n\r\n    \/\/ Dessin des contours communaux et arrondissements\r\n    gCommunes.selectAll(\"path.amp-commune\")\r\n      .data(all, function(d){ return d.properties.code; })\r\n      .join(\"path\")\r\n      .attr(\"class\", \"amp-commune\")\r\n      .attr(\"d\", gpath)\r\n      .attr(\"fill\", fillOf)\r\n      .attr(\"stroke\", function(d){ return strokeOf(d, false); })\r\n      .attr(\"stroke-width\", \"0.9px\")\r\n      .on(\"mouseover\", onMouseOver)\r\n      .on(\"mousemove\", onMouseMove)\r\n      .on(\"mouseleave\", onMouseLeave)\r\n      .on(\"click\", onClick);\r\n\r\n    \/\/ Contour de rep\u00e8re de Marseille\r\n    if (features.arrs.length > 0){\r\n      gMarseilleBoundary.selectAll(\"path.amp-marseille-boundary\")\r\n        .data([{ type: \"FeatureCollection\", features: features.arrs }])\r\n        .join(\"path\")\r\n        .attr(\"class\", \"amp-marseille-boundary\")\r\n        .attr(\"d\", gpath);\r\n    }\r\n\r\n    drawBubbles();\r\n    drawLabels();\r\n  }\r\n\r\n  \/\/ ---- Ce qu'on montre, et \u00e0 quel moment ----\r\n  \/\/ Une carte de 92 communes plus 16 arrondissements ne peut pas porter 108\r\n  \/\/ noms d'un coup : ils se chevauchent et plus rien ne se lit. Deux r\u00e8gles,\r\n  \/\/ donc, et une seule chose \u00e0 retenir \u2014 on ne montre un nom que s'il y a la\r\n  \/\/ place de le lire.\r\n  \/\/   1. Marseille reste UNE pastille tant qu'on ne l'a pas ouverte. Ses\r\n  \/\/      seize arrondissements se d\u00e9plient au zoom (ou par \u00ab Focus\r\n  \/\/      Marseille \u00bb), l\u00e0 o\u00f9 ils ont enfin la place d'exister.\r\n  \/\/   2. Les noms sont pos\u00e9s par ordre d'importance (d'abord les territoires\r\n  \/\/      qui portent des projets), et tout nom qui en recouvrirait un autre \u2014\r\n  \/\/      ou une pastille \u2014 n'est pas pos\u00e9. Zoomer lib\u00e8re de la place : les\r\n  \/\/      noms r\u00e9apparaissent tout seuls.\r\n  var ARR_SEUIL = 2.2;\r\n  var arrGroupes = true;\r\n  var labelRAF = null;\r\n\r\n  function zoomK(){\r\n    return (svg && zoomBehavior) ? (d3.zoomTransform(svg.node()).k || 1) : 1;\r\n  }\r\n  function zoomT(){\r\n    return (svg && zoomBehavior) ? d3.zoomTransform(svg.node()) : d3.zoomIdentity;\r\n  }\r\n\r\n  function projetsMarseille(){\r\n    var out = [];\r\n    ARR_NUMS.forEach(function(n){\r\n      (byArr[n] || []).forEach(function(p){ if (out.indexOf(p) === -1) out.push(p); });\r\n    });\r\n    return out;\r\n  }\r\n  function centreMarseille(){\r\n    if (!features.arrs.length) return null;\r\n    var c = gpath.centroid({ type: \"FeatureCollection\", features: features.arrs });\r\n    return (c && isFinite(c[0])) ? c : null;\r\n  }\r\n\r\n  \/\/ Pastilles : une par territoire qui porte des projets.\r\n  function drawBubbles(){\r\n    var data = [];\r\n\r\n    features.communes.forEach(function(d){\r\n      var n = fichesOf(d).length;\r\n      if (n <= 0) return;\r\n      var c = gpath.centroid(d);\r\n      if (!c || !isFinite(c[0])) return;\r\n      var s = secteurOf(d);\r\n      data.push({\r\n        id: d.properties.code, d: d, nom: d.properties.nom, n: n, xy: c,\r\n        r: 6.5 + 2.3 * Math.sqrt(n),\r\n        color: s ? SECT_COLOR[s] : FALLBACK_COLOR,\r\n        groupe: false\r\n      });\r\n    });\r\n\r\n    if (arrGroupes){\r\n      var mrs = projetsMarseille(), c = centreMarseille();\r\n      if (mrs.length && c){\r\n        data.push({\r\n          id: \"MRS\", d: null, nom: \"Marseille\", n: mrs.length, xy: c,\r\n          r: 10 + 2.1 * Math.sqrt(mrs.length),\r\n          color: SECT_COLOR[\"SUD EST 3\"], groupe: true\r\n        });\r\n      }\r\n    } else {\r\n      features.arrs.forEach(function(d){\r\n        var n = fichesOf(d).length;\r\n        if (n <= 0) return;\r\n        var c2 = gpath.centroid(d);\r\n        if (!c2 || !isFinite(c2[0])) return;\r\n        data.push({\r\n          id: d.properties.code, d: d, nom: d.properties.nom, n: n, xy: c2,\r\n          r: 6.5 + 2.3 * Math.sqrt(n),\r\n          color: SECT_COLOR[secteurOf(d)] || FALLBACK_COLOR,\r\n          groupe: false\r\n        });\r\n      });\r\n    }\r\n\r\n    var k0 = zoomK();\r\n\r\n    var sel = gBubbles.selectAll(\".amp-bubble\")\r\n      .data(data, function(d){ return d.id; })\r\n      .join(\r\n        function(enter){ return enter.append(\"g\").attr(\"class\", \"amp-bubble\"); },\r\n        function(update){ return update; },\r\n        function(exit){ return exit.remove(); }\r\n      )\r\n      .attr(\"transform\", function(d){ return \"translate(\" + d.xy + \") scale(\" + (1 \/ k0) + \")\"; });\r\n\r\n    sel.selectAll(\"*\").remove();\r\n    sel.classed(\"is-groupe\", function(d){ return d.groupe; });\r\n\r\n    sel.append(\"circle\")\r\n      .attr(\"r\", function(d){ return d.r; })\r\n      .attr(\"fill\", function(d){ return d.color; });\r\n\r\n    sel.append(\"text\")\r\n      .attr(\"font-size\", function(d){ return d.groupe ? 12 : 10; })\r\n      .text(function(d){ return d.n; });\r\n\r\n    sel.on(\"mouseover\", function(ev, d){\r\n      if (d.groupe){ tipGroupe(ev, d); return; }\r\n      var node = pathDe(d);\r\n      if (node) onMouseOver.call(node, ev, d.d);\r\n    })\r\n    .on(\"mousemove\", function(ev, d){\r\n      if (d.groupe){ tipGroupe(ev, d); return; }\r\n      var node = pathDe(d);\r\n      if (node) onMouseMove.call(node, ev, d.d);\r\n    })\r\n    .on(\"mouseleave\", function(ev, d){\r\n      if (d.groupe){ tipEl.classList.remove(\"amp-show\"); return; }\r\n      var node = pathDe(d);\r\n      if (node) onMouseLeave.call(node, ev, d.d);\r\n    })\r\n    .on(\"click\", function(ev, d){\r\n      ev.stopPropagation();\r\n      \/\/ La pastille group\u00e9e n'ouvre pas un panneau : elle entre dans Marseille.\r\n      if (d.groupe){\r\n        syncChips(\"marseille\");\r\n        hidePanel();\r\n        zoomTo(features.arrs, 30);\r\n        return;\r\n      }\r\n      var node = pathDe(d);\r\n      if (node) onClick.call(node, ev, d.d);\r\n    });\r\n  }\r\n\r\n  function pathDe(d){\r\n    if (!d.d) return null;\r\n    return gCommunes.selectAll(\"path.amp-commune\")\r\n      .filter(function(x){ return x.properties.code === d.d.properties.code; }).node();\r\n  }\r\n\r\n  function tipGroupe(ev, d){\r\n    var stage = document.getElementById(\"amp-stage\");\r\n    var r = stage.getBoundingClientRect();\r\n    var x = ev.clientX - r.left + 14, y = ev.clientY - r.top + 14;\r\n    if (x + 264 > r.width) x = ev.clientX - r.left - 272;\r\n    if (y + 120 > r.height) y = Math.max(8, ev.clientY - r.top - 120);\r\n    tipEl.innerHTML = \"<b>Marseille<\/b>\"\r\n      + \"<div class='amp-tip-meta'>\" + d.n + \" projets \u00b7 16 arrondissements<\/div>\"\r\n      + \"<span class='amp-tip-cta'>Cliquer pour entrer dans la ville<\/span>\";\r\n    tipEl.style.left = x + \"px\";\r\n    tipEl.style.top = y + \"px\";\r\n    tipEl.classList.add(\"amp-show\");\r\n  }\r\n\r\n  \/\/ \u00c9tiquettes : pos\u00e9es par ordre d'importance, et jamais l'une sur l'autre.\r\n  function drawLabels(){\r\n    var k = zoomK(), t = zoomT();\r\n    var cands = [];\r\n\r\n    \/\/ Le nom se pose SOUS la pastille, jamais dessus : l'\u00e9cart se compte en\r\n    \/\/ pixels d'\u00e9cran (la pastille ne grossit pas avec le zoom), donc il se\r\n    \/\/ divise par k pour revenir aux coordonn\u00e9es du dessin.\r\n    function pose(d, texte, fs, n, aire){\r\n      var c = gpath.centroid(d);\r\n      if (!c || !isFinite(c[0])) return;\r\n      var off = n > 0 ? (6.5 + 2.3 * Math.sqrt(n)) + fs * 0.62 + 4 : 0;\r\n      cands.push({\r\n        id: d.properties.code, x: c[0], yc: c[1], y: c[1] + off \/ k, ecart: off,\r\n        text: texte, fs: fs, n: n, aire: aire, on: n > 0\r\n      });\r\n    }\r\n\r\n    features.communes.forEach(function(d){\r\n      var a = gpath.area(d);\r\n      pose(d, d.properties.nom, a > 2200 ? 10.5 : 9.5, fichesOf(d).length, a);\r\n    });\r\n\r\n    if (arrGroupes){\r\n      var mrs = projetsMarseille(), cm = centreMarseille();\r\n      if (cm){\r\n        var rr = 10 + 2.1 * Math.sqrt(Math.max(1, mrs.length));\r\n        cands.push({\r\n          id: \"MRS\", x: cm[0], yc: cm[1], y: cm[1] + (rr + 12) \/ k, ecart: rr + 12,\r\n          text: \"Marseille\", fs: 11.5, n: mrs.length + 999, aire: 1e9, on: true\r\n        });\r\n      }\r\n    } else {\r\n      features.arrs.forEach(function(d){\r\n        pose(d, d.properties.num + \"e\", 9.5, fichesOf(d).length, gpath.area(d));\r\n      });\r\n    }\r\n\r\n    \/\/ D'abord ceux qui portent des projets, puis les plus vastes : quand deux\r\n    \/\/ noms se disputent la m\u00eame place, c'est le plus informatif qui reste.\r\n    cands.sort(function(a, b){\r\n      return (b.on - a.on) || (b.n - a.n) || (b.aire - a.aire);\r\n    });\r\n\r\n    \/\/ Les pastilles occupent le terrain les premi\u00e8res : un nom ne vient\r\n    \/\/ jamais se poser sur un nombre.\r\n    var pris = [];\r\n    gBubbles.selectAll(\".amp-bubble\").each(function(d){\r\n      var sx = t.applyX(d.xy[0]), sy = t.applyY(d.xy[1]);\r\n      pris.push({ x0: sx - d.r - 2, x1: sx + d.r + 2, y0: sy - d.r - 2, y1: sy + d.r + 2 });\r\n    });\r\n\r\n    var gardes = [];\r\n    cands.forEach(function(c){\r\n      \/\/ Une zone sans projet n'a un nom qu'une fois qu'on s'en est approch\u00e9.\r\n      if (!c.on && k < 1.5) return;\r\n      var sx = t.applyX(c.x), sy = t.applyY(c.y);\r\n      if (sx < -40 || sx > W + 40 || sy < -20 || sy > H + 20) return;\r\n      var w = c.text.length * c.fs * 0.53 + 8, h = c.fs + 6;\r\n      var r = { x0: sx - w \/ 2, x1: sx + w \/ 2, y0: sy - h \/ 2, y1: sy + h \/ 2 };\r\n      for (var i = 0; i < pris.length; i++){\r\n        var p = pris[i];\r\n        if (!(r.x1 < p.x0 || r.x0 > p.x1 || r.y1 < p.y0 || r.y0 > p.y1)) return;\r\n      }\r\n      pris.push(r);\r\n      gardes.push(c);\r\n    });\r\n\r\n    gLabels.selectAll(\"text.amp-label\")\r\n      .data(gardes, function(d){ return d.id; })\r\n      .join(\r\n        function(enter){\r\n          return enter.append(\"text\")\r\n            .attr(\"class\", function(d){ return \"amp-label\" + (d.on ? \"\" : \" amp-label-light\"); })\r\n            .attr(\"x\", function(d){ return d.x; })\r\n            .attr(\"y\", function(d){ return d.y; })\r\n            .style(\"font-size\", function(d){ return (d.fs \/ k) + \"px\"; })\r\n            .style(\"opacity\", 0)\r\n            .text(function(d){ return d.text; })\r\n            .call(function(s){ s.transition().duration(200).style(\"opacity\", 1); });\r\n        },\r\n        function(update){\r\n          return update\r\n            .attr(\"class\", function(d){ return \"amp-label\" + (d.on ? \"\" : \" amp-label-light\"); })\r\n            .attr(\"x\", function(d){ return d.x; })\r\n            .attr(\"y\", function(d){ return d.y; })\r\n            .style(\"font-size\", function(d){ return (d.fs \/ k) + \"px\"; })\r\n            .text(function(d){ return d.text; });\r\n        },\r\n        function(exit){ return exit.remove(); }\r\n      );\r\n  }\r\n\r\n  \/\/ Pendant le zoom, les noms existants se recalent sans changer de liste :\r\n  \/\/ remettre en page \u00e0 chaque image les ferait clignoter. La mise en page\r\n  \/\/ compl\u00e8te \u2014 donc les noms qui apparaissent quand la place se lib\u00e8re \u2014 a\r\n  \/\/ lieu une fois le geste termin\u00e9.\r\n  function recaleLabels(k){\r\n    gLabels.selectAll(\"text.amp-label\")\r\n      .attr(\"y\", function(d){ return d.yc + d.ecart \/ k; })\r\n      .style(\"font-size\", function(d){ return (d.fs \/ k) + \"px\"; });\r\n  }\r\n  function replaceLabels(){\r\n    var k = zoomK();\r\n    recaleLabels(k);\r\n    clearTimeout(labelRAF);\r\n    labelRAF = setTimeout(drawLabels, 150);\r\n  }\r\n\r\n  \/\/ \u2550\u2550 14. GESTION DU SURVOL (TOOLTIP) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  var hoveredEl = null;\r\n  var tipEl = document.getElementById(\"amp-tip\");\r\n\r\n  function onMouseOver(event, d){\r\n    if (hoveredEl && hoveredEl !== this){\r\n      d3.select(hoveredEl).classed(\"hovered\", false)\r\n        .attr(\"stroke\", function(dd){ return (selected && selected.properties.code === dd.properties.code) ? (SECT_COLOR[secteurOf(dd)] || \"#24476d\") : strokeOf(dd, false); })\r\n        .attr(\"stroke-width\", function(dd){ return (selected && selected.properties.code === dd.properties.code) ? \"2.8px\" : \"0.9px\"; });\r\n    }\r\n    hoveredEl = this;\r\n    var s = secteurOf(d), sc = s ? SECT_COLOR[s] : FALLBACK_COLOR;\r\n    d3.select(this).classed(\"hovered\", true)\r\n      .attr(\"stroke\", sc)\r\n      .attr(\"stroke-width\", \"2.2px\")\r\n      .raise();\r\n  }\r\n\r\n  function onMouseMove(event, d){\r\n    var v = valueOf(d), s = secteurOf(d), sc = s ? SECT_COLOR[s] : null;\r\n    var nf = fichesOf(d).length;\r\n    var pl = v > 1 ? \"s\" : \"\";\r\n    var unit = d.properties.num\r\n      ? (\"site\" + pl + \" d'implantation\")\r\n      : (\"projet\" + pl + \" financ\u00e9\" + pl);\r\n\r\n    var projs = fichesOf(d);\r\n    var listHTML = \"\";\r\n    if (projs.length > 0){\r\n      var top3 = projs.slice(0, 3).map(function(p){ return \"<li>\" + esc(p.porteur || p.projet) + \"<\/li>\"; }).join(\"\");\r\n      var more = projs.length > 3 ? \"<li class='is-more'>et \" + (projs.length - 3) + \" autre\"\r\n        + (projs.length - 3 > 1 ? \"s\" : \"\") + \"<\/li>\" : \"\";\r\n      listHTML = \"<ul>\" + top3 + more + \"<\/ul>\";\r\n    }\r\n\r\n    var html = \"<b>\" + esc(d.properties.nom) + \"<\/b>\"\r\n      + \"<div class='amp-tip-meta'>\" + (v > 0 ? (v + \" \" + unit) : \"Aucun projet recens\u00e9\")\r\n      + (s ? (\" &middot; secteur \" + esc(s)) : \"\") + \"<\/div>\"\r\n      + listHTML\r\n      + (projs.length ? \"<span class='amp-tip-cta'>Cliquer pour ouvrir les fiches<\/span>\" : \"\");\r\n\r\n    var stage = document.getElementById(\"amp-stage\");\r\n    var r = stage.getBoundingClientRect();\r\n    var x = event.clientX - r.left + 14;\r\n    var y = event.clientY - r.top + 14;\r\n    if (x + 260 > r.width) x = event.clientX - r.left - 268;\r\n    if (y + 120 > r.height) y = Math.max(8, event.clientY - r.top - 120);\r\n\r\n    tipEl.innerHTML = html;\r\n    tipEl.style.left = x + \"px\";\r\n    tipEl.style.top = y + \"px\";\r\n    tipEl.classList.add(\"amp-show\");\r\n  }\r\n\r\n  function onMouseLeave(event, d){\r\n    if (hoveredEl === this){\r\n      var isSel = (selected && selected.properties.code === d.properties.code);\r\n      d3.select(this).classed(\"hovered\", false)\r\n        .attr(\"stroke\", isSel ? (SECT_COLOR[secteurOf(d)] || \"#24476d\") : strokeOf(d, false))\r\n        .attr(\"stroke-width\", isSel ? \"2.8px\" : \"0.9px\");\r\n      if (!isSel) d3.select(this).lower();\r\n      hoveredEl = null;\r\n    }\r\n    tipEl.classList.remove(\"amp-show\");\r\n  }\r\n\r\n  \/\/ \u2550\u2550 15. CLIC, ZOOM ET S\u00c9LECTION \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  function onClick(event, d){\r\n    event.stopPropagation();\r\n    selectFeature(d);\r\n    zoomTo([d], 40);\r\n    showPanel(d, false);\r\n  }\r\n\r\n  function selectFeature(d){\r\n    if (selected && gCommunes){\r\n      gCommunes.selectAll(\"path.amp-commune\")\r\n        .filter(function(n){ return n.properties.code === selected.properties.code; })\r\n        .classed(\"is-selected\", false)\r\n        .attr(\"stroke\", function(n){ return strokeOf(n, false); })\r\n        .attr(\"stroke-width\", \"0.9px\");\r\n    }\r\n    selected = d;\r\n    if (d && gCommunes){\r\n      var sc = SECT_COLOR[secteurOf(d)] || FALLBACK_COLOR;\r\n      gCommunes.selectAll(\"path.amp-commune\")\r\n        .filter(function(n){ return n.properties.code === d.properties.code; })\r\n        .classed(\"is-selected\", true)\r\n        .attr(\"stroke\", sc)\r\n        .attr(\"stroke-width\", \"2.8px\")\r\n        .raise();\r\n    }\r\n  }\r\n\r\n  function clearSelection(){\r\n    if (selected && gCommunes){\r\n      gCommunes.selectAll(\"path.amp-commune\")\r\n        .filter(function(n){ return n.properties.code === selected.properties.code; })\r\n        .classed(\"is-selected\", false)\r\n        .attr(\"stroke\", function(n){ return strokeOf(n, false); })\r\n        .attr(\"stroke-width\", \"0.9px\");\r\n    }\r\n    selected = null;\r\n  }\r\n\r\n  function zoomTo(featList, pad){\r\n    if (!gpath || !svg || !zoomBehavior || !featList || !featList.length) return;\r\n    pad = pad || 35;\r\n    var b = gpath.bounds({ type: \"FeatureCollection\", features: featList });\r\n    var bw = b[1][0] - b[0][0], bh = b[1][1] - b[0][1];\r\n    if (bw <= 0 || bh <= 0) return;\r\n    var scale = Math.min(35, 0.88 \/ Math.max(bw \/ W, bh \/ H));\r\n    scale = Math.max(1, scale);\r\n    var tx = W \/ 2 - scale * (b[0][0] + b[1][0]) \/ 2;\r\n    var ty = H \/ 2 - scale * (b[0][1] + b[1][1]) \/ 2;\r\n    svg.transition().duration(750).ease(d3.easeCubicInOut)\r\n      .call(zoomBehavior.transform, d3.zoomIdentity.translate(tx, ty).scale(scale));\r\n  }\r\n\r\n  function resetZoom(){\r\n    if (!svg || !zoomBehavior) return;\r\n    svg.transition().duration(750).ease(d3.easeCubicInOut)\r\n      .call(zoomBehavior.transform, d3.zoomIdentity);\r\n  }\r\n\r\n  \/\/ \u2550\u2550 16. PANNEAU LAT\u00c9RAL \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  \/\/ Deux \u00e9tages dans le m\u00eame panneau : le territoire (ce qu'on a cliqu\u00e9, et la\r\n  \/\/ liste de ses porteurs), puis la fiche projet \u2014 exactement celle de la roue\r\n  \/\/ d'impact, rubrique pour rubrique. Les deux \u00e9tages vivent dans deux blocs\r\n  \/\/ distincts et non dans un seul qu'on r\u00e9\u00e9crit : revenir \u00e0 la liste retrouve\r\n  \/\/ ainsi sa position de d\u00e9filement, au lieu de repartir du haut.\r\n\r\n  function panelEls(){\r\n    return {\r\n      panel: document.getElementById(\"amp-panel\"),\r\n      bar:   document.getElementById(\"amp-panel-bar\"),\r\n      hd:    document.getElementById(\"amp-panel-hd\"),\r\n      list:  document.getElementById(\"amp-panel-list\"),\r\n      fiche: document.getElementById(\"amp-panel-fiche\")\r\n    };\r\n  }\r\n\r\n  function ouvrePanneau(panel){\r\n    panel.classList.add(\"amp-open\");\r\n    panel.setAttribute(\"aria-hidden\", \"false\");\r\n    panel.inert = false;\r\n  }\r\n\r\n  function croixSVG(){\r\n    return '<svg viewBox=\"0 0 20 20\" width=\"13\" height=\"13\" fill=\"none\" aria-hidden=\"true\">'\r\n      + '<path d=\"M5 5l10 10M15 5L5 15\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"\/><\/svg>';\r\n  }\r\n  function fleche(){\r\n    return '<svg viewBox=\"0 0 20 20\" width=\"13\" height=\"13\" fill=\"none\" aria-hidden=\"true\">'\r\n      + '<path d=\"M12 4L6 10l6 6\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>';\r\n  }\r\n  function loupeSVG(){\r\n    return '<svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\">'\r\n      + '<path d=\"M7 3H3v4m10-4h4v4M3 13v4h4m10-4v4h-4\" stroke=\"currentColor\" stroke-width=\"1.5\"'\r\n      + ' stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>';\r\n  }\r\n\r\n  \/\/ ---- \u00c9tage 1 : le territoire ----\r\n  function showPanel(d, isMulti){\r\n    var E = panelEls();\r\n\r\n    var titre, sous, secteur, sc, meta, fiches, qpvList = [];\r\n\r\n    if (isMulti){\r\n      currentTerritory = { isMulti: true, nom: \"Projets multisites\" };\r\n      titre = \"Projets multisites\";\r\n      sous = \"Rayonnement m\u00e9tropolitain ou toute la ville de Marseille\";\r\n      secteur = \"MULTISITE\";\r\n      sc = \"#5f7d84\";\r\n      meta = { sub: \"P\u00e9rim\u00e8tre m\u00e9tropolitain\" };\r\n      fiches = VILLE.concat(MULTI);\r\n    } else {\r\n      currentTerritory = d;\r\n      var nom = d.properties.nom, k = key(nom), num2 = d.properties.num;\r\n      titre = nom;\r\n      sous = num2 ? (\"Marseille \u2014 \" + nom) : \"M\u00e9tropole Aix-Marseille-Provence\";\r\n      secteur = secteurOf(d);\r\n      sc = secteur && SECT_COLOR[secteur] ? SECT_COLOR[secteur] : FALLBACK_COLOR;\r\n      meta = secteur ? SECT_META[secteur] : null;\r\n      fiches = fichesOf(d);\r\n      qpvList = num2 ? uniq(qpvByArr[num2] || []) : (k === \"marseille\" ? marseilleQPV() : uniq(qpvByCommune[k] || []));\r\n    }\r\n\r\n    currentListCtx = { d: d, isMulti: isMulti, titre: titre, sc: sc };\r\n\r\n    E.panel.style.setProperty(\"--pc\", sc);\r\n    E.panel.classList.remove(\"is-fiche\");\r\n    E.bar.style.background = sc;\r\n\r\n    var eyebrow = secteur\r\n      ? '<p class=\"amp-panel-eyebrow\"><i aria-hidden=\"true\"><\/i><span>' + esc(secteur)\r\n        + (meta && meta.sub ? ' &middot; ' + esc(meta.sub) : '') + '<\/span><\/p>'\r\n      : '<p class=\"amp-panel-eyebrow\"><i aria-hidden=\"true\"><\/i><span>Hors secteur Politique de la Ville<\/span><\/p>';\r\n\r\n    var countText = fiches.length\r\n      ? fiches.length + \" projet\" + (fiches.length > 1 ? \"s\" : \"\") + \" rattach\u00e9\" + (fiches.length > 1 ? \"s\" : \"\")\r\n      : \"Aucun projet recens\u00e9\";\r\n\r\n    E.hd.innerHTML =\r\n      '<div class=\"amp-panel-tools\">'\r\n      +   eyebrow\r\n      +   '<div class=\"amp-panel-controls\">'\r\n      +     '<button class=\"amp-icon-btn\" id=\"amp-panel-close-btn\" type=\"button\" aria-label=\"Fermer le panneau\" title=\"Fermer\">'\r\n      +       croixSVG() + '<\/button>'\r\n      +   '<\/div>'\r\n      + '<\/div>'\r\n      + '<h2 class=\"amp-panel-title\">' + esc(titre) + '<\/h2>'\r\n      + '<p class=\"amp-panel-loc\">' + pinDot() + ' ' + esc(sous) + '<\/p>'\r\n      + '<p class=\"amp-panel-count\">' + countText + '<\/p>';\r\n\r\n    var qpvHTML = \"\";\r\n    if (qpvList.length > 0){\r\n      qpvHTML = '<p class=\"amp-section-title\">Quartiers prioritaires &middot; ' + qpvList.length + '<\/p>'\r\n        + '<div class=\"amp-qpv-tags\">'\r\n        + qpvList.map(function(q){ return '<span class=\"amp-qpv-tag\">' + esc(q) + '<\/span>'; }).join('')\r\n        + '<\/div>';\r\n    }\r\n\r\n    var listCardsHTML;\r\n    if (fiches.length > 0){\r\n      listCardsHTML = '<p class=\"amp-section-title\">Porteurs de projet &middot; ' + fiches.length + '<\/p>'\r\n        + fiches.map(function(p){\r\n          var m = themeMeta(p.theme);\r\n          var c = m ? m.ton : \"#5d6672\";\r\n          var marques = [];\r\n          if (p.empreinte) marques.push(p.empreinte + \"\/4 impact\");\r\n          if (p.score) marques.push(p.score + \"\/3 promesses\");\r\n          if (p.freinSet.length) marques.push(p.freinSet.length + \" frein\" + (p.freinSet.length > 1 ? \"s\" : \"\"));\r\n          return '<button class=\"amp-pitem\" type=\"button\" data-id=\"' + esc(p.porteur + \"|\" + p.projet)\r\n            + '\" style=\"--pjc:' + c + '\">'\r\n            + '<span class=\"amp-pitem-top\">'\r\n            +   '<span class=\"amp-pitem-theme\"><i class=\"amp-pitem-theme-dot\"><\/i><span>'\r\n            +     esc(themeLabel(p.theme)) + '<\/span><\/span>'\r\n            +   (p.fisNum !== null ? '<span class=\"amp-pitem-amount\">' + esc(fmtEuro(p.fisNum)) + '<\/span>' : '')\r\n            + '<\/span>'\r\n            + '<span class=\"amp-pitem-name\">' + esc(p.porteur || p.projet) + '<\/span>'\r\n            + (p.projet ? '<span class=\"amp-pitem-sub\">' + esc(p.projet) + '<\/span>' : '')\r\n            + '<span class=\"amp-pitem-foot\">'\r\n            +   '<span class=\"amp-pitem-marks\">'\r\n            +     (marques.length ? '<span class=\"amp-pitem-mark\">' + esc(marques.join(\"  \u00b7  \")) + '<\/span>' : '')\r\n            +   '<\/span>'\r\n            +   '<span class=\"amp-pitem-arrow\">Fiche &rsaquo;<\/span>'\r\n            + '<\/span>'\r\n            + '<\/button>';\r\n        }).join('');\r\n    } else {\r\n      listCardsHTML = '<p class=\"amp-empty\">Aucune fiche projet rattach\u00e9e \u00e0 ce territoire dans la grille FIS 2025.<\/p>';\r\n    }\r\n\r\n    E.list.innerHTML = qpvHTML + listCardsHTML;\r\n    E.list.scrollTop = 0;\r\n\r\n    majBandeau(titre, fiches.length + \" projet\" + (fiches.length > 1 ? \"s\" : \"\")\r\n      + (qpvList.length ? \" \u00b7 \" + qpvList.length + \" QPV\" : \"\"));\r\n\r\n    document.getElementById(\"amp-panel-close-btn\").addEventListener(\"click\", hidePanel);\r\n\r\n    E.list.querySelectorAll(\".amp-pitem\").forEach(function(card){\r\n      card.addEventListener(\"click\", function(){\r\n        var id = card.getAttribute(\"data-id\");\r\n        var proj = fiches.filter(function(x){ return (x.porteur + \"|\" + x.projet) === id; })[0];\r\n        if (proj) showProfile(proj, titre);\r\n      });\r\n    });\r\n\r\n    ouvrePanneau(E.panel);\r\n  }\r\n\r\n  \/\/ ---- \u00c9tage 2 : la fiche projet ----\r\n  \/\/ M\u00eame ch\u00e2ssis que la roue : un bandeau de th\u00e9matique, cinq rubriques\r\n  \/\/ num\u00e9rot\u00e9es, et les m\u00eames instruments (cadran de la part, barre de budget,\r\n  \/\/ \u00e9chelle des personnes, fleur d'impact, cage des freins).\r\n  function showProfile(p, retourTitre){\r\n    var E = panelEls();\r\n    var m = themeMeta(p.theme);\r\n    var couleur = m ? m.color : \"#5f7d84\";\r\n    var encre = m ? m.textColor : \"#40565d\";\r\n    var lab = themeLabel(p.theme);\r\n\r\n    var pctNum = (p.fisNum !== null && p.budgetNum > 0) ? p.fisNum \/ p.budgetNum * 100 : null;\r\n\r\n    E.panel.style.setProperty(\"--pc\", m ? m.ton : \"#5f7d84\");\r\n    E.panel.style.setProperty(\"--theme-color\", couleur);\r\n    E.panel.style.setProperty(\"--theme-color-text\", encre);\r\n    E.bar.style.background = m ? m.ton : \"#5f7d84\";\r\n    E.panel.classList.add(\"is-fiche\");\r\n\r\n    var retour = retourTitre || (currentListCtx && currentListCtx.titre) || \"la liste\";\r\n\r\n    var indicsHTML = isNR(p.indicateurs) ? '' :\r\n      '<div class=\"detail-indics\"><h4>Indicateurs propres au porteur<\/h4>'\r\n      + '<div class=\"detail-prose\">' + descriptionHTML(p.indicateurs, true) + '<\/div><\/div>';\r\n\r\n    var horsHTML = (p.lieu && p.lieu.hors)\r\n      ? '<p class=\"detail-territory\" style=\"margin-top:12px\">' + pinDot()\r\n        + ' \u00c9galement actif hors m\u00e9tropole : ' + esc(p.lieu.hors) + '<\/p>'\r\n      : '';\r\n\r\n    E.fiche.innerHTML =\r\n      '<div class=\"detail-toolbar\">'\r\n      +   '<button class=\"amp-icon-btn is-back\" id=\"amp-fiche-back\" type=\"button\"'\r\n      +     ' aria-label=\"Revenir \u00e0 ' + esc(retour) + '\" title=\"Revenir \u00e0 ' + esc(retour) + '\">'\r\n      +     fleche() + '<span>Retour<\/span><\/button>'\r\n      +   '<span class=\"detail-theme\"><span class=\"legend-dot\"><\/span><span class=\"lbl\">' + esc(lab) + '<\/span><\/span>'\r\n      +   '<div class=\"amp-panel-controls\">'\r\n      +     '<button class=\"amp-icon-btn amp-panel-expand\" id=\"amp-fiche-expand\" type=\"button\"'\r\n      +       ' aria-pressed=\"false\" aria-label=\"Agrandir la fiche\" title=\"Agrandir la fiche\">' + loupeSVG() + '<\/button>'\r\n      +     '<button class=\"amp-icon-btn\" id=\"amp-fiche-close\" type=\"button\" aria-label=\"Fermer la fiche\" title=\"Fermer\">'\r\n      +       croixSVG() + '<\/button>'\r\n      +   '<\/div>'\r\n      + '<\/div>'\r\n      + '<nav class=\"detail-nav\" aria-label=\"Rubriques de la fiche\">'\r\n      +   '<button type=\"button\" data-section=\"fiche-moyens\" aria-current=\"location\">D\u00e9ploiement<\/button>'\r\n      +   '<button type=\"button\" data-section=\"fiche-projet\">Le projet<\/button>'\r\n      +   '<button type=\"button\" data-section=\"fiche-promesses\">Promesses<\/button>'\r\n      +   '<button type=\"button\" data-section=\"fiche-impact\">Impacts<\/button>'\r\n      +   '<button type=\"button\" data-section=\"fiche-freins\">Freins<\/button>'\r\n      + '<\/nav>'\r\n      + '<div class=\"detail-body\" tabindex=\"0\" aria-label=\"Contenu de la fiche\">'\r\n      +   '<header class=\"detail-hero\">'\r\n      +     '<p class=\"detail-eyebrow\">Fiche projet <span>FIS &middot; 2025<\/span><\/p>'\r\n      +     '<div class=\"detail-ident\">' + ficheLogoHTML(p.porteur || p.projet)\r\n      +       '<div class=\"detail-ident-text\">'\r\n      +         '<h2 class=\"detail-title\">' + esc(p.porteur || p.projet) + '<\/h2>'\r\n      +         (p.projet ? '<p class=\"detail-project-name\">' + esc(p.projet) + '<\/p>' : '')\r\n      +       '<\/div>'\r\n      +     '<\/div>'\r\n      +     (!isNR(p.territoire)\r\n        ? '<p class=\"detail-territory\">' + pinDot() + ' ' + esc(p.territoire) + '<\/p>' : '')\r\n      +     horsHTML\r\n      +   '<\/header>'\r\n      +   '<section class=\"detail-section is-lead\" id=\"fiche-moyens\" tabindex=\"-1\" aria-label=\"Financement et d\u00e9ploiement\">'\r\n      +     sectionHeading(\"01\", \"Financement &amp; d\u00e9ploiement\")\r\n      +     '<div class=\"fin-card\">' + jaugeHTML(pctNum, PART_MEDIANE, lab) + budgetHTML(p) + '<\/div>'\r\n      +     personnesHTML(p)\r\n      +     '<div class=\"detail-bubbles\">'\r\n      +       inventaireHTML(p)\r\n      +       inventaireHTML(p, \"invPartenaires\", \"nbPartenaires\", \"Partenaires mobilis\u00e9s\")\r\n      +     '<\/div>'\r\n      +   '<\/section>'\r\n      +   '<section class=\"detail-section\" id=\"fiche-projet\" tabindex=\"-1\" aria-label=\"Le projet\">'\r\n      +     sectionHeading(\"02\", \"Le projet\")\r\n      +     '<div class=\"detail-prose detail-summary\">' + descriptionHTML(p.resume, false) + '<\/div>'\r\n      +   '<\/section>'\r\n      +   '<section class=\"detail-section\" id=\"fiche-promesses\" tabindex=\"-1\" aria-label=\"Les trois promesses du fonds\">'\r\n      +     sectionHeading(\"03\", \"Les trois promesses\")\r\n      +     '<p class=\"detail-section-intro\">Am\u00e9liorer, \u00e9manciper, r\u00e9v\u00e9ler : les trois promesses du fonds, '\r\n      +       'telles que cette structure les raconte dans son rapport.<\/p>'\r\n      +     fichePromessesHTML(p)\r\n      +   '<\/section>'\r\n      +   '<section class=\"detail-section\" id=\"fiche-impact\" tabindex=\"-1\" aria-label=\"Impacts document\u00e9s\">'\r\n      +     sectionHeading(\"04\", \"Impacts document\u00e9s\")\r\n      +     ficheFloraHTML(p)\r\n      +     indicsHTML\r\n      +   '<\/section>'\r\n      +   '<section class=\"detail-section\" id=\"fiche-freins\" tabindex=\"-1\" aria-label=\"Freins rencontr\u00e9s\">'\r\n      +     sectionHeading(\"05\", \"Freins rencontr\u00e9s\")\r\n      +     ficheFreinsHTML(p)\r\n      +   '<\/section>'\r\n      +   '<footer class=\"detail-confid\"><strong>\u00c0 propos de cette fiche<\/strong><p>' + esc(CONFID_TEXTE) + '<\/p>'\r\n      +     '<p class=\"detail-data-note\">Une information non renseign\u00e9e ne signifie pas une absence '\r\n      +       'd\u2019action ou d\u2019impact.<\/p><\/footer>'\r\n      + '<\/div>';\r\n\r\n    var body = E.fiche.querySelector(\".detail-body\");\r\n    body.scrollTop = 0;\r\n    armeApparitions(body);\r\n    wireAccordions(body);\r\n\r\n    document.getElementById(\"amp-fiche-back\").addEventListener(\"click\", function(){\r\n      E.panel.classList.remove(\"is-expanded\");\r\n      document.getElementById(\"amp-fiche-expand\").setAttribute(\"aria-pressed\", \"false\");\r\n      if (currentListCtx) showPanel(currentListCtx.d, currentListCtx.isMulti);\r\n      else hidePanel();\r\n    });\r\n    document.getElementById(\"amp-fiche-close\").addEventListener(\"click\", hidePanel);\r\n\r\n    var expand = document.getElementById(\"amp-fiche-expand\");\r\n    expand.addEventListener(\"click\", function(){\r\n      var ouvert = E.panel.classList.toggle(\"is-expanded\");\r\n      this.setAttribute(\"aria-pressed\", ouvert ? \"true\" : \"false\");\r\n      this.setAttribute(\"aria-label\", ouvert ? \"R\u00e9duire la fiche\" : \"Agrandir la fiche\");\r\n      this.title = ouvert ? \"R\u00e9duire la fiche\" : \"Agrandir la fiche\";\r\n    });\r\n\r\n    \/\/ Le fil des rubriques suit le d\u00e9filement : on sait toujours o\u00f9 on est.\r\n    var boutons = E.fiche.querySelectorAll(\".detail-nav button\");\r\n    boutons.forEach(function(btn){\r\n      btn.addEventListener(\"click\", function(){\r\n        var section = E.fiche.querySelector(\"#\" + this.dataset.section);\r\n        if (section) body.scrollTo({ top: section.offsetTop - 16, behavior: REDUCED.matches ? \"auto\" : \"smooth\" });\r\n      });\r\n    });\r\n    function majNav(){\r\n      var actif = \"fiche-moyens\";\r\n      E.fiche.querySelectorAll(\".detail-section\").forEach(function(section){\r\n        if (section.offsetTop <= body.scrollTop + 80) actif = section.id;\r\n      });\r\n      if (body.scrollHeight - body.clientHeight - body.scrollTop < 8) actif = \"fiche-freins\";\r\n      boutons.forEach(function(btn){\r\n        if (btn.dataset.section === actif) btn.setAttribute(\"aria-current\", \"location\");\r\n        else btn.removeAttribute(\"aria-current\");\r\n      });\r\n    }\r\n    body.addEventListener(\"scroll\", majNav, { passive: true });\r\n    majNav();\r\n\r\n    ouvrePanneau(E.panel);\r\n  }\r\n\r\n  \/\/ Un seul volet ouvert \u00e0 la fois : la fiche ne doit pas se d\u00e9plier en\r\n  \/\/ accord\u00e9on sur toute sa hauteur. La carte se d\u00e9plie muette, le texte se\r\n  \/\/ pose ensuite (voir la feuille de style) ; \u00ab Lire \u00bb ne change pas, c'est\r\n  \/\/ le chevron qui se retourne. Survoler une carte allume sa couche dans\r\n  \/\/ l'embl\u00e8me et son segment dans la barre ; au clavier, le focus aussi.\r\n  \/\/ M\u00eames gestes que sur la fiche de la roue (armeVolets).\r\n  function wireAccordions(container){\r\n    var btns = container.querySelectorAll(\"button.imp-head\");\r\n    btns.forEach(function(btn, index){\r\n      var ligne = btn.parentNode;\r\n      var corps = ligne.querySelector(\".imp-body\");\r\n      corps.id = \"amp-rubrique-\" + index;\r\n      btn.setAttribute(\"aria-controls\", corps.id);\r\n      btn.addEventListener(\"click\", function(){\r\n        var ouvrir = btn.getAttribute(\"aria-expanded\") !== \"true\";\r\n        btns.forEach(function(o){\r\n          o.setAttribute(\"aria-expanded\", \"false\");\r\n          o.parentNode.classList.remove(\"is-open\");\r\n        });\r\n        if (ouvrir){\r\n          btn.setAttribute(\"aria-expanded\", \"true\");\r\n          ligne.classList.add(\"is-open\");\r\n        }\r\n      });\r\n    });\r\n    container.querySelectorAll(\".imp\").forEach(function(bloc){\r\n      function eclaire(k){\r\n        var trouve = false;\r\n        bloc.querySelectorAll(\".imp-couche, .imp-seg\").forEach(function(el){\r\n          var lui = !!k && el.getAttribute(\"data-k\") === k;\r\n          el.classList.toggle(\"is-lit\", lui);\r\n          if (lui && el.classList.contains(\"imp-couche\")) trouve = true;\r\n        });\r\n        bloc.classList.toggle(\"is-lit\", trouve);\r\n      }\r\n      bloc.querySelectorAll(\".imp-row[data-k]\").forEach(function(ligne){\r\n        var k = ligne.getAttribute(\"data-k\");\r\n        ligne.addEventListener(\"pointerenter\", function(e){ if (e.pointerType !== \"touch\") eclaire(k); });\r\n        ligne.addEventListener(\"pointerleave\", function(){ eclaire(null); });\r\n        ligne.addEventListener(\"focusin\", function(e){\r\n          var clavier = true;\r\n          try { clavier = e.target.matches(\":focus-visible\"); } catch (err) {}\r\n          if (clavier) eclaire(k);\r\n        });\r\n        ligne.addEventListener(\"focusout\", function(){ eclaire(null); });\r\n      });\r\n    });\r\n  }\r\n\r\n  function hidePanel(){\r\n    var E = panelEls();\r\n    if (revealObs){ revealObs.disconnect(); revealObs = null; }\r\n    E.panel.classList.remove(\"amp-open\", \"is-expanded\", \"is-fiche\");\r\n    E.panel.setAttribute(\"aria-hidden\", \"true\");\r\n    E.panel.inert = true;\r\n    clearSelection();\r\n    currentTerritory = null;\r\n    currentListCtx = null;\r\n    bandeauDeVue();\r\n  }\r\n  \/\/ \u2550\u2550 17. CONTR\u00d4LES DU RAIL GAUCHE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  function setupControls(){\r\n    document.querySelectorAll(\"#amp-map .amp-chip\").forEach(function(btn){\r\n      btn.addEventListener(\"click\", function(){\r\n        var v = btn.getAttribute(\"data-view\");\r\n        if (v === \"reset\"){\r\n          hidePanel();\r\n          syncChips(\"all\");\r\n          resetZoom();\r\n          return;\r\n        }\r\n        syncChips(v);\r\n        if (v === \"all\"){\r\n          hidePanel();\r\n          resetZoom();\r\n        } else if (v === \"marseille\"){\r\n          hidePanel();\r\n          if (features.arrs.length > 0){\r\n            zoomTo(features.arrs, 30);\r\n          }\r\n        } else if (v === \"multi\"){\r\n          showPanel(null, true);\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  function syncChips(v){\r\n    currentView = v;\r\n    document.querySelectorAll(\"#amp-map .amp-chip\").forEach(function(b){\r\n      if (b.getAttribute(\"data-view\") === \"reset\") return;\r\n      var on = b.getAttribute(\"data-view\") === v;\r\n      b.classList.toggle(\"amp-on\", on);\r\n      b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\r\n    });\r\n    bandeauDeVue();\r\n  }\r\n\r\n  \/\/ Le bandeau reprend le titre de la vue courante d\u00e8s qu'on referme un\r\n  \/\/ territoire : on ne se retrouve jamais devant un intitul\u00e9 p\u00e9rim\u00e9.\r\n  function bandeauDeVue(){\r\n    if (currentView === \"marseille\"){\r\n      var dansMarseille = [];\r\n      ARR_NUMS.forEach(function(n){\r\n        (byArr[n] || []).forEach(function(pr){\r\n          if (dansMarseille.indexOf(pr) === -1) dansMarseille.push(pr);\r\n        });\r\n      });\r\n      majBandeau(\"Marseille, par arrondissement\",\r\n        dansMarseille.length + \" projets \u00b7 16 arrondissements\");\r\n    } else if (currentView === \"multi\"){\r\n      majBandeau(\"Projets multisites\", (VILLE.length + MULTI.length) + \" projets\");\r\n    } else {\r\n      majBandeau(\"Carte territoriale\");\r\n    }\r\n  }\r\n\r\n  \/\/ \u2550\u2550 18. COMPTEURS & L\u00c9GENDE DU RAIL \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  \/\/ Deux nombres pos\u00e9s sur un filet, leur l\u00e9gende en micro-capitale : la m\u00eame\r\n  \/\/ unit\u00e9 de mesure que les compteurs de la roue d'impact.\r\n  function renderRailStats(){\r\n    var statEl = document.getElementById(\"amp-stat\");\r\n    if (!statEl) return;\r\n    var totalProjets = PROJETS.length;\r\n    var localises = totalProjets - MULTI.length;\r\n    var communesCount = Object.keys(byCommune).length;\r\n    var arrsCount = ARR_NUMS.filter(function(n){ return (byArr[n] || []).length > 0; }).length;\r\n    var fisTotal = PROJETS.reduce(function(a, p){ return a + (p.fisNum || 0); }, 0);\r\n    var multi = VILLE.length + MULTI.length;\r\n\r\n    var chipAll = document.getElementById(\"chip-count-all\");\r\n    if (chipAll) chipAll.textContent = totalProjets;\r\n    var chipMulti = document.getElementById(\"chip-count-multi\");\r\n    if (chipMulti) chipMulti.textContent = multi;\r\n\r\n    \/\/ Deux nombres, pas six : le reste est d\u00e9j\u00e0 \u00e9crit sur les boutons de vue\r\n    \/\/ et dans le bandeau de la carte. Un compteur qui r\u00e9p\u00e8te n'informe pas.\r\n    statEl.innerHTML =\r\n      '<div class=\"amp-kpi\">'\r\n      +   '<div class=\"amp-kpi-val\">' + totalProjets + '<\/div>'\r\n      +   '<span class=\"amp-kpi-lab\">Projets soutenus<\/span>'\r\n      + '<\/div>'\r\n      + '<div class=\"amp-kpi\">'\r\n      +   '<div class=\"amp-kpi-val\">' + esc(fmtEuroCourt(fisTotal)) + '<\/div>'\r\n      +   '<span class=\"amp-kpi-lab\">FIS engag\u00e9<\/span>'\r\n      + '<\/div>';\r\n  }\r\n\r\n  function renderRailLegend(){\r\n    var legEl = document.getElementById(\"amp-legend\");\r\n    if (!legEl) return;\r\n    \/\/ Les communes de chaque secteur passent en infobulle : la l\u00e9gende dit\r\n    \/\/ quelles teintes existent, pas l'annuaire de la m\u00e9tropole.\r\n    legEl.innerHTML =\r\n      '<span class=\"amp-legend-title\">Secteurs Politique de la Ville<\/span>'\r\n      + SECTEURS.map(function(sec){\r\n        return '<span class=\"amp-leg\" title=\"' + esc(sec.sub) + '\">'\r\n          + '<i style=\"background:' + hexToRgba(sec.color, .55) + '\"><\/i>' + esc(sec.label) + '<\/span>';\r\n      }).join('')\r\n      + '<span class=\"amp-leg\"><i style=\"background:' + NODATA + '\"><\/i>Hors p\u00e9rim\u00e8tre<\/span>'\r\n      + '<p class=\"amp-legend-note\">Contours officiels &middot; grille FIS 2025 lue en direct.<\/p>';\r\n  }\r\n\r\n  \/\/ \u2550\u2550 19. REDIMENSIONNEMENT FLUIDE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  function debounce(fn, ms){\r\n    var t; return function(){ clearTimeout(t); t = setTimeout(fn, ms); };\r\n  }\r\n\r\n  window.addEventListener(\"resize\", debounce(function(){\r\n    var stage = document.getElementById(\"amp-stage\");\r\n    if (!stage) return;\r\n    W = stage.clientWidth;\r\n    H = stage.clientHeight;\r\n    if (svg) svg.attr(\"viewBox\", \"0 0 \" + W + \" \" + H);\r\n    if (!features.communes.length) return;\r\n    var all = allFeatures();\r\n    projection.fitExtent([[30, 20], [W - 30, H - 20]], { type: \"FeatureCollection\", features: all });\r\n    gCommunes.selectAll(\"path.amp-commune\").attr(\"d\", gpath);\r\n    if (features.arrs.length > 0){\r\n      gMarseilleBoundary.selectAll(\"path.amp-marseille-boundary\").attr(\"d\", gpath);\r\n    }\r\n    drawBubbles();\r\n    drawLabels();\r\n    if (currentView === \"marseille\" && features.arrs.length > 0){\r\n      zoomTo(features.arrs, 30);\r\n    } else if (selected){\r\n      zoomTo([selected], 40);\r\n    } else {\r\n      resetZoom();\r\n    }\r\n  }, 180));\r\n\r\n  \/\/ La carte ne se charge qu'\u00e0 la premi\u00e8re ouverture de son onglet : deux\r\n  \/\/ appels r\u00e9seau et un trac\u00e9 complet n'ont pas \u00e0 s'ex\u00e9cuter pour quelqu'un\r\n  \/\/ qui ne quittera jamais la roue.\r\n  var demarree = false;\r\n  window.__ampCarteBoot = function(){\r\n    if (demarree) return;\r\n    demarree = true;\r\n    boot();\r\n  };\r\n\r\n})();\r\n\r\n  \/\/ \u2550\u2550 20. PLEIN \u00c9CRAN \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  \/\/ Le cadre qui porte la carte passe en plein \u00e9cran navigateur. Rien \u00e0\r\n  \/\/ charger, aucune adresse \u00e0 raccorder : c'est la m\u00eame carte, plus grande.\r\n  \/\/ Le cadre entier, pas le seul panneau : la bascule entre la carte\r\n  \/\/ territoriale et la carte en relief reste ainsi \u00e0 port\u00e9e en plein \u00e9cran.\r\n  (function(){\r\n    var btn = document.getElementById(\"amp-full-btn\");\r\n    if (!btn) return;\r\n    var cible = document.getElementById(\"chart-container\") || document.getElementById(\"carte\") || document.getElementById(\"amp-map\");\r\n    btn.addEventListener(\"click\", function(){\r\n      \/\/ Certains cadres refusent le plein \u00e9cran (politique de permissions) :\r\n      \/\/ la promesse rejet\u00e9e ne doit pas remonter en erreur de page.\r\n      var p;\r\n      if (document.fullscreenElement) p = document.exitFullscreen();\r\n      else if (cible.requestFullscreen) p = cible.requestFullscreen();\r\n      if (p && p.catch) p.catch(function(){});\r\n    });\r\n    document.addEventListener(\"fullscreenchange\", function(){\r\n      var plein = !!document.fullscreenElement;\r\n      btn.setAttribute(\"aria-pressed\", plein ? \"true\" : \"false\");\r\n      btn.title = plein ? \"Quitter le plein \u00e9cran\" : \"Afficher la carte en plein \u00e9cran\";\r\n      \/\/ Le cadre a chang\u00e9 de taille : la projection doit se refaire.\r\n      window.dispatchEvent(new Event(\"resize\"));\r\n    });\r\n  })();\r\n\r\n  \/\/ \u2550\u2550 21. LA CARTE EN RELIEF \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n  \/\/ La seconde carte de l'onglet : les m\u00eames projets du fonds que la carte\r\n  \/\/ territoriale, racont\u00e9s en cinq \u00e9tapes, d'apr\u00e8s la maquette \u00ab Carte\r\n  \/\/ associations - Pr\u00e9sentation \u00bb. La m\u00e9tropole est couch\u00e9e comme une dalle ;\r\n  \/\/ un pic se dresse sur chaque commune ou arrondissement qui compte au moins\r\n  \/\/ un projet. Sa hauteur dit le nombre de projets, sa teinte le conseil de\r\n  \/\/ territoire.\r\n  \/\/ Contours et projets viennent de la carte territoriale (window.__ampContours,\r\n  \/\/ window.__ampProjets) : un seul chargement, les m\u00eames chiffres.\r\n  \/\/ La maquette faisait d\u00e9filer son grand chiffre et suivre ses libell\u00e9s\r\n  \/\/ pendant les mouvements. Ici, comme partout dans la page, la carte bouge\r\n  \/\/ muette ; ses libell\u00e9s se posent ensuite, en fondu, l'un apr\u00e8s l'autre.\r\n  (function(){\r\n    \"use strict\";\r\n    if (window.__ampReliefLoaded) return;\r\n    window.__ampReliefLoaded = true;\r\n\r\n    var racine = document.getElementById(\"amp-relief\");\r\n    var bascule = document.getElementById(\"carte-modes\");\r\n    var carteFonds = document.getElementById(\"amp-map\");\r\n    if (!racine || !bascule || !window.d3) return;\r\n    var d3 = window.d3;\r\n\r\n    \/\/ \u2500\u2500 Les donn\u00e9es : celles de la carte territoriale \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    \/\/ Les projets du fonds, lus et rang\u00e9s par lieu par la carte territoriale\r\n    \/\/ (window.__ampProjets, section 10) : les deux cartes de l'onglet disent\r\n    \/\/ toujours les m\u00eames chiffres.\r\n\r\n    \/\/ Les six conseils de territoire, dans l'ordre de la l\u00e9gende.\r\n    var CT = [\r\n      { id: \"mp\",  nom: \"Marseille Provence\",            court: \"Marseille Provence\",    teinte: \"#4F5D99\" },\r\n      { id: \"aix\", nom: \"Pays d\u2019Aix\",                    court: \"Pays d\u2019Aix\",            teinte: \"#9C4F81\" },\r\n      { id: \"mar\", nom: \"Pays de Martigues\",             court: \"Pays de Martigues\",     teinte: \"#3F7C61\" },\r\n      { id: \"sal\", nom: \"Pays Salonais\",                 court: \"Pays Salonais\",         teinte: \"#C08A1E\" },\r\n      { id: \"aub\", nom: \"Pays d\u2019Aubagne et de l\u2019\u00c9toile\", court: \"Pays d\u2019Aubagne\",        teinte: \"#4E8497\" },\r\n      { id: \"ist\", nom: \"Istres-Ouest Provence\",         court: \"Istres-Ouest Provence\", teinte: \"#B0582A\" }\r\n    ];\r\n    \/\/ Rattachement officiel des communes (code INSEE). Les arrondissements de\r\n    \/\/ Marseille rel\u00e8vent de Marseille Provence ; une commune absente de ces\r\n    \/\/ listes, du Pays d'Aix (Pertuis compris). La maquette oubliait Rognac et\r\n    \/\/ Velaux, du Pays Salonais.\r\n    var CT_COMMUNES = {\r\n      mp:  [\"13002\", \"13119\", \"13021\", \"13022\", \"13023\", \"13026\", \"13033\", \"13042\", \"13043\",\r\n            \"13028\", \"13088\", \"13054\", \"13075\", \"13085\", \"13102\", \"13104\", \"13106\"],\r\n      mar: [\"13056\", \"13077\", \"13098\"],\r\n      sal: [\"13003\", \"13008\", \"13009\", \"13014\", \"13024\", \"13035\", \"13037\", \"13049\", \"13051\",\r\n            \"13053\", \"13069\", \"13081\", \"13092\", \"13103\", \"13105\", \"13112\", \"13115\"],\r\n      aub: [\"13005\", \"13007\", \"13013\", \"13016\", \"13020\", \"13030\", \"13031\", \"13070\", \"13073\",\r\n            \"13086\", \"13101\", \"83120\"],\r\n      ist: [\"13029\", \"13039\", \"13044\", \"13047\", \"13063\", \"13078\"]\r\n    };\r\n\r\n    \/\/ Les cinq \u00e9tapes. cadre : ce que la vue embrasse ; sol : les communes en\r\n    \/\/ pleine teinte ; actif : les pics mis en avant ; noms : ceux dont on \u00e9crit\r\n    \/\/ le nom ; grappe : Marseille r\u00e9sum\u00e9e en un seul libell\u00e9. Les phrases se\r\n    \/\/ composent sur les chiffres du jour (redige, plus bas) ; les pr\u00e9dicats\r\n    \/\/ sont d\u00e9clar\u00e9s juste en dessous (fonctions hiss\u00e9es).\r\n    var ETAPES = [\r\n      { kick: \"Vue d\u2019ensemble\", cadre: tout, sol: tout, actif: tout, noms: horsMDeuxEtPlus, grappe: true },\r\n      { kick: \"Marseille\", cadre: estM, sol: estM, actif: estM, noms: estM },\r\n      { kick: \"Marseille\", cadre: estM, sol: estM, actif: enTete, noms: estM },\r\n      { kick: \"Hors Marseille\", cadre: tout, sol: horsM, actif: horsM, noms: horsM, grappe: true },\r\n      { kick: \"Conseils de territoire\", liste: true, cadre: tout, sol: duCT, actif: duCT, noms: horsMDeuxEtPlus, grappe: true }\r\n    ];\r\n    function tout(){ return true; }\r\n    function estM(d){ return d.isM; }\r\n    function horsM(d){ return !d.isM; }\r\n    function horsMDeuxEtPlus(d){ return !d.isM && d.n >= 2; }\r\n    function enTete(d){ return d.isM && S.tete.indexOf(d) > -1; }\r\n    \/\/ Un conseil survol\u00e9 dans la liste : les autres passent en retrait.\r\n    function duCT(d, hl){ return !hl || d.ct === hl; }\r\n\r\n    var TILT = .56;   \/\/ pente de la dalle (1 : vue d'avion)\r\n    var REDUIT = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n    var S = null;     \/\/ les chiffres du jour (prepare)\r\n\r\n    var el = {\r\n      svg: document.getElementById(\"aa-svg\"),\r\n      col: racine.querySelector(\".aa-col\"),\r\n      etape: document.getElementById(\"aa-etape\"),\r\n      num: document.getElementById(\"aa-num\"),\r\n      kick: document.getElementById(\"aa-kick\"),\r\n      big: document.getElementById(\"aa-big\"),\r\n      unit: document.getElementById(\"aa-unit\"),\r\n      titre: document.getElementById(\"aa-titre\"),\r\n      corps: document.getElementById(\"aa-corps\"),\r\n      liste: document.getElementById(\"aa-liste\"),\r\n      points: document.getElementById(\"aa-points\"),\r\n      source: racine.querySelector(\".aa-source\"),\r\n      legende: document.getElementById(\"aa-legende\"),\r\n      glyphe: document.getElementById(\"aa-leg-glyphe\"),\r\n      grille: document.getElementById(\"aa-leg-grille\"),\r\n      tip: document.getElementById(\"aa-tip\"),\r\n      attente: document.getElementById(\"aa-attente\")\r\n    };\r\n\r\n    var feats = null, pics = [];\r\n    var cur = 0, survol = null, hlCT = null;\r\n    var vue = null, anim = null, enIntro = false, croissance = null, introAFaire = false;\r\n    var dims = { W: 0, H: 0, u: .6, etroit: false, haut: 0, box: [0, 0, 1, 1], obstacles: [], sig: \"\" };\r\n    var gRoot = null, gSocle, gSol, gOmbres, gPics, gLibelles;\r\n\r\n    function ajoute(a, d){ return a + d.n; }\r\n    function ordinal(n){ return n === 1 ? \"1er\" : n + \"e\"; }\r\n    function listeFr(t){ return t.length > 1 ? t.slice(0, -1).join(\", \") + \" et \" + t[t.length - 1] : (t[0] || \"\"); }\r\n    function projets(n){ return n + \" projet\" + (n > 1 ? \"s\" : \"\"); }\r\n    function pc(n, sur){ return Math.round(n \/ Math.max(1, sur) * 100) + \"\u00a0%\"; }\r\n    function borne(x){ return Math.max(0, Math.min(1, x)); }\r\n    function cle(d){ return d.cle; }\r\n    function deux(n){ return String(n).padStart(2, \"0\"); }\r\n    function esc(v){ return String(v == null ? \"\" : v).replace(\/&\/g, \"&amp;\").replace(\/<\/g, \"&lt;\").replace(\/>\/g, \"&gt;\").replace(\/\"\/g, \"&quot;\"); }\r\n    \/\/ La cl\u00e9 des communes : le nom sans accents ni ponctuation.\r\n    function norm(s){ return String(s || \"\").normalize(\"NFD\").replace(\/[\u0300-\u036f]\/g, \"\").toLowerCase().replace(\/[^a-z0-9]+\/g, \" \").trim(); }\r\n\r\n    \/\/ Une horloge qui avance m\u00eame quand requestAnimationFrame s'endort : le\r\n    \/\/ relais de setTimeout garde le fil, et une image n'est jamais jou\u00e9e deux\r\n    \/\/ fois.\r\n    function horloge(fn){\r\n      var t0 = performance.now(), vivant = true, id = 0;\r\n      function image(n){ if (!vivant || n !== id) return; id++; fn(performance.now() - t0); if (vivant) suite(); }\r\n      function suite(){ var n = id; requestAnimationFrame(function(){ image(n); }); setTimeout(function(){ image(n); }, 40); }\r\n      suite();\r\n      return { stop: function(){ vivant = false; } };\r\n    }\r\n    \/\/ Arr\u00eate le mouvement en cours et rend la sc\u00e8ne enti\u00e8re : pics \u00e0 pleine\r\n    \/\/ hauteur, dalle opaque.\r\n    function arrete(){\r\n      if (anim){ anim.stop(); anim = null; }\r\n      enIntro = false;\r\n      croissance = null;\r\n      if (gRoot) gRoot.style(\"opacity\", 1);\r\n    }\r\n\r\n    \/\/ \u2500\u2500 Pr\u00e9parer les trac\u00e9s \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    \/\/ Une seule projection, dans un carr\u00e9 de 1000 : chaque vue n'est ensuite\r\n    \/\/ qu'une translation et une \u00e9chelle, \u00e9cras\u00e9e en hauteur par la pente.\r\n    \/\/ Deux niveaux : les trac\u00e9s du sol (communes, arrondissements) et les lieux\r\n    \/\/ qui portent un pic, ici les m\u00eames : un pic par commune ou arrondissement.\r\n    \/\/ Les projets y sont rang\u00e9s comme sur la carte territoriale (byCommune,\r\n    \/\/ byArr) ; un projet sur deux arrondissements compte dans chacun.\r\n    function prepare(contours, donnees){\r\n      var cleDe = donnees.cle, parArr = donnees.parArr || {}, parCommune = donnees.parCommune || {};\r\n      var ville = donnees.ville || [], ctDe = {}, rang = {}, sol = [], lieux = [];\r\n      Object.keys(CT_COMMUNES).forEach(function(id){\r\n        CT_COMMUNES[id].forEach(function(code){ ctDe[code] = id; });\r\n      });\r\n      CT.forEach(function(c, i){ rang[c.id] = i; });\r\n      function valide(f){ return f && f.geometry && \/Polygon\/.test(f.geometry.type); }\r\n      function pose(f, L){ L.f = f; lieux.push(L); sol.push({ f: f, id: L.cle, isM: L.isM, lieu: L }); }\r\n      (contours.communes || []).forEach(function(f){\r\n        if (!valide(f)) return;\r\n        var p = f.properties || {}, liste = parCommune[cleDe(p.nom)] || [];\r\n        pose(f, { cle: norm(p.nom), isM: false, arr: 0, nom: p.nom, court: p.nom,\r\n          ct: ctDe[p.code] || \"aix\", n: liste.length, projets: liste });\r\n      });\r\n      (contours.arrs || []).forEach(function(f){\r\n        if (!valide(f)) return;\r\n        var a = +(f.properties || {}).num, liste = parArr[a] || [];\r\n        if (!(a >= 1 && a <= 16)) return;\r\n        pose(f, { cle: \"m\" + a, isM: true, arr: a, nom: \"Marseille \" + ordinal(a), court: ordinal(a),\r\n          ct: \"mp\", n: liste.length, projets: liste });\r\n      });\r\n      var chemin = d3.geoPath(d3.geoMercator().fitSize([1000, 1000],\r\n        { type: \"FeatureCollection\", features: sol.map(function(d){ return d.f; }) }));\r\n      sol.forEach(function(d){ d.d = chemin(d.f); d.b = chemin.bounds(d.f); });\r\n      lieux.forEach(function(L){\r\n        var c = chemin.centroid(L.f);\r\n        L.cx = c[0]; L.cy = c[1];\r\n        L.ci = rang[L.ct];\r\n        L.coul = CT[L.ci].teinte;\r\n        L.fond = L.n ? d3.interpolateRgb(\"#FFFFFF\", L.coul)(.3) : \"#EEEBE4\";\r\n        delete L.f;\r\n      });\r\n      feats = sol;\r\n      \/\/ Les pics poussent d'ouest en est.\r\n      pics = lieux.filter(function(L){ return L.n > 0; }).sort(function(a, b){ return a.cx - b.cx; });\r\n      pics.forEach(function(L, i){ L.rang = i; });\r\n\r\n      \/\/ Les chiffres, dont les phrases des \u00e9tapes se nourrissent. Un projet\r\n      \/\/ pr\u00e9sent en plusieurs lieux ne compte qu'une fois dans un total.\r\n      function distincts(ls, plus){\r\n        var s = new Set(plus || []);\r\n        ls.forEach(function(L){ L.projets.forEach(function(p){ s.add(p); }); });\r\n        return s.size;\r\n      }\r\n      var communes = pics.filter(horsM).sort(function(a, b){ return b.n - a.n || a.nom.localeCompare(b.nom, \"fr\"); });\r\n      var arrs = pics.filter(estM).sort(function(a, b){ return b.n - a.n || a.arr - b.arr; });\r\n      var totalM = distincts(arrs, ville), parCT = {};\r\n      CT.forEach(function(c){\r\n        parCT[c.id] = distincts(pics.filter(function(L){ return L.ct === c.id; }), c.id === \"mp\" ? ville : null);\r\n      });\r\n      var presents = CT.filter(function(c){ return parCT[c.id] > 0; });\r\n      \/\/ Du nord au sud, Marseille compte pour une seule commune.\r\n      var villes = communes.slice();\r\n      if (totalM) villes.push({ nom: \"Marseille\", cy: d3.mean(lieux.filter(estM), function(L){ return L.cy; }) });\r\n      var nord = d3.least(villes, function(v){ return v.cy; }), sud = d3.greatest(villes, function(v){ return v.cy; });\r\n      S = {\r\n        total: (donnees.projets || []).length, totalM: totalM, horsM: distincts(communes),\r\n        ville: ville.length, multi: (donnees.multi || []).length,\r\n        communes: communes, arrs: arrs, tete: arrs.slice(0, 3), teteN: distincts(arrs.slice(0, 3)),\r\n        nbCommunes: villes.length, nord: nord ? nord.nom : \"\", sud: sud ? sud.nom : \"\",\r\n        parCT: parCT, ctPresents: presents.length,\r\n        minCT: d3.min(presents, function(c){ return parCT[c.id]; }) || 0,\r\n        ctAbsents: CT.filter(function(c){ return !parCT[c.id]; }).map(function(c){ return c.nom; }),\r\n        \/\/ Hauteur d'un projet, en unit\u00e9s de maquette : le plus haut pic ne\r\n        \/\/ d\u00e9passe jamais 240 (six unit\u00e9s \u00e0 l'\u00e9chelle de la maquette).\r\n        unite: 240 \/ Math.max(6, d3.max(pics, function(L){ return L.n; }) || 1)\r\n      };\r\n      redige();\r\n    }\r\n\r\n    \/\/ Les phrases des cinq \u00e9tapes, compos\u00e9es sur les chiffres de la grille.\r\n    function redige(){\r\n      var e = ETAPES, tous = S.ctPresents === CT.length;\r\n      e[0].big = S.total;\r\n      e[0].unit = \"projets soutenus\";\r\n      e[0].titre = tous ? \"Un fonds pr\u00e9sent dans toute la M\u00e9tropole\"\r\n        : \"Des projets dans \" + S.ctPresents + \" conseils de territoire sur \" + CT.length;\r\n      e[0].corps = (S.nbCommunes > 1 ? S.nbCommunes + \" communes concern\u00e9es, de \" + S.nord + \" au nord jusqu\u2019\u00e0 \" + S.sud + \". \" : \"\")\r\n        + \"Chaque pic mesure le nombre de projets\"\r\n        + (S.multi ? \"\u00a0; \" + projets(S.multi) + (S.multi > 1 ? \" multisites n\u2019y figurent pas.\" : \" multisite n\u2019y figure pas.\") : \".\");\r\n\r\n      e[1].big = S.totalM;\r\n      e[1].unit = \"projets \u00e0 Marseille\";\r\n      e[1].titre = \"Marseille concentre \" + pc(S.totalM, S.total) + \" des projets\";\r\n      e[1].corps = \"Des projets dans \" + S.arrs.length + \" des 16 arrondissements\"\r\n        + (S.ville ? \", et \" + projets(S.ville) + \" \u00e0 l\u2019\u00e9chelle de toute la ville\" : \"\") + \".\";\r\n\r\n      var t = S.tete, k = t.length;\r\n      e[2].big = S.teteN;\r\n      e[2].unit = \"projets dans \" + (k ? listeFr(t.map(function(L){ return \"le \" + L.court; })) : \"aucun arrondissement\");\r\n      e[2].titre = [\"Aucun arrondissement en t\u00eate\", \"Un arrondissement rassemble \", \"Deux arrondissements rassemblent \", \"Trois arrondissements rassemblent \"][k]\r\n        + (k ? pc(S.teteN, S.totalM) + \" des projets marseillais\" : \"\");\r\n      e[2].corps = t.map(function(L, i){\r\n        return i === 0 ? \"Le \" + L.court + \" arrondissement compte \" + projets(L.n)\r\n          : \"le \" + L.court + (i === 1 ? \" en compte \" : \" \") + L.n;\r\n      }).join(\", \") + (k > 1 ? \"\u00a0: \" + pc(S.teteN, S.total) + \" du total \u00e0 eux \" + (k === 2 ? \"deux\" : \"trois\") + \".\" : k ? \".\" : \"\");\r\n\r\n      var c = S.communes, max = c.length ? c[0].n : 0, min = c.length ? c[c.length - 1].n : 0;\r\n      var tete = c.filter(function(L){ return L.n === max; }).map(function(L){ return L.nom; });\r\n      e[3].big = S.horsM;\r\n      e[3].unit = \"projets hors Marseille\";\r\n      e[3].titre = c.length > 1 ? \"Un maillage de \" + c.length + \" communes\" : c.length ? \"Une commune hors Marseille\" : \"Aucun projet hors Marseille\";\r\n      e[3].corps = c.length > 1\r\n        ? (min === max ? \"Chacune compte \" + projets(max) + \". \" : \"Chacune compte de \" + min + \" \u00e0 \" + max + \" projets. \")\r\n          + listeFr(tete) + (tete.length > 1 ? \" arrivent\" : \" arrive\") + \" en t\u00eate avec \" + projets(max) + (tete.length > 1 ? \" chacune.\" : \".\")\r\n        : c.length ? c[0].nom + \" compte \" + projets(max) + \".\" : \"Tous les projets localis\u00e9s sont marseillais.\";\r\n\r\n      e[4].big = S.ctPresents;\r\n      e[4].unit = tous ? \"conseils de territoire, tous repr\u00e9sent\u00e9s\" : \"conseils de territoire repr\u00e9sent\u00e9s sur \" + CT.length;\r\n      e[4].titre = tous ? \"Au moins \" + projets(S.minCT) + \" dans chacun\" : \"Encore aucun projet\u00a0: \" + listeFr(S.ctAbsents);\r\n    }\r\n\r\n    \/\/ \u2500\u2500 Construire la sc\u00e8ne \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    function construit(){\r\n      var svg = d3.select(el.svg);\r\n      svg.selectAll(\"*\").remove();\r\n      var defs = svg.append(\"defs\");\r\n      function degrade(id, haut, bas){\r\n        var g = defs.append(\"linearGradient\").attr(\"id\", id)\r\n          .attr(\"x1\", 0).attr(\"y1\", 0).attr(\"x2\", 0).attr(\"y2\", 1);\r\n        g.append(\"stop\").attr(\"offset\", 0).attr(\"stop-color\", haut);\r\n        g.append(\"stop\").attr(\"offset\", 1).attr(\"stop-color\", bas);\r\n      }\r\n      \/\/ Deux faces par pic, une claire, une sombre, et leur version survol\u00e9e.\r\n      CT.forEach(function(c, i){\r\n        var clair = d3.interpolateRgb(\"#FFFFFF\", c.teinte), sombre = d3.interpolateRgb(c.teinte, \"#1A1714\");\r\n        degrade(\"aa-sL\" + i, clair(.3), clair(.78));\r\n        degrade(\"aa-sR\" + i, clair(.85), sombre(.28));\r\n        degrade(\"aa-hL\" + i, clair(.55), c.teinte);\r\n        degrade(\"aa-hR\" + i, c.teinte, sombre(.5));\r\n      });\r\n      var ombre = defs.append(\"radialGradient\").attr(\"id\", \"aa-ombre\");\r\n      ombre.append(\"stop\").attr(\"offset\", 0).attr(\"stop-color\", \"#1A1714\").attr(\"stop-opacity\", .22);\r\n      ombre.append(\"stop\").attr(\"offset\", 1).attr(\"stop-color\", \"#1A1714\").attr(\"stop-opacity\", 0);\r\n\r\n      gRoot = svg.append(\"g\").style(\"opacity\", 0);\r\n      \/\/ Le socle : la m\u00eame carte en gr\u00e8ge, d\u00e9cal\u00e9e vers le bas, fait l'\u00e9paisseur.\r\n      gSocle = gRoot.append(\"g\");\r\n      gSocle.selectAll(\"path\").data(feats).join(\"path\")\r\n        .attr(\"d\", function(d){ return d.d; })\r\n        .attr(\"fill\", \"#DCD7CC\").attr(\"stroke\", \"#DCD7CC\").attr(\"stroke-width\", 2)\r\n        .attr(\"vector-effect\", \"non-scaling-stroke\");\r\n      gSol = gRoot.append(\"g\");\r\n      gSol.selectAll(\"path\").data(feats, function(d){ return d.id; }).join(\"path\")\r\n        .attr(\"d\", function(d){ return d.d; })\r\n        .attr(\"fill\", function(d){ return d.lieu.fond; })\r\n        .attr(\"stroke\", \"#FFFFFF\").attr(\"stroke-width\", 1.2)\r\n        .attr(\"vector-effect\", \"non-scaling-stroke\")\r\n        .style(\"transition\", \"opacity .6s\")\r\n        .style(\"cursor\", function(d){ return d.lieu.n ? \"pointer\" : \"default\"; })\r\n        .on(\"mouseenter\", function(e, d){ survole(e, d.lieu); })\r\n        .on(\"mousemove\", function(e){ placeInfobulle(e); })\r\n        .on(\"mouseleave\", function(){ survole(null, null); })\r\n        .on(\"click\", function(e, d){ clic(d.lieu); });\r\n      gOmbres = gRoot.append(\"g\").style(\"pointer-events\", \"none\");\r\n      gPics = gRoot.append(\"g\");\r\n      gLibelles = gRoot.append(\"g\").style(\"pointer-events\", \"none\");\r\n    }\r\n\r\n    \/\/ \u2500\u2500 Mesurer le cadre \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    \/\/ En large, la maquette enti\u00e8re tient dans le cadre ; en \u00e9troit ou en\r\n    \/\/ hauteur, la carte passe au-dessus du r\u00e9cit et l'unit\u00e9 suit la largeur.\r\n    \/\/ La bo\u00eete o\u00f9 chaque vue se cale \u00e9vite le r\u00e9cit et la l\u00e9gende, et garde\r\n    \/\/ au-dessus d'elle la place des pics. Rend \u00ab cache \u00bb, \u00ab meme \u00bb ou \u00ab change \u00bb.\r\n    function mesure(){\r\n      var W = racine.clientWidth, H = racine.clientHeight;\r\n      if (!W || !H) return \"cache\";\r\n      var etroit = W < 720 || W < H * 1.15;\r\n      var u = etroit ? Math.max(.34, Math.min(.62, W \/ 1000)) : Math.min(W \/ 1920, H \/ 1080);\r\n      var haut = etroit ? Math.round(Math.max(220, Math.min(H * .46, 480))) : 0;\r\n      racine.classList.toggle(\"is-etroit\", etroit);\r\n      racine.style.setProperty(\"--u\", u.toFixed(4) + \"px\");\r\n      racine.style.setProperty(\"--aa-haut\", haut + \"px\");\r\n      d3.select(el.svg).attr(\"width\", W).attr(\"height\", H).attr(\"viewBox\", \"0 0 \" + W + \" \" + H);\r\n      var r0 = racine.getBoundingClientRect();\r\n      function rel(n, marge){\r\n        var r = n.getBoundingClientRect(), m = marge || 0;\r\n        return { x0: r.left - r0.left - m, y0: r.top - r0.top - m, x1: r.right - r0.left + m, y1: r.bottom - r0.top + m };\r\n      }\r\n      var box, obstacles;\r\n      if (etroit){\r\n        box = [14, Math.min(haut * .42, 220 * u + 44), W - 14, haut - 16];\r\n        obstacles = [{ x0: -1e4, x1: 1e4, y0: haut, y1: 1e4 }];\r\n      } else {\r\n        var col = rel(el.col), leg = rel(el.legende);\r\n        box = [col.x1 + 20 * u, 330 * u, W - 100 * u, Math.min(H - 290 * u, leg.y0 - 44 * u)];\r\n        obstacles = [{ x0: -1e4, x1: col.x1, y0: -1e4, y1: 1e4 }, rel(el.legende, 14 * u), rel(el.source, 8 * u)];\r\n      }\r\n      \/\/ Cadre tr\u00e8s bas : la bo\u00eete garde une hauteur lisible.\r\n      if (box[3] - box[1] < 80) box[1] = Math.max(0, box[3] - 80);\r\n      var sig = [W, H].concat(box.map(Math.round)).join(\",\");\r\n      var etat = sig === dims.sig ? \"meme\" : \"change\";\r\n      dims = { W: W, H: H, u: u, etroit: etroit, haut: haut, box: box, obstacles: obstacles, sig: sig };\r\n      return etat;\r\n    }\r\n\r\n    \/\/ La vue d'une \u00e9tape : le cadre de ses communes, cal\u00e9 dans la bo\u00eete.\r\n    function vueDe(n, tilt){\r\n      var st = ETAPES[n], x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\r\n      feats.forEach(function(d){\r\n        if (!st.cadre(d)) return;\r\n        x0 = Math.min(x0, d.b[0][0]); y0 = Math.min(y0, d.b[0][1]);\r\n        x1 = Math.max(x1, d.b[1][0]); y1 = Math.max(y1, d.b[1][1]);\r\n      });\r\n      var B = dims.box;\r\n      var k = Math.min((B[2] - B[0]) \/ (x1 - x0), (B[3] - B[1]) \/ ((y1 - y0) * tilt)) * .97;\r\n      return { k: k, tx: (B[0] + B[2]) \/ 2 - k * (x0 + x1) \/ 2, ty: (B[1] + B[3]) \/ 2 - k * tilt * (y0 + y1) \/ 2, tilt: tilt };\r\n    }\r\n\r\n    \/\/ \u2500\u2500 Dessiner : la dalle, les ombres, les pics \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    function dessine(){\r\n      if (!gRoot || !vue) return;\r\n      var v = vue, st = ETAPES[cur], u = dims.u;\r\n      \/\/ 0 \u00e0 plat, 1 \u00e0 la pente finale : l'\u00e9paisseur du socle et le chant des\r\n      \/\/ pics naissent avec l'inclinaison.\r\n      var persp = borne((1 - v.tilt) \/ (1 - TILT));\r\n      var echelle = \" scale(\" + v.k + \",\" + v.k * v.tilt + \")\";\r\n      gSol.attr(\"transform\", \"translate(\" + v.tx + \",\" + v.ty + \")\" + echelle);\r\n      gSocle.attr(\"transform\", \"translate(\" + v.tx + \",\" + (v.ty + 14 * u * persp) + \")\" + echelle);\r\n      var U = S.unite * u, w = 12 * u, dep = 7 * u * persp;\r\n      pics.forEach(function(d){\r\n        d.sx = v.tx + v.k * d.cx;\r\n        d.sy = v.ty + v.k * v.tilt * d.cy;\r\n        d.g = croissance ? croissance(d) : 1;\r\n        d.h = d.n * U * d.g;\r\n        d.on = st.actif(d, hlCT);\r\n      });\r\n      \/\/ Du fond vers l'avant : un pic proche passe devant un pic lointain.\r\n      var ordre = pics.slice().sort(function(a, b){ return a.sy - b.sy; });\r\n      gOmbres.selectAll(\"ellipse\").data(ordre, cle).join(\"ellipse\")\r\n        .style(\"transition\", \"opacity .5s\")\r\n        .attr(\"fill\", \"url(#aa-ombre)\")\r\n        .attr(\"cx\", function(d){ return d.sx + 6 * u; })\r\n        .attr(\"cy\", function(d){ return d.sy + 2 * u; })\r\n        .attr(\"rx\", function(d){ return 24 * u * d.g; })\r\n        .attr(\"ry\", function(d){ return 24 * u * d.g * v.tilt; })\r\n        .style(\"opacity\", function(d){ return d.on ? 1 : .2; });\r\n      var g = gPics.selectAll(\"g.aa-pic\").data(ordre, cle).join(function(entree){\r\n        var g = entree.append(\"g\").attr(\"class\", \"aa-pic\")\r\n          .style(\"cursor\", \"pointer\").style(\"transition\", \"opacity .5s\");\r\n        g.append(\"path\").attr(\"class\", \"aa-pic-g\");\r\n        g.append(\"path\").attr(\"class\", \"aa-pic-d\");\r\n        g.on(\"mouseenter\", function(e, d){ survole(e, d); })\r\n          .on(\"mousemove\", function(e){ placeInfobulle(e); })\r\n          .on(\"mouseleave\", function(){ survole(null, null); })\r\n          .on(\"click\", function(e, d){ clic(d); });\r\n        return g;\r\n      }).order();\r\n      g.style(\"opacity\", function(d){ return d.on ? 1 : .18; });\r\n      g.select(\".aa-pic-g\")\r\n        .attr(\"d\", function(d){ return \"M\" + (d.sx - w) + \",\" + d.sy + \"L\" + d.sx + \",\" + (d.sy - d.h) + \"L\" + d.sx + \",\" + (d.sy + dep) + \"Z\"; })\r\n        .attr(\"fill\", function(d){ return \"url(#aa-\" + (d.cle === survol ? \"hL\" : \"sL\") + d.ci + \")\"; });\r\n      g.select(\".aa-pic-d\")\r\n        .attr(\"d\", function(d){ return \"M\" + d.sx + \",\" + (d.sy + dep) + \"L\" + d.sx + \",\" + (d.sy - d.h) + \"L\" + (d.sx + w) + \",\" + d.sy + \"Z\"; })\r\n        .attr(\"fill\", function(d){ return \"url(#aa-\" + (d.cle === survol ? \"hR\" : \"sR\") + d.ci + \")\"; });\r\n    }\r\n\r\n    \/\/ Le sol : pleine teinte pour les communes de l'\u00e9tape, les autres en\r\n    \/\/ retrait, un liser\u00e9 sombre sur la commune survol\u00e9e.\r\n    function majSol(){\r\n      if (!gSol) return;\r\n      var st = ETAPES[cur];\r\n      var p = gSol.selectAll(\"path\")\r\n        .style(\"opacity\", function(d){ return st.sol(d.lieu, hlCT) ? 1 : .38; })\r\n        .attr(\"stroke\", function(d){ return d.lieu.cle === survol ? \"#1A1714\" : \"#FFFFFF\"; })\r\n        .attr(\"stroke-width\", function(d){ return d.lieu.cle === survol ? 2 : 1.2; });\r\n      if (survol) p.filter(function(d){ return d.lieu.cle === survol; }).raise();\r\n    }\r\n\r\n    \/\/ \u2500\u2500 Les libell\u00e9s \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    \/\/ Le nombre au sommet du pic, le nom au-dessus ou \u00e0 c\u00f4t\u00e9 s'il trouve une\r\n    \/\/ place libre. Pris par ordre d'importance, chaque libell\u00e9 pos\u00e9 devient un\r\n    \/\/ obstacle pour les suivants. Les corps suivent l'\u00e9chelle, avec un\r\n    \/\/ plancher de lecture.\r\n    function typo(){\r\n      var u = dims.u, fN = Math.max(14, 30 * u), fM = Math.max(12, 22 * u);\r\n      return { u: u, fN: fN, fM: fM, sN: fN \/ 30, sM: fM \/ 22 };\r\n    }\r\n    function boiteGrappe(cx, ty, s){ return { x0: cx - 90 * s, x1: cx + 90 * s, y0: ty - 72 * s, y1: ty + 8 * s }; }\r\n    function calculeLibelles(){\r\n      var st = ETAPES[cur], t = typo(), u = t.u, sN = t.sN, sM = t.sM;\r\n      var P = 5 * u, boites = dims.obstacles.slice(), libs = [];\r\n      function heurte(b){\r\n        return boites.some(function(p){ return !(b.x1 + P < p.x0 || b.x0 - P > p.x1 || b.y1 + P < p.y0 || b.y0 - P > p.y1); });\r\n      }\r\n      \/\/ Dans les vues d'ensemble, Marseille tient en un libell\u00e9 pour ses\r\n      \/\/ arrondissements : sous la grappe, ou \u00e0 sa gauche si la place manque.\r\n      var M = pics.filter(estM);\r\n      if (M.length){\r\n        var cx = d3.mean(M, function(d){ return d.sx; });\r\n        var ty = d3.max(M, function(d){ return d.sy; }) + 84 * u;\r\n        if (heurte(boiteGrappe(cx, ty, sN))){\r\n          cx = d3.min(M, function(d){ return d.sx; }) - 110 * sN;\r\n          ty = d3.mean(M, function(d){ return d.sy; }) + 30 * u;\r\n        }\r\n        var op = st.grappe ? (M[0].on ? 1 : .4) : 0;\r\n        if (st.grappe) boites.push(boiteGrappe(cx, ty, sN));\r\n        libs.push({ cle: \"grappe\", grappe: true, n: S.totalM, nx: cx, ny: ty, nop: op, mop: op });\r\n      }\r\n      pics.slice().sort(function(a, b){ return (b.on - a.on) || (b.n - a.n) || (a.sy - b.sy); }).forEach(function(d){\r\n        var L = { cle: d.cle, texte: d.court, n: d.n, nx: d.sx, ny: d.sy - d.h - 12 * u, nop: 0, mop: 0, mx: d.sx, my: 0, ma: \"middle\" };\r\n        libs.push(L);\r\n        if (st.grappe && d.isM) return;\r\n        var nw = (String(d.n).length * 11 + 8) * sN;\r\n        var nb = { x0: d.sx - nw, x1: d.sx + nw, y0: L.ny - 26 * sN, y1: L.ny + 2 * sN };\r\n        if (heurte(nb)) return;\r\n        boites.push(nb);\r\n        L.nop = d.on ? 1 : .45;\r\n        if (!d.on || !st.noms(d)) return;\r\n        var tw = d.court.length * 12.5 * sM + 10 * u;\r\n        var ya = L.ny - 40 * sN, yc = L.ny - 3 * sN, xd = d.sx + nw + 12 * u, xg = d.sx - nw - 12 * u;\r\n        var places = [\r\n          [d.sx, ya, \"middle\", { x0: d.sx - tw \/ 2, x1: d.sx + tw \/ 2, y0: ya - 22 * sM, y1: ya + 3 * sM }],\r\n          [xd, yc, \"start\", { x0: xd, x1: xd + tw, y0: yc - 21 * sM, y1: yc + 5 * sM }],\r\n          [xg, yc, \"end\", { x0: xg - tw, x1: xg, y0: yc - 21 * sM, y1: yc + 5 * sM }]\r\n        ];\r\n        for (var i = 0; i < places.length; i++){\r\n          if (heurte(places[i][3])) continue;\r\n          boites.push(places[i][3]);\r\n          L.mx = places[i][0]; L.my = places[i][1]; L.ma = places[i][2]; L.mop = 1;\r\n          break;\r\n        }\r\n      });\r\n      return libs;\r\n    }\r\n    \/\/ fondu : l'arriv\u00e9e apr\u00e8s un mouvement, un libell\u00e9 apr\u00e8s l'autre, du plus\r\n    \/\/ parlant au plus discret, en moins d'une seconde. Sans fondu (survol de\r\n    \/\/ la liste, nouveau cadre), les libell\u00e9s se r\u00e8glent en place.\r\n    function poseLibelles(fondu){\r\n      if (!gLibelles) return;\r\n      var libs = calculeLibelles(), t = typo();\r\n      function halo(s){ s.attr(\"paint-order\", \"stroke\").attr(\"stroke\", \"#FFFFFF\").attr(\"stroke-linejoin\", \"round\"); }\r\n      var g = gLibelles.selectAll(\"g.aa-lib\").data(libs, cle).join(function(entree){\r\n        var g = entree.append(\"g\").attr(\"class\", \"aa-lib\");\r\n        g.append(\"text\").attr(\"class\", \"aa-lib-m\").call(halo).attr(\"fill\", \"rgba(26,23,20,.78)\").style(\"opacity\", 0);\r\n        g.append(\"text\").attr(\"class\", \"aa-lib-n\").call(halo).attr(\"fill\", \"#1A1714\").attr(\"text-anchor\", \"middle\").style(\"opacity\", 0);\r\n        return g;\r\n      });\r\n      var nums = g.select(\"text.aa-lib-n\")\r\n        .attr(\"x\", function(L){ return L.nx; }).attr(\"y\", function(L){ return L.ny; })\r\n        .attr(\"stroke-width\", 7 * t.sN).style(\"font-size\", t.fN + \"px\")\r\n        .each(function(L){\r\n          var s = d3.select(this).text(L.grappe ? null : L.n);\r\n          if (!L.grappe) return;\r\n          s.append(\"tspan\").text(L.n);\r\n          s.append(\"tspan\").attr(\"class\", \"aa-lib-unite\").attr(\"dx\", 8 * t.sM)\r\n            .attr(\"fill\", \"rgba(26,23,20,.78)\").style(\"font-size\", t.fM + \"px\").text(\"projets\");\r\n        });\r\n      var noms = g.select(\"text.aa-lib-m\")\r\n        .attr(\"x\", function(L){ return L.grappe ? L.nx : L.mx; })\r\n        .attr(\"y\", function(L){ return L.grappe ? L.ny - 38 * t.sN : L.my; })\r\n        .attr(\"text-anchor\", function(L){ return L.grappe ? \"middle\" : L.ma; })\r\n        .attr(\"stroke-width\", 7 * t.sM).style(\"font-size\", t.fM + \"px\")\r\n        .text(function(L){ return L.grappe ? \"Marseille\" : L.texte; });\r\n      nums.interrupt(\"fondu\");\r\n      noms.interrupt(\"fondu\");\r\n      function opN(L){ return L.nop; }\r\n      function opM(L){ return L.mop; }\r\n      if (REDUIT.matches){\r\n        nums.style(\"opacity\", opN);\r\n        noms.style(\"opacity\", opM);\r\n      } else if (fondu){\r\n        var vus = libs.filter(function(L){ return L.nop > 0 || L.mop > 0; });\r\n        var pas = Math.min(55, 700 \/ Math.max(1, vus.length));\r\n        libs.forEach(function(L){ L.retard = 0; });\r\n        vus.forEach(function(L, i){ L.retard = i * pas; });\r\n        nums.style(\"opacity\", 0).transition(\"fondu\").delay(function(L){ return L.retard; }).duration(380).style(\"opacity\", opN);\r\n        noms.style(\"opacity\", 0).transition(\"fondu\").delay(function(L){ return L.retard + 60; }).duration(380).style(\"opacity\", opM);\r\n      } else {\r\n        nums.transition(\"fondu\").duration(300).style(\"opacity\", opN);\r\n        noms.transition(\"fondu\").duration(300).style(\"opacity\", opM);\r\n      }\r\n    }\r\n    \/\/ Au d\u00e9part d'un mouvement, un fondu court ; net, s'il faut repartir de rien.\r\n    function eteintLibelles(net){\r\n      if (!gLibelles) return;\r\n      var t = gLibelles.selectAll(\"text\").interrupt(\"fondu\");\r\n      if (net || REDUIT.matches) t.style(\"opacity\", 0);\r\n      else t.transition(\"fondu\").duration(160).style(\"opacity\", 0);\r\n    }\r\n\r\n    \/\/ \u2500\u2500 Survol, infobulle, clic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    function survole(e, d){\r\n      survol = d ? d.cle : null;\r\n      if (d){\r\n        remplitInfobulle(d);\r\n        el.tip.classList.add(\"is-on\");\r\n        placeInfobulle(e);\r\n      } else el.tip.classList.remove(\"is-on\");\r\n      majSol();\r\n      if (!anim) dessine();\r\n    }\r\n    function remplitInfobulle(d){\r\n      var n = d.n, c = CT[d.ci];\r\n      el.tip.innerHTML =\r\n        '<p class=\"aa-tip-ct\"><i style=\"background:' + c.teinte + '\"><\/i>' + esc(c.nom) + '<\/p>'\r\n        + '<p class=\"aa-tip-nom\">' + esc(d.nom) + '<\/p>'\r\n        + (d.detail ? '<p class=\"aa-tip-sous\">' + esc(d.detail) + '<\/p>' : '')\r\n        + '<p class=\"aa-tip-val\"><b style=\"color:' + (n ? c.teinte : \"rgba(26,23,20,.4)\") + '\">' + n + '<\/b>'\r\n        + '<span>' + (n ? \"projet\" + (n > 1 ? \"s\" : \"\") + \" \u00b7 \" + pc(n, S.total) + \" du total\" : \"aucun projet\") + '<\/span><\/p>';\r\n    }\r\n    function placeInfobulle(e){\r\n      if (!e) return;\r\n      var p = d3.pointer(e, racine), ecart = Math.max(14, 26 * dims.u);\r\n      var tw = el.tip.offsetWidth, th = el.tip.offsetHeight;\r\n      var x = p[0] + ecart, y = p[1] + ecart;\r\n      if (x + tw > dims.W - 8) x = p[0] - tw - ecart;\r\n      if (y + th > dims.H - 8) y = p[1] - th - ecart;\r\n      el.tip.style.transform = \"translate(\" + Math.round(Math.max(8, x)) + \"px,\" + Math.round(Math.max(8, y)) + \"px)\";\r\n    }\r\n    \/\/ Un clic sur Marseille, depuis une vue d'ensemble, y conduit.\r\n    function clic(d){ if (d.n && d.isM && cur !== 1 && cur !== 2) va(1); }\r\n\r\n    \/\/ \u2500\u2500 Le r\u00e9cit \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    function majTexte(entree){\r\n      var st = ETAPES[cur];\r\n      el.num.textContent = deux(cur + 1) + \" \/ \" + deux(ETAPES.length);\r\n      el.kick.textContent = st.kick;\r\n      el.big.textContent = st.big;\r\n      el.unit.textContent = st.unit;\r\n      el.titre.textContent = st.titre;\r\n      el.corps.textContent = st.corps || \"\";\r\n      el.corps.hidden = !!st.liste;\r\n      el.liste.hidden = !st.liste;\r\n      if (st.liste && feats) remplitListe();\r\n      majPoints();\r\n      if (entree && !REDUIT.matches){\r\n        el.etape.classList.remove(\"is-entree\");\r\n        void el.etape.offsetWidth;   \/\/ relance l'animation d'entr\u00e9e\r\n        el.etape.classList.add(\"is-entree\");\r\n      }\r\n    }\r\n    function remplitListe(){\r\n      var par = S.parCT, max = 1;\r\n      CT.forEach(function(c){ max = Math.max(max, par[c.id]); });\r\n      el.liste.innerHTML = CT.slice().sort(function(a, b){ return par[b.id] - par[a.id]; }).map(function(c, i){\r\n        return '<li class=\"aa-ligne\" data-ct=\"' + c.id + '\" style=\"--i:' + i + '\">'\r\n          + '<i style=\"background:' + c.teinte + '\"><\/i>'\r\n          + '<span class=\"aa-ligne-nom\">' + esc(c.nom)\r\n          + (c.id === \"mp\" ? ' <small>\u00b7 dont Marseille ' + S.totalM + '<\/small>' : '') + '<\/span>'\r\n          + '<b>' + par[c.id] + '<\/b>'\r\n          + '<span class=\"aa-ligne-barre\"><i style=\"width:' + (par[c.id] \/ max * 100) + '%;background:' + c.teinte + '\"><\/i><\/span>'\r\n          + '<\/li>';\r\n      }).join(\"\");\r\n      majLignes();\r\n    }\r\n    function majLignes(){\r\n      Array.prototype.forEach.call(el.liste.children, function(li){\r\n        li.classList.toggle(\"is-terne\", !!hlCT && hlCT !== li.getAttribute(\"data-ct\"));\r\n      });\r\n    }\r\n    function surligne(id){\r\n      if (hlCT === id) return;\r\n      hlCT = id;\r\n      majLignes();\r\n      majSol();\r\n      if (!anim){ dessine(); poseLibelles(false); }\r\n    }\r\n    function construitPoints(){\r\n      el.points.innerHTML = ETAPES.map(function(s, i){\r\n        return '<button type=\"button\" class=\"aa-point\" data-i=\"' + i + '\" aria-label=\"\u00c9tape ' + (i + 1) + \"\u00a0: \" + esc(s.kick) + '\"><i><\/i><\/button>';\r\n      }).join(\"\");\r\n    }\r\n    function majPoints(){\r\n      Array.prototype.forEach.call(el.points.children, function(b, i){\r\n        b.classList.toggle(\"is-fait\", i <= cur);\r\n        if (i === cur) b.setAttribute(\"aria-current\", \"step\"); else b.removeAttribute(\"aria-current\");\r\n      });\r\n    }\r\n    function construitLegende(){\r\n      el.grille.innerHTML = CT.map(function(c){\r\n        return '<span><i style=\"background:' + c.teinte + '\"><\/i>' + esc(c.court) + '<\/span>';\r\n      }).join(\"\");\r\n    }\r\n    \/\/ L'\u00e9chelle du pic, \u00e0 l'unit\u00e9 de la carte : des graduations rondes (1, 2,\r\n    \/\/ 5, 10\u2026), trois au plus, espac\u00e9es d'au moins 28 unit\u00e9s de maquette.\r\n    function echelle(){\r\n      var s = S.unite, pas = [1, 2, 5, 10, 20, 50].filter(function(p){ return p * s >= 28; })[0] || 100;\r\n      var nb = Math.max(1, Math.min(3, Math.floor(132 \/ (pas * s))));\r\n      var sommet = (132 - nb * pas * s).toFixed(1), traits = \"M48,\" + sommet + \"V132M44,132H52\", chiffres = \"\";\r\n      for (var i = 1; i <= nb; i++){\r\n        var y = 132 - i * pas * s;\r\n        traits += \"M44,\" + y.toFixed(1) + \"H52\";\r\n        chiffres += '<span style=\"top:' + (y \/ 1.4).toFixed(2) + '%\">' + i * pas + '<\/span>';\r\n      }\r\n      el.glyphe.innerHTML = '<svg viewBox=\"0 0 78 140\" focusable=\"false\"><defs>'\r\n        + '<linearGradient id=\"aa-lgL\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#C9CCDD\"\/><stop offset=\"1\" stop-color=\"#7B84B3\"\/><\/linearGradient>'\r\n        + '<linearGradient id=\"aa-lgR\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#6F7AAE\"\/><stop offset=\"1\" stop-color=\"#3D4877\"\/><\/linearGradient><\/defs>'\r\n        + '<path d=\"M10,132L22,' + sommet + 'L22,136Z\" fill=\"url(#aa-lgL)\"\/>'\r\n        + '<path d=\"M22,136L22,' + sommet + 'L34,132Z\" fill=\"url(#aa-lgR)\"\/>'\r\n        + '<path d=\"' + traits + '\" fill=\"none\" stroke=\"rgba(26,23,20,.35)\" stroke-width=\"1.5\" vector-effect=\"non-scaling-stroke\"\/><\/svg>'\r\n        + chiffres;\r\n    }\r\n\r\n    \/\/ \u2500\u2500 Changer d'\u00e9tape \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    \/\/ La carte voyage muette (zoom d3, 1,4 s) : les libell\u00e9s s'\u00e9teignent au\r\n    \/\/ d\u00e9part et se reposent \u00e0 l'arriv\u00e9e. Un clic en route repart de l\u00e0 o\u00f9 la\r\n    \/\/ carte se trouve.\r\n    function va(n){\r\n      if (!feats || !vue) return;\r\n      n = Math.max(0, Math.min(ETAPES.length - 1, n));\r\n      if (n === cur) return;\r\n      var de = vue;\r\n      arrete();\r\n      var tilt = TILT, vers = vueDe(n, tilt);\r\n      cur = n; survol = null; hlCT = null;\r\n      el.tip.classList.remove(\"is-on\");\r\n      majTexte(true);\r\n      majSol();\r\n      eteintLibelles(false);\r\n      if (REDUIT.matches){ vue = vers; dessine(); poseLibelles(false); return; }\r\n      var B = dims.box, cx = (B[0] + B[2]) \/ 2, cy = (B[1] + B[3]) \/ 2, bw = B[2] - B[0];\r\n      function zb(v){ return [(cx - v.tx) \/ v.k, (cy - v.ty) \/ (v.k * v.tilt), bw \/ v.k]; }\r\n      var I = d3.interpolateZoom(zb(de), zb(vers)), duree = 1400;\r\n      anim = horloge(function(t){\r\n        var e = d3.easeCubicInOut(Math.min(1, t \/ duree)), z = I(e), k = bw \/ z[2];\r\n        \/\/ La pente rejoint la sienne si l'entr\u00e9e a \u00e9t\u00e9 interrompue en route.\r\n        var ti = de.tilt + (tilt - de.tilt) * e;\r\n        vue = { k: k, tx: cx - k * z[0], ty: cy - k * ti * z[1], tilt: ti };\r\n        dessine();\r\n        if (t < duree) return;\r\n        arrete();\r\n        vue = vers;\r\n        dessine();\r\n        poseLibelles(true);\r\n      });\r\n    }\r\n\r\n    \/\/ \u2500\u2500 L'entr\u00e9e \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    \/\/ La dalle se couche, de la vue d'avion \u00e0 sa pente, puis les pics poussent\r\n    \/\/ d'ouest en est. Les libell\u00e9s attendent la fin.\r\n    function intro(){\r\n      if (!feats) return;\r\n      arrete();\r\n      cur = 0; survol = null; hlCT = null;\r\n      el.tip.classList.remove(\"is-on\");\r\n      majTexte(true);\r\n      majSol();\r\n      eteintLibelles(true);\r\n      if (REDUIT.matches){ vue = vueDe(0, TILT); dessine(); poseLibelles(false); return; }\r\n      var n = pics.length, G0 = 1500, FIN = G0 + n * 45 + 900, t = 0;\r\n      gRoot.style(\"opacity\", 0);\r\n      enIntro = true;\r\n      croissance = function(d){ return d3.easeCubicOut(borne((t - G0 - d.rang * 45) \/ 800)); };\r\n      anim = horloge(function(ecoule){\r\n        t = ecoule;\r\n        gRoot.style(\"opacity\", borne(t \/ 700));\r\n        \/\/ La vue se recalcule \u00e0 chaque image : un cadre qui change pendant\r\n        \/\/ l'entr\u00e9e est suivi sans heurt.\r\n        vue = vueDe(0, 1 + (TILT - 1) * d3.easeCubicInOut(borne((t - 300) \/ 1500)));\r\n        dessine();\r\n        if (t <= FIN) return;\r\n        arrete();\r\n        dessine();\r\n        poseLibelles(true);\r\n      });\r\n    }\r\n\r\n    \/\/ \u2500\u2500 Suivre la taille du cadre \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    \/\/ Une minuterie plut\u00f4t qu'une image : requestAnimationFrame dort dans un\r\n    \/\/ onglet cach\u00e9, et la carte doit \u00eatre pr\u00eate quand on y revient.\r\n    var mep = 0;\r\n    function planifieMep(){ if (!mep) mep = setTimeout(miseEnPage, 30); }\r\n    function miseEnPage(){\r\n      mep = 0;\r\n      if (racine.hidden) return;\r\n      var etat = mesure();\r\n      if (etat === \"cache\" || !feats) return;\r\n      if (introAFaire){ introAFaire = false; intro(); return; }\r\n      if (etat === \"meme\" || enIntro) return;\r\n      \/\/ Un changement de cadre en plein voyage : on saute \u00e0 l'arriv\u00e9e.\r\n      arrete();\r\n      vue = vueDe(cur, TILT);\r\n      dessine();\r\n      poseLibelles(false);\r\n    }\r\n\r\n    \/\/ \u2500\u2500 D\u00e9marrer, \u00e0 la premi\u00e8re ouverture \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    var demarree = false;\r\n    function demarre(){\r\n      if (demarree) return;\r\n      demarree = true;\r\n      el.attente.hidden = false;\r\n      el.attente.classList.remove(\"is-echec\");\r\n      el.attente.textContent = \"Chargement des contours communaux\u2026\";\r\n      var contours = typeof window.__ampContours === \"function\"\r\n        ? window.__ampContours()\r\n        : Promise.reject(new Error(\"contours indisponibles\"));\r\n      var projetsFonds = typeof window.__ampProjets === \"function\"\r\n        ? window.__ampProjets()\r\n        : Promise.reject(new Error(\"projets indisponibles\"));\r\n      Promise.all([contours, projetsFonds]).then(function(res){\r\n        prepare(res[0], res[1]);\r\n        construit();\r\n        echelle();\r\n        el.attente.hidden = true;\r\n        racine.classList.remove(\"is-attente\");\r\n        introAFaire = true;\r\n        planifieMep();\r\n      }).catch(function(e){\r\n        console.error(e);\r\n        el.attente.textContent = \"Impossible de charger la carte : \" + e.message + \".\";\r\n        el.attente.classList.add(\"is-echec\");\r\n        demarree = false;   \/\/ la prochaine ouverture retentera\r\n      });\r\n    }\r\n\r\n    \/\/ \u2500\u2500 La bascule entre les deux cartes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    function montre(mode){\r\n      var relief = mode === \"relief\";\r\n      Array.prototype.forEach.call(bascule.querySelectorAll(\"[data-carte]\"), function(b){\r\n        b.setAttribute(\"aria-pressed\", b.getAttribute(\"data-carte\") === mode ? \"true\" : \"false\");\r\n      });\r\n      if (carteFonds){\r\n        carteFonds.classList.toggle(\"carte-cachee\", relief);\r\n        carteFonds.inert = relief;\r\n      }\r\n      racine.hidden = !relief;\r\n      el.tip.classList.remove(\"is-on\");\r\n      entre(relief ? racine : carteFonds);\r\n      if (!relief) return;\r\n      demarre();\r\n      planifieMep();\r\n    }\r\n    function entre(n){\r\n      if (!n || !n.animate || REDUIT.matches) return;\r\n      n.animate([{ opacity: 0, transform: \"translateY(10px)\" }, { opacity: 1, transform: \"none\" }],\r\n        { duration: 560, easing: \"cubic-bezier(.22,1,.36,1)\" });\r\n    }\r\n\r\n    bascule.addEventListener(\"click\", function(e){\r\n      var b = e.target.closest(\"[data-carte]\");\r\n      if (b && b.getAttribute(\"aria-pressed\") !== \"true\") montre(b.getAttribute(\"data-carte\"));\r\n    });\r\n    \/\/ \u2500\u2500 La visite guid\u00e9e \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    \/\/ L'entr\u00e9e, puis les \u00e9tapes s'encha\u00eenent seules : la cam\u00e9ra voyage, se\r\n    \/\/ pose, laisse le temps de lire, repart. Toute reprise en main (fl\u00e8che,\r\n    \/\/ point, clavier, changement de carte) rend la main aussit\u00f4t.\r\n    var visite = null, LIRE = 5200;\r\n    var btnVisite = document.getElementById(\"aa-visite\");\r\n    function dureeIntro(){ return REDUIT.matches ? 0 : 1500 + pics.length * 45 + 900; }\r\n    function majVisite(){\r\n      btnVisite.classList.toggle(\"is-on\", !!visite);\r\n      btnVisite.setAttribute(\"aria-pressed\", visite ? \"true\" : \"false\");\r\n      btnVisite.innerHTML = visite ? \"&#10074;&#10074; Pause\" : \"&#9654; Visite guid\u00e9e\";\r\n    }\r\n    function arreteVisite(){\r\n      if (!visite) return;\r\n      clearTimeout(visite);\r\n      visite = null;\r\n      majVisite();\r\n    }\r\n    function lanceVisite(){\r\n      if (!feats) return;\r\n      arreteVisite();\r\n      intro();\r\n      visite = setTimeout(suiteVisite, dureeIntro() + LIRE);\r\n      majVisite();\r\n    }\r\n    function suiteVisite(){\r\n      if (cur >= ETAPES.length - 1){ visite = null; majVisite(); return; }\r\n      va(cur + 1);\r\n      visite = setTimeout(suiteVisite, (REDUIT.matches ? 0 : 1400) + LIRE);\r\n    }\r\n    btnVisite.addEventListener(\"click\", function(){ visite ? arreteVisite() : lanceVisite(); });\r\n    bascule.addEventListener(\"click\", arreteVisite);\r\n\r\n    \/\/ Pour le mode pr\u00e9sentation de la roue : il d\u00e9roule les \u00e9tapes de la\r\n    \/\/ carte avec ses propres fl\u00e8ches.\r\n    window.__ampReliefTour = {\r\n      pret: function(){ return !!feats && !racine.hidden; },\r\n      etape: function(){ return cur; },\r\n      total: function(){ return ETAPES.length; },\r\n      va: function(n){ arreteVisite(); va(n); },\r\n      rejoue: function(){ arreteVisite(); intro(); }\r\n    };\r\n\r\n    document.getElementById(\"aa-prec\").addEventListener(\"click\", function(){ arreteVisite(); va(cur - 1); });\r\n    document.getElementById(\"aa-suiv\").addEventListener(\"click\", function(){ arreteVisite(); va(cur + 1); });\r\n    document.getElementById(\"aa-rejouer\").addEventListener(\"click\", function(){ arreteVisite(); intro(); });\r\n    el.points.addEventListener(\"click\", function(e){\r\n      var b = e.target.closest(\".aa-point\");\r\n      if (b){ arreteVisite(); va(+b.getAttribute(\"data-i\")); }\r\n    });\r\n    el.liste.addEventListener(\"mouseover\", function(e){\r\n      var li = e.target.closest(\".aa-ligne\");\r\n      if (li) surligne(li.getAttribute(\"data-ct\"));\r\n    });\r\n    el.liste.addEventListener(\"mouseleave\", function(){ surligne(null); });\r\n    \/\/ Sur \u00e9cran tactile, rien ne retire l'infobulle : un toucher hors des\r\n    \/\/ communes s'en charge.\r\n    el.svg.addEventListener(\"click\", function(e){ if (e.target === el.svg) survole(null, null); });\r\n    \/\/ Fl\u00e8ches, pages pr\u00e9c\u00e9dente et suivante, espace : comme dans la maquette,\r\n    \/\/ tant que cette carte est \u00e0 l'\u00e9cran et que le clavier ne sert pas ailleurs.\r\n    document.addEventListener(\"keydown\", function(e){\r\n      if (racine.hidden || !feats || !racine.getClientRects().length) return;\r\n      if (e.defaultPrevented || e.altKey || e.ctrlKey || e.metaKey) return;\r\n      var cible = e.target && e.target.closest ? e.target : null;\r\n      if (cible && cible.closest(\"input, textarea, select, [contenteditable], [role='tablist']\")) return;\r\n      var avance = e.key === \"ArrowRight\" || e.key === \"PageDown\" || (e.key === \" \" && !(cible && cible.closest(\"button, a\")));\r\n      var recule = e.key === \"ArrowLeft\" || e.key === \"PageUp\";\r\n      if (!avance && !recule) return;\r\n      e.preventDefault();\r\n      arreteVisite();\r\n      va(cur + (avance ? 1 : -1));\r\n    });\r\n\r\n    if (window.ResizeObserver){\r\n      var ro = new ResizeObserver(planifieMep);\r\n      ro.observe(racine);\r\n      ro.observe(el.legende);\r\n      ro.observe(el.col);\r\n    } else window.addEventListener(\"resize\", planifieMep);\r\n\r\n    construitPoints();\r\n    construitLegende();\r\n    majPoints();\r\n  })();\r\n<\/script>","protected":false},"excerpt":{"rendered":"","protected":false},"author":64,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-23814263","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>m\u00e9tropole outils - Social Hackers Lab<\/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:\/\/socialhackerslab.com\/en\/metropole-outils\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"m\u00e9tropole outils - Social Hackers Lab\" \/>\n<meta property=\"og:url\" content=\"https:\/\/socialhackerslab.com\/en\/metropole-outils\/\" \/>\n<meta property=\"og:site_name\" content=\"Social Hackers Lab\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61561806211570\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-24T08:05:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Social-Hacker-Lab-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"250\" \/>\n\t<meta property=\"og:image:height\" content=\"140\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/metropole-outils\\\/\",\"url\":\"https:\\\/\\\/socialhackerslab.com\\\/metropole-outils\\\/\",\"name\":\"m\u00e9tropole outils - Social Hackers Lab\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#website\"},\"datePublished\":\"2026-09-22T17:06:06+00:00\",\"dateModified\":\"2026-09-24T08:05:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/metropole-outils\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/socialhackerslab.com\\\/metropole-outils\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/metropole-outils\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/socialhackerslab.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"m\u00e9tropole outils\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#website\",\"url\":\"https:\\\/\\\/socialhackerslab.com\\\/\",\"name\":\"SocialHackersLab\",\"description\":\"Hacking Social pour une soci\u00e9t\u00e9 \u00e9galitaire\",\"publisher\":{\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/socialhackerslab.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#organization\",\"name\":\"Social Hackers Lab\",\"url\":\"https:\\\/\\\/socialhackerslab.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/socialhackerslab.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/BW-SHL.png\",\"contentUrl\":\"https:\\\/\\\/socialhackerslab.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/BW-SHL.png\",\"width\":3431,\"height\":3431,\"caption\":\"Social Hackers Lab\"},\"image\":{\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61561806211570\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/socialhackerslab\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"m\u00e9tropole outils - Social Hackers Lab","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:\/\/socialhackerslab.com\/en\/metropole-outils\/","og_locale":"en_GB","og_type":"article","og_title":"m\u00e9tropole outils - Social Hackers Lab","og_url":"https:\/\/socialhackerslab.com\/en\/metropole-outils\/","og_site_name":"Social Hackers Lab","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61561806211570","article_modified_time":"2026-09-24T08:05:50+00:00","og_image":[{"width":250,"height":140,"url":"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Social-Hacker-Lab-1.png","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/socialhackerslab.com\/metropole-outils\/","url":"https:\/\/socialhackerslab.com\/metropole-outils\/","name":"m\u00e9tropole outils - Social Hackers Lab","isPartOf":{"@id":"https:\/\/socialhackerslab.com\/#website"},"datePublished":"2026-09-22T17:06:06+00:00","dateModified":"2026-09-24T08:05:50+00:00","breadcrumb":{"@id":"https:\/\/socialhackerslab.com\/metropole-outils\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/socialhackerslab.com\/metropole-outils\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/socialhackerslab.com\/metropole-outils\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/socialhackerslab.com\/"},{"@type":"ListItem","position":2,"name":"m\u00e9tropole outils"}]},{"@type":"WebSite","@id":"https:\/\/socialhackerslab.com\/#website","url":"https:\/\/socialhackerslab.com\/","name":"SocialHackersLab","description":"Hacking Social pour une soci\u00e9t\u00e9 \u00e9galitaire","publisher":{"@id":"https:\/\/socialhackerslab.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/socialhackerslab.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/socialhackerslab.com\/#organization","name":"Social Hackers Lab","url":"https:\/\/socialhackerslab.com\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/socialhackerslab.com\/#\/schema\/logo\/image\/","url":"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/BW-SHL.png","contentUrl":"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/BW-SHL.png","width":3431,"height":3431,"caption":"Social Hackers Lab"},"image":{"@id":"https:\/\/socialhackerslab.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61561806211570","https:\/\/www.linkedin.com\/company\/socialhackerslab\/"]}]}},"_links":{"self":[{"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/pages\/23814263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/users\/64"}],"replies":[{"embeddable":true,"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/comments?post=23814263"}],"version-history":[{"count":1,"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/pages\/23814263\/revisions"}],"predecessor-version":[{"id":23814264,"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/pages\/23814263\/revisions\/23814264"}],"wp:attachment":[{"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/media?parent=23814263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}