{"id":1471,"date":"2026-03-02T17:37:57","date_gmt":"2026-03-02T16:37:57","guid":{"rendered":"https:\/\/senart-multirotor-racing.com\/?page_id=1471"},"modified":"2026-03-04T04:43:21","modified_gmt":"2026-03-04T03:43:21","slug":"live-results","status":"publish","type":"page","link":"https:\/\/senart-multirotor-racing.com\/?page_id=1471","title":{"rendered":"Live Results &#8211; \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-palette-3-color\">LIVE &#8211; Live Results &#8211; \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B<\/mark><\/h1>\n\n\n  <div id=\"ds-scoreboard-root\" class=\"dswrap\" data-flags-base=\"https:\/\/senart-multirotor-racing.com\/wp-content\/uploads\/flags-svg\">\r\n    <div class=\"dshead\">\r\n      <div class=\"dstitle\">\r\n        <div class=\"dsbadge\">DS<\/div>\r\n        <div>\r\n          <div class=\"dsname\">Scoreboard<\/div>\r\n          <div class=\"dssub\">Live results (WordPress snapshot)<\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"dsmeta\">\r\n        <div class=\"dsupdated\" id=\"ds-scoreboard-updated\">Last update: \u2014<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"dstabs\" role=\"tablist\" aria-label=\"DS tabs\">\r\n      <button class=\"dstab is-active\" data-tab=\"teams\" type=\"button\">\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1 Teams<\/button>\r\n      <button class=\"dstab\" data-tab=\"matches\" type=\"button\">\ud83d\udccb Matches<\/button>\r\n      <button class=\"dstab\" data-tab=\"results\" type=\"button\">\u2705 Matches Results<\/button>\r\n      <button class=\"dstab\" data-tab=\"ranking\" type=\"button\">\ud83e\udde9 Group Ranking<\/button>\r\n      <button class=\"dstab\" data-tab=\"live\" type=\"button\">\ud83c\udfae Live Match<\/button>\r\n      <button class=\"dstab\" data-tab=\"bracket\" type=\"button\">\ud83e\udd47 Bracket<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"dspanel is-active\" data-panel=\"teams\">\r\n      <div class=\"dsnote\">Teams list (flags from uploads\/flags-svg) + group inferred from schedule.<\/div>\r\n      <div id=\"ds-teams\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"dspanel\" data-panel=\"matches\">\r\n      <div class=\"dsnote\">Match schedule (no scores) \u2014 ordered by Match #.<\/div>\r\n      <div id=\"ds-matches\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"dspanel\" data-panel=\"results\">\r\n      <div class=\"dsnote\" id=\"dsnote-results\">Finished matches grouped by qualification groups (compact view).<\/div>\r\n      <div id=\"ds-results\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"dspanel\" data-panel=\"ranking\">\r\n      <div class=\"dsnote\">Standings: Pts \/ Sets Won \/ Goals For \/ Goals Against \/ Diff \/ Max \/ Played.<\/div>\r\n      <div id=\"ds-ranking\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"dspanel\" data-panel=\"live\">\r\n      <div class=\"dsnote\">Current match (from snapshot.liveMatch).<\/div>\r\n      <div id=\"ds-live\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"dspanel\" data-panel=\"bracket\">\r\n      <div class=\"dsnote\">Knockout rounds displayed as columns (horizontal scroll on mobile).<\/div>\r\n      <div id=\"ds-bracket\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"dsfoot\">\r\n      <span class=\"dsmuted\">Source: WordPress snapshot (+ embedded results.json if provided)<\/span>\r\n    <\/div>\r\n  <\/div>\r\n\r\n<style>\r\n  .dswrap{\r\n    --bg: rgba(255,255,255,.06);\r\n    --bg2: rgba(255,255,255,.08);\r\n    --bd: rgba(255,255,255,.12);\r\n    --bd2: rgba(255,255,255,.18);\r\n    --ink: rgba(255,255,255,.93);\r\n    --muted: rgba(255,255,255,.70);\r\n    --accent: #f2c14e;\r\n    --shadow: 0 16px 45px rgba(0,0,0,.30);\r\n\r\n    color: var(--ink);\r\n    border: 1px solid var(--bd);\r\n    background: linear-gradient(180deg, rgba(255,255,255,.06), rgba(255,255,255,.025));\r\n    border-radius: 18px;\r\n    padding: 16px;\r\n    margin: 16px auto;\r\n    box-shadow: var(--shadow);\r\n    backdrop-filter: blur(10px);\r\n\r\n    font-size: 13px;\r\n    line-height: 1.35;\r\n\r\n    max-width: 1100px;\r\n    width: 100%;\r\n  }\r\n\r\n  .dshead{ display:flex; align-items:flex-start; justify-content:space-between; gap:12px; }\r\n  .dstitle{ display:flex; align-items:center; gap:10px; }\r\n  .dsbadge{\r\n    width:40px; height:40px; border-radius:13px;\r\n    border:1px solid var(--bd2);\r\n    display:flex; align-items:center; justify-content:center;\r\n    font-weight:900; letter-spacing:.4px;\r\n    background: rgba(255,255,255,.08);\r\n  }\r\n  .dsname{ font-size:20px; font-weight:950; line-height:1.1; }\r\n  .dssub{ font-size:12px; color:var(--muted); margin-top:2px; }\r\n  .dsmeta{ text-align:right; }\r\n  .dsupdated{ font-size:12px; color:var(--muted); }\r\n\r\n  .dstabs{ display:flex; gap:10px; flex-wrap:wrap; margin: 14px 0 12px; }\r\n  .dstab{\r\n    appearance:none;\r\n    border:1px solid var(--bd);\r\n    background: rgba(255,255,255,.06);\r\n    color: var(--ink);\r\n    padding: 8px 12px;\r\n    border-radius: 14px;\r\n    font-weight: 900;\r\n    font-size: 13px;\r\n    cursor: pointer;\r\n    transition: .15s ease;\r\n  }\r\n  .dstab:hover{ background: rgba(255,255,255,.09); }\r\n  .dstab.is-active{\r\n    border-color: rgba(242,193,78,.60);\r\n    box-shadow: 0 0 0 3px rgba(242,193,78,.10);\r\n    background: rgba(242,193,78,.10);\r\n  }\r\n\r\n  .dspanel{ display:none; }\r\n  .dspanel.is-active{ display:block; }\r\n\r\n  .dsnote{\r\n    border: 1px dashed rgba(255,255,255,.20);\r\n    background: rgba(255,255,255,.035);\r\n    border-radius: 14px;\r\n    padding: 10px 12px;\r\n    color: var(--muted);\r\n    margin-bottom: 12px;\r\n    font-size: 12.5px;\r\n  }\r\n\r\n  @media (max-width: 560px){\r\n    .dswrap{ padding: 12px; border-radius: 16px; }\r\n    .dsname{ font-size:18px; }\r\n    .dstab{ padding: 8px 10px; font-size: 12.5px; }\r\n  }\r\n\r\n  \/* TEAMS *\/\r\n  .dsteamsGrid{ display:grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 10px; }\r\n  @media (max-width: 980px){ .dsteamsGrid{ grid-template-columns: repeat(2, minmax(0,1fr)); } }\r\n  @media (max-width: 560px){ .dsteamsGrid{ grid-template-columns: 1fr; } }\r\n\r\n  .dsteamPill{\r\n    border:1px solid rgba(255,255,255,.10);\r\n    background: rgba(255,255,255,.045);\r\n    border-radius: 14px;\r\n    padding: 10px 12px;\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:space-between;\r\n    gap: 10px;\r\n  }\r\n  .dsteamLeft{ display:flex; align-items:center; gap:10px; min-width:0; font-weight:950; }\r\n  .dsteamLeft .name{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }\r\n  .dsteamRight{ display:flex; align-items:center; gap:8px; flex: 0 0 auto; }\r\n  .dsbadgeMini{\r\n    font-size: 11.5px;\r\n    padding: 4px 8px;\r\n    border-radius: 999px;\r\n    border: 1px solid rgba(255,255,255,.12);\r\n    background: rgba(0,0,0,.12);\r\n    color: rgba(255,255,255,.78);\r\n    white-space: nowrap;\r\n  }\r\n\r\n  \/* MATCHES schedule *\/\r\n  .dsmatchTable{\r\n    border:1px solid rgba(255,255,255,.12);\r\n    background: rgba(255,255,255,.03);\r\n    border-radius: 16px;\r\n    overflow:hidden;\r\n  }\r\n  .dsmrow{\r\n    display:grid;\r\n    grid-template-columns: 110px minmax(0,1fr) 60px minmax(0,1fr) 130px;\r\n    gap: 10px;\r\n    align-items:center;\r\n    padding: 10px 12px;\r\n    border-bottom: 1px solid rgba(255,255,255,.08);\r\n  }\r\n  .dsmrow:last-child{ border-bottom:none; }\r\n  .dsmrow:hover{ background: rgba(255,255,255,.03); }\r\n  .dsmid{ text-align:center; opacity:.8; font-weight:900; }\r\n  .dsmMatch{ font-weight:950; color: rgba(255,255,255,.85); }\r\n\r\n  .dsmTeam{ display:flex; align-items:center; gap:8px; min-width:0; }\r\n  .dsmTeam.is-right{ justify-content:flex-end; text-align:right; }\r\n  .dsmTeam .code{ font-weight:950; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }\r\n\r\n  .dsflagSm{\r\n    width:16px; height:11px; border-radius:3px;\r\n    object-fit:cover;\r\n    flex:0 0 auto;\r\n    box-shadow: 0 0 0 1px rgba(255,255,255,.12);\r\n    background: rgba(255,255,255,.08);\r\n  }\r\n\r\n  @media (max-width: 700px){\r\n    .dsmrow{\r\n      grid-template-columns: 90px 1fr 50px 1fr;\r\n      grid-template-areas:\r\n        \"m  a  vs b\"\r\n        \"g  g  g  g\";\r\n    }\r\n    .dsmMatch{ grid-area: m; }\r\n    .dsmA{ grid-area: a; }\r\n    .dsmVS{ grid-area: vs; }\r\n    .dsmB{ grid-area: b; }\r\n    .dsmG{ grid-area: g; justify-content:flex-start; }\r\n  }\r\n\r\n  \/* CARDS *\/\r\n  .ds-group-card{\r\n    background: rgba(255,255,255,.045);\r\n    border: 1px solid rgba(255,255,255,.10);\r\n    border-radius: 16px;\r\n    padding: 12px;\r\n    margin: 12px 0 16px;\r\n  }\r\n  .ds-group-title{\r\n    display:flex; align-items:center; justify-content:space-between;\r\n    gap:12px;\r\n    font-weight:950;\r\n    font-size: 15px;\r\n    margin: 2px 0 10px;\r\n    color: var(--ink);\r\n  }\r\n\r\n  \/* RESULTS + LIVE row *\/\r\n  .ds-match-row{\r\n    display:grid;\r\n    grid-template-columns: minmax(0,1fr) auto minmax(0,1fr);\r\n    gap: 12px;\r\n    align-items:center;\r\n    padding: 10px 12px;\r\n    border-radius: 12px;\r\n    background: rgba(0,0,0,.16);\r\n    border: 1px solid rgba(255,255,255,.08);\r\n    margin: 8px 0;\r\n  }\r\n  .ds-team{ display:flex; align-items:center; gap:10px; min-width:0; }\r\n  .ds-team.is-left{ justify-content:flex-start; text-align:left; }\r\n  .ds-team.is-right{ justify-content:flex-end; text-align:right; }\r\n  .ds-team .code{ font-weight:950; font-size: 13px; white-space:nowrap; }\r\n  .flag{ width:20px; height:14px; border-radius:4px; object-fit:cover; flex:0 0 auto;\r\n         box-shadow: 0 0 0 1px rgba(255,255,255,.12); background: rgba(255,255,255,.08); }\r\n  .ds-mid{ display:flex; align-items:center; justify-content:center; gap: 8px; font-weight:950; white-space:nowrap; font-size: 13px; }\r\n  .ds-mid .score{ display:inline-flex; min-width: 26px; justify-content:center; padding: 5px 9px; border-radius: 999px; background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.10); }\r\n  .ds-mid .vs{ opacity:.75; font-weight:900; }\r\n  .ds-sub{ margin-top: -2px; padding: 0 10px 8px; font-size: 12.5px; color: var(--muted); }\r\n\r\n  @media (max-width: 640px){\r\n    .ds-match-row{ grid-template-columns: 1fr; gap: 6px; }\r\n    .ds-mid{ justify-content:flex-start; }\r\n    .ds-team.is-right{ justify-content:flex-start; text-align:left; }\r\n  }\r\n\r\n  \/* RANKING table *\/\r\n  .dstablewrap{\r\n    border:1px solid var(--bd);\r\n    background: rgba(255,255,255,.04);\r\n    border-radius: 16px;\r\n    overflow:hidden;\r\n    margin-top: 10px;\r\n  }\r\n  table.dstable{ width:100%; border-collapse: collapse; font-size: 13px; }\r\n  .dstable thead th{\r\n    text-align:left;\r\n    padding: 10px 12px;\r\n    color: var(--muted);\r\n    font-weight: 950;\r\n    border-bottom: 1px solid rgba(255,255,255,.12);\r\n    background: rgba(0,0,0,.10);\r\n    white-space: nowrap;\r\n  }\r\n  .dstable tbody td{\r\n    padding: 10px 12px;\r\n    border-bottom: 1px solid rgba(255,255,255,.08);\r\n    vertical-align: middle;\r\n  }\r\n  .dstable tbody tr:hover{ background: rgba(255,255,255,.03); }\r\n  .dsright{ text-align:right; }\r\n  .dspos{ width: 52px; color: var(--muted); font-weight: 950; }\r\n  .dsflag{ width: 20px; height: 14px; border-radius: 4px; border: 1px solid rgba(255,255,255,.18); object-fit: cover; background: rgba(255,255,255,.08); flex: 0 0 auto; }\r\n\r\n  \/* BRACKET *\/\r\n  .dsbracketScroll{ overflow-x:auto; padding-bottom: 6px; }\r\n  .dsbracketCols{ display:flex; gap: 14px; min-width: 980px; }\r\n  @media (max-width: 560px){ .dsbracketCols{ min-width: 860px; } }\r\n  .dscol{ flex: 0 0 300px; }\r\n  .dscol h3{ margin: 0 0 10px; font-size: 15px; font-weight: 950; }\r\n\r\n  .dscard{\r\n    border: 1px solid rgba(255,255,255,.10);\r\n    background: rgba(255,255,255,.06);\r\n    border-radius: 16px;\r\n    padding: 10px;\r\n    margin-bottom: 12px;\r\n  }\r\n  .dscardhead{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:8px; }\r\n  .dstag{\r\n    font-size:11.5px; color: var(--muted);\r\n    border: 1px solid rgba(255,255,255,.10);\r\n    background: rgba(0,0,0,.10);\r\n    padding: 4px 9px;\r\n    border-radius: 999px;\r\n    white-space: nowrap;\r\n  }\r\n  .dsmtitle{ font-weight: 950; font-size: 13.5px; }\r\n  .dsrow{\r\n    display:flex; align-items:center; justify-content:space-between;\r\n    padding: 8px 10px;\r\n    border: 1px solid rgba(255,255,255,.08);\r\n    background: rgba(0,0,0,.08);\r\n    border-radius: 12px;\r\n    margin-top: 7px;\r\n    gap:10px;\r\n  }\r\n  .dsteam{ display:flex; align-items:center; gap:8px; min-width: 0; font-weight: 950; }\r\n  .dsteam span{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\r\n  .dsscore{\r\n    width: 30px; height: 30px;\r\n    border-radius: 999px;\r\n    display:flex; align-items:center; justify-content:center;\r\n    font-weight: 950;\r\n    border:1px solid rgba(255,255,255,.10);\r\n    background: rgba(255,255,255,.06);\r\n    flex: 0 0 auto;\r\n    font-size: 13px;\r\n  }\r\n  .dssets{ margin-top: 8px; color: var(--muted); font-size: 12.5px; display:flex; gap:8px; flex-wrap:wrap; }\r\n  .dssets b{ color: var(--accent); }\r\n\r\n  .dsfoot{ margin-top: 12px; display:flex; justify-content:flex-end; color: var(--muted); font-size: 12px; }\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  const root = document.getElementById('ds-scoreboard-root');\r\n  const flagsBase = root?.getAttribute('data-flags-base') || '';\r\n\r\n  \/\/ Tabs\r\n  const tabs = Array.from(root.querySelectorAll('.dstab'));\r\n  const panels = Array.from(root.querySelectorAll('.dspanel'));\r\n  tabs.forEach(btn=>{\r\n    btn.addEventListener('click', ()=>{\r\n      tabs.forEach(b=>b.classList.toggle('is-active', b===btn));\r\n      panels.forEach(p=>p.classList.toggle('is-active', p.getAttribute('data-panel') === btn.getAttribute('data-tab')));\r\n    });\r\n  });\r\n\r\n  function esc(s){ return (s??'').toString().replace(\/[&<>\"']\/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'}[m])); }\r\n\r\nconst ISO3_TO_2 = {\r\n  FRA:'fr',\r\n  USA:'us',\r\n  CHN:'cn',\r\n  JPN:'jp',\r\n  GER:'de',\r\n  DEU:'de',\r\n  KAZ:'kz',\r\n  AZE:'az',\r\n  BGR:'bg',\r\n  BEL:'be',\r\n  HKG:'hk',\r\n  TUR:'tr'\r\n};\r\n\r\n  function flagIso2FromTeamOrFlag(team, flag3){\r\n    const f = String(flag3||'').toUpperCase();\r\n    if (f && ISO3_TO_2[f]) return ISO3_TO_2[f];\r\n    const m = (team||'').toUpperCase().match(\/^([A-Z]{3})\/);\r\n    if (m && ISO3_TO_2[m[1]]) return ISO3_TO_2[m[1]];\r\n    const m2 = (team||'').toLowerCase().match(\/^([a-z]{2})\\d?$\/);\r\n    if (m2) return m2[1];\r\n    return null;\r\n  }\r\n\r\n  function emojiFlagFromIso2(iso2){\r\n    if (!iso2 || iso2.length !== 2) return '\ud83c\udff3\ufe0f';\r\n    const A = 0x1F1E6;\r\n    const cps = [...iso2.toUpperCase()].map(c => A + (c.charCodeAt(0) - 65));\r\n    return String.fromCodePoint(...cps);\r\n  }\r\n\r\n  function flagImg(iso2, cls){\r\n    if (!iso2) return `<span class=\"${cls}\" title=\"flag\"><\/span>`;\r\n    if (flagsBase){\r\n      const url = `${flagsBase}\/${iso2}.svg`;\r\n      return `<img decoding=\"async\" class=\"${cls}\" src=\"${esc(url)}\" alt=\"${esc(iso2)}\" onerror=\"this.replaceWith(document.createTextNode('${emojiFlagFromIso2(iso2)}'));\">`;\r\n    }\r\n    return `<span class=\"${cls}\" title=\"${esc(iso2)}\">${emojiFlagFromIso2(iso2)}<\/span>`;\r\n  }\r\n\r\n  function flagInline(team, flag3){ return flagImg(flagIso2FromTeamOrFlag(team, flag3), 'flag'); }\r\n  function flagSmall(team, flag3){ return flagImg(flagIso2FromTeamOrFlag(team, flag3), 'dsflagSm'); }\r\n  function flagNode(team, flag3){ return flagImg(flagIso2FromTeamOrFlag(team, flag3), 'dsflag'); }\r\n\r\n  function groupNameFromNumber(n){\r\n    const idx = (n|0) - 1;\r\n    if (idx >= 0 && idx < 26) return 'Group ' + String.fromCharCode(65 + idx);\r\n    return 'Group ' + n;\r\n  }\r\n\r\n  \/\/ goals from sets\r\n  function goalsFromSetsForMatch(m){\r\n    let gr = 0, gb = 0;\r\n    if (Array.isArray(m?.sets)){\r\n      for (const s of m.sets){\r\n        gr += (+s?.scoreRed || 0);\r\n        gb += (+s?.scoreBlue || 0);\r\n      }\r\n    }\r\n    if (!gr && !gb){\r\n      gr = (+m?.scoreRed || 0);\r\n      gb = (+m?.scoreBlue || 0);\r\n    }\r\n    return { gr, gb };\r\n  }\r\n\r\n  function setsText(sets){\r\n    if (!Array.isArray(sets) || !sets.length) return '';\r\n    return sets.map(s => `${s.scoreRed}-${s.scoreBlue}`).join(' | ');\r\n  }\r\n\r\n  function winnerFromSets(m){\r\n    const swr = +m.setsWonRed || 0;\r\n    const swb = +m.setsWonBlue || 0;\r\n    if (swr === swb) return null;\r\n    return swr > swb ? m.teamRed : m.teamBlue;\r\n  }\r\n\r\n  function buildTeamGroupMap(results){\r\n    const map = new Map();\r\n    (results||[]).forEach(m=>{\r\n      if (!m || !m.group_number) return;\r\n      if ((m.phase||'') !== '') return;\r\n      const g = m.group_number;\r\n      if (m.teamRed && !map.has(m.teamRed)) map.set(m.teamRed, g);\r\n      if (m.teamBlue && !map.has(m.teamBlue)) map.set(m.teamBlue, g);\r\n    });\r\n    return map;\r\n  }\r\n\r\n  \/\/ standings always computed from results\r\n  function computeStandingsFromResults(results){\r\n    const byGroup = new Map(); \/\/ group_number -> map(team->stats)\r\n    const ensure = (g, t) => {\r\n      if (!byGroup.has(g)) byGroup.set(g, new Map());\r\n      const map = byGroup.get(g);\r\n      if (!map.has(t)) map.set(t, { team:t, pts:0, setsWon:0, gf:0, ga:0, diff:0, max:0, played:0 });\r\n      return map.get(t);\r\n    };\r\n\r\n    (results||[]).forEach(m=>{\r\n      const g = m.group_number;\r\n      if (!g) return;\r\n      if ((m.phase||'') !== '') return;\r\n      if (!m.finished) return;\r\n\r\n      const tr = m.teamRed, tb = m.teamBlue;\r\n\r\n      const swr = +m.setsWonRed || 0;\r\n      const swb = +m.setsWonBlue || 0;\r\n\r\n      const { gr, gb } = goalsFromSetsForMatch(m);\r\n\r\n      const ar = ensure(g, tr);\r\n      const ab = ensure(g, tb);\r\n\r\n      ar.played++; ab.played++;\r\n      ar.setsWon += swr;\r\n      ab.setsWon += swb;\r\n\r\n      ar.gf += gr; ar.ga += gb;\r\n      ab.gf += gb; ab.ga += gr;\r\n\r\n      ar.max = Math.max(ar.max, gr);\r\n      ab.max = Math.max(ab.max, gb);\r\n\r\n      if (swr > swb) ar.pts += 3;\r\n      else if (swb > swr) ab.pts += 3;\r\n      else { ar.pts += 1; ab.pts += 1; }\r\n    });\r\n\r\n    const out = [];\r\n    for (const [g, map] of byGroup.entries()){\r\n      const rows = Array.from(map.values()).map(r=>{\r\n        r.diff = r.gf - r.ga;\r\n        return r;\r\n      }).sort((a,b)=>{\r\n        if (b.pts !== a.pts) return b.pts - a.pts;\r\n        if (b.diff !== a.diff) return b.diff - a.diff;\r\n        if (b.gf !== a.gf) return b.gf - a.gf;\r\n        return b.setsWon - a.setsWon;\r\n      });\r\n\r\n      out.push({ group_number:g, name: groupNameFromNumber(g), rows });\r\n    }\r\n    out.sort((a,b)=>a.group_number-b.group_number);\r\n    return out;\r\n  }\r\n\r\n  \/\/ LIVE MATCH (Option A: payload.liveMatch)\r\n  function findLiveMatch(payload){\r\n    const p = payload || {};\r\n    return (\r\n      p.liveMatch ||\r\n      p.currentMatch ||\r\n      p.matchLive ||\r\n      p.scoreboard?.liveMatch ||\r\n      p.scoreboard?.currentMatch ||\r\n      p.state?.liveMatch ||\r\n      null\r\n    );\r\n  }\r\n\r\n  function renderLiveMatchCard(live, teamsIndex){\r\n    if (!live) return `<div class=\"dsnote\">No live match object found in snapshot payload.<\/div>`;\r\n\r\n    \/\/ Option A expected fields:\r\n    \/\/ team_red, team_blue, score_red, score_blue, timer, sets_red, sets_blue, sets_history, matchId, competition, running\r\n    const tr = live.team_red || live.teamRed || live.teamA || '\u2014';\r\n    const tb = live.team_blue || live.teamBlue || live.teamB || '\u2014';\r\n\r\n    const fr3 = teamsIndex.get(tr)?.flag || null;\r\n    const fb3 = teamsIndex.get(tb)?.flag || null;\r\n\r\n    const sr = (live.score_red ?? live.scoreRed ?? 0);\r\n    const sb = (live.score_blue ?? live.scoreBlue ?? 0);\r\n\r\n    const clock = live.timer || live.clock || live.time || '--:--';\r\n    const matchId = live.matchId ?? live.match_id ?? null;\r\n    const title = live.competition || 'Live Match';\r\n\r\n    const setsR = (live.sets_red ?? live.setsWonRed ?? 0);\r\n    const setsB = (live.sets_blue ?? live.setsWonBlue ?? 0);\r\n    const running = !!(live.running);\r\n\r\n    let setsLine = 'Sets: \u2014';\r\n    if (Array.isArray(live.sets_history) && live.sets_history.length){\r\n      setsLine = 'Sets: ' + live.sets_history.map(s=>`S${s.set}:${s.red}-${s.blue}`).join(' | ');\r\n    } else if (Array.isArray(live.sets) && live.sets.length){\r\n      setsLine = 'Sets: ' + live.sets.map(s=>`${s.scoreRed}-${s.scoreBlue}`).join(' | ');\r\n    }\r\n\r\n    return `\r\n      <div class=\"ds-group-card\">\r\n        <div class=\"ds-group-title\">\r\n          <div>${esc(title)}<\/div>\r\n          <div style=\"opacity:.7;font-weight:800;font-size:12px\">\r\n            ${matchId ? `Match #${esc(matchId)}` : `No match selected`}\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ds-match-row\">\r\n          <div class=\"ds-team is-left\">\r\n            ${flagInline(tr, fr3)}\r\n            <div class=\"code\">${esc(tr)}<\/div>\r\n          <\/div>\r\n\r\n          <div class=\"ds-mid\">\r\n            <span class=\"score\">${esc(sr)}<\/span>\r\n            <span class=\"vs\">\u2014<\/span>\r\n            <span class=\"score\">${esc(sb)}<\/span>\r\n            <span class=\"vs\" style=\"margin-left:10px;opacity:.85\">${esc(clock)}<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"ds-team is-right\">\r\n            <div class=\"code\">${esc(tb)}<\/div>\r\n            ${flagInline(tb, fb3)}\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ds-sub\">\r\n          Sets won: <b>${esc(setsR)}-${esc(setsB)}<\/b>\r\n          &nbsp;\u2022&nbsp; ${esc(setsLine)}\r\n          &nbsp;\u2022&nbsp; ${running ? '\u23f1\ufe0f Running' : '\u23f8\ufe0f Paused'}\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function renderMatchCard(m, teamsIndex){\r\n    const tr = m.teamRed || '\u2014';\r\n    const tb = m.teamBlue || '\u2014';\r\n    const fr3 = teamsIndex.get(tr)?.flag || null;\r\n    const fb3 = teamsIndex.get(tb)?.flag || null;\r\n\r\n    const wr = +m.setsWonRed || 0;\r\n    const wb = +m.setsWonBlue || 0;\r\n    const win = winnerFromSets(m);\r\n    const tag = m.group_number ? groupNameFromNumber(m.group_number) : (m.phase ? m.phase : '\u2014');\r\n    const st = setsText(m.sets);\r\n\r\n    return `\r\n      <div class=\"dscard\">\r\n        <div class=\"dscardhead\">\r\n          <div class=\"dsmtitle\">Match #${esc(m.matchId ?? '\u2014')}<\/div>\r\n          <div class=\"dstag\">${esc(tag)}<\/div>\r\n        <\/div>\r\n\r\n        <div class=\"dsrow\">\r\n          <div class=\"dsteam\">${flagNode(tr, fr3)}<span>${esc(tr)}<\/span><\/div>\r\n          <div class=\"dsscore\">${esc(wr)}<\/div>\r\n        <\/div>\r\n\r\n        <div class=\"dsrow\">\r\n          <div class=\"dsteam\">${flagNode(tb, fb3)}<span>${esc(tb)}<\/span><\/div>\r\n          <div class=\"dsscore\">${esc(wb)}<\/div>\r\n        <\/div>\r\n\r\n        <div class=\"dssets\">\r\n          ${st ? `<span>Sets: ${esc(st)}<\/span>` : `<span>Sets: \u2014<\/span>`}\r\n          ${win ? `<span>\u2022 <b>\ud83c\udfc6 ${esc(win)}<\/b><\/span>` : `<span>\u2022 \ud83e\udd1d Draw<\/span>`}\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function renderMatchesCompactByGroup(results, teamsIndex){\r\n    const groupFinished = (results||[]).filter(m => m.finished && (m.phase||'') === '' && m.group_number);\r\n    const byGroup = new Map();\r\n    groupFinished.forEach(m=>{\r\n      const g = m.group_number;\r\n      if (!byGroup.has(g)) byGroup.set(g, []);\r\n      byGroup.get(g).push(m);\r\n    });\r\n\r\n    const groups = Array.from(byGroup.keys()).sort((a,b)=>a-b);\r\n    if (!groups.length) return `<div class=\"dsnote\">No qualification\/group matches found.<\/div>`;\r\n\r\n    let html = '';\r\n    groups.forEach(g=>{\r\n      const arr = byGroup.get(g).slice().sort((a,b)=>(a.matchId||0)-(b.matchId||0));\r\n      html += `<div class=\"ds-group-card\">\r\n        <div class=\"ds-group-title\">\r\n          <div>${esc(groupNameFromNumber(g))}<\/div>\r\n          <div style=\"opacity:.7;font-weight:800;font-size:12px\">${arr.length} matches<\/div>\r\n        <\/div>`;\r\n\r\n      arr.forEach(m=>{\r\n        const tr = m.teamRed || '\u2014';\r\n        const tb = m.teamBlue || '\u2014';\r\n        const fr3 = teamsIndex.get(tr)?.flag || null;\r\n        const fb3 = teamsIndex.get(tb)?.flag || null;\r\n\r\n        const wr = (+m.setsWonRed || 0);\r\n        const wb = (+m.setsWonBlue || 0);\r\n        const st = setsText(m.sets);\r\n        const win = winnerFromSets(m);\r\n\r\n        html += `\r\n          <div class=\"ds-match-row\">\r\n            <div class=\"ds-team is-left\">\r\n              ${flagInline(tr, fr3)}\r\n              <div class=\"code\">${esc(tr)}<\/div>\r\n            <\/div>\r\n\r\n            <div class=\"ds-mid\">\r\n              <span class=\"score\">${esc(wr)}<\/span>\r\n              <span class=\"vs\">\u2014<\/span>\r\n              <span class=\"score\">${esc(wb)}<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"ds-team is-right\">\r\n              <div class=\"code\">${esc(tb)}<\/div>\r\n              ${flagInline(tb, fb3)}\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"ds-sub\">\r\n            ${st ? `Sets: ${esc(st)}` : `Sets: \u2014`}\r\n            ${win ? ` &nbsp;\u2022&nbsp; \ud83c\udfc6 ${esc(win)}` : ` &nbsp;\u2022&nbsp; \ud83e\udd1d Draw`}\r\n            <span style=\"opacity:.55\">&nbsp;\u2022&nbsp; Match #${esc(m.matchId ?? '')}<\/span>\r\n          <\/div>\r\n        `;\r\n      });\r\n\r\n      html += `<\/div>`;\r\n    });\r\n\r\n    return html;\r\n  }\r\n\r\n  function renderTeams(teams, teamsIndex, results){\r\n    const teamGroup = buildTeamGroupMap(results || []);\r\n    if (!teams || !teams.length) return `<div class=\"dsnote\">No teams data found.<\/div>`;\r\n\r\n    const list = teams.slice().sort((a,b)=>String(a.name||'').localeCompare(String(b.name||'')));\r\n\r\n    let html = `<div class=\"dsteamsGrid\">`;\r\n    list.forEach(t=>{\r\n      const name = t.name || '\u2014';\r\n      const flag3 = t.flag || null;\r\n\r\n      const inferredG = teamGroup.get(name);\r\n      const groupLabel =\r\n        (t.group_number ? groupNameFromNumber(t.group_number) :\r\n        (t.group ? String(t.group) :\r\n        (inferredG ? groupNameFromNumber(inferredG) : null)));\r\n\r\n      html += `\r\n        <div class=\"dsteamPill\">\r\n          <div class=\"dsteamLeft\">\r\n            ${flagNode(name, flag3)}\r\n            <div class=\"name\">${esc(name)}<\/div>\r\n          <\/div>\r\n          <div class=\"dsteamRight\">\r\n            ${groupLabel ? `<span class=\"dsbadgeMini\">${esc(groupLabel)}<\/span>` : `<span class=\"dsbadgeMini\" style=\"opacity:.5\">\u2014<\/span>`}\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n    });\r\n    html += `<\/div>`;\r\n    return html;\r\n  }\r\n\r\n  function renderSchedule(results, teamsIndex){\r\n    const sched = (results||[])\r\n      .filter(m => (m.phase||'') === '' && m.group_number)\r\n      .slice()\r\n      .sort((a,b)=>(a.matchId||0)-(b.matchId||0));\r\n\r\n    if (!sched.length) return `<div class=\"dsnote\">No schedule found.<\/div>`;\r\n\r\n    let html = `<div class=\"dsmatchTable\">`;\r\n    sched.forEach(m=>{\r\n      const tr = m.teamRed || '\u2014';\r\n      const tb = m.teamBlue || '\u2014';\r\n      const fr3 = teamsIndex.get(tr)?.flag || null;\r\n      const fb3 = teamsIndex.get(tb)?.flag || null;\r\n      const g = m.group_number ? groupNameFromNumber(m.group_number) : '\u2014';\r\n\r\n      html += `\r\n        <div class=\"dsmrow\">\r\n          <div class=\"dsmMatch\">Match #${esc(m.matchId ?? '\u2014')}<\/div>\r\n\r\n          <div class=\"dsmTeam dsmA\">\r\n            ${flagSmall(tr, fr3)}\r\n            <span class=\"code\">${esc(tr)}<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dsmid dsmVS\">vs<\/div>\r\n\r\n          <div class=\"dsmTeam is-right dsmB\">\r\n            <span class=\"code\">${esc(tb)}<\/span>\r\n            ${flagSmall(tb, fb3)}\r\n          <\/div>\r\n\r\n          <div class=\"dsmTeam is-right dsmG\">\r\n            <span class=\"dsbadgeMini\">${esc(g)}<\/span>\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n    });\r\n    html += `<\/div>`;\r\n    return html;\r\n  }\r\n\r\n  function renderRanking(groupsData, teamsIndex){\r\n    if (!groupsData || !groupsData.length) return `<div class=\"dsnote\">No group ranking found.<\/div>`;\r\n\r\n    let html = '';\r\n    groupsData.forEach(g=>{\r\n      const rows = Array.isArray(g.rows) ? g.rows : [];\r\n      html += `<h3 style=\"margin:16px 0 8px;font-weight:950;\">${esc(g.name || 'Group')}<\/h3>`;\r\n      html += `<div class=\"dstablewrap\"><table class=\"dstable\">\r\n        <thead><tr>\r\n          <th class=\"dspos\">#<\/th>\r\n          <th>Team<\/th>\r\n          <th class=\"dsright\">Pts<\/th>\r\n          <th class=\"dsright\">Sets Won<\/th>\r\n          <th class=\"dsright\">GF<\/th>\r\n          <th class=\"dsright\">GA<\/th>\r\n          <th class=\"dsright\">Diff<\/th>\r\n          <th class=\"dsright\">Max<\/th>\r\n          <th class=\"dsright\">Played<\/th>\r\n        <\/tr><\/thead><tbody>`;\r\n\r\n      rows.forEach((row,i)=>{\r\n        const team = row.team || '\u2014';\r\n        const flag3 = teamsIndex.get(team)?.flag || null;\r\n\r\n        html += `<tr>\r\n          <td class=\"dspos\">${i+1}<\/td>\r\n          <td><span style=\"display:flex;align-items:center;gap:10px;font-weight:950;\">${flagNode(team, flag3)}<span>${esc(team)}<\/span><\/span><\/td>\r\n          <td class=\"dsright\">${esc(row.pts ?? 0)}<\/td>\r\n          <td class=\"dsright\">${esc(row.setsWon ?? 0)}<\/td>\r\n          <td class=\"dsright\">${esc(row.gf ?? 0)}<\/td>\r\n          <td class=\"dsright\">${esc(row.ga ?? 0)}<\/td>\r\n          <td class=\"dsright\">${esc(row.diff ?? 0)}<\/td>\r\n          <td class=\"dsright\">${esc(row.max ?? 0)}<\/td>\r\n          <td class=\"dsright\">${esc(row.played ?? 0)}<\/td>\r\n        <\/tr>`;\r\n      });\r\n\r\n      html += `<\/tbody><\/table><\/div>`;\r\n    });\r\n\r\n    return html;\r\n  }\r\n\r\n  function roundTitle(key){\r\n    if (key === 'quarterfinals') return '\ud83c\udfc1 Quarterfinals';\r\n    if (key === 'semis') return '\ud83d\udd25 Semifinals';\r\n    if (key === 'petite_finale') return '\ud83e\udd49 Small Final';\r\n    if (key === 'final') return '\ud83e\udd47 Final';\r\n    return key;\r\n  }\r\n\r\n  async function main(){\r\n    const updatedEl = document.getElementById('ds-scoreboard-updated');\r\n    const teamsEl   = document.getElementById('ds-teams');\r\n    const matchesEl = document.getElementById('ds-matches');\r\n    const resultsEl = document.getElementById('ds-results');\r\n    const rankingEl = document.getElementById('ds-ranking');\r\n    const liveEl    = document.getElementById('ds-live');\r\n    const bracketEl = document.getElementById('ds-bracket');\r\n\r\n    try{\r\n      const r = await fetch('\/index.php?rest_route=\/ds\/v1\/snapshot', {cache:'no-store'});\r\n      const j = await r.json();\r\n\r\n      if(!j.ok){\r\n        updatedEl.textContent = 'Last update: \u2014';\r\n        teamsEl.innerHTML = `<div class=\"dsnote\">No snapshot received yet.<\/div>`;\r\n        return;\r\n      }\r\n\r\n      const dt = j.updatedAt ? new Date(j.updatedAt*1000) : null;\r\n      updatedEl.textContent = 'Last update: ' + (dt ? dt.toLocaleString() : '\u2014');\r\n\r\n      const p = j.payload || {};\r\n      const teams = (p.teamsData && Array.isArray(p.teamsData.teams)) ? p.teamsData.teams : [];\r\n      const teamsIndex = new Map(teams.map(t => [t.name, t]));\r\n\r\n      const results = Array.isArray(p.results) ? p.results : null;\r\n\r\n      teamsEl.innerHTML = renderTeams(teams, teamsIndex, results || []);\r\n\r\n      matchesEl.innerHTML = results\r\n        ? renderSchedule(results, teamsIndex)\r\n        : `<div class=\"dsnote\">No match list found (payload.results missing). Make sure your wpPush embeds results.json into the snapshot.<\/div>`;\r\n\r\n      resultsEl.innerHTML = results\r\n        ? renderMatchesCompactByGroup(results, teamsIndex)\r\n        : `<div class=\"dsnote\">No match list found (payload.results missing). Make sure your wpPush embeds results.json into the snapshot.<\/div>`;\r\n\r\n      \/\/ LIVE: use payload.liveMatch (Option A), fallback if other key name\r\n      const live = findLiveMatch(p);\r\n      liveEl.innerHTML = renderLiveMatchCard(live, teamsIndex);\r\n\r\n      \/\/ RANKING always computed to ensure GF\/GA\/Diff\/Max correct\r\n      const computed = results ? computeStandingsFromResults(results) : null;\r\n      rankingEl.innerHTML = computed\r\n        ? renderRanking(computed, teamsIndex)\r\n        : `<div class=\"dsnote\">No group ranking found (payload.results missing).<\/div>`;\r\n\r\n      \/\/ BRACKET\r\n      if (!results || !results.length){\r\n        bracketEl.innerHTML = `<div class=\"dsnote\">No KO data (payload.results missing).<\/div>`;\r\n      } else {\r\n        const ko = results.filter(m => (m.phase||'') !== '');\r\n        if (!ko.length){\r\n          bracketEl.innerHTML = `<div class=\"dsnote\">No KO \/ bracket data found in snapshot.<\/div>`;\r\n        } else {\r\n          const rounds = [\r\n            { key:'quarterfinals', phases:['quarterfinals'] },\r\n            { key:'semis', phases:['semi1','semi2'] },\r\n            { key:'petite_finale', phases:['petite_finale'] },\r\n            { key:'final', phases:['final'] }\r\n          ];\r\n\r\n          let html = `<div class=\"dsbracketScroll\"><div class=\"dsbracketCols\">`;\r\n          rounds.forEach(rnd=>{\r\n            const arr = ko.filter(m => rnd.phases.includes(m.phase))\r\n                          .slice()\r\n                          .sort((a,b)=>(a.matchId||0)-(b.matchId||0));\r\n            if (!arr.length) return;\r\n\r\n            html += `<div class=\"dscol\"><h3>${esc(roundTitle(rnd.key))}<\/h3>`;\r\n            arr.forEach(m => { html += renderMatchCard(m, teamsIndex); });\r\n            html += `<\/div>`;\r\n          });\r\n          html += `<\/div><\/div>`;\r\n          bracketEl.innerHTML = html;\r\n        }\r\n      }\r\n\r\n    }catch(e){\r\n      teamsEl.innerHTML = `<div class=\"dsnote\">Load error: ${esc(e?.message || e)}<\/div>`;\r\n    }\r\n  }\r\n\r\n  main();\r\n})();\r\n<\/script>\r\n\r\n  \n","protected":false},"excerpt":{"rendered":"<p>LIVE &#8211; Live Results &#8211; \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_kad_post_transparent":"","_kad_post_title":"default","_kad_post_layout":"normal","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"iawp_total_views":596,"footnotes":""},"class_list":["post-1471","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Live Results - \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B - SENART MULTIROTOR RACING<\/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:\/\/senart-multirotor-racing.com\/?page_id=1471\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Live Results - \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B - SENART MULTIROTOR RACING\" \/>\n<meta property=\"og:description\" content=\"LIVE &#8211; Live Results &#8211; \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B\" \/>\n<meta property=\"og:url\" content=\"https:\/\/senart-multirotor-racing.com\/?page_id=1471\" \/>\n<meta property=\"og:site_name\" content=\"SENART MULTIROTOR RACING\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/senartmultirotorracing\/?locale=fr_FR\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-04T03:43:21+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/senart-multirotor-racing.com\/?page_id=1471\",\"url\":\"https:\/\/senart-multirotor-racing.com\/?page_id=1471\",\"name\":\"Live Results - \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B - SENART MULTIROTOR RACING\",\"isPartOf\":{\"@id\":\"https:\/\/senart-multirotor-racing.com\/#website\"},\"datePublished\":\"2026-03-02T16:37:57+00:00\",\"dateModified\":\"2026-03-04T03:43:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/senart-multirotor-racing.com\/?page_id=1471#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/senart-multirotor-racing.com\/?page_id=1471\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/senart-multirotor-racing.com\/?page_id=1471#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/senart-multirotor-racing.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Live Results &#8211; \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/senart-multirotor-racing.com\/#website\",\"url\":\"https:\/\/senart-multirotor-racing.com\/\",\"name\":\"SENART MULTIROTOR RACING\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/senart-multirotor-racing.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/senart-multirotor-racing.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/senart-multirotor-racing.com\/#organization\",\"name\":\"SENART MULTIROTOR RACING\",\"url\":\"https:\/\/senart-multirotor-racing.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/senart-multirotor-racing.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/senart-multirotor-racing.com\/wp-content\/uploads\/2025\/08\/cropped-Logo-pour-fond-noir.png\",\"contentUrl\":\"https:\/\/senart-multirotor-racing.com\/wp-content\/uploads\/2025\/08\/cropped-Logo-pour-fond-noir.png\",\"width\":2294,\"height\":1352,\"caption\":\"SENART MULTIROTOR RACING\"},\"image\":{\"@id\":\"https:\/\/senart-multirotor-racing.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/senartmultirotorracing\/?locale=fr_FR\",\"https:\/\/discord.gg\/pcrYmAr\",\"https:\/\/www.instagram.com\/senartmultirotorracing\/\",\"https:\/\/www.youtube.com\/channel\/UC3qX1bKa-A5qpBAVtMZk2Dw\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Live Results - \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B - SENART MULTIROTOR RACING","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:\/\/senart-multirotor-racing.com\/?page_id=1471","og_locale":"fr_FR","og_type":"article","og_title":"Live Results - \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B - SENART MULTIROTOR RACING","og_description":"LIVE &#8211; Live Results &#8211; \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B","og_url":"https:\/\/senart-multirotor-racing.com\/?page_id=1471","og_site_name":"SENART MULTIROTOR RACING","article_publisher":"https:\/\/www.facebook.com\/senartmultirotorracing\/?locale=fr_FR","article_modified_time":"2026-03-04T03:43:21+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/senart-multirotor-racing.com\/?page_id=1471","url":"https:\/\/senart-multirotor-racing.com\/?page_id=1471","name":"Live Results - \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B - SENART MULTIROTOR RACING","isPartOf":{"@id":"https:\/\/senart-multirotor-racing.com\/#website"},"datePublished":"2026-03-02T16:37:57+00:00","dateModified":"2026-03-04T03:43:21+00:00","breadcrumb":{"@id":"https:\/\/senart-multirotor-racing.com\/?page_id=1471#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/senart-multirotor-racing.com\/?page_id=1471"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/senart-multirotor-racing.com\/?page_id=1471#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/senart-multirotor-racing.com\/"},{"@type":"ListItem","position":2,"name":"Live Results &#8211; \u00a0FAI PARIS OPEN INTERNATIONAL DRONE SOCCER F9A-B"}]},{"@type":"WebSite","@id":"https:\/\/senart-multirotor-racing.com\/#website","url":"https:\/\/senart-multirotor-racing.com\/","name":"SENART MULTIROTOR RACING","description":"","publisher":{"@id":"https:\/\/senart-multirotor-racing.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/senart-multirotor-racing.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/senart-multirotor-racing.com\/#organization","name":"SENART MULTIROTOR RACING","url":"https:\/\/senart-multirotor-racing.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/senart-multirotor-racing.com\/#\/schema\/logo\/image\/","url":"https:\/\/senart-multirotor-racing.com\/wp-content\/uploads\/2025\/08\/cropped-Logo-pour-fond-noir.png","contentUrl":"https:\/\/senart-multirotor-racing.com\/wp-content\/uploads\/2025\/08\/cropped-Logo-pour-fond-noir.png","width":2294,"height":1352,"caption":"SENART MULTIROTOR RACING"},"image":{"@id":"https:\/\/senart-multirotor-racing.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/senartmultirotorracing\/?locale=fr_FR","https:\/\/discord.gg\/pcrYmAr","https:\/\/www.instagram.com\/senartmultirotorracing\/","https:\/\/www.youtube.com\/channel\/UC3qX1bKa-A5qpBAVtMZk2Dw"]}]}},"_links":{"self":[{"href":"https:\/\/senart-multirotor-racing.com\/index.php?rest_route=\/wp\/v2\/pages\/1471","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/senart-multirotor-racing.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/senart-multirotor-racing.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/senart-multirotor-racing.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/senart-multirotor-racing.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1471"}],"version-history":[{"count":10,"href":"https:\/\/senart-multirotor-racing.com\/index.php?rest_route=\/wp\/v2\/pages\/1471\/revisions"}],"predecessor-version":[{"id":1484,"href":"https:\/\/senart-multirotor-racing.com\/index.php?rest_route=\/wp\/v2\/pages\/1471\/revisions\/1484"}],"wp:attachment":[{"href":"https:\/\/senart-multirotor-racing.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}