From 5c6104093b2a84109ca0ec3d56522261ff11565d Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Fri, 27 Feb 2026 16:08:25 +0200 Subject: [PATCH 01/49] Ran - please work --- .../components/StartMatchLocallyButton.tsx | 106 ++++++++++++++++++ .../src/scouter/pages/tabs/ShiftTab.tsx | 2 +- 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx new file mode 100644 index 00000000..f4bc4349 --- /dev/null +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -0,0 +1,106 @@ +// בס"ד +import type React from "react"; +import { useEffect, useRef, useState, type Dispatch } from "react"; +import type { Interval } from "@repo/scouting_types"; + +const MILLLISECONDS_IN_A_SECOND = 1000; +const SECOND_IN_A_MINUTE = 60; +const INITIAL_TIME_MILLISECONDS = 0; +const CYCLE_TIME_MILLISECONDS = 10; +const DECIMAL_PLACES = 2; +const DECIMAL_PLACES_MILLISECONDS = 3; + +interface StartMatchLocallyButtonProps { + originTime: number; + disabled: boolean; +} + +const StartMatchLocallyButton: React.FC = ({ + originTime, + disabled +}) => { + const [isRunning, setIsRunning] = useState(false); + const [elapsedTime, setElapsedTime] = useState(INITIAL_TIME_MILLISECONDS); + + const startTimeRef = useRef(INITIAL_TIME_MILLISECONDS); + + const startCurrentCycleTime = useRef(INITIAL_TIME_MILLISECONDS); + + const reset = () => { + setElapsedTime(INITIAL_TIME_MILLISECONDS); + setIsRunning(false); + }; + + const calculateSeconds = () => { + return Math.floor( + (elapsedTime / MILLLISECONDS_IN_A_SECOND) % SECOND_IN_A_MINUTE, + ); + }; + + const calculateMilliSeconds = () => { + return Math.floor(elapsedTime % MILLLISECONDS_IN_A_SECOND); + }; + + const getCurrentRelativeTime = () => { + return Date.now() - originTime; + }; + + useEffect(() => { + if (!isRunning) { + return undefined; + } + const intervalId = window.setInterval(() => { + setElapsedTime(Date.now() - startTimeRef.current); + }, CYCLE_TIME_MILLISECONDS); + + return () => { + clearInterval(intervalId); + }; + }, [isRunning]); + + const start = () => { + if (isRunning || disabled) { + return; + } + const relativeTime = getCurrentRelativeTime(); + startCurrentCycleTime.current = relativeTime; + + startTimeRef.current = Date.now() - elapsedTime; + setIsRunning(true); + }; + + const stop = () => { + if (!isRunning) { + return; + } + setIsRunning(false); + reset(); + }; + + const formatTime = () => { + const seconds = String(calculateSeconds()).padStart(DECIMAL_PLACES, "0"); + const milliseconds = String(calculateMilliSeconds()).padStart( + DECIMAL_PLACES_MILLISECONDS, + "0", + ); + return `${seconds}:${milliseconds}`; + }; + return ( +
+
+ {formatTime()} +
+
+ ); +}; + +export default StartMatchLocallyButton; diff --git a/apps/scouting/frontend/src/scouter/pages/tabs/ShiftTab.tsx b/apps/scouting/frontend/src/scouter/pages/tabs/ShiftTab.tsx index f5a6a826..8a2705a8 100644 --- a/apps/scouting/frontend/src/scouter/pages/tabs/ShiftTab.tsx +++ b/apps/scouting/frontend/src/scouter/pages/tabs/ShiftTab.tsx @@ -10,7 +10,7 @@ import type { ShiftType, } from "@repo/scouting_types"; import { MovementForm } from "../../components/MovementForm"; -import Stopwatch from "../../components/stopwatch"; +import Stopwatch from "../../components/Stopwatch"; interface ShiftTabProps extends TabProps { tabIndex: number; From 414647039175a88c57d2ad574d8d5785d97dc824 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Fri, 27 Feb 2026 16:22:29 +0200 Subject: [PATCH 02/49] Ran - needs a bit of work before finishing --- apps/scouting/frontend/src/main.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index 54ad5ea5..ad2cedf5 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -5,13 +5,14 @@ import { createRoot } from "react-dom/client"; import "./index.css"; import { BrowserRouter } from "react-router-dom"; import App from "./App"; +import StartMatchLocallyButton from "./scouter/components/StartMatchLocallyButton"; // registerSW({ immediate: true }); createRoot(document.getElementById("root")!).render( - + , ); From a21535c0dfc2ab64d6558157c8fa2e033958a27f Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Mar 2026 17:58:35 +0200 Subject: [PATCH 03/49] Ran - the basic version works --- apps/scouting/frontend/src/main.tsx | 2 +- .../components/StartMatchLocallyButton.tsx | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index ad2cedf5..e5f8221d 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -12,7 +12,7 @@ import StartMatchLocallyButton from "./scouter/components/StartMatchLocallyButto createRoot(document.getElementById("root")!).render( - + , ); diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx index f4bc4349..deb67574 100644 --- a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -24,8 +24,6 @@ const StartMatchLocallyButton: React.FC = ({ const startTimeRef = useRef(INITIAL_TIME_MILLISECONDS); - const startCurrentCycleTime = useRef(INITIAL_TIME_MILLISECONDS); - const reset = () => { setElapsedTime(INITIAL_TIME_MILLISECONDS); setIsRunning(false); @@ -41,10 +39,6 @@ const StartMatchLocallyButton: React.FC = ({ return Math.floor(elapsedTime % MILLLISECONDS_IN_A_SECOND); }; - const getCurrentRelativeTime = () => { - return Date.now() - originTime; - }; - useEffect(() => { if (!isRunning) { return undefined; @@ -62,9 +56,6 @@ const StartMatchLocallyButton: React.FC = ({ if (isRunning || disabled) { return; } - const relativeTime = getCurrentRelativeTime(); - startCurrentCycleTime.current = relativeTime; - startTimeRef.current = Date.now() - elapsedTime; setIsRunning(true); }; @@ -77,6 +68,11 @@ const StartMatchLocallyButton: React.FC = ({ reset(); }; + const handleClick = ()=>{ + if (disabled) return; + isRunning? stop() : start(); + } + const formatTime = () => { const seconds = String(calculateSeconds()).padStart(DECIMAL_PLACES, "0"); const milliseconds = String(calculateMilliSeconds()).padStart( @@ -95,7 +91,7 @@ const StartMatchLocallyButton: React.FC = ({ font-mono font-semibold shadow-lg transition-all duration-150 ${disabled ? "bg-slate-800 text-slate-900" : isRunning ? "bg-emerald-500 text-white scale-95" : "bg-slate-800 text-green-400 hover:bg-slate-700"} `} - onClick={start} + onClick={handleClick} > {formatTime()} From adb5711c81f9a91c7bebb0e3c539dd8445de53e1 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Mar 2026 18:00:42 +0200 Subject: [PATCH 04/49] Ran - no linting errots --- .../scouter/components/StartMatchLocallyButton.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx index deb67574..0b91fb21 100644 --- a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -68,10 +68,15 @@ const StartMatchLocallyButton: React.FC = ({ reset(); }; - const handleClick = ()=>{ + const handleClick = () => { if (disabled) return; - isRunning? stop() : start(); - } + + if (isRunning) { + stop(); + } else { + start(); + } + }; const formatTime = () => { const seconds = String(calculateSeconds()).padStart(DECIMAL_PLACES, "0"); From 63fbb24e8044e7231d3165c0d9b301ac45482274 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Mar 2026 18:06:11 +0200 Subject: [PATCH 05/49] Ran - styling --- .../components/StartMatchLocallyButton.tsx | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx index 0b91fb21..8242078b 100644 --- a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -16,7 +16,6 @@ interface StartMatchLocallyButtonProps { } const StartMatchLocallyButton: React.FC = ({ - originTime, disabled }) => { const [isRunning, setIsRunning] = useState(false); @@ -65,7 +64,6 @@ const StartMatchLocallyButton: React.FC = ({ return; } setIsRunning(false); - reset(); }; const handleClick = () => { @@ -87,21 +85,38 @@ const StartMatchLocallyButton: React.FC = ({ return `${seconds}:${milliseconds}`; }; return ( -
+
- ); + {formatTime()} + + + + +); }; export default StartMatchLocallyButton; From 0773f77e4f314447609d12e5438a044220ef8a56 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Mar 2026 18:16:25 +0200 Subject: [PATCH 06/49] Ran - done styling hopefully --- apps/scouting/frontend/src/main.tsx | 2 +- .../components/StartMatchLocallyButton.tsx | 39 +++++++++---------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index e5f8221d..168a5d25 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -12,7 +12,7 @@ import StartMatchLocallyButton from "./scouter/components/StartMatchLocallyButto createRoot(document.getElementById("root")!).render( - + , ); diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx index 8242078b..e6a2bc64 100644 --- a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -11,7 +11,6 @@ const DECIMAL_PLACES = 2; const DECIMAL_PLACES_MILLISECONDS = 3; interface StartMatchLocallyButtonProps { - originTime: number; disabled: boolean; } @@ -84,33 +83,33 @@ const StartMatchLocallyButton: React.FC = ({ ); return `${seconds}:${milliseconds}`; }; - return ( -
- + + {/* Reset Button */} From 1c13396f675eccce6ad491cf32e8386b4a40c404 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Mar 2026 18:18:30 +0200 Subject: [PATCH 07/49] Ran - about to integrate the button --- .../src/scouter/components/StartMatchLocallyButton.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx index e6a2bc64..ccc241e9 100644 --- a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -96,7 +96,7 @@ return ( : isRunning ? "bg-blue-700" : "bg-blue-500 hover:bg-blue-600 active:bg-blue-700" - } text-white`} + } text-black`} > {formatTime()} @@ -109,7 +109,7 @@ return ( disabled ? "bg-gray-400 cursor-not-allowed" : "bg-blue-500 hover:bg-blue-600 active:bg-blue-700" - } text-white`} + } text-black`} > Reset From 0f9e0fe13743ec00b7cbb259363af252995a4c3a Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Mar 2026 18:20:17 +0200 Subject: [PATCH 08/49] Ran - starting to integrate --- apps/scouting/frontend/src/main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index 168a5d25..d3a27bf7 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -12,7 +12,7 @@ import StartMatchLocallyButton from "./scouter/components/StartMatchLocallyButto createRoot(document.getElementById("root")!).render( - + , ); From 9013613b0f86c3bc8b4232466b4fc95336d255e0 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Mar 2026 18:24:20 +0200 Subject: [PATCH 09/49] Ran - integrated, but should be static --- apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx b/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx index 09c59819..c1ca7c10 100644 --- a/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx +++ b/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx @@ -19,6 +19,7 @@ import { PostMatchTab } from "./tabs/PostMatchTab"; import { useNavigate } from "react-router-dom"; import { ClimbTab } from "./tabs/ClimbTab"; import { PreMatchTab } from "./tabs/PreMatchTab"; +import StartMatchLocallyButton from "../components/StartMatchLocallyButton"; export interface TabProps { setForm: Dispatch>; currentForm: ScoutingForm; @@ -34,6 +35,10 @@ const TABS: Tab[] = [ name: "Pre", Component: PreMatchTab, }, + { + name: "Start Match", + Component: () => + }, { name: "Auto", Component: (props) => , From 5c54191ebd08a6e527b051f6f6f855a1ef53d3e3 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Mar 2026 18:50:43 +0200 Subject: [PATCH 10/49] Ran - works. needs styling and to support minuts --- .../components/StartMatchLocallyButton.tsx | 123 +++++++++++------- 1 file changed, 79 insertions(+), 44 deletions(-) diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx index ccc241e9..eee0590a 100644 --- a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -9,19 +9,39 @@ const INITIAL_TIME_MILLISECONDS = 0; const CYCLE_TIME_MILLISECONDS = 10; const DECIMAL_PLACES = 2; const DECIMAL_PLACES_MILLISECONDS = 3; +const STORAGE_KEY = "match-timer"; interface StartMatchLocallyButtonProps { disabled: boolean; } const StartMatchLocallyButton: React.FC = ({ - disabled + disabled, }) => { - const [isRunning, setIsRunning] = useState(false); - const [elapsedTime, setElapsedTime] = useState(INITIAL_TIME_MILLISECONDS); + const [isRunning, setIsRunning] = useState(() => { + const saved = localStorage.getItem(STORAGE_KEY); + return saved ? JSON.parse(saved).isRunning : false; + }); - const startTimeRef = useRef(INITIAL_TIME_MILLISECONDS); + const [elapsedTime, setElapsedTime] = useState(() => { + const saved = localStorage.getItem(STORAGE_KEY); + return saved ? JSON.parse(saved).elapsedTime : INITIAL_TIME_MILLISECONDS; + }); + const startTimeRef = useRef(INITIAL_TIME_MILLISECONDS) + + useEffect(() => { + const savedRaw = localStorage.getItem(STORAGE_KEY); + if (!savedRaw) return; + + try { + const saved = JSON.parse(savedRaw) as { startTime?: number }; + startTimeRef.current = saved.startTime ?? INITIAL_TIME_MILLISECONDS; + } catch { + // ignore bad data + } +}, []); + const reset = () => { setElapsedTime(INITIAL_TIME_MILLISECONDS); setIsRunning(false); @@ -51,12 +71,22 @@ const StartMatchLocallyButton: React.FC = ({ }, [isRunning]); const start = () => { - if (isRunning || disabled) { - return; - } - startTimeRef.current = Date.now() - elapsedTime; - setIsRunning(true); - }; + if (isRunning || disabled) return; + + const newStartTime = Date.now() - elapsedTime; + startTimeRef.current = newStartTime; + + localStorage.setItem( + STORAGE_KEY, + JSON.stringify({ + isRunning: true, + elapsedTime, + startTime: newStartTime, + }), + ); + + setIsRunning(true); +}; const stop = () => { if (!isRunning) { @@ -65,7 +95,7 @@ const StartMatchLocallyButton: React.FC = ({ setIsRunning(false); }; - const handleClick = () => { + const handleClick = () => { if (disabled) return; if (isRunning) { @@ -75,6 +105,13 @@ const StartMatchLocallyButton: React.FC = ({ } }; + useEffect(() => { + localStorage.setItem( + STORAGE_KEY, + JSON.stringify({ isRunning, elapsedTime }), + ); + }, [isRunning, elapsedTime]); + const formatTime = () => { const seconds = String(calculateSeconds()).padStart(DECIMAL_PLACES, "0"); const milliseconds = String(calculateMilliSeconds()).padStart( @@ -83,39 +120,37 @@ const StartMatchLocallyButton: React.FC = ({ ); return `${seconds}:${milliseconds}`; }; -return ( -
- - {/* Timer Button */} - - - {/* Reset Button */} - - -
-); + return ( +
+ {/* Timer Button */} + + + {/* Reset Button */} + +
+ ); }; export default StartMatchLocallyButton; From 4853af098ede9d22e30d736a822c445453efe2b0 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Mon, 2 Mar 2026 17:19:51 +0200 Subject: [PATCH 11/49] Ran - added minutes measurement --- .../components/StartMatchLocallyButton.tsx | 63 ++++++++++--------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx index eee0590a..ed4a3d9f 100644 --- a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -28,25 +28,31 @@ const StartMatchLocallyButton: React.FC = ({ return saved ? JSON.parse(saved).elapsedTime : INITIAL_TIME_MILLISECONDS; }); - const startTimeRef = useRef(INITIAL_TIME_MILLISECONDS) + const startTimeRef = useRef(INITIAL_TIME_MILLISECONDS); useEffect(() => { - const savedRaw = localStorage.getItem(STORAGE_KEY); - if (!savedRaw) return; - - try { - const saved = JSON.parse(savedRaw) as { startTime?: number }; - startTimeRef.current = saved.startTime ?? INITIAL_TIME_MILLISECONDS; - } catch { - // ignore bad data - } -}, []); - + const savedRaw = localStorage.getItem(STORAGE_KEY); + if (!savedRaw) return; + + try { + const saved = JSON.parse(savedRaw) as { startTime?: number }; + startTimeRef.current = saved.startTime ?? INITIAL_TIME_MILLISECONDS; + } catch { + // ignore bad data + } + }, []); + const reset = () => { setElapsedTime(INITIAL_TIME_MILLISECONDS); setIsRunning(false); }; + const calculateMinutes = () => { + return Math.floor( + (elapsedTime / MILLLISECONDS_IN_A_SECOND) / SECOND_IN_A_MINUTE, + ); + }; + const calculateSeconds = () => { return Math.floor( (elapsedTime / MILLLISECONDS_IN_A_SECOND) % SECOND_IN_A_MINUTE, @@ -71,22 +77,22 @@ const StartMatchLocallyButton: React.FC = ({ }, [isRunning]); const start = () => { - if (isRunning || disabled) return; - - const newStartTime = Date.now() - elapsedTime; - startTimeRef.current = newStartTime; - - localStorage.setItem( - STORAGE_KEY, - JSON.stringify({ - isRunning: true, - elapsedTime, - startTime: newStartTime, - }), - ); + if (isRunning || disabled) return; - setIsRunning(true); -}; + const newStartTime = Date.now() - elapsedTime; + startTimeRef.current = newStartTime; + + localStorage.setItem( + STORAGE_KEY, + JSON.stringify({ + isRunning: true, + elapsedTime, + startTime: newStartTime, + }), + ); + + setIsRunning(true); + }; const stop = () => { if (!isRunning) { @@ -113,12 +119,13 @@ const StartMatchLocallyButton: React.FC = ({ }, [isRunning, elapsedTime]); const formatTime = () => { + const minutes = String(calculateMinutes()).padStart(DECIMAL_PLACES, "0"); const seconds = String(calculateSeconds()).padStart(DECIMAL_PLACES, "0"); const milliseconds = String(calculateMilliSeconds()).padStart( DECIMAL_PLACES_MILLISECONDS, "0", ); - return `${seconds}:${milliseconds}`; + return `${minutes}:${seconds}:${milliseconds}`; }; return (
From 41fde2ce70182bdc1f124145dc3d54fe5e836cad Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Mar 2026 17:20:44 +0200 Subject: [PATCH 12/49] Ran - now the time is globa; --- .../components/StartMatchLocallyButton.tsx | 132 +++--------------- .../src/scouter/hooks/useMatchTimer.ts | 112 +++++++++++++++ 2 files changed, 131 insertions(+), 113 deletions(-) create mode 100644 apps/scouting/frontend/src/scouter/hooks/useMatchTimer.ts diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx index ed4a3d9f..a478e9c3 100644 --- a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -1,15 +1,13 @@ // בס"ד import type React from "react"; -import { useEffect, useRef, useState, type Dispatch } from "react"; -import type { Interval } from "@repo/scouting_types"; +import { useMemo } from "react"; +import { useMatchTimer } from "../hooks/useMatchTimer"; // adjust path + +const MILLISECONDS_IN_A_SECOND = 1000; +const SECONDS_IN_A_MINUTE = 60; -const MILLLISECONDS_IN_A_SECOND = 1000; -const SECOND_IN_A_MINUTE = 60; -const INITIAL_TIME_MILLISECONDS = 0; -const CYCLE_TIME_MILLISECONDS = 10; const DECIMAL_PLACES = 2; const DECIMAL_PLACES_MILLISECONDS = 3; -const STORAGE_KEY = "match-timer"; interface StartMatchLocallyButtonProps { disabled: boolean; @@ -18,118 +16,27 @@ interface StartMatchLocallyButtonProps { const StartMatchLocallyButton: React.FC = ({ disabled, }) => { - const [isRunning, setIsRunning] = useState(() => { - const saved = localStorage.getItem(STORAGE_KEY); - return saved ? JSON.parse(saved).isRunning : false; - }); - - const [elapsedTime, setElapsedTime] = useState(() => { - const saved = localStorage.getItem(STORAGE_KEY); - return saved ? JSON.parse(saved).elapsedTime : INITIAL_TIME_MILLISECONDS; - }); - - const startTimeRef = useRef(INITIAL_TIME_MILLISECONDS); - - useEffect(() => { - const savedRaw = localStorage.getItem(STORAGE_KEY); - if (!savedRaw) return; - - try { - const saved = JSON.parse(savedRaw) as { startTime?: number }; - startTimeRef.current = saved.startTime ?? INITIAL_TIME_MILLISECONDS; - } catch { - // ignore bad data - } - }, []); - - const reset = () => { - setElapsedTime(INITIAL_TIME_MILLISECONDS); - setIsRunning(false); - }; - - const calculateMinutes = () => { - return Math.floor( - (elapsedTime / MILLLISECONDS_IN_A_SECOND) / SECOND_IN_A_MINUTE, - ); - }; - - const calculateSeconds = () => { - return Math.floor( - (elapsedTime / MILLLISECONDS_IN_A_SECOND) % SECOND_IN_A_MINUTE, - ); - }; - - const calculateMilliSeconds = () => { - return Math.floor(elapsedTime % MILLLISECONDS_IN_A_SECOND); - }; + const { isRunning, elapsedMs, start, stop, reset } = useMatchTimer(10); - useEffect(() => { - if (!isRunning) { - return undefined; - } - const intervalId = window.setInterval(() => { - setElapsedTime(Date.now() - startTimeRef.current); - }, CYCLE_TIME_MILLISECONDS); + const formatTime = useMemo(() => { + const minutes = Math.floor(elapsedMs / MILLISECONDS_IN_A_SECOND / SECONDS_IN_A_MINUTE); + const seconds = Math.floor(elapsedMs / MILLISECONDS_IN_A_SECOND) % SECONDS_IN_A_MINUTE; + const milliseconds = Math.floor(elapsedMs % MILLISECONDS_IN_A_SECOND); - return () => { - clearInterval(intervalId); - }; - }, [isRunning]); - - const start = () => { - if (isRunning || disabled) return; - - const newStartTime = Date.now() - elapsedTime; - startTimeRef.current = newStartTime; - - localStorage.setItem( - STORAGE_KEY, - JSON.stringify({ - isRunning: true, - elapsedTime, - startTime: newStartTime, - }), - ); - - setIsRunning(true); - }; - - const stop = () => { - if (!isRunning) { - return; - } - setIsRunning(false); - }; + return `${String(minutes).padStart(DECIMAL_PLACES, "0")}:${String(seconds).padStart( + DECIMAL_PLACES, + "0", + )}:${String(milliseconds).padStart(DECIMAL_PLACES_MILLISECONDS, "0")}`; + }, [elapsedMs]); const handleClick = () => { if (disabled) return; - - if (isRunning) { - stop(); - } else { - start(); - } + if (isRunning) stop(); + else start(); }; - useEffect(() => { - localStorage.setItem( - STORAGE_KEY, - JSON.stringify({ isRunning, elapsedTime }), - ); - }, [isRunning, elapsedTime]); - - const formatTime = () => { - const minutes = String(calculateMinutes()).padStart(DECIMAL_PLACES, "0"); - const seconds = String(calculateSeconds()).padStart(DECIMAL_PLACES, "0"); - const milliseconds = String(calculateMilliSeconds()).padStart( - DECIMAL_PLACES_MILLISECONDS, - "0", - ); - return `${minutes}:${seconds}:${milliseconds}`; - }; return (
- {/* Timer Button */} - {/* Reset Button */} @@ -54,11 +63,14 @@ const StartMatchLocallyButton: React.FC = ({ @@ -66,4 +78,4 @@ const StartMatchLocallyButton: React.FC = ({ ); }; -export default StartMatchLocallyButton; \ No newline at end of file +export default StartMatchLocallyButton; From 74ed11e984e5516cf160b2d1593c3a04d9df8cf9 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Mon, 9 Mar 2026 19:30:51 +0200 Subject: [PATCH 32/49] Ran - changed the alert color --- apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx b/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx index 95d9e26c..d6031791 100644 --- a/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx +++ b/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx @@ -257,7 +257,7 @@ export const ScoutMatch: FC = () => { useEffect(() => { setBackgroundColor( - hasShiftJustEnded(elapsedMs) ? "bg-red-500/40" : "bg-black/40", + hasShiftJustEnded(elapsedMs) ? "bg-amber-400/40" : "bg-black/40", ); if (activeTabIndex === 1) return; From 12fcc6f0915a368ac10f285c730ee7f5b2da4b94 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Mon, 9 Mar 2026 19:54:12 +0200 Subject: [PATCH 33/49] Ran - fixed the game schedule constants --- .../frontend/src/scouter/pages/ScoutMatch.tsx | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx b/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx index d6031791..c690bdaf 100644 --- a/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx +++ b/apps/scouting/frontend/src/scouter/pages/ScoutMatch.tsx @@ -175,13 +175,14 @@ const SideBar: FC = ({ setActiveTab, activeTabIndex }) => { }; export type ShiftNumber = 1 | 2 | 3 | 4 | 5 | 6 | 7; -const AUTO_END = 20000; -const TRANSITION_END = 30000; -const MATCH_END = 160000; +const AUTO_END = 20_000; +const TRANSITION_END = 30_000; -const TELEOP_DURATION = MATCH_END - TRANSITION_END; -const TELEOP_SHIFT_COUNT = 4; -const TELEOP_SHIFT_LENGTH = TELEOP_DURATION / TELEOP_SHIFT_COUNT; +const SHIFT_1_END = 55_000; +const SHIFT_2_END = 80_000; +const SHIFT_3_END = 105_000; +const SHIFT_4_END = 130_000; +const MATCH_END = 160_000; export const createNewScoutingForm = ( savedInfo?: Partial, ): ScoutingForm => structuredClone({ ...defaultScoutForm, ...savedInfo }); @@ -201,10 +202,10 @@ export const ScoutMatch: FC = () => { const SHIFT_END_TIME_MS: Record = { 1: AUTO_END, 2: TRANSITION_END, - 3: TRANSITION_END + TELEOP_SHIFT_LENGTH * 1, - 4: TRANSITION_END + TELEOP_SHIFT_LENGTH * 2, - 5: TRANSITION_END + TELEOP_SHIFT_LENGTH * 3, - 6: TRANSITION_END + TELEOP_DURATION, + 3: SHIFT_1_END, + 4: SHIFT_2_END, + 5: SHIFT_3_END, + 6: SHIFT_4_END, 7: MATCH_END, }; @@ -213,10 +214,10 @@ export const ScoutMatch: FC = () => { const SHIFT_EXTRA_END_TIME_MS: Record = { 1: AUTO_END + MILLISECONDS_IN_FIVE_SECONDS, 2: TRANSITION_END + MILLISECONDS_IN_FIVE_SECONDS, - 3: TRANSITION_END + TELEOP_SHIFT_LENGTH * 1 + MILLISECONDS_IN_FIVE_SECONDS, - 4: TRANSITION_END + TELEOP_SHIFT_LENGTH * 2 + MILLISECONDS_IN_FIVE_SECONDS, - 5: TRANSITION_END + TELEOP_SHIFT_LENGTH * 3 + MILLISECONDS_IN_FIVE_SECONDS, - 6: TRANSITION_END + TELEOP_DURATION + MILLISECONDS_IN_FIVE_SECONDS, + 3: SHIFT_1_END + MILLISECONDS_IN_FIVE_SECONDS, + 4: SHIFT_2_END + MILLISECONDS_IN_FIVE_SECONDS, + 5: SHIFT_3_END + MILLISECONDS_IN_FIVE_SECONDS, + 6: SHIFT_4_END + MILLISECONDS_IN_FIVE_SECONDS, 7: MATCH_END, }; @@ -270,8 +271,8 @@ export const ScoutMatch: FC = () => { if (elapsedMs <= SHIFT_EXTRA_END_TIME_MS[5]) return setActiveTab(6); if (elapsedMs <= SHIFT_EXTRA_END_TIME_MS[6]) return setActiveTab(7); if (elapsedMs <= SHIFT_EXTRA_END_TIME_MS[7]) return setActiveTab(8); + setActiveTab(9) - setActiveTab(9); }, [elapsedMs, activeTabIndex]); return (
Date: Wed, 11 Mar 2026 23:35:00 +0200 Subject: [PATCH 34/49] Ran - changed a name to be more informative according to Yoni's CR --- .../src/scouter/components/StartMatchLocallyButton.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx index 74129207..ec50e592 100644 --- a/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx +++ b/apps/scouting/frontend/src/scouter/components/StartMatchLocallyButton.tsx @@ -19,7 +19,7 @@ const StartMatchLocallyButton: React.FC = ({ const { isRunning, elapsedMs, start, stop, reset } = useMatchTimer(ITERATION_PERIOD_MS); - const formatTime = useMemo(() => { + const formattedTime = useMemo(() => { const minutes = Math.floor( elapsedMs / MILLISECONDS_IN_A_SECOND / SECONDS_IN_A_MINUTE, ); @@ -57,7 +57,7 @@ const StartMatchLocallyButton: React.FC = ({ } `} > - {formatTime} + {formattedTime}
diff --git a/apps/scouting/frontend/src/scouter/pages/tabs/PostMatchTab.tsx b/apps/scouting/frontend/src/scouter/pages/tabs/PostMatchTab.tsx index 5100d127..1bf74fc4 100644 --- a/apps/scouting/frontend/src/scouter/pages/tabs/PostMatchTab.tsx +++ b/apps/scouting/frontend/src/scouter/pages/tabs/PostMatchTab.tsx @@ -12,7 +12,11 @@ const BUTTON_STYLES = `px-8 py-3 text-base font-bold text-black active:scale-95 border rounded-xl bg-linear-to-r`; -export const PostMatchTab: FC = ({ setForm, currentForm }) => { +export const PostMatchTab: FC = ({ + setForm, + currentForm, + resetTime, +}) => { const [_scoutingForms, setScoutingForms] = useLocalStorage( "scouted_forms", [], @@ -21,6 +25,7 @@ export const PostMatchTab: FC = ({ setForm, currentForm }) => { const navigate = useNavigate(); const handleSubmit = async () => { + resetTime(); setForm(createNewScoutingForm({ scouterName: currentForm.scouterName })); setScoutingForms((prev) => [...prev, currentForm]); await navigate("/"); @@ -91,6 +96,7 @@ export const PostMatchTab: FC = ({ setForm, currentForm }) => { {isPopUpVisible && ( { + resetTime(); setForm( createNewScoutingForm({ scouterName: currentForm.scouterName }), ); From 9d62e16f53262a9e8060f737a1fb8434683c91cd Mon Sep 17 00:00:00 2001 From: YoniKiriaty Date: Fri, 3 Apr 2026 08:28:56 +0300 Subject: [PATCH 43/49] Yoni - working test matches --- .../scouting/backend/src/routes/tba-router.ts | 1 - .../src/scouter/pages/tabs/PreMatchTab.tsx | 140 +++++++++++++++++- 2 files changed, 139 insertions(+), 2 deletions(-) diff --git a/apps/scouting/backend/src/routes/tba-router.ts b/apps/scouting/backend/src/routes/tba-router.ts index f4ec863c..eb6955a0 100644 --- a/apps/scouting/backend/src/routes/tba-router.ts +++ b/apps/scouting/backend/src/routes/tba-router.ts @@ -146,7 +146,6 @@ const getMatches = flow( ), ); - export const fetchCOPRS = (event: string) => pipe( fetchTba(`/event/${event}/coprs`, eventOPRCodec), diff --git a/apps/scouting/frontend/src/scouter/pages/tabs/PreMatchTab.tsx b/apps/scouting/frontend/src/scouter/pages/tabs/PreMatchTab.tsx index c491fb82..6f1ded32 100644 --- a/apps/scouting/frontend/src/scouter/pages/tabs/PreMatchTab.tsx +++ b/apps/scouting/frontend/src/scouter/pages/tabs/PreMatchTab.tsx @@ -90,6 +90,144 @@ const matchMatchWithTeamNumber = ( return allianceArr[index] ?? DEFAULT_TEAM_NUMBER; }; +const BASE_GAME: TBAMatches2026[number] = { + actual_time: 1773016179, + alliances: { + blue: { + dq_team_keys: [], + score: 274, + surrogate_team_keys: [], + team_keys: ["frc971", "frc604", "frc7413"], + }, + red: { + dq_team_keys: [], + score: 454, + surrogate_team_keys: [], + team_keys: ["frc5760", "frc1678", "frc9470"], + }, + }, + comp_level: "qm", + event_key: "2026cahal", + key: "2026cahal_f1m1", + match_number: 1, + post_result_time: 1773016377, + predicted_time: 1773015850, + score_breakdown: { + blue: { + adjustPoints: 0, + autoTowerPoints: 0, + autoTowerRobot1: "None", + autoTowerRobot2: "None", + autoTowerRobot3: "None", + endGameTowerPoints: 0, + endGameTowerRobot1: "None", + endGameTowerRobot2: "None", + endGameTowerRobot3: "None", + energizedAchieved: false, + foulPoints: 35, + hubScore: { + uncounted: 0, + }, + majorFoulCount: 2, + minorFoulCount: 4, + penalties: "None", + rp: 0, + superchargedAchieved: false, + totalAutoPoints: 44, + totalPoints: 274, + totalTeleopPoints: 195, + totalTowerPoints: 0, + traversalAchieved: false, + }, + red: { + adjustPoints: 0, + autoTowerPoints: 0, + autoTowerRobot1: "None", + autoTowerRobot2: "None", + autoTowerRobot3: "None", + endGameTowerPoints: 0, + endGameTowerRobot1: "None", + endGameTowerRobot2: "None", + endGameTowerRobot3: "None", + energizedAchieved: false, + foulPoints: 50, + hubScore: { + uncounted: 37, + }, + majorFoulCount: 0, + minorFoulCount: 7, + penalties: "None", + rp: 0, + superchargedAchieved: false, + totalAutoPoints: 107, + totalPoints: 454, + totalTeleopPoints: 297, + totalTowerPoints: 0, + traversalAchieved: false, + }, + }, + set_number: 1, + time: 1773012240, + videos: [ + { + key: "ZN1shh2QF9k", + type: "youtube", + }, + ], + winning_alliance: "red", +}; + +const makeGame = ( + teams: { + red: [number, number, number]; + blue: [number, number, number]; + }, + qual: number, +) => ({ + ...BASE_GAME, + match_number: qual, + alliances: { + blue: { + dq_team_keys: [], + score: 274, + surrogate_team_keys: [], + team_keys: [ + `frc${teams.blue[0]}`, + `frc${teams.blue[1]}`, + `frc${teams.blue[2]}`, + ], + }, + red: { + dq_team_keys: [], + score: 454, + surrogate_team_keys: [], + team_keys: [ + `frc${teams.red[0]}`, + `frc${teams.red[1]}`, + `frc${teams.red[2]}`, + ], + }, + }, +}); +const TESTING_COMP_MATCHES: TBAMatches2026 = [ + makeGame({ blue: [5614, 7039, 2231], red: [5987, 2630, 3075] }, 1), + makeGame({ blue: [5951, 4590, 1690], red: [1577, 4744, 10935] }, 2), + makeGame({ blue: [2231, 1690, 1577], red: [5614, 3075, 5951] }, 3), + makeGame({ blue: [2630, 4590, 4744], red: [10935, 5987, 7039] }, 4), + makeGame({ blue: [4744, 2231, 4590], red: [7039, 5951, 5614] }, 5), + makeGame({ blue: [1577, 2630, 5987], red: [10935, 1690, 3075] }, 6), + makeGame({ blue: [4590, 10935, 5614], red: [1690, 3075, 7039] }, 7), + makeGame({ blue: [4744, 5987, 2231], red: [2630, 1577, 5951] }, 8), + makeGame({ blue: [5951, 5987, 4590], red: [3075, 7039, 1577] }, 9), + makeGame({ blue: [4744, 1690, 5614], red: [2231, 10935, 2630] }, 10), + makeGame({ blue: [1690, 2231, 5987], red: [4590, 3075, 4744] }, 11), + makeGame({ blue: [10935, 5951, 1577], red: [7039, 5614, 2630] }, 12), + makeGame({ blue: [5951, 10935, 4744], red: [5987, 5614, 3075] }, 13), + makeGame({ blue: [1690, 2231, 2630], red: [7039, 1577, 4590] }, 14), + makeGame({ blue: [5987, 4744, 7039], red: [5614, 1577, 1690] }, 15), + makeGame({ blue: [2630, 4590, 10935], red: [3075, 5951, 2231] }, 16), +]; + const MATCH_ADJUSTMENT_OFFSET = 1; const PreMatchTab: FC = ({ currentForm: form, @@ -103,7 +241,7 @@ const PreMatchTab: FC = ({ }); const [tbaMatches, setTbaMatches] = useLocalStorage( "tbaMatches", - [], + TESTING_COMP_MATCHES, ); const [match, setMatch] = useState(form.match); From 446274ac586516c378dc33468348731a03c90c1f Mon Sep 17 00:00:00 2001 From: YoniKiriaty Date: Fri, 3 Apr 2026 08:39:57 +0300 Subject: [PATCH 44/49] Yoni - added submit to bps --- .../components/bps-components/BpsBase.tsx | 1 + .../components/bps-components/Counter.tsx | 54 ++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/apps/scouting/frontend/src/scouter/components/bps-components/BpsBase.tsx b/apps/scouting/frontend/src/scouter/components/bps-components/BpsBase.tsx index 1ab43c1b..34cb15eb 100644 --- a/apps/scouting/frontend/src/scouter/components/bps-components/BpsBase.tsx +++ b/apps/scouting/frontend/src/scouter/components/bps-components/BpsBase.tsx @@ -30,6 +30,7 @@ function App() {
+
); diff --git a/apps/scouting/frontend/src/scouter/components/bps-components/Counter.tsx b/apps/scouting/frontend/src/scouter/components/bps-components/Counter.tsx index fdab9c82..51ba2eb5 100644 --- a/apps/scouting/frontend/src/scouter/components/bps-components/Counter.tsx +++ b/apps/scouting/frontend/src/scouter/components/bps-components/Counter.tsx @@ -2,6 +2,7 @@ import React from "react"; import Burst from "./Burst"; import type { VideoPlayerHandle } from "@repo/video-utils"; +import type { BPS } from "@repo/scouting_types"; interface CounterProps { playerRef?: React.RefObject; @@ -29,8 +30,12 @@ const Counter: React.FC = ({ playerRef }) => { }, ]); - const [currentBurstIndex, setCurrentBurstIndex] = - React.useState(COUNTER_STARTING_VALUE); + const [team, setTeam] = React.useState(0); + const [match, setMatch] = React.useState(0); + + const [currentBurstIndex, setCurrentBurstIndex] = React.useState( + COUNTER_STARTING_VALUE, + ); const updateCurrentBurst = (updatedBurst: BurstData) => { const copy = [...burstsArray]; @@ -90,6 +95,51 @@ const Counter: React.FC = ({ playerRef }) => { > {">>>"} + { + setTeam(Number(event.currentTarget.value)); + }} + placeholder="Enter Team" + > + { + setMatch(Number(event.currentTarget.value)); + }} + placeholder="Enter Match" + > + From 94de59697e25ba96929e0343510c07374b202801 Mon Sep 17 00:00:00 2001 From: YoniKiriaty Date: Fri, 3 Apr 2026 08:41:40 +0300 Subject: [PATCH 45/49] Yoni - fixed type imports --- packages/scouting_types/tba/MatchNumbering.ts | 4 ++-- packages/scouting_types/teams/index.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/scouting_types/tba/MatchNumbering.ts b/packages/scouting_types/tba/MatchNumbering.ts index 3a0fbc15..0fefecb3 100644 --- a/packages/scouting_types/tba/MatchNumbering.ts +++ b/packages/scouting_types/tba/MatchNumbering.ts @@ -1,6 +1,6 @@ // בס"ד -import { Match } from "../rebuilt"; -import { TBAMatch } from "./TBAMatch"; +import type { Match } from "../rebuilt"; +import type { TBAMatch } from "./TBAMatch"; const PLAYOFF_MATCHES_UNTIL_FINALS = 13; diff --git a/packages/scouting_types/teams/index.ts b/packages/scouting_types/teams/index.ts index fbac5094..10b4dabd 100644 --- a/packages/scouting_types/teams/index.ts +++ b/packages/scouting_types/teams/index.ts @@ -9,8 +9,8 @@ import type { TeleClimb, TeleMovement, } from "../rebuilt"; -import { TeamOPR } from "../tba"; -import { EPA } from "../epa"; +import type { TeamOPR } from "../tba"; +import type { EPA } from "../epa"; export const teamsProps = t.type({ teams: t.union([t.array(t.number), t.number]), From 2c75148bec94928c7cd3e9ff62879f00c8b93054 Mon Sep 17 00:00:00 2001 From: YoniKiriaty Date: Fri, 3 Apr 2026 11:45:39 +0300 Subject: [PATCH 46/49] Yoni - fixed some issues --- apps/scouting/backend/docker-compose.yml | 8 +++--- .../src/fuel/calculations/fuel-averaging.ts | 26 +++++++++++-------- apps/scouting/backend/src/fuel/fuel-object.ts | 18 +++++++------ .../scouting/backend/src/routes/bps-router.ts | 15 +++++++++++ .../backend/src/routes/teams-router.ts | 4 +-- apps/scouting/frontend/docker-compose.yml | 1 + 6 files changed, 47 insertions(+), 25 deletions(-) diff --git a/apps/scouting/backend/docker-compose.yml b/apps/scouting/backend/docker-compose.yml index 75848956..960d1eae 100644 --- a/apps/scouting/backend/docker-compose.yml +++ b/apps/scouting/backend/docker-compose.yml @@ -1,16 +1,16 @@ -name: gbscout services: backend: + image: greenblitz/gbscout-backend build: context: . dockerfile: Dockerfile networks: - scouting-shared env_file: - - ../../../.public.env - - ../../../.secret.env + - .public.env + - .secret.env ports: - - "${BACKEND_PORT}:4590" # Maps host:${BACKEND_PORT} to container:4590 + - "4590:4590" # Maps host:${BACKEND_PORT} to container:4590 depends_on: - mongodb environment: diff --git a/apps/scouting/backend/src/fuel/calculations/fuel-averaging.ts b/apps/scouting/backend/src/fuel/calculations/fuel-averaging.ts index 3f5f4eac..172ada88 100644 --- a/apps/scouting/backend/src/fuel/calculations/fuel-averaging.ts +++ b/apps/scouting/backend/src/fuel/calculations/fuel-averaging.ts @@ -17,7 +17,7 @@ import { convertPixelToCentimeters, distanceFromHub } from "@repo/rebuilt_map"; import { interpolateQuadratic } from "./interpolation"; interface ShotStats { - durationMilliseconds: number; + durationSeconds: number; hubDistanceCentimeters: number; } @@ -27,7 +27,7 @@ const NO_FUEL_COLLECTED = 0; const FIRST_SECTION_AMOUNT = 1; const ONE_SECTION_ONLY_LENGTH = 1; -/** +/** * @param sections consists of sections that contains a list of timestamps in ms * @returns mean ball amount * Recursively calculates mean ball amount from timestamp sections. */ @@ -98,15 +98,17 @@ const calculateAccuracies = (sections: BPS["events"], shotDuration: number) => { (accuracy1, accuracy2) => accuracy1.distance - accuracy2.distance, ); + console.log(durationedSections); return sortedAccuracies; }; const compareSections = (section1: number[], section2: number[]) => lastElement(section1) - lastElement(section2); -const correctSectionToTimeFromEnd = (sections: number[]) => { - const endTimestamp = lastElement(sections); - return sections.map((timestamp) => endTimestamp - timestamp).reverse(); +const correctSectionToTimeFromEnd = (section: number[]) => { + const sortedSection = section.sort(); + const endTimestamp = lastElement(sortedSection); + return sortedSection.map((timestamp) => endTimestamp - timestamp).reverse(); }; const formatSections = (sections: BPS["events"]) => @@ -120,8 +122,6 @@ const formatSections = (sections: BPS["events"]) => compareSections(formattedSection1.shoot, formattedSection2.shoot), ); -const MILLISECONDS_IN_SECONDS = 1000; - export const calculateAverageBPS = (bpses: BPS[]) => { const formattedSections = formatSections(bpses.flatMap((bps) => bps.events)); @@ -136,9 +136,11 @@ export const calculateAverageBPS = (bpses: BPS[]) => { longestSectionDuration, ); - return (shotAmount * MILLISECONDS_IN_SECONDS) / longestSectionDuration; + return shotAmount / longestSectionDuration; }; +const MILLISECONDS_IN_SECOND = 1000; + /** Calculates fuel statistics by averaging across multiple matches. */ export const calculateFuelByAveraging = ( shot: ShootEvent, @@ -146,7 +148,8 @@ export const calculateFuelByAveraging = ( sections: BPSEvent[], ): Partial => { const shotStats: ShotStats = { - durationMilliseconds: shot.interval.end - shot.interval.start, + durationSeconds: + (shot.interval.end - shot.interval.start) / MILLISECONDS_IN_SECOND, hubDistanceCentimeters: distanceFromHub( convertPixelToCentimeters(firstElement(shot.positions)), ), @@ -156,7 +159,7 @@ export const calculateFuelByAveraging = ( const shotAmount = calculateBallAmount( formattedSections.map((section) => section.shoot), - shotStats.durationMilliseconds, + shotStats.durationSeconds, ); if (isPass) { @@ -166,9 +169,10 @@ export const calculateFuelByAveraging = ( positions: shot.positions, }; } + const scoredAccuracy = interpolateQuadratic( shotStats.hubDistanceCentimeters, - calculateAccuracies(formattedSections, shotStats.durationMilliseconds).map( + calculateAccuracies(formattedSections, shotStats.durationSeconds).map( ({ distance, accuracy }) => ({ x: distance, y: accuracy }), ), ); diff --git a/apps/scouting/backend/src/fuel/fuel-object.ts b/apps/scouting/backend/src/fuel/fuel-object.ts index c5741c87..940f1bea 100644 --- a/apps/scouting/backend/src/fuel/fuel-object.ts +++ b/apps/scouting/backend/src/fuel/fuel-object.ts @@ -29,19 +29,21 @@ const putDefaultsInFuel = (fuel: Partial) => ({ export const createFuelObject = ( shot: ShootEvent, - match: Match, + _match: Match, bpses: BPS[], ): FuelObject => { - const sameMatch = bpses.find( - (value) => - value.match.number === match.number && value.match.type === match.type, - ); + // const sameMatch = bpses.find( + // (value) => + // value.match.number === match.number && value.match.type === match.type, + // ); const isPass = isShotPass(shot.positions); - const partialFuel = sameMatch - ? calculateFuelByMatch(shot, isPass, sameMatch) - : calculateFuelByAveraging( + const partialFuel = + // sameMatch + // ? calculateFuelByMatch(shot, isPass, sameMatch) + // : + calculateFuelByAveraging( shot, isPass, bpses.flatMap((bps) => bps.events), diff --git a/apps/scouting/backend/src/routes/bps-router.ts b/apps/scouting/backend/src/routes/bps-router.ts index fe2c0d2f..79903b7e 100644 --- a/apps/scouting/backend/src/routes/bps-router.ts +++ b/apps/scouting/backend/src/routes/bps-router.ts @@ -114,6 +114,21 @@ bpsRouter.get("/matches", async (req, res) => { )(); }); +bpsRouter.get("/", async (req, res) => { + await pipe( + getBPSCollection(), + flatTryCatch( + (collection) => collection.find().toArray(), + (error) => ({ + status: StatusCodes.INTERNAL_SERVER_ERROR, + reason: `Recieved Error: ${String(error)}`, + }), + ), + bindTo("bpses"), + foldResponse(res), + )(); +}); + bpsRouter.post("/", async (req, res) => { await pipe( rightEither(req), diff --git a/apps/scouting/backend/src/routes/teams-router.ts b/apps/scouting/backend/src/routes/teams-router.ts index 0eb9bb58..ce96781d 100644 --- a/apps/scouting/backend/src/routes/teams-router.ts +++ b/apps/scouting/backend/src/routes/teams-router.ts @@ -195,11 +195,11 @@ teamsRouter.get("/", async (req, res) => { ), ), flatMap(getTeamBPSes), - flatMap(fetchTeamsCOPRs), + // flatMap(fetchTeamsCOPRs), flatMap(getTeamsEPAs), map((teams) => mapObject(teams, (team) => - processTeam(team.bpses, team.forms, team.coprs, team.epa), + processTeam(team.bpses, team.forms, undefined, undefined), ), ), bindTo("teams"), diff --git a/apps/scouting/frontend/docker-compose.yml b/apps/scouting/frontend/docker-compose.yml index c504343f..afb09760 100644 --- a/apps/scouting/frontend/docker-compose.yml +++ b/apps/scouting/frontend/docker-compose.yml @@ -1,6 +1,7 @@ name: gbscout services: frontend: + image: greenblitz/gbscout-frontend build: context: . dockerfile: Dockerfile From 3df248a698f5b4cc63381559d3c431f3476461de Mon Sep 17 00:00:00 2001 From: YoniKiriaty Date: Fri, 3 Apr 2026 12:18:31 +0300 Subject: [PATCH 47/49] Yoni - fixed scored amount (interpolation) --- .../src/fuel/calculations/fuel-averaging.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/apps/scouting/backend/src/fuel/calculations/fuel-averaging.ts b/apps/scouting/backend/src/fuel/calculations/fuel-averaging.ts index 172ada88..a03b4559 100644 --- a/apps/scouting/backend/src/fuel/calculations/fuel-averaging.ts +++ b/apps/scouting/backend/src/fuel/calculations/fuel-averaging.ts @@ -94,11 +94,11 @@ const calculateAccuracies = (sections: BPS["events"], shotDuration: number) => { ), accuracy: section.score.length / section.shoot.length, })); + const sortedAccuracies = accuracies.sort( (accuracy1, accuracy2) => accuracy1.distance - accuracy2.distance, ); - console.log(durationedSections); return sortedAccuracies; }; @@ -170,14 +170,19 @@ export const calculateFuelByAveraging = ( }; } - const scoredAccuracy = interpolateQuadratic( - shotStats.hubDistanceCentimeters, - calculateAccuracies(formattedSections, shotStats.durationSeconds).map( - ({ distance, accuracy }) => ({ x: distance, y: accuracy }), - ), + const averageAccuracy = calculateAverage( + calculateAccuracies(formattedSections, shotStats.durationSeconds), + ({ accuracy }) => accuracy, ); - const scoredAmount = shotAmount * scoredAccuracy; + // const scoredAccuracy = interpolateQuadratic( + // shotStats.hubDistanceCentimeters, + // calculateAccuracies(formattedSections, shotStats.durationSeconds).map( + // ({ distance, accuracy }) => ({ x: distance, y: accuracy }), + // ), + // ); + + const scoredAmount = shotAmount * averageAccuracy; return { scored: scoredAmount, From def4cce96a5f7a50fa0e83fc9af5ba110a0f3344 Mon Sep 17 00:00:00 2001 From: YoniKiriaty Date: Fri, 3 Apr 2026 13:16:17 +0300 Subject: [PATCH 48/49] Yoni - filtered empty bpses --- apps/scouting/backend/src/fuel/fuel-object.ts | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/scouting/backend/src/fuel/fuel-object.ts b/apps/scouting/backend/src/fuel/fuel-object.ts index 940f1bea..781d94b3 100644 --- a/apps/scouting/backend/src/fuel/fuel-object.ts +++ b/apps/scouting/backend/src/fuel/fuel-object.ts @@ -32,21 +32,26 @@ export const createFuelObject = ( _match: Match, bpses: BPS[], ): FuelObject => { - // const sameMatch = bpses.find( + const nonEmptyBPSes = bpses.map((bps) => ({ + ...bps, + events: bps.events.filter((event) => event.shoot.length > 0), + })); + + // const sameMatch = nonEmptyBPSes.find( // (value) => // value.match.number === match.number && value.match.type === match.type, // ); const isPass = isShotPass(shot.positions); - const partialFuel = - // sameMatch - // ? calculateFuelByMatch(shot, isPass, sameMatch) - // : + const partialFuel = + // sameMatch + // ? calculateFuelByMatch(shot, isPass, sameMatch) + // : calculateFuelByAveraging( - shot, - isPass, - bpses.flatMap((bps) => bps.events), - ); + shot, + isPass, + nonEmptyBPSes.flatMap((bps) => bps.events), + ); return putDefaultsInFuel(partialFuel); }; From 8f73ef7d65a9eb3e2050fa287382c04e1e52e115 Mon Sep 17 00:00:00 2001 From: YoniKiriaty Date: Fri, 3 Apr 2026 16:28:23 +0300 Subject: [PATCH 49/49] Yoni - added data scouted --- bps-3-4-2026.json | 254 ++ forms-3-4-2026.json | 6075 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 6329 insertions(+) create mode 100644 bps-3-4-2026.json create mode 100644 forms-3-4-2026.json diff --git a/bps-3-4-2026.json b/bps-3-4-2026.json new file mode 100644 index 00000000..ffec91b8 --- /dev/null +++ b/bps-3-4-2026.json @@ -0,0 +1,254 @@ +{ + "bpses": [ + { + "_id": "69cf6ac12bc918b8c95b132e", + "bpses": [ + { + "team": 10935, + "match": { + "type": "qualification", + "number": 7 + }, + "events": [ + { + "shoot": [8044.402583, 8044.46592397377, 8044.50505001574, 8044.60921200572, 8044.65844899666, 8044.7702080391, 8044.81945804578, 8045.15704900191, 8045.26355700763, 8045.38725101478, 8045.46995103147, 8045.53225898713, 8045.66234803862, 8045.73469703672, 8045.81907697854, 8045.9250869609, 8046.2061400267, 8046.35599601526, 8046.424243, 8046.49729700525, 8046.76227697425, 8046.86064999237, 8047.48357799428], + "score": [8045.24341702623, 8045.37065298951, 8045.79121102241], + "positions": [] + }, + { + "shoot": [8070.84691397425, 8070.9079629609, 8070.99046503719, 8071.74506400286, 8071.79981002241, 8072.1099870186, 8073.70114802098, 8073.93124402813, 8075.02905403624, 8075.18047300382, 8075.42203099189, 8075.58480300715, 8075.86196296901, 8076.17055800858, 8076.0658, 8076.2466349547, 8076.37626202194, 8076.59383600525, 8076.93575103672, 8077.25797599237, 8077.98121604101, 8078.06323600572, 8078.27961100954, 8078.53561300095, 8078.74552300954, 8079.02421700572, 8079.29543802146, 8079.59606198522, 8079.98693002861], + "score": [8071.1507190248, 8071.2192829938, 8071.50574200334, 8072.59162200525, 8072.68638802527, 8073.15817601049, 8073.22895696662, 8073.38599300763, 8073.46651099809, 8074.70801902241, 8074.80966604578, 8074.91239703052, 8075.42292796662, 8075.59208198999], + "positions": [] + } + ] + } + ], + "team": 10935 + }, + { + "_id": "69cf6ced4c028e7af844868e", + "bpses": [ + { + "team": 3075, + "match": { + "type": "qualification", + "number": 3 + }, + "events": [ + { + "shoot": [4913.26068696567, 4913.35783903052, 4913.4090329876, 4913.45433803243, 4913.49458803576, 4913.5362910391, 4913.57886197473, 4913.63286199475, 5001.88527403672, 5002.00326097091, 5002.09523200382], + "score": [4912.67308696901, 4912.71849996996, 4912.7622099938, 4912.81836599809, 4912.97433501812, 4915.49396097044, 4915.54954996424], + "positions": [] + }, + { + "shoot": [5002.916389, 5002.916389, 5002.916389, 5002.69890299428, 5002.74821703958, 5002.79246699142, 5002.83385800238, 5002.8773209876, 5002.91807101431, 5002.96841800238, 5003.01280804721, 5003.08191999046, 5003.17047897664, 5003.24230703433, 5003.31080197997, 5003.36127496042, 5003.44949697282, 5003.49795401001, 5003.60541300286, 5003.65641300191, 5003.69481698903, 5003.74457897997, 5003.78707899905, 5003.83843399523, 5003.88143400381, 5003.92843399475, 5003.97199401097, 5004.01696200382, 5004.06696201574, 5004.11931101192, 5004.16939603147, 5004.21175600334, 5004.27239796901, 5004.31989798331, 5004.36894495089, 5004.41797900906, 5004.46447903624, 5004.51561997473, 5004.56530595756, 5004.60980595089, 5004.66159795756, 5004.71164200286, 5004.76342398617, 5004.81075001574, 5004.86325002527, 5004.91304103147, 5004.95747898045, 5005.00522897664, 5005.05944599905, 5005.12033896471, 5005.17199898188, 5005.21905097234, 5005.26980098951, 5005.35089801907, 5005.39914803862, 5005.44681496948, 5005.57466398474, 5005.77679700048], + "score": [5006.96321802766, 5003.42075298665, 5003.45709096614, 5003.49938997711, 5003.54188999619, 5003.58703102289, 5003.687997, 5003.72965300811, 5003.77507403242, 5003.98169504864, 5004.02094500525, 5004.06482995661, 5004.11405398379, 5004.15984502098, 5004.20809498093, 5004.25844005198, 5004.30603697807, 5004.52144001287, 5004.56960001144, 5004.61735000763, 5004.66181499285, 5004.70750799905, 5004.74950799476, 5004.79545702909, 5004.84728999952, 5004.89204600811, 5004.96564300334, 5005.01239295279, 5005.05756896948, 5005.10807402241, 5005.16262595136, 5005.20862595518, 5005.25955900334, 5005.30667801192, 5005.40537398093, 5005.45527201335, 5005.50682201192, 5005.55407198474, 5005.60680695232, 5005.65472702337, 5005.72176499762, 5005.84398398617, 5006.15886003386, 5006.20135999332, 5006.24692105102, 5006.38407899189, 5006.43094995899, 5006.50964799905, 5006.65808499523, 5006.8856179795], + "positions": [] + }, + { + "shoot": [5011.4284729752, 5011.46622298093, 5011.51990897759, 5011.59830602766, 5011.63263503529, 5011.73435499952, 5011.77509502575, 5011.81818201621, 5011.89886999142, 5011.94387000811, 5012.04915997711, 5012.08916104244, 5012.13391101764, 5012.7071239795, 5012.7647130124, 5012.84513399523, 5012.89308400143, 5012.92858399142, 5013.00602298474, 5013.51611099857, 5013.55607197282, 5013.59582195279, 5013.63829100286, 5013.68211303719, 5013.72211299905, 5013.76276296567, 5013.93004200715, 5013.96523001764, 5014.00873002384, 5014.05059395422, 5014.09376602766, 5014.14151602384, 5014.18098598522, 5014.28259500095, 5014.34975505007, 5014.42236701192, 5014.49339099666, 5014.57976197997, 5014.88510699857, 5014.93335701812, 5015.00664698999, 5015.13286999475, 5015.17651101907, 5015.47888996996], + "score": [5012.58638599762, 5012.63538596281, 5012.80806099428, 5012.97030604816, 5013.00803802766, 5013.05078802861, 5013.17404695518, 5013.21632699237, 5013.26048199809, 5013.31523196376, 5013.80836103815, 5013.84986101049, 5013.89383901383, 5014.00238603767, 5014.04363602813, 5014.24826703386, 5014.55357098999, 5014.6737909733, 5014.71554098713, 5014.75957201907, 5014.79619995184, 5015.03361305341, 5015.17385899714, 5015.21490898188, 5015.2612190062, 5015.43789196328, 5015.48245697711, 5015.59731001192, 5015.6438100391, 5015.80476695565, 5016.16225098856, 5016.20856098188, 5016.25377695661, 5016.39204100381, 5015.57536400715, 5015.69966202956, 5015.74991202337, 5016.079934, 5016.39950099619, 5014.55239196233, 5014.69156297044, 5014.92187000095, 5015.34170298713], + "positions": [] + }, + { + "shoot": [5048.88478494946, 5048.92553497616, 5048.97263602146, 5049.06728199237, 5049.10728201383, 5049.18095001955, 5049.23158697139, 5049.38817403052, 5049.54791202718, 5049.59191205674, 5049.86783100811, 5049.91618401431, 5050.03722901335, 5050.13615398474, 5050.18040399619, 5050.58380197521, 5050.62862202766, 5050.67087200525, 5050.71723499857, 5051.09538001764, 5051.13863004196, 5051.25538499666, 5051.34054499523, 5051.49848399714, 5051.64461902432, 5051.79041100191, 5051.87190898999, 5051.91315898045, 5052.00116398236, 5052.23141498951], + "score": [5049.96261998999, 5050.00837001192, 5050.06833201669, 5050.12179798188, 5050.17285198856, 5050.28674400525, 5050.33634000143, 5050.38633402337, 5050.54731398951, 5050.60299997807, 5050.65167703099, 5050.94422200381, 5050.99352898426, 5051.03955699046, 5051.09330696901, 5051.28626799952, 5051.33352296662, 5051.38148005341, 5051.43777095661, 5051.79291000525, 5051.83734101097, 5051.88859099189, 5052.29641796662, 5052.34933201192, 5052.4038250186], + "positions": [] + }, + { + "shoot": [], + "score": [], + "positions": [] + } + ] + } + ], + "team": 3075 + }, + { + "_id": "69cf744650bd9d1cc8f61b75", + "bpses": [ + { + "team": 5614, + "match": { + "type": "qualification", + "number": 3 + }, + "events": [ + { + "shoot": [4918.8888559876, 4918.96093503195, 4919.00693503576, 4919.11647100286, 4919.15973904482, 4919.246649, 4919.29016301621, 4919.35141304721, 4919.39639396233, 4919.60934597377, 4919.70858802289, 4919.75397000286, 4919.88586800811, 4919.93236797568, 4919.99842799619, 4920.03810398379, 4920.16034700858, 4920.27537101001, 4920.31971000572, 4920.39038796185, 4920.4444699814], + "score": [4919.89214003481, 4919.94868402098, 4919.99718402241, 4920.03412603052, 4920.0791259876, 4920.1220030062, 4920.17049898379, 4920.38577301097, 4920.53243402003, 4920.64664899476, 4920.72781096996, 4920.77617800238, 4921.17640399189, 4921.28343001335, 4921.40478402003, 4921.45132698999, 4921.80433395756, 4921.85001999237, 4921.89413798522], + "positions": [] + }, + { + "shoot": [4927.95054299237, 4928.02928202909, 4928.07303201717, 4928.22408799237, 4928.26858798569, 4928.37402597044, 4928.41752597664, 4928.47985898665, 4928.52710301335, 4928.66950803243, 4928.96558396471, 4929.00458399905, 4929.06911400906, 4929.11547300238, 4929.43886299619, 4929.57996899428, 4929.62096900286, 4929.69070500048, 4929.73416502432, 4929.80481999905, 4929.8467620124, 4929.91706899476, 4929.96436697759, 4930.03257003195, 4930.0780700124, 4930.2066220329, 4930.25466698713, 4930.31039497568, 4930.35389498188, 4930.40262503243, 4930.50356902956, 4930.59847701144, 4930.64733295804, 4930.7247789795], + "score": [4928.80649599762, 4928.90618403386, 4928.95793403815, 4928.99521597616, 4929.19897698951, 4929.31532400095, 4929.35807400191, 4929.40643397997, 4929.53010201287, 4929.84829896996, 4929.89004898379, 4929.93640704149, 4929.98099298808, 4930.02749301526, 4930.38655799905, 4930.43105799237, 4930.47727695422, 4930.51972998093, 4930.55922997902, 4930.67238504196, 4930.71628496233, 4930.80796905007, 4930.85458097568, 4931.12003899094, 4931.15553898093, 4931.20362499523, 4931.24711300095, 4931.36438698426, 4931.40694802098, 4931.4534669857, 4931.50221696901, 4931.54636503719, 4931.7984999814, 4931.83499995852], + "positions": [] + }, + { + "shoot": [4948.08860001288, 4948.17180400334, 4948.21605401478, 4948.31256901669, 4948.40800201669, 4948.45156802241, 4948.49431802337, 4948.55776102575, 4948.6495400248, 4948.730593, 4948.92960098427, 4949.03505698474, 4949.08680698903, 4949.16624898474, 4949.25969403052, 4949.36253303624, 4949.4085480577, 4949.50347700286, 4949.6063190186, 4949.66882997664, 4949.80085698188, 4949.85656697044, 4949.93169099189, 4949.98955200429, 4950.0554730248, 4950.16676804387, 4950.22027797282, 4950.32043001669, 4950.40576594564, 4950.52957098379, 4950.58160998808], + "score": [4949.06118498045, 4949.12066400334, 4949.1654749547, 4949.21508498474, 4949.35054101574, 4949.38979097234, 4949.43580098903, 4949.56411597568, 4949.67562202861, 4949.93505296567, 4949.980942, 4950.02941499094, 4950.07466498951, 4950.18283197425, 4950.24362204101, 4950.35848700334, 4950.47448499952, 4950.55148301574, 4950.6626519752, 4950.70719796853, 4950.75573500572, 4950.85433100572, 4950.8985310248, 4951.0370120329, 4951.15761497997, 4951.26559199619, 4951.31108504101, 4951.36199603958, 4951.75309096662, 4951.86647101955, 4951.9082630329], + "positions": [] + }, + { + "shoot": [4998.00112802098, 4998.065477, 4998.20812501621, 4998.24956802718, 4998.38785599666, 4998.43135600286, 4998.53348499237, 4998.76416198999, 4998.8222329814, 4998.97607800048, 4999.24641202432, 4999.29041199428, 4999.39169900477, 5000.11436704244, 5000.17642401621, 5001.2999279609, 5001.47611597187, 5001.61482396185, 5001.72195296996, 5001.8032269814, 5002.04440300811, 5002.29495400143, 5002.62886699905, 5002.77661601288, 5002.85544602146, 5003.74429800238, 5003.82112401383, 5004.25881498808, 5004.32606995709, 5004.39569900668, 5004.4753109609, 5004.57259600238, 5004.78180000811], + "score": [4998.91834502337, 4998.97641100954, 4999.07355100715, 4999.12118398474, 4999.23905102718, 4999.39491701621, 4999.66711196471, 4999.72541698713, 4999.79187796376, 5000.07859502527, 5000.17793899619, 5000.23350400048, 5000.89786399523, 5000.98895901049, 5001.77237797759, 5002.13837701621, 5002.34406499857, 5002.49596404435, 5002.55212999666, 5002.88871499189, 5003.2128900248, 5004.02822502575, 5004.60199701288, 5004.66518200238, 5004.7297380124, 5004.85753700954, 5004.95650298093, 5005.05156005531, 5005.18383105007, 5005.23083104101, 5005.35017997521, 5005.39363201717, 5005.43813201049], + "positions": [] + }, + { + "shoot": [5061.26721203338, 5061.31840403195, 5061.4179560267, 5061.54455399523, 5061.74489099523, 5061.82666798856, 5061.96947498951, 5062.03917596662, 5063.18687899046, 5063.37114199952, 5063.5555770267, 5063.85698297997, 5063.91576098713, 5064.62981596758, 5066.09523498283, 5066.15098499523, 5066.22856999046, 5066.33613199619, 5066.58329501812, 5067.1043860453, 5067.50752500668, 5067.56636397473, 5067.79910498522], + "score": [5066.933447, 5066.97954897997, 5067.02806104053, 5067.13155297377, 5067.56584496805, 5067.96806003815, 5068.3923169857, 5068.45727498283, 5068.76559298093], + "positions": [] + }, + { + "shoot": [5074.46757200286, 5074.75827399428, 5074.81705202718, 5074.91028201621, 5075.01283099571, 5075.06977601287, 5075.32570600429, 5075.48325898808, 5075.63123099952, 5075.73978204148, 5075.88915198856, 5075.94028200525, 5076.14251000286, 5076.20772399476, 5076.3826650186], + "score": [5075.34587398665, 5075.62211303147, 5075.71274998093, 5075.80110804768, 5075.89860602384, 5075.99307302098, 5076.36936099809, 5076.55874702623, 5076.6585029609, 5076.85822603862, 5076.99278398188, 5077.03618596424, 5077.07518599857, 5077.11935602766, 5077.15860598427], + "positions": [] + } + ] + } + ], + "team": 5614 + }, + { + "_id": "69cf7bc891e24ba5c161d115", + "bpses": [ + { + "team": 4590, + "match": { + "type": "qualification", + "number": 11 + }, + "events": [ + { + "shoot": [11620.892330949, 11620.9657450248, 11621.3403439866, 11621.7742910019, 11621.8529339509, 11622.144244031, 11622.5262229881, 11622.651381, 11622.8876909871, 11623.2449599704, 11623.3891899819, 11623.6702559881, 11623.7762709909, 11623.9326979642, 11624.0414679905, 11624.1833379757, 11624.3238990024, 11624.5177979652, 11624.83071799, 11624.961409021, 11625.1348650157, 11625.3137739881, 11625.4567599809, 11625.5882330067, 11625.6902489838, 11625.8959799995, 11626.1721760162, 11626.2891449762, 11626.4200720119, 11626.5594970281, 11626.7224450072, 11626.8533790043, 11626.9599599995, 11627.0783679981, 11627.4002270391, 11627.5470069805, 11627.7766519881, 11627.8920670329, 11628.060941979, 11628.18357303, 11628.377609011, 11628.6103980315, 11628.7217060224, 11628.8353269557, 11628.994373989, 11629.1172189828, 11629.2209819933, 11629.3277640405, 11629.5050500024, 11629.6186829595, 11629.8777230105, 11629.9841949747, 11630.0901290167, 11630.2283419805, 11630.3458439795, 11630.6140759461, 11630.7304809962, 11630.9187849952, 11631.0295439495, 11631.2307880038, 11631.3379720305, 11631.4933609957, 11631.606398989, 11631.7190090157, 11631.8471539743, 11632.019979042, 11632.1749709809, 11632.2951400057, 11632.5235920029, 11632.7561840134, 11633.1060540243], + "score": [11621.8593059719, 11621.96214097, 11622.1125310262, 11622.2928109819, 11622.6190759733, 11622.7900510024, 11623.0023059824, 11623.5792850324, 11623.6979239948, 11623.8878160224, 11624.2952030153, 11624.4411409952, 11624.7782670372, 11624.9534250401, 11625.129020989, 11625.2420710005, 11625.3758229743, 11625.5958129967, 11625.7883200038, 11625.9007580281, 11626.137621969, 11626.3298800539, 11626.5151429905, 11626.6782259976, 11626.8585650324, 11627.0102849771, 11627.1432580029, 11627.2616229938, 11627.3943239909, 11627.5327699914, 11627.6936629986, 11627.8662980486, 11628.0100409771, 11628.1383189661, 11628.2642749914, 11628.4160530134, 11628.5106989766, 11628.6542690243, 11628.8339179809, 11628.9778779843, 11629.122782001, 11629.2640739676, 11629.4720289838, 11629.6215709743, 11629.7193470339, 11629.8097780229, 11630.0079809995, 11630.1402889604, 11630.2726600095, 11630.4193330052, 11630.5507880157, 11630.6988019981, 11630.9200730362, 11631.0977269952, 11631.2675330477, 11631.3789550019, 11631.6485120124, 11631.9271879981, 11632.1082770119, 11632.3372910172, 11632.4937849928, 11632.6615470501, 11632.8211499847, 11632.9673059833, 11633.0785089895, 11633.2308549933, 11633.3813940286, 11633.5252250062, 11633.6453080153, 11633.8722969866, 11634.111034], + "positions": [] + }, + { + "shoot": [11644.7795350172, 11644.8625349619, 11645.1530019065, 11645.3165100372, 11645.5321909924, 11645.7220489447, 11645.9077589857, 11646.0480180067, 11646.2380420162, 11646.4014009561, 11646.623488938, 11646.949606958, 11647.4820339266, 11647.5590269847, 11647.8524309352, 11648.0524690029, 11648.3245359666, 11648.5266679561, 11648.6790199418], + "score": [11645.6049129866, 11645.6969129943, 11645.9187220572, 11646.2777090486, 11646.5902689332, 11646.792426939, 11646.8900920238, 11647.0815789971, 11647.1775789533, 11647.4199209723, 11647.5865709743, 11647.8792260591, 11648.2351309371, 11648.3368100639, 11648.6971430296, 11648.7941239847, 11649.1487819504, 11649.4695970477], + "positions": [] + }, + { + "shoot": [11660.4284310839, 11661.0449009971, 11661.1719340591, 11661.3678540792, 11661.5620999132, 11661.9584220477, 11662.1124000181, 11662.3671469084, 11662.5699650486, 11662.7285779571, 11662.8972990219, 11663.27572902, 11663.406454958, 11663.5518950782, 11663.677237958, 11663.7634759952, 11663.8414760639, 11664.0296450162, 11664.2054929676, 11664.3584799228, 11664.4570820496, 11664.6619080448, 11664.8409380839, 11665.027178959, 11665.4542800753, 11665.6004639361, 11665.813473103, 11665.9517250725, 11666.0573810496, 11666.1723110114, 11666.7234700067, 11667.093563979, 11667.3774489228, 11667.6144210305, 11667.8854690563, 11668.2365400162, 11668.7824699657, 11669.343213082, 11670.5874689247, 11670.8324379905, 11671.2325550372, 11671.9288549723, 11672.1523640782, 11672.7752689294], + "score": [11661.3363479208, 11661.6431240219, 11661.9609669895, 11662.2454320639, 11662.9082539809, 11663.3538050257, 11663.7958869561, 11664.3198570172, 11664.5841809857, 11665.0536149971, 11665.3259299666, 11665.6838239943, 11665.813840082, 11665.9084130162, 11666.2011869714, 11666.9733769905, 11667.493769959, 11670.5403020563, 11671.6011569514, 11671.819664041, 11672.0780970448, 11673.0827559733, 11673.633699897, 11674.5170080372, 11674.6269120458, 11660.9975320677, 11661.1485290591, 11661.2470289533, 11663.1149129838, 11663.4574260153, 11663.851958999, 11663.9500789857, 11664.6244129752], + "positions": [] + }, + { + "shoot": [11701.9614009743, 11702.086373082, 11702.2789219933, 11702.635907939, 11702.7918019504, 11702.9684550629, 11703.1294109094, 11703.5013820315, 11703.6321409428, 11703.7226439599, 11704.1404489876, 11704.3366230448, 11704.5421439924, 11704.7474849208, 11704.9441449666, 11705.0845849256, 11705.1825849752, 11705.5681980353, 11705.7138899952, 11706.0317670143, 11706.2100439399, 11706.5159409638, 11706.635566999, 11706.7844139638, 11706.9359410219, 11707.060440939, 11707.3299309952, 11707.4944410029, 11707.669971918, 11707.7636259666, 11707.9896239952, 11708.1518310429, 11708.2899460591, 11708.3799460925, 11708.6298929924, 11708.7826680095, 11708.916453041, 11709.008374001, 11709.1795959571, 11709.3488690219, 11709.5219279161, 11709.6401119723, 11709.7281120315, 11709.9389579952, 11710.0811639914, 11710.2366569981, 11710.4111400219, 11710.6128739132, 11710.7187279685, 11710.9119599733, 11711.0101059752, 11711.254368999, 11711.5403280782, 11711.7928460153, 11711.9063439666, 11712.0149230057], + "score": [11703.1481179466, 11703.2925699113, 11703.429178, 11703.6515029962, 11703.8271409895, 11704.0016529666, 11704.2059879666, 11704.5518090143, 11704.6537489599, 11704.7622279685, 11704.972263959, 11705.3282510124, 11705.6066099514, 11705.8813339619, 11706.041136, 11706.2020850381, 11706.5266910582, 11706.7509149199, 11706.8631110267, 11706.9666110353, 11707.2067279971, 11707.4181611011, 11707.5918809752, 11707.713626979, 11707.8471180305, 11708.1158570362, 11708.2768690381, 11708.435621999, 11708.5941309857, 11708.8525861087, 11709.0056170219, 11709.1611619456, 11709.3237169952, 11709.4643499905, 11709.5741849571, 11709.7447480324, 11709.870554042, 11710.2234380486, 11710.3986158865, 11710.5586999714, 11710.7526540486, 11710.9365749647, 11711.0676660582, 11711.4691519495, 11711.6369509208, 11711.7831149838, 11711.9524760019, 11712.257916041, 11712.4637569075, 11712.721578979, 11713.0351369104, 11713.2895990391, 11713.5789159523, 11713.6659159647, 11713.7868700877, 11713.8822520019], + "positions": [] + }, + { + "shoot": [11736.734220021, 11736.8506879886, 11737.1228210505, 11737.2864899647], + "score": [11737.7239150219, 11737.8196100134, 11738.189527959, 11738.3363770019], + "positions": [] + }, + { + "shoot": [], + "score": [], + "positions": [] + } + ] + } + ], + "team": 4590 + }, + { + "_id": "69cf8b580c7206197dfb1d72", + "bpses": [ + { + "team": 1577, + "match": { + "type": "qualification", + "number": 2 + }, + "events": [ + { + "shoot": [4095.32666499666, 4095.36916501574, 4095.41349698522, 4095.49641200191, 4095.53503100238, 4095.5761910391, 4095.65012095661, 4095.68587098808, 4095.72682599142, 4095.79862295804, 4095.8426229876, 4095.91712396424, 4095.99532202766, 4096.04082200811, 4096.11302301574, 4096.15902301955, 4096.26685299428, 4096.34064597139, 4096.39027101383, 4096.4706560515, 4096.56728801764, 4096.63066598093, 4096.72186697759, 4096.82751901955, 4096.99853705341, 4097.04403703386, 4097.12431899046, 4097.42181698236, 4097.49353499857, 4097.57544499189, 4097.67751600763], + "score": [4096.30258900429, 4096.41717399762, 4096.5032000329, 4096.99707596758, 4097.16332399809, 4097.21832400525, 4097.26806204292, 4097.38439895327, 4097.52304700811, 4097.69382498236, 4097.74132499666, 4097.78166597616, 4097.83137803958, 4098.21345901764, 4098.34560697091, 4098.48121099428, 4098.53467498522], + "positions": [] + }, + { + "shoot": [4144.30013999046, 4144.36335698999, 4144.41543996567, 4144.49749302909, 4144.56795502146, 4144.60588902956, 4144.64288903004, 4144.721436, 4144.76894399046, 4144.8765789857, 4145.02960203386, 4145.28522399905, 4146.02817303862, 4146.08094300906, 4146.14538201907], + "score": [4145.30576804435, 4145.38586500095, 4145.47063803624, 4145.57689597425, 4145.69143200429, 4145.81291097187, 4146.12644404816, 4146.46147800906, 4146.60382598665, 4146.68890800095, 4146.82281596996], + "positions": [] + }, + { + "shoot": [], + "score": [], + "positions": [] + } + ] + } + ], + "team": 1577 + }, + { + "_id": "69cf8ea90c7206197dfb1e49", + "bpses": [ + { + "team": 4744, + "match": { + "type": "qualification", + "number": 2 + }, + "events": [ + { + "shoot": [4074.12872000334, 4074.25256401049, 4074.32872298522, 4074.37572303576, 4074.41474396328, 4074.50233294707, 4074.59032196901, 4074.63132197759, 4074.67301696519, 4074.78986396901, 4074.87971197854, 4074.96046600048, 4075.04864500238, 4075.08985002861, 4075.16798199619, 4075.24604200477, 4075.3316110186, 4075.37536100668, 4075.5380750062, 4075.63816301955, 4075.71425899952, 4075.79920303147, 4075.88129099142, 4075.97831996805, 4076.02392902575, 4076.12045899189, 4076.16282899476, 4076.25000296519, 4076.2910269814, 4076.36899995899, 4076.46107700238, 4076.70896701621, 4076.7906709814, 4076.94042595136, 4076.98317595232], + "score": [4074.92154499475, 4075.12155899475, 4075.1672740062, 4075.20973297044, 4075.35627903338, 4075.48802999714, 4075.56655004721, 4075.6435849938, 4075.74457797282, 4075.85830898951, 4075.90179200334, 4075.97955699905, 4076.07013699809, 4076.11413696805, 4076.20479195136, 4076.3232019814, 4076.41346303242, 4076.50757103195, 4076.63161402098, 4076.71516596519, 4076.79321499189, 4076.87646303195, 4076.96093600477, 4077.0080249876, 4077.1151980248, 4077.23172599714, 4077.55613800954, 4077.64398298522, 4077.72453304578, 4077.81359299046, 4078.00195902098, 4078.04789395184], + "positions": [] + }, + { + "shoot": [4129.13743401907, 4129.18643398426, 4129.26505505245, 4129.33230204196, 4129.42686498999, 4129.50959698617, 4129.62774701049, 4129.7159679814, 4129.79383105484, 4129.86464398999, 4129.95129501764, 4129.99767299762, 4130.04067298045, 4130.13709404196, 4130.21759597854, 4130.41801800191, 4130.46451796948, 4130.50671704244, 4130.59650699237, 4130.67829802193, 4130.72329803862, 4130.82947695852, 4130.87454399571, 4131.01057298522, 4131.11799398093, 4131.24569899332, 4131.35720797616, 4131.47767503433, 4131.532425, 4131.67031804721], + "score": [4129.13077395565, 4130.11698297473, 4130.48585597473, 4130.58397400048, 4130.66965201001, 4130.75470601621, 4130.84238296376, 4130.94986000286, 4131.09330103481, 4131.14280102337, 4131.27600804387, 4131.40648695518, 4131.46346103195, 4131.59233499809, 4131.70819005102, 4131.77595500191, 4131.95367100525, 4132.0815719609, 4132.19823900095, 4132.42016998951, 4132.61258101478, 4133.00979997568, 4133.12000700477], + "positions": [] + }, + { + "shoot": [4139.21333397425, 4139.3083260205, 4139.3829009485, 4139.48738498999, 4139.61612697711, 4139.66601604292, 4139.80442100191, 4139.89743001907, 4139.94443001001, 4140.02445096948, 4140.14852, 4140.22897699046, 4140.4048809938, 4140.47339198903, 4140.59654597234, 4140.68732402861, 4140.76913998045, 4140.8833740205, 4141.03648196996, 4141.1635389485, 4141.26289595661, 4141.34349998093, 4141.43642398808, 4141.66025102861, 4141.77034704482, 4141.82284699475, 4142.07752701431], + "score": [4140.0525449857, 4140.20755001049, 4140.29065799094, 4140.36776398951, 4140.49266898331, 4140.64144201288, 4140.71318396948, 4140.83852500763, 4140.92061702194, 4141.02631099857, 4141.17933098999, 4141.28516198236, 4141.43173497568, 4141.50216602766, 4141.55654597759, 4141.62474404768, 4141.73103301192, 4141.88611299523, 4142.16115901907, 4142.23317301192, 4142.29426001144, 4142.412414, 4142.54231695804], + "positions": [] + }, + { + "shoot": [4148.70911602623, 4148.80028499714, 4148.87920401907, 4148.97285095375, 4149.11995602194, 4149.31545699046, 4149.71674800334, 4149.77766798474, 4150.07059003338, 4150.1375889814, 4150.21976903719, 4150.51597400811], + "score": [4149.77035797187, 4149.82023895995, 4149.86277801478, 4149.91645402146, 4150.07409101574, 4150.2316040205, 4150.62023201669, 4150.71422995375, 4151.01935099046, 4151.06472904053, 4151.11548600048, 4151.38963700095], + "positions": [] + }, + { + "shoot": [4186.61317000715, 4186.65904299237, 4186.78116994755, 4186.8316560186, 4186.96025700286, 4187.04457903004, 4187.15352397377, 4187.24183197282, 4187.36264398999, 4187.46195201335, 4187.5096589857, 4187.60465999046, 4187.65265996853, 4187.73951101097, 4187.82955297139, 4187.95216699905, 4188.04092804768, 4188.18789797091, 4188.30998103481, 4188.35109903004, 4188.43728303672, 4188.55607500715, 4188.66789798999, 4188.71366198808, 4188.8540289733, 4188.89759201526, 4189.10271499237, 4189.29032002766], + "score": [4187.60085401335, 4187.67000697711, 4187.727257, 4187.80010200811, 4187.90299201097, 4187.99684300525, 4188.16256896614, 4188.29372998903, 4188.40555100286, 4188.57706798808, 4188.633565, 4188.73194398951, 4188.87430998474, 4189.00420797425, 4189.14270600286, 4189.31401696471, 4189.37520203147, 4189.52642499428, 4189.61618203433, 4189.75689798331, 4189.91358999571, 4189.98167701383, 4190.24780699809], + "positions": [] + }, + { + "shoot": [4195.89472103529, 4195.9407210391, 4196.04617402623, 4196.17476799476, 4196.23579899428, 4196.30500297616, 4196.34975500286, 4196.59335699332, 4196.65179396948, 4196.73999202575, 4196.79531500906, 4196.86683302241, 4196.98672802909, 4197.0923370267, 4197.14233703862, 4197.32226402909, 4197.40826497902, 4197.49266200572, 4197.58004998665, 4197.63733204053, 4197.69989201669, 4197.77632799952, 4197.86180601144, 4197.90982500715, 4198.01778696376, 4198.13412699619, 4198.30480795232, 4198.38123798665], + "score": [4196.67992696758, 4196.77273399809, 4196.98671099666, 4197.06959103386, 4197.17816899857, 4197.47618700048, 4197.58146799094, 4197.72504202003, 4197.81483501621, 4197.91305901907, 4197.9761330186, 4198.05207997282, 4198.14042902861, 4198.20916698713, 4198.30397999476, 4198.39022601717, 4198.4871109857, 4198.55744400668, 4198.6422089795, 4198.70081604864, 4198.75742201669, 4198.94510798474, 4199.07747400525, 4199.17160096328, 4199.4417200515], + "positions": [] + }, + { + "shoot": [4205.02784900811, 4205.08224696805, 4205.21184903529, 4205.29769397711, 4205.38162601192, 4205.61834596042, 4206.04148202909, 4206.20534900572, 4206.42783004387, 4206.48387101431], + "score": [4205.95377995375, 4206.03059999619, 4206.12750700858, 4206.34214003052, 4206.92005401574, 4206.9664529857, 4207.22684898999], + "positions": [] + }, + { + "shoot": [4219.67229002527, 4219.72469602146, 4219.79355396185, 4219.8740539814, 4219.96268600334, 4220.052420031, 4220.15218698188, 4220.2413039938, 4220.29964101383, 4220.38455101812, 4220.4465560124, 4220.52844096424, 4220.59855597234, 4220.70803297807, 4220.79390000572, 4220.89132202384, 4221.02082704911, 4221.07529703004, 4221.16782803719, 4221.26962596471, 4221.40082400858, 4221.48257596042, 4221.66829297997, 4221.72831499523, 4221.82317304673, 4222.18264698093], + "score": [4220.52366899857, 4220.57466899762, 4220.62054203719, 4220.68121896424, 4220.87420301001, 4220.93313902241, 4221.09633600668, 4221.24689000048, 4221.29547801955, 4221.4404099814, 4221.6014569938, 4221.64670699237, 4221.97363498665, 4222.07234401478, 4222.20184600143, 4222.3621700062, 4222.54427703338, 4222.59482599046, 4222.64482600238, 4223.09911004005], + "positions": [] + }, + { + "shoot": [4230.48328098617, 4230.52528098188, 4230.56823804196, 4230.61891598903, 4230.72406001287, 4230.77094303958, 4230.86930295089, 4231.02880298426, 4231.08584701717, 4231.22928896615, 4231.28174101144, 4231.44294400095, 4231.55494399142, 4231.69326197091, 4231.75458400143, 4231.84910800906, 4231.93998101574, 4232.03101198426, 4232.11930797568, 4232.21371099285, 4232.29373699142, 4232.37009698713, 4232.46568897902, 4232.5138760062, 4232.59379697616, 4232.72476698856, 4232.85316399094], + "score": [4231.34364005102, 4231.40010702432, 4231.46122100811, 4231.53900999333, 4231.6342500062, 4231.78657298951, 4231.96273800048, 4232.0097659857, 4232.04526603529, 4232.20797101669, 4232.3246310391, 4232.44658100429, 4232.49937901335, 4232.67893400906, 4232.81080103243, 4232.88286301717, 4232.97422703719, 4233.02669299476, 4233.07479400095, 4233.29790804435, 4233.42201800954, 4233.60578305484, 4233.67877499857, 4233.75613598903], + "positions": [] + }, + { + "shoot": [], + "score": [], + "positions": [] + } + ] + } + ], + "team": 4744 + } + ] +} \ No newline at end of file diff --git a/forms-3-4-2026.json b/forms-3-4-2026.json new file mode 100644 index 00000000..d9068448 --- /dev/null +++ b/forms-3-4-2026.json @@ -0,0 +1,6075 @@ +{ + "forms": [ + { + "_id": "69cf68042bc918b8c95b12a1", + "scouterName": "Yoni", + "competition": "TESTING", + "match": { + "number": 3, + "type": "qualification" + }, + "teamNumber": 3075, + "auto": { + "movement": { + "trenchPass": false, + "bumpPass": false, + "bumpStuck": false + }, + "chosenAuto": "trenchFuelMiddle", + "climb": { + "climbTime": { + "L1": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + }, + "shootEvents": [ + { + "interval": { + "start": 157926, + "end": 158302 + }, + "positions": [ + { + "x": 220, + "y": 302 + } + ] + }, + { + "interval": { + "start": 246624, + "end": 249079 + }, + "positions": [ + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + } + ] + }, + { + "interval": { + "start": 249427, + "end": 250270 + }, + "positions": [ + { + "x": 246, + "y": 262 + } + ] + }, + { + "interval": { + "start": 255407, + "end": 259209 + }, + "positions": [ + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + } + ] + }, + { + "interval": { + "start": 263739, + "end": 264174 + }, + "positions": [ + { + "x": 221, + "y": 335 + } + ] + }, + { + "interval": { + "start": 292831, + "end": 294551 + }, + "positions": [ + { + "x": 242, + "y": 210 + }, + { + "x": 242, + "y": 210 + } + ] + }, + { + "interval": { + "start": 294656, + "end": 295723 + }, + "positions": [ + { + "x": 242, + "y": 211 + }, + { + "x": 242, + "y": 211 + } + ] + } + ] + }, + "tele": { + "transitionShift": { + "shootEvents": [ + { + "interval": { + "start": 157926, + "end": 158302 + }, + "positions": [ + { + "x": 220, + "y": 302 + } + ] + }, + { + "interval": { + "start": 246624, + "end": 249079 + }, + "positions": [ + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + } + ] + }, + { + "interval": { + "start": 249427, + "end": 250270 + }, + "positions": [ + { + "x": 246, + "y": 262 + } + ] + }, + { + "interval": { + "start": 255407, + "end": 259209 + }, + "positions": [ + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + } + ] + }, + { + "interval": { + "start": 263739, + "end": 264174 + }, + "positions": [ + { + "x": 221, + "y": 335 + } + ] + }, + { + "interval": { + "start": 292831, + "end": 294551 + }, + "positions": [ + { + "x": 242, + "y": 210 + }, + { + "x": 242, + "y": 210 + } + ] + }, + { + "interval": { + "start": 294656, + "end": 295723 + }, + "positions": [ + { + "x": 242, + "y": 211 + }, + { + "x": 242, + "y": 211 + } + ] + } + ] + }, + "shifts": [ + { + "shootEvents": [ + { + "interval": { + "start": 157926, + "end": 158302 + }, + "positions": [ + { + "x": 220, + "y": 302 + } + ] + }, + { + "interval": { + "start": 246624, + "end": 249079 + }, + "positions": [ + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + } + ] + }, + { + "interval": { + "start": 249427, + "end": 250270 + }, + "positions": [ + { + "x": 246, + "y": 262 + } + ] + }, + { + "interval": { + "start": 255407, + "end": 259209 + }, + "positions": [ + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + } + ] + }, + { + "interval": { + "start": 263739, + "end": 264174 + }, + "positions": [ + { + "x": 221, + "y": 335 + } + ] + }, + { + "interval": { + "start": 292831, + "end": 294551 + }, + "positions": [ + { + "x": 242, + "y": 210 + }, + { + "x": 242, + "y": 210 + } + ] + }, + { + "interval": { + "start": 294656, + "end": 295723 + }, + "positions": [ + { + "x": 242, + "y": 211 + }, + { + "x": 242, + "y": 211 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 157926, + "end": 158302 + }, + "positions": [ + { + "x": 220, + "y": 302 + } + ] + }, + { + "interval": { + "start": 246624, + "end": 249079 + }, + "positions": [ + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + } + ] + }, + { + "interval": { + "start": 249427, + "end": 250270 + }, + "positions": [ + { + "x": 246, + "y": 262 + } + ] + }, + { + "interval": { + "start": 255407, + "end": 259209 + }, + "positions": [ + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + } + ] + }, + { + "interval": { + "start": 263739, + "end": 264174 + }, + "positions": [ + { + "x": 221, + "y": 335 + } + ] + }, + { + "interval": { + "start": 292831, + "end": 294551 + }, + "positions": [ + { + "x": 242, + "y": 210 + }, + { + "x": 242, + "y": 210 + } + ] + }, + { + "interval": { + "start": 294656, + "end": 295723 + }, + "positions": [ + { + "x": 242, + "y": 211 + }, + { + "x": 242, + "y": 211 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 157926, + "end": 158302 + }, + "positions": [ + { + "x": 220, + "y": 302 + } + ] + }, + { + "interval": { + "start": 246624, + "end": 249079 + }, + "positions": [ + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + } + ] + }, + { + "interval": { + "start": 249427, + "end": 250270 + }, + "positions": [ + { + "x": 246, + "y": 262 + } + ] + }, + { + "interval": { + "start": 255407, + "end": 259209 + }, + "positions": [ + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + } + ] + }, + { + "interval": { + "start": 263739, + "end": 264174 + }, + "positions": [ + { + "x": 221, + "y": 335 + } + ] + }, + { + "interval": { + "start": 292831, + "end": 294551 + }, + "positions": [ + { + "x": 242, + "y": 210 + }, + { + "x": 242, + "y": 210 + } + ] + }, + { + "interval": { + "start": 294656, + "end": 295723 + }, + "positions": [ + { + "x": 242, + "y": 211 + }, + { + "x": 242, + "y": 211 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 157926, + "end": 158302 + }, + "positions": [ + { + "x": 220, + "y": 302 + } + ] + }, + { + "interval": { + "start": 246624, + "end": 249079 + }, + "positions": [ + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + } + ] + }, + { + "interval": { + "start": 249427, + "end": 250270 + }, + "positions": [ + { + "x": 246, + "y": 262 + } + ] + }, + { + "interval": { + "start": 255407, + "end": 259209 + }, + "positions": [ + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + } + ] + }, + { + "interval": { + "start": 263739, + "end": 264174 + }, + "positions": [ + { + "x": 221, + "y": 335 + } + ] + }, + { + "interval": { + "start": 292831, + "end": 294551 + }, + "positions": [ + { + "x": 242, + "y": 210 + }, + { + "x": 242, + "y": 210 + } + ] + }, + { + "interval": { + "start": 294656, + "end": 295723 + }, + "positions": [ + { + "x": 242, + "y": 211 + }, + { + "x": 242, + "y": 211 + } + ] + } + ] + } + ], + "endgameShift": { + "shootEvents": [ + { + "interval": { + "start": 157926, + "end": 158302 + }, + "positions": [ + { + "x": 220, + "y": 302 + } + ] + }, + { + "interval": { + "start": 246624, + "end": 249079 + }, + "positions": [ + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + }, + { + "x": 245, + "y": 259 + } + ] + }, + { + "interval": { + "start": 249427, + "end": 250270 + }, + "positions": [ + { + "x": 246, + "y": 262 + } + ] + }, + { + "interval": { + "start": 255407, + "end": 259209 + }, + "positions": [ + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + }, + { + "x": 169, + "y": 227 + } + ] + }, + { + "interval": { + "start": 263739, + "end": 264174 + }, + "positions": [ + { + "x": 221, + "y": 335 + } + ] + }, + { + "interval": { + "start": 292831, + "end": 294551 + }, + "positions": [ + { + "x": 242, + "y": 210 + }, + { + "x": 242, + "y": 210 + } + ] + }, + { + "interval": { + "start": 294656, + "end": 295723 + }, + "positions": [ + { + "x": 242, + "y": 211 + }, + { + "x": 242, + "y": 211 + } + ] + } + ] + }, + "movement": { + "bumpStuck": false + }, + "climb": { + "climbTime": { + "L1": null, + "L2": null, + "L3": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + } + }, + "comment": "", + "robotBroken": false + }, + { + "_id": "69cf6d2b4c028e7af844868f", + "scouterName": "Yoni", + "competition": "TESTING", + "match": { + "type": "qualification", + "number": 7 + }, + "teamNumber": 10935, + "auto": { + "movement": { + "trenchPass": false, + "bumpPass": false, + "bumpStuck": false + }, + "chosenAuto": "trenchFuelMiddle", + "climb": { + "climbTime": { + "L1": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + }, + "shootEvents": [ + { + "interval": { + "start": 35760, + "end": 38824 + }, + "positions": [ + { + "x": 147, + "y": 273 + }, + { + "x": 147, + "y": 273 + }, + { + "x": 147, + "y": 273 + }, + { + "x": 147, + "y": 273 + } + ] + } + ] + }, + "tele": { + "transitionShift": { + "shootEvents": [] + }, + "shifts": [ + { + "shootEvents": [ + { + "interval": { + "start": 64709, + "end": 68538 + }, + "positions": [ + { + "x": 242, + "y": 320 + }, + { + "x": 242, + "y": 320 + }, + { + "x": 242, + "y": 319 + }, + { + "x": 242, + "y": 318 + } + ] + }, + { + "interval": { + "start": 69275, + "end": 69726 + }, + "positions": [ + { + "x": 242, + "y": 310 + } + ] + }, + { + "interval": { + "start": 70661, + "end": 70729 + }, + "positions": [ + { + "x": 242, + "y": 310 + } + ] + } + ] + }, + { + "shootEvents": [] + }, + { + "shootEvents": [] + }, + { + "shootEvents": [] + } + ], + "endgameShift": { + "shootEvents": [] + }, + "movement": { + "bumpStuck": false + }, + "climb": { + "climbTime": { + "L1": null, + "L2": null, + "L3": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + } + }, + "comment": "", + "robotBroken": false + }, + { + "_id": "69cf81946a986d5305575c80", + "scouterName": "Dror", + "competition": "TESTING", + "match": { + "number": 700, + "type": "qualification" + }, + "teamNumber": 0, + "auto": { + "movement": { + "trenchPass": false, + "bumpPass": true, + "bumpStuck": true + }, + "chosenAuto": "trenchFuelMiddle", + "climb": { + "climbTime": { + "L1": { + "start": 76269, + "end": 77222 + } + }, + "climbSide": { + "middle": false, + "side": true, + "support": false + }, + "level": "L1" + }, + "shootEvents": [] + }, + "tele": { + "transitionShift": { + "shootEvents": [ + { + "interval": { + "start": 97759, + "end": 97800 + }, + "positions": [ + { + "x": 223, + "y": 181 + } + ] + }, + { + "interval": { + "start": 97807, + "end": 97808 + }, + "positions": [ + { + "x": 223, + "y": 181 + } + ] + }, + { + "interval": { + "start": 98883, + "end": 99010 + }, + "positions": [ + { + "x": 223, + "y": 181 + } + ] + }, + { + "interval": { + "start": 99017, + "end": 99019 + }, + "positions": [ + { + "x": 223, + "y": 181 + } + ] + }, + { + "interval": { + "start": 99468, + "end": 100065 + }, + "positions": [ + { + "x": 223, + "y": 181 + } + ] + } + ] + }, + "shifts": [ + { + "shootEvents": [ + { + "interval": { + "start": 106788, + "end": 113918 + }, + "positions": [ + { + "x": 193, + "y": 348 + }, + { + "x": 193, + "y": 348 + }, + { + "x": 193, + "y": 348 + }, + { + "x": 193, + "y": 348 + }, + { + "x": 193, + "y": 348 + }, + { + "x": 193, + "y": 348 + }, + { + "x": 193, + "y": 348 + }, + { + "x": 193, + "y": 348 + } + ] + }, + { + "interval": { + "start": 114438, + "end": 116283 + }, + "positions": [ + { + "x": 281, + "y": 168 + }, + { + "x": 281, + "y": 168 + } + ] + } + ] + }, + { + "shootEvents": [] + }, + { + "shootEvents": [] + }, + { + "shootEvents": [] + } + ], + "endgameShift": { + "shootEvents": [] + }, + "movement": { + "bumpStuck": false + }, + "climb": { + "climbTime": { + "L1": null, + "L2": null, + "L3": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + } + }, + "comment": "", + "robotBroken": true + }, + { + "_id": "69cf81d96a986d5305575cc7", + "scouterName": "Karni", + "competition": "TESTING", + "match": { + "number": 13, + "type": "qualification" + }, + "teamNumber": 5614, + "auto": { + "movement": { + "trenchPass": false, + "bumpPass": false, + "bumpStuck": false + }, + "chosenAuto": "trenchFuelMiddle", + "climb": { + "climbTime": { + "L1": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + }, + "shootEvents": [ + { + "interval": { + "start": 51354, + "end": 52769 + }, + "positions": [ + { + "x": 290, + "y": 581 + }, + { + "x": 290, + "y": 581 + } + ] + }, + { + "interval": { + "start": 294354, + "end": 295535 + }, + "positions": [ + { + "x": 239, + "y": 572 + }, + { + "x": 239, + "y": 572 + } + ] + }, + { + "interval": { + "start": 303505, + "end": 304256 + }, + "positions": [ + { + "x": 191, + "y": 603 + } + ] + } + ] + }, + "tele": { + "transitionShift": { + "shootEvents": [ + { + "interval": { + "start": 75104, + "end": 76640 + }, + "positions": [ + { + "x": 230, + "y": 222 + }, + { + "x": 230, + "y": 222 + } + ] + }, + { + "interval": { + "start": 317444, + "end": 318570 + }, + "positions": [ + { + "x": 236, + "y": 159 + }, + { + "x": 236, + "y": 159 + } + ] + } + ] + }, + "shifts": [ + { + "shootEvents": [] + }, + { + "shootEvents": [ + { + "interval": { + "start": 107649, + "end": 108243 + }, + "positions": [ + { + "x": 289, + "y": 108 + } + ] + }, + { + "interval": { + "start": 108245, + "end": 108247 + }, + "positions": [ + { + "x": 289, + "y": 108 + } + ] + }, + { + "interval": { + "start": 349328, + "end": 349987 + }, + "positions": [ + { + "x": 219, + "y": 106 + } + ] + }, + { + "interval": { + "start": 349993, + "end": 349997 + }, + "positions": [ + { + "x": 219, + "y": 106 + } + ] + }, + { + "interval": { + "start": 362456, + "end": 364232 + }, + "positions": [ + { + "x": 142, + "y": 148 + }, + { + "x": 142, + "y": 148 + } + ] + } + ] + }, + { + "shootEvents": [] + }, + { + "shootEvents": [ + { + "interval": { + "start": 414809, + "end": 415650 + }, + "positions": [ + { + "x": 159, + "y": 165 + } + ] + } + ] + } + ], + "endgameShift": { + "shootEvents": [ + { + "interval": { + "start": 430117, + "end": 431221 + }, + "positions": [ + { + "x": 80, + "y": 260 + }, + { + "x": 80, + "y": 260 + } + ] + }, + { + "interval": { + "start": 443254, + "end": 444885 + }, + "positions": [ + { + "x": 243, + "y": 79 + }, + { + "x": 243, + "y": 79 + } + ] + } + ] + }, + "movement": { + "bumpStuck": false + }, + "climb": { + "climbTime": { + "L1": null, + "L2": null, + "L3": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + } + }, + "comment": "", + "robotBroken": false + }, + { + "_id": "69cf8d490c7206197dfb1dff", + "scouterName": "Big yoni", + "competition": "TESTING", + "match": { + "number": 9, + "type": "qualification" + }, + "teamNumber": 1577, + "auto": { + "movement": { + "trenchPass": true, + "bumpPass": false, + "bumpStuck": true + }, + "chosenAuto": "trenchFuelMiddle", + "climb": { + "climbTime": { + "L1": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + }, + "shootEvents": [ + { + "interval": { + "start": 28676, + "end": 31566 + }, + "positions": [ + { + "x": 190, + "y": 503 + }, + { + "x": 235, + "y": 505 + }, + { + "x": 214, + "y": 521 + } + ] + }, + { + "interval": { + "start": 32347, + "end": 33176 + }, + "positions": [ + { + "x": 192, + "y": 269 + } + ] + }, + { + "interval": { + "start": 35282, + "end": 42482 + }, + "positions": [ + { + "x": 481, + "y": 484 + }, + { + "x": 565, + "y": 435 + }, + { + "x": 195, + "y": 388 + }, + { + "x": 224, + "y": 477 + }, + { + "x": 288, + "y": 430 + }, + { + "x": 165, + "y": 298 + }, + { + "x": 224, + "y": 373 + }, + { + "x": 210, + "y": 291 + } + ] + }, + { + "interval": { + "start": 48939, + "end": 51837 + }, + "positions": [ + { + "x": 169, + "y": 296 + }, + { + "x": 199, + "y": 313 + }, + { + "x": 232, + "y": 275 + } + ] + }, + { + "interval": { + "start": 53320, + "end": 53986 + }, + "positions": [ + { + "x": 896, + "y": 116 + } + ] + }, + { + "interval": { + "start": 55099, + "end": 57261 + }, + "positions": [ + { + "x": 205, + "y": 300 + }, + { + "x": 222, + "y": 345 + }, + { + "x": 209, + "y": 266 + } + ] + }, + { + "interval": { + "start": 63638, + "end": 68218 + }, + "positions": [ + { + "x": 266, + "y": 288 + }, + { + "x": 242, + "y": 291 + }, + { + "x": 199, + "y": 198 + }, + { + "x": 223, + "y": 145 + }, + { + "x": 235, + "y": 383 + } + ] + }, + { + "interval": { + "start": 68821, + "end": 73197 + }, + "positions": [ + { + "x": 201, + "y": 212 + }, + { + "x": 138, + "y": 551 + }, + { + "x": 45, + "y": 345 + }, + { + "x": 78, + "y": 178 + }, + { + "x": 258, + "y": 314 + } + ] + }, + { + "interval": { + "start": 75636, + "end": 75724 + }, + "positions": [ + { + "x": 186, + "y": 483 + } + ] + }, + { + "interval": { + "start": 76413, + "end": 76722 + }, + "positions": [ + { + "x": 174, + "y": 309 + } + ] + }, + { + "interval": { + "start": 77182, + "end": 77543 + }, + "positions": [ + { + "x": 253, + "y": 584 + } + ] + }, + { + "interval": { + "start": 77960, + "end": 78261 + }, + "positions": [ + { + "x": 187, + "y": 264 + } + ] + }, + { + "interval": { + "start": 78715, + "end": 79066 + }, + "positions": [ + { + "x": 268, + "y": 581 + } + ] + }, + { + "interval": { + "start": 79350, + "end": 79636 + }, + "positions": [ + { + "x": 194, + "y": 260 + } + ] + }, + { + "interval": { + "start": 90949, + "end": 93071 + }, + "positions": [ + { + "x": 240, + "y": 393 + }, + { + "x": 187, + "y": 272 + }, + { + "x": 226, + "y": 533 + } + ] + }, + { + "interval": { + "start": 93417, + "end": 97492 + }, + "positions": [ + { + "x": 225, + "y": 346 + }, + { + "x": 228, + "y": 262 + }, + { + "x": 133, + "y": 479 + }, + { + "x": 158, + "y": 250 + }, + { + "x": 307, + "y": 336 + } + ] + }, + { + "interval": { + "start": 97952, + "end": 98713 + }, + "positions": [ + { + "x": 230, + "y": 589 + } + ] + }, + { + "interval": { + "start": 98892, + "end": 99710 + }, + "positions": [ + { + "x": 255, + "y": 274 + } + ] + }, + { + "interval": { + "start": 99956, + "end": 100901 + }, + "positions": [ + { + "x": 233, + "y": 475 + } + ] + }, + { + "interval": { + "start": 75716, + "end": 76905 + }, + "positions": [ + { + "x": 236, + "y": 486 + }, + { + "x": 225, + "y": 415 + } + ] + }, + { + "interval": { + "start": 77403, + "end": 78194 + }, + "positions": [ + { + "x": 127, + "y": 243 + } + ] + }, + { + "interval": { + "start": 79022, + "end": 79902 + }, + "positions": [ + { + "x": 132, + "y": 480 + } + ] + }, + { + "interval": { + "start": 80450, + "end": 82630 + }, + "positions": [ + { + "x": 248, + "y": 121 + }, + { + "x": 111, + "y": 216 + }, + { + "x": 139, + "y": 468 + } + ] + }, + { + "interval": { + "start": 84103, + "end": 84916 + }, + "positions": [ + { + "x": 143, + "y": 244 + } + ] + }, + { + "interval": { + "start": 85514, + "end": 86949 + }, + "positions": [ + { + "x": 245, + "y": 545 + }, + { + "x": 245, + "y": 545 + } + ] + }, + { + "interval": { + "start": 87932, + "end": 88818 + }, + "positions": [ + { + "x": 226, + "y": 232 + } + ] + }, + { + "interval": { + "start": 92049, + "end": 93499 + }, + "positions": [ + { + "x": 206, + "y": 262 + }, + { + "x": 206, + "y": 262 + } + ] + }, + { + "interval": { + "start": 725104, + "end": 725420 + }, + "positions": [ + { + "x": 520, + "y": 564 + } + ] + }, + { + "interval": { + "start": 727322, + "end": 728224 + }, + "positions": [ + { + "x": 285, + "y": 404 + } + ] + } + ] + }, + "tele": { + "transitionShift": { + "shootEvents": [ + { + "interval": { + "start": 28676, + "end": 31566 + }, + "positions": [ + { + "x": 190, + "y": 503 + }, + { + "x": 235, + "y": 505 + }, + { + "x": 214, + "y": 521 + } + ] + }, + { + "interval": { + "start": 32347, + "end": 33176 + }, + "positions": [ + { + "x": 192, + "y": 269 + } + ] + }, + { + "interval": { + "start": 35282, + "end": 42482 + }, + "positions": [ + { + "x": 481, + "y": 484 + }, + { + "x": 565, + "y": 435 + }, + { + "x": 195, + "y": 388 + }, + { + "x": 224, + "y": 477 + }, + { + "x": 288, + "y": 430 + }, + { + "x": 165, + "y": 298 + }, + { + "x": 224, + "y": 373 + }, + { + "x": 210, + "y": 291 + } + ] + }, + { + "interval": { + "start": 48939, + "end": 51837 + }, + "positions": [ + { + "x": 169, + "y": 296 + }, + { + "x": 199, + "y": 313 + }, + { + "x": 232, + "y": 275 + } + ] + }, + { + "interval": { + "start": 53320, + "end": 53986 + }, + "positions": [ + { + "x": 896, + "y": 116 + } + ] + }, + { + "interval": { + "start": 55099, + "end": 57261 + }, + "positions": [ + { + "x": 205, + "y": 300 + }, + { + "x": 222, + "y": 345 + }, + { + "x": 209, + "y": 266 + } + ] + }, + { + "interval": { + "start": 63638, + "end": 68218 + }, + "positions": [ + { + "x": 266, + "y": 288 + }, + { + "x": 242, + "y": 291 + }, + { + "x": 199, + "y": 198 + }, + { + "x": 223, + "y": 145 + }, + { + "x": 235, + "y": 383 + } + ] + }, + { + "interval": { + "start": 68821, + "end": 73197 + }, + "positions": [ + { + "x": 201, + "y": 212 + }, + { + "x": 138, + "y": 551 + }, + { + "x": 45, + "y": 345 + }, + { + "x": 78, + "y": 178 + }, + { + "x": 258, + "y": 314 + } + ] + }, + { + "interval": { + "start": 75636, + "end": 75724 + }, + "positions": [ + { + "x": 186, + "y": 483 + } + ] + }, + { + "interval": { + "start": 76413, + "end": 76722 + }, + "positions": [ + { + "x": 174, + "y": 309 + } + ] + }, + { + "interval": { + "start": 77182, + "end": 77543 + }, + "positions": [ + { + "x": 253, + "y": 584 + } + ] + }, + { + "interval": { + "start": 77960, + "end": 78261 + }, + "positions": [ + { + "x": 187, + "y": 264 + } + ] + }, + { + "interval": { + "start": 78715, + "end": 79066 + }, + "positions": [ + { + "x": 268, + "y": 581 + } + ] + }, + { + "interval": { + "start": 79350, + "end": 79636 + }, + "positions": [ + { + "x": 194, + "y": 260 + } + ] + }, + { + "interval": { + "start": 90949, + "end": 93071 + }, + "positions": [ + { + "x": 240, + "y": 393 + }, + { + "x": 187, + "y": 272 + }, + { + "x": 226, + "y": 533 + } + ] + }, + { + "interval": { + "start": 93417, + "end": 97492 + }, + "positions": [ + { + "x": 225, + "y": 346 + }, + { + "x": 228, + "y": 262 + }, + { + "x": 133, + "y": 479 + }, + { + "x": 158, + "y": 250 + }, + { + "x": 307, + "y": 336 + } + ] + }, + { + "interval": { + "start": 97952, + "end": 98713 + }, + "positions": [ + { + "x": 230, + "y": 589 + } + ] + }, + { + "interval": { + "start": 98892, + "end": 99710 + }, + "positions": [ + { + "x": 255, + "y": 274 + } + ] + }, + { + "interval": { + "start": 99956, + "end": 100901 + }, + "positions": [ + { + "x": 233, + "y": 475 + } + ] + }, + { + "interval": { + "start": 97793, + "end": 100014 + }, + "positions": [ + { + "x": 218, + "y": 352 + }, + { + "x": 217, + "y": 244 + }, + { + "x": 217, + "y": 244 + } + ] + }, + { + "interval": { + "start": 103948, + "end": 105728 + }, + "positions": [ + { + "x": 188, + "y": 176 + }, + { + "x": 188, + "y": 176 + } + ] + }, + { + "interval": { + "start": 107666, + "end": 108657 + }, + "positions": [ + { + "x": 229, + "y": 409 + } + ] + } + ] + }, + "shifts": [ + { + "shootEvents": [ + { + "interval": { + "start": 28676, + "end": 31566 + }, + "positions": [ + { + "x": 190, + "y": 503 + }, + { + "x": 235, + "y": 505 + }, + { + "x": 214, + "y": 521 + } + ] + }, + { + "interval": { + "start": 32347, + "end": 33176 + }, + "positions": [ + { + "x": 192, + "y": 269 + } + ] + }, + { + "interval": { + "start": 35282, + "end": 42482 + }, + "positions": [ + { + "x": 481, + "y": 484 + }, + { + "x": 565, + "y": 435 + }, + { + "x": 195, + "y": 388 + }, + { + "x": 224, + "y": 477 + }, + { + "x": 288, + "y": 430 + }, + { + "x": 165, + "y": 298 + }, + { + "x": 224, + "y": 373 + }, + { + "x": 210, + "y": 291 + } + ] + }, + { + "interval": { + "start": 48939, + "end": 51837 + }, + "positions": [ + { + "x": 169, + "y": 296 + }, + { + "x": 199, + "y": 313 + }, + { + "x": 232, + "y": 275 + } + ] + }, + { + "interval": { + "start": 53320, + "end": 53986 + }, + "positions": [ + { + "x": 896, + "y": 116 + } + ] + }, + { + "interval": { + "start": 55099, + "end": 57261 + }, + "positions": [ + { + "x": 205, + "y": 300 + }, + { + "x": 222, + "y": 345 + }, + { + "x": 209, + "y": 266 + } + ] + }, + { + "interval": { + "start": 63638, + "end": 68218 + }, + "positions": [ + { + "x": 266, + "y": 288 + }, + { + "x": 242, + "y": 291 + }, + { + "x": 199, + "y": 198 + }, + { + "x": 223, + "y": 145 + }, + { + "x": 235, + "y": 383 + } + ] + }, + { + "interval": { + "start": 68821, + "end": 73197 + }, + "positions": [ + { + "x": 201, + "y": 212 + }, + { + "x": 138, + "y": 551 + }, + { + "x": 45, + "y": 345 + }, + { + "x": 78, + "y": 178 + }, + { + "x": 258, + "y": 314 + } + ] + }, + { + "interval": { + "start": 75636, + "end": 75724 + }, + "positions": [ + { + "x": 186, + "y": 483 + } + ] + }, + { + "interval": { + "start": 76413, + "end": 76722 + }, + "positions": [ + { + "x": 174, + "y": 309 + } + ] + }, + { + "interval": { + "start": 77182, + "end": 77543 + }, + "positions": [ + { + "x": 253, + "y": 584 + } + ] + }, + { + "interval": { + "start": 77960, + "end": 78261 + }, + "positions": [ + { + "x": 187, + "y": 264 + } + ] + }, + { + "interval": { + "start": 78715, + "end": 79066 + }, + "positions": [ + { + "x": 268, + "y": 581 + } + ] + }, + { + "interval": { + "start": 79350, + "end": 79636 + }, + "positions": [ + { + "x": 194, + "y": 260 + } + ] + }, + { + "interval": { + "start": 90949, + "end": 93071 + }, + "positions": [ + { + "x": 240, + "y": 393 + }, + { + "x": 187, + "y": 272 + }, + { + "x": 226, + "y": 533 + } + ] + }, + { + "interval": { + "start": 93417, + "end": 97492 + }, + "positions": [ + { + "x": 225, + "y": 346 + }, + { + "x": 228, + "y": 262 + }, + { + "x": 133, + "y": 479 + }, + { + "x": 158, + "y": 250 + }, + { + "x": 307, + "y": 336 + } + ] + }, + { + "interval": { + "start": 97952, + "end": 98713 + }, + "positions": [ + { + "x": 230, + "y": 589 + } + ] + }, + { + "interval": { + "start": 98892, + "end": 99710 + }, + "positions": [ + { + "x": 255, + "y": 274 + } + ] + }, + { + "interval": { + "start": 99956, + "end": 100901 + }, + "positions": [ + { + "x": 233, + "y": 475 + } + ] + }, + { + "interval": { + "start": 110978, + "end": 118742 + }, + "positions": [ + { + "x": 243, + "y": 374 + }, + { + "x": 204, + "y": 301 + }, + { + "x": 206, + "y": 290 + }, + { + "x": 199, + "y": 487 + }, + { + "x": 211, + "y": 256 + }, + { + "x": 292, + "y": 205 + }, + { + "x": 127, + "y": 372 + }, + { + "x": 142, + "y": 480 + } + ] + }, + { + "interval": { + "start": 122719, + "end": 130609 + }, + "positions": [ + { + "x": 212, + "y": 391 + }, + { + "x": 187, + "y": 293 + }, + { + "x": 216, + "y": 227 + }, + { + "x": 243, + "y": 200 + }, + { + "x": 312, + "y": 164 + }, + { + "x": 402, + "y": 88 + }, + { + "x": 613, + "y": 310 + }, + { + "x": 466, + "y": 602 + } + ] + }, + { + "interval": { + "start": 812780, + "end": 814455 + }, + "positions": [ + { + "x": 611, + "y": 480 + }, + { + "x": 604, + "y": 480 + } + ] + }, + { + "interval": { + "start": 823121, + "end": 826381 + }, + "positions": [ + { + "x": 271, + "y": 352 + }, + { + "x": 271, + "y": 352 + }, + { + "x": 271, + "y": 352 + }, + { + "x": 271, + "y": 352 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 28676, + "end": 31566 + }, + "positions": [ + { + "x": 190, + "y": 503 + }, + { + "x": 235, + "y": 505 + }, + { + "x": 214, + "y": 521 + } + ] + }, + { + "interval": { + "start": 32347, + "end": 33176 + }, + "positions": [ + { + "x": 192, + "y": 269 + } + ] + }, + { + "interval": { + "start": 35282, + "end": 42482 + }, + "positions": [ + { + "x": 481, + "y": 484 + }, + { + "x": 565, + "y": 435 + }, + { + "x": 195, + "y": 388 + }, + { + "x": 224, + "y": 477 + }, + { + "x": 288, + "y": 430 + }, + { + "x": 165, + "y": 298 + }, + { + "x": 224, + "y": 373 + }, + { + "x": 210, + "y": 291 + } + ] + }, + { + "interval": { + "start": 48939, + "end": 51837 + }, + "positions": [ + { + "x": 169, + "y": 296 + }, + { + "x": 199, + "y": 313 + }, + { + "x": 232, + "y": 275 + } + ] + }, + { + "interval": { + "start": 53320, + "end": 53986 + }, + "positions": [ + { + "x": 896, + "y": 116 + } + ] + }, + { + "interval": { + "start": 55099, + "end": 57261 + }, + "positions": [ + { + "x": 205, + "y": 300 + }, + { + "x": 222, + "y": 345 + }, + { + "x": 209, + "y": 266 + } + ] + }, + { + "interval": { + "start": 63638, + "end": 68218 + }, + "positions": [ + { + "x": 266, + "y": 288 + }, + { + "x": 242, + "y": 291 + }, + { + "x": 199, + "y": 198 + }, + { + "x": 223, + "y": 145 + }, + { + "x": 235, + "y": 383 + } + ] + }, + { + "interval": { + "start": 68821, + "end": 73197 + }, + "positions": [ + { + "x": 201, + "y": 212 + }, + { + "x": 138, + "y": 551 + }, + { + "x": 45, + "y": 345 + }, + { + "x": 78, + "y": 178 + }, + { + "x": 258, + "y": 314 + } + ] + }, + { + "interval": { + "start": 75636, + "end": 75724 + }, + "positions": [ + { + "x": 186, + "y": 483 + } + ] + }, + { + "interval": { + "start": 76413, + "end": 76722 + }, + "positions": [ + { + "x": 174, + "y": 309 + } + ] + }, + { + "interval": { + "start": 77182, + "end": 77543 + }, + "positions": [ + { + "x": 253, + "y": 584 + } + ] + }, + { + "interval": { + "start": 77960, + "end": 78261 + }, + "positions": [ + { + "x": 187, + "y": 264 + } + ] + }, + { + "interval": { + "start": 78715, + "end": 79066 + }, + "positions": [ + { + "x": 268, + "y": 581 + } + ] + }, + { + "interval": { + "start": 79350, + "end": 79636 + }, + "positions": [ + { + "x": 194, + "y": 260 + } + ] + }, + { + "interval": { + "start": 90949, + "end": 93071 + }, + "positions": [ + { + "x": 240, + "y": 393 + }, + { + "x": 187, + "y": 272 + }, + { + "x": 226, + "y": 533 + } + ] + }, + { + "interval": { + "start": 93417, + "end": 97492 + }, + "positions": [ + { + "x": 225, + "y": 346 + }, + { + "x": 228, + "y": 262 + }, + { + "x": 133, + "y": 479 + }, + { + "x": 158, + "y": 250 + }, + { + "x": 307, + "y": 336 + } + ] + }, + { + "interval": { + "start": 97952, + "end": 98713 + }, + "positions": [ + { + "x": 230, + "y": 589 + } + ] + }, + { + "interval": { + "start": 98892, + "end": 99710 + }, + "positions": [ + { + "x": 255, + "y": 274 + } + ] + }, + { + "interval": { + "start": 99956, + "end": 100901 + }, + "positions": [ + { + "x": 233, + "y": 475 + } + ] + }, + { + "interval": { + "start": 134985, + "end": 143947 + }, + "positions": [ + { + "x": 204, + "y": 521 + }, + { + "x": 134, + "y": 424 + }, + { + "x": 77, + "y": 484 + }, + { + "x": 872, + "y": 427 + }, + { + "x": 961, + "y": 240 + }, + { + "x": 982, + "y": 502 + }, + { + "x": 121, + "y": 426 + }, + { + "x": 107, + "y": 176 + }, + { + "x": 211, + "y": 166 + } + ] + }, + { + "interval": { + "start": 145280, + "end": 145351 + }, + "positions": [ + { + "x": 234, + "y": 481 + } + ] + }, + { + "interval": { + "start": 145694, + "end": 145797 + }, + "positions": [ + { + "x": 246, + "y": 464 + } + ] + }, + { + "interval": { + "start": 145930, + "end": 146070 + }, + "positions": [ + { + "x": 242, + "y": 466 + } + ] + }, + { + "interval": { + "start": 146152, + "end": 146433 + }, + "positions": [ + { + "x": 241, + "y": 473 + } + ] + }, + { + "interval": { + "start": 146591, + "end": 146729 + }, + "positions": [ + { + "x": 241, + "y": 468 + } + ] + }, + { + "interval": { + "start": 146848, + "end": 146972 + }, + "positions": [ + { + "x": 241, + "y": 470 + } + ] + }, + { + "interval": { + "start": 147061, + "end": 147194 + }, + "positions": [ + { + "x": 240, + "y": 475 + } + ] + }, + { + "interval": { + "start": 147269, + "end": 147372 + }, + "positions": [ + { + "x": 244, + "y": 478 + } + ] + }, + { + "interval": { + "start": 147461, + "end": 147565 + }, + "positions": [ + { + "x": 244, + "y": 473 + } + ] + }, + { + "interval": { + "start": 147655, + "end": 147758 + }, + "positions": [ + { + "x": 244, + "y": 473 + } + ] + }, + { + "interval": { + "start": 147854, + "end": 147934 + }, + "positions": [ + { + "x": 243, + "y": 474 + } + ] + }, + { + "interval": { + "start": 148055, + "end": 148126 + }, + "positions": [ + { + "x": 242, + "y": 475 + } + ] + }, + { + "interval": { + "start": 148254, + "end": 148312 + }, + "positions": [ + { + "x": 241, + "y": 476 + } + ] + }, + { + "interval": { + "start": 148436, + "end": 148516 + }, + "positions": [ + { + "x": 240, + "y": 478 + } + ] + }, + { + "interval": { + "start": 148638, + "end": 148733 + }, + "positions": [ + { + "x": 237, + "y": 481 + } + ] + }, + { + "interval": { + "start": 148861, + "end": 148925 + }, + "positions": [ + { + "x": 239, + "y": 483 + } + ] + }, + { + "interval": { + "start": 149036, + "end": 149132 + }, + "positions": [ + { + "x": 240, + "y": 483 + } + ] + }, + { + "interval": { + "start": 149252, + "end": 149323 + }, + "positions": [ + { + "x": 240, + "y": 483 + } + ] + }, + { + "interval": { + "start": 149453, + "end": 149522 + }, + "positions": [ + { + "x": 240, + "y": 483 + } + ] + }, + { + "interval": { + "start": 149646, + "end": 149722 + }, + "positions": [ + { + "x": 240, + "y": 486 + } + ] + }, + { + "interval": { + "start": 149843, + "end": 149914 + }, + "positions": [ + { + "x": 240, + "y": 486 + } + ] + }, + { + "interval": { + "start": 150042, + "end": 150130 + }, + "positions": [ + { + "x": 241, + "y": 485 + } + ] + }, + { + "interval": { + "start": 150242, + "end": 154440 + }, + "positions": [ + { + "x": 241, + "y": 485 + }, + { + "x": 93, + "y": 378 + }, + { + "x": 238, + "y": 490 + }, + { + "x": 207, + "y": 602 + }, + { + "x": 176, + "y": 562 + } + ] + }, + { + "interval": { + "start": 155094, + "end": 155156 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 155160, + "end": 155161 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 155267, + "end": 155350 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 155353, + "end": 155353 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 155439, + "end": 155535 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 155538, + "end": 155539 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 155662, + "end": 155762 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 155764, + "end": 155765 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 155853, + "end": 155956 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 155959, + "end": 155960 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 156078, + "end": 156182 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 156186, + "end": 156187 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 156253, + "end": 156377 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 156380, + "end": 156381 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 156481, + "end": 156598 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 156600, + "end": 156601 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + }, + { + "interval": { + "start": 156681, + "end": 157516 + }, + "positions": [ + { + "x": 197, + "y": 461 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 28676, + "end": 31566 + }, + "positions": [ + { + "x": 190, + "y": 503 + }, + { + "x": 235, + "y": 505 + }, + { + "x": 214, + "y": 521 + } + ] + }, + { + "interval": { + "start": 32347, + "end": 33176 + }, + "positions": [ + { + "x": 192, + "y": 269 + } + ] + }, + { + "interval": { + "start": 35282, + "end": 42482 + }, + "positions": [ + { + "x": 481, + "y": 484 + }, + { + "x": 565, + "y": 435 + }, + { + "x": 195, + "y": 388 + }, + { + "x": 224, + "y": 477 + }, + { + "x": 288, + "y": 430 + }, + { + "x": 165, + "y": 298 + }, + { + "x": 224, + "y": 373 + }, + { + "x": 210, + "y": 291 + } + ] + }, + { + "interval": { + "start": 48939, + "end": 51837 + }, + "positions": [ + { + "x": 169, + "y": 296 + }, + { + "x": 199, + "y": 313 + }, + { + "x": 232, + "y": 275 + } + ] + }, + { + "interval": { + "start": 53320, + "end": 53986 + }, + "positions": [ + { + "x": 896, + "y": 116 + } + ] + }, + { + "interval": { + "start": 55099, + "end": 57261 + }, + "positions": [ + { + "x": 205, + "y": 300 + }, + { + "x": 222, + "y": 345 + }, + { + "x": 209, + "y": 266 + } + ] + }, + { + "interval": { + "start": 63638, + "end": 68218 + }, + "positions": [ + { + "x": 266, + "y": 288 + }, + { + "x": 242, + "y": 291 + }, + { + "x": 199, + "y": 198 + }, + { + "x": 223, + "y": 145 + }, + { + "x": 235, + "y": 383 + } + ] + }, + { + "interval": { + "start": 68821, + "end": 73197 + }, + "positions": [ + { + "x": 201, + "y": 212 + }, + { + "x": 138, + "y": 551 + }, + { + "x": 45, + "y": 345 + }, + { + "x": 78, + "y": 178 + }, + { + "x": 258, + "y": 314 + } + ] + }, + { + "interval": { + "start": 75636, + "end": 75724 + }, + "positions": [ + { + "x": 186, + "y": 483 + } + ] + }, + { + "interval": { + "start": 76413, + "end": 76722 + }, + "positions": [ + { + "x": 174, + "y": 309 + } + ] + }, + { + "interval": { + "start": 77182, + "end": 77543 + }, + "positions": [ + { + "x": 253, + "y": 584 + } + ] + }, + { + "interval": { + "start": 77960, + "end": 78261 + }, + "positions": [ + { + "x": 187, + "y": 264 + } + ] + }, + { + "interval": { + "start": 78715, + "end": 79066 + }, + "positions": [ + { + "x": 268, + "y": 581 + } + ] + }, + { + "interval": { + "start": 79350, + "end": 79636 + }, + "positions": [ + { + "x": 194, + "y": 260 + } + ] + }, + { + "interval": { + "start": 90949, + "end": 93071 + }, + "positions": [ + { + "x": 240, + "y": 393 + }, + { + "x": 187, + "y": 272 + }, + { + "x": 226, + "y": 533 + } + ] + }, + { + "interval": { + "start": 93417, + "end": 97492 + }, + "positions": [ + { + "x": 225, + "y": 346 + }, + { + "x": 228, + "y": 262 + }, + { + "x": 133, + "y": 479 + }, + { + "x": 158, + "y": 250 + }, + { + "x": 307, + "y": 336 + } + ] + }, + { + "interval": { + "start": 97952, + "end": 98713 + }, + "positions": [ + { + "x": 230, + "y": 589 + } + ] + }, + { + "interval": { + "start": 98892, + "end": 99710 + }, + "positions": [ + { + "x": 255, + "y": 274 + } + ] + }, + { + "interval": { + "start": 99956, + "end": 100901 + }, + "positions": [ + { + "x": 233, + "y": 475 + } + ] + }, + { + "interval": { + "start": 161347, + "end": 168129 + }, + "positions": [ + { + "x": 229, + "y": 394 + }, + { + "x": 193, + "y": 320 + }, + { + "x": 227, + "y": 306 + }, + { + "x": 235, + "y": 260 + }, + { + "x": 201, + "y": 543 + }, + { + "x": 222, + "y": 505 + }, + { + "x": 216, + "y": 338 + } + ] + }, + { + "interval": { + "start": 169122, + "end": 170597 + }, + "positions": [ + { + "x": 257, + "y": 220 + }, + { + "x": 252, + "y": 151 + } + ] + }, + { + "interval": { + "start": 171560, + "end": 171800 + }, + "positions": [ + { + "x": 225, + "y": 441 + } + ] + }, + { + "interval": { + "start": 860938, + "end": 862071 + }, + "positions": [ + { + "x": 1184, + "y": 568 + }, + { + "x": 1164, + "y": 555 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 28676, + "end": 31566 + }, + "positions": [ + { + "x": 190, + "y": 503 + }, + { + "x": 235, + "y": 505 + }, + { + "x": 214, + "y": 521 + } + ] + }, + { + "interval": { + "start": 32347, + "end": 33176 + }, + "positions": [ + { + "x": 192, + "y": 269 + } + ] + }, + { + "interval": { + "start": 35282, + "end": 42482 + }, + "positions": [ + { + "x": 481, + "y": 484 + }, + { + "x": 565, + "y": 435 + }, + { + "x": 195, + "y": 388 + }, + { + "x": 224, + "y": 477 + }, + { + "x": 288, + "y": 430 + }, + { + "x": 165, + "y": 298 + }, + { + "x": 224, + "y": 373 + }, + { + "x": 210, + "y": 291 + } + ] + }, + { + "interval": { + "start": 48939, + "end": 51837 + }, + "positions": [ + { + "x": 169, + "y": 296 + }, + { + "x": 199, + "y": 313 + }, + { + "x": 232, + "y": 275 + } + ] + }, + { + "interval": { + "start": 53320, + "end": 53986 + }, + "positions": [ + { + "x": 896, + "y": 116 + } + ] + }, + { + "interval": { + "start": 55099, + "end": 57261 + }, + "positions": [ + { + "x": 205, + "y": 300 + }, + { + "x": 222, + "y": 345 + }, + { + "x": 209, + "y": 266 + } + ] + }, + { + "interval": { + "start": 63638, + "end": 68218 + }, + "positions": [ + { + "x": 266, + "y": 288 + }, + { + "x": 242, + "y": 291 + }, + { + "x": 199, + "y": 198 + }, + { + "x": 223, + "y": 145 + }, + { + "x": 235, + "y": 383 + } + ] + }, + { + "interval": { + "start": 68821, + "end": 73197 + }, + "positions": [ + { + "x": 201, + "y": 212 + }, + { + "x": 138, + "y": 551 + }, + { + "x": 45, + "y": 345 + }, + { + "x": 78, + "y": 178 + }, + { + "x": 258, + "y": 314 + } + ] + }, + { + "interval": { + "start": 75636, + "end": 75724 + }, + "positions": [ + { + "x": 186, + "y": 483 + } + ] + }, + { + "interval": { + "start": 76413, + "end": 76722 + }, + "positions": [ + { + "x": 174, + "y": 309 + } + ] + }, + { + "interval": { + "start": 77182, + "end": 77543 + }, + "positions": [ + { + "x": 253, + "y": 584 + } + ] + }, + { + "interval": { + "start": 77960, + "end": 78261 + }, + "positions": [ + { + "x": 187, + "y": 264 + } + ] + }, + { + "interval": { + "start": 78715, + "end": 79066 + }, + "positions": [ + { + "x": 268, + "y": 581 + } + ] + }, + { + "interval": { + "start": 79350, + "end": 79636 + }, + "positions": [ + { + "x": 194, + "y": 260 + } + ] + }, + { + "interval": { + "start": 90949, + "end": 93071 + }, + "positions": [ + { + "x": 240, + "y": 393 + }, + { + "x": 187, + "y": 272 + }, + { + "x": 226, + "y": 533 + } + ] + }, + { + "interval": { + "start": 93417, + "end": 97492 + }, + "positions": [ + { + "x": 225, + "y": 346 + }, + { + "x": 228, + "y": 262 + }, + { + "x": 133, + "y": 479 + }, + { + "x": 158, + "y": 250 + }, + { + "x": 307, + "y": 336 + } + ] + }, + { + "interval": { + "start": 97952, + "end": 98713 + }, + "positions": [ + { + "x": 230, + "y": 589 + } + ] + }, + { + "interval": { + "start": 98892, + "end": 99710 + }, + "positions": [ + { + "x": 255, + "y": 274 + } + ] + }, + { + "interval": { + "start": 99956, + "end": 100901 + }, + "positions": [ + { + "x": 233, + "y": 475 + } + ] + } + ] + } + ], + "endgameShift": { + "shootEvents": [ + { + "interval": { + "start": 28676, + "end": 31566 + }, + "positions": [ + { + "x": 190, + "y": 503 + }, + { + "x": 235, + "y": 505 + }, + { + "x": 214, + "y": 521 + } + ] + }, + { + "interval": { + "start": 32347, + "end": 33176 + }, + "positions": [ + { + "x": 192, + "y": 269 + } + ] + }, + { + "interval": { + "start": 35282, + "end": 42482 + }, + "positions": [ + { + "x": 481, + "y": 484 + }, + { + "x": 565, + "y": 435 + }, + { + "x": 195, + "y": 388 + }, + { + "x": 224, + "y": 477 + }, + { + "x": 288, + "y": 430 + }, + { + "x": 165, + "y": 298 + }, + { + "x": 224, + "y": 373 + }, + { + "x": 210, + "y": 291 + } + ] + }, + { + "interval": { + "start": 48939, + "end": 51837 + }, + "positions": [ + { + "x": 169, + "y": 296 + }, + { + "x": 199, + "y": 313 + }, + { + "x": 232, + "y": 275 + } + ] + }, + { + "interval": { + "start": 53320, + "end": 53986 + }, + "positions": [ + { + "x": 896, + "y": 116 + } + ] + }, + { + "interval": { + "start": 55099, + "end": 57261 + }, + "positions": [ + { + "x": 205, + "y": 300 + }, + { + "x": 222, + "y": 345 + }, + { + "x": 209, + "y": 266 + } + ] + }, + { + "interval": { + "start": 63638, + "end": 68218 + }, + "positions": [ + { + "x": 266, + "y": 288 + }, + { + "x": 242, + "y": 291 + }, + { + "x": 199, + "y": 198 + }, + { + "x": 223, + "y": 145 + }, + { + "x": 235, + "y": 383 + } + ] + }, + { + "interval": { + "start": 68821, + "end": 73197 + }, + "positions": [ + { + "x": 201, + "y": 212 + }, + { + "x": 138, + "y": 551 + }, + { + "x": 45, + "y": 345 + }, + { + "x": 78, + "y": 178 + }, + { + "x": 258, + "y": 314 + } + ] + }, + { + "interval": { + "start": 75636, + "end": 75724 + }, + "positions": [ + { + "x": 186, + "y": 483 + } + ] + }, + { + "interval": { + "start": 76413, + "end": 76722 + }, + "positions": [ + { + "x": 174, + "y": 309 + } + ] + }, + { + "interval": { + "start": 77182, + "end": 77543 + }, + "positions": [ + { + "x": 253, + "y": 584 + } + ] + }, + { + "interval": { + "start": 77960, + "end": 78261 + }, + "positions": [ + { + "x": 187, + "y": 264 + } + ] + }, + { + "interval": { + "start": 78715, + "end": 79066 + }, + "positions": [ + { + "x": 268, + "y": 581 + } + ] + }, + { + "interval": { + "start": 79350, + "end": 79636 + }, + "positions": [ + { + "x": 194, + "y": 260 + } + ] + }, + { + "interval": { + "start": 90949, + "end": 93071 + }, + "positions": [ + { + "x": 240, + "y": 393 + }, + { + "x": 187, + "y": 272 + }, + { + "x": 226, + "y": 533 + } + ] + }, + { + "interval": { + "start": 93417, + "end": 97492 + }, + "positions": [ + { + "x": 225, + "y": 346 + }, + { + "x": 228, + "y": 262 + }, + { + "x": 133, + "y": 479 + }, + { + "x": 158, + "y": 250 + }, + { + "x": 307, + "y": 336 + } + ] + }, + { + "interval": { + "start": 97952, + "end": 98713 + }, + "positions": [ + { + "x": 230, + "y": 589 + } + ] + }, + { + "interval": { + "start": 98892, + "end": 99710 + }, + "positions": [ + { + "x": 255, + "y": 274 + } + ] + }, + { + "interval": { + "start": 99956, + "end": 100901 + }, + "positions": [ + { + "x": 233, + "y": 475 + } + ] + } + ] + }, + "movement": { + "bumpStuck": false + }, + "climb": { + "climbTime": { + "L1": null, + "L2": null, + "L3": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + } + }, + "comment": "No intake from a specific point\n", + "robotBroken": false + }, + { + "_id": "69cf8d490c7206197dfb1e00", + "scouterName": "Big yoni", + "competition": "TESTING", + "match": { + "type": "qualification", + "number": 9 + }, + "teamNumber": 4590, + "auto": { + "movement": { + "trenchPass": false, + "bumpPass": false, + "bumpStuck": true + }, + "chosenAuto": "trenchFuelMiddle", + "climb": { + "climbTime": { + "L1": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + }, + "shootEvents": [ + { + "interval": { + "start": 95514, + "end": 96432 + }, + "positions": [ + { + "x": 447, + "y": 279 + } + ] + }, + { + "interval": { + "start": 97549, + "end": 99945 + }, + "positions": [ + { + "x": 387, + "y": 208 + }, + { + "x": 387, + "y": 208 + }, + { + "x": 387, + "y": 208 + } + ] + } + ] + }, + "tele": { + "transitionShift": { + "shootEvents": [] + }, + "shifts": [ + { + "shootEvents": [ + { + "interval": { + "start": 131051, + "end": 133620 + }, + "positions": [ + { + "x": 305, + "y": 347 + }, + { + "x": 305, + "y": 347 + }, + { + "x": 305, + "y": 347 + } + ] + }, + { + "interval": { + "start": 133959, + "end": 141705 + }, + "positions": [ + { + "x": 305, + "y": 347 + }, + { + "x": 305, + "y": 347 + }, + { + "x": 305, + "y": 347 + }, + { + "x": 248, + "y": 403 + }, + { + "x": 179, + "y": 518 + }, + { + "x": 133, + "y": 574 + }, + { + "x": 197, + "y": 524 + }, + { + "x": 199, + "y": 506 + } + ] + }, + { + "interval": { + "start": 142657, + "end": 144179 + }, + "positions": [ + { + "x": 197, + "y": 504 + }, + { + "x": 197, + "y": 504 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 161290, + "end": 166388 + }, + "positions": [ + { + "x": 497, + "y": 464 + }, + { + "x": 748, + "y": 477 + }, + { + "x": 740, + "y": 573 + }, + { + "x": 787, + "y": 566 + }, + { + "x": 768, + "y": 561 + }, + { + "x": 768, + "y": 452 + } + ] + }, + { + "interval": { + "start": 166930, + "end": 167801 + }, + "positions": [ + { + "x": 750, + "y": 533 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 172557, + "end": 182371 + }, + "positions": [ + { + "x": 182, + "y": 487 + }, + { + "x": 189, + "y": 517 + }, + { + "x": 236, + "y": 481 + }, + { + "x": 210, + "y": 492 + }, + { + "x": 232, + "y": 512 + }, + { + "x": 225, + "y": 491 + }, + { + "x": 273, + "y": 527 + }, + { + "x": 237, + "y": 519 + }, + { + "x": 274, + "y": 525 + }, + { + "x": 307, + "y": 476 + } + ] + }, + { + "interval": { + "start": 188387, + "end": 189411 + }, + "positions": [ + { + "x": 136, + "y": 585 + }, + { + "x": 239, + "y": 444 + } + ] + }, + { + "interval": { + "start": 189478, + "end": 195838 + }, + "positions": [ + { + "x": 259, + "y": 446 + }, + { + "x": 297, + "y": 406 + }, + { + "x": 260, + "y": 510 + }, + { + "x": 238, + "y": 579 + }, + { + "x": 285, + "y": 611 + }, + { + "x": 158, + "y": 591 + }, + { + "x": 164, + "y": 517 + } + ] + } + ] + }, + { + "shootEvents": [] + } + ], + "endgameShift": { + "shootEvents": [ + { + "interval": { + "start": 225291, + "end": 231230 + }, + "positions": [ + { + "x": 164, + "y": 420 + }, + { + "x": 202, + "y": 383 + }, + { + "x": 241, + "y": 304 + }, + { + "x": 234, + "y": 344 + }, + { + "x": 234, + "y": 344 + }, + { + "x": 234, + "y": 344 + } + ] + }, + { + "interval": { + "start": 234861, + "end": 237418 + }, + "positions": [ + { + "x": 154, + "y": 486 + }, + { + "x": 77, + "y": 320 + }, + { + "x": 78, + "y": 313 + } + ] + }, + { + "interval": { + "start": 237997, + "end": 240768 + }, + "positions": [ + { + "x": 169, + "y": 344 + }, + { + "x": 138, + "y": 311 + }, + { + "x": 149, + "y": 343 + } + ] + }, + { + "interval": { + "start": 241174, + "end": 241448 + }, + "positions": [ + { + "x": 212, + "y": 449 + } + ] + }, + { + "interval": { + "start": 242021, + "end": 243638 + }, + "positions": [ + { + "x": 154, + "y": 494 + }, + { + "x": 91, + "y": 471 + } + ] + }, + { + "interval": { + "start": 244615, + "end": 246701 + }, + "positions": [ + { + "x": 155, + "y": 519 + }, + { + "x": 142, + "y": 571 + }, + { + "x": 103, + "y": 567 + } + ] + } + ] + }, + "movement": { + "bumpStuck": false + }, + "climb": { + "climbTime": { + "L1": null, + "L2": null, + "L3": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + } + }, + "comment": "W game play ", + "robotBroken": false + }, + { + "_id": "69cf8d490c7206197dfb1e01", + "scouterName": "Big yoni", + "competition": "TESTING", + "match": { + "type": "qualification", + "number": 2 + }, + "teamNumber": 4590, + "auto": { + "movement": { + "trenchPass": false, + "bumpPass": false, + "bumpStuck": false + }, + "chosenAuto": "trenchFuelMiddle", + "climb": { + "climbTime": { + "L1": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + }, + "shootEvents": [ + { + "interval": { + "start": 82167, + "end": 83349 + }, + "positions": [ + { + "x": 246, + "y": 454 + }, + { + "x": 265, + "y": 423 + } + ] + }, + { + "interval": { + "start": 89123, + "end": 89732 + }, + "positions": [ + { + "x": 48, + "y": 571 + } + ] + }, + { + "interval": { + "start": 90303, + "end": 91002 + }, + "positions": [ + { + "x": 59, + "y": 570 + } + ] + }, + { + "interval": { + "start": 94516, + "end": 94711 + }, + "positions": [ + { + "x": 305, + "y": 446 + } + ] + } + ] + }, + "tele": { + "transitionShift": { + "shootEvents": [] + }, + "shifts": [ + { + "shootEvents": [ + { + "interval": { + "start": 117489, + "end": 122948 + }, + "positions": [ + { + "x": 243, + "y": 439 + }, + { + "x": 259, + "y": 465 + }, + { + "x": 261, + "y": 466 + }, + { + "x": 259, + "y": 473 + }, + { + "x": 259, + "y": 473 + }, + { + "x": 259, + "y": 473 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 161248, + "end": 162091 + }, + "positions": [ + { + "x": 699, + "y": 193 + } + ] + }, + { + "interval": { + "start": 162718, + "end": 163407 + }, + "positions": [ + { + "x": 781, + "y": 163 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 166705, + "end": 169333 + }, + "positions": [ + { + "x": 763, + "y": 130 + }, + { + "x": 791, + "y": 125 + }, + { + "x": 791, + "y": 130 + } + ] + }, + { + "interval": { + "start": 170032, + "end": 172738 + }, + "positions": [ + { + "x": 789, + "y": 144 + }, + { + "x": 789, + "y": 144 + }, + { + "x": 789, + "y": 144 + } + ] + }, + { + "interval": { + "start": 173657, + "end": 174567 + }, + "positions": [ + { + "x": 789, + "y": 144 + } + ] + }, + { + "interval": { + "start": 174817, + "end": 175347 + }, + "positions": [ + { + "x": 789, + "y": 144 + } + ] + }, + { + "interval": { + "start": 175477, + "end": 176303 + }, + "positions": [ + { + "x": 789, + "y": 144 + } + ] + }, + { + "interval": { + "start": 176469, + "end": 177246 + }, + "positions": [ + { + "x": 789, + "y": 144 + } + ] + }, + { + "interval": { + "start": 177410, + "end": 178769 + }, + "positions": [ + { + "x": 789, + "y": 144 + }, + { + "x": 789, + "y": 144 + } + ] + }, + { + "interval": { + "start": 181373, + "end": 183147 + }, + "positions": [ + { + "x": 780, + "y": 135 + }, + { + "x": 797, + "y": 118 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 199619, + "end": 200557 + }, + "positions": [ + { + "x": 1296, + "y": 101 + } + ] + }, + { + "interval": { + "start": 204346, + "end": 205504 + }, + "positions": [ + { + "x": 835, + "y": 192 + }, + { + "x": 824, + "y": 149 + } + ] + }, + { + "interval": { + "start": 206534, + "end": 211850 + }, + "positions": [ + { + "x": 813, + "y": 189 + }, + { + "x": 813, + "y": 272 + }, + { + "x": 807, + "y": 302 + }, + { + "x": 847, + "y": 279 + }, + { + "x": 864, + "y": 227 + }, + { + "x": 859, + "y": 196 + } + ] + }, + { + "interval": { + "start": 212383, + "end": 213396 + }, + "positions": [ + { + "x": 880, + "y": 161 + }, + { + "x": 883, + "y": 166 + } + ] + } + ] + } + ], + "endgameShift": { + "shootEvents": [] + }, + "movement": { + "bumpStuck": false + }, + "climb": { + "climbTime": { + "L1": null, + "L2": null, + "L3": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + } + }, + "comment": "", + "robotBroken": false + }, + { + "_id": "69cf8e830c7206197dfb1e48", + "scouterName": "Big yoni", + "competition": "TESTING", + "match": { + "type": "qualification", + "number": 2 + }, + "teamNumber": 4744, + "auto": { + "movement": { + "trenchPass": false, + "bumpPass": true, + "bumpStuck": false + }, + "chosenAuto": "trenchFuelMiddle", + "climb": { + "climbTime": { + "L1": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + }, + "shootEvents": [ + { + "interval": { + "start": 350769, + "end": 351285 + }, + "positions": [ + { + "x": 374, + "y": 198 + } + ] + } + ] + }, + "tele": { + "transitionShift": { + "shootEvents": [ + { + "interval": { + "start": 370876, + "end": 372591 + }, + "positions": [ + { + "x": 274, + "y": 263 + }, + { + "x": 273, + "y": 257 + } + ] + }, + { + "interval": { + "start": 54157, + "end": 56680 + }, + "positions": [ + { + "x": 292, + "y": 231 + }, + { + "x": 289, + "y": 256 + }, + { + "x": 289, + "y": 256 + } + ] + }, + { + "interval": { + "start": 150777, + "end": 153589 + }, + "positions": [ + { + "x": 263, + "y": 209 + }, + { + "x": 263, + "y": 209 + }, + { + "x": 324, + "y": 264 + } + ] + } + ] + }, + "shifts": [ + { + "shootEvents": [ + { + "interval": { + "start": 389816, + "end": 390610 + }, + "positions": [ + { + "x": 644, + "y": 118 + } + ] + }, + { + "interval": { + "start": 163121, + "end": 167358 + }, + "positions": [ + { + "x": 624, + "y": 145 + }, + { + "x": 592, + "y": 187 + }, + { + "x": 596, + "y": 182 + }, + { + "x": 598, + "y": 180 + }, + { + "x": 598, + "y": 180 + } + ] + }, + { + "interval": { + "start": 168638, + "end": 170186 + }, + "positions": [ + { + "x": 620, + "y": 174 + }, + { + "x": 588, + "y": 171 + } + ] + }, + { + "interval": { + "start": 175745, + "end": 177728 + }, + "positions": [ + { + "x": 672, + "y": 190 + }, + { + "x": 595, + "y": 130 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 185945, + "end": 188224 + }, + "positions": [ + { + "x": 205, + "y": 256 + }, + { + "x": 171, + "y": 210 + }, + { + "x": 166, + "y": 192 + } + ] + }, + { + "interval": { + "start": 195390, + "end": 197826 + }, + "positions": [ + { + "x": 186, + "y": 126 + }, + { + "x": 200, + "y": 162 + }, + { + "x": 202, + "y": 155 + } + ] + }, + { + "interval": { + "start": 204700, + "end": 204957 + }, + "positions": [ + { + "x": 279, + "y": 227 + } + ] + }, + { + "interval": { + "start": 205617, + "end": 206459 + }, + "positions": [ + { + "x": 252, + "y": 167 + } + ] + }, + { + "interval": { + "start": 208121, + "end": 209088 + }, + "positions": [ + { + "x": 216, + "y": 143 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 217832, + "end": 219652 + }, + "positions": [ + { + "x": 632, + "y": 154 + }, + { + "x": 597, + "y": 153 + } + ] + }, + { + "interval": { + "start": 229379, + "end": 230903 + }, + "positions": [ + { + "x": 620, + "y": 476 + }, + { + "x": 652, + "y": 458 + } + ] + } + ] + }, + { + "shootEvents": [ + { + "interval": { + "start": 242194, + "end": 246544 + }, + "positions": [ + { + "x": 553, + "y": 145 + }, + { + "x": 268, + "y": 159 + }, + { + "x": 241, + "y": 174 + }, + { + "x": 143, + "y": 140 + }, + { + "x": 118, + "y": 128 + } + ] + }, + { + "interval": { + "start": 251247, + "end": 254386 + }, + "positions": [ + { + "x": 141, + "y": 147 + }, + { + "x": 178, + "y": 183 + }, + { + "x": 170, + "y": 180 + }, + { + "x": 172, + "y": 179 + } + ] + } + ] + } + ], + "endgameShift": { + "shootEvents": [ + { + "interval": { + "start": 261485, + "end": 262609 + }, + "positions": [ + { + "x": 176, + "y": 208 + }, + { + "x": 179, + "y": 212 + } + ] + }, + { + "interval": { + "start": 275042, + "end": 278003 + }, + "positions": [ + { + "x": 219, + "y": 284 + }, + { + "x": 219, + "y": 281 + }, + { + "x": 219, + "y": 280 + } + ] + }, + { + "interval": { + "start": 285770, + "end": 288696 + }, + "positions": [ + { + "x": 246, + "y": 179 + }, + { + "x": 245, + "y": 182 + }, + { + "x": 244, + "y": 187 + } + ] + } + ] + }, + "movement": { + "bumpStuck": false + }, + "climb": { + "climbTime": { + "L1": null, + "L2": null, + "L3": null + }, + "climbSide": { + "middle": false, + "side": false, + "support": false + }, + "level": "L0" + } + }, + "comment": "", + "robotBroken": false + } + ] +}