// Path: src/nbt/write/ByteWriter.java
// public class ByteWriter implements Closeable {
// 
//   /**
//    * The utf-8 charset.
//    */
//   public static final Charset UTF8 = Charset.forName("UTF-8");
// 
//   private OutputStream out;
// 
//   /**
//    * Creates a byte writer for an output stream.
//    * 
//    * @param out The output stream.
//    */
//   public ByteWriter(final OutputStream out) {
//     this.out = out;
//   }
// 
//   /**
//    * Writes a single byte.
//    * 
//    * @param b The byte.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final byte b) throws IOException {
//     out.write(b);
//   }
// 
//   /**
//    * Writes a short.
//    * 
//    * @param s The short.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final short s) throws IOException {
//     writeBigEndian(s, 2);
//   }
// 
//   /**
//    * Writes an integer.
//    * 
//    * @param i The integer.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final int i) throws IOException {
//     writeBigEndian(i, 4);
//   }
// 
//   /**
//    * Writes a long.
//    * 
//    * @param l The long.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final long l) throws IOException {
//     writeBigEndian(l, 8);
//   }
// 
//   /**
//    * Writes a float.
//    * 
//    * @param f The float.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final float f) throws IOException {
//     write(Float.floatToIntBits(f));
//   }
// 
//   /**
//    * Writes a double.
//    * 
//    * @param f The double.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final double f) throws IOException {
//     write(Double.doubleToLongBits(f));
//   }
// 
//   /**
//    * Writes a byte array. Note that this is <em>not</em> equivalent to
//    * successive {@link #write(byte)} calls!
//    * 
//    * @param arr The array.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final byte[] arr) throws IOException {
//     write(arr.length);
//     out.write(arr);
//   }
// 
//   /**
//    * Writes an integer array. Note that this is <em>not</em> equivalent to
//    * successive {@link #write(int)} calls!
//    * 
//    * @param arr The array.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final int[] arr) throws IOException {
//     write(arr.length);
//     for(final int i : arr) {
//       write(i);
//     }
//   }
// 
//   /**
//    * Writes a string.
//    * 
//    * @param str The string.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final String str) throws IOException {
//     final byte[] arr = str.getBytes(UTF8);
//     write((short) arr.length);
//     out.write(arr);
//   }
// 
//   private void writeBigEndian(final long bytes, final int count)
//       throws IOException {
//     long lb = bytes;
//     final byte[] b = new byte[count];
//     int i = count;
//     while(--i >= 0) {
//       b[i] = (byte) lb;
//       lb >>>= 8;
//     }
//     out.write(b);
//   }
// 
//   @Override
//   public void close() throws IOException {
//     if(out != null) {
//       final OutputStream t = out;
//       out = null;
//       t.close();
//     }
//   }
// 
//   @Override
//   protected void finalize() throws Throwable {
//     close();
//     super.finalize();
//   }
// 
// }


import java.io.IOException;
import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;
import nbt.write.ByteWriter;

  @Override
  public void resetChange() {
    super.resetChange();
    for(final NBTRecord r : map.values()) {
      r.resetChange();
    }
  }

  @Override
  public boolean hasChanged() {
    if(super.hasChanged()) return true;
    for(final NBTRecord r : map.values()) {
      if(r.hasChanged()) return true;
    }
    return false;
  }

  /**
   * Getter.
   * 
   * @param index The index.
   * @return Gets the record at the given index.
   */
  public NBTRecord get(final int index) {
    if(index < 0 || index >= map.size()) return null;
    if(list == null) {
      final Collection<NBTRecord> val = map.values();
      list = val.toArray(new NBTRecord[val.size()]);
    }
// Path: src/nbt/write/ByteWriter.java
// public class ByteWriter implements Closeable {
// 
//   /**
//    * The utf-8 charset.
//    */
//   public static final Charset UTF8 = Charset.forName("UTF-8");
// 
//   private OutputStream out;
// 
//   /**
//    * Creates a byte writer for an output stream.
//    * 
//    * @param out The output stream.
//    */
//   public ByteWriter(final OutputStream out) {
//     this.out = out;
//   }
// 
//   /**
//    * Writes a single byte.
//    * 
//    * @param b The byte.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final byte b) throws IOException {
//     out.write(b);
//   }
// 
//   /**
//    * Writes a short.
//    * 
//    * @param s The short.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final short s) throws IOException {
//     writeBigEndian(s, 2);
//   }
// 
//   /**
//    * Writes an integer.
//    * 
//    * @param i The integer.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final int i) throws IOException {
//     writeBigEndian(i, 4);
//   }
// 
//   /**
//    * Writes a long.
//    * 
//    * @param l The long.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final long l) throws IOException {
//     writeBigEndian(l, 8);
//   }
// 
//   /**
//    * Writes a float.
//    * 
//    * @param f The float.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final float f) throws IOException {
//     write(Float.floatToIntBits(f));
//   }
// 
//   /**
//    * Writes a double.
//    * 
//    * @param f The double.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final double f) throws IOException {
//     write(Double.doubleToLongBits(f));
//   }
// 
//   /**
//    * Writes a byte array. Note that this is <em>not</em> equivalent to
//    * successive {@link #write(byte)} calls!
//    * 
//    * @param arr The array.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final byte[] arr) throws IOException {
//     write(arr.length);
//     out.write(arr);
//   }
// 
//   /**
//    * Writes an integer array. Note that this is <em>not</em> equivalent to
//    * successive {@link #write(int)} calls!
//    * 
//    * @param arr The array.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final int[] arr) throws IOException {
//     write(arr.length);
//     for(final int i : arr) {
//       write(i);
//     }
//   }
// 
//   /**
//    * Writes a string.
//    * 
//    * @param str The string.
//    * @throws IOException I/O Exception.
//    */
//   public final void write(final String str) throws IOException {
//     final byte[] arr = str.getBytes(UTF8);
//     write((short) arr.length);
//     out.write(arr);
//   }
// 
//   private void writeBigEndian(final long bytes, final int count)
//       throws IOException {
//     long lb = bytes;
//     final byte[] b = new byte[count];
//     int i = count;
//     while(--i >= 0) {
//       b[i] = (byte) lb;
//       lb >>>= 8;
//     }
//     out.write(b);
//   }
// 
//   @Override
//   public void close() throws IOException {
//     if(out != null) {
//       final OutputStream t = out;
//       out = null;
//       t.close();
//     }
//   }
// 
//   @Override
//   protected void finalize() throws Throwable {
//     close();
//     super.finalize();
//   }
// 
// }


// Path: src/nbt/record/NBTCompound.java
import java.io.IOException;
import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;
import nbt.write.ByteWriter;


  @Override
  public void resetChange() {
    super.resetChange();
    for(final NBTRecord r : map.values()) {
      r.resetChange();
    }
  }

  @Override
  public boolean hasChanged() {
    if(super.hasChanged()) return true;
    for(final NBTRecord r : map.values()) {
      if(r.hasChanged()) return true;
    }
    return false;
  }

  /**
   * Getter.
   * 
   * @param index The index.
   * @return Gets the record at the given index.
   */
  public NBTRecord get(final int index) {
    if(index < 0 || index >= map.size()) return null;
    if(list == null) {
      final Collection<NBTRecord> val = map.values();
      list = val.toArray(new NBTRecord[val.size()]);
    }
    return list[index];