class SeedsReport extends Report {

    @Override
    public void write(PrintWriter writer, StatisticsTracker stats) {<FILL_FUNCTION_BODY>}

    @Override
    public String getFilename() {
        return "seeds-report.txt";
    }

}

        // Build header.
        writer.print("[code] [status] [seed] [redirect]\n");

        long seedsCrawled = 0;
        long seedsTotal = 0;
        DisposableStoredSortedMap<Integer, SeedRecord> seedsByCode = stats.calcSeedRecordsSortedByStatusCode();
//        for (Map.Entry<Integer,SeedRecord> entry : seedsByCode.entrySet()) {
        Iterator<Map.Entry<Integer,SeedRecord>> iter = seedsByCode.entrySet().iterator();
        while(iter.hasNext()) {
            Map.Entry<Integer,SeedRecord> entry = iter.next();
            SeedRecord sr = entry.getValue();
            writer.print(sr.getStatusCode());
            writer.print(" ");
            seedsTotal++;
            if((sr.getStatusCode() > 0)) {
                seedsCrawled++;
                writer.print("CRAWLED");
            } else {
                writer.print("NOTCRAWLED");
            }
            writer.print(" ");
            writer.print(sr.getUri());
            if(sr.getRedirectUri()!=null) {
                writer.print(" ");
                writer.print(sr.getRedirectUri());
            }
            writer.print("\n");
        }
        StoredIterator.close(iter);
        seedsByCode.dispose();
        stats.seedsTotal = seedsTotal;
        stats.seedsCrawled = seedsCrawled; 
    
<methods>public void <init>() ,public abstract java.lang.String getFilename() ,public boolean getShouldReportAtEndOfCrawl() ,public boolean getShouldReportDuringCrawl() ,public void setShouldReportAtEndOfCrawl(boolean) ,public void setShouldReportDuringCrawl(boolean) ,public abstract void write(java.io.PrintWriter, org.archive.crawler.reporting.StatisticsTracker) <variables>private boolean shouldReportAtEndOfCrawl,private boolean shouldReportDuringCrawl