{
  "kind": "native render of firmware drawing code with synthetic data, not a photo of a device",
  "firmware_release": "0.10.14-sticks3-analog-cleanui",
  "runtime_version": "0.10.14-sticks3-cleanui",
  "application_sha256": "428543c2a012f5ee865999e62494e1608b77a9091a62b253fae9fb1e87ad2b25",
  "release_source_dir": "custom-beypass/firmware/releases/0.10.14-sticks3-analog-cleanui/source",
  "render_path": {
    "harness_files": {
      "render_ui.cpp": "f85efc2e7482f6f448fb3fd283eb792d13ad975af6e209d5b7a36327e334946d",
      "extract_firmware.py": "44dbb87998f35bbffc76a0dc4f457eed932c8b396c37fe7b2272669c3a93ac12",
      "build.sh": "ca5f31e2ebeabfb7b8f4aee90f14622ced3e47f5bad960bec24028e28a59e8f4",
      "make_pngs.py": "b5bac42f21e17f41deae854a597b4a88fe46d23203fa8f87c6212dfb2f286876"
    },
    "method": "draw(), drawBattery(), drawSettings(), drawLiveLevel() and the Snapshot struct are cut verbatim from the release source by extract_firmware.py (line ranges listed per image); PracticeUI::draw, MotionUI::feedback/spatial, MotionReplay, LaunchMotion::Ring, LaunchFeedback, StickS3Level, StickS3Battery, InactivityTimer, PracticeHistory are compiled unmodified from the release headers. Only hardware/Arduino stubs (millis, Serial, M5.Display, acquisition.displayBoundary, screen.pushSprite) and the global state values are supplied by the harness.",
    "graphics": "real M5GFX LGFX sprite (M5Canvas, 16-bit RGB565, 135x240, rotation 0) with the real built-in fonts (Font0/Font2/Font4/Font6), compiled natively on macOS with the SDL platform config (-DLGFX_SDL); the sprite buffer is read with readPixel() as firmware exportScreen() does and RGB565 is expanded to RGB888 by bit replication. Panel gamma/colour response of the physical ST7789 is not modelled.",
    "m5gfx_library": "custom-beypass/firmware/.arduino/m5-libraries/M5GFX",
    "m5gfx_version": "0.2.30",
    "m5gfx_git_commit": "b863d50dd3ca57b65c61a468001925fee70b3e05",
    "sdl2_version": "2.32.8",
    "compiler": "Apple clang, -std=c++17 -O1"
  },
  "source_file_sha256": {
    "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
    "launch_feedback.h": "33721aac3a4c89af067f305249858b1efc4b72fdf176600754f72455ad76d2fd",
    "launch_motion.h": "cb9e1a84b9c971019043d0a4fe1c6948a81294d18c2e1aa79dca433dc2237818",
    "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4",
    "motion_replay.h": "0f2f70509b9d6386d973bbcb9bc1cef35dca1df460ccc91ca7b5825e5684c7ec",
    "motion_ui.h": "91840a7708a359168a0a5568bfac5cd1058e54f2d896543570ad487b85722967",
    "power_status.h": "372a37b6c41bcd109d20ecb3c3618ae505b3638c88409c62b831c69cbb36c046",
    "practice_history.h": "75bc7e9f3e1bf2256956bf51d0a3eb44d320cebfae3157e1cc19edadee308e99",
    "practice_ui.h": "971afb079c98d9a9d27143bed9a188b2a59a6f5e0579d6904807a5731d219e6b",
    "practice_views.h": "9b0d0dbe2266653166fb1fddddbad713af83fb4cf317d0daa8de8e9325c8662a",
    "rpm_estimator.h": "45ee94c66d0d233d8659e6699fe5a3775712efea65e400e1369259bf0e4600fd"
  },
  "images": {
    "live.png": {
      "description": "Main live screen, READY, last pull 8120 RPM, level near flat (cyan)",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "LaunchLabMini.ino drawLiveLevel() lines 333-349",
        "level_indicator.h StickS3Level::feed/reading"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4"
      },
      "inputs": {
        "snapshot": "phase=Ready, ready=true, signalFault=false, valid=true, resultRpm=8120",
        "history/UI flags": "historyPage=false, launchFeedback not shown, diagnostics=false, tournamentMode=false",
        "accelerometer_g": "gravity fed to StickS3Level: x=0.018 y=-0.020 z=0.9995 (60 samples, 10 ms apart) -> reading 1.5 deg"
      },
      "png_sha256": "b4d6bf6cd5a5b6b7aca5c3f4886c3e44c3826b729902e918a0363d37b3099d5d",
      "png_3x_file": "live@3x.png",
      "png_3x_sha256": "841fc49992707a568f87d3d7b2cd73f41de438fff1c444922433fedc4f0eb844",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "live-no-pull.png": {
      "description": "Main live screen, READY before any pull ('--')",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "LaunchLabMini.ino drawLiveLevel() lines 333-349"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4"
      },
      "inputs": {
        "snapshot": "phase=Ready, ready=true, valid=false (no result yet -> '--')",
        "history/UI flags": "historyPage=false, launchFeedback not shown, diagnostics=false, tournamentMode=false",
        "accelerometer_g": "same as live"
      },
      "png_sha256": "b0691bd5b794fc75ce321b0beb6bd13a862d45f397af5a5fc27799aa95790729",
      "png_3x_file": "live-no-pull@3x.png",
      "png_3x_sha256": "8f892933e4ec639b6fa60944df8f7ad6ca39f8458e7cb65444cae28d6ac499de",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "live-tilted.png": {
      "description": "Main live screen with launcher tilted 5.7 deg (orange level dot)",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "LaunchLabMini.ino drawLiveLevel() lines 333-349"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4"
      },
      "inputs": {
        "snapshot": "phase=Ready, ready=true, signalFault=false, valid=true, resultRpm=8120",
        "history/UI flags": "historyPage=false, launchFeedback not shown, diagnostics=false, tournamentMode=false",
        "accelerometer_g": "x=0.085 y=0.050 z=0.99 -> 5.7 deg (orange)"
      },
      "png_sha256": "7365276a743accb406d1333f359fc9ce33e07a1d04a72fea93fdbeb6b212617c",
      "png_3x_file": "live-tilted@3x.png",
      "png_3x_sha256": "848c4d513f5bc276c2dae9f10cf2c452d9181f57310a807df76cbe256ffaf2fe",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "history.png": {
      "description": "Launch history list (session summary + last 5 pulls)",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "practice_ui.h PracticeUI::draw()",
        "practice_history.h PracticeHistory",
        "practice_views.h"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "practice_ui.h": "971afb079c98d9a9d27143bed9a188b2a59a6f5e0579d6904807a5731d219e6b",
        "practice_history.h": "75bc7e9f3e1bf2256956bf51d0a3eb44d320cebfae3157e1cc19edadee308e99",
        "practice_views.h": "9b0d0dbe2266653166fb1fddddbad713af83fb4cf317d0daa8de8e9325c8662a"
      },
      "inputs": {
        "view": "View::Recent offset 0",
        "history": "12 pulls / 3 sessions: S1 6120,6480,6350,6710 | S2 6890,7240,7060,7410 | S3 7580,7790,7620,8120 RPM (fed through PracticeHistory::accept(), 45 s between pulls, 11 min between sessions)"
      },
      "png_sha256": "ae9102cb151dbd0c4a4562dd76779e6f6ace64a09c8d6327a2a55798a7fe500c",
      "png_3x_file": "history@3x.png",
      "png_3x_sha256": "5bc454456bf4adecd7902cd3f4e557217771c64d164ca80b421e24ec8ce906cb",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "pull-trend.png": {
      "description": "Pull trend (last-5 average, scatter + trailing 5-pull average)",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "practice_ui.h PracticeUI::draw()",
        "practice_history.h PracticeHistory",
        "practice_views.h"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "practice_ui.h": "971afb079c98d9a9d27143bed9a188b2a59a6f5e0579d6904807a5731d219e6b",
        "practice_history.h": "75bc7e9f3e1bf2256956bf51d0a3eb44d320cebfae3157e1cc19edadee308e99",
        "practice_views.h": "9b0d0dbe2266653166fb1fddddbad713af83fb4cf317d0daa8de8e9325c8662a"
      },
      "inputs": {
        "view": "View::Pulls offset 0",
        "history": "12 pulls / 3 sessions: S1 6120,6480,6350,6710 | S2 6890,7240,7060,7410 | S3 7580,7790,7620,8120 RPM (fed through PracticeHistory::accept(), 45 s between pulls, 11 min between sessions)"
      },
      "png_sha256": "824823f412f350e021ace22735fba2d399307f5334c5da94f8e0f4095e4055c5",
      "png_3x_file": "pull-trend@3x.png",
      "png_3x_sha256": "d08d14be5b3547f789d6892eab0ea7a2449ab691293023d7d6c6f6683454740c",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "session-trend.png": {
      "description": "Session trend, 3 sessions (firmware shows 'Need 4 sessions' below 4)",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "practice_ui.h PracticeUI::draw()",
        "practice_history.h PracticeHistory",
        "practice_views.h"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "practice_ui.h": "971afb079c98d9a9d27143bed9a188b2a59a6f5e0579d6904807a5731d219e6b",
        "practice_history.h": "75bc7e9f3e1bf2256956bf51d0a3eb44d320cebfae3157e1cc19edadee308e99",
        "practice_views.h": "9b0d0dbe2266653166fb1fddddbad713af83fb4cf317d0daa8de8e9325c8662a"
      },
      "inputs": {
        "view": "View::Sessions offset 0",
        "history": "12 pulls / 3 sessions: S1 6120,6480,6350,6710 | S2 6890,7240,7060,7410 | S3 7580,7790,7620,8120 RPM (fed through PracticeHistory::accept(), 45 s between pulls, 11 min between sessions)"
      },
      "png_sha256": "79994ca66735673e2c8b87ea7fd4c08f1a0ae80418fcbabddc4a93c00724f63c",
      "png_3x_file": "session-trend@3x.png",
      "png_3x_sha256": "636ce9480af22be247327b07bf6bb8a2e113206adf5066b2730fd5a106c51e11",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "history-4s.png": {
      "description": "Launch history, 16-pull / 4-session variant",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "practice_ui.h PracticeUI::draw()",
        "practice_history.h PracticeHistory",
        "practice_views.h"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "practice_ui.h": "971afb079c98d9a9d27143bed9a188b2a59a6f5e0579d6904807a5731d219e6b",
        "practice_history.h": "75bc7e9f3e1bf2256956bf51d0a3eb44d320cebfae3157e1cc19edadee308e99",
        "practice_views.h": "9b0d0dbe2266653166fb1fddddbad713af83fb4cf317d0daa8de8e9325c8662a"
      },
      "inputs": {
        "view": "View::Recent offset 0",
        "history": "16 pulls / 4 sessions: S1 5480,5810,5650,5960 + the three sessions of the standard dataset (renumbered S2-S4)"
      },
      "png_sha256": "920493a030205e8a155b94a10bcb35d153881143abcee884aa0b87faeef5515f",
      "png_3x_file": "history-4s@3x.png",
      "png_3x_sha256": "f3607c92b9f9e1ed8ea509e9f38b6c6ea6c629c7b0da1633a72bbbbaea8c0120",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "pull-trend-4s.png": {
      "description": "Pull trend, 16-pull variant",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "practice_ui.h PracticeUI::draw()",
        "practice_history.h PracticeHistory",
        "practice_views.h"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "practice_ui.h": "971afb079c98d9a9d27143bed9a188b2a59a6f5e0579d6904807a5731d219e6b",
        "practice_history.h": "75bc7e9f3e1bf2256956bf51d0a3eb44d320cebfae3157e1cc19edadee308e99",
        "practice_views.h": "9b0d0dbe2266653166fb1fddddbad713af83fb4cf317d0daa8de8e9325c8662a"
      },
      "inputs": {
        "view": "View::Pulls offset 0",
        "history": "16 pulls / 4 sessions: S1 5480,5810,5650,5960 + the three sessions of the standard dataset (renumbered S2-S4)"
      },
      "png_sha256": "6fbc437342c50e596a659c40d59b14360441a747fb281fb2798af4c21e746914",
      "png_3x_file": "pull-trend-4s@3x.png",
      "png_3x_sha256": "561675b15c16f6be59e43badd84bef7e8cc2ca2b027c908c7b3759cdb9383581",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "session-trend-4s.png": {
      "description": "Session trend, 4 sessions (shows First/last 2 change line)",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "practice_ui.h PracticeUI::draw()",
        "practice_history.h PracticeHistory",
        "practice_views.h"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "practice_ui.h": "971afb079c98d9a9d27143bed9a188b2a59a6f5e0579d6904807a5731d219e6b",
        "practice_history.h": "75bc7e9f3e1bf2256956bf51d0a3eb44d320cebfae3157e1cc19edadee308e99",
        "practice_views.h": "9b0d0dbe2266653166fb1fddddbad713af83fb4cf317d0daa8de8e9325c8662a"
      },
      "inputs": {
        "view": "View::Sessions offset 0",
        "history": "16 pulls / 4 sessions: S1 5480,5810,5650,5960 + the three sessions of the standard dataset (renumbered S2-S4)"
      },
      "png_sha256": "99ccd55bc9b58a35e50ff7cfc6ebe0e435a526324ff38103e6cdef655b4d6ada",
      "png_3x_file": "session-trend-4s@3x.png",
      "png_3x_sha256": "1309768156888cddc31a63d70a9dc6e188d1451676d7fedd22ebabb6e8fd5e01",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "battery.png": {
      "description": "Battery page",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "LaunchLabMini.ino drawBattery() lines 280-297",
        "power_status.h StickS3Battery::update/valid"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "power_status.h": "372a37b6c41bcd109d20ecb3c3618ae505b3638c88409c62b831c69cbb36c046"
      },
      "inputs": {
        "view": "View::Battery",
        "battery": "update(3980 mV, voltageRead, chargeRead, gpioBits=1) -> 85%, 3.98 V, not charging"
      },
      "png_sha256": "a9d38ca61154e6f0d1e957f224912e74aa6b118350dd2f10b4fb5f2744b2ed0d",
      "png_3x_file": "battery@3x.png",
      "png_3x_sha256": "40d16138bc62e5be847bfa494176e9dbc143a5e2c3ea969509f494d2dcf5af19",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "settings.png": {
      "description": "Settings page, row 1 (Sleep after) selected",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "LaunchLabMini.ino drawSettings() lines 299-316",
        "power_status.h InactivityTimer",
        "rpm_estimator.h RpmEstimator::label"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "power_status.h": "372a37b6c41bcd109d20ecb3c3618ae505b3638c88409c62b831c69cbb36c046",
        "rpm_estimator.h": "45ee94c66d0d233d8659e6699fe5a3775712efea65e400e1369259bf0e4600fd"
      },
      "inputs": {
        "view": "View::Settings",
        "settingsRow": 0,
        "sleep_after_min": 3,
        "rpm_method": "ThreeTurn (default)",
        "brightness_percent": 40,
        "settingsSaveError": false
      },
      "png_sha256": "022f460d7f4f6012f3e0c0c76e2dcadb59dbadcf259fdc4f48dc48a5e9e62683",
      "png_3x_file": "settings@3x.png",
      "png_3x_sha256": "99b50f3c5c62ff72f5a561d12cae08f7c87d32d94320bd2e4cb527122dd2ce19",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "settings-row2.png": {
      "description": "Settings, RPM method row selected",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "drawSettings()"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "power_status.h": "372a37b6c41bcd109d20ecb3c3618ae505b3638c88409c62b831c69cbb36c046",
        "rpm_estimator.h": "45ee94c66d0d233d8659e6699fe5a3775712efea65e400e1369259bf0e4600fd"
      },
      "inputs": {
        "settingsRow": 1
      },
      "png_sha256": "dc758fe5b69c08ac4c92bab6010a1828fa6bb6edd0ca27dcdf949ff40ed13cee",
      "png_3x_file": "settings-row2@3x.png",
      "png_3x_sha256": "596d4e6cfa4a0a181f89962cac05806eefabc6c753b420c6d669ec526fcb1660",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "settings-row3.png": {
      "description": "Settings, Brightness row selected",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "drawSettings()"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "power_status.h": "372a37b6c41bcd109d20ecb3c3618ae505b3638c88409c62b831c69cbb36c046",
        "rpm_estimator.h": "45ee94c66d0d233d8659e6699fe5a3775712efea65e400e1369259bf0e4600fd"
      },
      "inputs": {
        "settingsRow": 2
      },
      "png_sha256": "2388f7bbf3feaadd1bf0053809a3f3c8efa44ffe43f30d5410d27a29133769e9",
      "png_3x_file": "settings-row3@3x.png",
      "png_3x_sha256": "3aa8c083bee22214968afbeab013af508b56c612e40f876d5b90d35ae7ced903",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "recap-replay-0.png": {
      "description": "Launch recap 'Last launch' with tilt replay frame at 0 ms of the 970 ms replay",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "motion_ui.h MotionUI::feedback()",
        "motion_ui.h MotionUI::spatial()",
        "motion_replay.h MotionReplay::Replay::build/at, camera, playbackProgress",
        "launch_feedback.h LaunchFeedback::replayPresented/replayElapsed",
        "launch_motion.h LaunchMotion::Ring::build/recordLevels"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "motion_ui.h": "91840a7708a359168a0a5568bfac5cd1058e54f2d896543570ad487b85722967",
        "motion_replay.h": "0f2f70509b9d6386d973bbcb9bc1cef35dca1df460ccc91ca7b5825e5684c7ec",
        "launch_feedback.h": "33721aac3a4c89af067f305249858b1efc4b72fdf176600754f72455ad76d2fd",
        "launch_motion.h": "cb9e1a84b9c971019043d0a4fe1c6948a81294d18c2e1aa79dca433dc2237818",
        "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4"
      },
      "inputs": {
        "view": "launchFeedback.shown()=true, non-demo ('Last launch'), motionPending=false",
        "trace": "pull #12, 8120 RPM, optical duration 320 ms, 48 points -500..470 ms, built by LaunchMotion::Ring::build() from synthetic 100 Hz fused-orientation samples (start tilt ~1 deg, half-sine rocking during the pull, settling afterwards)",
        "start_level": "0.99 deg right=0.01 down=-0.03",
        "end_level": "13.42 deg right=-0.39 down=0.22",
        "replay_elapsed_ms": 0,
        "replay_progress": 0.0
      },
      "png_sha256": "a57a79b6c6c0f39dbe5b443ed18dc8bcc81a0d38b097ec4c48a878fed02accf6",
      "png_3x_file": "recap-replay-0@3x.png",
      "png_3x_sha256": "2cd6dac41930e39a751a0513d3570c0aae561046ae70b5d8b991f1dc57130fad",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "recap-replay-1.png": {
      "description": "Launch recap 'Last launch' with tilt replay frame at 291 ms of the 970 ms replay",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "motion_ui.h MotionUI::feedback()",
        "motion_ui.h MotionUI::spatial()",
        "motion_replay.h MotionReplay::Replay::build/at, camera, playbackProgress",
        "launch_feedback.h LaunchFeedback::replayPresented/replayElapsed",
        "launch_motion.h LaunchMotion::Ring::build/recordLevels"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "motion_ui.h": "91840a7708a359168a0a5568bfac5cd1058e54f2d896543570ad487b85722967",
        "motion_replay.h": "0f2f70509b9d6386d973bbcb9bc1cef35dca1df460ccc91ca7b5825e5684c7ec",
        "launch_feedback.h": "33721aac3a4c89af067f305249858b1efc4b72fdf176600754f72455ad76d2fd",
        "launch_motion.h": "cb9e1a84b9c971019043d0a4fe1c6948a81294d18c2e1aa79dca433dc2237818",
        "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4"
      },
      "inputs": {
        "view": "launchFeedback.shown()=true, non-demo ('Last launch'), motionPending=false",
        "trace": "pull #12, 8120 RPM, optical duration 320 ms, 48 points -500..470 ms, built by LaunchMotion::Ring::build() from synthetic 100 Hz fused-orientation samples (start tilt ~1 deg, half-sine rocking during the pull, settling afterwards)",
        "start_level": "0.99 deg right=0.01 down=-0.03",
        "end_level": "13.42 deg right=-0.39 down=0.22",
        "replay_elapsed_ms": 291,
        "replay_progress": 0.3
      },
      "png_sha256": "34cd2fd8789d133d653baac949847fc846c3e3c53b48c893cec869d51f4da98d",
      "png_3x_file": "recap-replay-1@3x.png",
      "png_3x_sha256": "cab5cc849090f433b865c57cf071a5176f259abdaa552caa4eeef2d811d50feb",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "recap-replay-2.png": {
      "description": "Launch recap 'Last launch' with tilt replay frame at 533 ms of the 970 ms replay",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "motion_ui.h MotionUI::feedback()",
        "motion_ui.h MotionUI::spatial()",
        "motion_replay.h MotionReplay::Replay::build/at, camera, playbackProgress",
        "launch_feedback.h LaunchFeedback::replayPresented/replayElapsed",
        "launch_motion.h LaunchMotion::Ring::build/recordLevels"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "motion_ui.h": "91840a7708a359168a0a5568bfac5cd1058e54f2d896543570ad487b85722967",
        "motion_replay.h": "0f2f70509b9d6386d973bbcb9bc1cef35dca1df460ccc91ca7b5825e5684c7ec",
        "launch_feedback.h": "33721aac3a4c89af067f305249858b1efc4b72fdf176600754f72455ad76d2fd",
        "launch_motion.h": "cb9e1a84b9c971019043d0a4fe1c6948a81294d18c2e1aa79dca433dc2237818",
        "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4"
      },
      "inputs": {
        "view": "launchFeedback.shown()=true, non-demo ('Last launch'), motionPending=false",
        "trace": "pull #12, 8120 RPM, optical duration 320 ms, 48 points -500..470 ms, built by LaunchMotion::Ring::build() from synthetic 100 Hz fused-orientation samples (start tilt ~1 deg, half-sine rocking during the pull, settling afterwards)",
        "start_level": "0.99 deg right=0.01 down=-0.03",
        "end_level": "13.42 deg right=-0.39 down=0.22",
        "replay_elapsed_ms": 533,
        "replay_progress": 0.549
      },
      "png_sha256": "5952f6335c59bafeca602101fa61568a802a8dc35c02d0a2b8d983614dfc41a5",
      "png_3x_file": "recap-replay-2@3x.png",
      "png_3x_sha256": "bc5714a4f6df5eda508f69a3d09da44794aaed2a2d967cdd9b1b139cc0559167",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "recap-replay-3.png": {
      "description": "Launch recap 'Last launch' with tilt replay frame at 727 ms of the 970 ms replay",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "motion_ui.h MotionUI::feedback()",
        "motion_ui.h MotionUI::spatial()",
        "motion_replay.h MotionReplay::Replay::build/at, camera, playbackProgress",
        "launch_feedback.h LaunchFeedback::replayPresented/replayElapsed",
        "launch_motion.h LaunchMotion::Ring::build/recordLevels"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "motion_ui.h": "91840a7708a359168a0a5568bfac5cd1058e54f2d896543570ad487b85722967",
        "motion_replay.h": "0f2f70509b9d6386d973bbcb9bc1cef35dca1df460ccc91ca7b5825e5684c7ec",
        "launch_feedback.h": "33721aac3a4c89af067f305249858b1efc4b72fdf176600754f72455ad76d2fd",
        "launch_motion.h": "cb9e1a84b9c971019043d0a4fe1c6948a81294d18c2e1aa79dca433dc2237818",
        "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4"
      },
      "inputs": {
        "view": "launchFeedback.shown()=true, non-demo ('Last launch'), motionPending=false",
        "trace": "pull #12, 8120 RPM, optical duration 320 ms, 48 points -500..470 ms, built by LaunchMotion::Ring::build() from synthetic 100 Hz fused-orientation samples (start tilt ~1 deg, half-sine rocking during the pull, settling afterwards)",
        "start_level": "0.99 deg right=0.01 down=-0.03",
        "end_level": "13.42 deg right=-0.39 down=0.22",
        "replay_elapsed_ms": 727,
        "replay_progress": 0.749
      },
      "png_sha256": "c20f46d6a2d1ffac127bd042cf27e5c85b1bc0b428905d4b774296bb71216a66",
      "png_3x_file": "recap-replay-3@3x.png",
      "png_3x_sha256": "d5c9fbd957bc09f1def6da0e435f0a61309860f82da8286784ac87cf43bda75c",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "recap-replay-4.png": {
      "description": "Launch recap 'Last launch' with tilt replay frame at 970 ms of the 970 ms replay",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "motion_ui.h MotionUI::feedback()",
        "motion_ui.h MotionUI::spatial()",
        "motion_replay.h MotionReplay::Replay::build/at, camera, playbackProgress",
        "launch_feedback.h LaunchFeedback::replayPresented/replayElapsed",
        "launch_motion.h LaunchMotion::Ring::build/recordLevels"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "motion_ui.h": "91840a7708a359168a0a5568bfac5cd1058e54f2d896543570ad487b85722967",
        "motion_replay.h": "0f2f70509b9d6386d973bbcb9bc1cef35dca1df460ccc91ca7b5825e5684c7ec",
        "launch_feedback.h": "33721aac3a4c89af067f305249858b1efc4b72fdf176600754f72455ad76d2fd",
        "launch_motion.h": "cb9e1a84b9c971019043d0a4fe1c6948a81294d18c2e1aa79dca433dc2237818",
        "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4"
      },
      "inputs": {
        "view": "launchFeedback.shown()=true, non-demo ('Last launch'), motionPending=false",
        "trace": "pull #12, 8120 RPM, optical duration 320 ms, 48 points -500..470 ms, built by LaunchMotion::Ring::build() from synthetic 100 Hz fused-orientation samples (start tilt ~1 deg, half-sine rocking during the pull, settling afterwards)",
        "start_level": "0.99 deg right=0.01 down=-0.03",
        "end_level": "13.42 deg right=-0.39 down=0.22",
        "replay_elapsed_ms": 970,
        "replay_progress": 1.0
      },
      "png_sha256": "f548b4156b4cc9512c69531a1646753cb267eb7b5f8dea2247bf9d1735edea75",
      "png_3x_file": "recap-replay-4@3x.png",
      "png_3x_sha256": "bd3badd054420216c3b5c77cdf6b728ad8e961b6cddbed0439b16fc736f9b7c4",
      "size_1x": "135x240",
      "size_3x": "405x720"
    },
    "recap.png": {
      "description": "Launch recap 'Last launch': 8120 RPM, tilt replay held at its end pose (the state shown for the rest of the 5 s recap), frozen Start/End tilt circles",
      "firmware_functions_rendered": [
        "LaunchLabMini.ino draw() lines 351-421",
        "motion_ui.h MotionUI::feedback()",
        "motion_ui.h MotionUI::spatial()",
        "motion_replay.h MotionReplay::Replay::build/at, camera, playbackProgress",
        "launch_feedback.h LaunchFeedback::replayPresented/replayElapsed",
        "launch_motion.h LaunchMotion::Ring::build/recordLevels"
      ],
      "source_files": {
        "LaunchLabMini.ino": "a98e9a9523b3b26077a4391ec5e7150b5254b0c682f83968b729a0eb7390fcea",
        "motion_ui.h": "91840a7708a359168a0a5568bfac5cd1058e54f2d896543570ad487b85722967",
        "motion_replay.h": "0f2f70509b9d6386d973bbcb9bc1cef35dca1df460ccc91ca7b5825e5684c7ec",
        "launch_feedback.h": "33721aac3a4c89af067f305249858b1efc4b72fdf176600754f72455ad76d2fd",
        "launch_motion.h": "cb9e1a84b9c971019043d0a4fe1c6948a81294d18c2e1aa79dca433dc2237818",
        "level_indicator.h": "8bfd5b47e2e7626fa042f0db491077723d3f2f84b6a10281f6263df2068fe3e4"
      },
      "inputs": {
        "view": "launchFeedback.shown()=true, non-demo ('Last launch'), motionPending=false",
        "trace": "pull #12, 8120 RPM, optical duration 320 ms, 48 points -500..470 ms, built by LaunchMotion::Ring::build() from synthetic 100 Hz fused-orientation samples (start tilt ~1 deg, half-sine rocking during the pull, settling afterwards)",
        "start_level": "0.99 deg right=0.01 down=-0.03",
        "end_level": "13.42 deg right=-0.39 down=0.22",
        "replay_elapsed_ms": 970,
        "replay_progress": 1.0,
        "note": "identical pixels to recap-replay-4"
      },
      "png_sha256": "f548b4156b4cc9512c69531a1646753cb267eb7b5f8dea2247bf9d1735edea75",
      "png_3x_file": "recap@3x.png",
      "png_3x_sha256": "bd3badd054420216c3b5c77cdf6b728ad8e961b6cddbed0439b16fc736f9b7c4",
      "size_1x": "135x240",
      "size_3x": "405x720"
    }
  },
  "published": [
    {
      "path": "device/live.png",
      "sha256": "841fc49992707a568f87d3d7b2cd73f41de438fff1c444922433fedc4f0eb844",
      "size": 3170
    },
    {
      "path": "device/recap.png",
      "sha256": "bd3badd054420216c3b5c77cdf6b728ad8e961b6cddbed0439b16fc736f9b7c4",
      "size": 4399
    },
    {
      "path": "device/recap-replay-0.png",
      "sha256": "2cd6dac41930e39a751a0513d3570c0aae561046ae70b5d8b991f1dc57130fad",
      "size": 4080
    },
    {
      "path": "device/recap-replay-1.png",
      "sha256": "cab5cc849090f433b865c57cf071a5176f259abdaa552caa4eeef2d811d50feb",
      "size": 4094
    },
    {
      "path": "device/recap-replay-2.png",
      "sha256": "bc5714a4f6df5eda508f69a3d09da44794aaed2a2d967cdd9b1b139cc0559167",
      "size": 4118
    },
    {
      "path": "device/recap-replay-3.png",
      "sha256": "d5c9fbd957bc09f1def6da0e435f0a61309860f82da8286784ac87cf43bda75c",
      "size": 4375
    },
    {
      "path": "device/recap-replay-4.png",
      "sha256": "bd3badd054420216c3b5c77cdf6b728ad8e961b6cddbed0439b16fc736f9b7c4",
      "size": 4399
    },
    {
      "path": "device/history.png",
      "sha256": "5bc454456bf4adecd7902cd3f4e557217771c64d164ca80b421e24ec8ce906cb",
      "size": 3742
    },
    {
      "path": "device/pull-trend.png",
      "sha256": "d08d14be5b3547f789d6892eab0ea7a2449ab691293023d7d6c6f6683454740c",
      "size": 3529
    },
    {
      "path": "device/session-trend-4s.png",
      "sha256": "1309768156888cddc31a63d70a9dc6e188d1451676d7fedd22ebabb6e8fd5e01",
      "size": 3459
    },
    {
      "path": "device/battery.png",
      "sha256": "40d16138bc62e5be847bfa494176e9dbc143a5e2c3ea969509f494d2dcf5af19",
      "size": 2304
    },
    {
      "path": "device/settings.png",
      "sha256": "99b50f3c5c62ff72f5a561d12cae08f7c87d32d94320bd2e4cb527122dd2ce19",
      "size": 3402
    }
  ]
}
