[{"data":1,"prerenderedAt":2168},["ShallowReactive",2],{"content-\u002Fen\u002Fblog\u002Ftech\u002Fbuilding-a-personal-fitness-assistant-with-openclaw":3,"content-query-78IPn7gdto":1209},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"enName":10,"publishedAt":11,"tags":12,"body":14,"_type":1204,"_id":1205,"_source":1206,"_file":1207,"_stem":1208,"_extension":533},"\u002Fen\u002Fblog\u002Ftech\u002Fbuilding-a-personal-fitness-assistant-with-openclaw","tech",false,"","Building a Personal Fitness Assistant with OpenClaw","Stop letting it chat aimlessly. Turn it into a sports assistant that truly understands you and gets things done.","Building-a-Personal-Fitness-Assistant-with-OpenClaw","2026-04-23",[13],"Technology",{"type":15,"children":16,"toc":1186},"root",[17,27,35,41,46,59,63,70,75,110,115,120,123,129,143,148,153,163,169,174,177,183,188,216,221,224,230,235,248,260,272,281,291,296,460,465,468,474,479,500,523,528,539,549,554,566,651,656,665,670,691,694,700,710,722,732,737,742,750,755,778,783,786,792,797,803,905,911,1000,1005,1014,1019,1024,1027,1033,1038,1047,1052,1070,1073,1079,1092,1101,1106,1111,1114,1120,1125,1130,1173,1178],{"type":18,"tag":19,"props":20,"children":26},"element","markdown-image",{"alt":21,"folder":22,"img-type":23,"img-width":24,"src":25},"OpenClaw Chat","blog","png","100%","OpenClaw\u002FOpenClaw-Chat",[],{"type":18,"tag":28,"props":29,"children":31},"h3",{"id":30},"foreword",[32],{"type":33,"value":34},"text","Foreword",{"type":18,"tag":36,"props":37,"children":38},"p",{},[39],{"type":33,"value":40},"Lately, I've fallen down the rabbit hole of OpenClaw (\"Crayfish\"). The more I tinker with it, the more I realize it has solid potential, especially for being transformed into a personal assistant that runs 24\u002F7.",{"type":18,"tag":36,"props":42,"children":43},{},[44],{"type":33,"value":45},"My hobbies are running and hiking, so a very specific idea popped into my head: could I turn it from a \"chatbot\" into a workout partner that truly understands me? Not a passive tool that only answers when asked, but one that proactively pulls my running data, generates training plans and pushes them to Garmin, and even sends me a deep analysis report like a personal coach after a run.",{"type":18,"tag":36,"props":47,"children":48},{},[49,51,57],{"type":33,"value":50},"After some tinkering, I found it's not only possible, but once it's set up, the experience is incredibly smooth. The real key ",{"type":18,"tag":52,"props":53,"children":54},"strong",{},[55],{"type":33,"value":56},"isn't about letting the AI figure everything out on its own, but about solidifying those repetitive, mundane tasks into a fixed workflow.",{"type":33,"value":58}," This saves tokens (saving money) and is much more practical.",{"type":18,"tag":60,"props":61,"children":62},"hr",{},[],{"type":18,"tag":64,"props":65,"children":67},"h2",{"id":66},"hardware-and-tools-good-enough-is-perfect",[68],{"type":33,"value":69},"Hardware and Tools: Good Enough is Perfect",{"type":18,"tag":36,"props":71,"children":72},{},[73],{"type":33,"value":74},"My setup is simple, nothing fancy:",{"type":18,"tag":76,"props":77,"children":78},"ul",{},[79,90,100],{"type":18,"tag":80,"props":81,"children":82},"li",{},[83,88],{"type":18,"tag":52,"props":84,"children":85},{},[86],{"type":33,"value":87},"Device",{"type":33,"value":89},": Raspberry Pi 5 (the best choice for collecting dust in the corner)",{"type":18,"tag":80,"props":91,"children":92},{},[93,98],{"type":18,"tag":52,"props":94,"children":95},{},[96],{"type":33,"value":97},"Sports Watch",{"type":33,"value":99},": Garmin (long battery life, open API)",{"type":18,"tag":80,"props":101,"children":102},{},[103,108],{"type":18,"tag":52,"props":104,"children":105},{},[106],{"type":33,"value":107},"Chat Interface",{"type":33,"value":109},": Telegram Bot (just tap on your phone)",{"type":18,"tag":36,"props":111,"children":112},{},[113],{"type":33,"value":114},"A little device like the Raspberry Pi 5 is perfect for this: online 24\u002F7, incredibly low power consumption, silent – you barely notice it's there. The beauty of Telegram Bot is that I can customize the menu buttons, a godsend for lazy people. In daily use, I open Telegram, tap the menu, and all my health data for the day, how I slept last night, and how my last run went are right there.",{"type":18,"tag":36,"props":116,"children":117},{},[118],{"type":33,"value":119},"Seriously, this is crucial for \"usability.\" We're tinkering with this to use it, not just to take a screenshot and show off on social media.",{"type":18,"tag":60,"props":121,"children":122},{},[],{"type":18,"tag":64,"props":124,"children":126},{"id":125},"the-first-pitfall-tokens-burning-a-hole-in-my-pocket",[127],{"type":33,"value":128},"The First Pitfall: Tokens Burning a Hole in My Pocket",{"type":18,"tag":36,"props":130,"children":131},{},[132,134,141],{"type":33,"value":133},"By default, OpenClaw stuffs a ton of context files into the ",{"type":18,"tag":135,"props":136,"children":138},"code",{"className":137},[],[139],{"type":33,"value":140},"workspace",{"type":33,"value":142}," directory – personality settings, user profiles, work rules, conversation memories. It sounds advanced, but the problem is, every time it runs, it loads all of this into the context. The consequence is that token consumption burns through money like crazy.",{"type":18,"tag":36,"props":144,"children":145},{},[146],{"type":33,"value":147},"Naively, I connected the DeepSeek API, thinking it would be cheap. After two days, I checked the bill: wow, it had burned through a decent amount of money in just a few days. The problem wasn't a single call, but that whenever it encountered a \"vague task,\" it flailed around like a headless fly: frantically probing, writing a bunch of temporary, messy code, and repeatedly confirming the context. Round after round, tokens were wasted, and very little actual work was done.",{"type":18,"tag":36,"props":149,"children":150},{},[151],{"type":33,"value":152},"Later, I switched to Claude to help refine the requirements for my workout assistant. It was noticeably more reliable for this type of task – clear thinking, no beating around the bush, going straight from requirements to code. Of course, for the daily API calls running \"Crayfish,\" I still use DeepSeek. I'm on a budget, and its price is unbeatable, plus its Chinese comprehension is excellent.",{"type":18,"tag":36,"props":154,"children":155},{},[156,158],{"type":33,"value":157},"This experience made me realize one thing completely: ",{"type":18,"tag":52,"props":159,"children":160},{},[161],{"type":33,"value":162},"For those repetitive, deterministic tasks, never let the AI improvise on the fly. You need to engineer these tasks first.",{"type":18,"tag":19,"props":164,"children":168},{"alt":165,"folder":22,"img-type":23,"img-width":166,"src":167},"DeepSeek","80%","OpenClaw\u002FDeepSeek",[],{"type":18,"tag":36,"props":170,"children":171},{},[172],{"type":33,"value":173},"The image above is very telling. In the early days when requirements were vague, usage skyrocketed (80 million tokens in one day). Once I solidified those messy tasks into engineered tasks, consumption dropped to less than 1% of the previous amount (less than 20 cents).",{"type":18,"tag":60,"props":175,"children":176},{},[],{"type":18,"tag":64,"props":178,"children":180},{"id":179},"core-idea-three-steps-to-make-crayfish-actually-work",[181],{"type":33,"value":182},"Core Idea: Three Steps to Make \"Crayfish\" Actually Work",{"type":18,"tag":36,"props":184,"children":185},{},[186],{"type":33,"value":187},"The whole plan boils down to three steps – simple, crude, but extremely effective:",{"type":18,"tag":189,"props":190,"children":191},"ol",{},[192,200,208],{"type":18,"tag":80,"props":193,"children":194},{},[195],{"type":18,"tag":52,"props":196,"children":197},{},[198],{"type":33,"value":199},"Write common commands as scripts",{"type":18,"tag":80,"props":201,"children":202},{},[203],{"type":18,"tag":52,"props":204,"children":205},{},[206],{"type":33,"value":207},"Package scripts as OpenClaw Skills",{"type":18,"tag":80,"props":209,"children":210},{},[211],{"type":18,"tag":52,"props":212,"children":213},{},[214],{"type":33,"value":215},"Separate \"data retrieval\" from \"analysis,\" each doing its own job",{"type":18,"tag":36,"props":217,"children":218},{},[219],{"type":33,"value":220},"It may only be three steps, but this is the difference between a \"toy\" and a \"tool.\"",{"type":18,"tag":60,"props":222,"children":223},{},[],{"type":18,"tag":64,"props":225,"children":227},{"id":226},"step-1-write-high-frequency-operations-as-scripts-directly",[228],{"type":33,"value":229},"Step 1: Write High-Frequency Operations as Scripts Directly",{"type":18,"tag":36,"props":231,"children":232},{},[233],{"type":33,"value":234},"Don't be lazy. Instead of letting the AI scramble to figure out \"how to get data from Garmin\" or \"how to generate a training plan\" every time, just package these tasks into scripts yourself.",{"type":18,"tag":36,"props":236,"children":237},{},[238,240,246],{"type":33,"value":239},"Put all scripts into the Skill directory for unified management. For example, I put the most common data query commands into ",{"type":18,"tag":135,"props":241,"children":243},{"className":242},[],[244],{"type":33,"value":245},"garmin_commands.py",{"type":33,"value":247},":",{"type":18,"tag":249,"props":250,"children":255},"pre",{"className":251,"code":253,"language":254,"meta":7},[252],"language-bash","# Today's health data\npython3 skills\u002Fgarmin-workout\u002Fscripts\u002Fgarmin_commands.py health_data\n\n# Last night's sleep analysis\npython3 skills\u002Fgarmin-workout\u002Fscripts\u002Fgarmin_commands.py sleep_analysis\n\n# Last run\npython3 skills\u002Fgarmin-workout\u002Fscripts\u002Fgarmin_commands.py last_run\n","bash",[256],{"type":18,"tag":135,"props":257,"children":258},{"__ignoreMap":7},[259],{"type":33,"value":253},{"type":18,"tag":36,"props":261,"children":262},{},[263,265,271],{"type":33,"value":264},"Training generation and pushing go through another entry point, ",{"type":18,"tag":135,"props":266,"children":268},{"className":267},[],[269],{"type":33,"value":270},"skill.py",{"type":33,"value":247},{"type":18,"tag":249,"props":273,"children":276},{"className":274,"code":275,"language":254,"meta":7},[252],"# Generate and push an easy run to Garmin Connect\npython3 ~\u002F.openclaw\u002Fworkspace\u002Fskills\u002Fgarmin-workout\u002Fscripts\u002Fskill.py \\\n  --command generate_and_push --args '{\"command\": \"\u002Feasy_run 8km tomorrow\"}'\n",[277],{"type":18,"tag":135,"props":278,"children":279},{"__ignoreMap":7},[280],{"type":33,"value":275},{"type":18,"tag":36,"props":282,"children":283},{},[284,286],{"type":33,"value":285},"The meaning of this is simple and direct: ",{"type":18,"tag":52,"props":287,"children":288},{},[289],{"type":33,"value":290},"AI, stop pretending to be smart. All you need to do is \"call the tool.\"",{"type":18,"tag":36,"props":292,"children":293},{},[294],{"type":33,"value":295},"I set up 6 custom training types, each with a preset structure and pace to prevent it from making things up:",{"type":18,"tag":297,"props":298,"children":299},"table",{},[300,324],{"type":18,"tag":301,"props":302,"children":303},"thead",{},[304],{"type":18,"tag":305,"props":306,"children":307},"tr",{},[308,314,319],{"type":18,"tag":309,"props":310,"children":311},"th",{},[312],{"type":33,"value":313},"Command",{"type":18,"tag":309,"props":315,"children":316},{},[317],{"type":33,"value":318},"Type",{"type":18,"tag":309,"props":320,"children":321},{},[322],{"type":33,"value":323},"Structure",{"type":18,"tag":325,"props":326,"children":327},"tbody",{},[328,351,373,395,417,439],{"type":18,"tag":305,"props":329,"children":330},{},[331,341,346],{"type":18,"tag":332,"props":333,"children":334},"td",{},[335],{"type":18,"tag":135,"props":336,"children":338},{"className":337},[],[339],{"type":33,"value":340},"\u002Feasy_run",{"type":18,"tag":332,"props":342,"children":343},{},[344],{"type":33,"value":345},"Easy Run",{"type":18,"tag":332,"props":347,"children":348},{},[349],{"type":33,"value":350},"Warm-up → Main Run @6:30–7:00\u002Fkm → Cool-down",{"type":18,"tag":305,"props":352,"children":353},{},[354,363,368],{"type":18,"tag":332,"props":355,"children":356},{},[357],{"type":18,"tag":135,"props":358,"children":360},{"className":359},[],[361],{"type":33,"value":362},"\u002Ftempo_run",{"type":18,"tag":332,"props":364,"children":365},{},[366],{"type":33,"value":367},"Tempo Run",{"type":18,"tag":332,"props":369,"children":370},{},[371],{"type":33,"value":372},"Warm-up → Main Run @5:20–5:40\u002Fkm → Cool-down",{"type":18,"tag":305,"props":374,"children":375},{},[376,385,390],{"type":18,"tag":332,"props":377,"children":378},{},[379],{"type":18,"tag":135,"props":380,"children":382},{"className":381},[],[383],{"type":33,"value":384},"\u002Flong_run",{"type":18,"tag":332,"props":386,"children":387},{},[388],{"type":33,"value":389},"Long Run",{"type":18,"tag":332,"props":391,"children":392},{},[393],{"type":33,"value":394},"Warm-up → Main Run @5:50–6:10\u002Fkm → Cool-down",{"type":18,"tag":305,"props":396,"children":397},{},[398,407,412],{"type":18,"tag":332,"props":399,"children":400},{},[401],{"type":18,"tag":135,"props":402,"children":404},{"className":403},[],[405],{"type":33,"value":406},"\u002Finterval_run",{"type":18,"tag":332,"props":408,"children":409},{},[410],{"type":33,"value":411},"Interval",{"type":18,"tag":332,"props":413,"children":414},{},[415],{"type":33,"value":416},"Warm-up → Repeat structure → Cool-down",{"type":18,"tag":305,"props":418,"children":419},{},[420,429,434],{"type":18,"tag":332,"props":421,"children":422},{},[423],{"type":18,"tag":135,"props":424,"children":426},{"className":425},[],[427],{"type":33,"value":428},"\u002Frecovery_run",{"type":18,"tag":332,"props":430,"children":431},{},[432],{"type":33,"value":433},"Recovery",{"type":18,"tag":332,"props":435,"children":436},{},[437],{"type":33,"value":438},"Warm-up → Main Run @7:15–7:45\u002Fkm → Cool-down",{"type":18,"tag":305,"props":440,"children":441},{},[442,451,456],{"type":18,"tag":332,"props":443,"children":444},{},[445],{"type":18,"tag":135,"props":446,"children":448},{"className":447},[],[449],{"type":33,"value":450},"\u002Ffartlek_run",{"type":18,"tag":332,"props":452,"children":453},{},[454],{"type":33,"value":455},"Fartlek",{"type":18,"tag":332,"props":457,"children":458},{},[459],{"type":33,"value":416},{"type":18,"tag":36,"props":461,"children":462},{},[463],{"type":33,"value":464},"After this step, daily commands respond in seconds and cost almost nothing in reasoning.",{"type":18,"tag":60,"props":466,"children":467},{},[],{"type":18,"tag":64,"props":469,"children":471},{"id":470},"step-2-package-scripts-as-openclaw-skills",[472],{"type":33,"value":473},"Step 2: Package Scripts as OpenClaw Skills",{"type":18,"tag":36,"props":475,"children":476},{},[477],{"type":33,"value":478},"Having scripts isn't enough. To let \"Crayfish\" know when to use them, you need to package them as a Skill.",{"type":18,"tag":36,"props":480,"children":481},{},[482,484,490,492,498],{"type":33,"value":483},"The core of a Skill is a ",{"type":18,"tag":135,"props":485,"children":487},{"className":486},[],[488],{"type":33,"value":489},"SKILL.md",{"type":33,"value":491}," file, placed in ",{"type":18,"tag":135,"props":493,"children":495},{"className":494},[],[496],{"type":33,"value":497},"skills\u002Fgarmin-workout\u002F",{"type":33,"value":499},". It essentially tells the AI:",{"type":18,"tag":76,"props":501,"children":502},{},[503,508,513,518],{"type":18,"tag":80,"props":504,"children":505},{},[506],{"type":33,"value":507},"What this thing is for",{"type":18,"tag":80,"props":509,"children":510},{},[511],{"type":33,"value":512},"When it should be used",{"type":18,"tag":80,"props":514,"children":515},{},[516],{"type":33,"value":517},"What the commands look like",{"type":18,"tag":80,"props":519,"children":520},{},[521],{"type":33,"value":522},"How to pass parameters",{"type":18,"tag":36,"props":524,"children":525},{},[526],{"type":33,"value":527},"For example:",{"type":18,"tag":249,"props":529,"children":534},{"className":530,"code":532,"language":533,"meta":7},[531],"language-md","---\nname: garmin-workout\ndescription: Garmin Connect integration for running training. Use when user asks about\n             workouts, training plans, pushing sessions to Garmin Connect, health data\n             (sleep, VO2 Max, heart rate, body battery, stress). Covers all 6 workout types.\n---\n","md",[535],{"type":18,"tag":135,"props":536,"children":537},{"__ignoreMap":7},[538],{"type":33,"value":532},{"type":18,"tag":36,"props":540,"children":541},{},[542,544],{"type":33,"value":543},"This step is critical because it solves a real problem: ",{"type":18,"tag":52,"props":545,"children":546},{},[547],{"type":33,"value":548},"Every time the AI restarts, it's an amnesiac. You can't expect it to \"remember\" anything. You need to give it a structured entry point to find things itself.",{"type":18,"tag":36,"props":550,"children":551},{},[552],{"type":33,"value":553},"The scripts are just tools;\nOnly when you write the Skill clearly does the AI know what it's for and when to use it.",{"type":18,"tag":36,"props":555,"children":556},{},[557,559,564],{"type":33,"value":558},"In the last part of ",{"type":18,"tag":135,"props":560,"children":562},{"className":561},[],[563],{"type":33,"value":489},{"type":33,"value":565},", I created a complete mapping of all Telegram commands to their corresponding execution scripts, like this:",{"type":18,"tag":297,"props":567,"children":568},{},[569,585],{"type":18,"tag":301,"props":570,"children":571},{},[572],{"type":18,"tag":305,"props":573,"children":574},{},[575,580],{"type":18,"tag":309,"props":576,"children":577},{},[578],{"type":33,"value":579},"Telegram Command",{"type":18,"tag":309,"props":581,"children":582},{},[583],{"type":33,"value":584},"Execution Script",{"type":18,"tag":325,"props":586,"children":587},{},[588,609,630],{"type":18,"tag":305,"props":589,"children":590},{},[591,600],{"type":18,"tag":332,"props":592,"children":593},{},[594],{"type":18,"tag":135,"props":595,"children":597},{"className":596},[],[598],{"type":33,"value":599},"\u002Flast_run",{"type":18,"tag":332,"props":601,"children":602},{},[603],{"type":18,"tag":135,"props":604,"children":606},{"className":605},[],[607],{"type":33,"value":608},"python3 ...\u002Fgarmin_commands.py last_run",{"type":18,"tag":305,"props":610,"children":611},{},[612,621],{"type":18,"tag":332,"props":613,"children":614},{},[615],{"type":18,"tag":135,"props":616,"children":618},{"className":617},[],[619],{"type":33,"value":620},"\u002Fsleep_analysis",{"type":18,"tag":332,"props":622,"children":623},{},[624],{"type":18,"tag":135,"props":625,"children":627},{"className":626},[],[628],{"type":33,"value":629},"python3 ...\u002Fgarmin_commands.py sleep_analysis",{"type":18,"tag":305,"props":631,"children":632},{},[633,642],{"type":18,"tag":332,"props":634,"children":635},{},[636],{"type":18,"tag":135,"props":637,"children":639},{"className":638},[],[640],{"type":33,"value":641},"\u002Feasy_run 8km tomorrow",{"type":18,"tag":332,"props":643,"children":644},{},[645],{"type":18,"tag":135,"props":646,"children":648},{"className":647},[],[649],{"type":33,"value":650},"skill.py --command generate_and_push ...",{"type":18,"tag":36,"props":652,"children":653},{},[654],{"type":33,"value":655},"The rules are also written very directly:",{"type":18,"tag":657,"props":658,"children":659},"blockquote",{},[660],{"type":18,"tag":36,"props":661,"children":662},{},[663],{"type":33,"value":664},"Upon receiving these commands, immediately run the corresponding script and return the output as-is; do not ask the user what data they want, and do not generate exploratory code on the fly.",{"type":18,"tag":36,"props":666,"children":667},{},[668],{"type":33,"value":669},"After this, the system is rock solid: no detours, no probing, no repeated confirmations – just get it done.",{"type":18,"tag":36,"props":671,"children":672},{},[673,675,681,683,689],{"type":33,"value":674},"By the way, ",{"type":18,"tag":135,"props":676,"children":678},{"className":677},[],[679],{"type":33,"value":680},"AGENTS.md",{"type":33,"value":682}," is a different matter – it's the core behavioral specification for the workspace, governing memory writing rules, heartbeat check logic, group chat behavior, etc. At the start of each session, it also silently runs ",{"type":18,"tag":135,"props":684,"children":686},{"className":685},[],[687],{"type":33,"value":688},"update_menu",{"type":33,"value":690}," to restore the Telegram Bot's 23 custom commands, preventing them from being overwritten by the system's default menu.",{"type":18,"tag":60,"props":692,"children":693},{},[],{"type":18,"tag":64,"props":695,"children":697},{"id":696},"step-3-use-ais-strengths-where-they-matter-analysis",[698],{"type":33,"value":699},"Step 3: Use AI's Strengths Where They Matter (Analysis)",{"type":18,"tag":36,"props":701,"children":702},{},[703,705],{"type":33,"value":704},"Scripting high-frequency tasks doesn't mean abandoning the value of AI. Quite the opposite: ",{"type":18,"tag":52,"props":706,"children":707},{},[708],{"type":33,"value":709},"The place where AI is needed is \"analysis,\" not \"data retrieval.\"",{"type":18,"tag":36,"props":711,"children":712},{},[713,715,720],{"type":33,"value":714},"For example, after a run, I first send ",{"type":18,"tag":135,"props":716,"children":718},{"className":717},[],[719],{"type":33,"value":599},{"type":33,"value":721}," to get a structured data summary:",{"type":18,"tag":249,"props":723,"children":727},{"className":724,"code":726,"language":33,"meta":7},[725],"language-text","🏃 2026-04-21 Running Data\n\n📋 Xuhui - Tempo Run 5.0km_2026-04-21\n\n📏 Distance: 5.09 km\n⏱️ Time: 33 minutes\n⚡ Avg Pace: 6:30\u002Fkm\n\n🚀 Fastest 1km: 5:38\n🚀 Fastest 5km: 32:19\n\n💓 Avg HR: 139 bpm\n🔴 Max HR: 162 bpm\n\n... (some details omitted)\n",[728],{"type":18,"tag":135,"props":729,"children":730},{"__ignoreMap":7},[731],{"type":33,"value":726},{"type":18,"tag":36,"props":733,"children":734},{},[735],{"type":33,"value":736},"This stage is purely script execution, costing almost nothing.\nThen I ask: \"How was this run? What should I adjust next time?\" This is when I let the AI enter analysis mode.",{"type":18,"tag":36,"props":738,"children":739},{},[740],{"type":33,"value":741},"Based on metrics like heart rate, pace, and cadence, it can give me advice like a real coach:",{"type":18,"tag":657,"props":743,"children":744},{},[745],{"type":18,"tag":36,"props":746,"children":747},{},[748],{"type":33,"value":749},"Master Bao, compared to your tempo run on April 17th (7:03\u002Fkm, HR 132), you improved your pace by 33 seconds per kilometer this time;\nYour HR went from 132 to 139 bpm, the intensity increased, which is great;\nYour training effect also went from 2.8 to 3.0, showing visible progress.",{"type":18,"tag":36,"props":751,"children":752},{},[753],{"type":33,"value":754},"I later realized this \"two-step\" design is the essence:",{"type":18,"tag":76,"props":756,"children":757},{},[758,768],{"type":18,"tag":80,"props":759,"children":760},{},[761,766],{"type":18,"tag":52,"props":762,"children":763},{},[764],{"type":33,"value":765},"Queries",{"type":33,"value":767}," go through scripts – fast, stable, and cheap",{"type":18,"tag":80,"props":769,"children":770},{},[771,776],{"type":18,"tag":52,"props":772,"children":773},{},[774],{"type":33,"value":775},"Analysis",{"type":33,"value":777}," is given to the AI – slower is fine, but it needs to deliver substance",{"type":18,"tag":36,"props":779,"children":780},{},[781],{"type":33,"value":782},"Because of this separation, the system truly became both practical and valuable with AI.",{"type":18,"tag":60,"props":784,"children":785},{},[],{"type":18,"tag":64,"props":787,"children":789},{"id":788},"real-world-experience-it-finally-feels-like-a-real-assistant",[790],{"type":33,"value":791},"Real-World Experience: It Finally Feels Like a Real Assistant",{"type":18,"tag":36,"props":793,"children":794},{},[795],{"type":33,"value":796},"Now, my Telegram menu has roughly these items.",{"type":18,"tag":28,"props":798,"children":800},{"id":799},"training-related",[801],{"type":33,"value":802},"Training Related",{"type":18,"tag":76,"props":804,"children":805},{},[806,817,828,839,850,861,872,883,894],{"type":18,"tag":80,"props":807,"children":808},{},[809,815],{"type":18,"tag":135,"props":810,"children":812},{"className":811},[],[813],{"type":33,"value":814},"\u002Ftraining_plan",{"type":33,"value":816}," – Check next week's plan",{"type":18,"tag":80,"props":818,"children":819},{},[820,826],{"type":18,"tag":135,"props":821,"children":823},{"className":822},[],[824],{"type":33,"value":825},"\u002Feasy_run 5km today",{"type":33,"value":827}," – Generate an easy run, push to Garmin",{"type":18,"tag":80,"props":829,"children":830},{},[831,837],{"type":18,"tag":135,"props":832,"children":834},{"className":833},[],[835],{"type":33,"value":836},"\u002Ftempo_run 8km tomorrow",{"type":33,"value":838}," – Generate a tempo run",{"type":18,"tag":80,"props":840,"children":841},{},[842,848],{"type":18,"tag":135,"props":843,"children":845},{"className":844},[],[846],{"type":33,"value":847},"\u002Flong_run 10km weekend",{"type":33,"value":849}," – Generate a long run",{"type":18,"tag":80,"props":851,"children":852},{},[853,859],{"type":18,"tag":135,"props":854,"children":856},{"className":855},[],[857],{"type":33,"value":858},"\u002Finterval_run today",{"type":33,"value":860}," – Generate an interval run",{"type":18,"tag":80,"props":862,"children":863},{},[864,870],{"type":18,"tag":135,"props":865,"children":867},{"className":866},[],[868],{"type":33,"value":869},"\u002Fgarmin_workouts",{"type":33,"value":871}," – View this week's training schedule",{"type":18,"tag":80,"props":873,"children":874},{},[875,881],{"type":18,"tag":135,"props":876,"children":878},{"className":877},[],[879],{"type":33,"value":880},"\u002Fweekly_review",{"type":33,"value":882}," – Weekly training summary",{"type":18,"tag":80,"props":884,"children":885},{},[886,892],{"type":18,"tag":135,"props":887,"children":889},{"className":888},[],[890],{"type":33,"value":891},"\u002Frace_readiness",{"type":33,"value":893}," – Race readiness assessment",{"type":18,"tag":80,"props":895,"children":896},{},[897,903],{"type":18,"tag":135,"props":898,"children":900},{"className":899},[],[901],{"type":33,"value":902},"\u002Fpace_progress",{"type":33,"value":904}," – Pace progress trend (specify weeks)",{"type":18,"tag":28,"props":906,"children":908},{"id":907},"health-data-related",[909],{"type":33,"value":910},"Health Data Related",{"type":18,"tag":76,"props":912,"children":913},{},[914,925,935,945,956,967,978,989],{"type":18,"tag":80,"props":915,"children":916},{},[917,923],{"type":18,"tag":135,"props":918,"children":920},{"className":919},[],[921],{"type":33,"value":922},"\u002Fhealth_data",{"type":33,"value":924}," – How's my body today?",{"type":18,"tag":80,"props":926,"children":927},{},[928,933],{"type":18,"tag":135,"props":929,"children":931},{"className":930},[],[932],{"type":33,"value":620},{"type":33,"value":934}," – Did I sleep well last night?",{"type":18,"tag":80,"props":936,"children":937},{},[938,943],{"type":18,"tag":135,"props":939,"children":941},{"className":940},[],[942],{"type":33,"value":599},{"type":33,"value":944}," – How was my last run?",{"type":18,"tag":80,"props":946,"children":947},{},[948,954],{"type":18,"tag":135,"props":949,"children":951},{"className":950},[],[952],{"type":33,"value":953},"\u002Frunning_stats",{"type":33,"value":955}," – Data stats for the past 7 days",{"type":18,"tag":80,"props":957,"children":958},{},[959,965],{"type":18,"tag":135,"props":960,"children":962},{"className":961},[],[963],{"type":33,"value":964},"\u002Fbody_battery",{"type":33,"value":966}," – How much energy do I have left?",{"type":18,"tag":80,"props":968,"children":969},{},[970,976],{"type":18,"tag":135,"props":971,"children":973},{"className":972},[],[974],{"type":33,"value":975},"\u002Fvo2max",{"type":33,"value":977}," – VO2 Max trend",{"type":18,"tag":80,"props":979,"children":980},{},[981,987],{"type":18,"tag":135,"props":982,"children":984},{"className":983},[],[985],{"type":33,"value":986},"\u002Fheart_rate",{"type":33,"value":988}," – Today's heart rate data",{"type":18,"tag":80,"props":990,"children":991},{},[992,998],{"type":18,"tag":135,"props":993,"children":995},{"className":994},[],[996],{"type":33,"value":997},"\u002Fstress_level",{"type":33,"value":999}," – Stress level",{"type":18,"tag":36,"props":1001,"children":1002},{},[1003],{"type":33,"value":1004},"For example, I send:",{"type":18,"tag":249,"props":1006,"children":1009},{"className":1007,"code":1008,"language":33,"meta":7},[725],"\u002Feasy_run 8km tomorrow\n",[1010],{"type":18,"tag":135,"props":1011,"children":1012},{"__ignoreMap":7},[1013],{"type":33,"value":1008},{"type":18,"tag":36,"props":1015,"children":1016},{},[1017],{"type":33,"value":1018},"A few seconds later, I open Garmin Connect, and a new training session appears on tomorrow's calendar: warm-up, main run, cool-down, with target pace already set.",{"type":18,"tag":36,"props":1020,"children":1021},{},[1022],{"type":33,"value":1023},"This feels different. It's no longer a Q&A chat tool; it's a personal workout assistant that can actually execute actions for you.",{"type":18,"tag":60,"props":1025,"children":1026},{},[],{"type":18,"tag":64,"props":1028,"children":1030},{"id":1029},"current-directory-structure-clean-and-comfortable",[1031],{"type":33,"value":1032},"Current Directory Structure (Clean and Comfortable)",{"type":18,"tag":36,"props":1034,"children":1035},{},[1036],{"type":33,"value":1037},"The whole project currently looks like this:",{"type":18,"tag":249,"props":1039,"children":1042},{"className":1040,"code":1041,"language":254,"meta":7},[252],"~\u002F.openclaw\u002Fworkspace\u002F\n├── AGENTS.md          # Workspace core behavior rules (memory, heartbeat, group chat)\n├── IDENTITY.md        # AI identity definition (name, role, avatar)\n├── SOUL.md            # AI personality and behavior guidelines\n├── USER.md            # User information\n├── TOOLS.md           # Local tool configuration (SSH, device aliases, etc.)\n├── HEARTBEAT.md       # Scheduled inspection task list\n├── memory\u002F            # Session memory (archived by date)\n├── profiles\u002F          # User profiles\n├── state\u002F             # Runtime state storage\n└── skills\u002F\n    └── garmin-workout\u002F\n        ├── SKILL.md                   # Skill description + Telegram command routing (AI entry point)\n        ├── runner_profile.json        # Runner profile configuration\n        ├── training_plan_state.json   # Training plan persistence state\n        ├── scripts\u002F\n        │   ├── garmin_commands.py            # Unified health data entry point\n        │   ├── skill.py                      # Training generation + push\n        │   ├── garmin_auth.py                # Authentication management\n        │   ├── generate_workout.py           # Generate training JSON\n        │   └── garmin_push.py                # Low-level push (includes repeat expansion)\n        └── workouts_template\u002F\n            ├── easy_run_5km.json\n            ├── tempo_run_5km.json\n            ├── long_run_10km.json\n            ├── recovery_run_3km.json\n            ├── interval_run_simple.json\n            └── fartlek_run_simple.json\n",[1043],{"type":18,"tag":135,"props":1044,"children":1045},{"__ignoreMap":7},[1046],{"type":33,"value":1041},{"type":18,"tag":36,"props":1048,"children":1049},{},[1050],{"type":33,"value":1051},"From an engineering perspective, the advantage of this structure is clear responsibilities, easy maintenance, and convenient for adding new features later.",{"type":18,"tag":36,"props":1053,"children":1054},{},[1055,1061,1063,1068],{"type":18,"tag":135,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":33,"value":1060},"training_plan_state.json",{"type":33,"value":1062}," is particularly worth mentioning – a small detail I added later to persist the weekly training schedule. Previously, if I adjusted the training plan, it would all be lost after a session restart. Now, every time I modify the plan, the data is immediately written to this file. The next time I open ",{"type":18,"tag":135,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":33,"value":814},{"type":33,"value":1069},", the content is still there. This design philosophy of \"write it down, don't rely on memory\" is perfectly aligned with the overall system's approach.",{"type":18,"tag":60,"props":1071,"children":1072},{},[],{"type":18,"tag":64,"props":1074,"children":1076},{"id":1075},"backup-think-ahead",[1077],{"type":33,"value":1078},"Backup: Think Ahead",{"type":18,"tag":36,"props":1080,"children":1081},{},[1082,1084,1090],{"type":33,"value":1083},"OpenClaw's configuration, memory, and skills are all in ",{"type":18,"tag":135,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":33,"value":1089},"~\u002F.openclaw",{"type":33,"value":1091},". So the most direct method is to periodically package this directory.",{"type":18,"tag":249,"props":1093,"children":1096},{"className":1094,"code":1095,"language":254,"meta":7},[252],"# Backup the entire openclaw configuration\ntar -czf openclaw_backup_$(date +%Y%m%d).tar.gz ~\u002F.openclaw\n\n# Or just backup the workspace (skills, scripts, memory)\ntar -czf workspace_backup_$(date +%Y%m%d).tar.gz ~\u002F.openclaw\u002Fworkspace\n",[1097],{"type":18,"tag":135,"props":1098,"children":1099},{"__ignoreMap":7},[1100],{"type":33,"value":1095},{"type":18,"tag":36,"props":1102,"children":1103},{},[1104],{"type":33,"value":1105},"Add a cron job to automatically sync it to a cloud drive or NAS daily. This way, even if the Raspberry Pi's SD card fails, critical things like training memories, Skill configurations, training plan states, and Telegram menus can be quickly restored.",{"type":18,"tag":36,"props":1107,"children":1108},{},[1109],{"type":33,"value":1110},"For a personal assistant running long-term, backup isn't a \"we'll deal with it later\" thing; it's something to think about from day one.",{"type":18,"tag":60,"props":1112,"children":1113},{},[],{"type":18,"tag":64,"props":1115,"children":1117},{"id":1116},"summary",[1118],{"type":33,"value":1119},"Summary",{"type":18,"tag":36,"props":1121,"children":1122},{},[1123],{"type":33,"value":1124},"After all this tinkering, my biggest takeaway is:\nTo turn this into a truly useful personal workout assistant, the key isn't making the AI \"smarter,\" but making the system's division of labor clearer.",{"type":18,"tag":36,"props":1126,"children":1127},{},[1128],{"type":33,"value":1129},"The core idea is this simple:",{"type":18,"tag":76,"props":1131,"children":1132},{},[1133,1143,1153,1163],{"type":18,"tag":80,"props":1134,"children":1135},{},[1136,1141],{"type":18,"tag":52,"props":1137,"children":1138},{},[1139],{"type":33,"value":1140},"Solidify high-frequency operations into scripts",{"type":33,"value":1142},": For deterministic tasks like querying Garmin data or generating training plans, don't let the AI improvise.",{"type":18,"tag":80,"props":1144,"children":1145},{},[1146,1151],{"type":18,"tag":52,"props":1147,"children":1148},{},[1149],{"type":33,"value":1150},"Use Skills to solidify entry points",{"type":33,"value":1152},": Let the AI know where the tools are and when to use them each time it starts, and manage Telegram command routing together.",{"type":18,"tag":80,"props":1154,"children":1155},{},[1156,1161],{"type":18,"tag":52,"props":1157,"children":1158},{},[1159],{"type":33,"value":1160},"Separate queries from analysis",{"type":33,"value":1162},": Use scripts for daily data queries (saves money, fast), and only use AI for deep advice (quality, insightful).",{"type":18,"tag":80,"props":1164,"children":1165},{},[1166,1171],{"type":18,"tag":52,"props":1167,"children":1168},{},[1169],{"type":33,"value":1170},"Persist state",{"type":33,"value":1172},": Write things like training plans and runner profiles into files, don't rely on the AI's \"memory.\"",{"type":18,"tag":36,"props":1174,"children":1175},{},[1176],{"type":33,"value":1177},"When the Raspberry Pi is online 24\u002F7, Telegram becomes your interaction interface, and Garmin handles the execution, this whole system is no longer just a \"chatty AI,\" but more like a workout partner truly integrated into your life.",{"type":18,"tag":1179,"props":1180,"children":1185},"tip-card",{"description":1181,"link":1182,"linkText":1183,"title":1184},"Github Repo:","https:\u002F\u002Fgithub.com\u002Fsayidhe\u002Fopenclaw-garmin-workout","sayidhe\u002Fopenclaw-garmin-workout","Related Project",[],{"title":7,"searchDepth":1187,"depth":1187,"links":1188},2,[1189,1191,1192,1193,1194,1195,1196,1197,1201,1202,1203],{"id":30,"depth":1190,"text":34},3,{"id":66,"depth":1187,"text":69},{"id":125,"depth":1187,"text":128},{"id":179,"depth":1187,"text":182},{"id":226,"depth":1187,"text":229},{"id":470,"depth":1187,"text":473},{"id":696,"depth":1187,"text":699},{"id":788,"depth":1187,"text":791,"children":1198},[1199,1200],{"id":799,"depth":1190,"text":802},{"id":907,"depth":1190,"text":910},{"id":1029,"depth":1187,"text":1032},{"id":1075,"depth":1187,"text":1078},{"id":1116,"depth":1187,"text":1119},"markdown","content:en:blog:5.Tech:Building-a-Personal-Fitness-Assistant-with-OpenClaw.md","content","en\u002Fblog\u002F5.Tech\u002FBuilding-a-Personal-Fitness-Assistant-with-OpenClaw.md","en\u002Fblog\u002F5.Tech\u002FBuilding-a-Personal-Fitness-Assistant-with-OpenClaw",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"enName":10,"publishedAt":11,"tags":1210,"body":1211,"_type":1204,"_id":1205,"_source":1206,"_file":1207,"_stem":1208,"_extension":533},[13],{"type":15,"children":1212,"toc":2152},[1213,1216,1220,1224,1228,1237,1240,1244,1248,1275,1279,1283,1286,1290,1300,1304,1308,1316,1319,1323,1326,1330,1334,1358,1362,1365,1369,1373,1383,1391,1401,1409,1417,1421,1559,1563,1566,1570,1574,1590,1609,1613,1621,1629,1633,1643,1720,1724,1731,1735,1751,1754,1758,1766,1776,1784,1788,1792,1799,1803,1822,1826,1829,1833,1837,1841,1925,1929,2004,2008,2016,2020,2024,2027,2031,2035,2043,2047,2062,2065,2069,2079,2087,2091,2095,2098,2102,2106,2110,2145,2149],{"type":18,"tag":19,"props":1214,"children":1215},{"alt":21,"folder":22,"img-type":23,"img-width":24,"src":25},[],{"type":18,"tag":28,"props":1217,"children":1218},{"id":30},[1219],{"type":33,"value":34},{"type":18,"tag":36,"props":1221,"children":1222},{},[1223],{"type":33,"value":40},{"type":18,"tag":36,"props":1225,"children":1226},{},[1227],{"type":33,"value":45},{"type":18,"tag":36,"props":1229,"children":1230},{},[1231,1232,1236],{"type":33,"value":50},{"type":18,"tag":52,"props":1233,"children":1234},{},[1235],{"type":33,"value":56},{"type":33,"value":58},{"type":18,"tag":60,"props":1238,"children":1239},{},[],{"type":18,"tag":64,"props":1241,"children":1242},{"id":66},[1243],{"type":33,"value":69},{"type":18,"tag":36,"props":1245,"children":1246},{},[1247],{"type":33,"value":74},{"type":18,"tag":76,"props":1249,"children":1250},{},[1251,1259,1267],{"type":18,"tag":80,"props":1252,"children":1253},{},[1254,1258],{"type":18,"tag":52,"props":1255,"children":1256},{},[1257],{"type":33,"value":87},{"type":33,"value":89},{"type":18,"tag":80,"props":1260,"children":1261},{},[1262,1266],{"type":18,"tag":52,"props":1263,"children":1264},{},[1265],{"type":33,"value":97},{"type":33,"value":99},{"type":18,"tag":80,"props":1268,"children":1269},{},[1270,1274],{"type":18,"tag":52,"props":1271,"children":1272},{},[1273],{"type":33,"value":107},{"type":33,"value":109},{"type":18,"tag":36,"props":1276,"children":1277},{},[1278],{"type":33,"value":114},{"type":18,"tag":36,"props":1280,"children":1281},{},[1282],{"type":33,"value":119},{"type":18,"tag":60,"props":1284,"children":1285},{},[],{"type":18,"tag":64,"props":1287,"children":1288},{"id":125},[1289],{"type":33,"value":128},{"type":18,"tag":36,"props":1291,"children":1292},{},[1293,1294,1299],{"type":33,"value":133},{"type":18,"tag":135,"props":1295,"children":1297},{"className":1296},[],[1298],{"type":33,"value":140},{"type":33,"value":142},{"type":18,"tag":36,"props":1301,"children":1302},{},[1303],{"type":33,"value":147},{"type":18,"tag":36,"props":1305,"children":1306},{},[1307],{"type":33,"value":152},{"type":18,"tag":36,"props":1309,"children":1310},{},[1311,1312],{"type":33,"value":157},{"type":18,"tag":52,"props":1313,"children":1314},{},[1315],{"type":33,"value":162},{"type":18,"tag":19,"props":1317,"children":1318},{"alt":165,"folder":22,"img-type":23,"img-width":166,"src":167},[],{"type":18,"tag":36,"props":1320,"children":1321},{},[1322],{"type":33,"value":173},{"type":18,"tag":60,"props":1324,"children":1325},{},[],{"type":18,"tag":64,"props":1327,"children":1328},{"id":179},[1329],{"type":33,"value":182},{"type":18,"tag":36,"props":1331,"children":1332},{},[1333],{"type":33,"value":187},{"type":18,"tag":189,"props":1335,"children":1336},{},[1337,1344,1351],{"type":18,"tag":80,"props":1338,"children":1339},{},[1340],{"type":18,"tag":52,"props":1341,"children":1342},{},[1343],{"type":33,"value":199},{"type":18,"tag":80,"props":1345,"children":1346},{},[1347],{"type":18,"tag":52,"props":1348,"children":1349},{},[1350],{"type":33,"value":207},{"type":18,"tag":80,"props":1352,"children":1353},{},[1354],{"type":18,"tag":52,"props":1355,"children":1356},{},[1357],{"type":33,"value":215},{"type":18,"tag":36,"props":1359,"children":1360},{},[1361],{"type":33,"value":220},{"type":18,"tag":60,"props":1363,"children":1364},{},[],{"type":18,"tag":64,"props":1366,"children":1367},{"id":226},[1368],{"type":33,"value":229},{"type":18,"tag":36,"props":1370,"children":1371},{},[1372],{"type":33,"value":234},{"type":18,"tag":36,"props":1374,"children":1375},{},[1376,1377,1382],{"type":33,"value":239},{"type":18,"tag":135,"props":1378,"children":1380},{"className":1379},[],[1381],{"type":33,"value":245},{"type":33,"value":247},{"type":18,"tag":249,"props":1384,"children":1386},{"className":1385,"code":253,"language":254,"meta":7},[252],[1387],{"type":18,"tag":135,"props":1388,"children":1389},{"__ignoreMap":7},[1390],{"type":33,"value":253},{"type":18,"tag":36,"props":1392,"children":1393},{},[1394,1395,1400],{"type":33,"value":264},{"type":18,"tag":135,"props":1396,"children":1398},{"className":1397},[],[1399],{"type":33,"value":270},{"type":33,"value":247},{"type":18,"tag":249,"props":1402,"children":1404},{"className":1403,"code":275,"language":254,"meta":7},[252],[1405],{"type":18,"tag":135,"props":1406,"children":1407},{"__ignoreMap":7},[1408],{"type":33,"value":275},{"type":18,"tag":36,"props":1410,"children":1411},{},[1412,1413],{"type":33,"value":285},{"type":18,"tag":52,"props":1414,"children":1415},{},[1416],{"type":33,"value":290},{"type":18,"tag":36,"props":1418,"children":1419},{},[1420],{"type":33,"value":295},{"type":18,"tag":297,"props":1422,"children":1423},{},[1424,1442],{"type":18,"tag":301,"props":1425,"children":1426},{},[1427],{"type":18,"tag":305,"props":1428,"children":1429},{},[1430,1434,1438],{"type":18,"tag":309,"props":1431,"children":1432},{},[1433],{"type":33,"value":313},{"type":18,"tag":309,"props":1435,"children":1436},{},[1437],{"type":33,"value":318},{"type":18,"tag":309,"props":1439,"children":1440},{},[1441],{"type":33,"value":323},{"type":18,"tag":325,"props":1443,"children":1444},{},[1445,1464,1483,1502,1521,1540],{"type":18,"tag":305,"props":1446,"children":1447},{},[1448,1456,1460],{"type":18,"tag":332,"props":1449,"children":1450},{},[1451],{"type":18,"tag":135,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":33,"value":340},{"type":18,"tag":332,"props":1457,"children":1458},{},[1459],{"type":33,"value":345},{"type":18,"tag":332,"props":1461,"children":1462},{},[1463],{"type":33,"value":350},{"type":18,"tag":305,"props":1465,"children":1466},{},[1467,1475,1479],{"type":18,"tag":332,"props":1468,"children":1469},{},[1470],{"type":18,"tag":135,"props":1471,"children":1473},{"className":1472},[],[1474],{"type":33,"value":362},{"type":18,"tag":332,"props":1476,"children":1477},{},[1478],{"type":33,"value":367},{"type":18,"tag":332,"props":1480,"children":1481},{},[1482],{"type":33,"value":372},{"type":18,"tag":305,"props":1484,"children":1485},{},[1486,1494,1498],{"type":18,"tag":332,"props":1487,"children":1488},{},[1489],{"type":18,"tag":135,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":33,"value":384},{"type":18,"tag":332,"props":1495,"children":1496},{},[1497],{"type":33,"value":389},{"type":18,"tag":332,"props":1499,"children":1500},{},[1501],{"type":33,"value":394},{"type":18,"tag":305,"props":1503,"children":1504},{},[1505,1513,1517],{"type":18,"tag":332,"props":1506,"children":1507},{},[1508],{"type":18,"tag":135,"props":1509,"children":1511},{"className":1510},[],[1512],{"type":33,"value":406},{"type":18,"tag":332,"props":1514,"children":1515},{},[1516],{"type":33,"value":411},{"type":18,"tag":332,"props":1518,"children":1519},{},[1520],{"type":33,"value":416},{"type":18,"tag":305,"props":1522,"children":1523},{},[1524,1532,1536],{"type":18,"tag":332,"props":1525,"children":1526},{},[1527],{"type":18,"tag":135,"props":1528,"children":1530},{"className":1529},[],[1531],{"type":33,"value":428},{"type":18,"tag":332,"props":1533,"children":1534},{},[1535],{"type":33,"value":433},{"type":18,"tag":332,"props":1537,"children":1538},{},[1539],{"type":33,"value":438},{"type":18,"tag":305,"props":1541,"children":1542},{},[1543,1551,1555],{"type":18,"tag":332,"props":1544,"children":1545},{},[1546],{"type":18,"tag":135,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":33,"value":450},{"type":18,"tag":332,"props":1552,"children":1553},{},[1554],{"type":33,"value":455},{"type":18,"tag":332,"props":1556,"children":1557},{},[1558],{"type":33,"value":416},{"type":18,"tag":36,"props":1560,"children":1561},{},[1562],{"type":33,"value":464},{"type":18,"tag":60,"props":1564,"children":1565},{},[],{"type":18,"tag":64,"props":1567,"children":1568},{"id":470},[1569],{"type":33,"value":473},{"type":18,"tag":36,"props":1571,"children":1572},{},[1573],{"type":33,"value":478},{"type":18,"tag":36,"props":1575,"children":1576},{},[1577,1578,1583,1584,1589],{"type":33,"value":483},{"type":18,"tag":135,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":33,"value":489},{"type":33,"value":491},{"type":18,"tag":135,"props":1585,"children":1587},{"className":1586},[],[1588],{"type":33,"value":497},{"type":33,"value":499},{"type":18,"tag":76,"props":1591,"children":1592},{},[1593,1597,1601,1605],{"type":18,"tag":80,"props":1594,"children":1595},{},[1596],{"type":33,"value":507},{"type":18,"tag":80,"props":1598,"children":1599},{},[1600],{"type":33,"value":512},{"type":18,"tag":80,"props":1602,"children":1603},{},[1604],{"type":33,"value":517},{"type":18,"tag":80,"props":1606,"children":1607},{},[1608],{"type":33,"value":522},{"type":18,"tag":36,"props":1610,"children":1611},{},[1612],{"type":33,"value":527},{"type":18,"tag":249,"props":1614,"children":1616},{"className":1615,"code":532,"language":533,"meta":7},[531],[1617],{"type":18,"tag":135,"props":1618,"children":1619},{"__ignoreMap":7},[1620],{"type":33,"value":532},{"type":18,"tag":36,"props":1622,"children":1623},{},[1624,1625],{"type":33,"value":543},{"type":18,"tag":52,"props":1626,"children":1627},{},[1628],{"type":33,"value":548},{"type":18,"tag":36,"props":1630,"children":1631},{},[1632],{"type":33,"value":553},{"type":18,"tag":36,"props":1634,"children":1635},{},[1636,1637,1642],{"type":33,"value":558},{"type":18,"tag":135,"props":1638,"children":1640},{"className":1639},[],[1641],{"type":33,"value":489},{"type":33,"value":565},{"type":18,"tag":297,"props":1644,"children":1645},{},[1646,1660],{"type":18,"tag":301,"props":1647,"children":1648},{},[1649],{"type":18,"tag":305,"props":1650,"children":1651},{},[1652,1656],{"type":18,"tag":309,"props":1653,"children":1654},{},[1655],{"type":33,"value":579},{"type":18,"tag":309,"props":1657,"children":1658},{},[1659],{"type":33,"value":584},{"type":18,"tag":325,"props":1661,"children":1662},{},[1663,1682,1701],{"type":18,"tag":305,"props":1664,"children":1665},{},[1666,1674],{"type":18,"tag":332,"props":1667,"children":1668},{},[1669],{"type":18,"tag":135,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":33,"value":599},{"type":18,"tag":332,"props":1675,"children":1676},{},[1677],{"type":18,"tag":135,"props":1678,"children":1680},{"className":1679},[],[1681],{"type":33,"value":608},{"type":18,"tag":305,"props":1683,"children":1684},{},[1685,1693],{"type":18,"tag":332,"props":1686,"children":1687},{},[1688],{"type":18,"tag":135,"props":1689,"children":1691},{"className":1690},[],[1692],{"type":33,"value":620},{"type":18,"tag":332,"props":1694,"children":1695},{},[1696],{"type":18,"tag":135,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":33,"value":629},{"type":18,"tag":305,"props":1702,"children":1703},{},[1704,1712],{"type":18,"tag":332,"props":1705,"children":1706},{},[1707],{"type":18,"tag":135,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":33,"value":641},{"type":18,"tag":332,"props":1713,"children":1714},{},[1715],{"type":18,"tag":135,"props":1716,"children":1718},{"className":1717},[],[1719],{"type":33,"value":650},{"type":18,"tag":36,"props":1721,"children":1722},{},[1723],{"type":33,"value":655},{"type":18,"tag":657,"props":1725,"children":1726},{},[1727],{"type":18,"tag":36,"props":1728,"children":1729},{},[1730],{"type":33,"value":664},{"type":18,"tag":36,"props":1732,"children":1733},{},[1734],{"type":33,"value":669},{"type":18,"tag":36,"props":1736,"children":1737},{},[1738,1739,1744,1745,1750],{"type":33,"value":674},{"type":18,"tag":135,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":33,"value":680},{"type":33,"value":682},{"type":18,"tag":135,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":33,"value":688},{"type":33,"value":690},{"type":18,"tag":60,"props":1752,"children":1753},{},[],{"type":18,"tag":64,"props":1755,"children":1756},{"id":696},[1757],{"type":33,"value":699},{"type":18,"tag":36,"props":1759,"children":1760},{},[1761,1762],{"type":33,"value":704},{"type":18,"tag":52,"props":1763,"children":1764},{},[1765],{"type":33,"value":709},{"type":18,"tag":36,"props":1767,"children":1768},{},[1769,1770,1775],{"type":33,"value":714},{"type":18,"tag":135,"props":1771,"children":1773},{"className":1772},[],[1774],{"type":33,"value":599},{"type":33,"value":721},{"type":18,"tag":249,"props":1777,"children":1779},{"className":1778,"code":726,"language":33,"meta":7},[725],[1780],{"type":18,"tag":135,"props":1781,"children":1782},{"__ignoreMap":7},[1783],{"type":33,"value":726},{"type":18,"tag":36,"props":1785,"children":1786},{},[1787],{"type":33,"value":736},{"type":18,"tag":36,"props":1789,"children":1790},{},[1791],{"type":33,"value":741},{"type":18,"tag":657,"props":1793,"children":1794},{},[1795],{"type":18,"tag":36,"props":1796,"children":1797},{},[1798],{"type":33,"value":749},{"type":18,"tag":36,"props":1800,"children":1801},{},[1802],{"type":33,"value":754},{"type":18,"tag":76,"props":1804,"children":1805},{},[1806,1814],{"type":18,"tag":80,"props":1807,"children":1808},{},[1809,1813],{"type":18,"tag":52,"props":1810,"children":1811},{},[1812],{"type":33,"value":765},{"type":33,"value":767},{"type":18,"tag":80,"props":1815,"children":1816},{},[1817,1821],{"type":18,"tag":52,"props":1818,"children":1819},{},[1820],{"type":33,"value":775},{"type":33,"value":777},{"type":18,"tag":36,"props":1823,"children":1824},{},[1825],{"type":33,"value":782},{"type":18,"tag":60,"props":1827,"children":1828},{},[],{"type":18,"tag":64,"props":1830,"children":1831},{"id":788},[1832],{"type":33,"value":791},{"type":18,"tag":36,"props":1834,"children":1835},{},[1836],{"type":33,"value":796},{"type":18,"tag":28,"props":1838,"children":1839},{"id":799},[1840],{"type":33,"value":802},{"type":18,"tag":76,"props":1842,"children":1843},{},[1844,1853,1862,1871,1880,1889,1898,1907,1916],{"type":18,"tag":80,"props":1845,"children":1846},{},[1847,1852],{"type":18,"tag":135,"props":1848,"children":1850},{"className":1849},[],[1851],{"type":33,"value":814},{"type":33,"value":816},{"type":18,"tag":80,"props":1854,"children":1855},{},[1856,1861],{"type":18,"tag":135,"props":1857,"children":1859},{"className":1858},[],[1860],{"type":33,"value":825},{"type":33,"value":827},{"type":18,"tag":80,"props":1863,"children":1864},{},[1865,1870],{"type":18,"tag":135,"props":1866,"children":1868},{"className":1867},[],[1869],{"type":33,"value":836},{"type":33,"value":838},{"type":18,"tag":80,"props":1872,"children":1873},{},[1874,1879],{"type":18,"tag":135,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":33,"value":847},{"type":33,"value":849},{"type":18,"tag":80,"props":1881,"children":1882},{},[1883,1888],{"type":18,"tag":135,"props":1884,"children":1886},{"className":1885},[],[1887],{"type":33,"value":858},{"type":33,"value":860},{"type":18,"tag":80,"props":1890,"children":1891},{},[1892,1897],{"type":18,"tag":135,"props":1893,"children":1895},{"className":1894},[],[1896],{"type":33,"value":869},{"type":33,"value":871},{"type":18,"tag":80,"props":1899,"children":1900},{},[1901,1906],{"type":18,"tag":135,"props":1902,"children":1904},{"className":1903},[],[1905],{"type":33,"value":880},{"type":33,"value":882},{"type":18,"tag":80,"props":1908,"children":1909},{},[1910,1915],{"type":18,"tag":135,"props":1911,"children":1913},{"className":1912},[],[1914],{"type":33,"value":891},{"type":33,"value":893},{"type":18,"tag":80,"props":1917,"children":1918},{},[1919,1924],{"type":18,"tag":135,"props":1920,"children":1922},{"className":1921},[],[1923],{"type":33,"value":902},{"type":33,"value":904},{"type":18,"tag":28,"props":1926,"children":1927},{"id":907},[1928],{"type":33,"value":910},{"type":18,"tag":76,"props":1930,"children":1931},{},[1932,1941,1950,1959,1968,1977,1986,1995],{"type":18,"tag":80,"props":1933,"children":1934},{},[1935,1940],{"type":18,"tag":135,"props":1936,"children":1938},{"className":1937},[],[1939],{"type":33,"value":922},{"type":33,"value":924},{"type":18,"tag":80,"props":1942,"children":1943},{},[1944,1949],{"type":18,"tag":135,"props":1945,"children":1947},{"className":1946},[],[1948],{"type":33,"value":620},{"type":33,"value":934},{"type":18,"tag":80,"props":1951,"children":1952},{},[1953,1958],{"type":18,"tag":135,"props":1954,"children":1956},{"className":1955},[],[1957],{"type":33,"value":599},{"type":33,"value":944},{"type":18,"tag":80,"props":1960,"children":1961},{},[1962,1967],{"type":18,"tag":135,"props":1963,"children":1965},{"className":1964},[],[1966],{"type":33,"value":953},{"type":33,"value":955},{"type":18,"tag":80,"props":1969,"children":1970},{},[1971,1976],{"type":18,"tag":135,"props":1972,"children":1974},{"className":1973},[],[1975],{"type":33,"value":964},{"type":33,"value":966},{"type":18,"tag":80,"props":1978,"children":1979},{},[1980,1985],{"type":18,"tag":135,"props":1981,"children":1983},{"className":1982},[],[1984],{"type":33,"value":975},{"type":33,"value":977},{"type":18,"tag":80,"props":1987,"children":1988},{},[1989,1994],{"type":18,"tag":135,"props":1990,"children":1992},{"className":1991},[],[1993],{"type":33,"value":986},{"type":33,"value":988},{"type":18,"tag":80,"props":1996,"children":1997},{},[1998,2003],{"type":18,"tag":135,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":33,"value":997},{"type":33,"value":999},{"type":18,"tag":36,"props":2005,"children":2006},{},[2007],{"type":33,"value":1004},{"type":18,"tag":249,"props":2009,"children":2011},{"className":2010,"code":1008,"language":33,"meta":7},[725],[2012],{"type":18,"tag":135,"props":2013,"children":2014},{"__ignoreMap":7},[2015],{"type":33,"value":1008},{"type":18,"tag":36,"props":2017,"children":2018},{},[2019],{"type":33,"value":1018},{"type":18,"tag":36,"props":2021,"children":2022},{},[2023],{"type":33,"value":1023},{"type":18,"tag":60,"props":2025,"children":2026},{},[],{"type":18,"tag":64,"props":2028,"children":2029},{"id":1029},[2030],{"type":33,"value":1032},{"type":18,"tag":36,"props":2032,"children":2033},{},[2034],{"type":33,"value":1037},{"type":18,"tag":249,"props":2036,"children":2038},{"className":2037,"code":1041,"language":254,"meta":7},[252],[2039],{"type":18,"tag":135,"props":2040,"children":2041},{"__ignoreMap":7},[2042],{"type":33,"value":1041},{"type":18,"tag":36,"props":2044,"children":2045},{},[2046],{"type":33,"value":1051},{"type":18,"tag":36,"props":2048,"children":2049},{},[2050,2055,2056,2061],{"type":18,"tag":135,"props":2051,"children":2053},{"className":2052},[],[2054],{"type":33,"value":1060},{"type":33,"value":1062},{"type":18,"tag":135,"props":2057,"children":2059},{"className":2058},[],[2060],{"type":33,"value":814},{"type":33,"value":1069},{"type":18,"tag":60,"props":2063,"children":2064},{},[],{"type":18,"tag":64,"props":2066,"children":2067},{"id":1075},[2068],{"type":33,"value":1078},{"type":18,"tag":36,"props":2070,"children":2071},{},[2072,2073,2078],{"type":33,"value":1083},{"type":18,"tag":135,"props":2074,"children":2076},{"className":2075},[],[2077],{"type":33,"value":1089},{"type":33,"value":1091},{"type":18,"tag":249,"props":2080,"children":2082},{"className":2081,"code":1095,"language":254,"meta":7},[252],[2083],{"type":18,"tag":135,"props":2084,"children":2085},{"__ignoreMap":7},[2086],{"type":33,"value":1095},{"type":18,"tag":36,"props":2088,"children":2089},{},[2090],{"type":33,"value":1105},{"type":18,"tag":36,"props":2092,"children":2093},{},[2094],{"type":33,"value":1110},{"type":18,"tag":60,"props":2096,"children":2097},{},[],{"type":18,"tag":64,"props":2099,"children":2100},{"id":1116},[2101],{"type":33,"value":1119},{"type":18,"tag":36,"props":2103,"children":2104},{},[2105],{"type":33,"value":1124},{"type":18,"tag":36,"props":2107,"children":2108},{},[2109],{"type":33,"value":1129},{"type":18,"tag":76,"props":2111,"children":2112},{},[2113,2121,2129,2137],{"type":18,"tag":80,"props":2114,"children":2115},{},[2116,2120],{"type":18,"tag":52,"props":2117,"children":2118},{},[2119],{"type":33,"value":1140},{"type":33,"value":1142},{"type":18,"tag":80,"props":2122,"children":2123},{},[2124,2128],{"type":18,"tag":52,"props":2125,"children":2126},{},[2127],{"type":33,"value":1150},{"type":33,"value":1152},{"type":18,"tag":80,"props":2130,"children":2131},{},[2132,2136],{"type":18,"tag":52,"props":2133,"children":2134},{},[2135],{"type":33,"value":1160},{"type":33,"value":1162},{"type":18,"tag":80,"props":2138,"children":2139},{},[2140,2144],{"type":18,"tag":52,"props":2141,"children":2142},{},[2143],{"type":33,"value":1170},{"type":33,"value":1172},{"type":18,"tag":36,"props":2146,"children":2147},{},[2148],{"type":33,"value":1177},{"type":18,"tag":1179,"props":2150,"children":2151},{"description":1181,"link":1182,"linkText":1183,"title":1184},[],{"title":7,"searchDepth":1187,"depth":1187,"links":2153},[2154,2155,2156,2157,2158,2159,2160,2161,2165,2166,2167],{"id":30,"depth":1190,"text":34},{"id":66,"depth":1187,"text":69},{"id":125,"depth":1187,"text":128},{"id":179,"depth":1187,"text":182},{"id":226,"depth":1187,"text":229},{"id":470,"depth":1187,"text":473},{"id":696,"depth":1187,"text":699},{"id":788,"depth":1187,"text":791,"children":2162},[2163,2164],{"id":799,"depth":1190,"text":802},{"id":907,"depth":1190,"text":910},{"id":1029,"depth":1187,"text":1032},{"id":1075,"depth":1187,"text":1078},{"id":1116,"depth":1187,"text":1119},1777348741813]