private void setupCutoffTimers() {
    Logger cutoffLogger = sessionLogger();
    Random random = new Random();
    int cutoffIfSimultaneous = (int) (random.nextDouble() * (latestCutoff - earliestCutoff));
    if (simultaneousCutoff) {
      cutoffLogger.info("using a simultaneous cutoff of " + cutoffIfSimultaneous + " seconds.");
    }
    Iterator<String> nameIterator = playerNameIterator();
    while (nameIterator.hasNext()) {
      Judge judge = getJudgeOrNull(nameIterator.next());
      if (judge == null) {
        continue;
      }

      int cutoff;
      if (simultaneousCutoff) {
        cutoff = cutoffIfSimultaneous;
      } else {
        cutoff = earliestCutoff + (int) (random.nextDouble() * (latestCutoff - earliestCutoff));
        cutoffLogger.info(
            "using a cutoff for judge '" + judge.getName() + "' of " + cutoff + " seconds.");
        int roundDuration = timeLimit();
        if (cutoff > roundDuration + 10) {
          cutoff = roundDuration + 10;
          cutoffLogger.info(
              "reducing timeout to " + cutoff + " (10 seconds after round finishes).");
        }
      }
      TimerTask task = judge.getCutoffTimer();
      timer.schedule(task, 1000 * cutoff);
    }
  }
  private void logCutoffParameters() {
    String earliest = props.getProperty(EARLIEST_JUDGE_CUTOFF_WORD);
    String latest = props.getProperty(LATEST_JUDGE_CUTOFF_WORD);
    String simultaneity = props.getProperty(SIMULTANEOUS_JUDGE_CUTOFF_WORD);
    sliderLabelStepSize = PropertyHelper.getSliderLabelStepSize(props);
    sliderInputStepSize = PropertyHelper.getSliderInputStepSize(props);
    Logger logger = PropertyHelper.configLogger();
    if (earliest == null && latest == null && simultaneity == null) {
      earliestCutoff = 0;
      latestCutoff = 0;
      timer = null;

      logger.info("Not cutting off judges.");
      return;
    }

    timer = new Timer();
    DEAD_TASK =
        new TimerTask() {
          public void run() {
            /* empty */
          }
        };
    timer.schedule(DEAD_TASK, new Date().getTime()); // scheduledExecutionTime() is in the past

    int roundDuration = timeLimit();
    if (earliest == null || earliest.length() == 0) {
      earliestCutoff = (roundDuration - 60);
      logger.info("Defaulting Earliest Cutoff to one minute before round end: " + earliestCutoff);
    } else {
      earliestCutoff = PropertyHelper.parseTimeStringAsSeconds(earliest);
      logger.info("Earliest Judge Cutoff: " + earliestCutoff);
    }

    if (latest == null || latest.length() == 0) {
      latestCutoff = roundDuration + 10;
      logger.info(
          "Defaulting Latest Cutoff to round duration: " + roundDuration + " plus 10 seconds");
    } else {
      latestCutoff = PropertyHelper.parseTimeStringAsSeconds(latest);
      logger.info("Latest Judge Cutoff: " + latestCutoff);
    }

    simultaneousCutoff = PropertyHelper.parseBoolean(SIMULTANEOUS_JUDGE_CUTOFF_WORD, props, false);
  }