// Path: src/name/arbitrary/toytcp/WriteBuffer.java
// public class WriteBuffer {
//     private final ArrayList<Byte> buffer = new ArrayList<Byte>();
// 
//     public WriteBuffer() {
//     }
// 
//     public WriteBuffer(int... data) {
//         for (int i = 0 ; i < data.length; i++) {
//             append((byte)data[i]);
//         }
//     }
// 
//     public void append(byte b) {
//         buffer.add(b);
//     }
// 
//     public void append(byte... bs) {
//         for (byte b : bs) {
//             buffer.add(b);
//         }
//     }
// 
//     public void append(Buffer data) {
//         int n = data.length();
//         for (int i = 0; i < n; i++) {
//             append(data.get(i));
//         }
//     }
// 
//     public void appendU16(int value) {
//         buffer.add((byte)(value >> 8));
//         buffer.add((byte)(value & 0xFF));
//     }
// 
//     public void appendU32(int value) {
//         buffer.add((byte)(value >> 24));
//         buffer.add((byte)(value >> 16));
//         buffer.add((byte)(value >> 8));
//         buffer.add((byte)(value & 0xFF));
//     }
// 
//     public int getAppendOffset() {
//         return buffer.size();
//     }
// 
//     public void put(int i, byte value) {
//         buffer.set(i, value);
//     }
// 
//     public void putU8(int i, int value) {
//         put(i, (byte)value);
//     }
// 
//     public void putU16(int i, int value) {
//         put(i, (byte)(value >> 8));
//         put(i + 1, (byte)(value & 0xFF));
//     }
// 
//     public byte[] toByteArray() {
//         int n = buffer.size();
//         byte[] array = new byte[n];
//         for (int i = 0; i < n; i++) {
//             array[i] = buffer.get(i);
//         }
//         return array;
//     }
// 
//     @Override
//     public String toString() {
//         return "WriteBuffer{" +
//                 "buffer=" + buffer +
//                 '}';
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         WriteBuffer that = (WriteBuffer) o;
// 
//         if (!buffer.equals(that.buffer)) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         return buffer.hashCode();
//     }
// 
//     public interface Listener {
//         void send(WriteBuffer buffer);
//     }
// }
// 
// Path: src/name/arbitrary/toytcp/ppp/lcp/options/Option.java
// public interface Option {
//     enum ResponseType {
//         ACCEPT,
//         NAK,
//         REJECT
//     }
// 
//     ResponseType getResponseType();
// 
//     Option getAcceptableVersion();
// 
//     // Write the option into a buffer. Reading equivalent is in OptionsReader.
//     void writeTo(WriteBuffer buffer);
// }


import name.arbitrary.toytcp.WriteBuffer;
import name.arbitrary.toytcp.ppp.lcp.options.Option;
import java.util.List;
package name.arbitrary.toytcp.ppp.lcp.statemachine;



/**
 * Interface for the messages to send out and link layer actions associated with state machine actions.
 */
public interface ActionProcessor {
    void onThisLayerStarted();
    void onThisLayerFinished();

    void sendConfigureRequest(byte identifier, List<Option> options);
    void sendConfigureAcknowledge(byte identifier, List<Option> options);
    void sendConfigureNak(byte identifier, List<Option> options);
    void sendConfigureReject(byte identifier, List<Option> options);

// Path: src/name/arbitrary/toytcp/WriteBuffer.java
// public class WriteBuffer {
//     private final ArrayList<Byte> buffer = new ArrayList<Byte>();
// 
//     public WriteBuffer() {
//     }
// 
//     public WriteBuffer(int... data) {
//         for (int i = 0 ; i < data.length; i++) {
//             append((byte)data[i]);
//         }
//     }
// 
//     public void append(byte b) {
//         buffer.add(b);
//     }
// 
//     public void append(byte... bs) {
//         for (byte b : bs) {
//             buffer.add(b);
//         }
//     }
// 
//     public void append(Buffer data) {
//         int n = data.length();
//         for (int i = 0; i < n; i++) {
//             append(data.get(i));
//         }
//     }
// 
//     public void appendU16(int value) {
//         buffer.add((byte)(value >> 8));
//         buffer.add((byte)(value & 0xFF));
//     }
// 
//     public void appendU32(int value) {
//         buffer.add((byte)(value >> 24));
//         buffer.add((byte)(value >> 16));
//         buffer.add((byte)(value >> 8));
//         buffer.add((byte)(value & 0xFF));
//     }
// 
//     public int getAppendOffset() {
//         return buffer.size();
//     }
// 
//     public void put(int i, byte value) {
//         buffer.set(i, value);
//     }
// 
//     public void putU8(int i, int value) {
//         put(i, (byte)value);
//     }
// 
//     public void putU16(int i, int value) {
//         put(i, (byte)(value >> 8));
//         put(i + 1, (byte)(value & 0xFF));
//     }
// 
//     public byte[] toByteArray() {
//         int n = buffer.size();
//         byte[] array = new byte[n];
//         for (int i = 0; i < n; i++) {
//             array[i] = buffer.get(i);
//         }
//         return array;
//     }
// 
//     @Override
//     public String toString() {
//         return "WriteBuffer{" +
//                 "buffer=" + buffer +
//                 '}';
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         WriteBuffer that = (WriteBuffer) o;
// 
//         if (!buffer.equals(that.buffer)) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         return buffer.hashCode();
//     }
// 
//     public interface Listener {
//         void send(WriteBuffer buffer);
//     }
// }
// 
// Path: src/name/arbitrary/toytcp/ppp/lcp/options/Option.java
// public interface Option {
//     enum ResponseType {
//         ACCEPT,
//         NAK,
//         REJECT
//     }
// 
//     ResponseType getResponseType();
// 
//     Option getAcceptableVersion();
// 
//     // Write the option into a buffer. Reading equivalent is in OptionsReader.
//     void writeTo(WriteBuffer buffer);
// }


// Path: src/name/arbitrary/toytcp/ppp/lcp/statemachine/ActionProcessor.java
import name.arbitrary.toytcp.WriteBuffer;
import name.arbitrary.toytcp.ppp.lcp.options.Option;
import java.util.List;

package name.arbitrary.toytcp.ppp.lcp.statemachine;



/**
 * Interface for the messages to send out and link layer actions associated with state machine actions.
 */
public interface ActionProcessor {
    void onThisLayerStarted();
    void onThisLayerFinished();

    void sendConfigureRequest(byte identifier, List<Option> options);
    void sendConfigureAcknowledge(byte identifier, List<Option> options);
    void sendConfigureNak(byte identifier, List<Option> options);
    void sendConfigureReject(byte identifier, List<Option> options);

    void sendTerminateRequest(byte identifier, WriteBuffer buffer);