import java.io.*; import java.util.*; public class Scanner { public Scanner(InputStream in) { this.in = new BufferedReader(new InputStreamReader(in)); currentLineStart = -1; } public Scanner(Reader in) { this.in = new BufferedReader(in); currentLineStart = -1; } private void readNextLine() { try { currentLine = in.readLine(); currentLineStart = 0; nextTokenStart = 0; currentToken = null; } catch (IOException ex) { currentLine = null; lastException = ex; } } private void readNextToken() { if (in == null) throw new IllegalStateException("scanner is closed"); if (currentToken != null) return; if (currentLineStart == -1) readNextLine(); if (currentLine == null) return; boolean done; while (nextTokenStart == currentLine.length()) { readNextLine(); if (currentLine == null) return; while (nextTokenStart < currentLine.length() && Character.isWhitespace(currentLine.charAt(nextTokenStart))) { nextTokenStart++; } } int end = nextTokenStart; while (end < currentLine.length() && !Character.isWhitespace(currentLine.charAt(end))) { end++; } currentToken = currentLine.substring(nextTokenStart, end); currentLineStart = end; nextTokenStart = end; while (nextTokenStart < currentLine.length() && Character.isWhitespace(currentLine.charAt(nextTokenStart))) { nextTokenStart++; } } private String consumeToken() { if (currentToken == null) return null; String r = currentToken; currentToken = null; return r; } public int nextInt() { if (!hasNext()) throw new NoSuchElementException("end of input"); if (!hasNextInt()) throw new InputMismatchException("next item is not an integer"); return Integer.parseInt(consumeToken()); } public boolean hasNextInt() { readNextToken(); if (currentToken == null) return false; try { Integer.parseInt(currentToken); return true; } catch (NumberFormatException ex) { return false; } } public double nextDouble() { if (!hasNext()) throw new NoSuchElementException("end of input"); if (!hasNextDouble()) throw new InputMismatchException("next item is not a double"); return Double.parseDouble(consumeToken()); } public boolean hasNextDouble() { readNextToken(); if (currentToken == null) return false; try { Double.parseDouble(currentToken); return true; } catch (NumberFormatException ex) { return false; } } public String next() { if (!hasNext()) throw new NoSuchElementException("end of input"); return consumeToken(); } public boolean hasNext() { readNextToken(); return currentToken != null; } public String nextLine() { if (!hasNextLine()) throw new NoSuchElementException("end of input"); String r = currentLine.substring(currentLineStart); currentLineStart = -1; return r; } public boolean hasNextLine() { if (currentLineStart == -1) readNextLine(); return currentLine != null; } public void close() { if (in == null) return; try { in.close(); } catch (IOException ex) { lastException = ex; } in = null; } public IOException ioException() { return lastException; } private BufferedReader in; private String currentLine; private String currentToken; private int currentLineStart; private int nextTokenStart; private IOException lastException; } class InputMismatchException extends RuntimeException { public InputMismatchException() {} public InputMismatchException(String reason) { super(reason); } }