[{"data":1,"prerenderedAt":1207},["ShallowReactive",2],{"article-end-to-end-ml-model":3,"content-query-A160U8eaZ8":688},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"body":11,"_type":682,"_id":683,"_source":684,"_file":685,"_stem":686,"_extension":687},"\u002Farticles\u002Fend-to-end-ml-model","articles",false,"","End-to-End ML Model Walkthrough: From model.fit() to Production","Most ML tutorials stop at training. This walkthrough covers the full loop — training a toy model, tracking experiments with MLflow, deploying to a serving endpoint, and automating retraining with scheduled GPU jobs.","2025-07-28",{"type":12,"children":13,"toc":671},"root",[14,22,37,42,47,54,59,71,76,82,87,100,162,167,173,178,187,192,235,240,246,251,260,265,308,313,319,324,329,372,377,383,388,412,417,450,455,466,479,484,490,495,579,584,589,595,600,610,620,630,640,645,649],{"type":15,"tag":16,"props":17,"children":19},"element","h1",{"id":18},"end-to-end-ml-model-walkthrough-from-modelfit-to-production",[20],{"type":21,"value":8},"text",{"type":15,"tag":23,"props":24,"children":25},"p",{},[26,28,35],{"type":21,"value":27},"Most machine learning tutorials end at ",{"type":15,"tag":29,"props":30,"children":32},"code",{"className":31},[],[33],{"type":21,"value":34},"model.fit()",{"type":21,"value":36},". You train a model, print the accuracy, and the tutorial is done. But that's maybe 10% of the real work.",{"type":15,"tag":23,"props":38,"children":39},{},[40],{"type":21,"value":41},"What happens next? How does the model get into production? How do you retrain it when the data changes? How do you know if the new version is better than the old one? These are the questions that separate a notebook experiment from a working ML system.",{"type":15,"tag":23,"props":43,"children":44},{},[45],{"type":21,"value":46},"This article walks through the full lifecycle of a deliberately simple model. The model itself is trivial — that's the point. The infrastructure around it is what matters.",{"type":15,"tag":48,"props":49,"children":51},"h2",{"id":50},"the-toy-model",[52],{"type":21,"value":53},"The toy model",{"type":15,"tag":23,"props":55,"children":56},{},[57],{"type":21,"value":58},"We'll use a scikit-learn classifier on the Iris dataset. Three classes, four features, 150 samples. You can't get simpler than this.",{"type":15,"tag":60,"props":61,"children":66},"pre",{"className":62,"code":64,"language":65,"meta":7},[63],"language-python","from sklearn.datasets import load_iris\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\n\nX, y = load_iris(return_X_y=True)\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n\nmodel = RandomForestClassifier(n_estimators=100, max_depth=5)\nmodel.fit(X_train, y_train)\n\npredictions = model.predict(X_test)\nprint(f\"Accuracy: {accuracy_score(y_test, predictions):.3f}\")\n","python",[67],{"type":15,"tag":29,"props":68,"children":69},{"__ignoreMap":7},[70],{"type":21,"value":64},{"type":15,"tag":23,"props":72,"children":73},{},[74],{"type":21,"value":75},"This is where most tutorials stop. You have a model. It works. Now what?",{"type":15,"tag":48,"props":77,"children":79},{"id":78},"the-first-training-run",[80],{"type":21,"value":81},"The first training run",{"type":15,"tag":23,"props":83,"children":84},{},[85],{"type":21,"value":86},"Before adding any infrastructure, let's think about what this training script actually produces and what questions come up the moment you try to use the result.",{"type":15,"tag":23,"props":88,"children":89},{},[90,92,98],{"type":21,"value":91},"The output is a fitted model object sitting in memory. If you want to keep it, you ",{"type":15,"tag":29,"props":93,"children":95},{"className":94},[],[96],{"type":21,"value":97},"pickle.dump()",{"type":21,"value":99}," it to a file. And immediately you have problems:",{"type":15,"tag":101,"props":102,"children":103},"ul",{},[104,116,142,152],{"type":15,"tag":105,"props":106,"children":107},"li",{},[108,114],{"type":15,"tag":109,"props":110,"children":111},"strong",{},[112],{"type":21,"value":113},"Where does the file go?",{"type":21,"value":115}," A local directory? A shared drive? An object store?",{"type":15,"tag":105,"props":117,"children":118},{},[119,124,126,132,134,140],{"type":15,"tag":109,"props":120,"children":121},{},[122],{"type":21,"value":123},"What do you name it?",{"type":21,"value":125}," ",{"type":15,"tag":29,"props":127,"children":129},{"className":128},[],[130],{"type":21,"value":131},"model.pkl",{"type":21,"value":133},"? ",{"type":15,"tag":29,"props":135,"children":137},{"className":136},[],[138],{"type":21,"value":139},"model_v2_final_FINAL.pkl",{"type":21,"value":141},"?",{"type":15,"tag":105,"props":143,"children":144},{},[145,150],{"type":15,"tag":109,"props":146,"children":147},{},[148],{"type":21,"value":149},"What produced it?",{"type":21,"value":151}," Which version of the code? What hyperparameters? What data?",{"type":15,"tag":105,"props":153,"children":154},{},[155,160],{"type":15,"tag":109,"props":156,"children":157},{},[158],{"type":21,"value":159},"Is it any good?",{"type":21,"value":161}," What was the accuracy? On what test set?",{"type":15,"tag":23,"props":163,"children":164},{},[165],{"type":21,"value":166},"You can solve each of these with discipline and naming conventions. Or you can use a tool that was built for exactly this.",{"type":15,"tag":48,"props":168,"children":170},{"id":169},"mlflow-enters-the-picture",[171],{"type":21,"value":172},"MLflow enters the picture",{"type":15,"tag":23,"props":174,"children":175},{},[176],{"type":21,"value":177},"MLflow is an experiment tracker. At its core, it answers: \"what did I run, with what settings, and what happened?\" Here's the same training script with MLflow:",{"type":15,"tag":60,"props":179,"children":182},{"className":180,"code":181,"language":65,"meta":7},[63],"import mlflow\nfrom sklearn.datasets import load_iris\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\n\nmlflow.set_tracking_uri(\"http:\u002F\u002Fmlflow.internal:5000\")\nmlflow.set_experiment(\"iris-classifier\")\n\nwith mlflow.start_run():\n    X, y = load_iris(return_X_y=True)\n    X_train, X_test, y_train, y_test = train_test_split(\n        X, y, test_size=0.2, random_state=42\n    )\n\n    n_estimators = 100\n    max_depth = 5\n\n    mlflow.log_param(\"n_estimators\", n_estimators)\n    mlflow.log_param(\"max_depth\", max_depth)\n    mlflow.log_param(\"test_size\", 0.2)\n\n    model = RandomForestClassifier(\n        n_estimators=n_estimators, max_depth=max_depth\n    )\n    model.fit(X_train, y_train)\n\n    predictions = model.predict(X_test)\n    acc = accuracy_score(y_test, predictions)\n    mlflow.log_metric(\"accuracy\", acc)\n\n    mlflow.sklearn.log_model(model, \"model\")\n",[183],{"type":15,"tag":29,"props":184,"children":185},{"__ignoreMap":7},[186],{"type":21,"value":181},{"type":15,"tag":23,"props":188,"children":189},{},[190],{"type":21,"value":191},"Not much more code, but now you get:",{"type":15,"tag":101,"props":193,"children":194},{},[195,205,215,225],{"type":15,"tag":105,"props":196,"children":197},{},[198,203],{"type":15,"tag":109,"props":199,"children":200},{},[201],{"type":21,"value":202},"Experiment history.",{"type":21,"value":204}," Every run is recorded with its parameters and metrics. You can compare ten different hyperparameter combinations side by side.",{"type":15,"tag":105,"props":206,"children":207},{},[208,213],{"type":15,"tag":109,"props":209,"children":210},{},[211],{"type":21,"value":212},"Artifact storage.",{"type":21,"value":214}," The model is serialized and stored in a known location — not a random pickle file on someone's laptop.",{"type":15,"tag":105,"props":216,"children":217},{},[218,223],{"type":15,"tag":109,"props":219,"children":220},{},[221],{"type":21,"value":222},"Reproducibility metadata.",{"type":21,"value":224}," MLflow logs the git commit, the Python environment, and the exact parameters. Six months from now, you can see exactly what produced this model.",{"type":15,"tag":105,"props":226,"children":227},{},[228,233],{"type":15,"tag":109,"props":229,"children":230},{},[231],{"type":21,"value":232},"A model registry.",{"type":21,"value":234}," You can promote a run's model to \"Staging\" or \"Production\" in the registry, giving you a single source of truth for which model is currently live.",{"type":15,"tag":23,"props":236,"children":237},{},[238],{"type":21,"value":239},"The difference between MLflow and a pickle file is the same as the difference between a version control system and a folder of zip files. You can survive without it, but you shouldn't.",{"type":15,"tag":48,"props":241,"children":243},{"id":242},"deploying-the-model",[244],{"type":21,"value":245},"Deploying the model",{"type":15,"tag":23,"props":247,"children":248},{},[249],{"type":21,"value":250},"A model in a registry is still just a file. To be useful, it needs to serve predictions. There are many ways to do this — here's one straightforward approach using a Flask endpoint:",{"type":15,"tag":60,"props":252,"children":255},{"className":253,"code":254,"language":65,"meta":7},[63],"import mlflow\nfrom flask import Flask, request, jsonify\n\napp = Flask(__name__)\n\n# Load the production model from the registry\nmodel = mlflow.sklearn.load_model(\"models:\u002Firis-classifier\u002FProduction\")\n\n@app.route(\"\u002Fpredict\", methods=[\"POST\"])\ndef predict():\n    data = request.json[\"features\"]\n    prediction = model.predict([data])\n    return jsonify({\"prediction\": int(prediction[0])})\n",[256],{"type":15,"tag":29,"props":257,"children":258},{"__ignoreMap":7},[259],{"type":21,"value":254},{"type":15,"tag":23,"props":261,"children":262},{},[263],{"type":21,"value":264},"This is a minimal serving layer. In production, you'd want to think about:",{"type":15,"tag":101,"props":266,"children":267},{},[268,278,288,298],{"type":15,"tag":105,"props":269,"children":270},{},[271,276],{"type":15,"tag":109,"props":272,"children":273},{},[274],{"type":21,"value":275},"Containerization.",{"type":21,"value":277}," Package the serving code and its dependencies into a Docker image so it runs the same everywhere.",{"type":15,"tag":105,"props":279,"children":280},{},[281,286],{"type":15,"tag":109,"props":282,"children":283},{},[284],{"type":21,"value":285},"Health checks and readiness probes.",{"type":21,"value":287}," Kubernetes needs to know when the service is ready to accept traffic.",{"type":15,"tag":105,"props":289,"children":290},{},[291,296],{"type":15,"tag":109,"props":292,"children":293},{},[294],{"type":21,"value":295},"Input validation.",{"type":21,"value":297}," Don't trust the incoming data — validate shapes, types, and ranges before feeding them to the model.",{"type":15,"tag":105,"props":299,"children":300},{},[301,306],{"type":15,"tag":109,"props":302,"children":303},{},[304],{"type":21,"value":305},"Logging predictions.",{"type":21,"value":307}," Store what the model predicted and what it received. You'll need this for monitoring and debugging.",{"type":15,"tag":23,"props":309,"children":310},{},[311],{"type":21,"value":312},"The important architectural point: the serving layer pulls the model from the registry. It doesn't know or care how the model was trained. This decouples deployment from training — you can update the model without touching the serving code.",{"type":15,"tag":48,"props":314,"children":316},{"id":315},"why-models-need-retraining",[317],{"type":21,"value":318},"Why models need retraining",{"type":15,"tag":23,"props":320,"children":321},{},[322],{"type":21,"value":323},"Deploy a model and it starts degrading. This isn't a bug — it's a fundamental property of ML systems. The world changes, and the model's training data becomes a less accurate picture of reality.",{"type":15,"tag":23,"props":325,"children":326},{},[327],{"type":21,"value":328},"Common reasons for retraining:",{"type":15,"tag":101,"props":330,"children":331},{},[332,342,352,362],{"type":15,"tag":105,"props":333,"children":334},{},[335,340],{"type":15,"tag":109,"props":336,"children":337},{},[338],{"type":21,"value":339},"Data drift.",{"type":21,"value":341}," The distribution of incoming data shifts away from the training distribution. A fraud detection model trained on pre-pandemic transaction patterns will struggle with post-pandemic shopping behavior.",{"type":15,"tag":105,"props":343,"children":344},{},[345,350],{"type":15,"tag":109,"props":346,"children":347},{},[348],{"type":21,"value":349},"Concept drift.",{"type":21,"value":351}," The relationship between inputs and outputs changes. What counted as spam email five years ago looks different from spam today.",{"type":15,"tag":105,"props":353,"children":354},{},[355,360],{"type":15,"tag":109,"props":356,"children":357},{},[358],{"type":21,"value":359},"New data availability.",{"type":21,"value":361}," You've collected more labeled data since the last training run. The model should benefit from it.",{"type":15,"tag":105,"props":363,"children":364},{},[365,370],{"type":15,"tag":109,"props":366,"children":367},{},[368],{"type":21,"value":369},"Feature changes.",{"type":21,"value":371}," Upstream data pipelines evolve — columns get added, formats change, sources get replaced.",{"type":15,"tag":23,"props":373,"children":374},{},[375],{"type":21,"value":376},"The question isn't whether to retrain. It's how to retrain reliably, automatically, and without a human babysitting the process.",{"type":15,"tag":48,"props":378,"children":380},{"id":379},"scheduled-gpu-jobs-with-kueue",[381],{"type":21,"value":382},"Scheduled GPU jobs with Kueue",{"type":15,"tag":23,"props":384,"children":385},{},[386],{"type":21,"value":387},"Retraining needs compute. For deep learning models, that means GPUs. Even for our simple scikit-learn example, the pattern matters because it scales to real workloads.",{"type":15,"tag":23,"props":389,"children":390},{},[391,393,399,401,410],{"type":21,"value":392},"On Kubernetes, the standard way to run a one-off job is a ",{"type":15,"tag":29,"props":394,"children":396},{"className":395},[],[397],{"type":21,"value":398},"Job",{"type":21,"value":400}," resource. But GPUs are expensive and scarce — you can't just let everyone submit jobs whenever they want. This is where ",{"type":15,"tag":402,"props":403,"children":407},"a",{"href":404,"rel":405},"https:\u002F\u002Fkueue.sigs.k8s.io\u002F",[406],"nofollow",[408],{"type":21,"value":409},"Kueue",{"type":21,"value":411}," comes in.",{"type":15,"tag":23,"props":413,"children":414},{},[415],{"type":21,"value":416},"Kueue is a Kubernetes-native job queueing system. It manages:",{"type":15,"tag":101,"props":418,"children":419},{},[420,430,440],{"type":15,"tag":105,"props":421,"children":422},{},[423,428],{"type":15,"tag":109,"props":424,"children":425},{},[426],{"type":21,"value":427},"Quotas.",{"type":21,"value":429}," Team A gets 4 GPUs, Team B gets 8. No one can starve out another team.",{"type":15,"tag":105,"props":431,"children":432},{},[433,438],{"type":15,"tag":109,"props":434,"children":435},{},[436],{"type":21,"value":437},"Priorities.",{"type":21,"value":439}," Production retraining jobs preempt experimental runs.",{"type":15,"tag":105,"props":441,"children":442},{},[443,448],{"type":15,"tag":109,"props":444,"children":445},{},[446],{"type":21,"value":447},"Fair sharing.",{"type":21,"value":449}," Idle resources get redistributed rather than sitting unused.",{"type":15,"tag":23,"props":451,"children":452},{},[453],{"type":21,"value":454},"A scheduled retraining job looks something like this:",{"type":15,"tag":60,"props":456,"children":461},{"className":457,"code":459,"language":460,"meta":7},[458],"language-yaml","apiVersion: batch\u002Fv1\nkind: CronJob\nmetadata:\n  name: iris-retrain\n  namespace: ml-jobs\nspec:\n  schedule: \"0 2 * * 0\"  # Every Sunday at 2am\n  jobTemplate:\n    spec:\n      template:\n        metadata:\n          labels:\n            kueue.x-k8s.io\u002Fqueue-name: ml-training-queue\n        spec:\n          containers:\n          - name: train\n            image: ml-training:latest\n            command: [\"python\", \"train.py\"]\n            resources:\n              limits:\n                nvidia.com\u002Fgpu: 1\n          restartPolicy: Never\n","yaml",[462],{"type":15,"tag":29,"props":463,"children":464},{"__ignoreMap":7},[465],{"type":21,"value":459},{"type":15,"tag":23,"props":467,"children":468},{},[469,471,477],{"type":21,"value":470},"The ",{"type":15,"tag":29,"props":472,"children":474},{"className":473},[],[475],{"type":21,"value":476},"CronJob",{"type":21,"value":478}," handles scheduling. Kueue handles resource allocation. The training script inside logs everything to MLflow. If the new model performs better than the current production model, it gets promoted in the registry. The serving layer picks it up.",{"type":15,"tag":23,"props":480,"children":481},{},[482],{"type":21,"value":483},"No human intervention required.",{"type":15,"tag":48,"props":485,"children":487},{"id":486},"the-full-loop",[488],{"type":21,"value":489},"The full loop",{"type":15,"tag":23,"props":491,"children":492},{},[493],{"type":21,"value":494},"Zoom out and you can see the complete lifecycle:",{"type":15,"tag":496,"props":497,"children":498},"ol",{},[499,509,519,529,539,549,559,569],{"type":15,"tag":105,"props":500,"children":501},{},[502,507],{"type":15,"tag":109,"props":503,"children":504},{},[505],{"type":21,"value":506},"Data",{"type":21,"value":508}," arrives — new samples, updated labels, corrected features.",{"type":15,"tag":105,"props":510,"children":511},{},[512,517],{"type":15,"tag":109,"props":513,"children":514},{},[515],{"type":21,"value":516},"Training",{"type":21,"value":518}," runs on a schedule (or is triggered by data changes). It uses GPU resources managed by Kueue.",{"type":15,"tag":105,"props":520,"children":521},{},[522,527],{"type":15,"tag":109,"props":523,"children":524},{},[525],{"type":21,"value":526},"Experiment tracking",{"type":21,"value":528}," via MLflow records every run's parameters, metrics, and artifacts.",{"type":15,"tag":105,"props":530,"children":531},{},[532,537],{"type":15,"tag":109,"props":533,"children":534},{},[535],{"type":21,"value":536},"Evaluation",{"type":21,"value":538}," compares the new model against the current production model on a held-out test set.",{"type":15,"tag":105,"props":540,"children":541},{},[542,547],{"type":15,"tag":109,"props":543,"children":544},{},[545],{"type":21,"value":546},"Registration",{"type":21,"value":548}," promotes the new model in the MLflow registry if it passes evaluation.",{"type":15,"tag":105,"props":550,"children":551},{},[552,557],{"type":15,"tag":109,"props":553,"children":554},{},[555],{"type":21,"value":556},"Deployment",{"type":21,"value":558}," picks up the new model version — either automatically or via a promotion step.",{"type":15,"tag":105,"props":560,"children":561},{},[562,567],{"type":15,"tag":109,"props":563,"children":564},{},[565],{"type":21,"value":566},"Monitoring",{"type":21,"value":568}," watches prediction quality, latency, and data drift in production.",{"type":15,"tag":105,"props":570,"children":571},{},[572,577],{"type":15,"tag":109,"props":573,"children":574},{},[575],{"type":21,"value":576},"Retraining",{"type":21,"value":578}," is triggered again when monitoring detects degradation, or simply on schedule.",{"type":15,"tag":23,"props":580,"children":581},{},[582],{"type":21,"value":583},"Each of these steps involves infrastructure decisions. Where does the data live? How are GPUs allocated? Who can promote a model? How do you roll back? What counts as \"better\"?",{"type":15,"tag":23,"props":585,"children":586},{},[587],{"type":21,"value":588},"The model itself — our little random forest — is almost an afterthought. The value is in the system that surrounds it.",{"type":15,"tag":48,"props":590,"children":592},{"id":591},"what-this-looks-like-in-practice",[593],{"type":21,"value":594},"What this looks like in practice",{"type":15,"tag":23,"props":596,"children":597},{},[598],{"type":21,"value":599},"For a team getting started with MLOps, you don't need all of this on day one. A reasonable progression:",{"type":15,"tag":23,"props":601,"children":602},{},[603,608],{"type":15,"tag":109,"props":604,"children":605},{},[606],{"type":21,"value":607},"Week one:",{"type":21,"value":609}," Get MLflow running. Start logging experiments instead of losing them. This alone is a major improvement — you can compare runs and reproduce results.",{"type":15,"tag":23,"props":611,"children":612},{},[613,618],{"type":15,"tag":109,"props":614,"children":615},{},[616],{"type":21,"value":617},"Next:",{"type":21,"value":619}," Containerize your training script. Run it as a Kubernetes Job. You've now decoupled \"where training runs\" from \"who runs it.\"",{"type":15,"tag":23,"props":621,"children":622},{},[623,628],{"type":15,"tag":109,"props":624,"children":625},{},[626],{"type":21,"value":627},"Then:",{"type":21,"value":629}," Add Kueue for resource management. Set up a CronJob for scheduled retraining. Your model stays fresh without manual effort.",{"type":15,"tag":23,"props":631,"children":632},{},[633,638],{"type":15,"tag":109,"props":634,"children":635},{},[636],{"type":21,"value":637},"Finally:",{"type":21,"value":639}," Build the promotion pipeline. Automated evaluation, registry promotion, serving layer updates. The full loop.",{"type":15,"tag":23,"props":641,"children":642},{},[643],{"type":21,"value":644},"Each step is independently valuable. You don't need to build the whole thing before any of it is useful.",{"type":15,"tag":646,"props":647,"children":648},"hr",{},[],{"type":15,"tag":23,"props":650,"children":651},{},[652,654,661,663,669],{"type":21,"value":653},"This is the kind of infrastructure work we help teams build at ",{"type":15,"tag":402,"props":655,"children":658},{"href":656,"rel":657},"https:\u002F\u002Fdeploying.ai",[406],[659],{"type":21,"value":660},"deploying.ai",{"type":21,"value":662},". If you're past the notebook stage and need your models running reliably in production, ",{"type":15,"tag":402,"props":664,"children":666},{"href":665},"mailto:vlad@deploying.ai",[667],{"type":21,"value":668},"let's talk",{"type":21,"value":670},".",{"title":7,"searchDepth":672,"depth":672,"links":673},2,[674,675,676,677,678,679,680,681],{"id":50,"depth":672,"text":53},{"id":78,"depth":672,"text":81},{"id":169,"depth":672,"text":172},{"id":242,"depth":672,"text":245},{"id":315,"depth":672,"text":318},{"id":379,"depth":672,"text":382},{"id":486,"depth":672,"text":489},{"id":591,"depth":672,"text":594},"markdown","content:articles:end-to-end-ml-model.md","content","articles\u002Fend-to-end-ml-model.md","articles\u002Fend-to-end-ml-model","md",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"body":689,"_type":682,"_id":683,"_source":684,"_file":685,"_stem":686,"_extension":687},{"type":12,"children":690,"toc":1197},[691,695,705,709,713,717,721,729,733,737,741,751,798,802,806,810,818,822,857,861,865,869,877,881,916,920,924,928,932,967,971,975,979,995,999,1026,1030,1038,1048,1052,1056,1060,1127,1131,1135,1139,1143,1151,1159,1167,1175,1179,1182],{"type":15,"tag":16,"props":692,"children":693},{"id":18},[694],{"type":21,"value":8},{"type":15,"tag":23,"props":696,"children":697},{},[698,699,704],{"type":21,"value":27},{"type":15,"tag":29,"props":700,"children":702},{"className":701},[],[703],{"type":21,"value":34},{"type":21,"value":36},{"type":15,"tag":23,"props":706,"children":707},{},[708],{"type":21,"value":41},{"type":15,"tag":23,"props":710,"children":711},{},[712],{"type":21,"value":46},{"type":15,"tag":48,"props":714,"children":715},{"id":50},[716],{"type":21,"value":53},{"type":15,"tag":23,"props":718,"children":719},{},[720],{"type":21,"value":58},{"type":15,"tag":60,"props":722,"children":724},{"className":723,"code":64,"language":65,"meta":7},[63],[725],{"type":15,"tag":29,"props":726,"children":727},{"__ignoreMap":7},[728],{"type":21,"value":64},{"type":15,"tag":23,"props":730,"children":731},{},[732],{"type":21,"value":75},{"type":15,"tag":48,"props":734,"children":735},{"id":78},[736],{"type":21,"value":81},{"type":15,"tag":23,"props":738,"children":739},{},[740],{"type":21,"value":86},{"type":15,"tag":23,"props":742,"children":743},{},[744,745,750],{"type":21,"value":91},{"type":15,"tag":29,"props":746,"children":748},{"className":747},[],[749],{"type":21,"value":97},{"type":21,"value":99},{"type":15,"tag":101,"props":752,"children":753},{},[754,762,782,790],{"type":15,"tag":105,"props":755,"children":756},{},[757,761],{"type":15,"tag":109,"props":758,"children":759},{},[760],{"type":21,"value":113},{"type":21,"value":115},{"type":15,"tag":105,"props":763,"children":764},{},[765,769,770,775,776,781],{"type":15,"tag":109,"props":766,"children":767},{},[768],{"type":21,"value":123},{"type":21,"value":125},{"type":15,"tag":29,"props":771,"children":773},{"className":772},[],[774],{"type":21,"value":131},{"type":21,"value":133},{"type":15,"tag":29,"props":777,"children":779},{"className":778},[],[780],{"type":21,"value":139},{"type":21,"value":141},{"type":15,"tag":105,"props":783,"children":784},{},[785,789],{"type":15,"tag":109,"props":786,"children":787},{},[788],{"type":21,"value":149},{"type":21,"value":151},{"type":15,"tag":105,"props":791,"children":792},{},[793,797],{"type":15,"tag":109,"props":794,"children":795},{},[796],{"type":21,"value":159},{"type":21,"value":161},{"type":15,"tag":23,"props":799,"children":800},{},[801],{"type":21,"value":166},{"type":15,"tag":48,"props":803,"children":804},{"id":169},[805],{"type":21,"value":172},{"type":15,"tag":23,"props":807,"children":808},{},[809],{"type":21,"value":177},{"type":15,"tag":60,"props":811,"children":813},{"className":812,"code":181,"language":65,"meta":7},[63],[814],{"type":15,"tag":29,"props":815,"children":816},{"__ignoreMap":7},[817],{"type":21,"value":181},{"type":15,"tag":23,"props":819,"children":820},{},[821],{"type":21,"value":191},{"type":15,"tag":101,"props":823,"children":824},{},[825,833,841,849],{"type":15,"tag":105,"props":826,"children":827},{},[828,832],{"type":15,"tag":109,"props":829,"children":830},{},[831],{"type":21,"value":202},{"type":21,"value":204},{"type":15,"tag":105,"props":834,"children":835},{},[836,840],{"type":15,"tag":109,"props":837,"children":838},{},[839],{"type":21,"value":212},{"type":21,"value":214},{"type":15,"tag":105,"props":842,"children":843},{},[844,848],{"type":15,"tag":109,"props":845,"children":846},{},[847],{"type":21,"value":222},{"type":21,"value":224},{"type":15,"tag":105,"props":850,"children":851},{},[852,856],{"type":15,"tag":109,"props":853,"children":854},{},[855],{"type":21,"value":232},{"type":21,"value":234},{"type":15,"tag":23,"props":858,"children":859},{},[860],{"type":21,"value":239},{"type":15,"tag":48,"props":862,"children":863},{"id":242},[864],{"type":21,"value":245},{"type":15,"tag":23,"props":866,"children":867},{},[868],{"type":21,"value":250},{"type":15,"tag":60,"props":870,"children":872},{"className":871,"code":254,"language":65,"meta":7},[63],[873],{"type":15,"tag":29,"props":874,"children":875},{"__ignoreMap":7},[876],{"type":21,"value":254},{"type":15,"tag":23,"props":878,"children":879},{},[880],{"type":21,"value":264},{"type":15,"tag":101,"props":882,"children":883},{},[884,892,900,908],{"type":15,"tag":105,"props":885,"children":886},{},[887,891],{"type":15,"tag":109,"props":888,"children":889},{},[890],{"type":21,"value":275},{"type":21,"value":277},{"type":15,"tag":105,"props":893,"children":894},{},[895,899],{"type":15,"tag":109,"props":896,"children":897},{},[898],{"type":21,"value":285},{"type":21,"value":287},{"type":15,"tag":105,"props":901,"children":902},{},[903,907],{"type":15,"tag":109,"props":904,"children":905},{},[906],{"type":21,"value":295},{"type":21,"value":297},{"type":15,"tag":105,"props":909,"children":910},{},[911,915],{"type":15,"tag":109,"props":912,"children":913},{},[914],{"type":21,"value":305},{"type":21,"value":307},{"type":15,"tag":23,"props":917,"children":918},{},[919],{"type":21,"value":312},{"type":15,"tag":48,"props":921,"children":922},{"id":315},[923],{"type":21,"value":318},{"type":15,"tag":23,"props":925,"children":926},{},[927],{"type":21,"value":323},{"type":15,"tag":23,"props":929,"children":930},{},[931],{"type":21,"value":328},{"type":15,"tag":101,"props":933,"children":934},{},[935,943,951,959],{"type":15,"tag":105,"props":936,"children":937},{},[938,942],{"type":15,"tag":109,"props":939,"children":940},{},[941],{"type":21,"value":339},{"type":21,"value":341},{"type":15,"tag":105,"props":944,"children":945},{},[946,950],{"type":15,"tag":109,"props":947,"children":948},{},[949],{"type":21,"value":349},{"type":21,"value":351},{"type":15,"tag":105,"props":952,"children":953},{},[954,958],{"type":15,"tag":109,"props":955,"children":956},{},[957],{"type":21,"value":359},{"type":21,"value":361},{"type":15,"tag":105,"props":960,"children":961},{},[962,966],{"type":15,"tag":109,"props":963,"children":964},{},[965],{"type":21,"value":369},{"type":21,"value":371},{"type":15,"tag":23,"props":968,"children":969},{},[970],{"type":21,"value":376},{"type":15,"tag":48,"props":972,"children":973},{"id":379},[974],{"type":21,"value":382},{"type":15,"tag":23,"props":976,"children":977},{},[978],{"type":21,"value":387},{"type":15,"tag":23,"props":980,"children":981},{},[982,983,988,989,994],{"type":21,"value":392},{"type":15,"tag":29,"props":984,"children":986},{"className":985},[],[987],{"type":21,"value":398},{"type":21,"value":400},{"type":15,"tag":402,"props":990,"children":992},{"href":404,"rel":991},[406],[993],{"type":21,"value":409},{"type":21,"value":411},{"type":15,"tag":23,"props":996,"children":997},{},[998],{"type":21,"value":416},{"type":15,"tag":101,"props":1000,"children":1001},{},[1002,1010,1018],{"type":15,"tag":105,"props":1003,"children":1004},{},[1005,1009],{"type":15,"tag":109,"props":1006,"children":1007},{},[1008],{"type":21,"value":427},{"type":21,"value":429},{"type":15,"tag":105,"props":1011,"children":1012},{},[1013,1017],{"type":15,"tag":109,"props":1014,"children":1015},{},[1016],{"type":21,"value":437},{"type":21,"value":439},{"type":15,"tag":105,"props":1019,"children":1020},{},[1021,1025],{"type":15,"tag":109,"props":1022,"children":1023},{},[1024],{"type":21,"value":447},{"type":21,"value":449},{"type":15,"tag":23,"props":1027,"children":1028},{},[1029],{"type":21,"value":454},{"type":15,"tag":60,"props":1031,"children":1033},{"className":1032,"code":459,"language":460,"meta":7},[458],[1034],{"type":15,"tag":29,"props":1035,"children":1036},{"__ignoreMap":7},[1037],{"type":21,"value":459},{"type":15,"tag":23,"props":1039,"children":1040},{},[1041,1042,1047],{"type":21,"value":470},{"type":15,"tag":29,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":21,"value":476},{"type":21,"value":478},{"type":15,"tag":23,"props":1049,"children":1050},{},[1051],{"type":21,"value":483},{"type":15,"tag":48,"props":1053,"children":1054},{"id":486},[1055],{"type":21,"value":489},{"type":15,"tag":23,"props":1057,"children":1058},{},[1059],{"type":21,"value":494},{"type":15,"tag":496,"props":1061,"children":1062},{},[1063,1071,1079,1087,1095,1103,1111,1119],{"type":15,"tag":105,"props":1064,"children":1065},{},[1066,1070],{"type":15,"tag":109,"props":1067,"children":1068},{},[1069],{"type":21,"value":506},{"type":21,"value":508},{"type":15,"tag":105,"props":1072,"children":1073},{},[1074,1078],{"type":15,"tag":109,"props":1075,"children":1076},{},[1077],{"type":21,"value":516},{"type":21,"value":518},{"type":15,"tag":105,"props":1080,"children":1081},{},[1082,1086],{"type":15,"tag":109,"props":1083,"children":1084},{},[1085],{"type":21,"value":526},{"type":21,"value":528},{"type":15,"tag":105,"props":1088,"children":1089},{},[1090,1094],{"type":15,"tag":109,"props":1091,"children":1092},{},[1093],{"type":21,"value":536},{"type":21,"value":538},{"type":15,"tag":105,"props":1096,"children":1097},{},[1098,1102],{"type":15,"tag":109,"props":1099,"children":1100},{},[1101],{"type":21,"value":546},{"type":21,"value":548},{"type":15,"tag":105,"props":1104,"children":1105},{},[1106,1110],{"type":15,"tag":109,"props":1107,"children":1108},{},[1109],{"type":21,"value":556},{"type":21,"value":558},{"type":15,"tag":105,"props":1112,"children":1113},{},[1114,1118],{"type":15,"tag":109,"props":1115,"children":1116},{},[1117],{"type":21,"value":566},{"type":21,"value":568},{"type":15,"tag":105,"props":1120,"children":1121},{},[1122,1126],{"type":15,"tag":109,"props":1123,"children":1124},{},[1125],{"type":21,"value":576},{"type":21,"value":578},{"type":15,"tag":23,"props":1128,"children":1129},{},[1130],{"type":21,"value":583},{"type":15,"tag":23,"props":1132,"children":1133},{},[1134],{"type":21,"value":588},{"type":15,"tag":48,"props":1136,"children":1137},{"id":591},[1138],{"type":21,"value":594},{"type":15,"tag":23,"props":1140,"children":1141},{},[1142],{"type":21,"value":599},{"type":15,"tag":23,"props":1144,"children":1145},{},[1146,1150],{"type":15,"tag":109,"props":1147,"children":1148},{},[1149],{"type":21,"value":607},{"type":21,"value":609},{"type":15,"tag":23,"props":1152,"children":1153},{},[1154,1158],{"type":15,"tag":109,"props":1155,"children":1156},{},[1157],{"type":21,"value":617},{"type":21,"value":619},{"type":15,"tag":23,"props":1160,"children":1161},{},[1162,1166],{"type":15,"tag":109,"props":1163,"children":1164},{},[1165],{"type":21,"value":627},{"type":21,"value":629},{"type":15,"tag":23,"props":1168,"children":1169},{},[1170,1174],{"type":15,"tag":109,"props":1171,"children":1172},{},[1173],{"type":21,"value":637},{"type":21,"value":639},{"type":15,"tag":23,"props":1176,"children":1177},{},[1178],{"type":21,"value":644},{"type":15,"tag":646,"props":1180,"children":1181},{},[],{"type":15,"tag":23,"props":1183,"children":1184},{},[1185,1186,1191,1192,1196],{"type":21,"value":653},{"type":15,"tag":402,"props":1187,"children":1189},{"href":656,"rel":1188},[406],[1190],{"type":21,"value":660},{"type":21,"value":662},{"type":15,"tag":402,"props":1193,"children":1194},{"href":665},[1195],{"type":21,"value":668},{"type":21,"value":670},{"title":7,"searchDepth":672,"depth":672,"links":1198},[1199,1200,1201,1202,1203,1204,1205,1206],{"id":50,"depth":672,"text":53},{"id":78,"depth":672,"text":81},{"id":169,"depth":672,"text":172},{"id":242,"depth":672,"text":245},{"id":315,"depth":672,"text":318},{"id":379,"depth":672,"text":382},{"id":486,"depth":672,"text":489},{"id":591,"depth":672,"text":594},1785232227842]