docs: def StopHuntIfCPUOrNetworkLimitsExceeded(hunt_id):
    """Stops the hunt if average limites are exceeded."""
    hunt_obj = data_store.REL_DB.ReadHuntObject(hunt_id)
  
    # Do nothing if the hunt is already stopped.
    if hunt_obj.hunt_state == rdf_hunt_objects.Hunt.HuntState.STOPPED:
      return hunt_obj
  
    hunt_counters = data_store.REL_DB.ReadHuntCounters(hunt_id)
  
    # Check global hunt network bytes limit first.
    if (hunt_obj.total_network_bytes_limit and
        hunt_counters.total_network_bytes_sent >
        hunt_obj.total_network_bytes_limit):
      reason = ("Hunt %s reached the total network bytes sent limit of %d and "
                "was stopped.") % (hunt_obj.hunt_id,
                                   hunt_obj.total_network_bytes_limit)
      return StopHunt(hunt_obj.hunt_id, reason=reason)
  
    # Check that we have enough clients to apply average limits.
    if hunt_counters.num_clients < MIN_CLIENTS_FOR_AVERAGE_THRESHOLDS:
      return hunt_obj
  
    # Check average per-client results count limit.
    if hunt_obj.avg_results_per_client_limit:
      avg_results_per_client = (
          hunt_counters.num_results / hunt_counters.num_clients)
      if avg_results_per_client > hunt_obj.avg_results_per_client_limit:
        # Stop the hunt since we get too many results per client.
        reason = ("Hunt %s reached the average results per client "
                  "limit of %d and was stopped.") % (
                      hunt_obj.hunt_id, hunt_obj.avg_results_per_client_limit)
        return StopHunt(hunt_obj.hunt_id, reason=reason)
  
    # Check average per-client CPU seconds limit.
    if hunt_obj.avg_cpu_seconds_per_client_limit:
      avg_cpu_seconds_per_client = (
          hunt_counters.total_cpu_seconds / hunt_counters.num_clients)
      if avg_cpu_seconds_per_client > hunt_obj.avg_cpu_seconds_per_client_limit:
        # Stop the hunt since we use too many CPUs per client.
        reason = ("Hunt %s reached the average CPU seconds per client "
                  "limit of %d and was stopped.") % (
                      hunt_obj.hunt_id, hunt_obj.avg_cpu_seconds_per_client_limit)
        return StopHunt(hunt_obj.hunt_id, reason=reason)
  
    # Check average per-client network bytes limit.
    if hunt_obj.avg_network_bytes_per_client_limit:
      avg_network_bytes_per_client = (
          hunt_counters.total_network_bytes_sent / hunt_counters.num_clients)
      if (avg_network_bytes_per_client >
          hunt_obj.avg_network_bytes_per_client_limit):
        # Stop the hunt since we use too many network bytes sent
        # per client.
        reason = ("Hunt %s reached the average network bytes per client "
                  "limit of %d and was stopped.") % (
                      hunt_obj.hunt_id,
                      hunt_obj.avg_network_bytes_per_client_limit)
        return StopHunt(hunt_obj.hunt_id, reason=reason)
  
    return hunt_obj