public void roundComplete() throws Exception {

        this.roundCount++;

        if (roundCount % 100 == 0) {

            List<Statistics> stats = listStats();
            Collections.sort(stats);

            if (stats.size() < 3) //not enough stats yet
            {
                return;
            }

            Statistics winnerStats = stats.get(stats.size() - 1);
            WinnerConfidence winnerConfidence = getWinnerConfidence(stats);
            
            if ((System.currentTimeMillis() - lastStatsPrintTime) > 5000) { //print every 5 secs max
                printStatsAndWinner(stats, winnerStats, winnerConfidence);
                lastStatsPrintTime = System.currentTimeMillis();
            }
            
            if (winnerConfidence.finalConfidence >= 1.0) {
                printStatsAndWinner(stats, winnerStats, winnerConfidence);
                handleWinner(winnerStats);
            }

            //drop loser every 10k rounds
            if (doLoserDrop && roundCount % 10000 == 0 && pwdList.size() > 7) { 

                String loserPwd = stats.get(0).getPwd();
                System.out.println("Dropping fastest canididate: " + loserPwd);

                pwdList.remove(loserPwd);

                synchronized (measurements) {
                    measurements.remove(loserPwd);
                }
            }
            
            //hopefully eliminate any order bias
            Collections.shuffle(pwdList);
            
        }

        //BAIL
        if (requestCount.get() / initalPwdCount >= 1000000) {
            System.err.println("Max request hit (1000000 per pwd). This server is probably NOT vulnerable.");
            isDone = true;
        }

    }