{
  "schema_version": 1,
  "snapshot": {
    "id": "ball-model-comparison-2026-07-19-search-v2-epoch-54",
    "date": "2026-07-19",
    "timezone": "Europe/Berlin",
    "purpose": "Auditable thesis-website snapshot of the modified MobileNetV4 TrackNet and pinned TrackNetV2-reference comparisons.",
    "search_tracknetv2_is_provisional": true,
    "interpretation": "Every headline row represents one selected checkpoint. Values from different epochs are never mixed into a synthetic result."
  },
  "terminology": {
    "modified_model": "Modified three-frame TrackNet with a MobileNetV4 Conv Small backbone; variant fast for Search and fast_light for Tight/Crop.",
    "reference_model": "ChgygLin third-party PyTorch reproduction of the TrackNetV2 topology, pinned to commit 185674ff3d97ef66f3f34ef111a705fd846dd402.",
    "reference_is_official_original_author_release": false,
    "tight_and_crop_are_the_same_profile": true
  },
  "protocol": {
    "scope": "Operational checkpoint comparison on the same tennis data, task geometry, loader, heatmap targets, augmentation, WBCE loss and peak metrics.",
    "dataset": {
      "workspace_relative_path": "TennisBallTracking/output/backupdataset_selected_pose_tracks",
      "all_games": [
        "game10",
        "game11",
        "game12",
        "game13",
        "game14",
        "game15",
        "game16",
        "game17",
        "game18",
        "game19",
        "game20",
        "game21",
        "game22",
        "game23",
        "game24",
        "game25",
        "game26",
        "game27",
        "game28",
        "game29",
        "game30",
        "game31",
        "game32",
        "game33",
        "game34"
      ],
      "training_games": [
        "game10",
        "game11",
        "game12",
        "game13",
        "game14",
        "game15",
        "game16",
        "game17",
        "game18",
        "game19",
        "game20",
        "game21",
        "game22",
        "game23",
        "game24",
        "game25",
        "game26",
        "game27",
        "game28",
        "game29",
        "game32",
        "game33",
        "game34"
      ],
      "held_out_validation_games": [
        "game30",
        "game31"
      ],
      "training_windows": 9684,
      "validation_windows": 1030,
      "validation_heatmaps": 3090,
      "frames_per_window": 3,
      "input_rgb_channels": 9,
      "output_heatmaps_per_window": 3,
      "ball_info_sha256": "4dcf599af09598e08dbc215f21a7de1da6971f5c8c6f9b311783ed6055464dea",
      "pose_labels_sha256": "b6bdc4c3be57412c037b2071887ff3150c8c2d16ff9856353a489a3571de1b85"
    },
    "common_training": {
      "loss": "summed probability-space weighted binary cross entropy over three heatmaps",
      "prediction_threshold": 0.5,
      "optimizer": "Adadelta",
      "learning_rate": 1.0,
      "scheduler": "ExponentialLR",
      "scheduler_gamma": 0.975,
      "effective_accumulated_batch_size": 16,
      "effective_optimizer_weight_decay": 0.0,
      "window_stride": 3,
      "train_clip_fraction": 1.0,
      "train_clip_seed": 42,
      "augmentation": {
        "geometric_probability": 0.85,
        "horizontal_flip_probability": 0.5,
        "degrees": 2.5,
        "translation_fraction": 0.02,
        "scale_fraction": 0.06,
        "shear_degrees": 0.8,
        "perspective": 0.0005
      }
    },
    "tasks": {
      "search": {
        "purpose": "Recover the ball in a full player-centred portrait context.",
        "input_nchw": [1, 9, 512, 288],
        "crop_anchor": "player",
        "crop_scale": 1.0,
        "crop_jitter_source_px": 0,
        "target_radius_source_px": 2.5,
        "correct_distance_source_px": 4.0,
        "near_distance_source_px": 5.0,
        "micro_batch_size": 2,
        "checkpoint_selection_metric": "f1"
      },
      "tight": {
        "purpose": "Refine an already found ball inside a small ball-centred crop.",
        "input_nchw": [1, 9, 256, 144],
        "crop_anchor": "ball",
        "crop_scale": 0.25,
        "crop_jitter_source_px": 40,
        "target_radius_source_px": 6.0,
        "correct_distance_source_px": 5.0,
        "near_distance_source_px": 7.0,
        "micro_batch_size": 4,
        "checkpoint_selection_metric": "peak_score"
      }
    },
    "metric_definitions": {
      "correct": "Ball visible and predicted peak is within the task-specific correct-distance threshold, measured in source-frame pixels.",
      "nearby": "Ball visible and predicted peak lies outside the correct threshold but inside the near threshold.",
      "missing": "Ball visible but no heatmap peak exceeds the prediction threshold.",
      "wrong": "Ball visible and a peak exists beyond the near threshold.",
      "false_positive": "Ball absent but a peak exceeds the prediction threshold.",
      "precision": "correct / (correct + nearby + wrong + false_positive)",
      "recall": "correct / visible",
      "near_recall": "(correct + nearby) / visible",
      "miss_rate": "missing / visible",
      "accuracy": "(correct + true_negative) / all heatmaps",
      "peak_score": "When visible and absent samples exist: 0.5 * ((correct + 0.5 * nearby) / visible) + 0.5 * (true_negative / absent).",
      "mean_position_error_source_px": "Mean Euclidean source-frame pixel error over visible samples for which a peak exists; therefore far-away wrong peaks also affect this value."
    }
  },
  "comparisons": {
    "search": {
      "task": "search",
      "selection_metric": "f1",
      "status": {
        "modified_model": "complete_200_of_200",
        "tracknetv2": "provisional_54_of_200",
        "tracknetv2_snapshot_date": "2026-07-19",
        "publish_label": "Preliminary TrackNetV2 Search result after 54 of 200 completed epochs"
      },
      "modified_model": {
        "name": "Modified TrackNet — MobileNetV4 Search",
        "variant": "fast",
        "backbone": "mobilenetv4_conv_small",
        "initialization": "ImageNet-pretrained backbone",
        "training_precision": "AMP with FP16 autocast",
        "epochs_completed": 200,
        "epochs_planned": 200,
        "checkpoint_epoch_1_based": 132,
        "metrics_csv_epoch_0_based": 131,
        "selection_value": 0.89463886820551,
        "metrics": {
          "loss": 17.187135783877693,
          "accuracy": 0.8462783171521036,
          "precision": 0.9596645367412141,
          "recall": 0.8378661087866108,
          "near_recall": 0.8528591352859135,
          "f1": 0.89463886820551,
          "miss_rate": 0.1304044630404463,
          "peak_score": 0.9001587884956086,
          "correct_rate": 0.8378661087866108,
          "nearby_rate": 0.01499302649930265,
          "wrong_rate": 0.016736401673640166,
          "absence_accuracy": 0.954954954954955,
          "mean_position_error_source_px": 1.8282851869669243
        },
        "counts": {
          "total": 3090,
          "visible": 2868,
          "absent": 222,
          "correct": 2403,
          "nearby": 43,
          "missing": 374,
          "wrong": 48,
          "false_positive": 10,
          "true_negative": 212
        }
      },
      "tracknetv2": {
        "name": "TrackNetV2 reference — Search",
        "variant": "tracknetv2",
        "parameter_count": 11334147,
        "initialization": "random PyTorch defaults",
        "training_precision": "strict FP32 with AMP and TF32 disabled",
        "epochs_completed_at_snapshot": 54,
        "epochs_planned": 200,
        "checkpoint_epoch_1_based": 30,
        "metrics_csv_epoch_0_based": 29,
        "selection_value": 0.8933972703799337,
        "metrics": {
          "loss": 15.315365847424395,
          "accuracy": 0.8504854368932039,
          "precision": 0.9483163664839468,
          "recall": 0.8444909344490934,
          "near_recall": 0.8612273361227336,
          "f1": 0.8933972703799337,
          "miss_rate": 0.11506276150627615,
          "peak_score": 0.8903935316069207,
          "correct_rate": 0.8444909344490934,
          "nearby_rate": 0.016736401673640166,
          "wrong_rate": 0.023709902370990237,
          "absence_accuracy": 0.9279279279279279,
          "mean_position_error_source_px": 4.242629002775064
        },
        "counts": {
          "total": 3090,
          "visible": 2868,
          "absent": 222,
          "correct": 2422,
          "nearby": 48,
          "missing": 330,
          "wrong": 68,
          "false_positive": 16,
          "true_negative": 206
        }
      },
      "tracknetv2_minus_modified": {
        "loss": -1.8717699364532976,
        "accuracy": 0.004207119741100329,
        "precision": -0.01134817025726731,
        "recall": 0.00662482566248257,
        "f1": -0.0012415978255763127,
        "miss_rate": -0.015341701534170166,
        "peak_score": -0.009765256888687901,
        "mean_position_error_source_px": 2.4143438158081394
      },
      "derived_summary": {
        "modified_position_error_reduction_relative_to_tracknetv2_percent": 56.906786198579695,
        "tracknetv2_additional_correct_predictions": 19,
        "tracknetv2_fewer_missing_predictions": 44,
        "tracknetv2_additional_wrong_localizations": 20,
        "tracknetv2_additional_absent_frame_false_positives": 6
      },
      "observed_cross_epoch_maxima_not_used_for_the_checkpoint_table": {
        "modified_model_peak_score": {
          "value": 0.9032968638094161,
          "epoch_1_based": 53
        },
        "tracknetv2_peak_score_at_snapshot": {
          "value": 0.9027597157827283,
          "epoch_1_based": 34
        }
      }
    },
    "tight": {
      "task": "tight",
      "selection_metric": "peak_score",
      "status": {
        "modified_model": "complete_200_of_200",
        "tracknetv2": "complete_200_of_200_with_fresh_best_checkpoint_evaluation",
        "publish_label": "Completed Tight/Crop comparison"
      },
      "modified_model": {
        "name": "Modified TrackNet — MobileNetV4 Tight",
        "variant": "fast_light",
        "backbone": "mobilenetv4_conv_small",
        "initialization": "ImageNet-pretrained backbone",
        "training_precision": "AMP with FP16 autocast",
        "epochs_completed": 200,
        "epochs_planned": 200,
        "checkpoint_epoch_1_based": 31,
        "metrics_csv_epoch_0_based": 30,
        "selection_value": 0.9218750415226109,
        "metrics": {
          "loss": 436.74470734781073,
          "accuracy": 0.9281553398058252,
          "precision": 0.9646110721793973,
          "recall": 0.9291258859264259,
          "near_recall": 0.9473506581167735,
          "f1": 0.9465360151280728,
          "miss_rate": 0.04083698953763078,
          "peak_score": 0.9218750415226109,
          "correct_rate": 0.9291258859264259,
          "nearby_rate": 0.01822477219034762,
          "wrong_rate": 0.01181235234559568,
          "absence_accuracy": 0.905511811023622,
          "mean_position_error_source_px": 2.2876141719812337
        },
        "counts": {
          "total": 3090,
          "visible": 2963,
          "absent": 127,
          "correct": 2753,
          "nearby": 54,
          "missing": 121,
          "wrong": 35,
          "false_positive": 12,
          "true_negative": 115
        }
      },
      "tracknetv2": {
        "name": "TrackNetV2 reference — Tight",
        "variant": "tracknetv2",
        "parameter_count": 11334147,
        "initialization": "random PyTorch defaults",
        "training_precision": "AMP with FP16 autocast",
        "epochs_completed": 200,
        "epochs_planned": 200,
        "checkpoint_epoch_1_based": 26,
        "metrics_csv_epoch_0_based": 25,
        "selection_value": 0.9298892376050023,
        "metrics": {
          "loss": 342.0307236096656,
          "accuracy": 0.9255663430420712,
          "precision": 0.976843605272533,
          "recall": 0.9254134323320958,
          "near_recall": 0.9358758015524806,
          "f1": 0.9504332755632582,
          "miss_rate": 0.055686803914951066,
          "peak_score": 0.9298892376050023,
          "correct_rate": 0.9254134323320958,
          "nearby_rate": 0.010462369220384746,
          "wrong_rate": 0.008437394532568343,
          "absence_accuracy": 0.9291338582677166,
          "mean_position_error_source_px": 1.891991616218197
        },
        "counts": {
          "total": 3090,
          "visible": 2963,
          "absent": 127,
          "correct": 2742,
          "nearby": 31,
          "missing": 165,
          "wrong": 25,
          "false_positive": 9,
          "true_negative": 118
        }
      },
      "tracknetv2_minus_modified": {
        "loss": -94.71398373814515,
        "accuracy": -0.0025889967637540146,
        "precision": 0.012232533093135656,
        "recall": -0.003712453594330034,
        "f1": 0.0038972604351853457,
        "miss_rate": 0.014849814377320289,
        "peak_score": 0.0080141960823914,
        "mean_position_error_source_px": -0.39562255576303684
      },
      "derived_summary": {
        "tracknetv2_position_error_reduction_relative_to_modified_percent": 17.294111944602967,
        "tracknetv2_fewer_correct_predictions": 11,
        "tracknetv2_additional_missing_predictions": 44,
        "tracknetv2_fewer_wrong_localizations": 10,
        "tracknetv2_fewer_absent_frame_false_positives": 3
      },
      "observed_cross_epoch_maxima_not_used_for_the_checkpoint_table": {
        "modified_model_f1": {
          "value": 0.9597144314125446,
          "epoch_1_based": 132
        },
        "tracknetv2_f1": {
          "value": 0.9588477366255144,
          "epoch_1_based": 45
        }
      }
    }
  },
  "throughput_benchmark": {
    "created_utc": "2026-07-18T09:18:01.352168+00:00",
    "hardware": "NVIDIA GeForce RTX 4060",
    "driver_version": "595.58.03",
    "runtime": "TensorRT 10.16.1",
    "precision": "optimized FP16 build mode",
    "measurement": "device-resident serial TensorRT enqueue timed by CUDA events",
    "batch_size": 1,
    "trials": 5,
    "timed_calls_per_trial": 5000,
    "warmup_calls_per_trial": 1000,
    "heatmaps_per_call": 3,
    "search": {
      "modified_model": {
        "label": "Modified TrackNet — Search",
        "input_nchw": [1, 9, 512, 288],
        "parameters": 1547210,
        "engine_mib": 4.600925,
        "engine_sha256": "7a2c2bb29453277209519a0fb31493ab38359bad17ca0c6e364aadd796965c9f",
        "median_latency_ms_per_call": 1.613447,
        "median_calls_per_second": 619.791044,
        "median_heatmaps_per_second": 1859.373131,
        "min_calls_per_second": 619.5717,
        "max_calls_per_second": 622.933884
      },
      "tracknetv2_reference": {
        "label": "TrackNetV2 reference — 288x512",
        "input_nchw": [1, 9, 288, 512],
        "parameters": 11334147,
        "engine_mib": 22.545826,
        "engine_sha256": "194de71262305188d9f1797966bee5820091a66c41598da1c4c0813d51ea6e46",
        "median_latency_ms_per_call": 7.1760766,
        "median_calls_per_second": 139.351913,
        "median_heatmaps_per_second": 418.055738,
        "min_calls_per_second": 139.274567,
        "max_calls_per_second": 140.296728
      },
      "modified_over_reference": {
        "throughput_speedup": 4.447667998644555,
        "latency_reduction_percent": 77.51630744855763,
        "parameter_reduction_percent": 86.34912711119769,
        "engine_size_reduction_percent": 79.59300759262491
      }
    },
    "tight": {
      "modified_model": {
        "label": "Modified TrackNet — Tight",
        "input_nchw": [1, 9, 256, 144],
        "parameters": 1399953,
        "engine_mib": 4.095371,
        "engine_sha256": "f91b2c30c5747021b329b00204d4a0e66bcceb448278c1c3903e0c9984736fc9",
        "median_latency_ms_per_call": 0.5309678,
        "median_calls_per_second": 1883.353378,
        "median_heatmaps_per_second": 5650.060135,
        "min_calls_per_second": 1882.489012,
        "max_calls_per_second": 1884.293808
      },
      "tracknetv2_reference": {
        "label": "TrackNetV2 reference — 144x256",
        "input_nchw": [1, 9, 144, 256],
        "parameters": 11334147,
        "engine_mib": 22.626308,
        "engine_sha256": "69b2d0969cedf0f64ecd19ad90f9f91cff7b963e7f362204e275da6829ba1b5f",
        "median_latency_ms_per_call": 1.8315424,
        "median_calls_per_second": 545.987906,
        "median_heatmaps_per_second": 1637.963718,
        "min_calls_per_second": 545.115266,
        "max_calls_per_second": 547.461879
      },
      "modified_over_reference": {
        "throughput_speedup": 3.449441566934635,
        "latency_reduction_percent": 71.00980026452022,
        "parameter_reduction_percent": 87.6483603044852,
        "engine_size_reduction_percent": 81.89995910954629
      }
    },
    "excluded_from_timed_region": [
      "video decoding",
      "crop selection",
      "resize",
      "normalization",
      "host-device transfer",
      "heatmap peak extraction",
      "tracking feedback",
      "drawing"
    ],
    "is_end_to_end_video_fps": false
  },
  "fairness_and_limits": [
    "Search and Tight are different tasks with different crop geometry, heatmap radius and distance thresholds; compare models only within the same task.",
    "The data split, task geometry, loader, targets, augmentation, loss and peak metrics are shared within each model pair.",
    "TrackNetV2 was trained from random initialization because the upstream converted checkpoint is incompatible with the standard topology and the required portrait widths.",
    "The modified models use an ImageNet-pretrained MobileNetV4 backbone, so this is an operational checkpoint comparison rather than a pure from-scratch architecture ablation.",
    "Search TrackNetV2 uses strict FP32 after the earlier AMP Search run developed non-finite validation losses; the historical modified Search run used AMP.",
    "The Search TrackNetV2 result is a frozen provisional snapshot after 54 of 200 epochs. Its checkpoint and metrics may improve or change when training finishes.",
    "The completed Tight TrackNetV2 result has a fresh evaluation_best.json tied to the current best-checkpoint hash.",
    "The throughput benchmark compares dense architecture execution. The TrackNetV2 benchmark engine uses deterministic dense initialization rather than the trained accuracy checkpoint; weight values do not change dense operator topology and structured sparsity was disabled.",
    "Throughput pairs have equal pixel counts, but the reference H/W order is transposed relative to the modified portrait tensors.",
    "Raw calls per second are forward-pass throughput, not full recovery-pipeline or video FPS.",
    "The standard FP16 TensorRT build may retain numerically sensitive layers at higher precision.",
    "Do not mix independent per-column maxima from different epochs. The comparison tables use only the saved checkpoint selected by the task's declared metric.",
    "The pinned TrackNetV2 implementation is a third-party PyTorch reproduction, not an official PyTorch release by the original TrackNetV2 authors."
  ],
  "sources": {
    "modified_search_description": {
      "workspace_relative_path": "TennisProject/ball_prediction/provenance/full_portrait_288x512_fast_description.txt",
      "sha256": "6e32e58d74caee4278f29243b4973c3bc8091efb573ca7b23af7147fe1726683"
    },
    "modified_search_metrics": {
      "workspace_relative_path": "TennisProject/ball_prediction/provenance/full_portrait_288x512_fast_metrics.csv",
      "sha256": "93935d95f63f7e7fc23e04d2fb14b74c86c1e822bf79b1b9697103d8fc971d22"
    },
    "modified_search_checkpoint": {
      "workspace_relative_path": "TennisProject/ball_prediction/models/checkpoints/full_portrait_288x512_fast/best.pt",
      "sha256": "e66a507ee8465980b51e956a9d42fefcbf32ca9c2b70f20c95017ba6c2f66710"
    },
    "modified_tight_description": {
      "workspace_relative_path": "TennisProject/ball_prediction/provenance/crop0p25_256x144_e200_fast_light_description.txt",
      "sha256": "c1f1de6c7f001642818444eb357bc75358e459b42027992d4f00e15c22c4ec61"
    },
    "modified_tight_metrics": {
      "workspace_relative_path": "TennisProject/ball_prediction/provenance/crop0p25_256x144_e200_fast_light_metrics.csv",
      "sha256": "b9b4de51eb2738480c89761e4332d33d8a75aeb4f4909274cc4ebcca3298bd3f"
    },
    "modified_tight_checkpoint": {
      "workspace_relative_path": "TennisProject/ball_prediction/models/checkpoints/crop0p25_256x144_e200_fast_light/best.pt",
      "sha256": "ac7bd11d9d8051d0b398afa213f3d09cd32ef638e0f13764095778fbb265d115"
    },
    "tracknetv2_search_description": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/runs/tracknetv2_same_data/search_full_portrait_288x512_fp32/description.txt",
      "sha256": "d7cd1082eed0772bcf8fec6c19f8e27294d5d95c633fba755a7b5c20030e8cbc"
    },
    "tracknetv2_search_metrics_snapshot_54_epochs": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/runs/tracknetv2_same_data/search_full_portrait_288x512_fp32/metrics.csv",
      "sha256_scope": "CSV header plus the first 54 completed epoch rows (first 55 lines); the live training CSV continues appending after this frozen snapshot.",
      "sha256": "ae1978f9d611cb982e752b073d3f3a78b3bdbcf720078d689c033d9bd939f437"
    },
    "tracknetv2_search_best_checkpoint_at_snapshot": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/runs/tracknetv2_same_data/search_full_portrait_288x512_fp32/checkpoint/best.pt",
      "sha256": "38c04a0cf11389b73dd146cf5a53c4510a23fa81dfd6bdb973c945347e95ac11"
    },
    "tracknetv2_tight_description": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/runs/tracknetv2_same_data/tight_crop0p25_256x144/description.txt",
      "sha256": "25dc3513816a0973b7ea8f9d06002a7538f56fa125b4c3456c19fdd799719b9b"
    },
    "tracknetv2_tight_metrics": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/runs/tracknetv2_same_data/tight_crop0p25_256x144/metrics.csv",
      "sha256": "348f1d0702089c94725e258d75116cb6a9b33068531d0abb8af26fe04abebe6e"
    },
    "tracknetv2_tight_best_checkpoint": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/runs/tracknetv2_same_data/tight_crop0p25_256x144/checkpoint/best.pt",
      "sha256": "130a5918e003205ea34f0ac7ccc5f64a647958aa5969eecb66eb579d29bb6f5c"
    },
    "tracknetv2_tight_fresh_evaluation": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/runs/tracknetv2_same_data/tight_crop0p25_256x144/evaluation_best.json",
      "sha256": "37efc072c41d49fe9f445ebfec8c4a99849fd09d6d7ff5856db91cfb3b954a7a"
    },
    "throughput_summary_csv": {
      "workspace_relative_path": "TennisProject/ball_prediction/benchmarks/tensorrt_fp16_vs_tracknetv2/results/summary.csv",
      "sha256": "6c6c5446eae816fc9b2ab0879b65082593957aafa21d6c394184afe082b98421"
    },
    "throughput_summary_json": {
      "workspace_relative_path": "TennisProject/ball_prediction/benchmarks/tensorrt_fp16_vs_tracknetv2/results/summary.json",
      "sha256": "d2cdb4b7d53d430eeb9f8634584ae521cbbd7b78424b65f441f4118b712b32bd"
    },
    "throughput_report": {
      "workspace_relative_path": "TennisProject/ball_prediction/benchmarks/tensorrt_fp16_vs_tracknetv2/results/REPORT.md",
      "sha256": "d8a156ac411834023586353ad9a4c7b2be846c3897d94eece17ad5923a0b339d"
    },
    "tracknetv2_model_source": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/models/tracknetv2_official.py",
      "sha256": "70d6fbda21e6fa473a7d0c644dd27fa3ca98184f66270b9f18141054c28bf0a7",
      "upstream_repository": "https://github.com/ChgygLin/TrackNetV2-pytorch",
      "upstream_commit": "185674ff3d97ef66f3f34ef111a705fd846dd402"
    },
    "shared_training_pipeline": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/train_dataset_portrait_ball_3f_trainval.py",
      "sha256": "1d5cf75c0ab82c4f0af910271e6ca57f79b9709abff42e511ebd7ccf8ccd31dc"
    },
    "wbce_source": {
      "workspace_relative_path": "TennisProject/ball_prediction/training/train.py",
      "sha256": "4ea1c86470b5bbd8dcb6f20e6ed78d7df190449178410da238ab0ad1452fbf58"
    }
  }
}
