import java.util.*;
import java.util.zip.*;
import java.util.List;
import java.util.regex.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.concurrent.locks.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.table.*;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import java.lang.ref.*;
import java.lang.management.*;
import java.security.*;
import java.security.spec.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.math.*;
// returns true if file was changed
import java.text.SimpleDateFormat;
import java.text.NumberFormat;
import java.text.*;
import java.util.TimeZone;
class main {
static boolean cleanFluidTextFile(File f, Object... __) {
  boolean withBackup = optPar("withBackup",__,  true);
  boolean verbose = boolPar("verbose",__);
  CleanFluidTextFile cleaner = new CleanFluidTextFile();
  {
     Reader reader = utf8reader(f); try {
    cleaner.reader = reader;
    cleaner.read();
  } finally { _close(reader); }}
  StringWriter writer = new StringWriter();
  cleaner.writer = writer;
  cleaner.write();
  String out = str(writer);
  if (eq(loadTextFile(f), out)) return false;
  if (withBackup)
    print("Backed file up to " + renameFileToSomeBackupName(f, "fluidClean"));
  saveTextFile(f, out);
  return true;
}
static  A optPar(ThreadLocal tl, A defaultValue) {
  A a = tl.get();
  if (a != null) {
    tl.set(null);
    return a;
  }
  return defaultValue;
}
static  A optPar(ThreadLocal tl) {
  return optPar(tl, null);
}
static Object optPar(Object[] params, String name) {
  return optParam(params, name);
}
static Object optPar(String name, Object[] params) {
  return optParam(params, name);
}
static Object optPar(String name, Map params) {
  return optParam(name, params);
}
static  A optPar(Object[] params, String name, A defaultValue) {
  return optParam(params, name, defaultValue);
}
static  A optPar(String name, Object[] params, A defaultValue) {
  return optParam(params, name, defaultValue);
}
static boolean boolPar(ThreadLocal tl) {
  return boolOptParam(tl);
}
// defaults to false
static boolean boolPar(Object[] __, String name) {
  return boolOptParam(__, name);
}
static boolean boolPar(String name, Object[] __) {
  return boolOptParam(__, name);
}
static boolean boolPar(String name, Map __) {
  return boolOptParam(name, __);
}
static boolean boolPar(String name, Object[] params, boolean defaultValue) {
  return optParam(params, name, defaultValue);
}
static BufferedReader utf8reader(InputStream in) {
  return utf8BufferedReader(in);
}
static BufferedReader utf8reader(File f) {
  return utf8BufferedReader(f);
}
static void _close(AutoCloseable c) {
  if (c != null) try {
    c.close();
  } catch (Throwable e) {
    // Some classes stupidly throw an exception on double-closing
    if (c instanceof javax.imageio.stream.ImageOutputStream)
      return;
    else throw rethrow(e);
  }
}
static String str(Object o) {
  return o == null ? "null" : o.toString();
}
static String str(char[] c) {
  return new String(c);
}
static boolean eq(Object a, Object b) {
  return a == b || (a == null ? b == null : b != null && a.equals(b));
}
static String loadTextFile(String fileName) {
  return loadTextFile(fileName, null);
}
static String loadTextFile(File f, String defaultContents) { try {
  
  checkFileNotTooBigToRead(f);
  
  if (f == null || !f.exists()) return defaultContents;
  FileInputStream fileInputStream = new FileInputStream(f);
  InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
  return loadTextFile(inputStreamReader);
} catch (Exception __e) { throw rethrow(__e); } }
public static String loadTextFile(File fileName) {
  return loadTextFile(fileName, null);
}
static String loadTextFile(String fileName, String defaultContents) {
  return fileName == null ? defaultContents : loadTextFile(newFile(fileName), defaultContents);
}
static String loadTextFile(Reader reader) throws IOException {
  StringBuilder builder = new StringBuilder();
  try {
    char[] buffer = new char[1024];
    int n;
    while (-1 != (n = reader.read(buffer)))
      builder.append(buffer, 0, n);
  } finally {
    reader.close();
  }
  return str(builder);
}
static volatile StringBuffer local_log = new StringBuffer(); // not redirected
static volatile Appendable print_log = local_log; // might be redirected, e.g. to main bot
// in bytes - will cut to half that
static volatile int print_log_max = 1024*1024;
static volatile int local_log_max = 100*1024;
static boolean print_silent = false; // total mute if set
static Object print_byThread_lock = new Object();
static volatile ThreadLocal