class FreeBox implements ParsableBox {
    public static final String TYPE = "free";
    ByteBuffer data;
    List<ParsableBox> replacers = new LinkedList<ParsableBox>();
    private Container parent;
    private long offset;

    public FreeBox() {
        this.data = ByteBuffer.wrap(new byte[0]);
    }

    public FreeBox(int size) {
        this.data = ByteBuffer.allocate(size);
    }

    public ByteBuffer getData() {
        if (data != null) {
            return (ByteBuffer) ((Buffer)data.duplicate()).rewind();
        } else {
            return null;
        }
    }

    public void setData(ByteBuffer data) {
        this.data = data;
    }

    public void getBox(WritableByteChannel os) throws IOException {
        for (ParsableBox replacer : replacers) {
            replacer.getBox(os);
        }
        ByteBuffer header = ByteBuffer.allocate(8);
        IsoTypeWriter.writeUInt32(header, 8 + data.limit());
        header.put(TYPE.getBytes());
        ((Buffer)header).rewind();
        os.write(header);
        ((Buffer)header).rewind();
        ((Buffer)data).rewind();
        os.write(data);
        ((Buffer)data).rewind();

    }

    public long getSize() {
        long size = 8;
        for (ParsableBox replacer : replacers) {
            size += replacer.getSize();
        }
        size += data.limit();
        return size;
    }

    public String getType() {
        return TYPE;
    }

    public void parse(ReadableByteChannel dataSource, ByteBuffer header, long contentSize, BoxParser boxParser) throws IOException {
        data = ByteBuffer.allocate(CastUtils.l2i(contentSize));

        int bytesRead = 0;
        int b;
        while (((((b = dataSource.read(data))) + bytesRead) < contentSize)) {
            bytesRead += b;
        }
    }


    public void addAndReplace(ParsableBox parsableBox) {
        ((Buffer)data).position(CastUtils.l2i(parsableBox.getSize()));
        data = data.slice();
        replacers.add(parsableBox);
    }

    @Override
    public boolean equals(Object o) {<FILL_FUNCTION_BODY>}

    @Override
    public int hashCode() {
        return data != null ? data.hashCode() : 0;
    }
}

        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        FreeBox freeBox = (FreeBox) o;

        if (getData() != null ? !getData().equals(freeBox.getData()) : freeBox.getData() != null) return false;

        return true;
    
<no_super_class>